박권수

Merge branch 'web'

...@@ -20,7 +20,8 @@ ...@@ -20,7 +20,8 @@
20 "@koa/cors": "^3.1.0", 20 "@koa/cors": "^3.1.0",
21 "firebase-admin": "^9.11.1", 21 "firebase-admin": "^9.11.1",
22 "moment": "^2.29.1", 22 "moment": "^2.29.1",
23 - "mqtt": "^4.2.6" 23 + "mqtt": "^4.2.6",
24 + "node-cron": "^3.0.0"
24 }, 25 },
25 "devDependencies": { 26 "devDependencies": {
26 "eslint": "^7.32.0" 27 "eslint": "^7.32.0"
......
...@@ -143,14 +143,11 @@ exports.getBottleInfo = async(ctx) => { ...@@ -143,14 +143,11 @@ exports.getBottleInfo = async(ctx) => {
143 const message = 'req'; 143 const message = 'req';
144 await Mqtt.mqttPublishMessage(client, { topic, message }); 144 await Mqtt.mqttPublishMessage(client, { topic, message });
145 145
146 - const bottleMedicine = await BottleMedicine.find({ bottleId }) 146 + const bottleMedicine = await BottleMedicine.findOne({ bottleId, useYn : 'Y' });
147 - .sort({ regDtm : 'desc' })
148 - .limit(1);
149 147
150 - if(bottleMedicine.length) { 148 + if(bottleMedicine) {
151 -
152 const takeMedicineHist = await TakeMedicineHist 149 const takeMedicineHist = await TakeMedicineHist
153 - .find({ bmId : bottleMedicine[0]._id }) 150 + .find({ bmId : bottleMedicine._id })
154 .sort({ takeDate : 'desc' }) 151 .sort({ takeDate : 'desc' })
155 .populate('bmId'); 152 .populate('bmId');
156 153
...@@ -208,12 +205,10 @@ exports.getBottleFeedback = async ctx => { ...@@ -208,12 +205,10 @@ exports.getBottleFeedback = async ctx => {
208 return; 205 return;
209 } 206 }
210 207
211 - const bottleMedicine = await BottleMedicine.find({ bottleId }) 208 + const bottleMedicine = await BottleMedicine.findOne({ bottleId, useYn : 'Y' });
212 - .sort({ regDtm : 'desc' })
213 - .limit(1);
214 209
215 - if(bottleMedicine.length) { 210 + if(bottleMedicine) {
216 - const feedbackList = await Feedback.find({ bmId : bottleMedicine[0]._id }) 211 + const feedbackList = await Feedback.find({ bmId : bottleMedicine._id })
217 .sort({ fdbDtm : 'desc' }) 212 .sort({ fdbDtm : 'desc' })
218 .populate('bmId'); 213 .populate('bmId');
219 214
...@@ -294,6 +289,7 @@ exports.setMedicine = async(ctx) => { ...@@ -294,6 +289,7 @@ exports.setMedicine = async(ctx) => {
294 bottleMedicine.setDoctorId(doctorId); 289 bottleMedicine.setDoctorId(doctorId);
295 } 290 }
296 291
292 + await BottleMedicine.updateMany({ bottleId }, { useYn : 'N '});
297 293
298 bottleMedicine.save(); 294 bottleMedicine.save();
299 295
......
...@@ -145,11 +145,12 @@ exports.getPatientDetail = async ctx => { ...@@ -145,11 +145,12 @@ exports.getPatientDetail = async ctx => {
145 145
146 const reqUserBmList = []; 146 const reqUserBmList = [];
147 await Promise.all(reqUserBottleList.map(async bottle => { 147 await Promise.all(reqUserBottleList.map(async bottle => {
148 - const bmList = await BottleMedicine.find({ 148 + const bm = await BottleMedicine.findOne({
149 doctorId : userId, 149 doctorId : userId,
150 bottleId : bottle.bottleId, 150 bottleId : bottle.bottleId,
151 - }).sort({ regDtm : 'desc' }).limit(1); 151 + useYn : 'Y',
152 - reqUserBmList.push(...bmList); 152 + });
153 + reqUserBmList.push(bm);
153 })); 154 }));
154 155
155 const bottleList = await Promise.all(reqUserBmList.map(async bottleMedicine => { 156 const bottleList = await Promise.all(reqUserBmList.map(async bottleMedicine => {
...@@ -207,7 +208,7 @@ exports.getBottleDetail = async ctx => { ...@@ -207,7 +208,7 @@ exports.getBottleDetail = async ctx => {
207 return; 208 return;
208 } 209 }
209 210
210 - const bottleMedicine = await BottleMedicine.findOne({ bottleId, doctorId : userId }); 211 + const bottleMedicine = await BottleMedicine.findOne({ bottleId, doctorId : userId, useYn : 'Y' });
211 if(!bottleMedicine) { 212 if(!bottleMedicine) {
212 ctx.status = 403; 213 ctx.status = 403;
213 ctx.body = { 214 ctx.body = {
...@@ -318,11 +319,9 @@ exports.writeReqBottleFeedback = async ctx => { ...@@ -318,11 +319,9 @@ exports.writeReqBottleFeedback = async ctx => {
318 return; 319 return;
319 } 320 }
320 321
321 - const bottleMedicine = await BottleMedicine.find({ bottleId, doctorId : userId }) 322 + const bottleMedicine = await BottleMedicine.findOne({ bottleId, doctorId : userId, useYn : 'Y' });
322 - .sort({ regDtm : 'desc' })
323 - .limit(1);
324 323
325 - if(!bottleMedicine.length) { 324 + if(!bottleMedicine) {
326 ctx.status = 403; 325 ctx.status = 403;
327 ctx.body = { 326 ctx.body = {
328 error : '약병에 대한 권한 없음' 327 error : '약병에 대한 권한 없음'
...@@ -332,7 +331,7 @@ exports.writeReqBottleFeedback = async ctx => { ...@@ -332,7 +331,7 @@ exports.writeReqBottleFeedback = async ctx => {
332 331
333 const newFeedback = new Feedback({ 332 const newFeedback = new Feedback({
334 fdbType, 333 fdbType,
335 - bmId : bottleMedicine[0]._id, 334 + bmId : bottleMedicine._id,
336 doctorId : userId, 335 doctorId : userId,
337 feedback, 336 feedback,
338 }); 337 });
......
...@@ -63,7 +63,7 @@ const bottleInfoUpdate = async(data) => { ...@@ -63,7 +63,7 @@ const bottleInfoUpdate = async(data) => {
63 humidity = parseFloat(humidity); 63 humidity = parseFloat(humidity);
64 balance = parseInt(balance); 64 balance = parseInt(balance);
65 65
66 - const bottleMedicine = await BottleMedicine.find({ bottleId }).sort((a, b) => a.regDtm < b.regDtm)[0]; 66 + const bottleMedicine = await BottleMedicine.findOne({ bottleId, useYn : 'Y' });
67 67
68 if(bottleMedicine) { 68 if(bottleMedicine) {
69 if(isOpen) { 69 if(isOpen) {
...@@ -83,7 +83,7 @@ const bottleInfoUpdate = async(data) => { ...@@ -83,7 +83,7 @@ const bottleInfoUpdate = async(data) => {
83 const transPublishingTopicAndMessage = async(bottleId) => { 83 const transPublishingTopicAndMessage = async(bottleId) => {
84 const topic = 'bottle/' + bottleId + '/stb'; 84 const topic = 'bottle/' + bottleId + '/stb';
85 85
86 - const bottleMedicine = await BottleMedicine.find({ bottleId }).sort((a, b) => a.regDtm < b.regDtm)[0]; 86 + const bottleMedicine = await BottleMedicine.findOne({ bottleId, useYn : 'Y' });
87 const takeMedicineHist = await TakeMedicineHist.find({ 87 const takeMedicineHist = await TakeMedicineHist.find({
88 bmId : bottleMedicine._id 88 bmId : bottleMedicine._id
89 }).sort((a, b) => a.takeDate < b.takeDate)[0]; 89 }).sort((a, b) => a.takeDate < b.takeDate)[0];
......
...@@ -28,11 +28,20 @@ const BottleMedicineSchema = new Schema({ ...@@ -28,11 +28,20 @@ const BottleMedicineSchema = new Schema({
28 required : true, 28 required : true,
29 default : Date.now, 29 default : Date.now,
30 }, 30 },
31 + useYn : {
32 + type : String,
33 + required : true,
34 + default : 'Y',
35 + },
31 }); 36 });
32 37
33 BottleMedicineSchema.methods.setDoctorId = function(doctorId) { 38 BottleMedicineSchema.methods.setDoctorId = function(doctorId) {
34 this.doctorId = doctorId; 39 this.doctorId = doctorId;
35 }; 40 };
36 41
42 +BottleMedicineSchema.methods.setUseYn = function(useYn) {
43 + this.useYn = useYn;
44 +};
45 +
37 46
38 module.exports = mongoose.model('BottleMedicine', BottleMedicineSchema); 47 module.exports = mongoose.model('BottleMedicine', BottleMedicineSchema);
...\ No newline at end of file ...\ No newline at end of file
......
1 +//toDO : Batch System
2 +/**
3 + * 21/09/14
4 + * Author : 박권수
5 + * 배치 시스템
6 + * 1) 매년 지나면 프로필의 Age를 +1
7 + * 2) Dosage에 따라, Push Notification 발송
8 + */
9 +
10 +const cron = require('node-cron');
11 +
12 +const Profile = require('../models/profile');
13 +const BottleMedicine = require('../models/bottleMedicine');
...\ No newline at end of file ...\ No newline at end of file
...@@ -753,6 +753,7 @@ ...@@ -753,6 +753,7 @@
753 "@babel/code-frame" "7.12.11" 753 "@babel/code-frame" "7.12.11"
754 "@eslint/eslintrc" "^0.4.3" 754 "@eslint/eslintrc" "^0.4.3"
755 "@humanwhocodes/config-array" "^0.5.0" 755 "@humanwhocodes/config-array" "^0.5.0"
756 +<<<<<<< HEAD
756 "ajv" "^6.10.0" 757 "ajv" "^6.10.0"
757 "chalk" "^4.0.0" 758 "chalk" "^4.0.0"
758 "cross-spawn" "^7.0.2" 759 "cross-spawn" "^7.0.2"
...@@ -2169,3 +2170,815 @@ ...@@ -2169,3 +2170,815 @@
2169 "integrity" "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==" 2170 "integrity" "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q=="
2170 "resolved" "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz" 2171 "resolved" "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz"
2171 "version" "0.1.0" 2172 "version" "0.1.0"
2173 +=======
2174 + ajv "^6.10.0"
2175 + chalk "^4.0.0"
2176 + cross-spawn "^7.0.2"
2177 + debug "^4.0.1"
2178 + doctrine "^3.0.0"
2179 + enquirer "^2.3.5"
2180 + escape-string-regexp "^4.0.0"
2181 + eslint-scope "^5.1.1"
2182 + eslint-utils "^2.1.0"
2183 + eslint-visitor-keys "^2.0.0"
2184 + espree "^7.3.1"
2185 + esquery "^1.4.0"
2186 + esutils "^2.0.2"
2187 + fast-deep-equal "^3.1.3"
2188 + file-entry-cache "^6.0.1"
2189 + functional-red-black-tree "^1.0.1"
2190 + glob-parent "^5.1.2"
2191 + globals "^13.6.0"
2192 + ignore "^4.0.6"
2193 + import-fresh "^3.0.0"
2194 + imurmurhash "^0.1.4"
2195 + is-glob "^4.0.0"
2196 + js-yaml "^3.13.1"
2197 + json-stable-stringify-without-jsonify "^1.0.1"
2198 + levn "^0.4.1"
2199 + lodash.merge "^4.6.2"
2200 + minimatch "^3.0.4"
2201 + natural-compare "^1.4.0"
2202 + optionator "^0.9.1"
2203 + progress "^2.0.0"
2204 + regexpp "^3.1.0"
2205 + semver "^7.2.1"
2206 + strip-ansi "^6.0.0"
2207 + strip-json-comments "^3.1.0"
2208 + table "^6.0.9"
2209 + text-table "^0.2.0"
2210 + v8-compile-cache "^2.0.3"
2211 +
2212 +espree@^7.3.0, espree@^7.3.1:
2213 + version "7.3.1"
2214 + resolved "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz"
2215 + integrity sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==
2216 + dependencies:
2217 + acorn "^7.4.0"
2218 + acorn-jsx "^5.3.1"
2219 + eslint-visitor-keys "^1.3.0"
2220 +
2221 +esprima@^4.0.0:
2222 + version "4.0.1"
2223 + resolved "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz"
2224 + integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==
2225 +
2226 +esquery@^1.4.0:
2227 + version "1.4.0"
2228 + resolved "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz"
2229 + integrity sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==
2230 + dependencies:
2231 + estraverse "^5.1.0"
2232 +
2233 +esrecurse@^4.3.0:
2234 + version "4.3.0"
2235 + resolved "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz"
2236 + integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==
2237 + dependencies:
2238 + estraverse "^5.2.0"
2239 +
2240 +estraverse@^4.1.1:
2241 + version "4.3.0"
2242 + resolved "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz"
2243 + integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==
2244 +
2245 +estraverse@^5.1.0, estraverse@^5.2.0:
2246 + version "5.2.0"
2247 + resolved "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz"
2248 + integrity sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==
2249 +
2250 +esutils@^2.0.2:
2251 + version "2.0.3"
2252 + resolved "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz"
2253 + integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==
2254 +
2255 +extend@^3.0.0:
2256 + version "3.0.2"
2257 + resolved "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz"
2258 + integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==
2259 +
2260 +fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3:
2261 + version "3.1.3"
2262 + resolved "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz"
2263 + integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==
2264 +
2265 +fast-json-stable-stringify@^2.0.0:
2266 + version "2.1.0"
2267 + resolved "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz"
2268 + integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==
2269 +
2270 +fast-levenshtein@^2.0.6:
2271 + version "2.0.6"
2272 + resolved "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz"
2273 + integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=
2274 +
2275 +file-entry-cache@^6.0.1:
2276 + version "6.0.1"
2277 + resolved "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz"
2278 + integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==
2279 + dependencies:
2280 + flat-cache "^3.0.4"
2281 +
2282 +flat-cache@^3.0.4:
2283 + version "3.0.4"
2284 + resolved "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz"
2285 + integrity sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==
2286 + dependencies:
2287 + flatted "^3.1.0"
2288 + rimraf "^3.0.2"
2289 +
2290 +flatted@^3.1.0:
2291 + version "3.2.2"
2292 + resolved "https://registry.npmjs.org/flatted/-/flatted-3.2.2.tgz"
2293 + integrity sha512-JaTY/wtrcSyvXJl4IMFHPKyFur1sE9AUqc0QnhOaJ0CxHtAoIV8pYDzeEfAaNEtGkOfq4gr3LBFmdXW5mOQFnA==
2294 +
2295 +fs.realpath@^1.0.0:
2296 + version "1.0.0"
2297 + resolved "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz"
2298 + integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8=
2299 +
2300 +functional-red-black-tree@^1.0.1:
2301 + version "1.0.1"
2302 + resolved "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz"
2303 + integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=
2304 +
2305 +glob-parent@^3.1.0:
2306 + version "3.1.0"
2307 + resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz"
2308 + integrity sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=
2309 + dependencies:
2310 + is-glob "^3.1.0"
2311 + path-dirname "^1.0.0"
2312 +
2313 +glob-parent@^5.1.2:
2314 + version "5.1.2"
2315 + resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz"
2316 + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==
2317 + dependencies:
2318 + is-glob "^4.0.1"
2319 +
2320 +glob-stream@^6.1.0:
2321 + version "6.1.0"
2322 + resolved "https://registry.npmjs.org/glob-stream/-/glob-stream-6.1.0.tgz"
2323 + integrity sha1-cEXJlBOz65SIjYOrRtC0BMx73eQ=
2324 + dependencies:
2325 + extend "^3.0.0"
2326 + glob "^7.1.1"
2327 + glob-parent "^3.1.0"
2328 + is-negated-glob "^1.0.0"
2329 + ordered-read-streams "^1.0.0"
2330 + pumpify "^1.3.5"
2331 + readable-stream "^2.1.5"
2332 + remove-trailing-separator "^1.0.1"
2333 + to-absolute-glob "^2.0.0"
2334 + unique-stream "^2.0.2"
2335 +
2336 +glob@^7.1.1, glob@^7.1.3:
2337 + version "7.1.6"
2338 + resolved "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz"
2339 + integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==
2340 + dependencies:
2341 + fs.realpath "^1.0.0"
2342 + inflight "^1.0.4"
2343 + inherits "2"
2344 + minimatch "^3.0.4"
2345 + once "^1.3.0"
2346 + path-is-absolute "^1.0.0"
2347 +
2348 +globals@^13.6.0, globals@^13.9.0:
2349 + version "13.11.0"
2350 + resolved "https://registry.npmjs.org/globals/-/globals-13.11.0.tgz"
2351 + integrity sha512-08/xrJ7wQjK9kkkRoI3OFUBbLx4f+6x3SGwcPvQ0QH6goFDrOU2oyAWrmh3dJezu65buo+HBMzAMQy6rovVC3g==
2352 + dependencies:
2353 + type-fest "^0.20.2"
2354 +
2355 +has-flag@^3.0.0:
2356 + version "3.0.0"
2357 + resolved "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz"
2358 + integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0=
2359 +
2360 +has-flag@^4.0.0:
2361 + version "4.0.0"
2362 + resolved "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz"
2363 + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==
2364 +
2365 +help-me@^1.0.1:
2366 + version "1.1.0"
2367 + resolved "https://registry.npmjs.org/help-me/-/help-me-1.1.0.tgz"
2368 + integrity sha1-jy1QjQYAtKRW2i8IZVbn5cBWo8Y=
2369 + dependencies:
2370 + callback-stream "^1.0.2"
2371 + glob-stream "^6.1.0"
2372 + through2 "^2.0.1"
2373 + xtend "^4.0.0"
2374 +
2375 +ieee754@^1.1.13:
2376 + version "1.2.1"
2377 + resolved "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz"
2378 + integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==
2379 +
2380 +ignore@^4.0.6:
2381 + version "4.0.6"
2382 + resolved "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz"
2383 + integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==
2384 +
2385 +import-fresh@^3.0.0, import-fresh@^3.2.1:
2386 + version "3.3.0"
2387 + resolved "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz"
2388 + integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==
2389 + dependencies:
2390 + parent-module "^1.0.0"
2391 + resolve-from "^4.0.0"
2392 +
2393 +imurmurhash@^0.1.4:
2394 + version "0.1.4"
2395 + resolved "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz"
2396 + integrity sha1-khi5srkoojixPcT7a21XbyMUU+o=
2397 +
2398 +inflight@^1.0.4:
2399 + version "1.0.6"
2400 + resolved "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz"
2401 + integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=
2402 + dependencies:
2403 + once "^1.3.0"
2404 + wrappy "1"
2405 +
2406 +inherits@2, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.3:
2407 + version "2.0.4"
2408 + resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz"
2409 + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
2410 +
2411 +is-absolute@^1.0.0:
2412 + version "1.0.0"
2413 + resolved "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz"
2414 + integrity sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==
2415 + dependencies:
2416 + is-relative "^1.0.0"
2417 + is-windows "^1.0.1"
2418 +
2419 +is-extglob@^2.1.0, is-extglob@^2.1.1:
2420 + version "2.1.1"
2421 + resolved "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz"
2422 + integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=
2423 +
2424 +is-fullwidth-code-point@^3.0.0:
2425 + version "3.0.0"
2426 + resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz"
2427 + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==
2428 +
2429 +is-glob@^3.1.0:
2430 + version "3.1.0"
2431 + resolved "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz"
2432 + integrity sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=
2433 + dependencies:
2434 + is-extglob "^2.1.0"
2435 +
2436 +is-glob@^4.0.0, is-glob@^4.0.1:
2437 + version "4.0.1"
2438 + resolved "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz"
2439 + integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==
2440 + dependencies:
2441 + is-extglob "^2.1.1"
2442 +
2443 +is-negated-glob@^1.0.0:
2444 + version "1.0.0"
2445 + resolved "https://registry.npmjs.org/is-negated-glob/-/is-negated-glob-1.0.0.tgz"
2446 + integrity sha1-aRC8pdqMleeEtXUbl2z1oQ/uNtI=
2447 +
2448 +is-relative@^1.0.0:
2449 + version "1.0.0"
2450 + resolved "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz"
2451 + integrity sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==
2452 + dependencies:
2453 + is-unc-path "^1.0.0"
2454 +
2455 +is-unc-path@^1.0.0:
2456 + version "1.0.0"
2457 + resolved "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz"
2458 + integrity sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==
2459 + dependencies:
2460 + unc-path-regex "^0.1.2"
2461 +
2462 +is-windows@^1.0.1:
2463 + version "1.0.2"
2464 + resolved "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz"
2465 + integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==
2466 +
2467 +isarray@~1.0.0:
2468 + version "1.0.0"
2469 + resolved "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz"
2470 + integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=
2471 +
2472 +isexe@^2.0.0:
2473 + version "2.0.0"
2474 + resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz"
2475 + integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=
2476 +
2477 +js-tokens@^4.0.0:
2478 + version "4.0.0"
2479 + resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz"
2480 + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==
2481 +
2482 +js-yaml@^3.13.1:
2483 + version "3.14.1"
2484 + resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz"
2485 + integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==
2486 + dependencies:
2487 + argparse "^1.0.7"
2488 + esprima "^4.0.0"
2489 +
2490 +json-schema-traverse@^0.4.1:
2491 + version "0.4.1"
2492 + resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz"
2493 + integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==
2494 +
2495 +json-schema-traverse@^1.0.0:
2496 + version "1.0.0"
2497 + resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz"
2498 + integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==
2499 +
2500 +json-stable-stringify-without-jsonify@^1.0.1:
2501 + version "1.0.1"
2502 + resolved "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz"
2503 + integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=
2504 +
2505 +leven@^2.1.0:
2506 + version "2.1.0"
2507 + resolved "https://registry.npmjs.org/leven/-/leven-2.1.0.tgz"
2508 + integrity sha1-wuep93IJTe6dNCAq6KzORoeHVYA=
2509 +
2510 +levn@^0.4.1:
2511 + version "0.4.1"
2512 + resolved "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz"
2513 + integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==
2514 + dependencies:
2515 + prelude-ls "^1.2.1"
2516 + type-check "~0.4.0"
2517 +
2518 +lodash.clonedeep@^4.5.0:
2519 + version "4.5.0"
2520 + resolved "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz"
2521 + integrity sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=
2522 +
2523 +lodash.merge@^4.6.2:
2524 + version "4.6.2"
2525 + resolved "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz"
2526 + integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==
2527 +
2528 +lodash.truncate@^4.4.2:
2529 + version "4.4.2"
2530 + resolved "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz"
2531 + integrity sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM=
2532 +
2533 +lru-cache@^6.0.0:
2534 + version "6.0.0"
2535 + resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz"
2536 + integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==
2537 + dependencies:
2538 + yallist "^4.0.0"
2539 +
2540 +minimatch@^3.0.4:
2541 + version "3.0.4"
2542 + resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz"
2543 + integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==
2544 + dependencies:
2545 + brace-expansion "^1.1.7"
2546 +
2547 +minimist@^1.1.0, minimist@^1.2.5:
2548 + version "1.2.5"
2549 + resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz"
2550 + integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==
2551 +
2552 +moment-timezone@^0.5.31:
2553 + version "0.5.33"
2554 + resolved "https://registry.yarnpkg.com/moment-timezone/-/moment-timezone-0.5.33.tgz#b252fd6bb57f341c9b59a5ab61a8e51a73bbd22c"
2555 + integrity sha512-PTc2vcT8K9J5/9rDEPe5czSIKgLoGsH8UNpA4qZTVw0Vd/Uz19geE9abbIOQKaAQFcnQ3v5YEXrbSc5BpshH+w==
2556 + dependencies:
2557 + moment ">= 2.9.0"
2558 +
2559 +"moment@>= 2.9.0", moment@^2.29.1:
2560 + version "2.29.1"
2561 + resolved "https://registry.npmjs.org/moment/-/moment-2.29.1.tgz"
2562 + integrity sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ==
2563 +
2564 +mqtt-packet@^6.6.0:
2565 + version "6.9.1"
2566 + resolved "https://registry.npmjs.org/mqtt-packet/-/mqtt-packet-6.9.1.tgz"
2567 + integrity sha512-0+u0ZoRj6H6AuzNY5d8qzXzyXmFI19gkdPRA14kGfKvbqYcpOL+HWUGHjtCxHqjm8CscwsH+dX0+Rxx4se5HSA==
2568 + dependencies:
2569 + bl "^4.0.2"
2570 + debug "^4.1.1"
2571 + process-nextick-args "^2.0.1"
2572 +
2573 +mqtt@^4.2.6:
2574 + version "4.2.6"
2575 + resolved "https://registry.npmjs.org/mqtt/-/mqtt-4.2.6.tgz"
2576 + integrity sha512-GpxVObyOzL0CGPBqo6B04GinN8JLk12NRYAIkYvARd9ZCoJKevvOyCaWK6bdK/kFSDj3LPDnCsJbezzNlsi87Q==
2577 + dependencies:
2578 + commist "^1.0.0"
2579 + concat-stream "^2.0.0"
2580 + debug "^4.1.1"
2581 + help-me "^1.0.1"
2582 + inherits "^2.0.3"
2583 + minimist "^1.2.5"
2584 + mqtt-packet "^6.6.0"
2585 + pump "^3.0.0"
2586 + readable-stream "^3.6.0"
2587 + reinterval "^1.1.0"
2588 + split2 "^3.1.0"
2589 + ws "^7.3.1"
2590 + xtend "^4.0.2"
2591 +
2592 +ms@2.1.2:
2593 + version "2.1.2"
2594 + resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz"
2595 + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==
2596 +
2597 +natural-compare@^1.4.0:
2598 + version "1.4.0"
2599 + resolved "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz"
2600 + integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=
2601 +
2602 +node-cron@^3.0.0:
2603 + version "3.0.0"
2604 + resolved "https://registry.yarnpkg.com/node-cron/-/node-cron-3.0.0.tgz#b33252803e430f9cd8590cf85738efa1497a9522"
2605 + integrity sha512-DDwIvvuCwrNiaU7HEivFDULcaQualDv7KoNlB/UU1wPW0n1tDEmBJKhEIE6DlF2FuoOHcNbLJ8ITL2Iv/3AWmA==
2606 + dependencies:
2607 + moment-timezone "^0.5.31"
2608 +
2609 +once@^1.3.0, once@^1.3.1, once@^1.4.0:
2610 + version "1.4.0"
2611 + resolved "https://registry.npmjs.org/once/-/once-1.4.0.tgz"
2612 + integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E=
2613 + dependencies:
2614 + wrappy "1"
2615 +
2616 +optionator@^0.9.1:
2617 + version "0.9.1"
2618 + resolved "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz"
2619 + integrity sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==
2620 + dependencies:
2621 + deep-is "^0.1.3"
2622 + fast-levenshtein "^2.0.6"
2623 + levn "^0.4.1"
2624 + prelude-ls "^1.2.1"
2625 + type-check "^0.4.0"
2626 + word-wrap "^1.2.3"
2627 +
2628 +ordered-read-streams@^1.0.0:
2629 + version "1.0.1"
2630 + resolved "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-1.0.1.tgz"
2631 + integrity sha1-d8DLN8QVJdZBZtmQ/61+xqDhNj4=
2632 + dependencies:
2633 + readable-stream "^2.0.1"
2634 +
2635 +parent-module@^1.0.0:
2636 + version "1.0.1"
2637 + resolved "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz"
2638 + integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==
2639 + dependencies:
2640 + callsites "^3.0.0"
2641 +
2642 +path-dirname@^1.0.0:
2643 + version "1.0.2"
2644 + resolved "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz"
2645 + integrity sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=
2646 +
2647 +path-is-absolute@^1.0.0:
2648 + version "1.0.1"
2649 + resolved "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz"
2650 + integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18=
2651 +
2652 +path-key@^3.1.0:
2653 + version "3.1.1"
2654 + resolved "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz"
2655 + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==
2656 +
2657 +prelude-ls@^1.2.1:
2658 + version "1.2.1"
2659 + resolved "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz"
2660 + integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==
2661 +
2662 +process-nextick-args@^2.0.1, process-nextick-args@~2.0.0:
2663 + version "2.0.1"
2664 + resolved "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz"
2665 + integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==
2666 +
2667 +progress@^2.0.0:
2668 + version "2.0.3"
2669 + resolved "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz"
2670 + integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==
2671 +
2672 +pump@^2.0.0:
2673 + version "2.0.1"
2674 + resolved "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz"
2675 + integrity sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==
2676 + dependencies:
2677 + end-of-stream "^1.1.0"
2678 + once "^1.3.1"
2679 +
2680 +pump@^3.0.0:
2681 + version "3.0.0"
2682 + resolved "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz"
2683 + integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==
2684 + dependencies:
2685 + end-of-stream "^1.1.0"
2686 + once "^1.3.1"
2687 +
2688 +pumpify@^1.3.5:
2689 + version "1.5.1"
2690 + resolved "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz"
2691 + integrity sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==
2692 + dependencies:
2693 + duplexify "^3.6.0"
2694 + inherits "^2.0.3"
2695 + pump "^2.0.0"
2696 +
2697 +punycode@^2.1.0:
2698 + version "2.1.1"
2699 + resolved "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz"
2700 + integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==
2701 +
2702 +"readable-stream@> 1.0.0 < 3.0.0", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.1.5, readable-stream@~2.3.6:
2703 + version "2.3.7"
2704 + resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz"
2705 + integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==
2706 + dependencies:
2707 + core-util-is "~1.0.0"
2708 + inherits "~2.0.3"
2709 + isarray "~1.0.0"
2710 + process-nextick-args "~2.0.0"
2711 + safe-buffer "~5.1.1"
2712 + string_decoder "~1.1.1"
2713 + util-deprecate "~1.0.1"
2714 +
2715 +readable-stream@^3.0.0, readable-stream@^3.0.2, readable-stream@^3.4.0, readable-stream@^3.6.0:
2716 + version "3.6.0"
2717 + resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz"
2718 + integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==
2719 + dependencies:
2720 + inherits "^2.0.3"
2721 + string_decoder "^1.1.1"
2722 + util-deprecate "^1.0.1"
2723 +
2724 +regexpp@^3.1.0:
2725 + version "3.2.0"
2726 + resolved "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz"
2727 + integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==
2728 +
2729 +reinterval@^1.1.0:
2730 + version "1.1.0"
2731 + resolved "https://registry.npmjs.org/reinterval/-/reinterval-1.1.0.tgz"
2732 + integrity sha1-M2Hs+jymwYKDOA3Qu5VG85D17Oc=
2733 +
2734 +remove-trailing-separator@^1.0.1:
2735 + version "1.1.0"
2736 + resolved "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz"
2737 + integrity sha1-wkvOKig62tW8P1jg1IJJuSN52O8=
2738 +
2739 +require-from-string@^2.0.2:
2740 + version "2.0.2"
2741 + resolved "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz"
2742 + integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==
2743 +
2744 +resolve-from@^4.0.0:
2745 + version "4.0.0"
2746 + resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz"
2747 + integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==
2748 +
2749 +rimraf@^3.0.2:
2750 + version "3.0.2"
2751 + resolved "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz"
2752 + integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==
2753 + dependencies:
2754 + glob "^7.1.3"
2755 +
2756 +safe-buffer@~5.1.0, safe-buffer@~5.1.1:
2757 + version "5.1.2"
2758 + resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz"
2759 + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==
2760 +
2761 +safe-buffer@~5.2.0:
2762 + version "5.2.1"
2763 + resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz"
2764 + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==
2765 +
2766 +semver@^7.2.1:
2767 + version "7.3.5"
2768 + resolved "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz"
2769 + integrity sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==
2770 + dependencies:
2771 + lru-cache "^6.0.0"
2772 +
2773 +shebang-command@^2.0.0:
2774 + version "2.0.0"
2775 + resolved "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz"
2776 + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==
2777 + dependencies:
2778 + shebang-regex "^3.0.0"
2779 +
2780 +shebang-regex@^3.0.0:
2781 + version "3.0.0"
2782 + resolved "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz"
2783 + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==
2784 +
2785 +slice-ansi@^4.0.0:
2786 + version "4.0.0"
2787 + resolved "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz"
2788 + integrity sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==
2789 + dependencies:
2790 + ansi-styles "^4.0.0"
2791 + astral-regex "^2.0.0"
2792 + is-fullwidth-code-point "^3.0.0"
2793 +
2794 +split2@^3.1.0:
2795 + version "3.2.2"
2796 + resolved "https://registry.npmjs.org/split2/-/split2-3.2.2.tgz"
2797 + integrity sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==
2798 + dependencies:
2799 + readable-stream "^3.0.0"
2800 +
2801 +sprintf-js@~1.0.2:
2802 + version "1.0.3"
2803 + resolved "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz"
2804 + integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=
2805 +
2806 +stream-shift@^1.0.0:
2807 + version "1.0.1"
2808 + resolved "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz"
2809 + integrity sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==
2810 +
2811 +string-width@^4.2.0:
2812 + version "4.2.2"
2813 + resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz"
2814 + integrity sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==
2815 + dependencies:
2816 + emoji-regex "^8.0.0"
2817 + is-fullwidth-code-point "^3.0.0"
2818 + strip-ansi "^6.0.0"
2819 +
2820 +string_decoder@^1.1.1:
2821 + version "1.3.0"
2822 + resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz"
2823 + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==
2824 + dependencies:
2825 + safe-buffer "~5.2.0"
2826 +
2827 +string_decoder@~1.1.1:
2828 + version "1.1.1"
2829 + resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz"
2830 + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==
2831 + dependencies:
2832 + safe-buffer "~5.1.0"
2833 +
2834 +strip-ansi@^6.0.0:
2835 + version "6.0.0"
2836 + resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz"
2837 + integrity sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==
2838 + dependencies:
2839 + ansi-regex "^5.0.0"
2840 +
2841 +strip-json-comments@^3.1.0, strip-json-comments@^3.1.1:
2842 + version "3.1.1"
2843 + resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz"
2844 + integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==
2845 +
2846 +supports-color@^5.3.0:
2847 + version "5.5.0"
2848 + resolved "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz"
2849 + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==
2850 + dependencies:
2851 + has-flag "^3.0.0"
2852 +
2853 +supports-color@^7.1.0:
2854 + version "7.2.0"
2855 + resolved "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz"
2856 + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==
2857 + dependencies:
2858 + has-flag "^4.0.0"
2859 +
2860 +table@^6.0.9:
2861 + version "6.7.1"
2862 + resolved "https://registry.npmjs.org/table/-/table-6.7.1.tgz"
2863 + integrity sha512-ZGum47Yi6KOOFDE8m223td53ath2enHcYLgOCjGr5ngu8bdIARQk6mN/wRMv4yMRcHnCSnHbCEha4sobQx5yWg==
2864 + dependencies:
2865 + ajv "^8.0.1"
2866 + lodash.clonedeep "^4.5.0"
2867 + lodash.truncate "^4.4.2"
2868 + slice-ansi "^4.0.0"
2869 + string-width "^4.2.0"
2870 + strip-ansi "^6.0.0"
2871 +
2872 +text-table@^0.2.0:
2873 + version "0.2.0"
2874 + resolved "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz"
2875 + integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=
2876 +
2877 +through2-filter@^3.0.0:
2878 + version "3.0.0"
2879 + resolved "https://registry.npmjs.org/through2-filter/-/through2-filter-3.0.0.tgz"
2880 + integrity sha512-jaRjI2WxN3W1V8/FMZ9HKIBXixtiqs3SQSX4/YGIiP3gL6djW48VoZq9tDqeCWs3MT8YY5wb/zli8VW8snY1CA==
2881 + dependencies:
2882 + through2 "~2.0.0"
2883 + xtend "~4.0.0"
2884 +
2885 +through2@^2.0.1, through2@~2.0.0:
2886 + version "2.0.5"
2887 + resolved "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz"
2888 + integrity sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==
2889 + dependencies:
2890 + readable-stream "~2.3.6"
2891 + xtend "~4.0.1"
2892 +
2893 +to-absolute-glob@^2.0.0:
2894 + version "2.0.2"
2895 + resolved "https://registry.npmjs.org/to-absolute-glob/-/to-absolute-glob-2.0.2.tgz"
2896 + integrity sha1-GGX0PZ50sIItufFFt4z/fQ98hJs=
2897 + dependencies:
2898 + is-absolute "^1.0.0"
2899 + is-negated-glob "^1.0.0"
2900 +
2901 +type-check@^0.4.0, type-check@~0.4.0:
2902 + version "0.4.0"
2903 + resolved "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz"
2904 + integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==
2905 + dependencies:
2906 + prelude-ls "^1.2.1"
2907 +
2908 +type-fest@^0.20.2:
2909 + version "0.20.2"
2910 + resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz"
2911 + integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==
2912 +
2913 +typedarray@^0.0.6:
2914 + version "0.0.6"
2915 + resolved "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz"
2916 + integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=
2917 +
2918 +unc-path-regex@^0.1.2:
2919 + version "0.1.2"
2920 + resolved "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz"
2921 + integrity sha1-5z3T17DXxe2G+6xrCufYxqadUPo=
2922 +
2923 +unique-stream@^2.0.2:
2924 + version "2.3.1"
2925 + resolved "https://registry.npmjs.org/unique-stream/-/unique-stream-2.3.1.tgz"
2926 + integrity sha512-2nY4TnBE70yoxHkDli7DMazpWiP7xMdCYqU2nBRO0UB+ZpEkGsSija7MvmvnZFUeC+mrgiUfcHSr3LmRFIg4+A==
2927 + dependencies:
2928 + json-stable-stringify-without-jsonify "^1.0.1"
2929 + through2-filter "^3.0.0"
2930 +
2931 +uri-js@^4.2.2:
2932 + version "4.4.1"
2933 + resolved "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz"
2934 + integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==
2935 + dependencies:
2936 + punycode "^2.1.0"
2937 +
2938 +util-deprecate@^1.0.1, util-deprecate@~1.0.1:
2939 + version "1.0.2"
2940 + resolved "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz"
2941 + integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=
2942 +
2943 +v8-compile-cache@^2.0.3:
2944 + version "2.3.0"
2945 + resolved "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz"
2946 + integrity sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==
2947 +
2948 +vary@^1.1.2:
2949 + version "1.1.2"
2950 + resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc"
2951 + integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=
2952 +
2953 +which@^2.0.1:
2954 + version "2.0.2"
2955 + resolved "https://registry.npmjs.org/which/-/which-2.0.2.tgz"
2956 + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==
2957 + dependencies:
2958 + isexe "^2.0.0"
2959 +
2960 +word-wrap@^1.2.3:
2961 + version "1.2.3"
2962 + resolved "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz"
2963 + integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==
2964 +
2965 +wrappy@1:
2966 + version "1.0.2"
2967 + resolved "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz"
2968 + integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=
2969 +
2970 +ws@^7.3.1:
2971 + version "7.4.5"
2972 + resolved "https://registry.npmjs.org/ws/-/ws-7.4.5.tgz"
2973 + integrity sha512-xzyu3hFvomRfXKH8vOFMU3OguG6oOvhXMo3xsGy3xWExqaM2dxBbVxuD99O7m3ZUFMvvscsZDqxfgMaRr/Nr1g==
2974 +
2975 +xtend@^4.0.0, xtend@^4.0.2, xtend@~4.0.0, xtend@~4.0.1:
2976 + version "4.0.2"
2977 + resolved "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz"
2978 + integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==
2979 +
2980 +yallist@^4.0.0:
2981 + version "4.0.0"
2982 + resolved "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz"
2983 + integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==
2984 +>>>>>>> server
......
...@@ -18,6 +18,7 @@ ...@@ -18,6 +18,7 @@
18 "react-dom": "^17.0.2", 18 "react-dom": "^17.0.2",
19 "react-router-dom": "^5.2.0", 19 "react-router-dom": "^5.2.0",
20 "react-scripts": "4.0.3", 20 "react-scripts": "4.0.3",
21 + "react-spinners": "^0.11.0",
21 "recoil": "^0.4.0", 22 "recoil": "^0.4.0",
22 "recoil-persist": "^3.0.0", 23 "recoil-persist": "^3.0.0",
23 "styled-components": "^5.3.0", 24 "styled-components": "^5.3.0",
......
...@@ -74,7 +74,7 @@ const Header = (props : HeaderProps) => { ...@@ -74,7 +74,7 @@ const Header = (props : HeaderProps) => {
74 </styled.HeaderLeftWrapper> 74 </styled.HeaderLeftWrapper>
75 <styled.HeaderCenterWrapper> 75 <styled.HeaderCenterWrapper>
76 <styled.TitleImg src = {headerImg} /> 76 <styled.TitleImg src = {headerImg} />
77 - <styled.Title>내 손 안의 주치의</styled.Title> 77 + <styled.Title>SMART MEDICINE BOX for Doctor</styled.Title>
78 </styled.HeaderCenterWrapper> 78 </styled.HeaderCenterWrapper>
79 <styled.HeaderRightWrapper> 79 <styled.HeaderRightWrapper>
80 { 80 {
......
1 +import styled from 'styled-components';
2 +
3 +export const Container = styled.div `
4 + z-index : 9999;
5 +
6 + position : absolute;
7 +
8 + height : 110vh;
9 + width : 100%;
10 +
11 + display : flex;
12 + justify-content : center;
13 + align-items : center;
14 +
15 + background-color : rgba(0, 0, 0, .3);
16 +`;
...\ No newline at end of file ...\ No newline at end of file
1 +import React, { useEffect } from 'react';
2 +
3 +import { useRecoilValue } from 'recoil';
4 +import * as recoilItem from '../../util/recoilUtil';
5 +
6 +import * as styled from './LoadingStyled';
7 +import Loader from 'react-spinners/BeatLoader'
8 +
9 +const LoadingContainer = () => {
10 +
11 + const loading = useRecoilValue(recoilItem.loading);
12 +
13 + return (
14 + loading ?
15 + <styled.Container>
16 + <Loader color = '#337DFF' loading = {loading} size = {20}/>
17 + </styled.Container> : null
18 + )
19 +};
20 +
21 +export default LoadingContainer;
...\ No newline at end of file ...\ No newline at end of file
...@@ -13,4 +13,10 @@ export const userTypeCd = atom({ ...@@ -13,4 +13,10 @@ export const userTypeCd = atom({
13 key : 'userTypeCd', 13 key : 'userTypeCd',
14 default : 'NORMAL', 14 default : 'NORMAL',
15 effects_UNSTABLE : [persistAtom], 15 effects_UNSTABLE : [persistAtom],
16 +});
17 +
18 +export const loading = atom({
19 + key : 'loading',
20 + default : false,
21 + effects_UNSTABLE : [persistAtom],
16 }); 22 });
...\ No newline at end of file ...\ No newline at end of file
......
...@@ -2,6 +2,7 @@ import React from "react"; ...@@ -2,6 +2,7 @@ import React from "react";
2 import { BrowserRouter, Route, Switch, Redirect } from 'react-router-dom'; 2 import { BrowserRouter, Route, Switch, Redirect } from 'react-router-dom';
3 3
4 import Error from '../components/error'; 4 import Error from '../components/error';
5 +import Loading from '../components/Loading';
5 import { LoginContainer } from "./login"; 6 import { LoginContainer } from "./login";
6 import { RegisterContainer } from './register'; 7 import { RegisterContainer } from './register';
7 import { MainContainer } from "./main"; 8 import { MainContainer } from "./main";
...@@ -12,6 +13,7 @@ const Router = () => { ...@@ -12,6 +13,7 @@ const Router = () => {
12 return ( 13 return (
13 <BrowserRouter> 14 <BrowserRouter>
14 <Error /> 15 <Error />
16 + <Loading />
15 <Switch> 17 <Switch>
16 <Route exact path = '/' component = {MainContainer}/> 18 <Route exact path = '/' component = {MainContainer}/>
17 <Route exact path = '/login' component = {LoginContainer}/> 19 <Route exact path = '/login' component = {LoginContainer}/>
......
...@@ -11,11 +11,14 @@ import * as Alert from '../../../util/alertMessage'; ...@@ -11,11 +11,14 @@ import * as Alert from '../../../util/alertMessage';
11 import { doctorApi, medicineApi } from '../../../api'; 11 import { doctorApi, medicineApi } from '../../../api';
12 12
13 13
14 +//toDo : Generate QR Code By Medicine Id
15 +
14 type DoctorMenuProps = RouteComponentProps 16 type DoctorMenuProps = RouteComponentProps
15 17
16 const DoctorMenuContainer = (props : DoctorMenuProps) => { 18 const DoctorMenuContainer = (props : DoctorMenuProps) => {
17 19
18 const token = useRecoilValue(recoilUtil.token); 20 const token = useRecoilValue(recoilUtil.token);
21 + const [loading, setLoading] = useRecoilState(recoilUtil.loading);
19 22
20 const [doctorInfo, setDoctorInfo] = useState<any>({ 23 const [doctorInfo, setDoctorInfo] = useState<any>({
21 doctorNm : '', 24 doctorNm : '',
...@@ -39,7 +42,7 @@ const DoctorMenuContainer = (props : DoctorMenuProps) => { ...@@ -39,7 +42,7 @@ const DoctorMenuContainer = (props : DoctorMenuProps) => {
39 const [searchPatientKeyword, setSearchPatientKeyword] = useState<string>(''); 42 const [searchPatientKeyword, setSearchPatientKeyword] = useState<string>('');
40 const [filteringPatientList, setFilteringPatientList] = useState<any>([]); 43 const [filteringPatientList, setFilteringPatientList] = useState<any>([]);
41 44
42 - const [patientDetail, setPatientDetail] = useState<any>(); 45 + const [patientDetail, setPatientDetail] = useState<any>(null);
43 46
44 const [editModal, setEditModal] = useState<boolean>(false); 47 const [editModal, setEditModal] = useState<boolean>(false);
45 const [editPatientInfo, setEditPatientInfo] = useState<string>(''); 48 const [editPatientInfo, setEditPatientInfo] = useState<string>('');
...@@ -50,11 +53,13 @@ const DoctorMenuContainer = (props : DoctorMenuProps) => { ...@@ -50,11 +53,13 @@ const DoctorMenuContainer = (props : DoctorMenuProps) => {
50 53
51 const [prescribeModal, setPrescribeModal] = useState<boolean>(false); 54 const [prescribeModal, setPrescribeModal] = useState<boolean>(false);
52 const [searchMedicineKeyword, setSearchMedicineKeyword] = useState<string>(''); 55 const [searchMedicineKeyword, setSearchMedicineKeyword] = useState<string>('');
53 - const [medicineInfo, setMedicineInfo] = useState<any>(); 56 + const [medicineList, setMedicineList] = useState<any>([]);
57 + const [prescribeMedicine, setPrescribeMedicine] = useState<any>(null);
54 58
55 59
56 const fetchData = async() => { 60 const fetchData = async() => {
57 try { 61 try {
62 + setLoading(true);
58 const res = await doctorApi.getDoctorsInfo(token); 63 const res = await doctorApi.getDoctorsInfo(token);
59 if(res.statusText === 'OK') { 64 if(res.statusText === 'OK') {
60 const { doctorInfo } = res.data; 65 const { doctorInfo } = res.data;
...@@ -73,8 +78,10 @@ const DoctorMenuContainer = (props : DoctorMenuProps) => { ...@@ -73,8 +78,10 @@ const DoctorMenuContainer = (props : DoctorMenuProps) => {
73 setPatientList(res.data.patientList); 78 setPatientList(res.data.patientList);
74 }).catch(error => console.log(error)); 79 }).catch(error => console.log(error));
75 } 80 }
81 + setLoading(false);
76 } catch(e) { 82 } catch(e) {
77 console.log(e); 83 console.log(e);
84 + setLoading(false);
78 } 85 }
79 }; 86 };
80 87
...@@ -84,6 +91,7 @@ const DoctorMenuContainer = (props : DoctorMenuProps) => { ...@@ -84,6 +91,7 @@ const DoctorMenuContainer = (props : DoctorMenuProps) => {
84 91
85 const onFetchPatientDetail = async (patientId : string) => { 92 const onFetchPatientDetail = async (patientId : string) => {
86 try { 93 try {
94 + setLoading(true);
87 await doctorApi.getPatientDetail(token, patientId).then(res => { 95 await doctorApi.getPatientDetail(token, patientId).then(res => {
88 setPatientDetail(res.data); 96 setPatientDetail(res.data);
89 setInfo({ 97 setInfo({
...@@ -95,13 +103,16 @@ const DoctorMenuContainer = (props : DoctorMenuProps) => { ...@@ -95,13 +103,16 @@ const DoctorMenuContainer = (props : DoctorMenuProps) => {
95 patientInfo : res.data.info, 103 patientInfo : res.data.info,
96 }); 104 });
97 }).catch(err => console.log(err)); 105 }).catch(err => console.log(err));
106 + setLoading(false);
98 } catch(e) { 107 } catch(e) {
99 console.log(e); 108 console.log(e);
109 + setLoading(false);
100 } 110 }
101 }; 111 };
102 112
103 const onInitialize = async () => { 113 const onInitialize = async () => {
104 await fetchData(); 114 await fetchData();
115 + setPatientDetail(null);
105 setInfo({ 116 setInfo({
106 infoType : 'DOCTOR', 117 infoType : 'DOCTOR',
107 userNm : doctorInfo.doctorNm, 118 userNm : doctorInfo.doctorNm,
...@@ -112,12 +123,7 @@ const DoctorMenuContainer = (props : DoctorMenuProps) => { ...@@ -112,12 +123,7 @@ const DoctorMenuContainer = (props : DoctorMenuProps) => {
112 }); 123 });
113 setFilteringPatientList([]); 124 setFilteringPatientList([]);
114 setSearchPatientKeyword(''); 125 setSearchPatientKeyword('');
115 - setEditModal(false); 126 + onCloseModal();
116 - setEditPatientInfo('');
117 - setNewPatientRegisterModal(false);
118 - setNewPatientSearchId('');
119 - setNewPatientSearchResult(null);
120 - setPatientDetail(null);
121 }; 127 };
122 128
123 const onEditPatientInfo = (e : React.ChangeEvent<HTMLTextAreaElement>) => { 129 const onEditPatientInfo = (e : React.ChangeEvent<HTMLTextAreaElement>) => {
...@@ -149,7 +155,6 @@ const DoctorMenuContainer = (props : DoctorMenuProps) => { ...@@ -149,7 +155,6 @@ const DoctorMenuContainer = (props : DoctorMenuProps) => {
149 Alert.onError('환자의 특이사항을 기록하세요.', () => null); 155 Alert.onError('환자의 특이사항을 기록하세요.', () => null);
150 } 156 }
151 157
152 -
153 }; 158 };
154 159
155 160
...@@ -159,14 +164,18 @@ const DoctorMenuContainer = (props : DoctorMenuProps) => { ...@@ -159,14 +164,18 @@ const DoctorMenuContainer = (props : DoctorMenuProps) => {
159 164
160 const onSearchNewPatientByEmail = async () => { 165 const onSearchNewPatientByEmail = async () => {
161 try { 166 try {
167 + setLoading(true);
162 await doctorApi.searchPatientById(token, newPatientSearchId).then(res => { 168 await doctorApi.searchPatientById(token, newPatientSearchId).then(res => {
163 setNewPatientSearchResult(res.data); 169 setNewPatientSearchResult(res.data);
170 + setLoading(false);
164 }).catch(err => { 171 }).catch(err => {
165 console.log(err); 172 console.log(err);
173 + setLoading(false);
166 Alert.onError('검색 결과가 없습니다.', () => null); 174 Alert.onError('검색 결과가 없습니다.', () => null);
167 setNewPatientSearchResult(null); 175 setNewPatientSearchResult(null);
168 }); 176 });
169 } catch(e : any) { 177 } catch(e : any) {
178 + setLoading(false);
170 Alert.onError(e.response.data.error, () => null); 179 Alert.onError(e.response.data.error, () => null);
171 } 180 }
172 }; 181 };
...@@ -203,6 +212,8 @@ const DoctorMenuContainer = (props : DoctorMenuProps) => { ...@@ -203,6 +212,8 @@ const DoctorMenuContainer = (props : DoctorMenuProps) => {
203 setEditPatientInfo(''); 212 setEditPatientInfo('');
204 setPrescribeModal(false); 213 setPrescribeModal(false);
205 setSearchMedicineKeyword(''); 214 setSearchMedicineKeyword('');
215 + setMedicineList([]);
216 + setPrescribeMedicine(null);
206 }; 217 };
207 218
208 const onGoBottleDetail = (bottleId : number) => { 219 const onGoBottleDetail = (bottleId : number) => {
...@@ -214,16 +225,32 @@ const DoctorMenuContainer = (props : DoctorMenuProps) => { ...@@ -214,16 +225,32 @@ const DoctorMenuContainer = (props : DoctorMenuProps) => {
214 }; 225 };
215 226
216 const searchMedicine = async() => { 227 const searchMedicine = async() => {
228 + setMedicineList([]);
229 + setPrescribeMedicine(null);
217 try { 230 try {
231 + setLoading(true);
218 const res = await medicineApi.searchMedicine(token, searchMedicineKeyword); 232 const res = await medicineApi.searchMedicine(token, searchMedicineKeyword);
219 if(res.statusText === 'OK') { 233 if(res.statusText === 'OK') {
220 - setMedicineInfo(res.data); 234 + console.log(res.data.medicineList)
235 + setMedicineList(res.data.medicineList);
221 } 236 }
237 + setLoading(false);
222 } catch(e : any) { 238 } catch(e : any) {
223 Alert.onError(e.response.data.error, () => null); 239 Alert.onError(e.response.data.error, () => null);
224 } 240 }
225 }; 241 };
226 242
243 + const onPrescribeSubmit = async() => {
244 + //toDo : 처방해서, QR코드 생성
245 + Alert.onWarning('작업 중입니다.', () => null);
246 + };
247 +
248 + const onPrescribeCancel = () => {
249 + Alert.onCheck('취소하시면 작업중인 내용이 사라집니다.', () => {
250 + onCloseModal();
251 + }, () => null)
252 + };
253 +
227 254
228 useEffect(() => { 255 useEffect(() => {
229 if(!token || !token.length) { 256 if(!token || !token.length) {
...@@ -272,8 +299,12 @@ const DoctorMenuContainer = (props : DoctorMenuProps) => { ...@@ -272,8 +299,12 @@ const DoctorMenuContainer = (props : DoctorMenuProps) => {
272 setPrescribeModal = {setPrescribeModal} 299 setPrescribeModal = {setPrescribeModal}
273 searchMedicineKeyword = {searchMedicineKeyword} 300 searchMedicineKeyword = {searchMedicineKeyword}
274 onSetSearchMedicineKeyword = {onSetSearchMedicineKeyword} 301 onSetSearchMedicineKeyword = {onSetSearchMedicineKeyword}
275 - medicineInfo = {medicineInfo} 302 + medicineList = {medicineList}
276 searchMedicine = {searchMedicine} 303 searchMedicine = {searchMedicine}
304 + prescribeMedicine = {prescribeMedicine}
305 + setPrescribeMedicine = {setPrescribeMedicine}
306 + onPrescribeSubmit = {onPrescribeSubmit}
307 + onPrescribeCancel = {onPrescribeCancel}
277 308
278 newPatientSearchResult = {newPatientSearchResult} 309 newPatientSearchResult = {newPatientSearchResult}
279 /> 310 />
......
...@@ -8,6 +8,8 @@ const lensImg = '/static/img/lens.png'; ...@@ -8,6 +8,8 @@ const lensImg = '/static/img/lens.png';
8 const closeButton = '/static/img/close.png'; 8 const closeButton = '/static/img/close.png';
9 const edit = '/static/img/edit.png'; 9 const edit = '/static/img/edit.png';
10 const refreshing = '/static/img/refreshing.png'; 10 const refreshing = '/static/img/refreshing.png';
11 +const check = '/static/img/check.png';
12 +const uncheck = '/static/img/uncheck.png'
11 13
12 14
13 interface DoctorMenuProps { 15 interface DoctorMenuProps {
...@@ -49,8 +51,14 @@ interface DoctorMenuProps { ...@@ -49,8 +51,14 @@ interface DoctorMenuProps {
49 searchMedicineKeyword : string; 51 searchMedicineKeyword : string;
50 onSetSearchMedicineKeyword : React.ChangeEventHandler<HTMLInputElement>; 52 onSetSearchMedicineKeyword : React.ChangeEventHandler<HTMLInputElement>;
51 53
52 - medicineInfo : any; 54 + medicineList : any;
53 searchMedicine : () => void; 55 searchMedicine : () => void;
56 +
57 + prescribeMedicine : any;
58 + setPrescribeMedicine : (arg0 : any) => void;
59 +
60 + onPrescribeSubmit : () => void;
61 + onPrescribeCancel : () => void;
54 } 62 }
55 63
56 const DoctorMenuPresenter = (props : DoctorMenuProps) => { 64 const DoctorMenuPresenter = (props : DoctorMenuProps) => {
...@@ -180,7 +188,61 @@ const DoctorMenuPresenter = (props : DoctorMenuProps) => { ...@@ -180,7 +188,61 @@ const DoctorMenuPresenter = (props : DoctorMenuProps) => {
180 </styled.ModalClsButtonWrapper> 188 </styled.ModalClsButtonWrapper>
181 <styled.ModalContentWrapper> 189 <styled.ModalContentWrapper>
182 <styled.ModalContent> 190 <styled.ModalContent>
183 - 191 + <styled.MedicineSearchTitle>
192 + 약 검색
193 + </styled.MedicineSearchTitle>
194 + <styled.MedicineSearchInputWrapper>
195 + <styled.MedicineSearchInput
196 + placeholder = '증상, 또는 약 이름을 검색하세요.'
197 + onChange = {props.onSetSearchMedicineKeyword}
198 + value = {props.searchMedicineKeyword}
199 + />
200 + <styled.MedicineSearchButton
201 + onClick = {props.searchMedicine}
202 + >
203 + <styled.MedicineSearchButtonImg src = {lensImg}/>
204 + </styled.MedicineSearchButton>
205 + </styled.MedicineSearchInputWrapper>
206 + <styled.MedicineSearchResultWrapper>
207 + {
208 + props.medicineList.length ?
209 + props.medicineList.map((medicine : any) => {
210 + return (
211 + <styled.MedicineSearchResultEach
212 + key = {medicine.medicineId}
213 + onClick = {() => props.setPrescribeMedicine(medicine)}
214 + >
215 + <styled.MedicineSearchResultEachInfo>
216 + {medicine.name}
217 + </styled.MedicineSearchResultEachInfo>
218 + <styled.MedicineSearchButtonImg
219 + src = {
220 + props.prescribeMedicine && props.prescribeMedicine.medicineId === medicine.medicineId ?
221 + check : uncheck
222 + }
223 + />
224 + </styled.MedicineSearchResultEach>
225 + )
226 + }) :
227 + <styled.NothingWrapper style = {{fontSize : 13,}}>
228 + 🤔검색 결과가 없습니다.
229 + </styled.NothingWrapper>
230 + }
231 + </styled.MedicineSearchResultWrapper>
232 + <styled.MedicinePrescribeButtonWrapper>
233 + <styled.MedicinePrescribeButton
234 + isClose = {false}
235 + onClick = {props.onPrescribeSubmit}
236 + >
237 + 처방
238 + </styled.MedicinePrescribeButton>
239 + <styled.MedicinePrescribeButton
240 + isClose = {true}
241 + onClick = {props.onPrescribeCancel}
242 + >
243 + 취소
244 + </styled.MedicinePrescribeButton>
245 + </styled.MedicinePrescribeButtonWrapper>
184 </styled.ModalContent> 246 </styled.ModalContent>
185 </styled.ModalContentWrapper> 247 </styled.ModalContentWrapper>
186 <styled.ModalClsButtonWrapper/> 248 <styled.ModalClsButtonWrapper/>
...@@ -303,7 +365,7 @@ const DoctorMenuPresenter = (props : DoctorMenuProps) => { ...@@ -303,7 +365,7 @@ const DoctorMenuPresenter = (props : DoctorMenuProps) => {
303 </styled.InfoAndSearchWrapper> 365 </styled.InfoAndSearchWrapper>
304 <styled.BottleListWrapper> 366 <styled.BottleListWrapper>
305 { 367 {
306 - props.patientDetail && props.patientDetail.bottleList ? 368 + props.patientDetail && props.patientDetail.bottleList.length ?
307 props.patientDetail.bottleList.map((bottle : any) => { 369 props.patientDetail.bottleList.map((bottle : any) => {
308 return ( 370 return (
309 <styled.EachBottleWrapper 371 <styled.EachBottleWrapper
...@@ -316,6 +378,11 @@ const DoctorMenuPresenter = (props : DoctorMenuProps) => { ...@@ -316,6 +378,11 @@ const DoctorMenuPresenter = (props : DoctorMenuProps) => {
316 </styled.EachBottleWrapper> 378 </styled.EachBottleWrapper>
317 ) 379 )
318 }) : 380 }) :
381 + props.patientDetail && !props.patientDetail.bottleList.length ?
382 + <styled.NothingWrapper>
383 + 🤔관리하고 있는 환자의 약병이 없습니다.
384 + </styled.NothingWrapper>
385 + :
319 <styled.NothingWrapper> 386 <styled.NothingWrapper>
320 🤔먼저 환자를 선택하세요. 387 🤔먼저 환자를 선택하세요.
321 </styled.NothingWrapper> 388 </styled.NothingWrapper>
......
...@@ -372,6 +372,166 @@ export const PatientInfoEditButton = styled.button ` ...@@ -372,6 +372,166 @@ export const PatientInfoEditButton = styled.button `
372 } 372 }
373 `; 373 `;
374 374
375 +export const MedicineSearchTitle = styled.div `
376 + font-size : 20px;
377 + font-weight : 700;
378 +
379 + color : #337DFF;
380 +`;
381 +
382 +export const MedicineSearchInputWrapper = styled.div `
383 + margin : 20px 0;
384 +
385 + display : flex;
386 + flex-direction : row;
387 +
388 + justify-content : space-between;
389 + align-items : center;
390 +
391 + width : 80%;
392 +
393 + border : none;
394 + border-bottom : 1px solid #343434;
395 +`;
396 +
397 +export const MedicineSearchInput = styled.input `
398 + width : 80%;
399 + border : none;
400 + padding : 10px;
401 +
402 + font-size : 15px;
403 + font-weight : 500;
404 +
405 + color : #343434;
406 +
407 + transition : .25s all;
408 +
409 + &::placeholder {
410 + color : #dedede;
411 + }
412 +`;
413 +
414 +export const MedicineSearchButton = styled.button `
415 + width : 30px;
416 + height : 30px;
417 +
418 + display : flex;
419 + justify-content : center;
420 + align-items : center;
421 +
422 + border : none;
423 + background : transparent;
424 +
425 + cursor : pointer;
426 +
427 + transition : .25s all;
428 +
429 + &:hover {
430 + opacity : .5;
431 + }
432 +
433 +`;
434 +
435 +export const MedicineSearchButtonImg = styled.img `
436 + height : 15px;
437 + width : 15px;
438 +
439 +`;
440 +
441 +export const MedicineSearchResultWrapper = styled.div `
442 + overflow : scroll;
443 +
444 + border : 1px solid;
445 + min-height : 180px;
446 + max-height : 180px;
447 +
448 + width : 80%;
449 +
450 + border : .5px solid #337DFF;
451 +
452 + &::-webkit-scrollbar {
453 + width : 3px;
454 + background-color : transparent;
455 + height : 1px;
456 + }
457 +
458 + &::-webkit-scrollbar-thumb {
459 + background-color : #337DFF;
460 + }
461 +`;
462 +
463 +export const MedicineSearchResultEach = styled.button `
464 + width : 100%;
465 + height : 36px;
466 +
467 + display : flex;
468 + flex-direction : row;
469 +
470 + align-items : center;
471 + justify-content : space-between;
472 +
473 + border : none;
474 + border-bottom : 1px solid #dedede;
475 +
476 + cursor : pointer;
477 +
478 + background : transparent;
479 + color : #343434;
480 +
481 + font-size : 15px;
482 + font-weight : 500;
483 +
484 + transition : .1s all;
485 +
486 + &:hover {
487 + background-color : #337DFF;
488 + color : #fff;
489 + }
490 +
491 +`;
492 +
493 +export const MedicineSearchResultEachInfo = styled.div `
494 + margin : 0 10px;
495 +`;
496 +
497 +export const MedicineSelectButtonImg = styled.img `
498 + height : 15px;
499 + width : 15px;
500 +`;
501 +
502 +export const MedicinePrescribeButtonWrapper = styled.div `
503 + margin : 20px 0 0 0;
504 +
505 + width : 40%;
506 +
507 + display : flex;
508 + flex-direction : row;
509 +
510 + justify-content : space-between;
511 +
512 +`;
513 +
514 +export const MedicinePrescribeButton = styled.button<{isClose : boolean}> `
515 + height : 40px;
516 + width : 100px;
517 +
518 + background-color : ${props => props.isClose ? 'transparent' : '#337DFF'};
519 + border : 1px solid ${props => props.isClose ? '#343434' : '#337DFF'};
520 + border-radius : 4px;
521 +
522 + font-size : 16px;
523 + font-weight : 600;
524 +
525 + color : ${props => props.isClose ? '#343434' : '#fff'};
526 +
527 + cursor : pointer;
528 +
529 + transition : .25s all;
530 +
531 + &:hover {
532 + opacity : .7;
533 + }
534 +`;
375 535
376 536
377 export const InfoAndSearchWrapper = styled.div ` 537 export const InfoAndSearchWrapper = styled.div `
...@@ -508,6 +668,12 @@ export const NewPatientButton = styled.button ` ...@@ -508,6 +668,12 @@ export const NewPatientButton = styled.button `
508 background-color : #337DFF; 668 background-color : #337DFF;
509 color : #fff; 669 color : #fff;
510 } 670 }
671 +
672 + &:disabled {
673 + cursor : default;
674 + background-color : #337DFF;
675 + color : #fff;
676 + }
511 `; 677 `;
512 678
513 export const SearchAndDetailWrapper = styled.div ` 679 export const SearchAndDetailWrapper = styled.div `
......
This diff could not be displayed because it is too large.