Compare commits
20 Commits
20a84b6d1e
...
f8fcda0369
| Author | SHA1 | Date |
|---|---|---|
|
|
f8fcda0369 | |
|
|
823ff346e8 | |
|
|
33ed87a6d8 | |
|
|
e3cc93b986 | |
|
|
4d4cb60413 | |
|
|
c18143c542 | |
|
|
549a78b47e | |
|
|
4248a47916 | |
|
|
6c3a17f0f2 | |
|
|
71e621d63e | |
|
|
7549c0bcd7 | |
|
|
83f11fb4e5 | |
|
|
a799f454e2 | |
|
|
ff14346de4 | |
|
|
5fa0e3f25f | |
|
|
dc59f66c11 | |
|
|
37b84a9975 | |
|
|
6713bc933d | |
|
|
021f61f126 | |
|
|
0e16df04a4 |
|
|
@ -1,2 +0,0 @@
|
|||
**/.idea
|
||||
**/.vscode
|
||||
|
|
@ -3,6 +3,8 @@
|
|||
.github/
|
||||
.Docs/
|
||||
.idea/
|
||||
**/.idea
|
||||
**/.vscode
|
||||
|
||||
# dependencies
|
||||
/node_modules
|
||||
|
|
|
|||
|
|
@ -8,9 +8,7 @@
|
|||
"name": "template.web.boot.simple.homepage",
|
||||
"version": "0.1.0",
|
||||
"dependencies": {
|
||||
"axios": "^1.6.1",
|
||||
"bootstrap": "^5.3.2",
|
||||
"http-proxy-middleware": "^2.0.6",
|
||||
"qs": "^6.11.0",
|
||||
"react": "^18.2.0",
|
||||
"react-bootstrap": "^2.9.0",
|
||||
|
|
@ -20,6 +18,7 @@
|
|||
"react-loader-spinner": "^5.4.5",
|
||||
"react-router-dom": "^6.4.0",
|
||||
"react-scripts": "5.0.1",
|
||||
"recharts": "^2.10.3",
|
||||
"styled-components": "^6.0.9",
|
||||
"web-vitals": "^2.1.4"
|
||||
},
|
||||
|
|
@ -3960,6 +3959,60 @@
|
|||
"@types/node": "*"
|
||||
}
|
||||
},
|
||||
"node_modules/@types/d3-array": {
|
||||
"version": "3.2.1",
|
||||
"resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.2.1.tgz",
|
||||
"integrity": "sha512-Y2Jn2idRrLzUfAKV2LyRImR+y4oa2AntrgID95SHJxuMUrkNXmanDSed71sRNZysveJVt1hLLemQZIady0FpEg=="
|
||||
},
|
||||
"node_modules/@types/d3-color": {
|
||||
"version": "3.1.3",
|
||||
"resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.3.tgz",
|
||||
"integrity": "sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A=="
|
||||
},
|
||||
"node_modules/@types/d3-ease": {
|
||||
"version": "3.0.2",
|
||||
"resolved": "https://registry.npmjs.org/@types/d3-ease/-/d3-ease-3.0.2.tgz",
|
||||
"integrity": "sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA=="
|
||||
},
|
||||
"node_modules/@types/d3-interpolate": {
|
||||
"version": "3.0.4",
|
||||
"resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.4.tgz",
|
||||
"integrity": "sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==",
|
||||
"dependencies": {
|
||||
"@types/d3-color": "*"
|
||||
}
|
||||
},
|
||||
"node_modules/@types/d3-path": {
|
||||
"version": "3.0.2",
|
||||
"resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-3.0.2.tgz",
|
||||
"integrity": "sha512-WAIEVlOCdd/NKRYTsqCpOMHQHemKBEINf8YXMYOtXH0GA7SY0dqMB78P3Uhgfy+4X+/Mlw2wDtlETkN6kQUCMA=="
|
||||
},
|
||||
"node_modules/@types/d3-scale": {
|
||||
"version": "4.0.8",
|
||||
"resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.8.tgz",
|
||||
"integrity": "sha512-gkK1VVTr5iNiYJ7vWDI+yUFFlszhNMtVeneJ6lUTKPjprsvLLI9/tgEGiXJOnlINJA8FyA88gfnQsHbybVZrYQ==",
|
||||
"dependencies": {
|
||||
"@types/d3-time": "*"
|
||||
}
|
||||
},
|
||||
"node_modules/@types/d3-shape": {
|
||||
"version": "3.1.6",
|
||||
"resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.1.6.tgz",
|
||||
"integrity": "sha512-5KKk5aKGu2I+O6SONMYSNflgiP0WfZIQvVUMan50wHsLG1G94JlxEVnCpQARfTtzytuY0p/9PXXZb3I7giofIA==",
|
||||
"dependencies": {
|
||||
"@types/d3-path": "*"
|
||||
}
|
||||
},
|
||||
"node_modules/@types/d3-time": {
|
||||
"version": "3.0.3",
|
||||
"resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.3.tgz",
|
||||
"integrity": "sha512-2p6olUZ4w3s+07q3Tm2dbiMZy5pCDfYwtLXXHUnVzXgQlZ/OyPtUz6OL382BkOuGlLXqfT+wqv8Fw2v8/0geBw=="
|
||||
},
|
||||
"node_modules/@types/d3-timer": {
|
||||
"version": "3.0.2",
|
||||
"resolved": "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-3.0.2.tgz",
|
||||
"integrity": "sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw=="
|
||||
},
|
||||
"node_modules/@types/eslint": {
|
||||
"version": "8.21.1",
|
||||
"resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.21.1.tgz",
|
||||
|
|
@ -4625,7 +4678,8 @@
|
|||
"node_modules/abab": {
|
||||
"version": "2.0.6",
|
||||
"resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz",
|
||||
"integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA=="
|
||||
"integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==",
|
||||
"deprecated": "Use your platform's native atob() and btoa() methods instead"
|
||||
},
|
||||
"node_modules/accepts": {
|
||||
"version": "1.3.8",
|
||||
|
|
@ -5059,29 +5113,6 @@
|
|||
"node": ">=4"
|
||||
}
|
||||
},
|
||||
"node_modules/axios": {
|
||||
"version": "1.6.1",
|
||||
"resolved": "https://registry.npmjs.org/axios/-/axios-1.6.1.tgz",
|
||||
"integrity": "sha512-vfBmhDpKafglh0EldBEbVuoe7DyAavGSLWhuSm5ZSEKQnHhBf0xAAwybbNH1IkrJNGnS/VG4I5yxig1pCEXE4g==",
|
||||
"dependencies": {
|
||||
"follow-redirects": "^1.15.0",
|
||||
"form-data": "^4.0.0",
|
||||
"proxy-from-env": "^1.1.0"
|
||||
}
|
||||
},
|
||||
"node_modules/axios/node_modules/form-data": {
|
||||
"version": "4.0.0",
|
||||
"resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz",
|
||||
"integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==",
|
||||
"dependencies": {
|
||||
"asynckit": "^0.4.0",
|
||||
"combined-stream": "^1.0.8",
|
||||
"mime-types": "^2.1.12"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">= 6"
|
||||
}
|
||||
},
|
||||
"node_modules/axobject-query": {
|
||||
"version": "3.1.1",
|
||||
"resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-3.1.1.tgz",
|
||||
|
|
@ -5778,6 +5809,14 @@
|
|||
"wrap-ansi": "^7.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/clsx": {
|
||||
"version": "2.1.0",
|
||||
"resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.0.tgz",
|
||||
"integrity": "sha512-m3iNNWpd9rl3jvvcBnu70ylMdrXt8Vlq4HYadnU5fwcOtvkSQWPmj7amUcDT2qYI7risszBjI5AUIUox9D16pg==",
|
||||
"engines": {
|
||||
"node": ">=6"
|
||||
}
|
||||
},
|
||||
"node_modules/co": {
|
||||
"version": "4.6.0",
|
||||
"resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz",
|
||||
|
|
@ -6514,6 +6553,116 @@
|
|||
"resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz",
|
||||
"integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ=="
|
||||
},
|
||||
"node_modules/d3-array": {
|
||||
"version": "3.2.4",
|
||||
"resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz",
|
||||
"integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==",
|
||||
"dependencies": {
|
||||
"internmap": "1 - 2"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=12"
|
||||
}
|
||||
},
|
||||
"node_modules/d3-color": {
|
||||
"version": "3.1.0",
|
||||
"resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz",
|
||||
"integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==",
|
||||
"engines": {
|
||||
"node": ">=12"
|
||||
}
|
||||
},
|
||||
"node_modules/d3-ease": {
|
||||
"version": "3.0.1",
|
||||
"resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz",
|
||||
"integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==",
|
||||
"engines": {
|
||||
"node": ">=12"
|
||||
}
|
||||
},
|
||||
"node_modules/d3-format": {
|
||||
"version": "3.1.0",
|
||||
"resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.0.tgz",
|
||||
"integrity": "sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==",
|
||||
"engines": {
|
||||
"node": ">=12"
|
||||
}
|
||||
},
|
||||
"node_modules/d3-interpolate": {
|
||||
"version": "3.0.1",
|
||||
"resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz",
|
||||
"integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==",
|
||||
"dependencies": {
|
||||
"d3-color": "1 - 3"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=12"
|
||||
}
|
||||
},
|
||||
"node_modules/d3-path": {
|
||||
"version": "3.1.0",
|
||||
"resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz",
|
||||
"integrity": "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==",
|
||||
"engines": {
|
||||
"node": ">=12"
|
||||
}
|
||||
},
|
||||
"node_modules/d3-scale": {
|
||||
"version": "4.0.2",
|
||||
"resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz",
|
||||
"integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==",
|
||||
"dependencies": {
|
||||
"d3-array": "2.10.0 - 3",
|
||||
"d3-format": "1 - 3",
|
||||
"d3-interpolate": "1.2.0 - 3",
|
||||
"d3-time": "2.1.1 - 3",
|
||||
"d3-time-format": "2 - 4"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=12"
|
||||
}
|
||||
},
|
||||
"node_modules/d3-shape": {
|
||||
"version": "3.2.0",
|
||||
"resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz",
|
||||
"integrity": "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==",
|
||||
"dependencies": {
|
||||
"d3-path": "^3.1.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=12"
|
||||
}
|
||||
},
|
||||
"node_modules/d3-time": {
|
||||
"version": "3.1.0",
|
||||
"resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz",
|
||||
"integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==",
|
||||
"dependencies": {
|
||||
"d3-array": "2 - 3"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=12"
|
||||
}
|
||||
},
|
||||
"node_modules/d3-time-format": {
|
||||
"version": "4.1.0",
|
||||
"resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz",
|
||||
"integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==",
|
||||
"dependencies": {
|
||||
"d3-time": "1 - 3"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=12"
|
||||
}
|
||||
},
|
||||
"node_modules/d3-timer": {
|
||||
"version": "3.0.1",
|
||||
"resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz",
|
||||
"integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==",
|
||||
"engines": {
|
||||
"node": ">=12"
|
||||
}
|
||||
},
|
||||
"node_modules/damerau-levenshtein": {
|
||||
"version": "1.0.8",
|
||||
"resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz",
|
||||
|
|
@ -6565,6 +6714,11 @@
|
|||
"resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz",
|
||||
"integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA=="
|
||||
},
|
||||
"node_modules/decimal.js-light": {
|
||||
"version": "2.5.1",
|
||||
"resolved": "https://registry.npmjs.org/decimal.js-light/-/decimal.js-light-2.5.1.tgz",
|
||||
"integrity": "sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg=="
|
||||
},
|
||||
"node_modules/dedent": {
|
||||
"version": "0.7.0",
|
||||
"resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz",
|
||||
|
|
@ -6851,6 +7005,7 @@
|
|||
"version": "2.0.1",
|
||||
"resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz",
|
||||
"integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==",
|
||||
"deprecated": "Use your platform's native DOMException instead",
|
||||
"dependencies": {
|
||||
"webidl-conversions": "^5.0.0"
|
||||
},
|
||||
|
|
@ -7958,6 +8113,14 @@
|
|||
"resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
|
||||
"integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="
|
||||
},
|
||||
"node_modules/fast-equals": {
|
||||
"version": "5.0.1",
|
||||
"resolved": "https://registry.npmjs.org/fast-equals/-/fast-equals-5.0.1.tgz",
|
||||
"integrity": "sha512-WF1Wi8PwwSY7/6Kx0vKXtw8RwuSGoM1bvDaJbu7MxDlR1vovZjIAKrnzyrThgAjm6JDTu0fVgWXDlMGspodfoQ==",
|
||||
"engines": {
|
||||
"node": ">=6.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/fast-glob": {
|
||||
"version": "3.2.12",
|
||||
"resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz",
|
||||
|
|
@ -9096,6 +9259,14 @@
|
|||
"node": ">= 0.4"
|
||||
}
|
||||
},
|
||||
"node_modules/internmap": {
|
||||
"version": "2.0.3",
|
||||
"resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz",
|
||||
"integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==",
|
||||
"engines": {
|
||||
"node": ">=12"
|
||||
}
|
||||
},
|
||||
"node_modules/invariant": {
|
||||
"version": "2.2.4",
|
||||
"resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz",
|
||||
|
|
@ -13987,11 +14158,6 @@
|
|||
"node": ">= 0.10"
|
||||
}
|
||||
},
|
||||
"node_modules/proxy-from-env": {
|
||||
"version": "1.1.0",
|
||||
"resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
|
||||
"integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg=="
|
||||
},
|
||||
"node_modules/psl": {
|
||||
"version": "1.9.0",
|
||||
"resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz",
|
||||
|
|
@ -14484,6 +14650,43 @@
|
|||
}
|
||||
}
|
||||
},
|
||||
"node_modules/react-smooth": {
|
||||
"version": "2.0.5",
|
||||
"resolved": "https://registry.npmjs.org/react-smooth/-/react-smooth-2.0.5.tgz",
|
||||
"integrity": "sha512-BMP2Ad42tD60h0JW6BFaib+RJuV5dsXJK9Baxiv/HlNFjvRLqA9xrNKxVWnUIZPQfzUwGXIlU/dSYLU+54YGQA==",
|
||||
"dependencies": {
|
||||
"fast-equals": "^5.0.0",
|
||||
"react-transition-group": "2.9.0"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"prop-types": "^15.6.0",
|
||||
"react": "^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0",
|
||||
"react-dom": "^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/react-smooth/node_modules/dom-helpers": {
|
||||
"version": "3.4.0",
|
||||
"resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-3.4.0.tgz",
|
||||
"integrity": "sha512-LnuPJ+dwqKDIyotW1VzmOZ5TONUN7CwkCR5hrgawTUbkBGYdeoNLZo6nNfGkCrjtE1nXXaj7iMMpDa8/d9WoIA==",
|
||||
"dependencies": {
|
||||
"@babel/runtime": "^7.1.2"
|
||||
}
|
||||
},
|
||||
"node_modules/react-smooth/node_modules/react-transition-group": {
|
||||
"version": "2.9.0",
|
||||
"resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-2.9.0.tgz",
|
||||
"integrity": "sha512-+HzNTCHpeQyl4MJ/bdE0u6XRMe9+XG/+aL4mCxVN4DnPBQ0/5bfHWPDuOZUzYdMj94daZaZdCCc1Dzt9R/xSSg==",
|
||||
"dependencies": {
|
||||
"dom-helpers": "^3.4.0",
|
||||
"loose-envify": "^1.4.0",
|
||||
"prop-types": "^15.6.2",
|
||||
"react-lifecycles-compat": "^3.0.4"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"react": ">=15.0.0",
|
||||
"react-dom": ">=15.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/react-transition-group": {
|
||||
"version": "4.4.5",
|
||||
"resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz",
|
||||
|
|
@ -14531,6 +14734,42 @@
|
|||
"node": ">=8.10.0"
|
||||
}
|
||||
},
|
||||
"node_modules/recharts": {
|
||||
"version": "2.10.3",
|
||||
"resolved": "https://registry.npmjs.org/recharts/-/recharts-2.10.3.tgz",
|
||||
"integrity": "sha512-G4J96fKTZdfFQd6aQnZjo2nVNdXhp+uuLb00+cBTGLo85pChvm1+E67K3wBOHDE/77spcYb2Cy9gYWVqiZvQCg==",
|
||||
"dependencies": {
|
||||
"clsx": "^2.0.0",
|
||||
"eventemitter3": "^4.0.1",
|
||||
"lodash": "^4.17.19",
|
||||
"react-is": "^16.10.2",
|
||||
"react-smooth": "^2.0.5",
|
||||
"recharts-scale": "^0.4.4",
|
||||
"tiny-invariant": "^1.3.1",
|
||||
"victory-vendor": "^36.6.8"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=14"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"prop-types": "^15.6.0",
|
||||
"react": "^16.0.0 || ^17.0.0 || ^18.0.0",
|
||||
"react-dom": "^16.0.0 || ^17.0.0 || ^18.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/recharts-scale": {
|
||||
"version": "0.4.5",
|
||||
"resolved": "https://registry.npmjs.org/recharts-scale/-/recharts-scale-0.4.5.tgz",
|
||||
"integrity": "sha512-kivNFO+0OcUNu7jQquLXAxz1FIwZj8nrj+YkOKc5694NbjCvcT6aSZiIzNzd2Kul4o4rTto8QVR9lMNtxD4G1w==",
|
||||
"dependencies": {
|
||||
"decimal.js-light": "^2.4.1"
|
||||
}
|
||||
},
|
||||
"node_modules/recharts/node_modules/react-is": {
|
||||
"version": "16.13.1",
|
||||
"resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
|
||||
"integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="
|
||||
},
|
||||
"node_modules/recursive-readdir": {
|
||||
"version": "2.2.3",
|
||||
"resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.3.tgz",
|
||||
|
|
@ -16028,6 +16267,11 @@
|
|||
"resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz",
|
||||
"integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA=="
|
||||
},
|
||||
"node_modules/tiny-invariant": {
|
||||
"version": "1.3.1",
|
||||
"resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.1.tgz",
|
||||
"integrity": "sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw=="
|
||||
},
|
||||
"node_modules/tmpl": {
|
||||
"version": "1.0.5",
|
||||
"resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz",
|
||||
|
|
@ -16423,6 +16667,27 @@
|
|||
"node": ">= 0.8"
|
||||
}
|
||||
},
|
||||
"node_modules/victory-vendor": {
|
||||
"version": "36.7.0",
|
||||
"resolved": "https://registry.npmjs.org/victory-vendor/-/victory-vendor-36.7.0.tgz",
|
||||
"integrity": "sha512-nqYuTkLSdTTeACyXcCLbL7rl0y6jpzLPtTNGOtSnajdR+xxMxBdjMxDjfNJNlhR+ZU8vbXz+QejntcbY7h9/ZA==",
|
||||
"dependencies": {
|
||||
"@types/d3-array": "^3.0.3",
|
||||
"@types/d3-ease": "^3.0.0",
|
||||
"@types/d3-interpolate": "^3.0.1",
|
||||
"@types/d3-scale": "^4.0.2",
|
||||
"@types/d3-shape": "^3.1.0",
|
||||
"@types/d3-time": "^3.0.0",
|
||||
"@types/d3-timer": "^3.0.0",
|
||||
"d3-array": "^3.1.6",
|
||||
"d3-ease": "^3.0.1",
|
||||
"d3-interpolate": "^3.0.1",
|
||||
"d3-scale": "^4.0.2",
|
||||
"d3-shape": "^3.1.0",
|
||||
"d3-time": "^3.0.0",
|
||||
"d3-timer": "^3.0.1"
|
||||
}
|
||||
},
|
||||
"node_modules/w3c-hr-time": {
|
||||
"version": "1.0.2",
|
||||
"resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz",
|
||||
|
|
@ -20092,6 +20357,60 @@
|
|||
"@types/node": "*"
|
||||
}
|
||||
},
|
||||
"@types/d3-array": {
|
||||
"version": "3.2.1",
|
||||
"resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.2.1.tgz",
|
||||
"integrity": "sha512-Y2Jn2idRrLzUfAKV2LyRImR+y4oa2AntrgID95SHJxuMUrkNXmanDSed71sRNZysveJVt1hLLemQZIady0FpEg=="
|
||||
},
|
||||
"@types/d3-color": {
|
||||
"version": "3.1.3",
|
||||
"resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.3.tgz",
|
||||
"integrity": "sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A=="
|
||||
},
|
||||
"@types/d3-ease": {
|
||||
"version": "3.0.2",
|
||||
"resolved": "https://registry.npmjs.org/@types/d3-ease/-/d3-ease-3.0.2.tgz",
|
||||
"integrity": "sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA=="
|
||||
},
|
||||
"@types/d3-interpolate": {
|
||||
"version": "3.0.4",
|
||||
"resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.4.tgz",
|
||||
"integrity": "sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==",
|
||||
"requires": {
|
||||
"@types/d3-color": "*"
|
||||
}
|
||||
},
|
||||
"@types/d3-path": {
|
||||
"version": "3.0.2",
|
||||
"resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-3.0.2.tgz",
|
||||
"integrity": "sha512-WAIEVlOCdd/NKRYTsqCpOMHQHemKBEINf8YXMYOtXH0GA7SY0dqMB78P3Uhgfy+4X+/Mlw2wDtlETkN6kQUCMA=="
|
||||
},
|
||||
"@types/d3-scale": {
|
||||
"version": "4.0.8",
|
||||
"resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.8.tgz",
|
||||
"integrity": "sha512-gkK1VVTr5iNiYJ7vWDI+yUFFlszhNMtVeneJ6lUTKPjprsvLLI9/tgEGiXJOnlINJA8FyA88gfnQsHbybVZrYQ==",
|
||||
"requires": {
|
||||
"@types/d3-time": "*"
|
||||
}
|
||||
},
|
||||
"@types/d3-shape": {
|
||||
"version": "3.1.6",
|
||||
"resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.1.6.tgz",
|
||||
"integrity": "sha512-5KKk5aKGu2I+O6SONMYSNflgiP0WfZIQvVUMan50wHsLG1G94JlxEVnCpQARfTtzytuY0p/9PXXZb3I7giofIA==",
|
||||
"requires": {
|
||||
"@types/d3-path": "*"
|
||||
}
|
||||
},
|
||||
"@types/d3-time": {
|
||||
"version": "3.0.3",
|
||||
"resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.3.tgz",
|
||||
"integrity": "sha512-2p6olUZ4w3s+07q3Tm2dbiMZy5pCDfYwtLXXHUnVzXgQlZ/OyPtUz6OL382BkOuGlLXqfT+wqv8Fw2v8/0geBw=="
|
||||
},
|
||||
"@types/d3-timer": {
|
||||
"version": "3.0.2",
|
||||
"resolved": "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-3.0.2.tgz",
|
||||
"integrity": "sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw=="
|
||||
},
|
||||
"@types/eslint": {
|
||||
"version": "8.21.1",
|
||||
"resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.21.1.tgz",
|
||||
|
|
@ -20950,28 +21269,6 @@
|
|||
"resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.6.3.tgz",
|
||||
"integrity": "sha512-/BQzOX780JhsxDnPpH4ZiyrJAzcd8AfzFPkv+89veFSr1rcMjuq2JDCwypKaPeB6ljHp9KjXhPpjgCvQlWYuqg=="
|
||||
},
|
||||
"axios": {
|
||||
"version": "1.6.1",
|
||||
"resolved": "https://registry.npmjs.org/axios/-/axios-1.6.1.tgz",
|
||||
"integrity": "sha512-vfBmhDpKafglh0EldBEbVuoe7DyAavGSLWhuSm5ZSEKQnHhBf0xAAwybbNH1IkrJNGnS/VG4I5yxig1pCEXE4g==",
|
||||
"requires": {
|
||||
"follow-redirects": "^1.15.0",
|
||||
"form-data": "^4.0.0",
|
||||
"proxy-from-env": "^1.1.0"
|
||||
},
|
||||
"dependencies": {
|
||||
"form-data": {
|
||||
"version": "4.0.0",
|
||||
"resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz",
|
||||
"integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==",
|
||||
"requires": {
|
||||
"asynckit": "^0.4.0",
|
||||
"combined-stream": "^1.0.8",
|
||||
"mime-types": "^2.1.12"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"axobject-query": {
|
||||
"version": "3.1.1",
|
||||
"resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-3.1.1.tgz",
|
||||
|
|
@ -21490,6 +21787,11 @@
|
|||
"wrap-ansi": "^7.0.0"
|
||||
}
|
||||
},
|
||||
"clsx": {
|
||||
"version": "2.1.0",
|
||||
"resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.0.tgz",
|
||||
"integrity": "sha512-m3iNNWpd9rl3jvvcBnu70ylMdrXt8Vlq4HYadnU5fwcOtvkSQWPmj7amUcDT2qYI7risszBjI5AUIUox9D16pg=="
|
||||
},
|
||||
"co": {
|
||||
"version": "4.6.0",
|
||||
"resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz",
|
||||
|
|
@ -22020,6 +22322,83 @@
|
|||
"resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz",
|
||||
"integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ=="
|
||||
},
|
||||
"d3-array": {
|
||||
"version": "3.2.4",
|
||||
"resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz",
|
||||
"integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==",
|
||||
"requires": {
|
||||
"internmap": "1 - 2"
|
||||
}
|
||||
},
|
||||
"d3-color": {
|
||||
"version": "3.1.0",
|
||||
"resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz",
|
||||
"integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA=="
|
||||
},
|
||||
"d3-ease": {
|
||||
"version": "3.0.1",
|
||||
"resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz",
|
||||
"integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w=="
|
||||
},
|
||||
"d3-format": {
|
||||
"version": "3.1.0",
|
||||
"resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.0.tgz",
|
||||
"integrity": "sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA=="
|
||||
},
|
||||
"d3-interpolate": {
|
||||
"version": "3.0.1",
|
||||
"resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz",
|
||||
"integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==",
|
||||
"requires": {
|
||||
"d3-color": "1 - 3"
|
||||
}
|
||||
},
|
||||
"d3-path": {
|
||||
"version": "3.1.0",
|
||||
"resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz",
|
||||
"integrity": "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ=="
|
||||
},
|
||||
"d3-scale": {
|
||||
"version": "4.0.2",
|
||||
"resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz",
|
||||
"integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==",
|
||||
"requires": {
|
||||
"d3-array": "2.10.0 - 3",
|
||||
"d3-format": "1 - 3",
|
||||
"d3-interpolate": "1.2.0 - 3",
|
||||
"d3-time": "2.1.1 - 3",
|
||||
"d3-time-format": "2 - 4"
|
||||
}
|
||||
},
|
||||
"d3-shape": {
|
||||
"version": "3.2.0",
|
||||
"resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz",
|
||||
"integrity": "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==",
|
||||
"requires": {
|
||||
"d3-path": "^3.1.0"
|
||||
}
|
||||
},
|
||||
"d3-time": {
|
||||
"version": "3.1.0",
|
||||
"resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz",
|
||||
"integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==",
|
||||
"requires": {
|
||||
"d3-array": "2 - 3"
|
||||
}
|
||||
},
|
||||
"d3-time-format": {
|
||||
"version": "4.1.0",
|
||||
"resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz",
|
||||
"integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==",
|
||||
"requires": {
|
||||
"d3-time": "1 - 3"
|
||||
}
|
||||
},
|
||||
"d3-timer": {
|
||||
"version": "3.0.1",
|
||||
"resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz",
|
||||
"integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA=="
|
||||
},
|
||||
"damerau-levenshtein": {
|
||||
"version": "1.0.8",
|
||||
"resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz",
|
||||
|
|
@ -22053,6 +22432,11 @@
|
|||
"resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz",
|
||||
"integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA=="
|
||||
},
|
||||
"decimal.js-light": {
|
||||
"version": "2.5.1",
|
||||
"resolved": "https://registry.npmjs.org/decimal.js-light/-/decimal.js-light-2.5.1.tgz",
|
||||
"integrity": "sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg=="
|
||||
},
|
||||
"dedent": {
|
||||
"version": "0.7.0",
|
||||
"resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz",
|
||||
|
|
@ -23096,6 +23480,11 @@
|
|||
"resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
|
||||
"integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="
|
||||
},
|
||||
"fast-equals": {
|
||||
"version": "5.0.1",
|
||||
"resolved": "https://registry.npmjs.org/fast-equals/-/fast-equals-5.0.1.tgz",
|
||||
"integrity": "sha512-WF1Wi8PwwSY7/6Kx0vKXtw8RwuSGoM1bvDaJbu7MxDlR1vovZjIAKrnzyrThgAjm6JDTu0fVgWXDlMGspodfoQ=="
|
||||
},
|
||||
"fast-glob": {
|
||||
"version": "3.2.12",
|
||||
"resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz",
|
||||
|
|
@ -23919,6 +24308,11 @@
|
|||
"side-channel": "^1.0.4"
|
||||
}
|
||||
},
|
||||
"internmap": {
|
||||
"version": "2.0.3",
|
||||
"resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz",
|
||||
"integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg=="
|
||||
},
|
||||
"invariant": {
|
||||
"version": "2.2.4",
|
||||
"resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz",
|
||||
|
|
@ -27413,11 +27807,6 @@
|
|||
}
|
||||
}
|
||||
},
|
||||
"proxy-from-env": {
|
||||
"version": "1.1.0",
|
||||
"resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
|
||||
"integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg=="
|
||||
},
|
||||
"psl": {
|
||||
"version": "1.9.0",
|
||||
"resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz",
|
||||
|
|
@ -27773,6 +28162,36 @@
|
|||
"workbox-webpack-plugin": "^6.4.1"
|
||||
}
|
||||
},
|
||||
"react-smooth": {
|
||||
"version": "2.0.5",
|
||||
"resolved": "https://registry.npmjs.org/react-smooth/-/react-smooth-2.0.5.tgz",
|
||||
"integrity": "sha512-BMP2Ad42tD60h0JW6BFaib+RJuV5dsXJK9Baxiv/HlNFjvRLqA9xrNKxVWnUIZPQfzUwGXIlU/dSYLU+54YGQA==",
|
||||
"requires": {
|
||||
"fast-equals": "^5.0.0",
|
||||
"react-transition-group": "2.9.0"
|
||||
},
|
||||
"dependencies": {
|
||||
"dom-helpers": {
|
||||
"version": "3.4.0",
|
||||
"resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-3.4.0.tgz",
|
||||
"integrity": "sha512-LnuPJ+dwqKDIyotW1VzmOZ5TONUN7CwkCR5hrgawTUbkBGYdeoNLZo6nNfGkCrjtE1nXXaj7iMMpDa8/d9WoIA==",
|
||||
"requires": {
|
||||
"@babel/runtime": "^7.1.2"
|
||||
}
|
||||
},
|
||||
"react-transition-group": {
|
||||
"version": "2.9.0",
|
||||
"resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-2.9.0.tgz",
|
||||
"integrity": "sha512-+HzNTCHpeQyl4MJ/bdE0u6XRMe9+XG/+aL4mCxVN4DnPBQ0/5bfHWPDuOZUzYdMj94daZaZdCCc1Dzt9R/xSSg==",
|
||||
"requires": {
|
||||
"dom-helpers": "^3.4.0",
|
||||
"loose-envify": "^1.4.0",
|
||||
"prop-types": "^15.6.2",
|
||||
"react-lifecycles-compat": "^3.0.4"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"react-transition-group": {
|
||||
"version": "4.4.5",
|
||||
"resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz",
|
||||
|
|
@ -27810,6 +28229,36 @@
|
|||
"picomatch": "^2.2.1"
|
||||
}
|
||||
},
|
||||
"recharts": {
|
||||
"version": "2.10.3",
|
||||
"resolved": "https://registry.npmjs.org/recharts/-/recharts-2.10.3.tgz",
|
||||
"integrity": "sha512-G4J96fKTZdfFQd6aQnZjo2nVNdXhp+uuLb00+cBTGLo85pChvm1+E67K3wBOHDE/77spcYb2Cy9gYWVqiZvQCg==",
|
||||
"requires": {
|
||||
"clsx": "^2.0.0",
|
||||
"eventemitter3": "^4.0.1",
|
||||
"lodash": "^4.17.19",
|
||||
"react-is": "^16.10.2",
|
||||
"react-smooth": "^2.0.5",
|
||||
"recharts-scale": "^0.4.4",
|
||||
"tiny-invariant": "^1.3.1",
|
||||
"victory-vendor": "^36.6.8"
|
||||
},
|
||||
"dependencies": {
|
||||
"react-is": {
|
||||
"version": "16.13.1",
|
||||
"resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
|
||||
"integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="
|
||||
}
|
||||
}
|
||||
},
|
||||
"recharts-scale": {
|
||||
"version": "0.4.5",
|
||||
"resolved": "https://registry.npmjs.org/recharts-scale/-/recharts-scale-0.4.5.tgz",
|
||||
"integrity": "sha512-kivNFO+0OcUNu7jQquLXAxz1FIwZj8nrj+YkOKc5694NbjCvcT6aSZiIzNzd2Kul4o4rTto8QVR9lMNtxD4G1w==",
|
||||
"requires": {
|
||||
"decimal.js-light": "^2.4.1"
|
||||
}
|
||||
},
|
||||
"recursive-readdir": {
|
||||
"version": "2.2.3",
|
||||
"resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.3.tgz",
|
||||
|
|
@ -28905,6 +29354,11 @@
|
|||
"resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz",
|
||||
"integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA=="
|
||||
},
|
||||
"tiny-invariant": {
|
||||
"version": "1.3.1",
|
||||
"resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.1.tgz",
|
||||
"integrity": "sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw=="
|
||||
},
|
||||
"tmpl": {
|
||||
"version": "1.0.5",
|
||||
"resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz",
|
||||
|
|
@ -29196,6 +29650,27 @@
|
|||
"resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
|
||||
"integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg=="
|
||||
},
|
||||
"victory-vendor": {
|
||||
"version": "36.7.0",
|
||||
"resolved": "https://registry.npmjs.org/victory-vendor/-/victory-vendor-36.7.0.tgz",
|
||||
"integrity": "sha512-nqYuTkLSdTTeACyXcCLbL7rl0y6jpzLPtTNGOtSnajdR+xxMxBdjMxDjfNJNlhR+ZU8vbXz+QejntcbY7h9/ZA==",
|
||||
"requires": {
|
||||
"@types/d3-array": "^3.0.3",
|
||||
"@types/d3-ease": "^3.0.0",
|
||||
"@types/d3-interpolate": "^3.0.1",
|
||||
"@types/d3-scale": "^4.0.2",
|
||||
"@types/d3-shape": "^3.1.0",
|
||||
"@types/d3-time": "^3.0.0",
|
||||
"@types/d3-timer": "^3.0.0",
|
||||
"d3-array": "^3.1.6",
|
||||
"d3-ease": "^3.0.1",
|
||||
"d3-interpolate": "^3.0.1",
|
||||
"d3-scale": "^4.0.2",
|
||||
"d3-shape": "^3.1.0",
|
||||
"d3-time": "^3.0.0",
|
||||
"d3-timer": "^3.0.1"
|
||||
}
|
||||
},
|
||||
"w3c-hr-time": {
|
||||
"version": "1.0.2",
|
||||
"resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz",
|
||||
|
|
|
|||
|
|
@ -13,6 +13,7 @@
|
|||
"react-loader-spinner": "^5.4.5",
|
||||
"react-router-dom": "^6.4.0",
|
||||
"react-scripts": "5.0.1",
|
||||
"recharts": "^2.10.3",
|
||||
"styled-components": "^6.0.9",
|
||||
"web-vitals": "^2.1.4"
|
||||
},
|
||||
|
|
|
|||
|
|
@ -75,7 +75,7 @@ function EgovHeader({ loginUser, onChangeLogin }) {
|
|||
<li><NavLink to={URL.INTRO} className={({ isActive }) => (isActive ? "cur" : "")}>정보마당</NavLink></li>
|
||||
<li><NavLink to={URL.SUPPORT} className={({ isActive }) => (isActive ? "cur" : "")}>고객지원</NavLink></li>
|
||||
<li><NavLink to={URL.INFORM} className={({ isActive }) => (isActive ? "cur" : "")}>알림마당</NavLink></li>
|
||||
{sessionUserSe ==='ADM' &&
|
||||
{sessionUserSe ==='ACC_TP01' &&
|
||||
<li><NavLink to={URL.ADMIN} className={({ isActive }) => (isActive ? "cur" : "")}>사이트관리</NavLink></li>
|
||||
}
|
||||
</ul>
|
||||
|
|
@ -86,7 +86,7 @@ function EgovHeader({ loginUser, onChangeLogin }) {
|
|||
{/* 로그아웃 : 로그인 정보 있을때 */}
|
||||
{sessionUserId &&
|
||||
<>
|
||||
<span className="person">{sessionUserId} </span> 님이, {sessionUserSe==='ADM'?'관리자':'사용자'}로 로그인하셨습니다.
|
||||
<span className="person">{sessionUserId} </span> 님이, {sessionUserSe==='ACC_TP01'?'관리자':'사용자'}로 로그인하셨습니다.
|
||||
<button onClick={logOutHandler} className="btn">로그아웃</button>
|
||||
</>
|
||||
}
|
||||
|
|
@ -141,7 +141,7 @@ function EgovHeader({ loginUser, onChangeLogin }) {
|
|||
<li><NavLink to={URL.INFORM_GALLERY} className={({ isActive }) => (isActive ? "cur" : "")}>사이트 갤러리</NavLink></li>
|
||||
</ul>
|
||||
</div>
|
||||
{sessionUserSe ==='ADM' &&
|
||||
{sessionUserSe ==='ACC_TP01' &&
|
||||
<div className="col">
|
||||
<h3>사이트관리</h3>
|
||||
<ul>
|
||||
|
|
@ -207,7 +207,7 @@ function EgovHeader({ loginUser, onChangeLogin }) {
|
|||
<li><NavLink to={URL.INFORM_GALLERY} className={({ isActive }) => (isActive ? "cur" : "")}>사이트 갤러리</NavLink></li>
|
||||
</ul>
|
||||
</div>
|
||||
{sessionUserSe ==='ADM' &&
|
||||
{sessionUserSe ==='ACC_TP01' &&
|
||||
<>
|
||||
<h3><Link to={URL.ADMIN}>사이트관리</Link></h3>
|
||||
<div className="submenu closed">
|
||||
|
|
|
|||
|
|
@ -1,18 +1,55 @@
|
|||
import React from 'react';
|
||||
|
||||
function EgovPaging(props) {
|
||||
function EgovPaging({pagination, moveToPage}) {
|
||||
console.groupCollapsed("EgovPaging");
|
||||
console.log("EgovPaging [props] : ", props);
|
||||
console.log("EgovPaging [pagination] : ", pagination);
|
||||
|
||||
let paginationTag = [];
|
||||
|
||||
if (props.pagination === undefined) {
|
||||
if (pagination === undefined) {
|
||||
paginationTag = "-";
|
||||
} else {
|
||||
const currentPageNo = props.pagination.currentPageNo;
|
||||
const pageSize = props.pagination.pageSize;
|
||||
const totalRecordCount = props.pagination.totalRecordCount;
|
||||
const recordCountPerPage = props.pagination.recordCountPerPage;
|
||||
if(pagination.startNum>1){
|
||||
// 첫 페이지 이동
|
||||
paginationTag.push(<li key="fp" className="btn">
|
||||
<button onClick={e => {moveToPage(1)}} className="first">처음</button>
|
||||
</li>);
|
||||
|
||||
// 이전 페이지 이동
|
||||
const prevPageIndex = pagination.pageIndex-10 < 0?1:(pagination.pageIndex-10)
|
||||
paginationTag.push(<li key="pp" className="btn">
|
||||
<button onClick={e => {moveToPage(prevPageIndex)}} className="prev">이전</button>
|
||||
</li>);
|
||||
}
|
||||
for (let i = pagination.startNum; i <= pagination.endNum; i++) {
|
||||
if (i === pagination.pageIndex) {
|
||||
// 현재 페이지
|
||||
paginationTag.push(<li key={i}>
|
||||
<button className="cur">{i}</button>
|
||||
</li>);
|
||||
} else {
|
||||
// 다른 페이지
|
||||
paginationTag.push(<li key={i}>
|
||||
<button onClick={e => {moveToPage(i)}}>{i}</button>
|
||||
</li>);
|
||||
}
|
||||
}
|
||||
if(pagination.endNum!=pagination.maxNum){
|
||||
// 다음 페이지 이동
|
||||
const nextPageIndex = pagination.pageIndex+10 < pagination.maxNum?pagination.maxNum:(pagination.pageIndex-10)
|
||||
paginationTag.push(<li key="np" className="btn">
|
||||
<button onClick={e => {moveToPage(nextPageIndex)}} className="next">다음</button>
|
||||
</li>);
|
||||
|
||||
// 마지막 페이지 이동
|
||||
paginationTag.push(<li key="lp" className="btn">
|
||||
<button onClick={e => {moveToPage(pagination.maxNum)}} className="last"></button>
|
||||
</li>);
|
||||
}
|
||||
/*const currentPageNo = pagination.currentPageNo;
|
||||
const pageSize = pagination.pageSize;
|
||||
const totalRecordCount = pagination.contentCnt;
|
||||
const recordCountPerPage = pagination.rowCnt;
|
||||
|
||||
const totalPageCount = Math.ceil(totalRecordCount / recordCountPerPage);
|
||||
const currentFirstPage = Math.floor((currentPageNo - 1) / pageSize) * pageSize + 1;
|
||||
|
|
@ -22,13 +59,13 @@ function EgovPaging(props) {
|
|||
if (totalPageCount > pageSize) {
|
||||
// 첫 페이지 이동
|
||||
const firstPageTag = <li key="fp" className="btn">
|
||||
<button onClick={e => {props.moveToPage(1)}} className="first">처음</button></li>;
|
||||
<button onClick={e => {moveToPage(1)}} className="first">처음</button></li>;
|
||||
paginationTag.push(firstPageTag);
|
||||
|
||||
// 이전 페이지 이동
|
||||
const prevPageIndex = (currentPageNo - 1 > 0) ? currentPageNo - 1 : 1;
|
||||
const previousPageTag = <li key="pp" className="btn">
|
||||
<button onClick={e => {props.moveToPage(prevPageIndex)}} className="prev">이전</button></li>;
|
||||
<button onClick={e => {moveToPage(prevPageIndex)}} className="prev">이전</button></li>;
|
||||
paginationTag.push(previousPageTag);
|
||||
}
|
||||
|
||||
|
|
@ -42,25 +79,26 @@ function EgovPaging(props) {
|
|||
} else {
|
||||
// 다른 페이지
|
||||
const otherPage = <li key={i}>
|
||||
<button onClick={e => {props.moveToPage(i)}}>{i}</button>
|
||||
<button onClick={e => {moveToPage(i)}}>{i}</button>
|
||||
</li>;
|
||||
console.log("@@@ otherpage : " + otherPage);
|
||||
paginationTag.push(otherPage);
|
||||
}
|
||||
}
|
||||
|
||||
if (totalPageCount > pageSize) {
|
||||
// 다음 페이지 이동
|
||||
const nextPageIndex = (currentLastPage + 1 < totalPageCount) ? currentLastPage + 1 : totalPageCount;
|
||||
const nextPageTag = <li key="np" className="btn">
|
||||
<button onClick={e => {props.moveToPage(nextPageIndex)}} className="next">다음</button>
|
||||
<button onClick={e => {moveToPage(nextPageIndex)}} className="next">다음</button>
|
||||
</li>;
|
||||
paginationTag.push(nextPageTag);
|
||||
|
||||
// 마지막 페이지 이동
|
||||
const lastPageTag = <li key="lp" className="btn">
|
||||
<button onClick={e => {props.moveToPage(totalPageCount)}} className="last"></button></li>;
|
||||
<button onClick={e => {moveToPage(totalPageCount)}} className="last"></button></li>;
|
||||
paginationTag.push(lastPageTag);
|
||||
}
|
||||
}*/
|
||||
}
|
||||
console.log("paginationTag", paginationTag);
|
||||
console.groupEnd("EgovPaging");
|
||||
|
|
|
|||
|
|
@ -25,10 +25,10 @@ function EgovLeftNavAdmin({activeKey}) {
|
|||
</Accordion.Item>
|
||||
|
||||
<Accordion.Item eventKey={"1"}>
|
||||
<Accordion.Header>사용자현황</Accordion.Header>
|
||||
<Accordion.Header>사용자 관리</Accordion.Header>
|
||||
<Accordion.Body>
|
||||
<ul className="menu4">
|
||||
<li><NavLink to={URL.ADMIN__USERS__LIST} className={({ isActive }) => (isActive ? "cur" : "")}>사용자 현황</NavLink></li>
|
||||
<li><NavLink to={URL.ADMIN__USERS__LIST} className={({ isActive }) => (isActive ? "cur" : "")}>사용자 목록</NavLink></li>
|
||||
</ul>
|
||||
</Accordion.Body>
|
||||
</Accordion.Item>
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
const CODE = {
|
||||
RCV_SUCCESS : "200", // 성공
|
||||
|
||||
TOKEN_EXPIRED : "303", // 만료된 토큰
|
||||
RCV_ERROR_AUTH : "403", // 인증 오류
|
||||
RCV_ERROR_DELETE : "700", // 삭제 오류
|
||||
RCV_ERROR_SAVE : "800", // 저장 오류
|
||||
|
|
|
|||
|
|
@ -76,12 +76,12 @@ const URL = {
|
|||
|
||||
ADMIN_MANAGER : "/admin/manager/", // 사이트관리/사이트관리자 암호변경 기능 추가 2023.04.15(토) 김일국
|
||||
|
||||
ADMIN_BASE_CODE : "/admin/config/baseCodeMgt", // 사이트관리/환경설정/기본코드관리
|
||||
ADMIN_STANDARD_CODE : "/admin/config/standardCodeMgt", // 사이트관리/환경설정/건설기준코드관리
|
||||
ADMIN_COMMITTEE_CODE : "/admin/config/committeeCodeMgt", // 사이트관리/환경설정/위원회코드관리
|
||||
ADMIN_MENU : "/admin/config/menuMgt", // 사이트관리/환경설정/메뉴 관리
|
||||
ADMIN_MENU_AUTH : "/admin/config/menuAuthMgt", // 사이트관리/환경설정/메뉴권한 관리
|
||||
ADMIN_ABOUT_SITE : "/admin/config/aboutSiteMgt", // 사이트관리/환경설정/관련사이트 관리
|
||||
ADMIN_BASE_CODE : "/admin/config/base-code-mgt", // 사이트관리/환경설정/기본코드관리
|
||||
ADMIN_STANDARD_CODE : "/admin/config/standard-code-mgt", // 사이트관리/환경설정/건설기준코드관리
|
||||
ADMIN_COMMITTEE_CODE : "/admin/config/committee-code-mgt", // 사이트관리/환경설정/위원회코드관리
|
||||
ADMIN_MENU : "/admin/config/menu-mgt", // 사이트관리/환경설정/메뉴 관리
|
||||
ADMIN_MENU_AUTH : "/admin/config/menu-auth-mgt", // 사이트관리/환경설정/메뉴권한 관리
|
||||
ADMIN_ABOUT_SITE : "/admin/config/about-site-mgt", // 사이트관리/환경설정/관련사이트 관리
|
||||
|
||||
// 관리자 - 사용자 현황
|
||||
ADMIN__USERS__LIST : "/admin/users/list", // 사용자 현황
|
||||
|
|
|
|||
|
|
@ -32,9 +32,11 @@
|
|||
/* Board */
|
||||
.board_list {border-top: 2px solid #222;}
|
||||
.board_list .head {display: table; table-layout: fixed; width: 100%;}
|
||||
.board_list .head > span {display: table-cell; padding: 25px 0 27px 0; border-bottom: 1px solid #888; font-size: 16px; font-weight: 500px; text-align: center;}
|
||||
/* changed by lim padding: 25px 0 27px 0; */
|
||||
.board_list .head > span {display: table-cell; padding: 10px 0 10px 0; border-bottom: 1px solid #888; font-size: 16px; font-weight: 500px; text-align: center;}
|
||||
.board_list .result .list_item {display: table; width: 100%; table-layout: fixed;}
|
||||
.board_list .result .list_item > div {display: table-cell; padding: 18px 0 20px 0; border-bottom: 1px solid #dde2e5; color: #666; font-size: 16px; text-align: center; vertical-align: middle;}
|
||||
/* changed by lim padding: 18px 0 20px 0; */
|
||||
.board_list .result .list_item > div {display: table-cell; padding: 7px 0 7px 0; border-bottom: 1px solid #dde2e5; color: #666; font-size: 16px; text-align: center; vertical-align: middle;}
|
||||
.board_list .result .list_item > div.al {padding: 18px 30px 20px 30px; text-align: left;}
|
||||
.board_list .result .list_item > div.reply {position: relative; padding: 18px 30px 20px 52px;}
|
||||
.board_list .result .list_item > div.reply::before {content: ""; display: block; position: absolute; left: 27px; top: 24px; width: 22px; height: 14px; background: url(css/images/ico_reply.png) no-repeat;}
|
||||
|
|
@ -43,12 +45,12 @@
|
|||
.board_bot {margin-top: 40px;}
|
||||
|
||||
.paging {text-align: center;}
|
||||
.paging .btn {margin-top: 0;}
|
||||
.paging .btn {margin-top: 0; padding: 5px;} /* added by lim padding: 5px; */
|
||||
.paging .btn + .btn {margin-left: 5px;}
|
||||
.paging .btn button {display: inline-block; width: 42px; height: 42px; border: 1px solid #dde2e5; border-radius: 5px; font-size: 0;}
|
||||
.paging .btn button {display: inline-block; width: 32px; height: 32px; border: 1px solid #dde2e5; border-radius: 5px; font-size: 0;} /* changed by lim width: 42px; height: 42px; */
|
||||
.paging .first {background: url(css/images/ico_prev.png) no-repeat center; vertical-align: top; }
|
||||
.paging .prev {margin-right: 26px; background: url(css/images/ico_arrow_r_gray_9x15.png) no-repeat center; vertical-align: top; transform: rotate(180deg);}
|
||||
.paging .next {margin-left: 26px; background: url(css/images/ico_arrow_r_gray_9x15.png) no-repeat center; vertical-align: top;}
|
||||
.paging .prev {margin-right: 6px; background: url(css/images/ico_arrow_r_gray_9x15.png) no-repeat center; vertical-align: top; transform: rotate(180deg);} /* changed by lim margin-right: 26px; */
|
||||
.paging .next {margin-left: 6px; background: url(css/images/ico_arrow_r_gray_9x15.png) no-repeat center; vertical-align: top;} /* changed by lim margin-left: 26px; */
|
||||
.paging .last {background: url(css/images/ico_prev.png) no-repeat center; vertical-align: top; transform: rotate(180deg);}
|
||||
.paging ul {display: inline-block; vertical-align: top;}
|
||||
.paging ul li {display: inline-block; margin-top: 4px; vertical-align: top;}
|
||||
|
|
@ -245,7 +247,7 @@ select::-ms-expand {display:none;}
|
|||
|
||||
|
||||
/* Title */
|
||||
.tit_1 {position: relative; padding-bottom: 50px; color: #222; font-size: 48px; font-weight: 500; letter-spacing: -2px; line-height: 48px;}
|
||||
.tit_1 {position: relative; padding-bottom: 20px; color: #222; font-size: 38px; font-weight: 500; letter-spacing: -2px; line-height: 48px;} /* changed by lim padding-bottom: 50px; font-size: 48px;*/
|
||||
.tit_1::after {content: ""; display: block; position: absolute; left: 0; bottom: 0; width: 30px; height: 2px; background: #0465be;}
|
||||
|
||||
.tit_2 {font-size: 30px; font-weight: 700;}
|
||||
|
|
|
|||
|
|
@ -47,24 +47,24 @@ body {min-width: 1400px;}
|
|||
|
||||
.container {min-height: calc(100vh - 300px);}
|
||||
.c_wrap {width: 1400px; margin: 0 auto; padding: 0 50px;}
|
||||
.c_wrap .layout {display: table; width: 100%; table-layout: fixed;}
|
||||
.c_wrap .layout {display: table; width: 100%; table-layout: fixed; padding-bottom: 20px;} /* added by lim padding-bottom: 20px; */
|
||||
|
||||
/* sub navigation */
|
||||
.c_wrap .layout .nav {display: table-cell; width: 260px; vertical-align: top;}
|
||||
.c_wrap .layout .nav .inner {border: 1px solid #dde2e5; border-radius: 10px;}
|
||||
.nav_title{padding: 35px 30px 26px 30px;} /* border-bottom: 4px solid #dde2e5; changed by lim*/
|
||||
.nav_title{padding: 35px 30px 26px 30px;} /* changed by lim border-bottom: 4px solid #dde2e5; */
|
||||
.c_wrap .layout .nav h2 {color: #222; font-size: 24px;}
|
||||
.c_wrap .layout .nav ul {}/*padding: 26px 30px 27px 30px;*/
|
||||
.c_wrap .layout .nav ul li + li {margin-top: 18px;} /* margin-top: 27px; changed by lim*/
|
||||
.c_wrap .layout .nav ul li a {display: block; position: relative; color: #666; font-size: 14px;} /* font-size: 18px; changed by lim*/
|
||||
.c_wrap .layout .nav ul li + li {margin-top: 18px;} /* changed by lim margin-top: 27px; */
|
||||
.c_wrap .layout .nav ul li a {display: block; position: relative; color: #666; font-size: 14px;} /* changed by lim font-size: 18px; */
|
||||
.c_wrap .layout .nav ul li a:hover::after {content: ""; display: block; position: absolute; right: 0px; top: 50%; transform: translateY(-50%); width: 9px; height: 15px; background: url(css/images/ico_arrow_r_gray_9x15.png) no-repeat;}
|
||||
.c_wrap .layout .nav ul li a.cur {color: #222; font-weight: 700;}
|
||||
|
||||
.c_wrap .layout .contents {display: table-cell; width: auto; padding: 0 0 120px 70px; vertical-align: top;}
|
||||
.c_wrap .layout .contents {display: table-cell; width: auto; padding: 0 0 50px 30px; vertical-align: top;} /* changed by lim padding: 0 0 120px 70px; */
|
||||
|
||||
|
||||
/* location */
|
||||
.location {height: 70px; padding-top: 43px; text-align: right;}
|
||||
.location {height: 30px; padding-top: 23px; text-align: right;} /* chagned by lim height: 70px; padding-top: 43px; */
|
||||
.location ul, .location ul li {display: inline-block; vertical-align: top;}
|
||||
.location ul li {position: relative; color: #666; font-size: 14px;}
|
||||
.location ul li + li::before {content: ""; display: inline-block; width: 4px; height: 7px; margin: 0 9px 0 3px; line-height: 18px; background: url(css/images/ico_arrow_r_gray_4x7.png) no-repeat; vertical-align: 2px;}
|
||||
|
|
|
|||
|
|
@ -7,11 +7,22 @@ import URL from 'constants/url';
|
|||
import CODE from 'constants/code';
|
||||
|
||||
import { default as EgovLeftNav } from 'components/leftmenu/EgovLeftNavAdmin';
|
||||
import EgovAttachFile from 'components/EgovAttachFile';
|
||||
import EgovRadioButtonGroup from 'components/EgovRadioButtonGroup';
|
||||
|
||||
import 'react-datepicker/dist/react-datepicker.css';
|
||||
|
||||
import styled from "styled-components";
|
||||
|
||||
const StyledDiv = styled.div`
|
||||
.org-under-id {
|
||||
margin-left: 20px;
|
||||
@media only screen and (max-width: 768px) {
|
||||
display: block;
|
||||
margin-left: 0px;
|
||||
margin-top: 20px;
|
||||
}
|
||||
}
|
||||
`;
|
||||
|
||||
function SchedulesEdit(props) {
|
||||
console.group("EgovAdminScheduleEdit");
|
||||
console.log("[Start] EgovAdminScheduleEdit ------------------------------");
|
||||
|
|
@ -21,11 +32,8 @@ function SchedulesEdit(props) {
|
|||
const location = useLocation();
|
||||
console.log("EgovAdminScheduleEdit [location] : ", location);
|
||||
|
||||
const reptitSeCodeRadioGroup = [{ value: "1", label: "당일" }, { value: "2", label: "반복" }, { value: "3", label: "연속" }];
|
||||
|
||||
const [modeInfo, setModeInfo] = useState({ mode: props.mode });
|
||||
const [scheduleDetail, setScheduleDetail] = useState({ schdulDeptName: "관리자부서", schdulChargerName: "관리자", schdulKindCode: 2, reptitSeCode: "1", startDate: new Date(), endDate: new Date() });
|
||||
const [boardAttachFiles, setBoardAttachFiles] = useState();
|
||||
const [scheduleDetail, setScheduleDetail] = useState({ startDate: new Date(), endDate: new Date() });
|
||||
|
||||
const [schdulBgndeHH, setSchdulBgndeHH] = useState();
|
||||
const [schdulBgndeMM, setSchdulBgndeMM] = useState();
|
||||
|
|
@ -69,24 +77,31 @@ function SchedulesEdit(props) {
|
|||
}
|
||||
|
||||
const retrieveDetail = () => {
|
||||
if (modeInfo.mode === CODE.MODE_CREATE) {// 조회/등록이면 조회 안함
|
||||
setScheduleDetail({
|
||||
...scheduleDetail,
|
||||
schdulBgnde: location.state.iUseDate,
|
||||
schdulEndde: location.state.iUseDate,
|
||||
startDate: convertDate(location.state.iUseDate),
|
||||
endDate: convertDate(location.state.iUseDate),
|
||||
});
|
||||
return;
|
||||
}
|
||||
|
||||
const retrieveDetailURL = `/schedule/${location.state?.schdulId}`;
|
||||
const requestOptions = {
|
||||
method: "GET",
|
||||
headers: {
|
||||
'Content-type': 'application/json'
|
||||
}
|
||||
}
|
||||
|
||||
EgovNet.requestFetch("/schedule/init",
|
||||
requestOptions,
|
||||
function (resp) {
|
||||
let rawScheduleDetail = resp;
|
||||
console.log( 'kimtheho kimtheho kimtheho kimtheho kimtheho kimtheho kimtheho kimtheho' + rawScheduleDetail );
|
||||
}
|
||||
);
|
||||
|
||||
if (modeInfo.mode === CODE.MODE_CREATE) {// 조회/등록이면 조회 안함
|
||||
setScheduleDetail({
|
||||
...scheduleDetail
|
||||
});
|
||||
return;
|
||||
}
|
||||
|
||||
const retrieveDetailURL = `/schedule/${location.state?.schdulId}`;
|
||||
|
||||
EgovNet.requestFetch(retrieveDetailURL,
|
||||
requestOptions,
|
||||
function (resp) {
|
||||
|
|
@ -98,10 +113,13 @@ function SchedulesEdit(props) {
|
|||
startDate: convertDate(rawScheduleDetail.schdulBgnde),
|
||||
endDate: convertDate(rawScheduleDetail.schdulEndde),
|
||||
atchFileId : rawScheduleDetail.atchFileId.trim(),
|
||||
schdulIpcrCode : "B",
|
||||
});
|
||||
setBoardAttachFiles(resp.result.resultFiles);
|
||||
}
|
||||
);
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
const updateSchedule = () => {
|
||||
|
|
@ -207,31 +225,40 @@ function SchedulesEdit(props) {
|
|||
{/* <!-- <h2 className="tit_2">위원회 일정 추가</h2> --> */}
|
||||
|
||||
{/* <!-- 게시판 상세보기 --> */}
|
||||
<div className="board_view2">
|
||||
<StyledDiv className="board_view2">
|
||||
<dl>
|
||||
<dt>일정구분<span className="req">필수</span></dt>
|
||||
<dt>구분<span className="req">필수</span></dt>
|
||||
<dd>
|
||||
<label className="f_select w_130" htmlFor="schdulSe">
|
||||
<select id="schdulSe" name="schdulSe" title="일정구분"
|
||||
value={scheduleDetail.schdulSe}
|
||||
onChange={(e) => setScheduleDetail({ ...scheduleDetail, schdulSe: e.target.value })}>
|
||||
<option value="">선택</option>
|
||||
<option value="1">회의</option>
|
||||
<option value="2">세미나</option>
|
||||
<option value="3">강의</option>
|
||||
<option value="4">교육</option>
|
||||
<option value="5">기타</option>
|
||||
<option value="1">일반회의</option>
|
||||
<option value="2">기준기획</option>
|
||||
<option value="3">제개정검토</option>
|
||||
<option value="4">기준심의</option>
|
||||
</select>
|
||||
</label>
|
||||
</dd>
|
||||
</dl>
|
||||
<dl>
|
||||
<dt>중요도<span className="req">필수</span></dt>
|
||||
<dt>심의위원회<span className="req">필수</span></dt>
|
||||
<dd>
|
||||
<label className="f_select w_130" htmlFor="schdulIpcrCode">
|
||||
<select id="schdulIpcrCode" name="schdulIpcrCode" title="중요도"
|
||||
value={scheduleDetail.schdulIpcrCode}
|
||||
onChange={(e) => setScheduleDetail({ ...scheduleDetail, schdulIpcrCode: e.target.value })}>
|
||||
<label className="f_select w_150 org-group-id" htmlFor="orgGroupId">
|
||||
<select id="orgGroupId" name="orgGroupId" title="중요도"
|
||||
value={scheduleDetail.orgGroupId}
|
||||
onChange={(e) => setScheduleDetail({ ...scheduleDetail, orgGroupId: e.target.value })}>
|
||||
<option value="">선택</option>
|
||||
<option value="A">높음</option>
|
||||
<option value="B">보통</option>
|
||||
<option value="C">낮음</option>
|
||||
</select>
|
||||
</label>
|
||||
<label className="f_select w_150 org-under-id" htmlFor="orgUnderId">
|
||||
<select id="orgUnderId" name="orgUnderId" title="중요도"
|
||||
value={scheduleDetail.orgUnderId}
|
||||
onChange={(e) => setScheduleDetail({ ...scheduleDetail, orgUnderId: e.target.value })}>
|
||||
<option value="">선택</option>
|
||||
<option value="A">높음</option>
|
||||
<option value="B">보통</option>
|
||||
|
|
@ -241,7 +268,7 @@ function SchedulesEdit(props) {
|
|||
</dd>
|
||||
</dl>
|
||||
<dl>
|
||||
<dt><label htmlFor="schdulDeptName">부서</label><span className="req">필수</span></dt>
|
||||
<dt><label htmlFor="schdulDeptName">제목</label><span className="req">필수</span></dt>
|
||||
<dd>
|
||||
<input className="f_input2 w_full" type="text" name="schdulDeptName" title="부서" id="schdulDeptName"
|
||||
value={scheduleDetail.schdulDeptName} readOnly
|
||||
|
|
@ -249,32 +276,13 @@ function SchedulesEdit(props) {
|
|||
</dd>
|
||||
</dl>
|
||||
<dl>
|
||||
<dt><label htmlFor="schdulNm">일정명</label><span className="req">필수</span></dt>
|
||||
<dt><label htmlFor="schdulNm">장소</label><span className="req">필수</span></dt>
|
||||
<dd>
|
||||
<input className="f_input2 w_full" type="text" name="schdulNm" title="부서" id="schdulNm" placeholder="일정 테스트"
|
||||
defaultValue={scheduleDetail.schdulNm}
|
||||
onChange={(e) => setScheduleDetail({ ...scheduleDetail, schdulNm: e.target.value })} />
|
||||
</dd>
|
||||
</dl>
|
||||
<dl>
|
||||
<dt><label htmlFor="schdulCn">일정내용</label><span className="req">필수</span></dt>
|
||||
<dd>
|
||||
<textarea className="f_txtar w_full h_100" name="schdulCn" id="schdulCn" cols="30" rows="10" placeholder="일정내용"
|
||||
defaultValue={scheduleDetail.schdulCn}
|
||||
onChange={(e) => setScheduleDetail({ ...scheduleDetail, schdulCn: e.target.value })}
|
||||
></textarea>
|
||||
</dd>
|
||||
</dl>
|
||||
<dl>
|
||||
<dt>반복구분<span className="req">필수</span></dt>
|
||||
<dd>
|
||||
<EgovRadioButtonGroup
|
||||
name="reptitSeCode"
|
||||
radioGroup={reptitSeCodeRadioGroup}
|
||||
setValue={scheduleDetail.reptitSeCode.trim()}
|
||||
setter={(v) => setScheduleDetail({ ...scheduleDetail, reptitSeCode: v })} />
|
||||
</dd>
|
||||
</dl>
|
||||
<dl>
|
||||
<dt>날짜/시간<span className="req">필수</span></dt>
|
||||
<dd className="datetime">
|
||||
|
|
@ -316,27 +324,14 @@ function SchedulesEdit(props) {
|
|||
</dd>
|
||||
</dl>
|
||||
<dl>
|
||||
<dt><label htmlFor="schdulChargerName">담당자</label><span className="req">필수</span></dt>
|
||||
<dt><label htmlFor="schdulCn">내용</label><span className="req">필수</span></dt>
|
||||
<dd>
|
||||
<input className="f_input2 w_full" type="text" name="schdulChargerName" id="schdulChargerName" defaultValue="관리자" readOnly
|
||||
/>
|
||||
<textarea className="f_txtar w_full h_100" name="schdulCn" id="schdulCn" cols="30" rows="10" placeholder="일정내용"
|
||||
defaultValue={scheduleDetail.schdulCn}
|
||||
onChange={(e) => setScheduleDetail({ ...scheduleDetail, schdulCn: e.target.value })}
|
||||
></textarea>
|
||||
</dd>
|
||||
</dl>
|
||||
<EgovAttachFile
|
||||
fnChangeFile={(attachfile) => {
|
||||
console.log("====>>> Changed attachfile file = ", attachfile);
|
||||
const arrayConcat = { ...scheduleDetail}; // 기존 단일 파일 업로드에서 다중파일 객체 추가로 변환(아래 for문으로)
|
||||
for ( let i = 0; i < attachfile.length; i++) {
|
||||
arrayConcat[`file_${i}`] = attachfile[i];
|
||||
}
|
||||
setScheduleDetail(arrayConcat);
|
||||
}}
|
||||
fnDeleteFile={(deletedFile) => {
|
||||
console.log("====>>> Delete deletedFile = ", deletedFile);
|
||||
setBoardAttachFiles(deletedFile);
|
||||
}}
|
||||
boardFiles={boardAttachFiles}
|
||||
mode={props.mode} />
|
||||
|
||||
{/* <!-- 버튼영역 --> */}
|
||||
<div className="board_btn_area">
|
||||
|
|
@ -352,7 +347,7 @@ function SchedulesEdit(props) {
|
|||
</div>
|
||||
</div>
|
||||
{/* <!--// 버튼영역 --> */}
|
||||
</div>
|
||||
</StyledDiv>
|
||||
{/* <!-- 게시판 상세보기 --> */}
|
||||
|
||||
{/* <!--// 본문 --> */}
|
||||
|
|
|
|||
|
|
@ -1,5 +1,4 @@
|
|||
import React from 'react';
|
||||
import CODE from "../../../constants/code";
|
||||
import React, {useRef} from 'react';
|
||||
import { default as EgovLeftNav } from 'components/leftmenu/EgovLeftNavAdmin';
|
||||
import {Link} from "react-router-dom";
|
||||
import URL from "../../../constants/url";
|
||||
|
|
@ -11,14 +10,22 @@ import ChildCodeDiv from "./baseCode/ChildCodeDiv";
|
|||
|
||||
function BaseCodeMgt(props) {
|
||||
|
||||
// ParentCodeDiv에서 ChildCodeDiv로 함수 호출 참고자료
|
||||
// https://velog.io/@hssarah/React%EC%97%90%EC%84%9C-%EB%8B%A4%EB%A5%B8-Function-Component%EC%97%90-%EC%9E%88%EB%8A%94-%ED%95%A8%EC%88%98-%ED%98%B8%EC%B6%9C-React-Calling-Function-From-Another-Function-Component
|
||||
|
||||
const childRef = useRef(null);
|
||||
function getCodeItem(grpCd){
|
||||
childRef.current.getCodeItemList(grpCd);
|
||||
}
|
||||
return (
|
||||
<div className="container">
|
||||
<div className="c_wrap">
|
||||
<div className="location">
|
||||
<ul>
|
||||
<li><Link to={URL.MAIN} className="home">Home</Link></li>
|
||||
<li><Link to={URL.ADMIN}>사이트관리</Link></li>
|
||||
<li>기본 코드 관리</li>
|
||||
<li>사이트관리</li>
|
||||
<li>환경설정</li>
|
||||
<li><Link to={URL.ADMIN_BASE_CODE}>기본 코드 관리</Link></li>
|
||||
</ul>
|
||||
</div>
|
||||
<div className="layout">
|
||||
|
|
@ -33,10 +40,10 @@ function BaseCodeMgt(props) {
|
|||
|
||||
<Row>
|
||||
<Col xs={"6"}>
|
||||
<ParentCodeDiv/>
|
||||
<ParentCodeDiv getCodeItem={getCodeItem}/>
|
||||
</Col>
|
||||
<Col xs={"6"}>
|
||||
<ChildCodeDiv/>
|
||||
<ChildCodeDiv ref={childRef}/>
|
||||
</Col>
|
||||
</Row>
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -1,30 +1,159 @@
|
|||
import React, {useState, useImperativeHandle, forwardRef} from "react";
|
||||
import * as EgovNet from "api/egovFetch";
|
||||
import {Container} from "react-bootstrap";
|
||||
import Row from "react-bootstrap/Row";
|
||||
import Col from "react-bootstrap/Col";
|
||||
import Form from 'react-bootstrap/Form'
|
||||
import Button from "react-bootstrap/Button";
|
||||
import CODE from "../../../../constants/code";
|
||||
|
||||
function ChildCodeDiv({}, ref){
|
||||
|
||||
const [codeItemRow, setCodeItemRow] = useState();
|
||||
const [grpCd, setGrpCd] = useState();
|
||||
|
||||
useImperativeHandle(ref, ()=>({
|
||||
getCodeItemList
|
||||
}))
|
||||
|
||||
async function getCodeItemList(parentCd){
|
||||
setCodeItemRow([]);
|
||||
setGrpCd(parentCd)
|
||||
EgovNet.requestFetch(
|
||||
'/admin/config/code-item?grpCd='+parentCd,
|
||||
{
|
||||
method: "GET"
|
||||
},
|
||||
(resp) => {
|
||||
const codeItemList = resp.result.codeItemList;
|
||||
const itemTag = [];
|
||||
codeItemList.forEach(function (item, index){
|
||||
itemTag.push(
|
||||
<Row className={"py-2 border-bottom"}>
|
||||
<Col xs={3}><Form.Control type={"text"} size={"sm"} className={"itemCd"} defaultValue={item.itemCd}/></Col>
|
||||
<Col xs={4}><Form.Control type={"text"} size={"sm"} className={"itemNm"} defaultValue={item.itemNm}/></Col>
|
||||
<Col xs={2}><Form.Control type={"text"} size={"sm"} className={"grpOrder"} defaultValue={item.grpOrder}/></Col>
|
||||
<Col xs={1}><Button variant={"danger"} size={"sm"} onClick={(e)=>{modifyCodeItem(e, "delete")}}>삭제</Button></Col>
|
||||
<Col xs={1}><Button variant={"primary"} size={"sm"} onClick={(e)=>{modifyCodeItem(e, "modify")}}>수정</Button></Col>
|
||||
</Row>
|
||||
)
|
||||
})
|
||||
setCodeItemRow(itemTag);
|
||||
},
|
||||
function (resp) {
|
||||
console.log("err response : ", resp);
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
function addCodeItem(){
|
||||
const itemCd = document.querySelector("#itemCd");
|
||||
const itemNm = document.querySelector("#itemNm");
|
||||
const grpOrder = document.querySelector("#grpOrder");
|
||||
if(!itemCd.value || !itemNm.value){
|
||||
alert("코드와 코드명을 입력해주세요.")
|
||||
}else{
|
||||
EgovNet.requestFetch(
|
||||
'/admin/config/code-item',
|
||||
{
|
||||
method: "POST",
|
||||
headers: {
|
||||
'Content-type': 'application/json'
|
||||
},
|
||||
body: JSON.stringify({
|
||||
itemCd: itemCd.value,
|
||||
grpCd: document.querySelector("#codeItemDiv").querySelector("#grpCd").value,
|
||||
itemNm: itemNm.value,
|
||||
grpOrder: grpOrder.value
|
||||
})
|
||||
},
|
||||
(resp) => {
|
||||
switch (resp.resultCode) {
|
||||
case Number(CODE.RCV_SUCCESS):
|
||||
itemCd.value = "";
|
||||
itemNm.value = "";
|
||||
grpOrder.value = "";
|
||||
getCodeItemList(grpCd);
|
||||
break;
|
||||
case Number(CODE.RCV_ERROR_SAVE)||Number(CODE.RCV_ERROR_AUTH):
|
||||
alert(resp.resultMessage);
|
||||
break;
|
||||
}
|
||||
},
|
||||
function (resp) {
|
||||
console.log("err response : ", resp);
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
function modifyCodeItem(e, action){
|
||||
const row = e.target.parentElement.parentElement;
|
||||
const selectedGrpCd = document.querySelector("#codeItemDiv").querySelector("#grpCd").value;
|
||||
const codeItem = {
|
||||
grpCd: selectedGrpCd,
|
||||
itemCd: row.querySelector(".itemCd").value,
|
||||
itemNm: row.querySelector(".itemNm").value,
|
||||
grpOrder: row.querySelector(".grpOrder").value,
|
||||
useYn: action==="modify"?'Y':'N'
|
||||
}
|
||||
EgovNet.requestFetch(
|
||||
'/admin/config/code-item',
|
||||
{
|
||||
method: "PUT",
|
||||
headers: {
|
||||
'Content-type': 'application/json'
|
||||
},
|
||||
body: JSON.stringify(codeItem)
|
||||
},
|
||||
(resp) => {
|
||||
switch (resp.resultCode) {
|
||||
case Number(CODE.RCV_SUCCESS):
|
||||
getCodeItemList(selectedGrpCd);
|
||||
break;
|
||||
case Number(CODE.RCV_ERROR_SAVE)||Number(CODE.RCV_ERROR_AUTH):
|
||||
alert(resp.resultMessage);
|
||||
break;
|
||||
}
|
||||
},
|
||||
function (resp) {
|
||||
console.log("err response : ", resp);
|
||||
}
|
||||
);
|
||||
|
||||
}
|
||||
|
||||
function ChildCodeDiv(){
|
||||
return (
|
||||
<Container className={"pt-3"}>
|
||||
<Container className={"pt-3"} id={"codeItemDiv"}>
|
||||
<input type={"hidden"} id={"grpCd"} value={grpCd}/>
|
||||
<Row className={"py-2 bg-light border-bottom"}>
|
||||
<Col xs={4}>코드</Col>
|
||||
<Col xs={3}>코드</Col>
|
||||
<Col xs={4}>코드명</Col>
|
||||
<Col xs={2}>삭제</Col>
|
||||
<Col xs={2}>수정</Col>
|
||||
<Col xs={2}>순번</Col>
|
||||
<Col xs={3}>삭제 수정</Col>
|
||||
</Row>
|
||||
{}
|
||||
{codeItemRow}
|
||||
{grpCd!=null?(
|
||||
<Row className={"py-1"}>
|
||||
<Col xs={4}>
|
||||
<Form.Control type={"text"} placeholder={"코드"} size={"sm"}/>
|
||||
<Col xs={3}>
|
||||
<Form.Control type={"text"} placeholder={"코드"} size={"sm"} id={"itemCd"}/>
|
||||
</Col>
|
||||
<Col xs={4}>
|
||||
<Form.Control type={"text"} placeholder={"코드명"} size={"sm"}/>
|
||||
<Form.Control type={"text"} placeholder={"코드명"} size={"sm"} id={"itemNm"}/>
|
||||
</Col>
|
||||
<Col xs={{span:2, offset:2}}><Button type={"button"} variant={"primary"} size={"sm"}>등록</Button></Col>
|
||||
<Col xs={2}>
|
||||
<Form.Control type={"text"} placeholder={"순번"} size={"sm"} id={"grpOrder"}/>
|
||||
</Col>
|
||||
<Col xs={2}><Button type={"button"} variant={"primary"} size={"sm"} onClick={addCodeItem}>등록</Button></Col>
|
||||
</Row>
|
||||
):(
|
||||
<Row className={"py-1"}>
|
||||
<Col>코드 그룹을 선택해주세요.</Col>
|
||||
</Row>
|
||||
)}
|
||||
</Container>
|
||||
);
|
||||
}
|
||||
|
||||
export default ChildCodeDiv;
|
||||
export default forwardRef(ChildCodeDiv);
|
||||
|
|
@ -1,27 +1,90 @@
|
|||
import React, { useState, useEffect, useCallback } from 'react';
|
||||
import * as EgovNet from "api/egovFetch";
|
||||
import {Container} from "react-bootstrap";
|
||||
import Row from "react-bootstrap/Row";
|
||||
import Col from "react-bootstrap/Col";
|
||||
import Form from 'react-bootstrap/Form'
|
||||
import Button from "react-bootstrap/Button";
|
||||
import * as EgovNet from "api/egovFetch";
|
||||
import { FaRegHandPointRight } from "react-icons/fa";
|
||||
import CODE from "../../../../constants/code";
|
||||
|
||||
function ParentCodeDiv(props){
|
||||
function ParentCodeDiv({getCodeItem}){
|
||||
|
||||
const [codeGrpRow, setCodeGrpRow] = useState();
|
||||
|
||||
function getCodeGrp(){
|
||||
const getCodeGrp = useCallback(()=>{
|
||||
EgovNet.requestFetch(
|
||||
'/admin/config/code-grp',
|
||||
{
|
||||
method: "GET",
|
||||
method: "GET"
|
||||
},
|
||||
(resp) => {
|
||||
const codeGrpList = resp.result.codeGrpList;
|
||||
const grpTag = [];
|
||||
codeGrpList.forEach(function (item, index){
|
||||
grpTag.push(
|
||||
<Row className={"py-2 border-bottom"}>
|
||||
<Form.Control type={"hidden"} className={"grpCd"} defaultValue={item.grpCd}/>
|
||||
<Col xs={3}>
|
||||
<FaRegHandPointRight className={"selectIcon d-none"}/>
|
||||
<a href={"#"} onClick={(e)=>{codeGrpChoose(e, item.grpCd)}} data-grpcd={item.grpCd}>{item.grpCd}</a>
|
||||
</Col>
|
||||
<Col xs={5}><Form.Control type={"text"} size={"sm"} className={"grpCdNm"} defaultValue={item.grpCdNm}/></Col>
|
||||
<Col xs={2}><Button variant={"danger"} size={"sm"} onClick={(e)=>{modifyCodeGrp(e, "remove")}}>삭제</Button></Col>
|
||||
<Col xs={2}><Button variant={"primary"} size={"sm"} onClick={(e)=>{modifyCodeGrp(e, "modify")}}>수정</Button></Col>
|
||||
</Row>
|
||||
)
|
||||
})
|
||||
setCodeGrpRow(grpTag);
|
||||
},
|
||||
function (resp) {
|
||||
console.log("err response : ", resp);
|
||||
}
|
||||
);
|
||||
});
|
||||
|
||||
useEffect(() => {
|
||||
getCodeGrp();
|
||||
}, []);
|
||||
|
||||
function codeGrpChoose(e, grpCd){
|
||||
document.querySelectorAll(".selectIcon").forEach(function (item){
|
||||
item.classList.value = 'selectIcon d-none'
|
||||
})
|
||||
e.target.parentElement.querySelector(".selectIcon").classList.value = "selectIcon"
|
||||
getCodeItem(grpCd)
|
||||
}
|
||||
|
||||
function addCodeGrp(){
|
||||
const grpCd = document.querySelector("#grpCd");
|
||||
const grpCdNm = document.querySelector("#grpCdNm");
|
||||
if(!grpCd.value){
|
||||
alert("코드 그룹을 입력해주세요.")
|
||||
}else{
|
||||
EgovNet.requestFetch(
|
||||
'/admin/config/code-grp',
|
||||
{
|
||||
method: "POST",
|
||||
headers: {
|
||||
'Content-type': 'application/json'
|
||||
},
|
||||
body: JSON.stringify({})
|
||||
body: JSON.stringify({
|
||||
grpCd: grpCd.value,
|
||||
grpCdNm: grpCdNm.value
|
||||
})
|
||||
},
|
||||
(resp) => {
|
||||
debugger
|
||||
switch (resp.resultCode) {
|
||||
case Number(CODE.RCV_SUCCESS):
|
||||
grpCd.value = "";
|
||||
grpCdNm.value = "";
|
||||
getCodeGrp();
|
||||
getCodeItem();
|
||||
break;
|
||||
case Number(CODE.RCV_ERROR_SAVE)||Number(CODE.RCV_ERROR_AUTH):
|
||||
alert(resp.resultMessage);
|
||||
break;
|
||||
}
|
||||
},
|
||||
function (resp) {
|
||||
console.log("err response : ", resp);
|
||||
|
|
@ -29,27 +92,59 @@ function ParentCodeDiv(props){
|
|||
);
|
||||
}
|
||||
|
||||
useEffect(() => {
|
||||
}
|
||||
|
||||
function modifyCodeGrp(e, action){
|
||||
const row = e.target.parentElement.parentElement;
|
||||
const codeGrp = {
|
||||
grpCd: row.querySelector(".grpCd").value,
|
||||
grpCdNm: row.querySelector(".grpCdNm").value,
|
||||
useYn: action==="modify"?'Y':'N'
|
||||
}
|
||||
EgovNet.requestFetch(
|
||||
'/admin/config/code-grp',
|
||||
{
|
||||
method: "PUT",
|
||||
headers: {
|
||||
'Content-type': 'application/json'
|
||||
},
|
||||
body: JSON.stringify(codeGrp)
|
||||
},
|
||||
(resp) => {
|
||||
switch (resp.resultCode) {
|
||||
case Number(CODE.RCV_SUCCESS):
|
||||
getCodeGrp();
|
||||
}, []);
|
||||
getCodeItem();
|
||||
break;
|
||||
case Number(CODE.RCV_ERROR_SAVE)||Number(CODE.RCV_ERROR_AUTH):
|
||||
alert(resp.resultMessage);
|
||||
break;
|
||||
}
|
||||
},
|
||||
function (resp) {
|
||||
console.log("err response : ", resp);
|
||||
}
|
||||
);
|
||||
|
||||
}
|
||||
|
||||
return (
|
||||
<Container className={"pt-3"}>
|
||||
<Container className={"pt-3"} >
|
||||
<Row className={"py-2 bg-light border-bottom"}>
|
||||
<Col xs={4}>코드그룹</Col>
|
||||
<Col xs={4}>코드그룹명</Col>
|
||||
<Col xs={3}>코드그룹</Col>
|
||||
<Col xs={5}>코드그룹명</Col>
|
||||
<Col xs={2}>삭제</Col>
|
||||
<Col xs={2}>수정</Col>
|
||||
</Row>
|
||||
{codeGrpRow}
|
||||
<Row className={"py-1"}>
|
||||
<Col xs={4}>
|
||||
<Form.Control type={"text"} placeholder={"코드그룹"} size={"sm"}/>
|
||||
<Col xs={3}>
|
||||
<Form.Control type={"text"} id={"grpCd"} placeholder={"코드그룹"} size={"sm"}/>
|
||||
</Col>
|
||||
<Col xs={4}>
|
||||
<Form.Control type={"text"} placeholder={"코드그룹명"} size={"sm"}/>
|
||||
<Col xs={5}>
|
||||
<Form.Control type={"text"} id={"grpCdNm"} placeholder={"코드그룹명"} size={"sm"}/>
|
||||
</Col>
|
||||
<Col xs={{span:2, offset:2}}><Button type={"button"} variant={"primary"} size={"sm"}>등록</Button></Col>
|
||||
<Col xs={{span:2, offset:2}}><Button type={"button"} variant={"primary"} size={"sm"} onClick={addCodeGrp}>등록</Button></Col>
|
||||
</Row>
|
||||
</Container>
|
||||
);
|
||||
|
|
|
|||
|
|
@ -1,13 +1,147 @@
|
|||
import React from 'react';
|
||||
import React, { useState, useEffect, useCallback, useRef } from 'react';
|
||||
import { Link, useLocation } from 'react-router-dom';
|
||||
|
||||
import * as EgovNet from 'api/egovFetch';
|
||||
import URL from 'constants/url';
|
||||
|
||||
function UserConnections(props) {
|
||||
import { default as EgovLeftNav } from 'components/leftmenu/EgovLeftNavAdmin';
|
||||
import EgovPaging from 'components/EgovPaging';
|
||||
|
||||
import { itemIdxByPage } from 'utils/calc';
|
||||
|
||||
function PrivacyConnections(props) {
|
||||
// console.group("EgovAdminPrivacyList");
|
||||
// console.log("[Start] EgovAdminPrivacyList ------------------------------");
|
||||
// console.log("EgovAdminPrivacyList [props] : ", props);
|
||||
|
||||
const location = useLocation();
|
||||
// console.log("EgovAdminPrivacyList [location] : ", location);
|
||||
|
||||
// const cndRef = useRef();
|
||||
// const wrdRef = useRef();
|
||||
|
||||
// eslint-disable-next-line no-unused-vars
|
||||
const [searchCondition, setSearchCondition] = useState(location.state?.searchCondition || { pageIndex: 1, searchCnd: '0', searchWrd: '' });// 기존 조회에서 접근 했을 시 || 신규로 접근 했을 시
|
||||
const [paginationInfo, setPaginationInfo] = useState({});
|
||||
|
||||
const [listTag, setListTag] = useState([]);
|
||||
|
||||
const retrieveList = useCallback((srchCnd) => {
|
||||
// console.groupCollapsed("EgovAdminUsageList.retrieveList()");
|
||||
|
||||
const retrieveListURL = '/admin/logs/privacy';
|
||||
|
||||
const requestOptions = {
|
||||
method: "POST",
|
||||
headers: {
|
||||
'Content-type': 'application/json',
|
||||
},
|
||||
body: JSON.stringify(srchCnd)
|
||||
}
|
||||
|
||||
EgovNet.requestFetch(retrieveListURL,
|
||||
requestOptions,
|
||||
(resp) => {
|
||||
setPaginationInfo(resp.result.paginationInfo);
|
||||
|
||||
let mutListTag = [];
|
||||
listTag.push(<p className="no_data" key="0">데이터가 없습니다.</p>); // 게시판 목록 초기값
|
||||
|
||||
const resultCnt = parseInt(resp.result.resultCnt);
|
||||
const currentPageNo = resp.result.paginationInfo.currentPageNo;
|
||||
const pageSize = resp.result.paginationInfo.pageSize;
|
||||
|
||||
const startIndex = (currentPageNo - 1) * pageSize;
|
||||
const endIndex = Math.min(startIndex + pageSize, resultCnt);
|
||||
|
||||
// 리스트 항목 구성
|
||||
for (let index = startIndex; index < endIndex; index++) {
|
||||
const listIdx = itemIdxByPage(resultCnt, currentPageNo, 0, index); // pageSize 로 넣으면 listIdx값이 2배씩 줄어서 0으로 수정
|
||||
const item = resp.result.resultList[index];
|
||||
|
||||
mutListTag.push(
|
||||
<div key={listIdx} className="list_item">
|
||||
<div>{listIdx}</div>
|
||||
<div>{item.userId}</div>
|
||||
<div>{item.targetUserId}</div>
|
||||
<div>{item.accessType === "PRV_LIST" ? "사용자현황 조회" : item.accessType === "PRV_VIEW" ? "User 상세조회" : "User 수정"}</div>
|
||||
<div>{item.ipAddress}</div>
|
||||
<div>{item.accessDt}</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
setListTag(mutListTag);
|
||||
},
|
||||
function (resp) {
|
||||
console.log("err response : ", resp);
|
||||
}
|
||||
);
|
||||
// console.groupEnd("EgovAdminPrivacyList.retrieveList()");
|
||||
},[listTag]);
|
||||
|
||||
useEffect(() => {
|
||||
retrieveList(searchCondition);
|
||||
// eslint-disable-next-line react-hooks/exhaustive-deps
|
||||
}, []);
|
||||
|
||||
// console.log("------------------------------EgovAdminPrivacyList [End]");
|
||||
// console.groupEnd("EgovAdminPrivacyList");
|
||||
|
||||
return (
|
||||
<div className="container">
|
||||
UserConnections
|
||||
<div className="c_wrap">
|
||||
{/* <!-- Location --> */}
|
||||
<div className="location">
|
||||
<ul>
|
||||
<li><Link to={URL.MAIN} className="home">Home</Link></li>
|
||||
<li><Link to={URL.ADMIN} >사이트관리</Link></li>
|
||||
<li>로그현황</li>
|
||||
</ul>
|
||||
</div>
|
||||
{/* <!--// Location --> */}
|
||||
|
||||
<div className="layout">
|
||||
{/* <!-- Navigation --> */}
|
||||
<EgovLeftNav></EgovLeftNav>
|
||||
{/* <!--// Navigation --> */}
|
||||
|
||||
<div className="contents NOTICE_LIST" id="contents">
|
||||
{/* <!-- 본문 --> */}
|
||||
|
||||
<div className="top_tit">
|
||||
<h1 className="tit_1">개인정보 로그현황</h1>
|
||||
</div>
|
||||
|
||||
{/* <!-- 게시판목록 --> */}
|
||||
<div className="board_list BRD009">
|
||||
<div className="head">
|
||||
<span>번호</span>
|
||||
<span>관리자 ID</span>
|
||||
<span>수정 ID</span>
|
||||
<span>타입</span>
|
||||
<span>접속IP</span>
|
||||
<span>변경일자</span>
|
||||
</div>
|
||||
<div className="result">
|
||||
{listTag}
|
||||
</div>
|
||||
</div>
|
||||
{/* <!--// 게시판목록 --> */}
|
||||
|
||||
<div className="board_bot">
|
||||
{/* <!-- Paging --> */}
|
||||
<EgovPaging pagination={paginationInfo} moveToPage={passedPage => {
|
||||
retrieveList({ ...searchCondition, pageIndex: passedPage }) //, searchCnd: cndRef.current.value, searchWrd: wrdRef.current.value
|
||||
}} />
|
||||
{/* <!--/ Paging --> */}
|
||||
</div>
|
||||
|
||||
{/* <!--// 본문 --> */}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
export default UserConnections;
|
||||
export default PrivacyConnections;
|
||||
|
|
@ -1,11 +1,12 @@
|
|||
import React, { useState, useEffect, useCallback } from 'react';
|
||||
import { Link, useLocation } from 'react-router-dom';
|
||||
import React, {useState, useEffect, useCallback, PureComponent} from 'react';
|
||||
import {Link, useLocation} from 'react-router-dom';
|
||||
import {BarChart, Bar, XAxis, YAxis, CartesianGrid, Tooltip, Legend, ResponsiveContainer} from 'recharts';
|
||||
|
||||
import * as EgovNet from 'api/egovFetch';
|
||||
import URL from 'constants/url';
|
||||
import CODE from 'constants/code';
|
||||
|
||||
import { default as EgovLeftNav } from 'components/leftmenu/EgovLeftNavAdmin';
|
||||
import {default as EgovLeftNav} from 'components/leftmenu/EgovLeftNavAdmin';
|
||||
|
||||
function EgovAdminScheduleList(props) {
|
||||
console.group("EgovAdminScheduleList");
|
||||
|
|
@ -18,10 +19,11 @@ function EgovAdminScheduleList(props) {
|
|||
const DATE = new Date();
|
||||
const TODAY = new Date(DATE.getFullYear(), DATE.getMonth(), DATE.getDate());
|
||||
|
||||
const [searchCondition, setSearchCondition] = useState(location.state?.searchCondition || { schdulSe: '', year: TODAY.getFullYear(), month: TODAY.getMonth(), date: TODAY.getDate() });
|
||||
const [searchCondition, setSearchCondition] = useState(location.state?.searchCondition || {schdulSe: '', year: TODAY.getFullYear(), month: TODAY.getMonth(), date: TODAY.getDate()});
|
||||
const [calendarTag, setCalendarTag] = useState([]);
|
||||
|
||||
const [scheduleList, setScheduleList] = useState([]);
|
||||
const [dailyUserLogList, setDailyUserLogList] = useState([]);
|
||||
|
||||
const innerConsole = (...args) => {
|
||||
console.log(...args);
|
||||
|
|
@ -45,13 +47,13 @@ function EgovAdminScheduleList(props) {
|
|||
if (target === CODE.DATE_MONTH) {
|
||||
changedDate = new Date(searchCondition.year, searchCondition.month + amount, searchCondition.date);
|
||||
}
|
||||
setSearchCondition({ ...searchCondition, year: changedDate.getFullYear(), month: changedDate.getMonth(), date: changedDate.getDate() });
|
||||
setSearchCondition({...searchCondition, year: changedDate.getFullYear(), month: changedDate.getMonth(), date: changedDate.getDate()});
|
||||
}
|
||||
|
||||
const retrieveList = useCallback((srchcnd) => {
|
||||
console.groupCollapsed("EgovAdminScheduleList.retrieveList()");
|
||||
|
||||
const retrieveListURL = '/schedule/month'+EgovNet.getQueryString(srchcnd);
|
||||
const retrieveListURL = '/schedule/month' + EgovNet.getQueryString(srchcnd);
|
||||
|
||||
const requestOptions = {
|
||||
method: "GET",
|
||||
|
|
@ -70,7 +72,7 @@ function EgovAdminScheduleList(props) {
|
|||
}
|
||||
);
|
||||
console.groupEnd("EgovAdminScheduleList.retrieveList()");
|
||||
},[]);
|
||||
}, []);
|
||||
|
||||
const drawCalendar = () => {
|
||||
console.groupCollapsed("EgovAdminScheduleList.drawCalendar()");
|
||||
|
|
@ -151,7 +153,8 @@ function EgovAdminScheduleList(props) {
|
|||
if (scheduleList.length > 0) {//일정 있는 경우
|
||||
return (
|
||||
<td key={keyIdx++}>
|
||||
<Link to={{pathname: URL.ADMIN_SCHEDULE_CREATE}} state={{iUseDate : mutsUseYearMonth + sDate + "000000"}} className="day" key={keyIdx++}>{day}</Link><br />
|
||||
<Link to={{pathname: URL.ADMIN_SCHEDULE_CREATE}} state={{iUseDate: mutsUseYearMonth + sDate + "000000"}} className="day"
|
||||
key={keyIdx++}>{day}</Link><br/>
|
||||
{
|
||||
scheduleList.map((schedule, scheduleIdx) => {
|
||||
let iBeginDate = Number(schedule.schdulBgnde.substring(0, 8));
|
||||
|
|
@ -162,10 +165,10 @@ function EgovAdminScheduleList(props) {
|
|||
return (
|
||||
<>
|
||||
<Link to={{pathname: URL.ADMIN_SCHEDULE_DETAIL}}
|
||||
state={{schdulId : schedule.schdulId}}
|
||||
state={{schdulId: schedule.schdulId}}
|
||||
key={keyIdx++}>{schedule.schdulNm}
|
||||
</Link>
|
||||
<br />
|
||||
<br/>
|
||||
</>
|
||||
);
|
||||
} else return <></>
|
||||
|
|
@ -176,7 +179,8 @@ function EgovAdminScheduleList(props) {
|
|||
} else {//일정 없는 경우
|
||||
return (
|
||||
<td key={keyIdx++}>
|
||||
<Link to={{pathname: URL.ADMIN_SCHEDULE_CREATE}} state={{iUseDate : mutsUseYearMonth + sDate + "000000"}} className="day" key={keyIdx++}>{day}</Link><br />
|
||||
<Link to={{pathname: URL.ADMIN_SCHEDULE_CREATE}} state={{iUseDate: mutsUseYearMonth + sDate + "000000"}} className="day"
|
||||
key={keyIdx++}>{day}</Link><br/>
|
||||
</td>);
|
||||
}
|
||||
} else if (day === 0) {// 이전달/다음달 구현
|
||||
|
|
@ -212,13 +216,115 @@ function EgovAdminScheduleList(props) {
|
|||
// eslint-disable-next-line react-hooks/exhaustive-deps
|
||||
}, [scheduleList]);
|
||||
|
||||
const getDailyUserLogList = useCallback(() => {
|
||||
console.groupCollapsed("EgovAdminScheduleList.getDailyUserLogList()");
|
||||
|
||||
const dailyUserLogListURL = '/admin/dashboard/daily-user-log-list';
|
||||
|
||||
const requestOptions = {
|
||||
method: "GET",
|
||||
headers: {
|
||||
'Content-type': 'application/json',
|
||||
}
|
||||
}
|
||||
|
||||
EgovNet.requestFetch(dailyUserLogListURL,
|
||||
requestOptions,
|
||||
(resp) => {
|
||||
setDailyUserLogList(resp.result.dailyUserLogList);
|
||||
console.log("@@@ : " + dailyUserLogList);
|
||||
},
|
||||
function (resp) {
|
||||
console.log("err response : ", resp);
|
||||
}
|
||||
);
|
||||
console.groupEnd("EgovAdminScheduleList.getDailyUserLogList()");
|
||||
}, []);
|
||||
|
||||
useEffect(() => {
|
||||
getDailyUserLogList();
|
||||
// eslint-disable-next-line react-hooks/exhaustive-deps
|
||||
}, []);
|
||||
|
||||
const data = dailyUserLogList.map(item => ({
|
||||
logDt: item.logDt,
|
||||
uv: item.mobileCnt,
|
||||
"사용자 접속현황": item.logCnt,
|
||||
amt: item.pcCnt,
|
||||
}));
|
||||
|
||||
const getIntroOfPage = (label) => {
|
||||
if (label === 'Page A') {
|
||||
return "Page A is about men's clothing";
|
||||
}
|
||||
if (label === 'Page B') {
|
||||
return "Page B is about women's dress";
|
||||
}
|
||||
if (label === 'Page C') {
|
||||
return "Page C is about women's bag";
|
||||
}
|
||||
if (label === 'Page D') {
|
||||
return 'Page D is about household goods';
|
||||
}
|
||||
if (label === 'Page E') {
|
||||
return 'Page E is about food';
|
||||
}
|
||||
if (label === 'Page F') {
|
||||
return 'Page F is about baby food';
|
||||
}
|
||||
return '';
|
||||
};
|
||||
|
||||
const CustomTooltip = ({active, payload, label}) => {
|
||||
if (active && payload && payload.length) {
|
||||
return (
|
||||
<div className="custom-tooltip">
|
||||
<p className="desc">사용자 접속 현황</p>
|
||||
<p className="label">{`${label} : ${payload[0].value}`}</p>
|
||||
<p className="intro">{getIntroOfPage(label)}</p>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
return null;
|
||||
};
|
||||
|
||||
class Example extends PureComponent {
|
||||
static demoUrl = 'https://codesandbox.io/s/tooltip-with-customized-content-lyxvs';
|
||||
|
||||
render() {
|
||||
return (
|
||||
<ResponsiveContainer width="100%" height="100%">
|
||||
<BarChart
|
||||
width={500}
|
||||
height={300}
|
||||
data={data}
|
||||
margin={{
|
||||
top: 5,
|
||||
right: 30,
|
||||
left: 20,
|
||||
bottom: 5,
|
||||
}}
|
||||
>
|
||||
<CartesianGrid strokeDasharray="3 3"/>
|
||||
<XAxis dataKey="logDt"/>
|
||||
<YAxis/>
|
||||
<Tooltip content={<CustomTooltip/>}/>
|
||||
<Legend/>
|
||||
<Bar dataKey="사용자 접속현황" barSize={20} fill="#87CEFA"/>
|
||||
</BarChart>
|
||||
</ResponsiveContainer>
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
console.log("------------------------------EgovAdminScheduleList [End]");
|
||||
console.groupEnd("EgovAdminScheduleList");
|
||||
return (
|
||||
<div className="container">
|
||||
<div className="c_wrap">
|
||||
{/* <!-- Location --> */}
|
||||
<Location />
|
||||
<Location/>
|
||||
{/* <!--// Location --> */}
|
||||
|
||||
<div className="layout">
|
||||
|
|
@ -235,6 +341,10 @@ function EgovAdminScheduleList(props) {
|
|||
|
||||
<h2 className="tit_2">일정관리</h2>
|
||||
|
||||
<div style={{width: 1000, height: 300}}>
|
||||
<Example/>
|
||||
</div>
|
||||
|
||||
{/* <!-- 검색조건 --> */}
|
||||
<div className="condition">
|
||||
<ul>
|
||||
|
|
@ -242,7 +352,7 @@ function EgovAdminScheduleList(props) {
|
|||
<label className="f_select" htmlFor="sel1">
|
||||
<select name="schdulSe" id="sel1" title="조건"
|
||||
onChange={e => {
|
||||
setSearchCondition({ ...searchCondition, schdulSe: e.target.value });
|
||||
setSearchCondition({...searchCondition, schdulSe: e.target.value});
|
||||
}}
|
||||
>
|
||||
<option value="">전체</option>
|
||||
|
|
|
|||
|
|
@ -1,11 +1,186 @@
|
|||
import React from 'react';
|
||||
import React, {useCallback, useEffect, useRef, useState} from 'react';
|
||||
import {Link, useLocation} from "react-router-dom";
|
||||
import URL from "constants/url";
|
||||
|
||||
import { default as EgovLeftNav } from 'components/leftmenu/EgovLeftNavAdmin';
|
||||
import EgovPaging from "components/EgovPaging";
|
||||
import * as EgovNet from "api/egovFetch";
|
||||
import {itemIdxByPage} from "utils/calc";
|
||||
import Button from "react-bootstrap/Button";
|
||||
|
||||
|
||||
function List(props) {
|
||||
|
||||
const location = useLocation();
|
||||
|
||||
const [searchCondition, setSearchCondition] = useState(location.state?.searchCondition || { pageIndex: 1, searchCnd: '0', searchWrd: '' });// 기존 조회에서 접근 했을 시 || 신규로 접근 했을 시
|
||||
const [listTag, setListTag] = useState([]);
|
||||
const [paginationInfo, setPaginationInfo] = useState({});
|
||||
|
||||
const cndRef = useRef();
|
||||
const wrdRef = useRef();
|
||||
|
||||
const retrieveList = useCallback((searchCondition) => {
|
||||
const params = "?";
|
||||
EgovNet.requestFetch(
|
||||
'/admin/users/list'+params,
|
||||
{
|
||||
method: "GET"
|
||||
},
|
||||
(resp) => {
|
||||
setPaginationInfo(resp.result.paginationInfo);
|
||||
|
||||
let mutListTag = [];
|
||||
|
||||
const resultCnt = parseInt(resp.result.contentCnt);
|
||||
const currentPageNo = resp.result.paginationInfo.pageIndex;
|
||||
const pageSize = resp.result.paginationInfo.rowCnt;
|
||||
|
||||
setListTag([]);
|
||||
// 리스트 항목 구성
|
||||
resp.result.userList.forEach(function (item, index) {
|
||||
|
||||
const listIdx = itemIdxByPage(resultCnt , currentPageNo, pageSize, index);
|
||||
|
||||
mutListTag.push(
|
||||
<div>
|
||||
<span>{item.userSe}</span>
|
||||
<span>{item.userId}</span>
|
||||
<span>{item.userNm}</span>
|
||||
<span>{item.email}</span>
|
||||
<span>{item.phoneNum}</span>
|
||||
<span>{item.useYn}</span>
|
||||
<span><Button variant={"danger"} size={"sm"}>삭제</Button></span>
|
||||
</div>
|
||||
);
|
||||
/*<Link to={{pathname: URL.ADMIN_NOTICE_DETAIL}}
|
||||
state={{
|
||||
nttId: item.nttId,
|
||||
searchCondition: searchCondition
|
||||
}}
|
||||
key={listIdx} className="list_item" >
|
||||
<div>{listIdx}</div>
|
||||
{(item.replyLc * 1 ? true : false) &&
|
||||
<><div className="al reply">
|
||||
{item.nttSj}
|
||||
</div></>}
|
||||
{(item.replyLc * 1 ? false : true) &&
|
||||
<><div className="al">
|
||||
{item.nttSj}
|
||||
</div></>}
|
||||
<div>{item.frstRegisterNm}</div>
|
||||
<div>{item.frstRegisterPnttm}</div>
|
||||
<div>{item.inqireCo}</div>
|
||||
</Link>*/
|
||||
});
|
||||
if(!mutListTag.length) mutListTag.push(<p className="no_data" key="0">검색된 결과가 없습니다.</p>); // 게시판 목록 초기값
|
||||
setListTag(mutListTag);
|
||||
},
|
||||
function (resp) {
|
||||
console.log("err response : ", resp);
|
||||
}
|
||||
);
|
||||
},[]);
|
||||
|
||||
useEffect(() => {
|
||||
retrieveList(searchCondition);
|
||||
}, []);
|
||||
|
||||
return (
|
||||
<div className="container">
|
||||
List
|
||||
<div className="c_wrap">
|
||||
<div className="location">
|
||||
<ul>
|
||||
<li><Link to={URL.MAIN} className="home">Home</Link></li>
|
||||
<li>사이트관리</li>
|
||||
<li>사용자 관리</li>
|
||||
<li><Link to={URL.ADMIN__USERS__LIST}>사용자 목록</Link></li>
|
||||
</ul>
|
||||
</div>
|
||||
<div className="layout">
|
||||
{/* <!-- Navigation --> */}
|
||||
<EgovLeftNav activeKey={"1"}></EgovLeftNav>
|
||||
<div className="contents NOTICE_LIST" id="contents">
|
||||
{/* <!-- 본문 --> */}
|
||||
|
||||
<div className="top_tit">
|
||||
<h1 className="tit_1">사용자 목록</h1>
|
||||
</div>
|
||||
<h2 className="tit_2"></h2>
|
||||
{/* <!-- 검색조건 --> */}
|
||||
<div className="condition">
|
||||
<ul>
|
||||
<li className="third_1 L">
|
||||
<label className="f_select" htmlFor="sel1">
|
||||
<select id="sel1" title="조건" defaultValue={searchCondition.searchCnd} ref={cndRef}
|
||||
onChange={e => {cndRef.current.value = e.target.value;}}>
|
||||
<option value="0">전체</option>
|
||||
<option value="1">일반사용자</option>
|
||||
<option value="2">관리자</option>
|
||||
</select>
|
||||
</label>
|
||||
</li>
|
||||
<li className="third_1 L">
|
||||
<label className="f_select" htmlFor="sel1">
|
||||
<select id="sel1" title="조건" defaultValue={searchCondition.searchCnd} ref={cndRef}
|
||||
onChange={e => {cndRef.current.value = e.target.value;}}>
|
||||
<option value="id">아이디</option>
|
||||
<option value="name">이름</option>
|
||||
<option value="email">이메일</option>
|
||||
<option value="phoneNum">전화번호</option>
|
||||
</select>
|
||||
</label>
|
||||
</li>
|
||||
<li className="third_2 R">
|
||||
<span className="f_search w_500">
|
||||
<input type="text" name="" defaultValue={searchCondition.searchWrd} placeholder="" ref={wrdRef}
|
||||
onChange={e => {
|
||||
wrdRef.current.value = e.target.value;
|
||||
}}
|
||||
/>
|
||||
<button type="button"
|
||||
onClick={() => {
|
||||
retrieveList({ ...searchCondition, pageIndex: 1, searchCnd: cndRef.current.value, searchWrd: wrdRef.current.value });
|
||||
}}>조회</button>
|
||||
</span>
|
||||
</li>
|
||||
{/*{masterBoard.bbsUseFlag === 'Y' &&
|
||||
<li>
|
||||
<Link to={URL.ADMIN_NOTICE_CREATE} state={{bbsId: bbsId}} className="btn btn_blue_h46 pd35">등록</Link>
|
||||
</li>
|
||||
}*/}
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div className="board_list BRD002">
|
||||
<div className="head">
|
||||
<span>구분</span>
|
||||
<span>아이디</span>
|
||||
<span>이름</span>
|
||||
<span>이메일</span>
|
||||
<span>전화번호</span>
|
||||
<span>상태</span>
|
||||
<span>삭제</span>
|
||||
</div>
|
||||
<div className="result">
|
||||
{listTag}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div className="board_bot">
|
||||
<EgovPaging pagination={paginationInfo}
|
||||
moveToPage={passedPage => {
|
||||
retrieveList({
|
||||
...searchCondition,
|
||||
pageIndex: passedPage,
|
||||
searchCnd: cndRef.current.value,
|
||||
searchWrd: wrdRef.current.value
|
||||
})
|
||||
}} />
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -22,7 +22,7 @@ function EgovLoginContent(props) {
|
|||
const location = useLocation();
|
||||
console.log("EgovLoginContent [location] : ", location);
|
||||
|
||||
const [userInfo, setUserInfo] = useState({ username: '', password: 'default', email: '', userSe: 'USR'});
|
||||
const [userInfo, setUserInfo] = useState({ username: '', password: 'default', email: '', userSe: 'ACC_TP02'});
|
||||
// eslint-disable-next-line no-unused-vars
|
||||
|
||||
const [saveIDFlag, setSaveIDFlag] = useState(false);
|
||||
|
|
@ -64,7 +64,7 @@ function EgovLoginContent(props) {
|
|||
useEffect(() => {
|
||||
let data = getLocalItem(KEY_ID);
|
||||
if (data !== null) {
|
||||
setUserInfo({ username: data, password: 'default', email: '', userSe: 'USR' });
|
||||
setUserInfo({ username: data, password: 'default', email: '', userSe: 'ACC_TP02' });
|
||||
}
|
||||
}, []);
|
||||
|
||||
|
|
|
|||
|
|
@ -257,7 +257,7 @@ function CodeViewer(props) {
|
|||
item.full_content = item.full_content.replace('<table ', '<table class="table table-bordered "')
|
||||
}
|
||||
if(item.error_cd !== null){
|
||||
if(sessionUserSe === "ADM"){
|
||||
if(sessionUserSe === "ACC_TP01"){
|
||||
item.full_content = "<p class='errorText' id='error"+item.doc_cont_seq+"'>"+item.error_cd+"</p><br>"+
|
||||
"<div class='input-group w-25 d-none errorEditDiv'>" +
|
||||
"<input type='hidden' class='docContSeq' value='"+item.doc_cont_seq+"' />"+
|
||||
|
|
@ -315,7 +315,7 @@ function CodeViewer(props) {
|
|||
docLinkActionAppend(el)
|
||||
bookmarkBtnActionAppend(el)
|
||||
checkboxActionAppend(el)
|
||||
if(sessionUserSe === "ADM"){
|
||||
if(sessionUserSe === "ACC_TP01"){
|
||||
errorTextActionAppend(el)
|
||||
errorEditSaveBtnActionAppend(el)
|
||||
errorEditCancelBtnActionAppend(el)
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load Diff
|
|
@ -59,10 +59,16 @@ dependencies {
|
|||
/*전자정부*/
|
||||
implementation(group: 'org.egovframe.rte', name: 'org.egovframe.rte.ptl.mvc', version:'4.1.0') {
|
||||
exclude(module: 'commons-logging')
|
||||
exclude(module: 'spring-modules-validation')
|
||||
}
|
||||
implementation group: 'org.egovframe.rte', name: 'org.egovframe.rte.fdl.cmmn', version:'4.1.0'
|
||||
implementation group: 'org.egovframe.rte', name: 'org.egovframe.rte.fdl.property', version:'4.1.0'
|
||||
implementation group: 'org.egovframe.rte', name: 'org.egovframe.rte.fdl.crypto', version:'4.1.0'
|
||||
implementation group: 'org.egovframe.rte', name: 'org.egovframe.rte.fdl.idgnr', version:'4.1.0'
|
||||
|
||||
implementation group: 'org.egovframe.rte', name: 'org.egovframe.rte.psl.dataaccess', version:'4.1.0'
|
||||
implementation group: 'org.springmodules', name: 'spring-modules-validation', version:'0.9'
|
||||
|
||||
|
||||
// https://mvnrepository.com/artifact/io.springfox/springfox-swagger2
|
||||
implementation group: 'io.springfox', name: 'springfox-swagger2', version: '3.0.0'
|
||||
|
|
@ -81,5 +87,7 @@ dependencies {
|
|||
// https://mvnrepository.com/artifact/io.jsonwebtoken/jjwt-jackson
|
||||
runtimeOnly group: 'io.jsonwebtoken', name: 'jjwt-jackson', version: '0.11.5'
|
||||
|
||||
implementation 'org.apache.commons:commons-lang3'
|
||||
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -0,0 +1,85 @@
|
|||
package com.dbnt.kcscbackend.admin.committee.schedules.config;
|
||||
|
||||
import org.apache.ibatis.session.SqlSessionFactory;
|
||||
import org.mybatis.spring.SqlSessionFactoryBean;
|
||||
import org.mybatis.spring.SqlSessionTemplate;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.beans.factory.annotation.Qualifier;
|
||||
import org.springframework.context.annotation.*;
|
||||
import org.springframework.core.env.Environment;
|
||||
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
|
||||
import org.springframework.jdbc.support.lob.DefaultLobHandler;
|
||||
|
||||
import javax.annotation.PostConstruct;
|
||||
import javax.sql.DataSource;
|
||||
import java.io.IOException;
|
||||
|
||||
/**
|
||||
* @ClassName : EgovConfigAppMapper.java
|
||||
* @Description : Mapper 설정
|
||||
*
|
||||
* @author : 윤주호
|
||||
* @since : 2021. 7. 20
|
||||
* @version : 1.0
|
||||
*
|
||||
* <pre>
|
||||
* << 개정이력(Modification Information) >>
|
||||
*
|
||||
* 수정일 수정자 수정내용
|
||||
* ------------- ------------ ---------------------
|
||||
* 2021. 7. 20 윤주호 최초 생성
|
||||
* </pre>
|
||||
*
|
||||
*/
|
||||
@Configuration
|
||||
@PropertySources({
|
||||
@PropertySource("classpath:/application.properties")
|
||||
})
|
||||
public class EgovConfigAppMapper {
|
||||
@Autowired
|
||||
DataSource dataSource;
|
||||
|
||||
@Autowired
|
||||
Environment env;
|
||||
|
||||
private String dbType;
|
||||
|
||||
@PostConstruct
|
||||
void init() {
|
||||
dbType = env.getProperty("Globals.DbType");
|
||||
}
|
||||
|
||||
@Bean
|
||||
@Lazy
|
||||
public DefaultLobHandler lobHandler() {
|
||||
return new DefaultLobHandler();
|
||||
}
|
||||
|
||||
@Bean(name = {"sqlSession", "egov.sqlSession"})
|
||||
public SqlSessionFactoryBean sqlSession() {
|
||||
SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
|
||||
sqlSessionFactoryBean.setDataSource(dataSource);
|
||||
|
||||
PathMatchingResourcePatternResolver pathMatchingResourcePatternResolver = new PathMatchingResourcePatternResolver();
|
||||
|
||||
sqlSessionFactoryBean.setConfigLocation(
|
||||
pathMatchingResourcePatternResolver
|
||||
.getResource("classpath:/admin/committee/schedules/mapper/config/mapper-config.xml"));
|
||||
|
||||
try {
|
||||
sqlSessionFactoryBean.setMapperLocations(
|
||||
pathMatchingResourcePatternResolver
|
||||
.getResources("classpath:/egovframework/mapper/let/**/*_" + dbType + ".xml"));
|
||||
} catch (IOException e) {
|
||||
// TODO Exception 처리 필요
|
||||
}
|
||||
|
||||
return sqlSessionFactoryBean;
|
||||
}
|
||||
|
||||
@Bean
|
||||
public SqlSessionTemplate egovSqlSessionTemplate(@Qualifier("sqlSession") SqlSessionFactory sqlSession) {
|
||||
SqlSessionTemplate sqlSessionTemplate = new SqlSessionTemplate(sqlSession);
|
||||
return sqlSessionTemplate;
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,192 @@
|
|||
package com.dbnt.kcscbackend.admin.committee.schedules.controller;
|
||||
|
||||
import com.dbnt.kcscbackend.admin.committee.schedules.repository.FileVO;
|
||||
import com.dbnt.kcscbackend.admin.committee.schedules.service.EgovFileMngService;
|
||||
import com.dbnt.kcscbackend.config.egov.EgovProperties;
|
||||
import com.dbnt.kcscbackend.config.egov.EgovWebUtil;
|
||||
import io.swagger.v3.oas.annotations.Operation;
|
||||
import io.swagger.v3.oas.annotations.responses.ApiResponse;
|
||||
import io.swagger.v3.oas.annotations.responses.ApiResponses;
|
||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.egovframe.rte.fdl.cmmn.exception.EgovBizException;
|
||||
import org.egovframe.rte.fdl.cryptography.EgovCryptoService;
|
||||
import org.springframework.stereotype.Controller;
|
||||
import org.springframework.util.FileCopyUtils;
|
||||
import org.springframework.web.bind.annotation.GetMapping;
|
||||
import org.springframework.web.bind.annotation.RequestParam;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
import javax.servlet.http.HttpServletResponse;
|
||||
import java.io.*;
|
||||
import java.net.URLEncoder;
|
||||
import java.util.Base64;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* 파일 다운로드를 위한 컨트롤러 클래스
|
||||
* @author 공통서비스개발팀 이삼섭
|
||||
* @since 2009.06.01
|
||||
* @version 1.0
|
||||
* @see
|
||||
*
|
||||
* <pre>
|
||||
* << 개정이력(Modification Information) >>
|
||||
*
|
||||
* 수정일 수정자 수정내용
|
||||
* ------- -------- ---------------------------
|
||||
* 2009.3.25 이삼섭 최초 생성
|
||||
*
|
||||
* Copyright (C) 2009 by MOPAS All right reserved.
|
||||
* </pre>
|
||||
*/
|
||||
@Slf4j
|
||||
@Controller
|
||||
@Tag(name="EgovFileDownloadController",description = "파일 다운로드")
|
||||
public class EgovFileDownloadController {
|
||||
|
||||
@Resource(name = "EgovFileMngService")
|
||||
private EgovFileMngService fileService;
|
||||
|
||||
/** 암호화서비스 */
|
||||
@Resource(name="egovARIACryptoService")
|
||||
EgovCryptoService cryptoService;
|
||||
|
||||
public static final String ALGORITM_KEY = EgovProperties.getProperty("Globals.crypto.algoritm");
|
||||
|
||||
/**
|
||||
* 브라우저 구분 얻기.
|
||||
*
|
||||
* @param request
|
||||
* @return
|
||||
*/
|
||||
private String getBrowser(HttpServletRequest request) {
|
||||
String header = request.getHeader("User-Agent");
|
||||
if (header.indexOf("MSIE") > -1) {
|
||||
return "MSIE";
|
||||
} else if (header.indexOf("Trident") > -1) { // IE11 문자열 깨짐 방지
|
||||
return "Trident";
|
||||
} else if (header.indexOf("Chrome") > -1) {
|
||||
return "Chrome";
|
||||
} else if (header.indexOf("Opera") > -1) {
|
||||
return "Opera";
|
||||
}
|
||||
return "Firefox";
|
||||
}
|
||||
|
||||
/**
|
||||
* Disposition 지정하기.
|
||||
*
|
||||
* @param filename
|
||||
* @param request
|
||||
* @param response
|
||||
* @throws Exception
|
||||
*/
|
||||
private void setDisposition(String filename, HttpServletRequest request, HttpServletResponse response)
|
||||
throws Exception {
|
||||
String browser = getBrowser(request);
|
||||
|
||||
String dispositionPrefix = "attachment; filename=";
|
||||
String encodedFilename = null;
|
||||
|
||||
if (browser.equals("MSIE")) {
|
||||
encodedFilename = URLEncoder.encode(filename, "UTF-8").replaceAll("\\+", "%20");
|
||||
} else if (browser.equals("Trident")) { // IE11 문자열 깨짐 방지
|
||||
encodedFilename = URLEncoder.encode(filename, "UTF-8").replaceAll("\\+", "%20");
|
||||
} else if (browser.equals("Firefox")) {
|
||||
encodedFilename = "\"" + new String(filename.getBytes("UTF-8"), "8859_1") + "\"";
|
||||
} else if (browser.equals("Opera")) {
|
||||
encodedFilename = "\"" + new String(filename.getBytes("UTF-8"), "8859_1") + "\"";
|
||||
} else if (browser.equals("Chrome")) {
|
||||
StringBuffer sb = new StringBuffer();
|
||||
for (int i = 0; i < filename.length(); i++) {
|
||||
char c = filename.charAt(i);
|
||||
if (c > '~') {
|
||||
sb.append(URLEncoder.encode("" + c, "UTF-8"));
|
||||
} else {
|
||||
sb.append(c);
|
||||
}
|
||||
}
|
||||
encodedFilename = sb.toString();
|
||||
} else {
|
||||
//throw new RuntimeException("Not supported browser");
|
||||
throw new IOException("Not supported browser");
|
||||
}
|
||||
|
||||
response.setHeader("Content-Disposition", dispositionPrefix + encodedFilename);
|
||||
|
||||
if ("Opera".equals(browser)) {
|
||||
response.setContentType("application/octet-stream;charset=UTF-8");
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 첨부파일로 등록된 파일에 대하여 다운로드를 제공한다.
|
||||
*
|
||||
* @param commandMap
|
||||
* @param response
|
||||
* @throws Exception
|
||||
*/
|
||||
|
||||
@Operation(
|
||||
summary = "파일 다운로드",
|
||||
description = "첨부파일로 등록된 파일에 대하여 다운로드를 제공",
|
||||
tags = {"EgovFileDownloadController"}
|
||||
)
|
||||
@ApiResponses(value = {
|
||||
@ApiResponse(responseCode = "200", description = "성공")
|
||||
})
|
||||
@GetMapping(value = "/cmm/fms/FileDown.do")
|
||||
public void cvplFileDownload(@RequestParam Map<String, Object> commandMap, HttpServletRequest request, HttpServletResponse response) throws Exception {
|
||||
|
||||
// 암호화된 atchFileId 를 복호화 (2022.12.06 추가) - 파일아이디가 유추 불가능하도록 조치
|
||||
String param_atchFileId = (String) commandMap.get("atchFileId");
|
||||
param_atchFileId = param_atchFileId.replaceAll(" ", "+");
|
||||
byte[] decodedBytes = Base64.getDecoder().decode(param_atchFileId);
|
||||
String decodedFileId = new String(cryptoService.decrypt(decodedBytes,ALGORITM_KEY));
|
||||
String fileSn = (String) commandMap.get("fileSn");
|
||||
|
||||
FileVO fileVO = new FileVO();
|
||||
fileVO.setAtchFileId(decodedFileId);
|
||||
fileVO.setFileSn(fileSn);
|
||||
FileVO fvo = fileService.selectFileInf(fileVO);
|
||||
|
||||
String fileStreCours = EgovWebUtil.filePathBlackList(fvo.getFileStreCours());
|
||||
String streFileNm = EgovWebUtil.filePathBlackList(fvo.getStreFileNm());
|
||||
|
||||
File uFile = new File(fileStreCours, streFileNm);
|
||||
long fSize = uFile.length();
|
||||
|
||||
if (fSize > 0) {
|
||||
//String mimetype = "application/x-msdownload";
|
||||
String mimetype = "application/x-stuff";
|
||||
|
||||
//response.setBufferSize(fSize); // OutOfMemeory 발생
|
||||
response.setContentType(mimetype);
|
||||
//response.setHeader("Content-Disposition", "attachment; filename=\"" + URLEncoder.encode(fvo.getOrignlFileNm(), "utf-8") + "\"");
|
||||
setDisposition(fvo.getOrignlFileNm(), request, response);
|
||||
//response.setContentLength(fSize);
|
||||
|
||||
/*
|
||||
* FileCopyUtils.copy(in, response.getOutputStream());
|
||||
* in.close();
|
||||
* response.getOutputStream().flush();
|
||||
* response.getOutputStream().close();
|
||||
*/
|
||||
|
||||
// Try-with-resources를 이용한 자원 해제 처리 (try 구문에 선언한 리소스를 자동 반납)
|
||||
// try에 전달할 수 있는 자원은 java.lang.AutoCloseable 인터페이스의 구현 객체로 한정
|
||||
try (BufferedInputStream in = new BufferedInputStream(new FileInputStream(uFile));
|
||||
BufferedOutputStream out = new BufferedOutputStream(response.getOutputStream());){
|
||||
FileCopyUtils.copy(in, out);
|
||||
out.flush();
|
||||
} catch (FileNotFoundException ex) {
|
||||
log.debug("IGNORED: {}", ex.getMessage());
|
||||
}
|
||||
|
||||
} else {
|
||||
throw new EgovBizException();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,694 @@
|
|||
package com.dbnt.kcscbackend.admin.committee.schedules.controller;
|
||||
|
||||
|
||||
|
||||
import com.dbnt.kcscbackend.admin.committee.schedules.repository.ComDefaultCodeVO;
|
||||
import com.dbnt.kcscbackend.admin.committee.schedules.repository.FileVO;
|
||||
import com.dbnt.kcscbackend.admin.committee.schedules.repository.IndvdlSchdulManageVO;
|
||||
import com.dbnt.kcscbackend.admin.committee.schedules.service.EgovCmmUseService;
|
||||
import com.dbnt.kcscbackend.admin.committee.schedules.service.EgovFileMngService;
|
||||
import com.dbnt.kcscbackend.admin.committee.schedules.service.EgovIndvdlSchdulManageService;
|
||||
import com.dbnt.kcscbackend.auth.entity.LoginVO;
|
||||
import com.dbnt.kcscbackend.auth.entity.UserInfo;
|
||||
import com.dbnt.kcscbackend.auth.repository.UserInfoRepository;
|
||||
import com.dbnt.kcscbackend.config.common.ResponseCode;
|
||||
import com.dbnt.kcscbackend.config.common.ResultVO;
|
||||
import com.dbnt.kcscbackend.config.egov.EgovMessageSource;
|
||||
import io.swagger.models.auth.In;
|
||||
import io.swagger.v3.oas.annotations.Operation;
|
||||
import io.swagger.v3.oas.annotations.responses.ApiResponse;
|
||||
import io.swagger.v3.oas.annotations.responses.ApiResponses;
|
||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||
import org.egovframe.rte.fdl.cryptography.EgovCryptoService;
|
||||
import org.egovframe.rte.fdl.property.EgovPropertyService;
|
||||
import org.egovframe.rte.ptl.mvc.tags.ui.pagination.PaginationInfo;
|
||||
import org.springframework.security.core.annotation.AuthenticationPrincipal;
|
||||
import org.springframework.validation.BindingResult;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
import org.springframework.web.multipart.MultipartFile;
|
||||
import org.springframework.web.multipart.MultipartHttpServletRequest;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
import java.text.SimpleDateFormat;
|
||||
import java.util.*;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
/**
|
||||
* 일정관리를 처리하는 Controller Class 구현
|
||||
* @since 2009.04.10
|
||||
* @see
|
||||
* <pre>
|
||||
* << 개정이력(Modification Information) >>
|
||||
* 수정일 수정자 수정내용
|
||||
* ------- -------- ---------------------------
|
||||
* 2009.04.10 장동한 최초 생성
|
||||
* 2011.05.31 JJY 경량환경 커스터마이징버전 생성
|
||||
* </pre>
|
||||
* @author 조재영
|
||||
* @version 1.0
|
||||
* @created 09-6-2011 오전 10:08:04
|
||||
*/
|
||||
@RestController
|
||||
@Tag(name="SchedulesApiController",description = "일정관리")
|
||||
public class SchedulesApiController {
|
||||
|
||||
|
||||
/** EgovMessageSource */
|
||||
@Resource(name = "egovMessageSource")
|
||||
EgovMessageSource egovMessageSource;
|
||||
|
||||
@Resource(name = "egovIndvdlSchdulManageService")
|
||||
private EgovIndvdlSchdulManageService egovIndvdlSchdulManageService;
|
||||
|
||||
@Resource(name = "EgovCmmUseService")
|
||||
private EgovCmmUseService cmmUseService;
|
||||
|
||||
/** EgovPropertyService */
|
||||
@Resource(name = "propertiesService")
|
||||
protected EgovPropertyService propertiesService;
|
||||
|
||||
// 첨부파일 관련
|
||||
@Resource(name = "EgovFileMngService")
|
||||
private EgovFileMngService fileMngService;
|
||||
|
||||
/** 암호화서비스 */
|
||||
@Resource(name="egovARIACryptoService")
|
||||
EgovCryptoService cryptoService;
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* 일정(월별) 목록을 조회한다.
|
||||
* @param request
|
||||
* @param commandMap
|
||||
* @return resultVO
|
||||
* @throws Exception
|
||||
*/
|
||||
@Operation(
|
||||
summary = "월별 일정 조회",
|
||||
description = "일정(월별) 목록을 조회",
|
||||
tags = {"SchedulesApiController"}
|
||||
)
|
||||
@ApiResponses(value = {
|
||||
@ApiResponse(responseCode = "200", description = "조회 성공"),
|
||||
@ApiResponse(responseCode = "403", description = "인가된 사용자가 아님")
|
||||
})
|
||||
@GetMapping(value = "/schedule/month")
|
||||
public ResultVO EgovIndvdlSchdulManageMonthList(@AuthenticationPrincipal LoginVO loginVO, HttpServletRequest request,
|
||||
@RequestParam Map<String, Object> commandMap) throws Exception {
|
||||
|
||||
ResultVO resultVO = new ResultVO();
|
||||
Map<String, Object> resultMap = new HashMap<String, Object>();
|
||||
|
||||
//일정구분 검색 유지
|
||||
resultMap.put("searchKeyword",
|
||||
commandMap.get("searchKeyword") == null ? "" : (String)commandMap.get("searchKeyword"));
|
||||
resultMap.put("searchCondition",
|
||||
commandMap.get("searchCondition") == null ? "" : (String)commandMap.get("searchCondition"));
|
||||
|
||||
Calendar cal = Calendar.getInstance();
|
||||
|
||||
String sYear = String.valueOf(commandMap.get("year"));
|
||||
String sMonth = String.valueOf(commandMap.get("month"));
|
||||
|
||||
int iYear = cal.get(Calendar.YEAR);
|
||||
int iMonth = cal.get(Calendar.MONTH);
|
||||
//int iDate = cal.get(java.util.Calendar.DATE);
|
||||
|
||||
//검색 설정
|
||||
String sSearchDate = "";
|
||||
if (sYear == null || sMonth == null) {
|
||||
sSearchDate += Integer.toString(iYear);
|
||||
sSearchDate += Integer.toString(iMonth + 1).length() == 1 ? "0" + Integer.toString(iMonth + 1)
|
||||
: Integer.toString(iMonth + 1);
|
||||
} else {
|
||||
iYear = Integer.parseInt(sYear);
|
||||
iMonth = Integer.parseInt(sMonth);
|
||||
sSearchDate += sYear;
|
||||
sSearchDate += Integer.toString(iMonth + 1).length() == 1 ? "0" + Integer.toString(iMonth + 1)
|
||||
: Integer.toString(iMonth + 1);
|
||||
}
|
||||
|
||||
//공통코드 일정종류
|
||||
ComDefaultCodeVO voComCode = new ComDefaultCodeVO();
|
||||
voComCode = new ComDefaultCodeVO();
|
||||
voComCode.setCodeId("COM030");
|
||||
resultMap.put("schdulSe", cmmUseService.selectCmmCodeDetail(voComCode));
|
||||
|
||||
commandMap.put("searchMonth", sSearchDate);
|
||||
commandMap.put("searchMode", "MONTH");
|
||||
resultMap.put("resultList", egovIndvdlSchdulManageService.selectIndvdlSchdulManageRetrieve(commandMap));
|
||||
|
||||
resultMap.put("prevRequest", commandMap);
|
||||
|
||||
resultVO.setResult(resultMap);
|
||||
resultVO.setResultCode(ResponseCode.SUCCESS.getCode());
|
||||
resultVO.setResultMessage(ResponseCode.SUCCESS.getMessage());
|
||||
|
||||
return resultVO;
|
||||
}
|
||||
|
||||
/**
|
||||
* 일정를 등록 처리 한다.
|
||||
* @param request
|
||||
* @param multiRequest
|
||||
* @param indvdlSchdulManageVO
|
||||
* @param bindingResult
|
||||
* @return resultVO
|
||||
* @throws Exception
|
||||
*/
|
||||
@Operation(
|
||||
summary = "일정 등록",
|
||||
description = "일정을 등록 처리",
|
||||
tags = {"SchedulesApiController"}
|
||||
)
|
||||
@ApiResponses(value = {
|
||||
@ApiResponse(responseCode = "200", description = "등록 성공"),
|
||||
@ApiResponse(responseCode = "403", description = "인가된 사용자가 아님"),
|
||||
@ApiResponse(responseCode = "900", description = "입력값 무결성 오류")
|
||||
})
|
||||
@PostMapping(value = "/schedule")
|
||||
public ResultVO IndvdlSchdulManageRegistActor(
|
||||
HttpServletRequest request,
|
||||
final MultipartHttpServletRequest multiRequest,
|
||||
IndvdlSchdulManageVO indvdlSchdulManageVO,
|
||||
BindingResult bindingResult,
|
||||
@AuthenticationPrincipal LoginVO loginVO
|
||||
) throws Exception {
|
||||
|
||||
ResultVO resultVO = new ResultVO();
|
||||
|
||||
//서버 validate 체크
|
||||
////beanValidator.validate(indvdlSchdulManageVO, bindingResult);
|
||||
if (bindingResult.hasErrors()) {
|
||||
|
||||
resultVO.setResultCode(ResponseCode.INPUT_CHECK_ERROR.getCode());
|
||||
resultVO.setResultMessage(ResponseCode.INPUT_CHECK_ERROR.getMessage());
|
||||
return resultVO;
|
||||
}
|
||||
|
||||
// 첨부파일 관련 첨부파일ID 생성
|
||||
List<FileVO> _result = null;
|
||||
String _atchFileId = "";
|
||||
|
||||
final Map<String, MultipartFile> files = multiRequest.getFileMap();
|
||||
|
||||
if (!files.isEmpty()) {
|
||||
//_result = fileUtil.parseFileInf(files, "DSCH_", 0, "", "");
|
||||
_atchFileId = fileMngService.insertFileInfs(_result); //파일이 생성되고나면 생성된 첨부파일 ID를 리턴한다.
|
||||
}
|
||||
|
||||
// 리턴받은 첨부파일ID를 셋팅한다..
|
||||
indvdlSchdulManageVO.setAtchFileId(_atchFileId); // 첨부파일 ID
|
||||
|
||||
//아이디 설정
|
||||
indvdlSchdulManageVO.setFrstRegisterId(loginVO.getUniqId());
|
||||
indvdlSchdulManageVO.setLastUpdusrId(loginVO.getUniqId());
|
||||
|
||||
indvdlSchdulManageVO.setSchdulDeptName("관리자부서");
|
||||
indvdlSchdulManageVO.setSchdulDeptId("ORGNZT_0000000000000");
|
||||
indvdlSchdulManageVO.setSchdulChargerName("관리자");
|
||||
indvdlSchdulManageVO.setSchdulChargerId("USRCNFRM_00000000000");
|
||||
egovIndvdlSchdulManageService.insertIndvdlSchdulManage(indvdlSchdulManageVO);
|
||||
|
||||
resultVO.setResultCode(ResponseCode.SUCCESS.getCode());
|
||||
resultVO.setResultMessage(ResponseCode.SUCCESS.getMessage());
|
||||
|
||||
return resultVO;
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* 일정 목록을 상세조회한다.
|
||||
* @param schdulId
|
||||
* @param user
|
||||
* @return
|
||||
* @throws Exception
|
||||
*/
|
||||
@Operation(
|
||||
summary = "일정 상세조회",
|
||||
description = "일정 목록을 상세조회",
|
||||
tags = {"SchedulesApiController"}
|
||||
)
|
||||
@ApiResponses(value = {
|
||||
@ApiResponse(responseCode = "200", description = "조회 성공")
|
||||
})
|
||||
@GetMapping(value = "/schedule/{schdulId}")
|
||||
public ResultVO EgovIndvdlSchdulManageDetail(
|
||||
@PathVariable("schdulId") String schdulId,
|
||||
@AuthenticationPrincipal LoginVO user)
|
||||
throws Exception {
|
||||
|
||||
ResultVO resultVO = new ResultVO();
|
||||
Map<String, Object> resultMap = new HashMap<String, Object>();
|
||||
|
||||
IndvdlSchdulManageVO indvdlSchdulManageVO = new IndvdlSchdulManageVO();
|
||||
indvdlSchdulManageVO.setSchdulId(schdulId);
|
||||
|
||||
//일정시작일자(시)
|
||||
resultMap.put("schdulBgndeHH", getTimeHH());
|
||||
//일정시작일자(분)
|
||||
resultMap.put("schdulBgndeMM", getTimeMM());
|
||||
//일정종료일자(시)
|
||||
resultMap.put("schdulEnddeHH", getTimeHH());
|
||||
//일정정료일자(분)
|
||||
resultMap.put("schdulEnddeMM", getTimeMM());
|
||||
|
||||
//공통코드 중요도 조회
|
||||
ComDefaultCodeVO voComCode = new ComDefaultCodeVO();
|
||||
voComCode.setCodeId("COM019");
|
||||
resultMap.put("schdulIpcrCode", cmmUseService.selectCmmCodeDetail(voComCode));
|
||||
//공통코드 일정구분 조회
|
||||
voComCode = new ComDefaultCodeVO();
|
||||
voComCode.setCodeId("COM030");
|
||||
resultMap.put("schdulSe", cmmUseService.selectCmmCodeDetail(voComCode));
|
||||
//공통코드 반복구분 조회
|
||||
voComCode = new ComDefaultCodeVO();
|
||||
voComCode.setCodeId("COM031");
|
||||
resultMap.put("reptitSeCode", cmmUseService.selectCmmCodeDetail(voComCode));
|
||||
|
||||
IndvdlSchdulManageVO scheduleDetail = egovIndvdlSchdulManageService
|
||||
.selectIndvdlSchdulManageDetail(indvdlSchdulManageVO);
|
||||
resultMap.put("scheduleDetail", scheduleDetail);
|
||||
|
||||
// 첨부파일 확인
|
||||
if (scheduleDetail.getAtchFileId() != null && !scheduleDetail.getAtchFileId().isEmpty()) {
|
||||
FileVO fileVO = new FileVO();
|
||||
fileVO.setAtchFileId(scheduleDetail.getAtchFileId());
|
||||
List<FileVO> resultFiles = fileMngService.selectFileInfs(fileVO);
|
||||
|
||||
// FileId를 유추하지 못하도록 암호화하여 표시한다. (2022.12.06 추가) - 파일아이디가 유추 불가능하도록 조치
|
||||
for (FileVO file : resultFiles) {
|
||||
String toEncrypt = file.atchFileId;
|
||||
file.setAtchFileId(Base64.getEncoder().encodeToString(cryptoService.encrypt(toEncrypt.getBytes(),EgovFileDownloadController.ALGORITM_KEY)));
|
||||
}
|
||||
|
||||
resultMap.put("resultFiles", resultFiles);
|
||||
}
|
||||
resultMap.put("user", user);
|
||||
|
||||
resultVO.setResult(resultMap);
|
||||
resultVO.setResultCode(ResponseCode.SUCCESS.getCode());
|
||||
resultVO.setResultMessage(ResponseCode.SUCCESS.getMessage());
|
||||
|
||||
return resultVO;
|
||||
}
|
||||
|
||||
/**
|
||||
* 일정을 삭제한다.
|
||||
* @param schdulId
|
||||
* @return
|
||||
* @throws Exception
|
||||
*/
|
||||
@Operation(
|
||||
summary = "일정 삭제",
|
||||
description = "일정을 삭제 처리",
|
||||
tags = {"SchedulesApiController"}
|
||||
)
|
||||
@ApiResponses(value = {
|
||||
@ApiResponse(responseCode = "200", description = "등록 성공"),
|
||||
@ApiResponse(responseCode = "403", description = "인가된 사용자가 아님")
|
||||
})
|
||||
@DeleteMapping(value = "/schedule/{schdulId}")
|
||||
public ResultVO EgovIndvdlSchdulManageDelete(
|
||||
@PathVariable("schdulId") String schdulId
|
||||
) throws Exception {
|
||||
|
||||
ResultVO resultVO = new ResultVO();
|
||||
|
||||
IndvdlSchdulManageVO indvdlSchdulManageVO = new IndvdlSchdulManageVO();
|
||||
indvdlSchdulManageVO.setSchdulId(schdulId);
|
||||
|
||||
|
||||
egovIndvdlSchdulManageService.deleteIndvdlSchdulManage(indvdlSchdulManageVO);//schdulId
|
||||
|
||||
resultVO.setResultCode(ResponseCode.SUCCESS.getCode());
|
||||
resultVO.setResultMessage(ResponseCode.SUCCESS.getMessage());
|
||||
|
||||
|
||||
return resultVO;
|
||||
}
|
||||
|
||||
/**
|
||||
* 일정를 수정 처리 한다.
|
||||
* @param multiRequest
|
||||
* @param indvdlSchdulManageVO
|
||||
* @param bindingResult
|
||||
* @return resultVO
|
||||
* @throws Exception
|
||||
*/
|
||||
@Operation(
|
||||
summary = "일정 수정",
|
||||
description = "일정을 수정 처리",
|
||||
tags = {"SchedulesApiController"}
|
||||
)
|
||||
@ApiResponses(value = {
|
||||
@ApiResponse(responseCode = "200", description = "등록 성공"),
|
||||
@ApiResponse(responseCode = "403", description = "인가된 사용자가 아님"),
|
||||
@ApiResponse(responseCode = "900", description = "입력값 무결성 오류")
|
||||
})
|
||||
@PutMapping(value = "/schedule/{schdulId}")
|
||||
public ResultVO IndvdlSchdulManageModifyActor(
|
||||
final MultipartHttpServletRequest multiRequest,
|
||||
IndvdlSchdulManageVO indvdlSchdulManageVO,
|
||||
BindingResult bindingResult,
|
||||
@PathVariable("schdulId") String schdulId,
|
||||
@AuthenticationPrincipal LoginVO user)
|
||||
throws Exception {
|
||||
|
||||
ResultVO resultVO = new ResultVO();
|
||||
Map<String, Object> resultMap = new HashMap<String, Object>();
|
||||
|
||||
//서버 validate 체크
|
||||
indvdlSchdulManageVO.setSchdulId(schdulId);
|
||||
////beanValidator.validate(indvdlSchdulManageVO, bindingResult);
|
||||
if (bindingResult.hasErrors()) {
|
||||
|
||||
resultVO.setResult(resultMap);
|
||||
resultVO.setResultCode(ResponseCode.INPUT_CHECK_ERROR.getCode());
|
||||
resultVO.setResultMessage(ResponseCode.INPUT_CHECK_ERROR.getMessage());
|
||||
|
||||
return resultVO;
|
||||
}
|
||||
|
||||
/* *****************************************************************
|
||||
// 아이디 설정
|
||||
****************************************************************** */
|
||||
indvdlSchdulManageVO.setFrstRegisterId(user.getUniqId());
|
||||
indvdlSchdulManageVO.setLastUpdusrId(user.getUniqId());
|
||||
/* *****************************************************************
|
||||
// 첨부파일 관련 ID 생성 start....
|
||||
****************************************************************** */
|
||||
String _atchFileId = indvdlSchdulManageVO.getAtchFileId();
|
||||
|
||||
final Map<String, MultipartFile> files = multiRequest.getFileMap();
|
||||
|
||||
if (!files.isEmpty()) {
|
||||
String atchFileAt = multiRequest.getAttribute("atchFileAt") == null ? "" : (String)multiRequest.getAttribute("atchFileAt");
|
||||
if ("N".equals(atchFileAt) || _atchFileId.equals("")) {
|
||||
//기존 첨부 파일이 존재하지 않는 경우
|
||||
////List<FileVO> _result = fileUtil.parseFileInf(files, "DSCH_", 0, _atchFileId, "");
|
||||
////_atchFileId = fileMngService.insertFileInfs(_result);
|
||||
|
||||
// 첨부파일 ID 셋팅
|
||||
indvdlSchdulManageVO.setAtchFileId(_atchFileId); // 첨부파일 ID
|
||||
|
||||
} else {
|
||||
//기존 첨부 파일이 하나라도 존재하는 경우
|
||||
FileVO fvo = new FileVO();
|
||||
fvo.setAtchFileId(_atchFileId);
|
||||
int _cnt = fileMngService.getMaxFileSN(fvo);
|
||||
////List<FileVO> _result = fileUtil.parseFileInf(files, "DSCH_", _cnt, _atchFileId, "");
|
||||
////fileMngService.updateFileInfs(_result);
|
||||
}
|
||||
}
|
||||
|
||||
/* *****************************************************************
|
||||
// 일정관리정보 업데이트 처리
|
||||
****************************************************************** */
|
||||
egovIndvdlSchdulManageService.updateIndvdlSchdulManage(indvdlSchdulManageVO);
|
||||
|
||||
resultVO.setResult(resultMap);
|
||||
resultVO.setResultCode(ResponseCode.SUCCESS.getCode());
|
||||
resultVO.setResultMessage(ResponseCode.SUCCESS.getMessage());
|
||||
|
||||
return resultVO;
|
||||
}
|
||||
|
||||
/**
|
||||
* 일정(일별) 목록을 조회한다.
|
||||
* @param commandMap
|
||||
* @return resultVO
|
||||
* @throws Exception
|
||||
*/
|
||||
@Operation(
|
||||
summary = "일별 일정 조회",
|
||||
description = "일정(일별) 목록을 조회",
|
||||
tags = {"SchedulesApiController"}
|
||||
)
|
||||
@ApiResponses(value = {
|
||||
@ApiResponse(responseCode = "200", description = "조회 성공"),
|
||||
@ApiResponse(responseCode = "403", description = "인가된 사용자가 아님")
|
||||
})
|
||||
@GetMapping(value = "/schedule/daily")
|
||||
public ResultVO EgovIndvdlSchdulManageDailyList(@RequestParam Map<String, Object> commandMap) throws Exception {
|
||||
|
||||
ResultVO resultVO = new ResultVO();
|
||||
Map<String, Object> resultMap = new HashMap<String, Object>();
|
||||
|
||||
//일정구분 검색 유지
|
||||
resultMap.put("searchKeyword",
|
||||
commandMap.get("searchKeyword") == null ? "" : (String)commandMap.get("searchKeyword"));
|
||||
resultMap.put("searchCondition",
|
||||
commandMap.get("searchCondition") == null ? "" : (String)commandMap.get("searchCondition"));
|
||||
|
||||
//공통코드 일정종류
|
||||
ComDefaultCodeVO voComCode = new ComDefaultCodeVO();
|
||||
voComCode = new ComDefaultCodeVO();
|
||||
voComCode.setCodeId("COM030");
|
||||
resultMap.put("schdulSe", cmmUseService.selectCmmCodeDetail(voComCode));
|
||||
|
||||
/* *****************************************************************
|
||||
// 캘런더 설정 로직
|
||||
****************************************************************** */
|
||||
Calendar calNow = Calendar.getInstance();
|
||||
|
||||
String strYear = String.valueOf(commandMap.get("year"));
|
||||
String strMonth = String.valueOf(commandMap.get("month"));
|
||||
String strDay = String.valueOf(commandMap.get("date"));
|
||||
String strSearchDay = "";
|
||||
int iNowYear = calNow.get(Calendar.YEAR);
|
||||
int iNowMonth = calNow.get(Calendar.MONTH);
|
||||
int iNowDay = calNow.get(Calendar.DATE);
|
||||
|
||||
if (strYear != null) {
|
||||
iNowYear = Integer.parseInt(strYear);
|
||||
iNowMonth = Integer.parseInt(strMonth);
|
||||
iNowDay = Integer.parseInt(strDay);
|
||||
}
|
||||
|
||||
strSearchDay = Integer.toString(iNowYear);
|
||||
strSearchDay += DateTypeIntForString(iNowMonth + 1);
|
||||
strSearchDay += DateTypeIntForString(iNowDay);
|
||||
|
||||
commandMap.put("searchMode", "DAILY");
|
||||
commandMap.put("searchDay", strSearchDay);
|
||||
|
||||
resultMap.put("year", iNowYear);
|
||||
resultMap.put("month", iNowMonth);
|
||||
resultMap.put("day", iNowDay);
|
||||
|
||||
resultMap.put("resultList", egovIndvdlSchdulManageService.selectIndvdlSchdulManageRetrieve(commandMap));
|
||||
|
||||
resultVO.setResult(resultMap);
|
||||
resultVO.setResultCode(ResponseCode.SUCCESS.getCode());
|
||||
resultVO.setResultMessage(ResponseCode.SUCCESS.getMessage());
|
||||
|
||||
return resultVO;
|
||||
}
|
||||
|
||||
/**
|
||||
* 일정(주간별) 목록을 조회한다.
|
||||
* @param commandMap
|
||||
* @return resultVO
|
||||
* @throws Exception
|
||||
*/
|
||||
@Operation(
|
||||
summary = "주간별 일정 조회",
|
||||
description = "일정(주간별) 목록을 조회",
|
||||
tags = {"SchedulesApiController"}
|
||||
)
|
||||
@ApiResponses(value = {
|
||||
@ApiResponse(responseCode = "200", description = "조회 성공"),
|
||||
@ApiResponse(responseCode = "403", description = "인가된 사용자가 아님")
|
||||
})
|
||||
@GetMapping(value = "/schedule/week")
|
||||
public ResultVO EgovIndvdlSchdulManageWeekList(
|
||||
@RequestParam Map<String, Object> commandMap)
|
||||
throws Exception {
|
||||
|
||||
ResultVO resultVO = new ResultVO();
|
||||
Map<String, Object> resultMap = new HashMap<String, Object>();
|
||||
|
||||
//일정구분 검색 유지
|
||||
resultMap.put("searchKeyword",
|
||||
commandMap.get("searchKeyword") == null ? "" : (String)commandMap.get("searchKeyword"));
|
||||
resultMap.put("searchCondition",
|
||||
commandMap.get("searchCondition") == null ? "" : (String)commandMap.get("searchCondition"));
|
||||
|
||||
//공통코드 일정종류
|
||||
ComDefaultCodeVO voComCode = new ComDefaultCodeVO();
|
||||
voComCode = new ComDefaultCodeVO();
|
||||
voComCode.setCodeId("COM030");
|
||||
resultMap.put("schdulSe", cmmUseService.selectCmmCodeDetail(voComCode));
|
||||
|
||||
/* *****************************************************************
|
||||
// 캘런더 설정 로직
|
||||
****************************************************************** */
|
||||
Calendar calNow = Calendar.getInstance();
|
||||
|
||||
String strYear = String.valueOf(commandMap.get("year"));
|
||||
String strMonth = String.valueOf(commandMap.get("month"));
|
||||
String strDate = String.valueOf(commandMap.get("date"));
|
||||
|
||||
int iNowMonth = calNow.get(Calendar.MONTH);
|
||||
|
||||
if (strYear != null) {
|
||||
iNowMonth = Integer.parseInt(strMonth);
|
||||
}
|
||||
|
||||
//프론트에서 넘어온 값은 1월을 0으로 간주하므로 1달 더해 줌
|
||||
int realMonth = iNowMonth + 1;
|
||||
strMonth = String.valueOf(realMonth);
|
||||
|
||||
//자릿수 보정
|
||||
strMonth = (strMonth.length() == 1) ? "0" + strMonth : strMonth;
|
||||
strDate = (strDate.length() == 1) ? "0" + strDate : strDate;
|
||||
|
||||
//시작일자
|
||||
String schdulBgnde = strYear + strMonth + strDate;
|
||||
|
||||
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd");
|
||||
Calendar calNext = Calendar.getInstance();
|
||||
|
||||
calNext.set(Integer.parseInt(strYear), Integer.parseInt(strMonth)-1, Integer.parseInt(strDate));
|
||||
|
||||
calNext.add(Calendar.DATE, 6);
|
||||
|
||||
//종료일자
|
||||
String schdulEndde = dateFormat.format(calNext.getTime());
|
||||
|
||||
commandMap.put("searchMode", "WEEK");
|
||||
|
||||
commandMap.put("schdulBgnde", schdulBgnde);
|
||||
commandMap.put("schdulEndde", schdulEndde);
|
||||
|
||||
resultMap.put("resultList", egovIndvdlSchdulManageService.selectIndvdlSchdulManageRetrieve(commandMap));
|
||||
|
||||
resultVO.setResult(resultMap);
|
||||
resultVO.setResultCode(ResponseCode.SUCCESS.getCode());
|
||||
resultVO.setResultMessage(ResponseCode.SUCCESS.getMessage());
|
||||
|
||||
return resultVO;
|
||||
}
|
||||
|
||||
/**
|
||||
* 시간을 LIST를 반환한다.
|
||||
* @return List
|
||||
* @throws
|
||||
*/
|
||||
private List<ComDefaultCodeVO> getTimeHH() {
|
||||
ArrayList<ComDefaultCodeVO> listHH = new ArrayList<ComDefaultCodeVO>();
|
||||
//HashMap hmHHMM;
|
||||
for (int i = 0; i < 24; i++) {
|
||||
String sHH = "";
|
||||
String strI = String.valueOf(i);
|
||||
if (i < 10) {
|
||||
sHH = "0" + strI;
|
||||
} else {
|
||||
sHH = strI;
|
||||
}
|
||||
|
||||
ComDefaultCodeVO codeVO = new ComDefaultCodeVO();
|
||||
codeVO.setCode(sHH);
|
||||
codeVO.setCodeNm(sHH);
|
||||
|
||||
listHH.add(codeVO);
|
||||
}
|
||||
|
||||
return listHH;
|
||||
}
|
||||
|
||||
/**
|
||||
* 분을 LIST를 반환한다.
|
||||
* @return List
|
||||
* @throws
|
||||
*/
|
||||
private List<ComDefaultCodeVO> getTimeMM() {
|
||||
ArrayList<ComDefaultCodeVO> listMM = new ArrayList<ComDefaultCodeVO>();
|
||||
//HashMap hmHHMM;
|
||||
for (int i = 0; i < 60; i++) {
|
||||
|
||||
String sMM = "";
|
||||
String strI = String.valueOf(i);
|
||||
if (i < 10) {
|
||||
sMM = "0" + strI;
|
||||
} else {
|
||||
sMM = strI;
|
||||
}
|
||||
|
||||
ComDefaultCodeVO codeVO = new ComDefaultCodeVO();
|
||||
codeVO.setCode(sMM);
|
||||
codeVO.setCodeNm(sMM);
|
||||
|
||||
listMM.add(codeVO);
|
||||
}
|
||||
return listMM;
|
||||
}
|
||||
|
||||
/**
|
||||
* 0을 붙여 반환
|
||||
* @return String
|
||||
* @throws
|
||||
*/
|
||||
public String DateTypeIntForString(int iInput) {
|
||||
String sOutput = "";
|
||||
if (Integer.toString(iInput).length() == 1) {
|
||||
sOutput = "0" + Integer.toString(iInput);
|
||||
} else {
|
||||
sOutput = Integer.toString(iInput);
|
||||
}
|
||||
|
||||
return sOutput;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* 관리자 단에서 '위원회 관리' > '위원회 일정 관리'에 '등록' 버튼을 누른 후 '위원회 일정 등록' 페이지 로딩 시, 필요한 데이터 불러 오는 API
|
||||
* @param commandMap
|
||||
* @return resultVO
|
||||
* @throws Exception
|
||||
*/
|
||||
@Operation(
|
||||
summary = "'위원회 일정 등록' 페이지 로딩 시, 필요한 데이터 불러 오는 API",
|
||||
description = "관리자 단에서 '위원회 관리' > '위원회 일정 관리'에 '등록' 버튼을 누른 후 '위원회 일정 등록' 페이지 로딩 시, 필요한 데이터 불러 오는 API",
|
||||
tags = {"SchedulesApiController"}
|
||||
)
|
||||
@ApiResponses(value = {
|
||||
@ApiResponse(responseCode = "200", description = "조회 성공"),
|
||||
@ApiResponse(responseCode = "403", description = "인가된 사용자가 아님")
|
||||
})
|
||||
@GetMapping(value = "/schedule/init")
|
||||
public ResultVO ScheduleInit(@RequestParam Map<String, Object> commandMap) throws Exception {
|
||||
ResultVO resultVO = new ResultVO();
|
||||
return egovIndvdlSchdulManageService.ScheduleInit(resultVO);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* '위원회 일정 등록' 페이지에서 심의위원회 첫 번째 거 선택 시, 하위 목록 불러오는 API
|
||||
* @param paramCodeGroup 상위 그룹 번호
|
||||
* @return
|
||||
* @throws Exception
|
||||
*/
|
||||
@Operation(
|
||||
summary = "'위원회 일정 등록' 페이지에서 심의위원회 첫 번째 거 선택 시, 하위 목록 불러오는 API",
|
||||
description = "관리자 단에서 '위원회 관리' > '위원회 일정 관리'에 '등록' 버튼을 누른 후 '위원회 일정 등록' 페이지에서 심의위원회 첫 번째 거 선택 시, 하위 목록 불러오는 API",
|
||||
tags = {"SchedulesApiController"}
|
||||
)
|
||||
@ApiResponses(value = {
|
||||
@ApiResponse(responseCode = "200", description = "조회 성공"),
|
||||
@ApiResponse(responseCode = "403", description = "인가된 사용자가 아님")
|
||||
})
|
||||
@GetMapping(value = "/schedule/api/org-api/depth/list")
|
||||
public ResultVO ScheduleApiOrgApiDepthList(@RequestParam Integer paramCodeGroup) throws Exception {
|
||||
ResultVO resultVO = new ResultVO();
|
||||
return egovIndvdlSchdulManageService.ScheduleApiOrgApiDepthList(resultVO, paramCodeGroup);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,67 @@
|
|||
package com.dbnt.kcscbackend.admin.committee.schedules.repository;
|
||||
|
||||
|
||||
import com.dbnt.kcscbackend.admin.committee.schedules.service.CmmnDetailCode;
|
||||
import com.dbnt.kcscbackend.admin.committee.schedules.service.EgovComAbstractDAO;
|
||||
import org.springframework.stereotype.Repository;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @Class Name : CmmUseDAO.java
|
||||
* @Description : 공통코드등 전체 업무에서 공용해서 사용해야 하는 서비스를 정의하기위한 데이터 접근 클래스
|
||||
* @Modification Information
|
||||
*
|
||||
* 수정일 수정자 수정내용
|
||||
* ------- ------- -------------------
|
||||
* 2009. 3. 11. 이삼섭
|
||||
*
|
||||
* @author 공통 서비스 개발팀 이삼섭
|
||||
* @since 2009. 3. 11.
|
||||
* @version
|
||||
* @see
|
||||
*
|
||||
*/
|
||||
@Repository("cmmUseDAO")
|
||||
public class CmmUseDAO extends EgovComAbstractDAO {
|
||||
|
||||
/**
|
||||
* 주어진 조건에 따른 공통코드를 불러온다.
|
||||
*
|
||||
* @param vo
|
||||
* @return
|
||||
* @throws Exception
|
||||
*/
|
||||
@SuppressWarnings("unchecked")
|
||||
public List<CmmnDetailCode> selectCmmCodeDetail(ComDefaultCodeVO vo) throws Exception {
|
||||
////return (List<CmmnDetailCode>) list("CmmUseDAO.selectCmmCodeDetail", vo);
|
||||
return new ArrayList<CmmnDetailCode>();
|
||||
}
|
||||
|
||||
/**
|
||||
* 공통코드로 사용할 조직정보를 를 불러온다.
|
||||
*
|
||||
* @param vo
|
||||
* @return
|
||||
* @throws Exception
|
||||
*/
|
||||
@SuppressWarnings("unchecked")
|
||||
public List<CmmnDetailCode> selectOgrnztIdDetail(ComDefaultCodeVO vo) throws Exception {
|
||||
//// return (List<CmmnDetailCode>) list("CmmUseDAO.selectOgrnztIdDetail", vo);
|
||||
return new ArrayList<CmmnDetailCode>();
|
||||
}
|
||||
|
||||
/**
|
||||
* 공통코드로 사용할그룹정보를 를 불러온다.
|
||||
*
|
||||
* @param vo
|
||||
* @return
|
||||
* @throws Exception
|
||||
*/
|
||||
@SuppressWarnings("unchecked")
|
||||
public List<CmmnDetailCode> selectGroupIdDetail(ComDefaultCodeVO vo) throws Exception {
|
||||
////return (List<CmmnDetailCode>) list("CmmUseDAO.selectGroupIdDetail", vo);
|
||||
return new ArrayList<CmmnDetailCode>();
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,60 @@
|
|||
package com.dbnt.kcscbackend.admin.committee.schedules.repository;
|
||||
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
import org.apache.commons.lang3.builder.ToStringBuilder;
|
||||
|
||||
import java.io.Serializable;
|
||||
|
||||
/**
|
||||
* 클래스
|
||||
* @author 공통서비스개발팀 이삼섭
|
||||
* @since 2009.06.01
|
||||
* @version 1.0
|
||||
* @see
|
||||
*
|
||||
* <pre>
|
||||
* << 개정이력(Modification Information) >>
|
||||
*
|
||||
* 수정일 수정자 수정내용
|
||||
* ------- -------- ---------------------------
|
||||
* 2009.3.11 이삼섭 최초 생성
|
||||
*
|
||||
* </pre>
|
||||
*/
|
||||
@Getter
|
||||
@Setter
|
||||
public class ComDefaultCodeVO implements Serializable {
|
||||
/**
|
||||
* serialVersion UID
|
||||
*/
|
||||
private static final long serialVersionUID = -2020648489890016404L;
|
||||
|
||||
/** 코드 ID */
|
||||
private String codeId = "";
|
||||
|
||||
/** 상세코드 */
|
||||
private String code = "";
|
||||
|
||||
/** 코드명 */
|
||||
private String codeNm = "";
|
||||
|
||||
/** 코드설명 */
|
||||
private String codeDc = "";
|
||||
|
||||
/** 특정테이블명 */
|
||||
private String tableNm = ""; //특정테이블에서 코드정보를추출시 사용
|
||||
|
||||
/** 상세 조건 여부 */
|
||||
private String haveDetailCondition = "N";
|
||||
|
||||
/** 상세 조건 */
|
||||
private String detailCondition = "";
|
||||
|
||||
/**
|
||||
* toString 메소드를 대치한다.
|
||||
*/
|
||||
public String toString() {
|
||||
return ToStringBuilder.reflectionToString(this);
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,68 @@
|
|||
package com.dbnt.kcscbackend.admin.committee.schedules.repository;
|
||||
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
import org.apache.commons.lang3.builder.ToStringBuilder;
|
||||
|
||||
import java.io.Serializable;
|
||||
|
||||
/**
|
||||
* @Class Name : ComDefaultVO.java
|
||||
* @Description : ComDefaultVO class
|
||||
* @Modification Information
|
||||
* @
|
||||
* @ 수정일 수정자 수정내용
|
||||
* @ ------- -------- ---------------------------
|
||||
* @ 2009.02.01 조재영 최초 생성
|
||||
*
|
||||
* @author 공통서비스 개발팀 조재영
|
||||
* @since 2009.02.01
|
||||
* @version 1.0
|
||||
* @see
|
||||
*
|
||||
*/
|
||||
@Getter
|
||||
@Setter
|
||||
public class ComDefaultVO implements Serializable {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
/** 검색조건 */
|
||||
private String searchCondition = "";
|
||||
|
||||
/** 검색Keyword */
|
||||
private String searchKeyword = "";
|
||||
|
||||
/** 검색사용여부 */
|
||||
private String searchUseYn = "";
|
||||
|
||||
/** 현재페이지 */
|
||||
private int pageIndex = 1;
|
||||
|
||||
/** 페이지갯수 */
|
||||
private int pageUnit = 10;
|
||||
|
||||
/** 페이지사이즈 */
|
||||
private int pageSize = 10;
|
||||
|
||||
/** firstIndex */
|
||||
private int firstIndex = 1;
|
||||
|
||||
/** lastIndex */
|
||||
private int lastIndex = 1;
|
||||
|
||||
/** recordCountPerPage */
|
||||
private int recordCountPerPage = 10;
|
||||
|
||||
/** 검색KeywordFrom */
|
||||
private String searchKeywordFrom = "";
|
||||
|
||||
/** 검색KeywordTo */
|
||||
private String searchKeywordTo = "";
|
||||
|
||||
public String toString() {
|
||||
return ToStringBuilder.reflectionToString(this);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,182 @@
|
|||
package com.dbnt.kcscbackend.admin.committee.schedules.repository;
|
||||
|
||||
import com.dbnt.kcscbackend.admin.committee.schedules.repository.FileVO;
|
||||
import com.dbnt.kcscbackend.admin.committee.schedules.service.EgovComAbstractDAO;
|
||||
import org.springframework.stereotype.Repository;
|
||||
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @Class Name : EgovFileMngDAO.java
|
||||
* @Description : 파일정보 관리를 위한 데이터 처리 클래스
|
||||
* @Modification Information
|
||||
*
|
||||
* 수정일 수정자 수정내용
|
||||
* ------- ------- -------------------
|
||||
* 2009. 3. 25. 이삼섭 최초생성
|
||||
*
|
||||
* @author 공통 서비스 개발팀 이삼섭
|
||||
* @since 2009. 3. 25.
|
||||
* @version
|
||||
* @see
|
||||
*
|
||||
*/
|
||||
@Repository("FileManageDAO")
|
||||
public class FileManageDAO extends EgovComAbstractDAO {
|
||||
|
||||
/**
|
||||
* 여러 개의 파일에 대한 정보(속성 및 상세)를 등록한다.
|
||||
*
|
||||
* @param fileList
|
||||
* @return
|
||||
* @throws Exception
|
||||
*/
|
||||
public String insertFileInfs(List<?> fileList) throws Exception {
|
||||
FileVO vo = (FileVO) fileList.get(0);
|
||||
String atchFileId = vo.getAtchFileId();
|
||||
|
||||
insert("FileManageDAO.insertFileMaster", vo);
|
||||
|
||||
Iterator<?> iter = fileList.iterator();
|
||||
while (iter.hasNext()) {
|
||||
vo = (FileVO) iter.next();
|
||||
|
||||
insert("FileManageDAO.insertFileDetail", vo);
|
||||
}
|
||||
|
||||
return atchFileId;
|
||||
}
|
||||
|
||||
/**
|
||||
* 하나의 파일에 대한 정보(속성 및 상세)를 등록한다.
|
||||
*
|
||||
* @param vo
|
||||
* @throws Exception
|
||||
*/
|
||||
public void insertFileInf(FileVO vo) throws Exception {
|
||||
insert("FileManageDAO.insertFileMaster", vo);
|
||||
insert("FileManageDAO.insertFileDetail", vo);
|
||||
}
|
||||
|
||||
/**
|
||||
* 여러 개의 파일에 대한 정보(속성 및 상세)를 수정한다.
|
||||
*
|
||||
* @param fileList
|
||||
* @throws Exception
|
||||
*/
|
||||
public void updateFileInfs(List<?> fileList) throws Exception {
|
||||
FileVO vo;
|
||||
Iterator<?> iter = fileList.iterator();
|
||||
while (iter.hasNext()) {
|
||||
vo = (FileVO) iter.next();
|
||||
|
||||
insert("FileManageDAO.insertFileDetail", vo);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 여러 개의 파일을 삭제한다.
|
||||
*
|
||||
* @param fileList
|
||||
* @throws Exception
|
||||
*/
|
||||
public void deleteFileInfs(List<?> fileList) throws Exception {
|
||||
Iterator<?> iter = fileList.iterator();
|
||||
FileVO vo;
|
||||
while (iter.hasNext()) {
|
||||
vo = (FileVO) iter.next();
|
||||
|
||||
delete("FileManageDAO.deleteFileDetail", vo);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 하나의 파일을 삭제한다.
|
||||
*
|
||||
* @param fvo
|
||||
* @throws Exception
|
||||
*/
|
||||
public void deleteFileInf(FileVO fvo) throws Exception {
|
||||
delete("FileManageDAO.deleteFileDetail", fvo);
|
||||
}
|
||||
|
||||
/**
|
||||
* 파일에 대한 목록을 조회한다.
|
||||
*
|
||||
* @param vo
|
||||
* @return
|
||||
* @throws Exception
|
||||
*/
|
||||
@SuppressWarnings("unchecked")
|
||||
public List<FileVO> selectFileInfs(FileVO vo) throws Exception {
|
||||
return (List<FileVO>) list("FileManageDAO.selectFileList", vo);
|
||||
}
|
||||
|
||||
/**
|
||||
* 파일 구분자에 대한 최대값을 구한다.
|
||||
*
|
||||
* @param fvo
|
||||
* @return
|
||||
* @throws Exception
|
||||
*/
|
||||
public int getMaxFileSN(FileVO fvo) throws Exception {
|
||||
return (Integer) selectOne("FileManageDAO.getMaxFileSN", fvo);
|
||||
}
|
||||
|
||||
/**
|
||||
* 파일에 대한 상세정보를 조회한다.
|
||||
*
|
||||
* @param fvo
|
||||
* @return
|
||||
* @throws Exception
|
||||
*/
|
||||
public FileVO selectFileInf(FileVO fvo) throws Exception {
|
||||
return (FileVO) selectOne("FileManageDAO.selectFileInf", fvo);
|
||||
}
|
||||
|
||||
/**
|
||||
* 전체 파일을 삭제한다.
|
||||
*
|
||||
* @param fvo
|
||||
* @throws Exception
|
||||
*/
|
||||
public void deleteAllFileInf(FileVO fvo) throws Exception {
|
||||
update("FileManageDAO.deleteCOMTNFILE", fvo);
|
||||
}
|
||||
|
||||
/**
|
||||
* 파일명 검색에 대한 목록을 조회한다.
|
||||
*
|
||||
* @param vo
|
||||
* @return
|
||||
* @throws Exception
|
||||
*/
|
||||
@SuppressWarnings("unchecked")
|
||||
public List<FileVO> selectFileListByFileNm(FileVO fvo) throws Exception {
|
||||
return (List<FileVO>) list("FileManageDAO.selectFileListByFileNm", fvo);
|
||||
}
|
||||
|
||||
/**
|
||||
* 파일명 검색에 대한 목록 전체 건수를 조회한다.
|
||||
*
|
||||
* @param fvo
|
||||
* @return
|
||||
* @throws Exception
|
||||
*/
|
||||
public int selectFileListCntByFileNm(FileVO fvo) throws Exception {
|
||||
return (Integer) selectOne("FileManageDAO.selectFileListCntByFileNm", fvo);
|
||||
}
|
||||
|
||||
/**
|
||||
* 이미지 파일에 대한 목록을 조회한다.
|
||||
*
|
||||
* @param vo
|
||||
* @return
|
||||
* @throws Exception
|
||||
*/
|
||||
@SuppressWarnings("unchecked")
|
||||
public List<FileVO> selectImageFileList(FileVO vo) throws Exception {
|
||||
return (List<FileVO>) list("FileManageDAO.selectImageFileList", vo);
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,69 @@
|
|||
package com.dbnt.kcscbackend.admin.committee.schedules.repository;
|
||||
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
import org.apache.commons.lang3.builder.ToStringBuilder;
|
||||
|
||||
import java.io.Serializable;
|
||||
|
||||
/**
|
||||
* @Class Name : FileVO.java
|
||||
* @Description : 파일정보 처리를 위한 VO 클래스
|
||||
* @Modification Information
|
||||
*
|
||||
* 수정일 수정자 수정내용
|
||||
* ------- ------- -------------------
|
||||
* 2009. 3. 25. 이삼섭
|
||||
*
|
||||
* @author 공통 서비스 개발팀 이삼섭
|
||||
* @since 2009. 3. 25.
|
||||
* @version
|
||||
* @see
|
||||
*
|
||||
*/
|
||||
@Schema(description = "파일 정보 VO")
|
||||
@Getter
|
||||
@Setter
|
||||
public class FileVO implements Serializable {
|
||||
|
||||
/**
|
||||
* serialVersion UID
|
||||
*/
|
||||
private static final long serialVersionUID = -287950405903719128L;
|
||||
|
||||
@Schema(description = "첨부파일 아이디")
|
||||
public String atchFileId = "";
|
||||
|
||||
@Schema(description = "생성일자")
|
||||
public String creatDt = "";
|
||||
|
||||
@Schema(description = "파일내용")
|
||||
public String fileCn = "";
|
||||
|
||||
@Schema(description = "파일확장자")
|
||||
public String fileExtsn = "";
|
||||
|
||||
@Schema(description = "파일크기")
|
||||
public String fileMg = "";
|
||||
|
||||
@Schema(description = "파일연번")
|
||||
public String fileSn = "";
|
||||
|
||||
@Schema(description = "파일저장경로")
|
||||
public String fileStreCours = "";
|
||||
|
||||
@Schema(description = "원파일명")
|
||||
public String orignlFileNm = "";
|
||||
|
||||
@Schema(description = "저장파일명")
|
||||
public String streFileNm = "";
|
||||
|
||||
/**
|
||||
* toString 메소드를 대치한다.
|
||||
*/
|
||||
public String toString() {
|
||||
return ToStringBuilder.reflectionToString(this);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,125 @@
|
|||
package com.dbnt.kcscbackend.admin.committee.schedules.repository;
|
||||
|
||||
import com.dbnt.kcscbackend.admin.committee.schedules.service.CmmnDetailCode;
|
||||
import org.egovframe.rte.psl.dataaccess.EgovAbstractMapper;
|
||||
import org.springframework.stereotype.Repository;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* 일정관리를 처리하는 Dao Class 구현
|
||||
* @since 2009.04.10
|
||||
* @see
|
||||
* <pre>
|
||||
* << 개정이력(Modification Information) >> 수정일 수정자 수정내용 ------- ---
|
||||
* ----- --------------------------- 2009.04.10 장동한 최초 생성 2011.05.31
|
||||
* JJY 경량환경 커스터마이징버전 생성
|
||||
* </pre>
|
||||
* @author 조재영
|
||||
* @version 1.0
|
||||
* @created 09-6-2011 오전 10:08:07
|
||||
*/
|
||||
@Repository("indvdlSchdulManageDao")
|
||||
public class IndvdlSchdulManageDao extends EgovAbstractMapper {
|
||||
|
||||
|
||||
/**
|
||||
* 메인페이지/일정관리조회 목록을 Map(map)형식으로 조회한다.
|
||||
* @param map
|
||||
* @return
|
||||
* @throws Exception
|
||||
*/
|
||||
public List<?> selectIndvdlSchdulManageMainList(Map<?, ?> map) throws Exception {
|
||||
return list("IndvdlSchdulManage.selectIndvdlSchdulManageMainList", map);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 일정 목록을 Map(map)형식으로 조회한다.
|
||||
* @param map
|
||||
* @return
|
||||
* @throws Exception
|
||||
*/
|
||||
public List<?> selectIndvdlSchdulManageRetrieve(Map<?, ?> map) throws Exception {
|
||||
//// return list("IndvdlSchdulManage.selectIndvdlSchdulManageRetrieve", map);
|
||||
return new ArrayList<CmmnDetailCode>();
|
||||
}
|
||||
|
||||
/**
|
||||
* 일정 목록을 VO(model)형식으로 조회한다.
|
||||
* @param indvdlSchdulManageVO - 조회할 정보가 담긴 VO
|
||||
* @return IndvdlSchdulManageVO
|
||||
* @throws Exception
|
||||
*/
|
||||
public IndvdlSchdulManageVO selectIndvdlSchdulManageDetailVO(IndvdlSchdulManageVO indvdlSchdulManageVO)
|
||||
throws Exception {
|
||||
return (IndvdlSchdulManageVO)selectOne("IndvdlSchdulManage.selectIndvdlSchdulManageDetailVO",
|
||||
indvdlSchdulManageVO);
|
||||
}
|
||||
|
||||
/**
|
||||
* 일정 목록을 조회한다.
|
||||
* @param searchVO - 조회할 정보가 담긴 VO
|
||||
* @return List
|
||||
* @throws Exception
|
||||
*/
|
||||
public List<?> selectIndvdlSchdulManageList(ComDefaultVO searchVO) throws Exception {
|
||||
return list("IndvdlSchdulManage.selectIndvdlSchdulManage", searchVO);
|
||||
}
|
||||
|
||||
/**
|
||||
* 일정를(을) 상세조회 한다.
|
||||
* @param indvdlSchdulManageVO - 일정 정보 담김 VO
|
||||
* @return List
|
||||
* @throws Exception
|
||||
*/
|
||||
// public List<?> selectIndvdlSchdulManageDetail(IndvdlSchdulManageVO indvdlSchdulManageVO) throws Exception{
|
||||
// return list("IndvdlSchdulManage.selectIndvdlSchdulManageDetail", indvdlSchdulManageVO);
|
||||
//}
|
||||
public IndvdlSchdulManageVO selectIndvdlSchdulManageDetail(IndvdlSchdulManageVO indvdlSchdulManageVO) throws Exception {
|
||||
return selectOne("IndvdlSchdulManage.selectIndvdlSchdulManageDetailVO", indvdlSchdulManageVO);
|
||||
}
|
||||
|
||||
/**
|
||||
* 일정를(을) 목록 전체 건수를(을) 조회한다.
|
||||
* @param searchVO - 조회할 정보가 담긴 VO
|
||||
* @return int
|
||||
* @throws Exception
|
||||
*/
|
||||
public int selectIndvdlSchdulManageListCnt(ComDefaultVO searchVO) throws Exception {
|
||||
return (Integer)selectOne("IndvdlSchdulManage.selectIndvdlSchdulManageCnt", searchVO);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 일정를(을) 등록한다.
|
||||
* @param indvdlSchdulManageVO
|
||||
* @throws Exception
|
||||
*/
|
||||
public void insertIndvdlSchdulManage(IndvdlSchdulManageVO indvdlSchdulManageVO) throws Exception {
|
||||
insert("IndvdlSchdulManage.insertIndvdlSchdulManage", indvdlSchdulManageVO);
|
||||
}
|
||||
|
||||
/**
|
||||
* 일정를(을) 수정한다.
|
||||
* @param indvdlSchdulManageVO - 일정 정보 담김 VO
|
||||
* @throws Exception
|
||||
*/
|
||||
public void updateIndvdlSchdulManage(IndvdlSchdulManageVO indvdlSchdulManageVO) throws Exception {
|
||||
insert("IndvdlSchdulManage.updateIndvdlSchdulManage", indvdlSchdulManageVO);
|
||||
}
|
||||
|
||||
/**
|
||||
* 일정를(을) 삭제한다.
|
||||
* @param indvdlSchdulManageVO - 일정 정보 담김 VO
|
||||
* @throws Exception
|
||||
*/
|
||||
public void deleteIndvdlSchdulManage(IndvdlSchdulManageVO indvdlSchdulManageVO) throws Exception {
|
||||
// 일지 삭제
|
||||
//delete("IndvdlSchdulManage.deleteDiaryManage", indvdlSchdulManageVO);
|
||||
// 일정관리 삭제
|
||||
delete("IndvdlSchdulManage.deleteIndvdlSchdulManage", indvdlSchdulManageVO);
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,106 @@
|
|||
package com.dbnt.kcscbackend.admin.committee.schedules.repository;
|
||||
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
|
||||
import java.io.Serializable;
|
||||
|
||||
/**
|
||||
* 일정관리 VO Class 구현
|
||||
* @since 2009.04.10
|
||||
* @see
|
||||
* <pre>
|
||||
* << 개정이력(Modification Information) >> 수정일 수정자 수정내용 ------- ---
|
||||
* ----- --------------------------- 2009.04.10 장동한 최초 생성 2011.05.31
|
||||
* JJY 경량환경 커스터마이징버전 생성
|
||||
* </pre>
|
||||
* @author 조재영
|
||||
* @version 1.0
|
||||
* @created 09-6-2011 오전 10:08:07
|
||||
*/
|
||||
@Getter
|
||||
@Setter
|
||||
public class IndvdlSchdulManageVO implements Serializable {
|
||||
|
||||
/**
|
||||
* serialVersionUID
|
||||
*/
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
/** 일정ID */
|
||||
private String schdulId;
|
||||
|
||||
/** 일정구분(회의/교육/세미나/강의 기타) */
|
||||
private String schdulSe;
|
||||
|
||||
/** 일정부서ID */
|
||||
private String schdulDeptId;
|
||||
|
||||
/** 일정종류(부서일정/개인일정) */
|
||||
private String schdulKindCode;
|
||||
|
||||
/** 일정시작일자 */
|
||||
private String schdulBgnde;
|
||||
|
||||
/** 일정종료일자 */
|
||||
private String schdulEndde;
|
||||
|
||||
/** 일정명 */
|
||||
private String schdulNm;
|
||||
|
||||
/** 일정내용 */
|
||||
private String schdulCn;
|
||||
|
||||
/** 일정장소 */
|
||||
private String schdulPlace;
|
||||
|
||||
/** 일정중요도코드 */
|
||||
private String schdulIpcrCode;
|
||||
|
||||
/** 일정담담자ID */
|
||||
private String schdulChargerId;
|
||||
|
||||
/** 첨부파일ID */
|
||||
private String atchFileId;
|
||||
|
||||
/** 반복구분(반복, 연속, 요일반복) */
|
||||
private String reptitSeCode;
|
||||
|
||||
/** 최초등록시점 */
|
||||
private String frstRegisterPnttm = "";
|
||||
|
||||
/** 최초등록자ID */
|
||||
private String frstRegisterId = "";
|
||||
|
||||
/** 최종수정시점 */
|
||||
private String lastUpdusrPnttm = "";
|
||||
|
||||
/** 최종수정ID */
|
||||
private String lastUpdusrId = "";
|
||||
|
||||
/** 일정시작일자(시간) */
|
||||
private String schdulBgndeHH = "";
|
||||
|
||||
/** 일정시작일자(분) */
|
||||
private String schdulBgndeMM = "";
|
||||
|
||||
/** 일정종료일자(시간) */
|
||||
private String schdulEnddeHH = "";
|
||||
|
||||
/** 일정종료일자(분) */
|
||||
private String schdulEnddeMM = "";
|
||||
|
||||
/** 일정시작일자(Year/Month/Day) */
|
||||
private String schdulBgndeYYYMMDD = "";
|
||||
|
||||
/** 일정종료일자(Year/Month/Day) */
|
||||
private String schdulEnddeYYYMMDD = "";
|
||||
|
||||
/** 담당부서 */
|
||||
private String schdulDeptName = "";
|
||||
|
||||
/** 담당자명 */
|
||||
private String schdulChargerName = "";
|
||||
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,79 @@
|
|||
package com.dbnt.kcscbackend.admin.committee.schedules.repository;
|
||||
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
|
||||
import javax.validation.constraints.Email;
|
||||
import java.io.Serializable;
|
||||
|
||||
/**
|
||||
* @Class Name : LoginVO.java
|
||||
* @Description : Login VO class
|
||||
* @Modification Information
|
||||
* @
|
||||
* @ 수정일 수정자 수정내용
|
||||
* @ ------- -------- ---------------------------
|
||||
* @ 2009.03.03 박지욱 최초 생성
|
||||
*
|
||||
* @author 공통서비스 개발팀 박지욱
|
||||
* @since 2009.03.03
|
||||
* @version 1.0
|
||||
* @see
|
||||
*
|
||||
*/
|
||||
@Schema(description = "사용자 정보 VO")
|
||||
@Getter
|
||||
@Setter
|
||||
public class LoginVO implements Serializable{
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
private static final long serialVersionUID = -8274004534207618049L;
|
||||
|
||||
@Schema(description = "아이디")
|
||||
private String id;
|
||||
|
||||
@Schema(description = "이름")
|
||||
private String name;
|
||||
|
||||
@Schema(description = "주민등록번호")
|
||||
private String ihidNum;
|
||||
|
||||
@Email(regexp = "[a-z0-9._%+-]+@[a-z0-9.-]+\\.[a-z]{2,3}")
|
||||
@Schema(description = "이메일주소")
|
||||
private String email;
|
||||
|
||||
@Schema(description = "비밀번호")
|
||||
private String password;
|
||||
|
||||
@Schema(description = "비밀번호 힌트")
|
||||
private String passwordHint;
|
||||
|
||||
@Schema(description = "비밀번호 정답")
|
||||
private String passwordCnsr;
|
||||
|
||||
@Schema(description = "사용자 구분", allowableValues = {"GNR", "ENT", "USR"}, defaultValue = "USR")
|
||||
private String userSe;
|
||||
|
||||
@Schema(description = "조직(부서)ID")
|
||||
private String orgnztId;
|
||||
|
||||
@Schema(description = "조직(부서)명")
|
||||
private String orgnztNm;
|
||||
|
||||
@Schema(description = "고유아이디")
|
||||
private String uniqId;
|
||||
|
||||
@Schema(description = "로그인 후 이동할 페이지")
|
||||
private String url;
|
||||
|
||||
@Schema(description = "사용자 IP정보")
|
||||
private String ip;
|
||||
|
||||
@Schema(description = "GPKI인증 DN")
|
||||
private String dn;
|
||||
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,50 @@
|
|||
package com.dbnt.kcscbackend.admin.committee.schedules.repository;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author : 정완배
|
||||
* @since : 2023. 8. 9.
|
||||
* @version : 1.0
|
||||
*
|
||||
* @package : egovframework.com.cmm
|
||||
* @filename : ResponseCode.java
|
||||
* @modificationInformation
|
||||
*
|
||||
* <pre>
|
||||
* << 개정이력(Modification Information) >>
|
||||
*
|
||||
* 수정일 수정자 수정내용
|
||||
* ---------- ---------- ----------------------
|
||||
* 2023. 8. 9. 정완배 주석추가
|
||||
* </pre>
|
||||
*
|
||||
*
|
||||
*/
|
||||
public enum ResponseCode {
|
||||
|
||||
SUCCESS(200, "성공했습니다."),
|
||||
AUTH_ERROR(403, "인가된 사용자가 아닙니다."),
|
||||
DELETE_ERROR(700, "삭제 중 내부 오류가 발생했습니다."),
|
||||
SAVE_ERROR(800, "저장시 내부 오류가 발생했습니다."),
|
||||
INPUT_CHECK_ERROR(900, "입력값 무결성 오류 입니다.");
|
||||
|
||||
private int code;
|
||||
private String message;
|
||||
|
||||
private ResponseCode(int code, String message) {
|
||||
this.code = code;
|
||||
this.message = message;
|
||||
}
|
||||
|
||||
public int getCode() {
|
||||
return code;
|
||||
}
|
||||
|
||||
public String getMessage() {
|
||||
return message;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,70 @@
|
|||
package com.dbnt.kcscbackend.admin.committee.schedules.service;
|
||||
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
|
||||
import java.io.Serializable;
|
||||
|
||||
/**
|
||||
* 공통상세코드 모델 클래스
|
||||
* @author 공통서비스 개발팀 이중호
|
||||
* @since 2009.04.01
|
||||
* @version 1.0
|
||||
* @see
|
||||
*
|
||||
* <pre>
|
||||
* << 개정이력(Modification Information) >>
|
||||
*
|
||||
* 수정일 수정자 수정내용
|
||||
* ------- -------- ---------------------------
|
||||
* 2009.04.01 이중호 최초 생성
|
||||
*
|
||||
* </pre>
|
||||
*/
|
||||
@Getter
|
||||
@Setter
|
||||
public class CmmnDetailCode implements Serializable {
|
||||
|
||||
private static final long serialVersionUID = -6508801327314181679L;
|
||||
|
||||
/*
|
||||
* 코드ID
|
||||
*/
|
||||
private String codeId = "";
|
||||
|
||||
/*
|
||||
* 코드ID명
|
||||
*/
|
||||
private String codeIdNm = "";
|
||||
|
||||
/*
|
||||
* 코드
|
||||
*/
|
||||
private String code = "";
|
||||
|
||||
/*
|
||||
* 코드명
|
||||
*/
|
||||
private String codeNm = "";
|
||||
|
||||
/*
|
||||
* 코드설명
|
||||
*/
|
||||
private String codeDc = "";
|
||||
|
||||
/*
|
||||
* 사용여부
|
||||
*/
|
||||
private String useAt = "";
|
||||
|
||||
/*
|
||||
* 최초등록자ID
|
||||
*/
|
||||
private String frstRegisterId = "";
|
||||
|
||||
/*
|
||||
* 최종수정자ID
|
||||
*/
|
||||
private String lastUpdusrId = "";
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,63 @@
|
|||
package com.dbnt.kcscbackend.admin.committee.schedules.service;
|
||||
|
||||
|
||||
import com.dbnt.kcscbackend.admin.committee.schedules.repository.ComDefaultCodeVO;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
*
|
||||
* 공통코드등 전체 업무에서 공용해서 사용해야 하는 서비스를 정의하기 위한 서비스 인터페이스
|
||||
* @author 공통서비스 개발팀 이삼섭
|
||||
* @since 2009.04.01
|
||||
* @version 1.0
|
||||
* @see
|
||||
*
|
||||
* <pre>
|
||||
* << 개정이력(Modification Information) >>
|
||||
*
|
||||
* 수정일 수정자 수정내용
|
||||
* ------- -------- ---------------------------
|
||||
* 2009.03.11 이삼섭 최초 생성
|
||||
*
|
||||
* </pre>
|
||||
*/
|
||||
public interface EgovCmmUseService {
|
||||
|
||||
/**
|
||||
* 공통코드를 조회한다.
|
||||
*
|
||||
* @param vo
|
||||
* @return List(코드)
|
||||
* @throws Exception
|
||||
*/
|
||||
public List<CmmnDetailCode> selectCmmCodeDetail(ComDefaultCodeVO vo) throws Exception;
|
||||
|
||||
/**
|
||||
* ComDefaultCodeVO의 리스트를 받아서 여러개의 코드 리스트를 맵에 담아서 리턴한다.
|
||||
*
|
||||
* @param voList
|
||||
* @return Map(코드)
|
||||
* @throws Exception
|
||||
*/
|
||||
public Map<String, List<CmmnDetailCode>> selectCmmCodeDetails(List<?> voList) throws Exception;
|
||||
|
||||
/**
|
||||
* 조직정보를 코드형태로 리턴한다.
|
||||
*
|
||||
* @param 조회조건정보 vo
|
||||
* @return 조직정보 List
|
||||
* @throws Exception
|
||||
*/
|
||||
public List<CmmnDetailCode> selectOgrnztIdDetail(ComDefaultCodeVO vo) throws Exception;
|
||||
|
||||
/**
|
||||
* 그룹정보를 코드형태로 리턴한다.
|
||||
*
|
||||
* @param 조회조건정보 vo
|
||||
* @return 그룹정보 List
|
||||
* @throws Exception
|
||||
*/
|
||||
public List<CmmnDetailCode> selectGroupIdDetail(ComDefaultCodeVO vo) throws Exception;
|
||||
}
|
||||
|
|
@ -0,0 +1,32 @@
|
|||
package com.dbnt.kcscbackend.admin.committee.schedules.service;
|
||||
|
||||
import org.apache.ibatis.session.SqlSessionFactory;
|
||||
import org.egovframe.rte.psl.dataaccess.EgovAbstractMapper;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
|
||||
/**
|
||||
* EgovComAbstractDAO.java 클래스
|
||||
*
|
||||
* @author 서준식
|
||||
* @since 2011. 9. 23.
|
||||
* @version 1.0
|
||||
* @see
|
||||
*
|
||||
* <pre>
|
||||
* << 개정이력(Modification Information) >>
|
||||
*
|
||||
* 수정일 수정자 수정내용
|
||||
* ------- ------------- ----------------------
|
||||
* 2011. 9. 23. 서준식 최초 생성
|
||||
* </pre>
|
||||
*/
|
||||
public abstract class EgovComAbstractDAO extends EgovAbstractMapper {
|
||||
|
||||
@Override
|
||||
@Resource(name = "egov.sqlSession")
|
||||
public void setSqlSessionFactory(SqlSessionFactory sqlSession) {
|
||||
super.setSqlSessionFactory(sqlSession);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,117 @@
|
|||
package com.dbnt.kcscbackend.admin.committee.schedules.service;
|
||||
|
||||
import com.dbnt.kcscbackend.admin.committee.schedules.repository.FileVO;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* @Class Name : EgovFileMngService.java
|
||||
* @Description : 파일정보의 관리를 위한 서비스 인터페이스
|
||||
* @Modification Information
|
||||
*
|
||||
* 수정일 수정자 수정내용
|
||||
* ------- ------- -------------------
|
||||
* 2009. 3. 25. 이삼섭 최초생성
|
||||
*
|
||||
* @author 공통 서비스 개발팀 이삼섭
|
||||
* @since 2009. 3. 25.
|
||||
* @version
|
||||
* @see
|
||||
*
|
||||
*/
|
||||
public interface EgovFileMngService {
|
||||
|
||||
/**
|
||||
* 파일에 대한 목록을 조회한다.
|
||||
*
|
||||
* @param fvo
|
||||
* @return
|
||||
* @throws Exception
|
||||
*/
|
||||
public List<FileVO> selectFileInfs(FileVO fvo) throws Exception;
|
||||
|
||||
/**
|
||||
* 하나의 파일에 대한 정보(속성 및 상세)를 등록한다.
|
||||
*
|
||||
* @param fvo
|
||||
* @throws Exception
|
||||
*/
|
||||
public String insertFileInf(FileVO fvo) throws Exception;
|
||||
|
||||
/**
|
||||
* 여러 개의 파일에 대한 정보(속성 및 상세)를 등록한다.
|
||||
*
|
||||
* @param fvoList
|
||||
* @throws Exception
|
||||
*/
|
||||
public String insertFileInfs(List<?> fvoList) throws Exception;
|
||||
|
||||
/**
|
||||
* 여러 개의 파일에 대한 정보(속성 및 상세)를 수정한다.
|
||||
*
|
||||
* @param fvoList
|
||||
* @throws Exception
|
||||
*/
|
||||
public void updateFileInfs(List<?> fvoList) throws Exception;
|
||||
|
||||
/**
|
||||
* 여러 개의 파일을 삭제한다.
|
||||
*
|
||||
* @param fvoList
|
||||
* @throws Exception
|
||||
*/
|
||||
public void deleteFileInfs(List<?> fvoList) throws Exception;
|
||||
|
||||
/**
|
||||
* 하나의 파일을 삭제한다.
|
||||
*
|
||||
* @param fvo
|
||||
* @throws Exception
|
||||
*/
|
||||
public void deleteFileInf(FileVO fvo) throws Exception;
|
||||
|
||||
/**
|
||||
* 파일에 대한 상세정보를 조회한다.
|
||||
*
|
||||
* @param fvo
|
||||
* @return
|
||||
* @throws Exception
|
||||
*/
|
||||
public FileVO selectFileInf(FileVO fvo) throws Exception;
|
||||
|
||||
/**
|
||||
* 파일 구분자에 대한 최대값을 구한다.
|
||||
*
|
||||
* @param fvo
|
||||
* @return
|
||||
* @throws Exception
|
||||
*/
|
||||
public int getMaxFileSN(FileVO fvo) throws Exception;
|
||||
|
||||
/**
|
||||
* 전체 파일을 삭제한다.
|
||||
*
|
||||
* @param fvo
|
||||
* @throws Exception
|
||||
*/
|
||||
public void deleteAllFileInf(FileVO fvo) throws Exception;
|
||||
|
||||
/**
|
||||
* 파일명 검색에 대한 목록을 조회한다.
|
||||
*
|
||||
* @param fvo
|
||||
* @return
|
||||
* @throws Exception
|
||||
*/
|
||||
public Map<String, Object> selectFileListByFileNm(FileVO fvo) throws Exception;
|
||||
|
||||
/**
|
||||
* 이미지 파일에 대한 목록을 조회한다.
|
||||
*
|
||||
* @param vo
|
||||
* @return
|
||||
* @throws Exception
|
||||
*/
|
||||
public List<FileVO> selectImageFileList(FileVO vo) throws Exception;
|
||||
}
|
||||
|
|
@ -0,0 +1,113 @@
|
|||
package com.dbnt.kcscbackend.admin.committee.schedules.service;
|
||||
|
||||
|
||||
import com.dbnt.kcscbackend.admin.committee.schedules.repository.ComDefaultVO;
|
||||
import com.dbnt.kcscbackend.admin.committee.schedules.repository.IndvdlSchdulManageVO;
|
||||
import com.dbnt.kcscbackend.admin.config.entity.TcCodeItem;
|
||||
import com.dbnt.kcscbackend.config.common.ResultVO;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* 일정관리를 처리하는 서비스인터페이스 클래스
|
||||
* @since 2009.04.10
|
||||
* @see
|
||||
* <pre>
|
||||
* << 개정이력(Modification Information) >>
|
||||
* 수정일 수정자 수정내용
|
||||
* ------- -------- ---------------------------
|
||||
* 2009.04.10 장동한 최초 생성
|
||||
* 2011.05.31 JJY 경량환경 커스터마이징버전 생성
|
||||
* </pre>
|
||||
* @author 조재영
|
||||
* @version 1.0
|
||||
* @created 09-6-2011 오전 10:08:04
|
||||
*/
|
||||
public interface EgovIndvdlSchdulManageService {
|
||||
|
||||
/**
|
||||
* 일정를(을) 삭제한다.
|
||||
*
|
||||
* @param indvdlSchdulManageVO - 일정 정보 담김 VO
|
||||
* @exception Exception Exception
|
||||
*/
|
||||
public void deleteIndvdlSchdulManage(IndvdlSchdulManageVO indvdlSchdulManageVO) throws Exception;
|
||||
|
||||
/**
|
||||
* 일정를(을) 등록한다.
|
||||
*
|
||||
* @param indvdlSchdulManageVO - 일정 정보 담김 VO
|
||||
* @exception Exception Exception
|
||||
*/
|
||||
public void insertIndvdlSchdulManage(IndvdlSchdulManageVO indvdlSchdulManageVO) throws Exception;
|
||||
|
||||
/**
|
||||
* 일정를(을) 상세조회 한다.
|
||||
* @return List
|
||||
*
|
||||
* @param indvdlSchdulManageVO - 일정 정보 담김 VO
|
||||
* @exception Exception Exception
|
||||
*/
|
||||
public IndvdlSchdulManageVO selectIndvdlSchdulManageDetail(IndvdlSchdulManageVO indvdlSchdulManageVO) throws Exception;
|
||||
|
||||
/**
|
||||
* 일정 목록을 VO(model)형식으로 조회한다.
|
||||
* @return List
|
||||
*
|
||||
* @param indvdlSchdulManageVO - 조회할 정보가 담긴 VO
|
||||
* @exception Exception Exception
|
||||
*/
|
||||
public IndvdlSchdulManageVO selectIndvdlSchdulManageDetailVO(IndvdlSchdulManageVO indvdlSchdulManageVO) throws Exception;
|
||||
|
||||
/**
|
||||
* 일정 목록을 조회한다.
|
||||
* @return List
|
||||
*
|
||||
* @param searchVO - 조회할 정보가 담긴 VO
|
||||
* @exception Exception Exception
|
||||
*/
|
||||
public List<?> selectIndvdlSchdulManageList(ComDefaultVO searchVO) throws Exception;
|
||||
|
||||
/**
|
||||
* 일정를(을) 목록 전체 건수를(을) 조회한다.
|
||||
* @return int
|
||||
*
|
||||
* @param searchVO - 조회할 정보가 담긴 VO
|
||||
* @exception Exception Exception
|
||||
*/
|
||||
public int selectIndvdlSchdulManageListCnt(ComDefaultVO searchVO) throws Exception;
|
||||
|
||||
/**
|
||||
* 메인페이지/일정관리조회
|
||||
* @return List
|
||||
*
|
||||
* @param map - 조회할 정보가 담긴 map
|
||||
* @exception Exception Exception
|
||||
*/
|
||||
public List<?> selectIndvdlSchdulManageMainList(Map<?, ?> map) throws Exception;
|
||||
|
||||
/**
|
||||
* 일정 목록을 Map(map)형식으로 조회한다.
|
||||
* @param Map(map) - 조회할 정보가 담긴 Map
|
||||
* @return List
|
||||
*
|
||||
* @param map
|
||||
* @exception Exception Exception
|
||||
*/
|
||||
public List<?> selectIndvdlSchdulManageRetrieve(Map<?, ?> map) throws Exception;
|
||||
|
||||
/**
|
||||
* 일정를(을) 수정한다.
|
||||
*
|
||||
* @param indvdlSchdulManageVO - 일정 정보 담김 VO
|
||||
* @exception Exception Exception
|
||||
*/
|
||||
public void updateIndvdlSchdulManage(IndvdlSchdulManageVO indvdlSchdulManageVO) throws Exception;
|
||||
|
||||
|
||||
public ResultVO ScheduleInit(ResultVO resultVO) throws Exception;
|
||||
|
||||
public ResultVO ScheduleApiOrgApiDepthList(ResultVO resultVO, Integer paramCodeGroup) throws Exception;
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,94 @@
|
|||
package com.dbnt.kcscbackend.admin.committee.schedules.service.impl;
|
||||
|
||||
|
||||
import com.dbnt.kcscbackend.admin.committee.schedules.repository.CmmUseDAO;
|
||||
import com.dbnt.kcscbackend.admin.committee.schedules.repository.ComDefaultCodeVO;
|
||||
import com.dbnt.kcscbackend.admin.committee.schedules.service.CmmnDetailCode;
|
||||
import com.dbnt.kcscbackend.admin.committee.schedules.service.EgovCmmUseService;
|
||||
import org.egovframe.rte.fdl.cmmn.EgovAbstractServiceImpl;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import java.util.HashMap;
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* @Class Name : EgovCmmUseServiceImpl.java
|
||||
* @Description : 공통코드등 전체 업무에서 공용해서 사용해야 하는 서비스를 정의하기위한 서비스 구현 클래스
|
||||
* @Modification Information
|
||||
*
|
||||
* 수정일 수정자 수정내용
|
||||
* ------- ------- -------------------
|
||||
* 2009. 3. 11. 이삼섭
|
||||
*
|
||||
* @author 공통 서비스 개발팀 이삼섭
|
||||
* @since 2009. 3. 11.
|
||||
* @version
|
||||
* @see
|
||||
*
|
||||
*/
|
||||
@Service("EgovCmmUseService")
|
||||
public class EgovCmmUseServiceImpl extends EgovAbstractServiceImpl implements EgovCmmUseService {
|
||||
|
||||
@Resource(name = "cmmUseDAO")
|
||||
private CmmUseDAO cmmUseDAO;
|
||||
|
||||
/**
|
||||
* 공통코드를 조회한다.
|
||||
*
|
||||
* @param vo
|
||||
* @return
|
||||
* @throws Exception
|
||||
*/
|
||||
@Override
|
||||
public List<CmmnDetailCode> selectCmmCodeDetail(ComDefaultCodeVO vo) throws Exception {
|
||||
return cmmUseDAO.selectCmmCodeDetail(vo);
|
||||
}
|
||||
|
||||
/**
|
||||
* ComDefaultCodeVO의 리스트를 받아서 여러개의 코드 리스트를 맵에 담아서 리턴한다.
|
||||
*
|
||||
* @param voList
|
||||
* @return
|
||||
* @throws Exception
|
||||
*/
|
||||
@Override
|
||||
public Map<String, List<CmmnDetailCode>> selectCmmCodeDetails(List<?> voList) throws Exception {
|
||||
ComDefaultCodeVO vo;
|
||||
Map<String, List<CmmnDetailCode>> map = new HashMap<String, List<CmmnDetailCode>>();
|
||||
|
||||
Iterator<?> iter = voList.iterator();
|
||||
while (iter.hasNext()) {
|
||||
vo = (ComDefaultCodeVO) iter.next();
|
||||
map.put(vo.getCodeId(), cmmUseDAO.selectCmmCodeDetail(vo));
|
||||
}
|
||||
|
||||
return map;
|
||||
}
|
||||
|
||||
/**
|
||||
* 조직정보를 코드형태로 리턴한다.
|
||||
*
|
||||
* @param 조회조건정보 vo
|
||||
* @return 조직정보 List
|
||||
* @throws Exception
|
||||
*/
|
||||
@Override
|
||||
public List<CmmnDetailCode> selectOgrnztIdDetail(ComDefaultCodeVO vo) throws Exception {
|
||||
return cmmUseDAO.selectOgrnztIdDetail(vo);
|
||||
}
|
||||
|
||||
/**
|
||||
* 그룹정보를 코드형태로 리턴한다.
|
||||
*
|
||||
* @param 조회조건정보 vo
|
||||
* @return 그룹정보 List
|
||||
* @throws Exception
|
||||
*/
|
||||
@Override
|
||||
public List<CmmnDetailCode> selectGroupIdDetail(ComDefaultCodeVO vo) throws Exception {
|
||||
return cmmUseDAO.selectGroupIdDetail(vo);
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,178 @@
|
|||
package com.dbnt.kcscbackend.admin.committee.schedules.service.impl;
|
||||
|
||||
import com.dbnt.kcscbackend.admin.committee.schedules.repository.FileManageDAO;
|
||||
import com.dbnt.kcscbackend.admin.committee.schedules.repository.FileVO;
|
||||
import com.dbnt.kcscbackend.admin.committee.schedules.service.EgovFileMngService;
|
||||
import org.egovframe.rte.fdl.cmmn.EgovAbstractServiceImpl;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* @Class Name : EgovFileMngServiceImpl.java
|
||||
* @Description : 파일정보의 관리를 위한 구현 클래스
|
||||
* @Modification Information
|
||||
*
|
||||
* 수정일 수정자 수정내용
|
||||
* ------- ------- -------------------
|
||||
* 2009. 3. 25. 이삼섭 최초생성
|
||||
*
|
||||
* @author 공통 서비스 개발팀 이삼섭
|
||||
* @since 2009. 3. 25.
|
||||
* @version
|
||||
* @see
|
||||
*
|
||||
*/
|
||||
@Service("EgovFileMngService")
|
||||
public class EgovFileMngServiceImpl extends EgovAbstractServiceImpl implements EgovFileMngService {
|
||||
|
||||
@Resource(name = "FileManageDAO")
|
||||
private FileManageDAO fileMngDAO;
|
||||
|
||||
|
||||
/**
|
||||
* 여러 개의 파일을 삭제한다.
|
||||
* @param fvoList
|
||||
* @throws Exception
|
||||
*/
|
||||
@Override
|
||||
public void deleteFileInfs(List<?> fvoList) throws Exception {
|
||||
fileMngDAO.deleteFileInfs(fvoList);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 하나의 파일에 대한 정보(속성 및 상세)를 등록한다.
|
||||
* @param fvo
|
||||
* @return
|
||||
* @throws Exception
|
||||
*/
|
||||
@Override
|
||||
public String insertFileInf(FileVO fvo) throws Exception {
|
||||
String atchFileId = fvo.getAtchFileId();
|
||||
|
||||
fileMngDAO.insertFileInf(fvo);
|
||||
|
||||
return atchFileId;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 여러 개의 파일에 대한 정보(속성 및 상세)를 등록한다.
|
||||
* @param fvoList
|
||||
* @return
|
||||
* @throws Exception
|
||||
*/
|
||||
@Override
|
||||
public String insertFileInfs(List<?> fvoList) throws Exception {
|
||||
String atchFileId = "";
|
||||
|
||||
if (fvoList.size() != 0) {
|
||||
atchFileId = fileMngDAO.insertFileInfs(fvoList);
|
||||
}
|
||||
if("".equals(atchFileId)){
|
||||
atchFileId = null;
|
||||
}
|
||||
return atchFileId;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 파일에 대한 목록을 조회한다.
|
||||
* @param fvo
|
||||
* @return
|
||||
* @throws Exception
|
||||
*/
|
||||
@Override
|
||||
public List<FileVO> selectFileInfs(FileVO fvo) throws Exception {
|
||||
return fileMngDAO.selectFileInfs(fvo);
|
||||
}
|
||||
|
||||
/**
|
||||
* 여러 개의 파일에 대한 정보(속성 및 상세)를 수정한다.
|
||||
* @param fvoList
|
||||
* @throws Exception
|
||||
*/
|
||||
@Override
|
||||
public void updateFileInfs(List<?> fvoList) throws Exception {
|
||||
//Delete & Insert
|
||||
fileMngDAO.updateFileInfs(fvoList);
|
||||
}
|
||||
|
||||
/**
|
||||
* 하나의 파일을 삭제한다.
|
||||
* @param fvo
|
||||
* @throws Exception
|
||||
*/
|
||||
@Override
|
||||
public void deleteFileInf(FileVO fvo) throws Exception {
|
||||
fileMngDAO.deleteFileInf(fvo);
|
||||
}
|
||||
|
||||
/**
|
||||
* 파일에 대한 상세정보를 조회한다.
|
||||
* @param fvo
|
||||
* @return
|
||||
* @throws Exception
|
||||
*/
|
||||
@Override
|
||||
public FileVO selectFileInf(FileVO fvo) throws Exception {
|
||||
return fileMngDAO.selectFileInf(fvo);
|
||||
}
|
||||
|
||||
/**
|
||||
* 파일 구분자에 대한 최대값을 구한다.
|
||||
* @param fvo
|
||||
* @return
|
||||
* @throws Exception
|
||||
*/
|
||||
@Override
|
||||
public int getMaxFileSN(FileVO fvo) throws Exception {
|
||||
return fileMngDAO.getMaxFileSN(fvo);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 전체 파일을 삭제한다.
|
||||
* @param fvo
|
||||
* @throws Exception
|
||||
*/
|
||||
@Override
|
||||
public void deleteAllFileInf(FileVO fvo) throws Exception {
|
||||
fileMngDAO.deleteAllFileInf(fvo);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 파일명 검색에 대한 목록을 조회한다.
|
||||
* @param fvo
|
||||
* @return
|
||||
* @throws Exception
|
||||
*/
|
||||
@Override
|
||||
public Map<String, Object> selectFileListByFileNm(FileVO fvo) throws Exception {
|
||||
List<FileVO> result = fileMngDAO.selectFileListByFileNm(fvo);
|
||||
int cnt = fileMngDAO.selectFileListCntByFileNm(fvo);
|
||||
|
||||
Map<String, Object> map = new HashMap<String, Object>();
|
||||
|
||||
map.put("resultList", result);
|
||||
map.put("resultCnt", Integer.toString(cnt));
|
||||
|
||||
return map;
|
||||
}
|
||||
|
||||
/**
|
||||
* 이미지 파일에 대한 목록을 조회한다.
|
||||
* @param vo
|
||||
* @return
|
||||
* @throws Exception
|
||||
*/
|
||||
@Override
|
||||
public List<FileVO> selectImageFileList(FileVO vo) throws Exception {
|
||||
return fileMngDAO.selectImageFileList(vo);
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,195 @@
|
|||
package com.dbnt.kcscbackend.admin.committee.schedules.service.impl;
|
||||
|
||||
|
||||
import com.dbnt.kcscbackend.admin.committee.schedules.repository.ComDefaultVO;
|
||||
import com.dbnt.kcscbackend.admin.committee.schedules.repository.IndvdlSchdulManageDao;
|
||||
import com.dbnt.kcscbackend.admin.committee.schedules.repository.IndvdlSchdulManageVO;
|
||||
import com.dbnt.kcscbackend.admin.committee.schedules.service.EgovIndvdlSchdulManageService;
|
||||
import com.dbnt.kcscbackend.admin.config.entity.TcCodeItem;
|
||||
import com.dbnt.kcscbackend.admin.config.repository.TcCodeItemRepository;
|
||||
import com.dbnt.kcscbackend.admin.config.repository.TnCmtOrgRepository;
|
||||
import com.dbnt.kcscbackend.config.common.ResultVO;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import org.egovframe.rte.fdl.cmmn.EgovAbstractServiceImpl;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
/**
|
||||
* 일정관리를 처리하는 ServiceImpl Class 구현
|
||||
* @since 2009.04.10
|
||||
* @see
|
||||
* <pre>
|
||||
* << 개정이력(Modification Information) >> 수정일 수정자 수정내용 ------- ---
|
||||
* ----- --------------------------- 2009.04.10 장동한 최초 생성 2011.05.31
|
||||
* JJY 경량환경 커스터마이징버전 생성
|
||||
* </pre>
|
||||
* @author 조재영
|
||||
* @version 1.0
|
||||
* @created 09-6-2011 오전 10:08:05
|
||||
*/
|
||||
@Service("egovIndvdlSchdulManageService")
|
||||
@RequiredArgsConstructor
|
||||
public class EgovIndvdlSchdulManageServiceImpl extends EgovAbstractServiceImpl implements EgovIndvdlSchdulManageService {
|
||||
|
||||
@Resource(name="indvdlSchdulManageDao")
|
||||
private IndvdlSchdulManageDao dao;
|
||||
|
||||
|
||||
|
||||
private final TcCodeItemRepository tcCodeItemRepository;
|
||||
private final TnCmtOrgRepository tnCmtOrgRepository;
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* 메인페이지/일정관리조회
|
||||
* @param map - 조회할 정보가 담긴 map
|
||||
* @return List
|
||||
* @throws Exception
|
||||
*/
|
||||
@Override
|
||||
public List<?> selectIndvdlSchdulManageMainList(Map<?, ?> map) throws Exception{
|
||||
return dao.selectIndvdlSchdulManageMainList(map);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 일정 목록을 Map(map)형식으로 조회한다.
|
||||
* @param map
|
||||
* @return
|
||||
* @throws Exception
|
||||
*/
|
||||
@Override
|
||||
public List<?> selectIndvdlSchdulManageRetrieve(Map<?, ?> map) throws Exception{
|
||||
return dao.selectIndvdlSchdulManageRetrieve(map);
|
||||
}
|
||||
|
||||
/**
|
||||
* 일정 목록을 VO(model)형식으로 조회한다.
|
||||
* @param indvdlSchdulManageVO - 조회할 정보가 담긴 VO
|
||||
* @return List
|
||||
* @throws Exception
|
||||
*/
|
||||
@Override
|
||||
public IndvdlSchdulManageVO selectIndvdlSchdulManageDetailVO(IndvdlSchdulManageVO indvdlSchdulManageVO) throws Exception{
|
||||
return dao.selectIndvdlSchdulManageDetailVO(indvdlSchdulManageVO);
|
||||
}
|
||||
|
||||
/**
|
||||
* 일정 목록을 조회한다.
|
||||
* @param searchVO - 조회할 정보가 담긴 VO
|
||||
* @return List
|
||||
* @throws Exception
|
||||
*/
|
||||
@Override
|
||||
public List<?> selectIndvdlSchdulManageList(ComDefaultVO searchVO) throws Exception{
|
||||
return dao.selectIndvdlSchdulManageList(searchVO);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 일정를(을) 상세조회 한다.
|
||||
* @param indvdlSchdulManageVO - 일정 정보 담김 VO
|
||||
* @return
|
||||
* @throws Exception
|
||||
*/
|
||||
@Override
|
||||
public IndvdlSchdulManageVO selectIndvdlSchdulManageDetail(IndvdlSchdulManageVO indvdlSchdulManageVO) throws Exception{
|
||||
return dao.selectIndvdlSchdulManageDetail(indvdlSchdulManageVO);
|
||||
}
|
||||
|
||||
/**
|
||||
* 일정를(을) 목록 전체 건수를(을) 조회한다.
|
||||
* @param searchVO - 조회할 정보가 담긴 VO
|
||||
* @return int
|
||||
* @throws Exception
|
||||
*/
|
||||
@Override
|
||||
public int selectIndvdlSchdulManageListCnt(ComDefaultVO searchVO) throws Exception{
|
||||
return dao.selectIndvdlSchdulManageListCnt(searchVO);
|
||||
}
|
||||
|
||||
/**
|
||||
* 일정를(을) 등록한다.
|
||||
* @param indvdlSchdulManageVO - 조회할 정보가 담긴 VO
|
||||
* @throws Exception
|
||||
*/
|
||||
@Override
|
||||
public void insertIndvdlSchdulManage(IndvdlSchdulManageVO indvdlSchdulManageVO) throws Exception {
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* 일정를(을) 수정한다.
|
||||
* @param indvdlSchdulManageVO - 조회할 정보가 담긴 VO
|
||||
* @throws Exception
|
||||
*/
|
||||
@Override
|
||||
public void updateIndvdlSchdulManage(IndvdlSchdulManageVO indvdlSchdulManageVO) throws Exception{
|
||||
dao.updateIndvdlSchdulManage(indvdlSchdulManageVO);
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* 일정를(을) 삭제한다.
|
||||
* @param indvdlSchdulManageVO - 조회할 정보가 담긴 VO
|
||||
* @throws Exception
|
||||
*/
|
||||
@Override
|
||||
public void deleteIndvdlSchdulManage(IndvdlSchdulManageVO indvdlSchdulManageVO) throws Exception{
|
||||
dao.deleteIndvdlSchdulManage(indvdlSchdulManageVO);
|
||||
}
|
||||
|
||||
@Override
|
||||
public ResultVO ScheduleInit(ResultVO resultVO) throws Exception {
|
||||
|
||||
Map<String, Object> resultMap = new HashMap<String, Object>();
|
||||
|
||||
List<String> listCodes = tcCodeItemRepository.findByGrpCdAndUseYnOrderByGrpOrder("EVT_TYPE", "Y").stream()
|
||||
.map(lc -> lc.getItemNm())
|
||||
.collect(Collectors.toList());
|
||||
List<String> listSubOrg = tnCmtOrgRepository.findByUseYnAndUpCmtSeqOrderByCmtOrder("Y", 3).stream()
|
||||
.map(lc -> lc.getCmtNm())
|
||||
.collect(Collectors.toList());
|
||||
List<String> listTopOrg = tnCmtOrgRepository.findByUseYnAndUpCmtSeqOrderByCmtOrder("Y", 2).stream()
|
||||
.map(lc -> lc.getCmtNm())
|
||||
.collect(Collectors.toList());
|
||||
|
||||
resultMap.put("listCodes", listCodes);
|
||||
resultMap.put("listSubOrg", listSubOrg);
|
||||
resultMap.put("listTopOrg", listTopOrg);
|
||||
resultVO.setResult(resultMap);
|
||||
|
||||
return resultVO;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ResultVO ScheduleApiOrgApiDepthList(ResultVO resultVO, Integer paramCodeGroup) throws Exception {
|
||||
Map<String, Object> resultMap = new HashMap<String, Object>();
|
||||
|
||||
List<String> listCodes = tcCodeItemRepository.findByGrpCdAndUseYnOrderByGrpOrder("EVT_TYPE", "Y").stream()
|
||||
.map(lc -> lc.getItemNm())
|
||||
.collect(Collectors.toList());
|
||||
List<String> listSubOrg = tnCmtOrgRepository.findByUseYnAndUpCmtSeqOrderByCmtOrder("Y", 3).stream()
|
||||
.map(lc -> lc.getCmtNm())
|
||||
.collect(Collectors.toList());
|
||||
List<String> listTopOrg = tnCmtOrgRepository.findByUseYnAndUpCmtSeqOrderByCmtOrder("Y", 2).stream()
|
||||
.map(lc -> lc.getCmtNm())
|
||||
.collect(Collectors.toList());
|
||||
|
||||
resultMap.put("listCodes", listCodes);
|
||||
resultMap.put("listSubOrg", listSubOrg);
|
||||
resultMap.put("listTopOrg", listTopOrg);
|
||||
resultVO.setResult(resultMap);
|
||||
|
||||
return resultVO;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,96 @@
|
|||
package com.dbnt.kcscbackend.admin.committee.schedules.util;
|
||||
|
||||
import org.egovframe.rte.fdl.idgnr.impl.EgovTableIdGnrServiceImpl;
|
||||
import org.egovframe.rte.fdl.idgnr.impl.strategy.EgovIdGnrStrategyImpl;
|
||||
|
||||
import javax.sql.DataSource;
|
||||
|
||||
/**
|
||||
* @ClassName : EgovIdGnrBuilder.java
|
||||
* @Description : IdGen 정보 builder
|
||||
*
|
||||
* @author : 윤주호
|
||||
* @since : 2021. 7. 20
|
||||
* @version : 1.0
|
||||
*
|
||||
* <pre>
|
||||
* << 개정이력(Modification Information) >>
|
||||
*
|
||||
* 수정일 수정자 수정내용
|
||||
* ------------- ------------ ---------------------
|
||||
* 2021. 7. 20 윤주호 최초 생성
|
||||
* </pre>
|
||||
*
|
||||
*/
|
||||
public class EgovIdGnrBuilder {
|
||||
|
||||
// TODO : 기본값 설정, 예외처리 필요
|
||||
|
||||
private DataSource dataSource;
|
||||
private EgovIdGnrStrategyImpl egovIdGnrStrategyImpl;
|
||||
|
||||
private String preFix;
|
||||
private int cipers;
|
||||
private char fillChar;
|
||||
|
||||
private int blockSize;
|
||||
private String table;
|
||||
private String tableName;
|
||||
|
||||
public EgovIdGnrBuilder setDataSource(DataSource dataSource) {
|
||||
this.dataSource = dataSource;
|
||||
return this;
|
||||
}
|
||||
|
||||
public EgovIdGnrBuilder setEgovIdGnrStrategyImpl(EgovIdGnrStrategyImpl egovIdGnrStrategyImpl) {
|
||||
this.egovIdGnrStrategyImpl = egovIdGnrStrategyImpl;
|
||||
return this;
|
||||
}
|
||||
|
||||
public EgovIdGnrBuilder setPreFix(String preFix) {
|
||||
this.preFix = preFix;
|
||||
return this;
|
||||
}
|
||||
public EgovIdGnrBuilder setCipers(int cipers) {
|
||||
this.cipers = cipers;
|
||||
return this;
|
||||
}
|
||||
public EgovIdGnrBuilder setFillChar(char fillChar) {
|
||||
this.fillChar = fillChar;
|
||||
return this;
|
||||
}
|
||||
public EgovIdGnrBuilder setBlockSize(int blockSize) {
|
||||
this.blockSize = blockSize;
|
||||
return this;
|
||||
}
|
||||
public EgovIdGnrBuilder setTable(String table) {
|
||||
this.table = table;
|
||||
return this;
|
||||
}
|
||||
public EgovIdGnrBuilder setTableName(String tableName) {
|
||||
this.tableName = tableName;
|
||||
return this;
|
||||
}
|
||||
|
||||
public EgovTableIdGnrServiceImpl build() {
|
||||
|
||||
EgovTableIdGnrServiceImpl egovTableIdGnrServiceImpl = new EgovTableIdGnrServiceImpl();
|
||||
egovTableIdGnrServiceImpl.setDataSource(dataSource);
|
||||
if(egovIdGnrStrategyImpl != null) {
|
||||
egovIdGnrStrategyImpl = new EgovIdGnrStrategyImpl();
|
||||
egovIdGnrStrategyImpl.setPrefix(preFix);
|
||||
egovIdGnrStrategyImpl.setCipers(cipers);
|
||||
egovIdGnrStrategyImpl.setFillChar(fillChar);
|
||||
|
||||
egovTableIdGnrServiceImpl.setStrategy(egovIdGnrStrategyImpl);
|
||||
}
|
||||
egovTableIdGnrServiceImpl.setBlockSize(blockSize);
|
||||
egovTableIdGnrServiceImpl.setTable(table);
|
||||
egovTableIdGnrServiceImpl.setTableName(tableName);
|
||||
|
||||
return egovTableIdGnrServiceImpl;
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,888 @@
|
|||
/**
|
||||
* @Class Name : EgovStringUtil.java
|
||||
* @Description : 문자열 데이터 처리 관련 유틸리티
|
||||
* @Modification Information
|
||||
*
|
||||
* 수정일 수정자 수정내용
|
||||
* ------- -------- ---------------------------
|
||||
* 2009.01.13 박정규 최초 생성
|
||||
* 2009.02.13 이삼섭 내용 추가
|
||||
*
|
||||
* @author 공통 서비스 개발팀 박정규
|
||||
* @since 2009. 01. 13
|
||||
* @version 1.0
|
||||
* @see
|
||||
*
|
||||
*/
|
||||
|
||||
package com.dbnt.kcscbackend.admin.committee.schedules.util;
|
||||
|
||||
/*
|
||||
* Copyright 2001-2006 The Apache Software Foundation.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the ";License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS"; BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
import java.io.UnsupportedEncodingException;
|
||||
import java.math.BigDecimal;
|
||||
import java.security.SecureRandom;
|
||||
import java.sql.Timestamp;
|
||||
import java.text.SimpleDateFormat;
|
||||
import java.util.Locale;
|
||||
|
||||
public class EgovStringUtil {
|
||||
|
||||
/**
|
||||
* 빈 문자열 <code>""</code>.
|
||||
*/
|
||||
public static final String EMPTY = "";
|
||||
|
||||
/**
|
||||
* 랜덤 객체
|
||||
*/
|
||||
public static SecureRandom rnd = new SecureRandom();
|
||||
|
||||
/**
|
||||
* <p>Padding을 할 수 있는 최대 수치</p>
|
||||
*/
|
||||
// private static final int PAD_LIMIT = 8192;
|
||||
/**
|
||||
* <p>An array of <code>String</code>s used for padding.</p>
|
||||
* <p>Used for efficient space padding. The length of each String expands as needed.</p>
|
||||
*/
|
||||
/*
|
||||
private static final String[] PADDING = new String[Character.MAX_VALUE];
|
||||
|
||||
static {
|
||||
// space padding is most common, start with 64 chars
|
||||
PADDING[32] = " ";
|
||||
}
|
||||
*/
|
||||
|
||||
/**
|
||||
* 문자열이 지정한 길이를 초과했을때 지정한길이에다가 해당 문자열을 붙여주는 메서드.
|
||||
* @param source 원본 문자열 배열
|
||||
* @param output 더할문자열
|
||||
* @param slength 지정길이
|
||||
* @return 지정길이로 잘라서 더할분자열 합친 문자열
|
||||
*/
|
||||
public static String cutString(String source, String output, int slength) {
|
||||
String returnVal = null;
|
||||
if (source != null) {
|
||||
if (source.length() > slength) {
|
||||
returnVal = source.substring(0, slength) + output;
|
||||
} else {
|
||||
returnVal = source;
|
||||
}
|
||||
}
|
||||
return returnVal;
|
||||
}
|
||||
|
||||
/**
|
||||
* 문자열이 지정한 길이를 초과했을때 해당 문자열을 삭제하는 메서드
|
||||
* @param source 원본 문자열 배열
|
||||
* @param slength 지정길이
|
||||
* @return 지정길이로 잘라서 더할분자열 합친 문자열
|
||||
*/
|
||||
public static String cutString(String source, int slength) {
|
||||
String result = null;
|
||||
if (source != null) {
|
||||
if (source.length() > slength) {
|
||||
result = source.substring(0, slength);
|
||||
} else {
|
||||
result = source;
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* <p>
|
||||
* String이 비었거나("") 혹은 null 인지 검증한다.
|
||||
* </p>
|
||||
*
|
||||
* <pre>
|
||||
* StringUtil.isEmpty(null) = true
|
||||
* StringUtil.isEmpty("") = true
|
||||
* StringUtil.isEmpty(" ") = false
|
||||
* StringUtil.isEmpty("bob") = false
|
||||
* StringUtil.isEmpty(" bob ") = false
|
||||
* </pre>
|
||||
*
|
||||
* @param str - 체크 대상 스트링오브젝트이며 null을 허용함
|
||||
* @return <code>true</code> - 입력받은 String 이 빈 문자열 또는 null인 경우
|
||||
*/
|
||||
public static boolean isEmpty(String str) {
|
||||
return str == null || str.length() == 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* <p>기준 문자열에 포함된 모든 대상 문자(char)를 제거한다.</p>
|
||||
*
|
||||
* <pre>
|
||||
* StringUtil.remove(null, *) = null
|
||||
* StringUtil.remove("", *) = ""
|
||||
* StringUtil.remove("queued", 'u') = "qeed"
|
||||
* StringUtil.remove("queued", 'z') = "queued"
|
||||
* </pre>
|
||||
*
|
||||
* @param str 입력받는 기준 문자열
|
||||
* @param remove 입력받는 문자열에서 제거할 대상 문자열
|
||||
* @return 제거대상 문자열이 제거된 입력문자열. 입력문자열이 null인 경우 출력문자열은 null
|
||||
*/
|
||||
public static String remove(String str, char remove) {
|
||||
if (isEmpty(str) || str.indexOf(remove) == -1) {
|
||||
return str;
|
||||
}
|
||||
char[] chars = str.toCharArray();
|
||||
int pos = 0;
|
||||
for (int i = 0; i < chars.length; i++) {
|
||||
if (chars[i] != remove) {
|
||||
chars[pos++] = chars[i];
|
||||
}
|
||||
}
|
||||
return new String(chars, 0, pos);
|
||||
}
|
||||
|
||||
/**
|
||||
* <p>문자열 내부의 콤마 character(,)를 모두 제거한다.</p>
|
||||
*
|
||||
* <pre>
|
||||
* StringUtil.removeCommaChar(null) = null
|
||||
* StringUtil.removeCommaChar("") = ""
|
||||
* StringUtil.removeCommaChar("asdfg,qweqe") = "asdfgqweqe"
|
||||
* </pre>
|
||||
*
|
||||
* @param str 입력받는 기준 문자열
|
||||
* @return " , "가 제거된 입력문자열
|
||||
* 입력문자열이 null인 경우 출력문자열은 null
|
||||
*/
|
||||
public static String removeCommaChar(String str) {
|
||||
return remove(str, ',');
|
||||
}
|
||||
|
||||
/**
|
||||
* <p>문자열 내부의 마이너스 character(-)를 모두 제거한다.</p>
|
||||
*
|
||||
* <pre>
|
||||
* StringUtil.removeMinusChar(null) = null
|
||||
* StringUtil.removeMinusChar("") = ""
|
||||
* StringUtil.removeMinusChar("a-sdfg-qweqe") = "asdfgqweqe"
|
||||
* </pre>
|
||||
*
|
||||
* @param str 입력받는 기준 문자열
|
||||
* @return " - "가 제거된 입력문자열
|
||||
* 입력문자열이 null인 경우 출력문자열은 null
|
||||
*/
|
||||
public static String removeMinusChar(String str) {
|
||||
return remove(str, '-');
|
||||
}
|
||||
|
||||
/**
|
||||
* 원본 문자열의 포함된 특정 문자열을 새로운 문자열로 변환하는 메서드
|
||||
* @param source 원본 문자열
|
||||
* @param subject 원본 문자열에 포함된 특정 문자열
|
||||
* @param object 변환할 문자열
|
||||
* @return sb.toString() 새로운 문자열로 변환된 문자열
|
||||
*/
|
||||
public static String replace(String source, String subject, String object) {
|
||||
StringBuffer rtnStr = new StringBuffer();
|
||||
String preStr = "";
|
||||
String nextStr = source;
|
||||
String srcStr = source;
|
||||
|
||||
while (srcStr.indexOf(subject) >= 0) {
|
||||
preStr = srcStr.substring(0, srcStr.indexOf(subject));
|
||||
nextStr = srcStr.substring(srcStr.indexOf(subject) + subject.length(), srcStr.length());
|
||||
srcStr = nextStr;
|
||||
rtnStr.append(preStr).append(object);
|
||||
}
|
||||
rtnStr.append(nextStr);
|
||||
return rtnStr.toString();
|
||||
}
|
||||
|
||||
/**
|
||||
* 원본 문자열의 포함된 특정 문자열 첫번째 한개만 새로운 문자열로 변환하는 메서드
|
||||
* @param source 원본 문자열
|
||||
* @param subject 원본 문자열에 포함된 특정 문자열
|
||||
* @param object 변환할 문자열
|
||||
* @return sb.toString() 새로운 문자열로 변환된 문자열 / source 특정문자열이 없는 경우 원본 문자열
|
||||
*/
|
||||
public static String replaceOnce(String source, String subject, String object) {
|
||||
StringBuffer rtnStr = new StringBuffer();
|
||||
String preStr = "";
|
||||
String nextStr = source;
|
||||
if (source.indexOf(subject) >= 0) {
|
||||
preStr = source.substring(0, source.indexOf(subject));
|
||||
nextStr = source.substring(source.indexOf(subject) + subject.length(), source.length());
|
||||
rtnStr.append(preStr).append(object).append(nextStr);
|
||||
return rtnStr.toString();
|
||||
} else {
|
||||
return source;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* <code>subject</code>에 포함된 각각의 문자를 object로 변환한다.
|
||||
*
|
||||
* @param source 원본 문자열
|
||||
* @param subject 원본 문자열에 포함된 특정 문자열
|
||||
* @param object 변환할 문자열
|
||||
* @return sb.toString() 새로운 문자열로 변환된 문자열
|
||||
*/
|
||||
public static String replaceChar(String source, String subject, String object) {
|
||||
StringBuffer rtnStr = new StringBuffer();
|
||||
String preStr = "";
|
||||
String nextStr = source;
|
||||
String srcStr = source;
|
||||
|
||||
char chA;
|
||||
|
||||
for (int i = 0; i < subject.length(); i++) {
|
||||
chA = subject.charAt(i);
|
||||
|
||||
if (srcStr.indexOf(chA) >= 0) {
|
||||
preStr = srcStr.substring(0, srcStr.indexOf(chA));
|
||||
nextStr = srcStr.substring(srcStr.indexOf(chA) + 1, srcStr.length());
|
||||
srcStr = rtnStr.append(preStr).append(object).append(nextStr).toString();
|
||||
}
|
||||
}
|
||||
|
||||
return srcStr;
|
||||
}
|
||||
|
||||
/**
|
||||
* <p><code>str</code> 중 <code>searchStr</code>의 시작(index) 위치를 반환.</p>
|
||||
*
|
||||
* <p>입력값 중 <code>null</code>이 있을 경우 <code>-1</code>을 반환.</p>
|
||||
*
|
||||
* <pre>
|
||||
* StringUtil.indexOf(null, *) = -1
|
||||
* StringUtil.indexOf(*, null) = -1
|
||||
* StringUtil.indexOf("", "") = 0
|
||||
* StringUtil.indexOf("aabaabaa", "a") = 0
|
||||
* StringUtil.indexOf("aabaabaa", "b") = 2
|
||||
* StringUtil.indexOf("aabaabaa", "ab") = 1
|
||||
* StringUtil.indexOf("aabaabaa", "") = 0
|
||||
* </pre>
|
||||
*
|
||||
* @param str 검색 문자열
|
||||
* @param searchStr 검색 대상문자열
|
||||
* @return 검색 문자열 중 검색 대상문자열이 있는 시작 위치 검색대상 문자열이 없거나 null인 경우 -1
|
||||
*/
|
||||
public static int indexOf(String str, String searchStr) {
|
||||
if (str == null || searchStr == null) {
|
||||
return -1;
|
||||
}
|
||||
return str.indexOf(searchStr);
|
||||
}
|
||||
|
||||
/**
|
||||
* <p>오라클의 decode 함수와 동일한 기능을 가진 메서드이다.
|
||||
* <code>sourStr</code>과 <code>compareStr</code>의 값이 같으면
|
||||
* <code>returStr</code>을 반환하며, 다르면 <code>defaultStr</code>을 반환한다.
|
||||
* </p>
|
||||
*
|
||||
* <pre>
|
||||
* StringUtil.decode(null, null, "foo", "bar")= "foo"
|
||||
* StringUtil.decode("", null, "foo", "bar") = "bar"
|
||||
* StringUtil.decode(null, "", "foo", "bar") = "bar"
|
||||
* StringUtil.decode("하이", "하이", null, "bar") = null
|
||||
* StringUtil.decode("하이", "하이 ", "foo", null) = null
|
||||
* StringUtil.decode("하이", "하이", "foo", "bar") = "foo"
|
||||
* StringUtil.decode("하이", "하이 ", "foo", "bar") = "bar"
|
||||
* </pre>
|
||||
*
|
||||
* @param sourceStr 비교할 문자열
|
||||
* @param compareStr 비교 대상 문자열
|
||||
* @param returnStr sourceStr와 compareStr의 값이 같을 때 반환할 문자열
|
||||
* @param defaultStr sourceStr와 compareStr의 값이 다를 때 반환할 문자열
|
||||
* @return sourceStr과 compareStr의 값이 동일(equal)할 때 returnStr을 반환하며,
|
||||
* <br/>다르면 defaultStr을 반환한다.
|
||||
*/
|
||||
public static String decode(String sourceStr, String compareStr, String returnStr, String defaultStr) {
|
||||
if (sourceStr == null && compareStr == null) {
|
||||
return returnStr;
|
||||
}
|
||||
|
||||
else if (sourceStr != null && sourceStr.trim().equals(compareStr)) {
|
||||
return returnStr;
|
||||
}
|
||||
|
||||
return defaultStr;
|
||||
}
|
||||
|
||||
/**
|
||||
* <p>오라클의 decode 함수와 동일한 기능을 가진 메서드이다.
|
||||
* <code>sourStr</code>과 <code>compareStr</code>의 값이 같으면
|
||||
* <code>returStr</code>을 반환하며, 다르면 <code>sourceStr</code>을 반환한다.
|
||||
* </p>
|
||||
*
|
||||
* <pre>
|
||||
* StringUtil.decode(null, null, "foo") = "foo"
|
||||
* StringUtil.decode("", null, "foo") = ""
|
||||
* StringUtil.decode(null, "", "foo") = null
|
||||
* StringUtil.decode("하이", "하이", "foo") = "foo"
|
||||
* StringUtil.decode("하이", "하이 ", "foo") = "하이"
|
||||
* StringUtil.decode("하이", "바이", "foo") = "하이"
|
||||
* </pre>
|
||||
*
|
||||
* @param sourceStr 비교할 문자열
|
||||
* @param compareStr 비교 대상 문자열
|
||||
* @param returnStr sourceStr와 compareStr의 값이 같을 때 반환할 문자열
|
||||
* @return sourceStr과 compareStr의 값이 동일(equal)할 때 returnStr을 반환하며,
|
||||
* <br/>다르면 sourceStr을 반환한다.
|
||||
*/
|
||||
public static String decode(String sourceStr, String compareStr, String returnStr) {
|
||||
return decode(sourceStr, compareStr, returnStr, sourceStr);
|
||||
}
|
||||
|
||||
/**
|
||||
* 객체가 null인지 확인하고 null인 경우 "" 로 바꾸는 메서드
|
||||
* @param object 원본 객체
|
||||
* @return resultVal 문자열
|
||||
*/
|
||||
public static String isNullToString(Object object) {
|
||||
String string = "";
|
||||
|
||||
if (object != null) {
|
||||
string = object.toString().trim();
|
||||
}
|
||||
|
||||
return string;
|
||||
}
|
||||
|
||||
/**
|
||||
*<pre>
|
||||
* 인자로 받은 String이 null일 경우 ""로 리턴한다.
|
||||
* @param src null값일 가능성이 있는 String 값.
|
||||
* @return 만약 String이 null 값일 경우 ""로 바꾼 String 값.
|
||||
*</pre>
|
||||
*/
|
||||
public static String nullConvert(Object src) {
|
||||
//if (src != null && src.getClass().getName().equals("java.math.BigDecimal")) {
|
||||
if (src != null && src instanceof BigDecimal) {
|
||||
return ((BigDecimal)src).toString();
|
||||
}
|
||||
|
||||
if (src == null || src.equals("null")) {
|
||||
return "";
|
||||
} else {
|
||||
return ((String)src).trim();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
*<pre>
|
||||
* 인자로 받은 String이 null일 경우 ""로 리턴한다.
|
||||
* @param src null값일 가능성이 있는 String 값.
|
||||
* @return 만약 String이 null 값일 경우 ""로 바꾼 String 값.
|
||||
*</pre>
|
||||
*/
|
||||
public static String nullConvert(String src) {
|
||||
|
||||
if (src == null || src.equals("null") || "".equals(src) || " ".equals(src)) {
|
||||
return "";
|
||||
} else {
|
||||
return src.trim();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
*<pre>
|
||||
* 인자로 받은 String이 null일 경우 "0"로 리턴한다.
|
||||
* @param src null값일 가능성이 있는 String 값.
|
||||
* @return 만약 String이 null 값일 경우 "0"로 바꾼 String 값.
|
||||
*</pre>
|
||||
*/
|
||||
public static int zeroConvert(Object src) {
|
||||
|
||||
if (src == null || src.equals("null")) {
|
||||
return 0;
|
||||
} else {
|
||||
return Integer.parseInt(((String)src).trim());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
*<pre>
|
||||
* 인자로 받은 String이 null일 경우 ""로 리턴한다.
|
||||
* @param src null값일 가능성이 있는 String 값.
|
||||
* @return 만약 String이 null 값일 경우 ""로 바꾼 String 값.
|
||||
*</pre>
|
||||
*/
|
||||
public static int zeroConvert(String src) {
|
||||
|
||||
if (src == null || src.equals("null") || "".equals(src) || " ".equals(src)) {
|
||||
return 0;
|
||||
} else {
|
||||
return Integer.parseInt(src.trim());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* <p>문자열에서 {@link Character#isWhitespace(char)}에 정의된
|
||||
* 모든 공백문자를 제거한다.</p>
|
||||
*
|
||||
* <pre>
|
||||
* StringUtil.removeWhitespace(null) = null
|
||||
* StringUtil.removeWhitespace("") = ""
|
||||
* StringUtil.removeWhitespace("abc") = "abc"
|
||||
* StringUtil.removeWhitespace(" ab c ") = "abc"
|
||||
* </pre>
|
||||
*
|
||||
* @param str 공백문자가 제거도어야 할 문자열
|
||||
* @return the 공백문자가 제거된 문자열, null이 입력되면 <code>null</code>이 리턴
|
||||
*/
|
||||
public static String removeWhitespace(String str) {
|
||||
if (isEmpty(str)) {
|
||||
return str;
|
||||
}
|
||||
int sz = str.length();
|
||||
char[] chs = new char[sz];
|
||||
int count = 0;
|
||||
for (int i = 0; i < sz; i++) {
|
||||
if (!Character.isWhitespace(str.charAt(i))) {
|
||||
chs[count++] = str.charAt(i);
|
||||
}
|
||||
}
|
||||
if (count == sz) {
|
||||
return str;
|
||||
}
|
||||
|
||||
return new String(chs, 0, count);
|
||||
}
|
||||
|
||||
/**
|
||||
* Html 코드가 들어간 문서를 표시할때 태그에 손상없이 보이기 위한 메서드
|
||||
*
|
||||
* @param strString
|
||||
* @return HTML 태그를 치환한 문자열
|
||||
*/
|
||||
public static String checkHtmlView(String strString) {
|
||||
String strNew = "";
|
||||
|
||||
StringBuffer strTxt = new StringBuffer("");
|
||||
|
||||
char chrBuff;
|
||||
int len = strString.length();
|
||||
|
||||
for (int i = 0; i < len; i++) {
|
||||
chrBuff = strString.charAt(i);
|
||||
|
||||
switch (chrBuff) {
|
||||
case '<':
|
||||
strTxt.append("<");
|
||||
break;
|
||||
case '>':
|
||||
strTxt.append(">");
|
||||
break;
|
||||
case '"':
|
||||
strTxt.append(""");
|
||||
break;
|
||||
case 10:
|
||||
strTxt.append("<br>");
|
||||
break;
|
||||
case ' ':
|
||||
strTxt.append(" ");
|
||||
break;
|
||||
//case '&' :
|
||||
//strTxt.append("&");
|
||||
//break;
|
||||
default:
|
||||
strTxt.append(chrBuff);
|
||||
}
|
||||
}
|
||||
|
||||
strNew = strTxt.toString();
|
||||
|
||||
return strNew;
|
||||
}
|
||||
|
||||
/**
|
||||
* 문자열을 지정한 분리자에 의해 배열로 리턴하는 메서드.
|
||||
* @param source 원본 문자열
|
||||
* @param separator 분리자
|
||||
* @return result 분리자로 나뉘어진 문자열 배열
|
||||
*/
|
||||
public static String[] split(String source, String separator) throws NullPointerException {
|
||||
String[] returnVal = null;
|
||||
int cnt = 1;
|
||||
|
||||
int index = source.indexOf(separator);
|
||||
int index0 = 0;
|
||||
while (index >= 0) {
|
||||
cnt++;
|
||||
index = source.indexOf(separator, index + 1);
|
||||
}
|
||||
returnVal = new String[cnt];
|
||||
cnt = 0;
|
||||
index = source.indexOf(separator);
|
||||
while (index >= 0) {
|
||||
returnVal[cnt] = source.substring(index0, index);
|
||||
index0 = index + 1;
|
||||
index = source.indexOf(separator, index + 1);
|
||||
cnt++;
|
||||
}
|
||||
returnVal[cnt] = source.substring(index0);
|
||||
|
||||
return returnVal;
|
||||
}
|
||||
|
||||
/**
|
||||
* <p>{@link String#toLowerCase()}를 이용하여 소문자로 변환한다.</p>
|
||||
*
|
||||
* <pre>
|
||||
* StringUtil.lowerCase(null) = null
|
||||
* StringUtil.lowerCase("") = ""
|
||||
* StringUtil.lowerCase("aBc") = "abc"
|
||||
* </pre>
|
||||
*
|
||||
* @param str 소문자로 변환되어야 할 문자열
|
||||
* @return 소문자로 변환된 문자열, null이 입력되면 <code>null</code> 리턴
|
||||
*/
|
||||
public static String lowerCase(String str) {
|
||||
if (str == null) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return str.toLowerCase();
|
||||
}
|
||||
|
||||
/**
|
||||
* <p>{@link String#toUpperCase()}를 이용하여 대문자로 변환한다.</p>
|
||||
*
|
||||
* <pre>
|
||||
* StringUtil.upperCase(null) = null
|
||||
* StringUtil.upperCase("") = ""
|
||||
* StringUtil.upperCase("aBc") = "ABC"
|
||||
* </pre>
|
||||
*
|
||||
* @param str 대문자로 변환되어야 할 문자열
|
||||
* @return 대문자로 변환된 문자열, null이 입력되면 <code>null</code> 리턴
|
||||
*/
|
||||
public static String upperCase(String str) {
|
||||
if (str == null) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return str.toUpperCase();
|
||||
}
|
||||
|
||||
/**
|
||||
* <p>입력된 String의 앞쪽에서 두번째 인자로 전달된 문자(stripChars)를 모두 제거한다.</p>
|
||||
*
|
||||
* <pre>
|
||||
* StringUtil.stripStart(null, *) = null
|
||||
* StringUtil.stripStart("", *) = ""
|
||||
* StringUtil.stripStart("abc", "") = "abc"
|
||||
* StringUtil.stripStart("abc", null) = "abc"
|
||||
* StringUtil.stripStart(" abc", null) = "abc"
|
||||
* StringUtil.stripStart("abc ", null) = "abc "
|
||||
* StringUtil.stripStart(" abc ", null) = "abc "
|
||||
* StringUtil.stripStart("yxabc ", "xyz") = "abc "
|
||||
* </pre>
|
||||
*
|
||||
* @param str 지정된 문자가 제거되어야 할 문자열
|
||||
* @param stripChars 제거대상 문자열
|
||||
* @return 지정된 문자가 제거된 문자열, null이 입력되면 <code>null</code> 리턴
|
||||
*/
|
||||
public static String stripStart(String str, String stripChars) {
|
||||
int strLen;
|
||||
if (str == null || (strLen = str.length()) == 0) {
|
||||
return str;
|
||||
}
|
||||
int start = 0;
|
||||
if (stripChars == null) {
|
||||
while ((start != strLen) && Character.isWhitespace(str.charAt(start))) {
|
||||
start++;
|
||||
}
|
||||
} else if (stripChars.length() == 0) {
|
||||
return str;
|
||||
} else {
|
||||
while ((start != strLen) && (stripChars.indexOf(str.charAt(start)) != -1)) {
|
||||
start++;
|
||||
}
|
||||
}
|
||||
|
||||
return str.substring(start);
|
||||
}
|
||||
|
||||
/**
|
||||
* <p>입력된 String의 뒤쪽에서 두번째 인자로 전달된 문자(stripChars)를 모두 제거한다.</p>
|
||||
*
|
||||
* <pre>
|
||||
* StringUtil.stripEnd(null, *) = null
|
||||
* StringUtil.stripEnd("", *) = ""
|
||||
* StringUtil.stripEnd("abc", "") = "abc"
|
||||
* StringUtil.stripEnd("abc", null) = "abc"
|
||||
* StringUtil.stripEnd(" abc", null) = " abc"
|
||||
* StringUtil.stripEnd("abc ", null) = "abc"
|
||||
* StringUtil.stripEnd(" abc ", null) = " abc"
|
||||
* StringUtil.stripEnd(" abcyx", "xyz") = " abc"
|
||||
* </pre>
|
||||
*
|
||||
* @param str 지정된 문자가 제거되어야 할 문자열
|
||||
* @param stripChars 제거대상 문자열
|
||||
* @return 지정된 문자가 제거된 문자열, null이 입력되면 <code>null</code> 리턴
|
||||
*/
|
||||
public static String stripEnd(String str, String stripChars) {
|
||||
int end;
|
||||
if (str == null || (end = str.length()) == 0) {
|
||||
return str;
|
||||
}
|
||||
|
||||
if (stripChars == null) {
|
||||
while ((end != 0) && Character.isWhitespace(str.charAt(end - 1))) {
|
||||
end--;
|
||||
}
|
||||
} else if (stripChars.length() == 0) {
|
||||
return str;
|
||||
} else {
|
||||
while ((end != 0) && (stripChars.indexOf(str.charAt(end - 1)) != -1)) {
|
||||
end--;
|
||||
}
|
||||
}
|
||||
|
||||
return str.substring(0, end);
|
||||
}
|
||||
|
||||
/**
|
||||
* <p>입력된 String의 앞, 뒤에서 두번째 인자로 전달된 문자(stripChars)를 모두 제거한다.</p>
|
||||
*
|
||||
* <pre>
|
||||
* StringUtil.strip(null, *) = null
|
||||
* StringUtil.strip("", *) = ""
|
||||
* StringUtil.strip("abc", null) = "abc"
|
||||
* StringUtil.strip(" abc", null) = "abc"
|
||||
* StringUtil.strip("abc ", null) = "abc"
|
||||
* StringUtil.strip(" abc ", null) = "abc"
|
||||
* StringUtil.strip(" abcyx", "xyz") = " abc"
|
||||
* </pre>
|
||||
*
|
||||
* @param str 지정된 문자가 제거되어야 할 문자열
|
||||
* @param stripChars 제거대상 문자열
|
||||
* @return 지정된 문자가 제거된 문자열, null이 입력되면 <code>null</code> 리턴
|
||||
*/
|
||||
public static String strip(String str, String stripChars) {
|
||||
if (isEmpty(str)) {
|
||||
return str;
|
||||
}
|
||||
|
||||
String srcStr = str;
|
||||
srcStr = stripStart(srcStr, stripChars);
|
||||
|
||||
return stripEnd(srcStr, stripChars);
|
||||
}
|
||||
|
||||
/**
|
||||
* 문자열을 지정한 분리자에 의해 지정된 길이의 배열로 리턴하는 메서드.
|
||||
* @param source 원본 문자열
|
||||
* @param separator 분리자
|
||||
* @param arraylength 배열 길이
|
||||
* @return 분리자로 나뉘어진 문자열 배열
|
||||
*/
|
||||
public static String[] split(String source, String separator, int arraylength) throws NullPointerException {
|
||||
String[] returnVal = new String[arraylength];
|
||||
int cnt = 0;
|
||||
int index0 = 0;
|
||||
int index = source.indexOf(separator);
|
||||
while (index >= 0 && cnt < (arraylength - 1)) {
|
||||
returnVal[cnt] = source.substring(index0, index);
|
||||
index0 = index + 1;
|
||||
index = source.indexOf(separator, index + 1);
|
||||
cnt++;
|
||||
}
|
||||
returnVal[cnt] = source.substring(index0);
|
||||
if (cnt < (arraylength - 1)) {
|
||||
for (int i = cnt + 1; i < arraylength; i++) {
|
||||
returnVal[i] = "";
|
||||
}
|
||||
}
|
||||
|
||||
return returnVal;
|
||||
}
|
||||
|
||||
/**
|
||||
* 문자열 A에서 Z사이의 랜덤 문자열을 구하는 기능을 제공 시작문자열과 종료문자열 사이의 랜덤 문자열을 구하는 기능
|
||||
*
|
||||
* @param startChr
|
||||
* - 첫 문자
|
||||
* @param endChr
|
||||
* - 마지막문자
|
||||
* @return 랜덤문자
|
||||
* @exception MyException
|
||||
* @see
|
||||
*/
|
||||
public static String getRandomStr(char startChr, char endChr) {
|
||||
|
||||
int randomInt;
|
||||
String randomStr = null;
|
||||
|
||||
// 시작문자 및 종료문자를 아스키숫자로 변환한다.
|
||||
int startInt = Integer.valueOf(startChr);
|
||||
int endInt = Integer.valueOf(endChr);
|
||||
|
||||
// 시작문자열이 종료문자열보가 클경우
|
||||
if (startInt > endInt) {
|
||||
throw new IllegalArgumentException("Start String: " + startChr + " End String: " + endChr);
|
||||
}
|
||||
|
||||
do {
|
||||
// 시작문자 및 종료문자 중에서 랜덤 숫자를 발생시킨다.
|
||||
randomInt = rnd.nextInt(endInt + 1);
|
||||
} while (randomInt < startInt); // 입력받은 문자 'A'(65)보다 작으면 다시 랜덤 숫자 발생.
|
||||
|
||||
// 랜덤 숫자를 문자로 변환 후 스트링으로 다시 변환
|
||||
randomStr = (char)randomInt + "";
|
||||
|
||||
// 랜덤문자열를 리턴
|
||||
return randomStr;
|
||||
}
|
||||
|
||||
/**
|
||||
* 문자열을 다양한 문자셋(EUC-KR[KSC5601],UTF-8..)을 사용하여 인코딩하는 기능 역으로 디코딩하여 원래의 문자열을
|
||||
* 복원하는 기능을 제공함 String temp = new String(문자열.getBytes("바꾸기전 인코딩"),"바꿀 인코딩");
|
||||
* String temp = new String(문자열.getBytes("8859_1"),"KSC5601"); => UTF-8 에서
|
||||
* EUC-KR
|
||||
*
|
||||
* @param srcString
|
||||
* - 문자열
|
||||
* @param srcCharsetNm
|
||||
* - 원래 CharsetNm
|
||||
* @param charsetNm
|
||||
* - CharsetNm
|
||||
* @return 인(디)코딩 문자열
|
||||
* @exception MyException
|
||||
* @see
|
||||
*/
|
||||
public static String getEncdDcd(String srcString, String srcCharsetNm, String cnvrCharsetNm) {
|
||||
|
||||
String rtnStr = null;
|
||||
|
||||
if (srcString == null) {
|
||||
return null;
|
||||
}
|
||||
|
||||
try {
|
||||
rtnStr = new String(srcString.getBytes(srcCharsetNm), cnvrCharsetNm);
|
||||
} catch (UnsupportedEncodingException e) {
|
||||
rtnStr = null;
|
||||
}
|
||||
|
||||
return rtnStr;
|
||||
}
|
||||
|
||||
/**
|
||||
* 특수문자를 웹 브라우저에서 정상적으로 보이기 위해 특수문자를 처리('<' -> & lT)하는 기능이다
|
||||
* @param srcString - '<'
|
||||
* @return 변환문자열('<' -> "<"
|
||||
* @exception MyException
|
||||
* @see
|
||||
*/
|
||||
public static String getSpclStrCnvr(String srcString) {
|
||||
|
||||
String rtnStr = null;
|
||||
|
||||
StringBuffer strTxt = new StringBuffer("");
|
||||
|
||||
char chrBuff;
|
||||
int len = srcString.length();
|
||||
|
||||
for (int i = 0; i < len; i++) {
|
||||
chrBuff = srcString.charAt(i);
|
||||
|
||||
switch (chrBuff) {
|
||||
case '<':
|
||||
strTxt.append("<");
|
||||
break;
|
||||
case '>':
|
||||
strTxt.append(">");
|
||||
break;
|
||||
case '&':
|
||||
strTxt.append("&");
|
||||
break;
|
||||
default:
|
||||
strTxt.append(chrBuff);
|
||||
}
|
||||
}
|
||||
|
||||
rtnStr = strTxt.toString();
|
||||
|
||||
return rtnStr;
|
||||
}
|
||||
|
||||
/**
|
||||
* 응용어플리케이션에서 고유값을 사용하기 위해 시스템에서17자리의TIMESTAMP값을 구하는 기능
|
||||
*
|
||||
* @param
|
||||
* @return Timestamp 값
|
||||
* @exception MyException
|
||||
* @see
|
||||
*/
|
||||
public static String getTimeStamp() {
|
||||
|
||||
String rtnStr = null;
|
||||
|
||||
// 문자열로 변환하기 위한 패턴 설정(년도-월-일 시:분:초:초(자정이후 초))
|
||||
String pattern = "yyyyMMddhhmmssSSS";
|
||||
|
||||
SimpleDateFormat sdfCurrent = new SimpleDateFormat(pattern, Locale.KOREA);
|
||||
Timestamp ts = new Timestamp(System.currentTimeMillis());
|
||||
|
||||
rtnStr = sdfCurrent.format(ts.getTime());
|
||||
|
||||
return rtnStr;
|
||||
}
|
||||
|
||||
/**
|
||||
* html의 특수문자를 표현하기 위해
|
||||
*
|
||||
* @param srcString
|
||||
* @return String
|
||||
* @exception Exception
|
||||
* @see
|
||||
*/
|
||||
public static String getHtmlStrCnvr(String srcString) {
|
||||
|
||||
String tmpString = srcString;
|
||||
|
||||
tmpString = tmpString.replaceAll("<", "<");
|
||||
tmpString = tmpString.replaceAll(">", ">");
|
||||
tmpString = tmpString.replaceAll("&", "&");
|
||||
tmpString = tmpString.replaceAll(" ", " ");
|
||||
tmpString = tmpString.replaceAll("'", "\'");
|
||||
tmpString = tmpString.replaceAll(""", "\"");
|
||||
|
||||
return tmpString;
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* <p>날짜 형식의 문자열 내부에 마이너스 character(-)를 추가한다.</p>
|
||||
*
|
||||
* <pre>
|
||||
* StringUtil.addMinusChar("20100901") = "2010-09-01"
|
||||
* </pre>
|
||||
*
|
||||
* @param date 입력받는 문자열
|
||||
* @return " - "가 추가된 입력문자열
|
||||
*/
|
||||
public static String addMinusChar(String date) {
|
||||
if (date.length() == 8) {
|
||||
return date.substring(0, 4).concat("-").concat(date.substring(4, 6)).concat("-")
|
||||
.concat(date.substring(6, 8));
|
||||
} else {
|
||||
return "";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -1,8 +1,11 @@
|
|||
package com.dbnt.kcscbackend.admin.config;
|
||||
|
||||
import com.dbnt.kcscbackend.admin.config.entity.TcCodeGrp;
|
||||
import com.dbnt.kcscbackend.admin.config.entity.TcCodeItem;
|
||||
import com.dbnt.kcscbackend.admin.config.service.AdminConfigService;
|
||||
import com.dbnt.kcscbackend.auth.entity.LoginVO;
|
||||
import com.dbnt.kcscbackend.config.common.BaseController;
|
||||
import com.dbnt.kcscbackend.config.common.ResponseCode;
|
||||
import com.dbnt.kcscbackend.config.common.ResultVO;
|
||||
import io.swagger.v3.oas.annotations.Operation;
|
||||
import io.swagger.v3.oas.annotations.responses.ApiResponse;
|
||||
|
|
@ -10,10 +13,13 @@ import io.swagger.v3.oas.annotations.responses.ApiResponses;
|
|||
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import org.springframework.http.MediaType;
|
||||
import org.springframework.security.core.annotation.AuthenticationPrincipal;
|
||||
import org.springframework.web.bind.annotation.RequestBody;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.RequestMethod;
|
||||
import org.springframework.web.bind.annotation.RestController;
|
||||
|
||||
import java.time.LocalDateTime;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
|
|
@ -34,7 +40,7 @@ public class AdminConfigController extends BaseController {
|
|||
@ApiResponse(responseCode = "200", description = "조회 성공"),
|
||||
@ApiResponse(responseCode = "403", description = "인가된 사용자가 아님")
|
||||
})
|
||||
@RequestMapping(method = RequestMethod.GET, value = "/code-grp", consumes = MediaType.APPLICATION_JSON_VALUE)
|
||||
@RequestMapping(method = RequestMethod.GET, value = "/code-grp")
|
||||
public ResultVO getCodeGrp() throws Exception{
|
||||
ResultVO resultVO = new ResultVO();
|
||||
Map<String, Object> resultMap = new HashMap<>();
|
||||
|
|
@ -43,6 +49,80 @@ public class AdminConfigController extends BaseController {
|
|||
return resultVO;
|
||||
}
|
||||
|
||||
@Operation(
|
||||
summary = "기본코드 그룹 저장",
|
||||
description = "기본코드 그룹 저장",
|
||||
tags = {"AdminConfigController"}
|
||||
)
|
||||
@ApiResponses(value = {
|
||||
@ApiResponse(responseCode = "200", description = "저장 성공"),
|
||||
@ApiResponse(responseCode = "303", description = "만료된 토큰"),
|
||||
@ApiResponse(responseCode = "403", description = "인가된 사용자가 아님")
|
||||
})
|
||||
@RequestMapping(method = RequestMethod.POST, value = "/code-grp", consumes = MediaType.APPLICATION_JSON_VALUE)
|
||||
public ResultVO addCodeGrp(@RequestBody TcCodeGrp codeGrp, @AuthenticationPrincipal LoginVO user) throws Exception{
|
||||
ResultVO resultVO = new ResultVO();
|
||||
if(user == null){
|
||||
resultVO.setResultCode(ResponseCode.TOKEN_EXPIRED.getCode());
|
||||
}else{
|
||||
if(!user.getUserSe().equals("ACC_TP01")){
|
||||
resultVO.setResultCode(ResponseCode.AUTH_ERROR.getCode());
|
||||
resultVO.setResultMessage(ResponseCode.AUTH_ERROR.getMessage());
|
||||
}else if(codeGrp.getGrpCd().isEmpty()){
|
||||
resultVO.setResultCode(ResponseCode.INPUT_CHECK_ERROR.getCode());
|
||||
resultVO.setResultMessage(ResponseCode.INPUT_CHECK_ERROR.getMessage());
|
||||
}else{
|
||||
codeGrp.setFrstCrtDt(LocalDateTime.now());
|
||||
codeGrp.setFrstCrtId(user.getId());
|
||||
codeGrp.setUseYn("Y");
|
||||
String result = adminConfigService.addCodeGrp(codeGrp);
|
||||
if(result.equals("isSaved")){
|
||||
resultVO.setResultCode(ResponseCode.SAVE_ERROR.getCode());
|
||||
resultVO.setResultMessage("중복되는 코드그룹이 있습니다.");
|
||||
}else{
|
||||
resultVO.setResultCode(ResponseCode.SUCCESS.getCode());
|
||||
}
|
||||
}
|
||||
}
|
||||
return resultVO;
|
||||
}
|
||||
|
||||
@Operation(
|
||||
summary = "기본코드 그룹 수정",
|
||||
description = "기본코드 그룹 수정",
|
||||
tags = {"AdminConfigController"}
|
||||
)
|
||||
@ApiResponses(value = {
|
||||
@ApiResponse(responseCode = "200", description = "수정 성공"),
|
||||
@ApiResponse(responseCode = "303", description = "만료된 토큰"),
|
||||
@ApiResponse(responseCode = "403", description = "인가된 사용자가 아님")
|
||||
})
|
||||
@RequestMapping(method = RequestMethod.PUT, value = "/code-grp", consumes = MediaType.APPLICATION_JSON_VALUE)
|
||||
public ResultVO modifyCodeGrp(@RequestBody TcCodeGrp codeGrp, @AuthenticationPrincipal LoginVO user) throws Exception{
|
||||
ResultVO resultVO = new ResultVO();
|
||||
if(user == null){
|
||||
resultVO.setResultCode(ResponseCode.TOKEN_EXPIRED.getCode());
|
||||
}else{
|
||||
if(!user.getUserSe().equals("ACC_TP01")){
|
||||
resultVO.setResultCode(ResponseCode.AUTH_ERROR.getCode());
|
||||
resultVO.setResultMessage(ResponseCode.AUTH_ERROR.getMessage());
|
||||
}else if(codeGrp.getGrpCd().isEmpty()){
|
||||
resultVO.setResultCode(ResponseCode.INPUT_CHECK_ERROR.getCode());
|
||||
resultVO.setResultMessage(ResponseCode.INPUT_CHECK_ERROR.getMessage());
|
||||
}else{
|
||||
codeGrp.setLastChgDt(LocalDateTime.now());
|
||||
codeGrp.setLastChgId(user.getId());
|
||||
String result = adminConfigService.modifyCodeGrp(codeGrp);
|
||||
if(result.equals("modified")){
|
||||
resultVO.setResultCode(ResponseCode.SUCCESS.getCode());
|
||||
}else{
|
||||
resultVO.setResultCode(ResponseCode.SAVE_ERROR.getCode());
|
||||
}
|
||||
}
|
||||
}
|
||||
return resultVO;
|
||||
}
|
||||
|
||||
@Operation(
|
||||
summary = "기본코드 아이템 조회",
|
||||
description = "기본코드 아이템 조회",
|
||||
|
|
@ -52,12 +132,87 @@ public class AdminConfigController extends BaseController {
|
|||
@ApiResponse(responseCode = "200", description = "조회 성공"),
|
||||
@ApiResponse(responseCode = "403", description = "인가된 사용자가 아님")
|
||||
})
|
||||
@RequestMapping(method = RequestMethod.GET, value = "/code-item", consumes = MediaType.APPLICATION_JSON_VALUE)
|
||||
public ResultVO getCodeItem(TcCodeGrp param) throws Exception{
|
||||
@RequestMapping(method = RequestMethod.GET, value = "/code-item")
|
||||
public ResultVO getCodeItem(String grpCd) throws Exception{
|
||||
ResultVO resultVO = new ResultVO();
|
||||
Map<String, Object> resultMap = new HashMap<>();
|
||||
resultMap.put("codeItemList", adminConfigService.selectCodeItemList(param.getGrpCd()));
|
||||
resultMap.put("codeItemList", adminConfigService.selectCodeItemList(grpCd));
|
||||
resultVO.setResult(resultMap);
|
||||
return resultVO;
|
||||
}
|
||||
|
||||
@Operation(
|
||||
summary = "기본코드 아이템 저장",
|
||||
description = "기본코드 아이템 저장",
|
||||
tags = {"AdminConfigController"}
|
||||
)
|
||||
@ApiResponses(value = {
|
||||
@ApiResponse(responseCode = "200", description = "저장 성공"),
|
||||
@ApiResponse(responseCode = "303", description = "만료된 토큰"),
|
||||
@ApiResponse(responseCode = "403", description = "인가된 사용자가 아님")
|
||||
})
|
||||
@RequestMapping(method = RequestMethod.POST, value = "/code-item", consumes = MediaType.APPLICATION_JSON_VALUE)
|
||||
public ResultVO addCodeItem(@RequestBody TcCodeItem codeItem, @AuthenticationPrincipal LoginVO user) throws Exception{
|
||||
ResultVO resultVO = new ResultVO();
|
||||
if(user == null){
|
||||
resultVO.setResultCode(ResponseCode.TOKEN_EXPIRED.getCode());
|
||||
}else{
|
||||
if(!user.getUserSe().equals("ACC_TP01")){
|
||||
resultVO.setResultCode(ResponseCode.AUTH_ERROR.getCode());
|
||||
resultVO.setResultMessage(ResponseCode.AUTH_ERROR.getMessage());
|
||||
}else if(codeItem.getGrpCd()==null || codeItem.getGrpCd().isEmpty()){
|
||||
resultVO.setResultCode(ResponseCode.INPUT_CHECK_ERROR.getCode());
|
||||
resultVO.setResultMessage(ResponseCode.INPUT_CHECK_ERROR.getMessage());
|
||||
}else{
|
||||
codeItem.setFrstCrtDt(LocalDateTime.now());
|
||||
codeItem.setFrstCrtId(user.getId());
|
||||
codeItem.setUseYn("Y");
|
||||
String result = adminConfigService.addCodeItem(codeItem);
|
||||
if(result.equals("isSaved")){
|
||||
resultVO.setResultCode(ResponseCode.SAVE_ERROR.getCode());
|
||||
resultVO.setResultMessage("중복되는 코드가 있습니다.");
|
||||
}else{
|
||||
resultVO.setResultCode(ResponseCode.SUCCESS.getCode());
|
||||
}
|
||||
}
|
||||
}
|
||||
return resultVO;
|
||||
}
|
||||
|
||||
@Operation(
|
||||
summary = "기본코드 아이템 수정",
|
||||
description = "기본코드 아이템 수정",
|
||||
tags = {"AdminConfigController"}
|
||||
)
|
||||
@ApiResponses(value = {
|
||||
@ApiResponse(responseCode = "200", description = "수정 성공"),
|
||||
@ApiResponse(responseCode = "303", description = "만료된 토큰"),
|
||||
@ApiResponse(responseCode = "403", description = "인가된 사용자가 아님")
|
||||
})
|
||||
@RequestMapping(method = RequestMethod.PUT, value = "/code-item", consumes = MediaType.APPLICATION_JSON_VALUE)
|
||||
public ResultVO modifyCodeItem(@RequestBody TcCodeItem codeItem, @AuthenticationPrincipal LoginVO user) throws Exception{
|
||||
ResultVO resultVO = new ResultVO();
|
||||
if(user == null){
|
||||
resultVO.setResultCode(ResponseCode.TOKEN_EXPIRED.getCode());
|
||||
}else{
|
||||
if(!user.getUserSe().equals("ACC_TP01")){
|
||||
resultVO.setResultCode(ResponseCode.AUTH_ERROR.getCode());
|
||||
resultVO.setResultMessage(ResponseCode.AUTH_ERROR.getMessage());
|
||||
}else if(codeItem.getGrpCd().isEmpty()){
|
||||
resultVO.setResultCode(ResponseCode.INPUT_CHECK_ERROR.getCode());
|
||||
resultVO.setResultMessage(ResponseCode.INPUT_CHECK_ERROR.getMessage());
|
||||
}else{
|
||||
codeItem.setLastChgDt(LocalDateTime.now());
|
||||
codeItem.setLastChgId(user.getId());
|
||||
String result = adminConfigService.modifyCodeItem(codeItem);
|
||||
if(result.equals("modified")){
|
||||
resultVO.setResultCode(ResponseCode.SUCCESS.getCode());
|
||||
}else{
|
||||
resultVO.setResultCode(ResponseCode.SAVE_ERROR.getCode());
|
||||
}
|
||||
}
|
||||
}
|
||||
return resultVO;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -0,0 +1,68 @@
|
|||
package com.dbnt.kcscbackend.admin.config.entity;
|
||||
|
||||
import lombok.*;
|
||||
import org.hibernate.annotations.DynamicInsert;
|
||||
import org.hibernate.annotations.DynamicUpdate;
|
||||
import org.springframework.format.annotation.DateTimeFormat;
|
||||
|
||||
import javax.persistence.*;
|
||||
import java.io.Serializable;
|
||||
import java.time.LocalDateTime;
|
||||
|
||||
@Getter
|
||||
@Setter
|
||||
@Entity
|
||||
@NoArgsConstructor
|
||||
@DynamicInsert
|
||||
@DynamicUpdate
|
||||
@Table(name = "tn_cmt_org")
|
||||
public class TnCmtOrg {
|
||||
|
||||
@Id
|
||||
@Column(name = "cmt_seq")
|
||||
private Integer cmtSeq;
|
||||
|
||||
@Column(name = "cmt_nm")
|
||||
private String cmtNm;
|
||||
|
||||
@Column(name = "cmt_type")
|
||||
private String cmtType;
|
||||
|
||||
@Column(name = "cmt_desc")
|
||||
private String cmtDesc;
|
||||
|
||||
@Column(name = "up_cmt_seq")
|
||||
private Integer upCmtSeq;
|
||||
|
||||
@Column(name = "cmt_order")
|
||||
private Integer cmtOrder;
|
||||
|
||||
@Column(name = "frst_crt_id")
|
||||
private String frstCrtId;
|
||||
|
||||
@Column(name = "frst_crt_dt")
|
||||
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
|
||||
private LocalDateTime frstCrtDt;
|
||||
|
||||
@Column(name = "last_chg_id")
|
||||
private String lastChgId;
|
||||
|
||||
@Column(name = "last_chg_dt")
|
||||
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
|
||||
private LocalDateTime lastChgDt;
|
||||
|
||||
@Column(name = "use_yn")
|
||||
private String useYn;
|
||||
|
||||
@Column(name = "old_seq")
|
||||
private Integer oldSeq;
|
||||
|
||||
@Embeddable
|
||||
@Data
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
public static class TnCmtOrgId implements Serializable {
|
||||
private String cmtSeq;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -1,7 +0,0 @@
|
|||
package com.dbnt.kcscbackend.admin.config.mapper;
|
||||
|
||||
import org.apache.ibatis.annotations.Mapper;
|
||||
|
||||
@Mapper
|
||||
public interface AdminConfigMapper {
|
||||
}
|
||||
|
|
@ -3,5 +3,8 @@ package com.dbnt.kcscbackend.admin.config.repository;
|
|||
import com.dbnt.kcscbackend.admin.config.entity.TcCodeGrp;
|
||||
import org.springframework.data.jpa.repository.JpaRepository;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public interface TcCodeGrpRepository extends JpaRepository<TcCodeGrp, String> {
|
||||
List<TcCodeGrp> findByUseYn(String useYn);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -6,5 +6,5 @@ import org.springframework.data.jpa.repository.JpaRepository;
|
|||
import java.util.List;
|
||||
|
||||
public interface TcCodeItemRepository extends JpaRepository<TcCodeItem, TcCodeItem.TcCodeItemId> {
|
||||
List<TcCodeItem> findByGrpCdOrderByGrpOrder(String grpCd);
|
||||
List<TcCodeItem> findByGrpCdAndUseYnOrderByGrpOrder(String grpCd, String useYn);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -0,0 +1,11 @@
|
|||
package com.dbnt.kcscbackend.admin.config.repository;
|
||||
|
||||
import com.dbnt.kcscbackend.admin.config.entity.TcCodeItem;
|
||||
import com.dbnt.kcscbackend.admin.config.entity.TnCmtOrg;
|
||||
import org.springframework.data.jpa.repository.JpaRepository;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public interface TnCmtOrgRepository extends JpaRepository<TnCmtOrg, TnCmtOrg.TnCmtOrgId> {
|
||||
List<TnCmtOrg> findByUseYnAndUpCmtSeqOrderByCmtOrder(String useYn, Integer upCmtSeq);
|
||||
}
|
||||
|
|
@ -2,12 +2,12 @@ package com.dbnt.kcscbackend.admin.config.service;
|
|||
|
||||
import com.dbnt.kcscbackend.admin.config.entity.TcCodeGrp;
|
||||
import com.dbnt.kcscbackend.admin.config.entity.TcCodeItem;
|
||||
import com.dbnt.kcscbackend.admin.config.mapper.AdminConfigMapper;
|
||||
import com.dbnt.kcscbackend.admin.config.repository.TcCodeGrpRepository;
|
||||
import com.dbnt.kcscbackend.admin.config.repository.TcCodeItemRepository;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import org.egovframe.rte.fdl.cmmn.EgovAbstractServiceImpl;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
|
|
@ -17,13 +17,82 @@ public class AdminConfigService extends EgovAbstractServiceImpl {
|
|||
|
||||
private final TcCodeGrpRepository codeGrpRepository;
|
||||
private final TcCodeItemRepository codeItemRepository;
|
||||
private final AdminConfigMapper adminConfigMapper;
|
||||
|
||||
public List<TcCodeGrp> selectCodeGrpList(){
|
||||
return codeGrpRepository.findAll();
|
||||
return codeGrpRepository.findByUseYn("Y");
|
||||
}
|
||||
|
||||
@Transactional
|
||||
public String addCodeGrp(TcCodeGrp codeGrp) {
|
||||
TcCodeGrp savedGrp = codeGrpRepository.findById(codeGrp.getGrpCd()).orElse(null);
|
||||
if(savedGrp!=null){
|
||||
if(savedGrp.getUseYn().equals("Y")){
|
||||
return "isSaved";
|
||||
}else{
|
||||
savedGrp.setGrpCdNm(codeGrp.getGrpCdNm());
|
||||
savedGrp.setUseYn("Y");
|
||||
codeGrpRepository.save(savedGrp);
|
||||
return savedGrp.getGrpCd();
|
||||
}
|
||||
}else{
|
||||
codeGrpRepository.save(codeGrp);
|
||||
return codeGrp.getGrpCd();
|
||||
}
|
||||
}
|
||||
|
||||
@Transactional
|
||||
public String modifyCodeGrp(TcCodeGrp codeGrp) {
|
||||
TcCodeGrp savedGrp = codeGrpRepository.findById(codeGrp.getGrpCd()).orElse(null);
|
||||
if (savedGrp != null) {
|
||||
savedGrp.setGrpCdNm(codeGrp.getGrpCdNm());
|
||||
savedGrp.setLastChgId(codeGrp.getLastChgId());
|
||||
savedGrp.setLastChgDt(codeGrp.getLastChgDt());
|
||||
savedGrp.setUseYn(codeGrp.getUseYn());
|
||||
codeGrpRepository.save(savedGrp);
|
||||
return "modified";
|
||||
}else{
|
||||
return "validGrpCd";
|
||||
}
|
||||
}
|
||||
|
||||
public List<TcCodeItem> selectCodeItemList(String grpCd){
|
||||
return codeItemRepository.findByGrpCdOrderByGrpOrder(grpCd);
|
||||
return codeItemRepository.findByGrpCdAndUseYnOrderByGrpOrder(grpCd, "Y");
|
||||
}
|
||||
@Transactional
|
||||
public String addCodeItem(TcCodeItem codeItem) {
|
||||
TcCodeItem savedItem = codeItemRepository.findById(
|
||||
new TcCodeItem.TcCodeItemId(codeItem.getItemCd(), codeItem.getGrpCd())
|
||||
).orElse(null);
|
||||
if(savedItem!=null){
|
||||
if(savedItem.getUseYn().equals("Y")){
|
||||
return "isSaved";
|
||||
}else{
|
||||
savedItem.setItemNm(savedItem.getItemNm());
|
||||
savedItem.setUseYn("Y");
|
||||
codeItemRepository.save(savedItem);
|
||||
return savedItem.getGrpCd();
|
||||
}
|
||||
}else{
|
||||
codeItemRepository.save(codeItem);
|
||||
return codeItem.getItemCd();
|
||||
}
|
||||
}
|
||||
|
||||
@Transactional
|
||||
public String modifyCodeItem(TcCodeItem codeItem) {
|
||||
TcCodeItem savedItem = codeItemRepository.findById(
|
||||
new TcCodeItem.TcCodeItemId(codeItem.getItemCd(), codeItem.getGrpCd())
|
||||
).orElse(null);
|
||||
if (savedItem != null) {
|
||||
savedItem.setItemNm(codeItem.getItemNm());
|
||||
savedItem.setLastChgId(codeItem.getLastChgId());
|
||||
savedItem.setLastChgDt(codeItem.getLastChgDt());
|
||||
savedItem.setGrpOrder(codeItem.getGrpOrder());
|
||||
savedItem.setUseYn(codeItem.getUseYn());
|
||||
codeItemRepository.save(savedItem);
|
||||
return "modified";
|
||||
}else{
|
||||
return "validGrpCd";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -0,0 +1,55 @@
|
|||
package com.dbnt.kcscbackend.admin.dashboard;
|
||||
|
||||
import com.dbnt.kcscbackend.admin.dashboard.service.AdminDashboardService;
|
||||
import com.dbnt.kcscbackend.config.common.BaseController;
|
||||
import com.dbnt.kcscbackend.config.common.ResultVO;
|
||||
import io.swagger.v3.oas.annotations.Operation;
|
||||
import io.swagger.v3.oas.annotations.responses.ApiResponse;
|
||||
import io.swagger.v3.oas.annotations.responses.ApiResponses;
|
||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import org.springframework.http.MediaType;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.RequestMethod;
|
||||
import org.springframework.web.bind.annotation.RestController;
|
||||
|
||||
import java.time.LocalDate;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
@RestController
|
||||
@RequiredArgsConstructor
|
||||
@RequestMapping("/admin/dashboard")
|
||||
@Tag(name="AdminDashboardController", description = "사이트관리 대시보드")
|
||||
public class AdminDashboardController extends BaseController {
|
||||
|
||||
private final AdminDashboardService adminDashboardService;
|
||||
|
||||
@Operation(
|
||||
summary = "기본코드 그룹 조회",
|
||||
description = "기본코드 그룹 조회",
|
||||
tags = {"AdminConfigController"}
|
||||
)
|
||||
@ApiResponses(value = {
|
||||
@ApiResponse(responseCode = "200", description = "조회 성공"),
|
||||
@ApiResponse(responseCode = "403", description = "인가된 사용자가 아님")
|
||||
})
|
||||
@RequestMapping(method = RequestMethod.GET, value = "/daily-user-log-list", consumes = MediaType.APPLICATION_JSON_VALUE)
|
||||
public ResultVO getDailyUserLogList() throws Exception {
|
||||
ResultVO resultVO = new ResultVO();
|
||||
Map<String, Object> resultMap = new HashMap<>();
|
||||
|
||||
// 현재 날짜
|
||||
// todo endDate 뒤에 .minus 지워야함
|
||||
LocalDate endDate = LocalDate.now().minusMonths(6);
|
||||
|
||||
System.out.println("@@@ localdate : " + endDate);
|
||||
|
||||
// 3개월 전 날짜 계산
|
||||
LocalDate startDate = endDate.minusMonths(3);
|
||||
|
||||
resultMap.put("dailyUserLogList", adminDashboardService.selectDailyUserLogList(startDate, endDate));
|
||||
resultVO.setResult(resultMap);
|
||||
return resultVO;
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,36 @@
|
|||
package com.dbnt.kcscbackend.admin.dashboard.entity;
|
||||
import com.fasterxml.jackson.annotation.JsonFormat;
|
||||
import lombok.Getter;
|
||||
import lombok.NoArgsConstructor;
|
||||
import lombok.Setter;
|
||||
import org.hibernate.annotations.DynamicInsert;
|
||||
import org.hibernate.annotations.DynamicUpdate;
|
||||
|
||||
import javax.persistence.*;
|
||||
import java.time.LocalDate;
|
||||
|
||||
@Getter
|
||||
@Setter
|
||||
@Entity
|
||||
@NoArgsConstructor
|
||||
@DynamicInsert
|
||||
@DynamicUpdate
|
||||
@Table(name = "tn_daily_user_log")
|
||||
public class TnDailyUserLog {
|
||||
@Id
|
||||
@GeneratedValue(strategy = GenerationType.IDENTITY)
|
||||
@Column(name = "dul_seq")
|
||||
private Long dulSeq;
|
||||
|
||||
@Column(name = "log_dt")
|
||||
private LocalDate logDt;
|
||||
|
||||
@Column(name = "log_cnt")
|
||||
private Integer logCnt;
|
||||
|
||||
@Column(name = "mobile_cnt")
|
||||
private Integer mobileCnt;
|
||||
|
||||
@Column(name = "pc_cnt")
|
||||
private Integer pcCnt;
|
||||
}
|
||||
|
|
@ -0,0 +1,11 @@
|
|||
package com.dbnt.kcscbackend.admin.dashboard.repository;
|
||||
|
||||
import com.dbnt.kcscbackend.admin.dashboard.entity.TnDailyUserLog;
|
||||
import org.springframework.data.jpa.repository.JpaRepository;
|
||||
|
||||
import java.time.LocalDate;
|
||||
import java.util.List;
|
||||
|
||||
public interface TnDailyUserLogRepository extends JpaRepository<TnDailyUserLog, Long> {
|
||||
List<TnDailyUserLog> findByLogDtBetweenOrderByLogDt(LocalDate startDate, LocalDate endDate);
|
||||
}
|
||||
|
|
@ -0,0 +1,20 @@
|
|||
package com.dbnt.kcscbackend.admin.dashboard.service;
|
||||
|
||||
import com.dbnt.kcscbackend.admin.dashboard.entity.TnDailyUserLog;
|
||||
import com.dbnt.kcscbackend.admin.dashboard.repository.TnDailyUserLogRepository;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import org.egovframe.rte.fdl.cmmn.EgovAbstractServiceImpl;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import java.time.LocalDate;
|
||||
import java.util.List;
|
||||
|
||||
@Service
|
||||
@RequiredArgsConstructor
|
||||
public class AdminDashboardService extends EgovAbstractServiceImpl {
|
||||
private final TnDailyUserLogRepository tnDailyUserLogRepository;
|
||||
|
||||
public List<TnDailyUserLog> selectDailyUserLogList(LocalDate startDate, LocalDate endDate) {
|
||||
return tnDailyUserLogRepository.findByLogDtBetweenOrderByLogDt(startDate, endDate);
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,79 @@
|
|||
package com.dbnt.kcscbackend.admin.logs;
|
||||
|
||||
import com.dbnt.kcscbackend.admin.logs.entity.ThPrivacyLog;
|
||||
import com.dbnt.kcscbackend.admin.logs.service.AdminLogsService;
|
||||
import com.dbnt.kcscbackend.auth.entity.LoginVO;
|
||||
import com.dbnt.kcscbackend.config.common.BaseController;
|
||||
import com.dbnt.kcscbackend.config.common.ResponseCode;
|
||||
import com.dbnt.kcscbackend.config.common.ResultVO;
|
||||
import io.swagger.v3.oas.annotations.Operation;
|
||||
import io.swagger.v3.oas.annotations.responses.ApiResponse;
|
||||
import io.swagger.v3.oas.annotations.responses.ApiResponses;
|
||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import org.egovframe.rte.fdl.property.EgovPropertyService;
|
||||
import org.egovframe.rte.ptl.mvc.tags.ui.pagination.PaginationInfo;
|
||||
import org.springframework.security.core.annotation.AuthenticationPrincipal;
|
||||
import org.springframework.http.MediaType;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.RequestMethod;
|
||||
import org.springframework.web.bind.annotation.RestController;
|
||||
import org.springframework.web.bind.annotation.RequestBody;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
@RestController
|
||||
@RequiredArgsConstructor
|
||||
@RequestMapping("/admin/logs")
|
||||
@Tag(name="AdminLogsController", description = "사이트관리 로그현황 메뉴 컨트롤러")
|
||||
public class AdminLogsController extends BaseController {
|
||||
|
||||
@Resource(name = "propertiesService")
|
||||
protected EgovPropertyService propertyService;
|
||||
|
||||
private final AdminLogsService adminLogsService;
|
||||
|
||||
@Operation(
|
||||
summary = "로그현황 - 개인정보 로그",
|
||||
description = "개인정보 로그현황",
|
||||
tags = {"AdminLogsController"}
|
||||
)
|
||||
@ApiResponses(value = {
|
||||
@ApiResponse(responseCode = "200", description = "조회 성공"),
|
||||
@ApiResponse(responseCode = "403", description = "인가된 사용자가 아님")
|
||||
})
|
||||
@RequestMapping(method = RequestMethod.POST, value = "/privacy", consumes = MediaType.APPLICATION_JSON_VALUE)
|
||||
public ResultVO selectPrivacyLogsList(@RequestBody ThPrivacyLog thPrivacyLog, @AuthenticationPrincipal LoginVO user)
|
||||
throws Exception {
|
||||
|
||||
ResultVO resultVO = new ResultVO();
|
||||
Map<String, Object> resultMap = adminLogsService.selectPrivacyList();
|
||||
|
||||
PaginationInfo paginationInfo = new PaginationInfo();
|
||||
|
||||
paginationInfo.setCurrentPageNo(thPrivacyLog.getPageIndex());
|
||||
paginationInfo.setRecordCountPerPage(propertyService.getInt("Globals.pageUnit"));
|
||||
paginationInfo.setPageSize(propertyService.getInt("Globals.pageSize"));
|
||||
|
||||
thPrivacyLog.setFirstIndex(paginationInfo.getFirstRecordIndex());
|
||||
thPrivacyLog.setLastIndex(paginationInfo.getLastRecordIndex());
|
||||
thPrivacyLog.setRecordCountPerPage(paginationInfo.getRecordCountPerPage());
|
||||
|
||||
int totCnt = Integer.parseInt((String)resultMap.get("resultCnt"));
|
||||
paginationInfo.setTotalRecordCount(totCnt);
|
||||
|
||||
// resultMap.put("resultList", adminLogsService.selectPrivacyList());
|
||||
// resultMap.put("resultList", resultMap.get("resultList"));
|
||||
// resultMap.put("resultCnt", totCnt);
|
||||
resultMap.put("paginationInfo", paginationInfo);
|
||||
|
||||
resultVO.setResultCode(ResponseCode.SUCCESS.getCode());
|
||||
resultVO.setResultMessage(ResponseCode.SUCCESS.getMessage());
|
||||
resultVO.setResult(resultMap);
|
||||
return resultVO;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,99 @@
|
|||
package com.dbnt.kcscbackend.admin.logs.entity;
|
||||
|
||||
import java.io.Serializable;
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
import lombok.Getter;
|
||||
import lombok.NoArgsConstructor;
|
||||
import lombok.Setter;
|
||||
import lombok.experimental.Accessors;
|
||||
import org.hibernate.annotations.DynamicInsert;
|
||||
import org.hibernate.annotations.DynamicUpdate;
|
||||
import org.springframework.format.annotation.DateTimeFormat;
|
||||
|
||||
import javax.persistence.*;
|
||||
import java.time.LocalDate;
|
||||
import java.time.LocalDateTime;
|
||||
|
||||
@Getter
|
||||
@Setter
|
||||
@Accessors(chain = true)
|
||||
@Entity
|
||||
@NoArgsConstructor
|
||||
@DynamicInsert
|
||||
@DynamicUpdate
|
||||
@Table(name = "th_user_privacy_log")
|
||||
public class ThPrivacyLog implements Serializable {
|
||||
private static final long serialVersionUID = -3779821913760046011L;
|
||||
|
||||
@Transient
|
||||
@Schema(description = "검색시작일")
|
||||
private String searchBgnDe = "";
|
||||
|
||||
@Transient
|
||||
@Schema(description = "검색조건")
|
||||
private String searchCnd = "";
|
||||
|
||||
@Transient
|
||||
@Schema(description = "검색종료일")
|
||||
private String searchEndDe = "";
|
||||
|
||||
@Transient
|
||||
@Schema(description = "검색단어")
|
||||
private String searchWrd = "";
|
||||
|
||||
@Transient
|
||||
@Schema(description = "정렬순서(DESC,ASC)")
|
||||
private long sortOrdr = 0L;
|
||||
|
||||
@Transient
|
||||
@Schema(description = "검색사용여부")
|
||||
private String searchUseYn = "";
|
||||
|
||||
@Transient
|
||||
@Schema(description = "현재페이지")
|
||||
private int pageIndex = 1;
|
||||
|
||||
@Transient
|
||||
@Schema(description = "페이지갯수")
|
||||
private int pageUnit = 10;
|
||||
|
||||
@Transient
|
||||
@Schema(description = "페이지사이즈")
|
||||
private int pageSize = 10;
|
||||
|
||||
@Transient
|
||||
@Schema(description = "첫페이지 인덱스")
|
||||
private int firstIndex = 1;
|
||||
|
||||
@Transient
|
||||
@Schema(description = "마지막페이지 인덱스")
|
||||
private int lastIndex = 1;
|
||||
|
||||
@Transient
|
||||
@Schema(description = "페이지당 레코드 개수")
|
||||
private int recordCountPerPage = 10;
|
||||
|
||||
@Transient
|
||||
@Schema(description = "레코드 번호")
|
||||
private int rowNo = 0;
|
||||
|
||||
@Id
|
||||
@Column(name = "upl_seq")
|
||||
private Long uplSeq;
|
||||
|
||||
@Column(name = "user_id")
|
||||
private String userId;
|
||||
|
||||
@Column(name = "target_user_id")
|
||||
private String targetUserId;
|
||||
|
||||
@Column(name = "access_type")
|
||||
private String accessType;
|
||||
|
||||
@Column(name = "ip_address")
|
||||
private String ipAddress;
|
||||
|
||||
@Column(name = "access_dt")
|
||||
@DateTimeFormat(pattern = "yyyy-MM-dd")
|
||||
private LocalDate accessDt;
|
||||
}
|
||||
|
|
@ -0,0 +1,7 @@
|
|||
package com.dbnt.kcscbackend.admin.logs.mapper;
|
||||
|
||||
import org.apache.ibatis.annotations.Mapper;
|
||||
|
||||
@Mapper
|
||||
public interface AdminLogsMapper {
|
||||
}
|
||||
|
|
@ -0,0 +1,12 @@
|
|||
package com.dbnt.kcscbackend.admin.logs.repository;
|
||||
|
||||
import com.dbnt.kcscbackend.admin.logs.entity.ThPrivacyLog;
|
||||
import org.springframework.data.jpa.repository.JpaRepository;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public interface PrivacyLogsRepository extends JpaRepository<ThPrivacyLog, String> {
|
||||
long count(); // 전체 레코드 수를 반환하는 메서드
|
||||
|
||||
List<ThPrivacyLog> findAllByOrderByUplSeqDesc();
|
||||
}
|
||||
|
|
@ -0,0 +1,39 @@
|
|||
package com.dbnt.kcscbackend.admin.logs.service;
|
||||
|
||||
import com.dbnt.kcscbackend.admin.logs.entity.ThPrivacyLog;
|
||||
import com.dbnt.kcscbackend.admin.logs.repository.PrivacyLogsRepository;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import org.egovframe.rte.fdl.cmmn.EgovAbstractServiceImpl;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
@Service
|
||||
@RequiredArgsConstructor
|
||||
public class AdminLogsService extends EgovAbstractServiceImpl {
|
||||
|
||||
private final PrivacyLogsRepository privacyLogsRepository;
|
||||
|
||||
// public List<ThPrivacyLog> selectPrivacyList(){
|
||||
// return privacyLogsRepository.findAll();
|
||||
// }
|
||||
public Map<String, Object> selectPrivacyList() {
|
||||
Map<String, Object> resultMap = new HashMap<>();
|
||||
|
||||
// 전체 레코드 수 가져오기
|
||||
long totalRecordCount = privacyLogsRepository.count();
|
||||
|
||||
// 개수를 resultMap에 추가
|
||||
resultMap.put("resultCnt", String.valueOf(totalRecordCount));
|
||||
|
||||
// 개인 정보 로그 리스트 가져오기
|
||||
List<ThPrivacyLog> privacyLogList = privacyLogsRepository.findAllByOrderByUplSeqDesc();
|
||||
|
||||
// 결과를 resultMap에 추가
|
||||
resultMap.put("resultList", privacyLogList);
|
||||
|
||||
return resultMap;
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,50 @@
|
|||
package com.dbnt.kcscbackend.admin.users;
|
||||
|
||||
|
||||
import com.dbnt.kcscbackend.admin.users.service.AdminUsersService;
|
||||
import com.dbnt.kcscbackend.auth.entity.UserInfo;
|
||||
import com.dbnt.kcscbackend.config.common.BaseController;
|
||||
import com.dbnt.kcscbackend.config.common.ResultVO;
|
||||
import io.swagger.v3.oas.annotations.Operation;
|
||||
import io.swagger.v3.oas.annotations.responses.ApiResponse;
|
||||
import io.swagger.v3.oas.annotations.responses.ApiResponses;
|
||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.RequestMethod;
|
||||
import org.springframework.web.bind.annotation.RestController;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
@RestController
|
||||
@RequiredArgsConstructor
|
||||
@RequestMapping("/admin/users")
|
||||
@Tag(name="AdminConfigController", description = "사이트관리 사용자관리 메뉴 컨트롤러")
|
||||
public class AdminUsersController extends BaseController {
|
||||
|
||||
private final AdminUsersService adminUsersService;
|
||||
|
||||
@Operation(
|
||||
summary = "사용자 목록 조회",
|
||||
description = "사용자 목록 조회",
|
||||
tags = {"AdminUsersController"}
|
||||
)
|
||||
@ApiResponses(value = {
|
||||
@ApiResponse(responseCode = "200", description = "조회 성공"),
|
||||
@ApiResponse(responseCode = "403", description = "인가된 사용자가 아님")
|
||||
})
|
||||
@RequestMapping(method = RequestMethod.GET, value = "/list")
|
||||
public ResultVO getUserList(UserInfo params) throws Exception{
|
||||
ResultVO resultVO = new ResultVO();
|
||||
Map<String, Object> resultMap = new HashMap<>();
|
||||
params.setQueryInfo();
|
||||
resultMap.put("userList", adminUsersService.selectUserList(params));
|
||||
params.setContentCnt(adminUsersService.selectUserListCnt(params));
|
||||
params.setPaginationInfo();
|
||||
resultMap.put("paginationInfo", params);
|
||||
resultVO.setResult(resultMap);
|
||||
return resultVO;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,32 @@
|
|||
package com.dbnt.kcscbackend.admin.users.mapper;
|
||||
|
||||
import com.dbnt.kcscbackend.auth.entity.LoginVO;
|
||||
import com.dbnt.kcscbackend.auth.entity.UserInfo;
|
||||
import org.apache.ibatis.annotations.Mapper;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 일반 로그인을 처리하는 비즈니스 구현 클래스
|
||||
* @author 공통서비스 개발팀 박지욱
|
||||
* @since 2009.03.06
|
||||
* @version 1.0
|
||||
* @see
|
||||
*
|
||||
* <pre>
|
||||
* << 개정이력(Modification Information) >>
|
||||
*
|
||||
* 수정일 수정자 수정내용
|
||||
* ------- -------- ---------------------------
|
||||
* 2009.03.06 박지욱 최초 생성
|
||||
* 2011.08.31 JJY 경량환경 템플릿 커스터마이징버전 생성
|
||||
*
|
||||
* </pre>
|
||||
*/
|
||||
@Mapper
|
||||
public interface AdminUsersMapper {
|
||||
|
||||
List<UserInfo> selectUserList(UserInfo params);
|
||||
|
||||
Integer selectUserListCnt(UserInfo params);
|
||||
}
|
||||
|
|
@ -0,0 +1,25 @@
|
|||
package com.dbnt.kcscbackend.admin.users.service;
|
||||
|
||||
import com.dbnt.kcscbackend.admin.users.mapper.AdminUsersMapper;
|
||||
import com.dbnt.kcscbackend.auth.entity.UserInfo;
|
||||
import com.dbnt.kcscbackend.auth.repository.UserInfoRepository;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
@Service
|
||||
@RequiredArgsConstructor
|
||||
public class AdminUsersService {
|
||||
|
||||
private final UserInfoRepository userInfoRepository;
|
||||
private final AdminUsersMapper usersMapper;
|
||||
|
||||
public List<UserInfo> selectUserList(UserInfo params) {
|
||||
return usersMapper.selectUserList(params);
|
||||
}
|
||||
|
||||
public Integer selectUserListCnt(UserInfo params) {
|
||||
return usersMapper.selectUserListCnt(params);
|
||||
}
|
||||
}
|
||||
|
|
@ -88,7 +88,7 @@ public class EgovLoginApiController extends BaseController {
|
|||
msg.append(error.getDefaultMessage());
|
||||
msg.append("\n");
|
||||
}
|
||||
resultMap.put("resultCode", ResponseCode.SAVE_ERROR.getCode());
|
||||
resultMap.put("resultCode", ResponseCode.INPUT_CHECK_ERROR.getCode());
|
||||
resultMap.put("resultMessage", msg.toString());
|
||||
}else if(!loginVO.getPassword().equals(loginVO.getPasswordChk())){
|
||||
resultMap.put("resultCode", ResponseCode.SAVE_ERROR.getCode());
|
||||
|
|
|
|||
|
|
@ -55,7 +55,7 @@ public class LoginVO implements Serializable{
|
|||
@NotBlank(message = "비밀번호확인을 입력해주세요.")
|
||||
private String passwordChk;
|
||||
|
||||
@Schema(description = "사용자 구분", allowableValues = {"ADM", "USR"}, defaultValue = "USR")
|
||||
@Schema(description = "사용자 구분", allowableValues = {"ACC_TP01", "ACC_TP02"}, defaultValue = "ACC_TP02")
|
||||
private String userSe;
|
||||
|
||||
@Schema(description = "이름")
|
||||
|
|
|
|||
|
|
@ -1,5 +1,7 @@
|
|||
package com.dbnt.kcscbackend.auth.entity;
|
||||
|
||||
import com.dbnt.kcscbackend.config.common.BoardParams;
|
||||
import com.fasterxml.jackson.annotation.JsonIgnore;
|
||||
import lombok.Getter;
|
||||
import lombok.NoArgsConstructor;
|
||||
import lombok.Setter;
|
||||
|
|
@ -21,7 +23,7 @@ import java.util.Set;
|
|||
@DynamicInsert
|
||||
@DynamicUpdate
|
||||
@Table(name = "user_info")
|
||||
public class UserInfo implements UserDetails{
|
||||
public class UserInfo extends BoardParams implements UserDetails{
|
||||
@Id
|
||||
@GeneratedValue(strategy = GenerationType.IDENTITY)
|
||||
@Column(name = "user_seq")
|
||||
|
|
@ -34,8 +36,17 @@ public class UserInfo implements UserDetails{
|
|||
private String email;
|
||||
@Column(name = "user_se")
|
||||
private String userSe;
|
||||
@Column(name = "user_nm")
|
||||
private String userNm;
|
||||
@Column(name = "phone_num")
|
||||
private String phoneNum;
|
||||
@Column(name = "user_role")
|
||||
private String userRole;
|
||||
@Column(name = "use_yn")
|
||||
private String useYn;
|
||||
|
||||
@Override
|
||||
@JsonIgnore
|
||||
public Collection<? extends GrantedAuthority> getAuthorities() {
|
||||
Set<GrantedAuthority> roles = new HashSet<>();
|
||||
for (String role : userSe.split(",")) {
|
||||
|
|
|
|||
|
|
@ -0,0 +1,56 @@
|
|||
package com.dbnt.kcscbackend.config.common;
|
||||
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
|
||||
import javax.persistence.Transient;
|
||||
import java.io.Serializable;
|
||||
|
||||
@Getter
|
||||
@Setter
|
||||
public class BoardParams implements Serializable {
|
||||
@Transient
|
||||
private String searchCondition;
|
||||
@Transient
|
||||
private String searchKeyword;
|
||||
@Transient
|
||||
private Integer pageIndex=1; //요청페이지
|
||||
@Transient
|
||||
private Integer firstIndex=0; // 쿼리의 시작 row
|
||||
@Transient
|
||||
private Integer rowCnt=10; //한 페이지에 표현되는 row 수
|
||||
@Transient
|
||||
private Integer startNum=1; // pagination 시작값
|
||||
@Transient
|
||||
private Integer endNum=5; // pagination 마지막값
|
||||
@Transient
|
||||
private Integer maxNum; // pagination 최대값
|
||||
@Transient
|
||||
private Integer contentCnt=0;
|
||||
|
||||
public void setQueryInfo(){
|
||||
setFirstIndex((getPageIndex()-1)*getRowCnt());
|
||||
}
|
||||
public void setPaginationInfo(){
|
||||
int contentCnt = getContentCnt();
|
||||
int rowCnt = getRowCnt();
|
||||
int maxNum = (int)Math.ceil(((double)contentCnt)/rowCnt);
|
||||
if (maxNum==0){
|
||||
maxNum = 1;
|
||||
}
|
||||
setMaxNum(maxNum);
|
||||
|
||||
int pageIndex = getPageIndex();
|
||||
int startNum = pageIndex - 4;
|
||||
if(startNum <= 0){
|
||||
startNum = 1;
|
||||
}
|
||||
setStartNum(startNum);
|
||||
|
||||
int endNum = startNum + 9;
|
||||
if(endNum>maxNum){
|
||||
endNum = maxNum;
|
||||
}
|
||||
setEndNum(endNum);
|
||||
}
|
||||
}
|
||||
|
|
@ -23,6 +23,8 @@ package com.dbnt.kcscbackend.config.common;
|
|||
public enum ResponseCode {
|
||||
|
||||
SUCCESS(200, "성공했습니다."),
|
||||
FAILED(300, "실패하였습니다."),
|
||||
TOKEN_EXPIRED(303, "만료된 토큰입니다."),
|
||||
AUTH_ERROR(403, "인가된 사용자가 아닙니다."),
|
||||
DELETE_ERROR(700, "삭제 중 내부 오류가 발생했습니다."),
|
||||
SAVE_ERROR(800, "저장시 내부 오류가 발생했습니다."),
|
||||
|
|
|
|||
|
|
@ -4,6 +4,8 @@ import org.egovframe.rte.fdl.cmmn.trace.LeaveaTrace;
|
|||
import org.egovframe.rte.fdl.cmmn.trace.handler.TraceHandler;
|
||||
import org.egovframe.rte.fdl.cmmn.trace.manager.DefaultTraceHandleManager;
|
||||
import org.egovframe.rte.fdl.cmmn.trace.manager.TraceHandlerService;
|
||||
import org.egovframe.rte.fdl.cryptography.EgovPasswordEncoder;
|
||||
import org.egovframe.rte.fdl.cryptography.impl.EgovARIACryptoServiceImpl;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.ComponentScan;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
|
|
@ -80,4 +82,28 @@ public class EgovConfigAppCommon {
|
|||
return leaveaTrace;
|
||||
}
|
||||
|
||||
/**
|
||||
* 암복호화
|
||||
* @return [EgovPasswordEncoder 설정] EgovPasswordEncoder 등록
|
||||
*/
|
||||
@Bean
|
||||
public EgovPasswordEncoder egovPasswordEncoder() {
|
||||
EgovPasswordEncoder egovPasswordEncoder = new EgovPasswordEncoder();
|
||||
egovPasswordEncoder.setAlgorithm("SHA-256");
|
||||
egovPasswordEncoder.setHashedPassword("gdyYs/IZqY86VcWhT8emCYfqY1ahw2vtLG+/FzNqtrQ=");
|
||||
return egovPasswordEncoder;
|
||||
}
|
||||
|
||||
/**
|
||||
* 암복호화
|
||||
* @return [EgovARIACryptoServiceImpl 설정] EgovARIACryptoServiceImpl 등록
|
||||
*/
|
||||
@Bean
|
||||
public EgovARIACryptoServiceImpl egovARIACryptoService() {
|
||||
EgovARIACryptoServiceImpl egovARIACryptoServiceImpl = new EgovARIACryptoServiceImpl();
|
||||
egovARIACryptoServiceImpl.setPasswordEncoder(egovPasswordEncoder());
|
||||
egovARIACryptoServiceImpl.setBlockSize(1024);
|
||||
return egovARIACryptoServiceImpl;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -126,7 +126,7 @@ public class StandardCodeController extends BaseController {
|
|||
if(user == null){
|
||||
resultVO.setResultCode(303);
|
||||
}else{
|
||||
if(!user.getUserSe().equals("ADM")){
|
||||
if(!user.getUserSe().equals("ACC_TP01")){
|
||||
resultVO.setResultCode(403);
|
||||
}else{
|
||||
standardCodeService.saveErrorCd(content);
|
||||
|
|
|
|||
|
|
@ -0,0 +1,21 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
|
||||
<configuration>
|
||||
|
||||
<!--Mybatis 설정 -->
|
||||
<settings>
|
||||
<!-- 전통적인 데이터베이스 컬럼명 형태인 A_COLUMN을 CamelCase형태의 자바 프로퍼티명 형태인 aColumn으로 자동으로 매핑하도록 함 -->
|
||||
<setting name="mapUnderscoreToCamelCase" value="true"></setting>
|
||||
<!-- 파라미터에 Null 값이 있을 경우 에러 처리 -->
|
||||
<setting name="jdbcTypeForNull" value="VARCHAR"></setting>
|
||||
</settings>
|
||||
|
||||
<!-- Type Aliases 설정-->
|
||||
<typeAliases>
|
||||
<typeAlias alias="egovMap" type="org.egovframe.rte.psl.dataaccess.util.EgovMap" />
|
||||
<typeAlias alias="FileVO" type="com.dbnt.kcscbackend.admin.committee.schedules.repository.FileVO" />
|
||||
<typeAlias alias="ComDefaultCodeVO" type="com.dbnt.kcscbackend.admin.committee.schedules.repository.ComDefaultCodeVO" />
|
||||
<typeAlias alias="comDefaultVO" type="com.dbnt.kcscbackend.admin.committee.schedules.repository.ComDefaultVO" />
|
||||
</typeAliases>
|
||||
|
||||
</configuration>
|
||||
|
|
@ -12,3 +12,7 @@ spring.redis.host=localhost
|
|||
spring.redis.port=6379
|
||||
# secret key
|
||||
Globals.jwt.secret = qWwMroux3QtiIJcPSIZARNTZEBBnWVH0jZ2Lx7tfFChCYi0ViZllo1bekZdiU0B3FRjJI7g90n0ha120dwlz8JZU8rOkmNCe9Uq0
|
||||
|
||||
#?????? ???? ?
|
||||
#?? : ??? ??? "egovframe"? ????? ???? ????? ????.
|
||||
Globals.crypto.algoritm = egovframe
|
||||
|
|
@ -1,6 +0,0 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
||||
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
||||
<mapper namespace="com.dbnt.kcscbackend.admin.config.mapper.AdminConfigMapper">
|
||||
|
||||
</mapper>
|
||||
|
|
@ -0,0 +1,46 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
||||
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
||||
<mapper namespace="com.dbnt.kcscbackend.admin.users.mapper.AdminUsersMapper">
|
||||
|
||||
<select id="selectUserList" parameterType="UserInfo" resultType="UserInfo">
|
||||
select user_seq,
|
||||
user_id,
|
||||
email,
|
||||
user_se,
|
||||
user_nm,
|
||||
phone_num,
|
||||
user_role,
|
||||
use_yn
|
||||
from user_info
|
||||
<include refid="selectUserListWhere"></include>
|
||||
order by user_seq asc
|
||||
limit #{rowCnt} offset #{firstIndex}
|
||||
</select>
|
||||
|
||||
<select id="selectUserListCnt" parameterType="UserInfo" resultType="int">
|
||||
select count(*)
|
||||
from user_info
|
||||
<include refid="selectUserListWhere"></include>
|
||||
</select>
|
||||
|
||||
<sql id="selectUserListWhere">
|
||||
<where>
|
||||
<if test='userSe != null and userSe != ""'>
|
||||
and user_se = #{userSe}
|
||||
</if>
|
||||
<if test='searchCondition == "id"'>
|
||||
and user_id like '%'||#{searchKeyword}||'%'
|
||||
</if>
|
||||
<if test='searchCondition == "name"'>
|
||||
and user_nm like '%'||#{searchKeyword}||'%'
|
||||
</if>
|
||||
<if test='searchCondition == "email"'>
|
||||
and email like '%'||#{searchKeyword}||'%'
|
||||
</if>
|
||||
<if test='searchCondition == "phoneNum"'>
|
||||
and phone_num like '%'||#{searchKeyword}||'%'
|
||||
</if>
|
||||
</where>
|
||||
</sql>
|
||||
</mapper>
|
||||
Loading…
Reference in New Issue