Initial commit

This commit is contained in:
2025-10-28 15:50:53 +08:00
commit 297ef231c5
31 changed files with 12708 additions and 0 deletions

667
partner alignment SDD.txt Normal file
View File

@@ -0,0 +1,667 @@
<EFBFBD>٦<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>t<EFBFBD><EFBFBD> - <20>n<EFBFBD><6E><EFBFBD>]<5D>p<EFBFBD><70><EFBFBD><EFBFBD> (SDD)
1. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>T
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>: 1.0
<EFBFBD>̫<EFBFBD><EFBFBD><EFBFBD><EFBFBD>s: 2025<32>~10<31><30>
<EFBFBD><EFBFBD><EFBFBD>󪬺A: <20>
<EFBFBD>M<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: <20><><EFBFBD><EFBFBD><EFBFBD>޲z<DEB2>t<EFBFBD><74>
2. <20><><EFBFBD><EFBFBD><EFBFBD>K<EFBFBD>n
2.1 <20>M<EFBFBD>ץؼ<D7A5>
<EFBFBD>إߤ@<40>M<EFBFBD><4D><EFBFBD><EFBFBD>٦<EFBFBD><D9A6><EFBFBD><EFBFBD>O<EFBFBD><4F><EFBFBD><EFBFBD><EFBFBD>P<EFBFBD><50><EFBFBD><EFBFBD><EFBFBD>޲z<DEB2><7A><EFBFBD>x<EFBFBD>A<EFBFBD>z<EFBFBD>L<EFBFBD><4C>ı<EFBFBD>Ʃ<EFBFBD><C6A9>Ԥ<EFBFBD><D4A4><EFBFBD>²<EFBFBD>Ư<EFBFBD><C6AF>O<EFBFBD><4F><EFBFBD><EFBFBD><EFBFBD>y<EFBFBD>{<7B>A<EFBFBD>þ<EFBFBD><C3BE>XSTAR<41>^<5E>X<EFBFBD><58><EFBFBD><EFBFBD><EFBFBD>P<EFBFBD>n<EFBFBD><6E><EFBFBD>ƦW<C6A6>t<EFBFBD>ΡA<CEA1><41><EFBFBD>ɲ<EFBFBD>´<EFBFBD><C2B4><EFBFBD><EFBFBD><EFBFBD>H<EFBFBD>~<7E>o<EFBFBD>i<EFBFBD>P<EFBFBD>޲z<DEB2>IJv<C4B2>C
2.2 <20>֤߻<D6A4><DFBB>ȥD<C8A5>i
* <20>IJv<C4B2><76><EFBFBD><EFBFBD>: <20><><EFBFBD>Ԧ<EFBFBD><D4A6>ާ@<40><><EFBFBD><EFBFBD>50%<25>H<EFBFBD>W<EFBFBD><57><EFBFBD><EFBFBD><EFBFBD>ɶ<EFBFBD>
* <20><><EFBFBD>c<EFBFBD>Ʀ^<5E>X: STAR<41>ج[<5B>T<EFBFBD>O<EFBFBD>^<5E>X<EFBFBD>~<7E><><EFBFBD>P<EFBFBD>i<EFBFBD>l<EFBFBD>ܩ<EFBFBD>
* <20>E<EFBFBD>y<EFBFBD><79><EFBFBD><EFBFBD>: <20>n<EFBFBD><6E><EFBFBD>ƦW<C6A6>t<EFBFBD>ΫP<CEAB>i<EFBFBD><69><EFBFBD>u<EFBFBD><75><EFBFBD>򦨪<EFBFBD>
* <20><><EFBFBD><EFBFBD><EFBFBD>X<EFBFBD><58>: <20><><EFBFBD><EFBFBD><E3AABA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƥ<EFBFBD><C6A4>R<EFBFBD>P<EFBFBD>ץX<D7A5>\<5C><>
2.3 <20><><EFBFBD><EFBFBD>\<5C><><EFBFBD><EFBFBD>
* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>v<EFBFBD><76><EFBFBD><EFBFBD>30%
* <20>^<5E>X<EFBFBD>~<7E><><EFBFBD>зǤƹF90%
* <20>t<EFBFBD>Ψϥβv<CEB2>F80%<25>H<EFBFBD>W
3. <20>t<EFBFBD>ά[<5B>c<EFBFBD>]<5D>p
3.1 <20>޳N<DEB3>[<5B>c<EFBFBD><63><EFBFBD><EFBFBD>
<EFBFBD>z<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>{
<EFBFBD>x <20>e<EFBFBD>ݼh (Presentation) <20>x
<EFBFBD>x HTML5 + Bootstrap 5 + JavaScript <20>x
<EFBFBD>|<7C>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>s<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>}
<20>x HTTP/REST API
<EFBFBD>z<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD><EFBFBD><EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>{
<EFBFBD>x <20><><EFBFBD>μh (Application) <20>x
<EFBFBD>x Python Flask + SQLAlchemy <20>x
<EFBFBD>|<7C>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>s<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>}
<20>x ORM
<EFBFBD>z<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD><EFBFBD><EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>{
<EFBFBD>x <20><><EFBFBD>Ƽh (Data) <20>x
<EFBFBD>x MySQL 5.7+ <20>x
<EFBFBD>|<7C>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>}
3.2 <20>t<EFBFBD>Τ<EFBFBD><CEA4>h<EFBFBD><68><EFBFBD><EFBFBD>
3.2.1 <20>e<EFBFBD>ݼh
* ¾<>d: <20>ϥΪ̤<CEAA><CCA4><EFBFBD><EFBFBD>B<EFBFBD><42><EFBFBD><EFBFBD><EFBFBD>޿<EFBFBD><DEBF>B<EFBFBD><42><EFBFBD>Ʈi<C6AE><69>
* <20>޳N<DEB3>﫬:
o Bootstrap 5: <20>T<EFBFBD><54><EFBFBD><EFBFBD>UI<55>ج[
o <20><><EFBFBD><EFBFBD>JavaScript: <20><><EFBFBD>ԥ\<5C><><EFBFBD>B<EFBFBD><42><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
o HTML5 Drag & Drop API: <20><><EFBFBD>O<EFBFBD><4F><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ԥ<EFBFBD><D4A4><EFBFBD>
* <20><><EFBFBD><EFBFBD><EFBFBD>Ҳ<EFBFBD>:
o app.js: <20><><EFBFBD><EFBFBD><EFBFBD>u<EFBFBD><75><EFBFBD><EFBFBD><EFBFBD>ƻPAPI<50>q<EFBFBD>T
o assessment.js: <20><><EFBFBD>O<EFBFBD><4F><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>޿<EFBFBD>
o admin.js: <20><><EFBFBD>x<EFBFBD>޲z<DEB2><7A><EFBFBD><EFBFBD><EFBFBD>޿<EFBFBD>
3.2.2 <20><><EFBFBD>μh
* ¾<>d: <20>~<7E><><EFBFBD>޿<EFBFBD><DEBF>B<EFBFBD><42><EFBFBD>ƳB<C6B3>z<EFBFBD>BAPI<50><49><EFBFBD><EFBFBD>
* <20>޳N<DEB3>﫬:
o Flask 2.x: <20><><EFBFBD>q<EFBFBD><71>Web<65>ج[
o SQLAlchemy: ORM<52><4D><EFBFBD>Ʈw<C6AE><77><EFBFBD>H<EFBFBD>h
o Flask-CORS: <20><><EFBFBD><EFBFBD><EFBFBD>ШD<D0A8>B<EFBFBD>z
o pandas + openpyxl: <20><><EFBFBD>ƶץX
* <20>w<EFBFBD><77><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
o <20><><EFBFBD><EFBFBD><EFBFBD>ܼƺ޲z<DEB2>ӷP<D3B7><50><EFBFBD>T
o CORS<52><53><EFBFBD><EFBFBD><ECADAD>
o <20><><EFBFBD>J<EFBFBD><4A><EFBFBD>һPSQL<51>`<60>J<EFBFBD><4A><EFBFBD>@
o <20><><EFBFBD>~<7E>B<EFBFBD>z<EFBFBD><7A><EFBFBD><EFBFBD>
3.2.3 <20><><EFBFBD>Ƽh
* ¾<>d: <20><><EFBFBD>ƫ<EFBFBD><C6AB>[<5B>ơB<C6A1>d<EFBFBD><64><EFBFBD>u<EFBFBD><75>
* <20>޳N<DEB3>﫬: MySQL 5.7+
* <20><><EFBFBD><EFBFBD><EFBFBD>S<EFBFBD><53>:
o <20>ưȳB<C8B3>z<EFBFBD>O<EFBFBD>Ҹ<EFBFBD><D2B8>Ƥ@<40>P<EFBFBD><50>
o <20><><EFBFBD><EFBFBD><EFBFBD>u<EFBFBD>Ƭd<C6AC>߮į<DFAE>
o JSON<4F><4E><EFBFBD><EFBFBD><EFBFBD>x<EFBFBD>s<EFBFBD>u<EFBFBD>ʸ<EFBFBD><CAB8><EFBFBD>
4. <20><><EFBFBD>Ʈw<C6AE>]<5D>p
4.1 ER<45><52><EFBFBD>Y<EFBFBD><59>
<EFBFBD>z<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>{ <20>z<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>{
<EFBFBD>x assessments <20>x <20>x capabilities <20>x
<EFBFBD>x (<28><><EFBFBD>O<EFBFBD><4F><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>) <20>x <20>x (<28><><EFBFBD>O<EFBFBD><4F><EFBFBD>ةw<D8A9>q) <20>x
<EFBFBD>|<7C>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>} <20>|<7C>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>}
<20>x
<20>x
<20><>
<EFBFBD>z<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>{ <20>z<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>{
<EFBFBD>x star_feedbacks <20>x<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w?<3F>x employee_points <20>x
<EFBFBD>x (STAR<41>^<5E>X) <20>x <20>x (<28><><EFBFBD>u<EFBFBD>n<EFBFBD><6E>) <20>x
<EFBFBD>|<7C>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>} <20>|<7C>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>}
<20>x <20>x
<20>x <20><>
<20>x <20>z<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>{
<20>|<7C>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w?<3F>x monthly_rankings <20>x
<20>x (<28><><EFBFBD>ױƦW) <20>x
<20>|<7C>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>}
4.2 <20><><EFBFBD>ƪ<EFBFBD><C6AA><EFBFBD><EFBFBD>c
4.2.1 assessments (<28><><EFBFBD>O<EFBFBD><4F><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>W<EFBFBD><EFBFBD>
<EFBFBD><EFBFBD><EFBFBD>ƫ<EFBFBD><EFBFBD>O
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
id
INT
<EFBFBD>D<EFBFBD><EFBFBD>
PK, AUTO_INCREMENT
department
VARCHAR(100)
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
NOT NULL
position
VARCHAR(100)
¾<EFBFBD><EFBFBD>
NOT NULL
employee_name
VARCHAR(100)
<EFBFBD><EFBFBD><EFBFBD>u<EFBFBD>m<EFBFBD>W
NULL
assessment_data
JSON
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
NOT NULL
created_at
DATETIME
<EFBFBD>إ߮ɶ<EFBFBD>
DEFAULT CURRENT_TIMESTAMP
updated_at
DATETIME
<EFBFBD><EFBFBD><EFBFBD>s<EFBFBD>ɶ<EFBFBD>
ON UPDATE CURRENT_TIMESTAMP
<EFBFBD><EFBFBD><EFBFBD>޵<EFBFBD><EFBFBD><EFBFBD>:
* idx_department: (department)
* idx_position: (position)
* idx_created_at: (created_at)
4.2.2 capabilities (<28><><EFBFBD>O<EFBFBD><4F><EFBFBD>ةw<D8A9>q)
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>W<EFBFBD><EFBFBD>
<EFBFBD><EFBFBD><EFBFBD>ƫ<EFBFBD><EFBFBD>O
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
id
INT
<EFBFBD>D<EFBFBD><EFBFBD>
PK, AUTO_INCREMENT
name
VARCHAR(200)
<EFBFBD><EFBFBD><EFBFBD>O<EFBFBD>W<EFBFBD><EFBFBD>
NOT NULL, UNIQUE
l1_description
TEXT
L1<EFBFBD><EFBFBD><EFBFBD>Ż<EFBFBD><EFBFBD><EFBFBD>
NULL
l2_description
TEXT
L2<EFBFBD><EFBFBD><EFBFBD>Ż<EFBFBD><EFBFBD><EFBFBD>
NULL
l3_description
TEXT
L3<EFBFBD><EFBFBD><EFBFBD>Ż<EFBFBD><EFBFBD><EFBFBD>
NULL
l4_description
TEXT
L4<EFBFBD><EFBFBD><EFBFBD>Ż<EFBFBD><EFBFBD><EFBFBD>
NULL
l5_description
TEXT
L5<EFBFBD><EFBFBD><EFBFBD>Ż<EFBFBD><EFBFBD><EFBFBD>
NULL
is_active
BOOLEAN
<EFBFBD>O<EFBFBD>_<EFBFBD>ҥ<EFBFBD>
DEFAULT TRUE
4.2.3 star_feedbacks (STAR<41>^<5E>X)
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>W<EFBFBD><EFBFBD>
<EFBFBD><EFBFBD><EFBFBD>ƫ<EFBFBD><EFBFBD>O
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
id
INT
<EFBFBD>D<EFBFBD><EFBFBD>
PK, AUTO_INCREMENT
evaluator_name
VARCHAR(100)
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̩m<EFBFBD>W
NOT NULL
evaluatee_name
VARCHAR(100)
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̩m<EFBFBD>W
NOT NULL
evaluatee_department
VARCHAR(100)
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̳<EFBFBD><EFBFBD><EFBFBD>
NOT NULL
evaluatee_position
VARCHAR(100)
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>¾<EFBFBD><EFBFBD>
NOT NULL
situation
TEXT
<EFBFBD><EFBFBD><EFBFBD>Ҵy<EFBFBD>z
NOT NULL
task
TEXT
<EFBFBD><EFBFBD><EFBFBD>Ȼ<EFBFBD><EFBFBD><EFBFBD>
NOT NULL
action
TEXT
<EFBFBD><EFBFBD><EFBFBD>ʴy<EFBFBD>z
NOT NULL
result
TEXT
<EFBFBD><EFBFBD><EFBFBD>G<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
NOT NULL
score
INT
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>(1-5)
CHECK (score BETWEEN 1 AND 5)
points_earned
INT
<EFBFBD><EFBFBD><EFBFBD>o<EFBFBD>n<EFBFBD><EFBFBD>
NOT NULL
feedback_date
DATE
<EFBFBD>^<5E>X<EFBFBD><58><EFBFBD><EFBFBD>
NOT NULL
created_at
DATETIME
<EFBFBD>إ߮ɶ<EFBFBD>
DEFAULT CURRENT_TIMESTAMP
<EFBFBD><EFBFBD><EFBFBD>޵<EFBFBD><EFBFBD><EFBFBD>:
* idx_evaluatee: (evaluatee_name, evaluatee_department)
* idx_feedback_date: (feedback_date)
<EFBFBD>n<EFBFBD><EFBFBD><EFBFBD>p<EFBFBD><EFBFBD><EFBFBD>W<EFBFBD>h: points_earned = score <20><> 10
4.2.4 employee_points (<28><><EFBFBD>u<EFBFBD>n<EFBFBD><6E>)
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>W<EFBFBD><EFBFBD>
<EFBFBD><EFBFBD><EFBFBD>ƫ<EFBFBD><EFBFBD>O
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
id
INT
<EFBFBD>D<EFBFBD><EFBFBD>
PK, AUTO_INCREMENT
employee_name
VARCHAR(100)
<EFBFBD><EFBFBD><EFBFBD>u<EFBFBD>m<EFBFBD>W
NOT NULL, UNIQUE
department
VARCHAR(100)
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
NOT NULL
position
VARCHAR(100)
¾<EFBFBD><EFBFBD>
NOT NULL
total_points
INT
<EFBFBD>`<60>n<EFBFBD><6E>
DEFAULT 0
monthly_points
INT
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>n<EFBFBD><EFBFBD>
DEFAULT 0
last_updated
DATETIME
<EFBFBD>̫<EFBFBD><EFBFBD><EFBFBD><EFBFBD>s<EFBFBD>ɶ<EFBFBD>
ON UPDATE CURRENT_TIMESTAMP
<EFBFBD><EFBFBD><EFBFBD>޵<EFBFBD><EFBFBD><EFBFBD>:
* idx_total_points: (total_points DESC)
* idx_monthly_points: (monthly_points DESC)
4.2.5 monthly_rankings (<28><><EFBFBD>ױƦW)
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>W<EFBFBD><EFBFBD>
<EFBFBD><EFBFBD><EFBFBD>ƫ<EFBFBD><EFBFBD>O
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
id
INT
<EFBFBD>D<EFBFBD><EFBFBD>
PK, AUTO_INCREMENT
ranking_month
DATE
<EFBFBD>ƦW<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
NOT NULL
employee_name
VARCHAR(100)
<EFBFBD><EFBFBD><EFBFBD>u<EFBFBD>m<EFBFBD>W
NOT NULL
department
VARCHAR(100)
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
NOT NULL
position
VARCHAR(100)
¾<EFBFBD><EFBFBD>
NOT NULL
total_points
INT
<EFBFBD>Ӥ<EFBFBD><EFBFBD>`<60>n<EFBFBD><6E>
NOT NULL
ranking
INT
<EFBFBD>ƦW
NOT NULL
created_at
DATETIME
<EFBFBD>إ߮ɶ<EFBFBD>
DEFAULT CURRENT_TIMESTAMP
<EFBFBD><EFBFBD><EFBFBD>޵<EFBFBD><EFBFBD><EFBFBD>:
* idx_ranking_month: (ranking_month, ranking)
* unique_month_employee: (ranking_month, employee_name) UNIQUE
5. <20>\<5C><><EFBFBD>Ҳճ]<5D>p
5.1 <20>Ҳլ[<5B>c<EFBFBD><63>
<EFBFBD>z<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>{
<EFBFBD>x <20>t<EFBFBD>ΥD<CEA5><44> <20>x
<EFBFBD>x (index.html) <20>x
<EFBFBD>|<7C>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>s<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>s<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>s<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>s<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>}
<20>x <20>x <20>x <20>x
<20>z<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD><77><EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>{ <20>z<EFBFBD>w<EFBFBD>w<EFBFBD><77><EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>{ <20>z<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD><77><EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>{ <20>z<EFBFBD>w<EFBFBD>w<EFBFBD><77><EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>{
<20>x<EFBFBD><78><EFBFBD>O<EFBFBD><4F><EFBFBD><EFBFBD><EFBFBD>x <20>xSTAR <20>x <20>x<EFBFBD>Ʀ<EFBFBD><C6A6>] <20>x <20>x<EFBFBD>޲z <20>x
<20>x<EFBFBD>Ҳ<EFBFBD> <20>x <20>x<EFBFBD>^<5E>X <20>x <20>x<EFBFBD>Ҳ<EFBFBD> <20>x <20>x<EFBFBD><78><EFBFBD>x <20>x
<20>x <20>x <20>x<EFBFBD>Ҳ<EFBFBD> <20>x <20>x <20>x <20>x<EFBFBD>Ҳ<EFBFBD> <20>x
<20>|<7C>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>} <20>|<7C>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>} <20>|<7C>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>} <20>|<7C>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>w<EFBFBD>}
5.2 <20>֤ߥ\<5C><><EFBFBD>Ҳ<EFBFBD>
5.2.1 <20><><EFBFBD>O<EFBFBD><4F><EFBFBD><EFBFBD><EFBFBD>Ҳ<EFBFBD>
<EFBFBD>\<5C><><EFBFBD>ؼ<EFBFBD>: <20><><EFBFBD>Ѫ<EFBFBD><D1AA>[<5B><><EFBFBD><EFBFBD><EFBFBD>O<EFBFBD><4F><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>A<EFBFBD><EFBFBD><E4B4A9><EFBFBD>Ԧ<EFBFBD><D4A6>ާ@<40>i<EFBFBD><69><EFBFBD><EFBFBD><EFBFBD>O<EFBFBD><4F><EFBFBD>Ť<EFBFBD><C5A4>t
<EFBFBD><EFBFBD><EFBFBD>J:
* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (<28><><EFBFBD><EFBFBD>)
* ¾<><C2BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (<28><><EFBFBD><EFBFBD>)
* <20><><EFBFBD>u<EFBFBD>m<EFBFBD>W (<28><><EFBFBD><EFBFBD>)
* <20><><EFBFBD>O<EFBFBD><4F><EFBFBD>ة<EFBFBD><D8A9>Ծާ@
<EFBFBD>B<EFBFBD>z<EFBFBD>޿<EFBFBD>:
1. <20><><EFBFBD>J<EFBFBD><4A><EFBFBD>O<EFBFBD><4F><EFBFBD>زM<D8B2><4D>
2. <20><><EFBFBD>l<EFBFBD><6C>5<EFBFBD>ӵ<EFBFBD><D3B5>Ůe<C5AE><65> (L1-L5)
3. <20><>ť<EFBFBD><C5A5><EFBFBD>Ԩƥ<D4A8>
4. <20><><EFBFBD>ҥ<EFBFBD><D2A5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
5. <20>ո˵<D5B8><CBB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>JSON
6. <20><><EFBFBD><EFBFBD><EFBFBD>ܫ<EFBFBD><DCAB><EFBFBD>API
<EFBFBD><EFBFBD><EFBFBD>X:
* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>G<EFBFBD>x<EFBFBD>s<EFBFBD>ܸ<EFBFBD><DCB8>Ʈw
* <20><><EFBFBD>ܦ<EFBFBD><DCA6>\/<2F><><EFBFBD>ѰT<D1B0><54>
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>޳N:
// <20><><EFBFBD>Ԩƥ<D4A8><C6A5>B<EFBFBD>z
element.addEventListener('dragstart', handleDragStart);
element.addEventListener('dragover', handleDragOver);
element.addEventListener('drop', handleDrop);
// <20><><EFBFBD>Ƶ<EFBFBD><C6B5>c
{
"department": "<22>޳N<DEB3><4E>",
"position": "<22><><EFBFBD>`<60>u<EFBFBD>{<7B>v",
"employee_name": "<22>i<EFBFBD>T",
"capabilities": {
"L1": ["<22><><EFBFBD>O1", "<22><><EFBFBD>O2"],
"L2": ["<22><><EFBFBD>O3"],
...
}
}
5.2.2 STAR<41>^<5E>X<EFBFBD>Ҳ<EFBFBD>
<EFBFBD>\<5C><><EFBFBD>ؼ<EFBFBD>: <20><><EFBFBD>c<EFBFBD>Ʀ^<5E>X<EFBFBD><58><EFBFBD><EFBFBD><EFBFBD>A<EFBFBD>P<EFBFBD>i<EFBFBD><69><EFBFBD>Ī<EFBFBD><C4AA>Z<EFBFBD>ķ<EFBFBD><C4B7>q<EFBFBD>P<EFBFBD>O<EFBFBD><4F>
STAR<EFBFBD>ج[<5B><><EFBFBD><EFBFBD>:
* S - Situation (<28><><EFBFBD><EFBFBD>): <20>y<EFBFBD>z<EFBFBD>ƥ<EFBFBD><C6A5>o<EFBFBD>ͪ<EFBFBD><CDAA>I<EFBFBD><49><EFBFBD>ߵ<EFBFBD>
* T - Task (<28><><EFBFBD><EFBFBD>): <20><><EFBFBD><EFBFBD><EFBFBD>ݭn<DDAD>F<EFBFBD><46><EFBFBD><EFBFBD><EFBFBD>ؼЩγd<CEB3><64>
* A - Action (<28><><EFBFBD><EFBFBD>): <20>ԭz<D4AD>Ĩ<EFBFBD><C4A8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>B<EFBFBD>J<EFBFBD>P<EFBFBD><50><EFBFBD><EFBFBD>
* R - Result (<28><><EFBFBD>G): <20>q<EFBFBD><71>/<2F><><EFBFBD>ƪ<EFBFBD><C6AA><EFBFBD><EFBFBD>G<EFBFBD>P<EFBFBD>v<EFBFBD>T
<EFBFBD><EFBFBD><EFBFBD>J<EFBFBD><EFBFBD><EFBFBD>ҳW<EFBFBD>h:
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
<EFBFBD><EFBFBD><EFBFBD>ҳW<EFBFBD>h
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̩m<EFBFBD>W
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>, 2-50<35>r<EFBFBD><72>
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̩m<EFBFBD>W
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>, 2-50<35>r<EFBFBD><72>
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
¾<EFBFBD><EFBFBD>
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>, 1-5<><35><EFBFBD><EFBFBD>
S/T/A/R
<EFBFBD>U<EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20>̤<EFBFBD>10<31>r<EFBFBD><72>
<EFBFBD>^<5E>X<EFBFBD><58><EFBFBD><EFBFBD>
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD>i<EFBFBD><69><EFBFBD>Ӥ<EFBFBD><D3A4><EFBFBD>
<EFBFBD>n<EFBFBD><EFBFBD><EFBFBD>p<EFBFBD><EFBFBD>:
points_earned = score * 10
# <20>d<EFBFBD><64>: <20><><EFBFBD><EFBFBD>4<EFBFBD><34> <20><> <20><><EFBFBD>o40<34>n<EFBFBD><6E>
<EFBFBD>~<7E>Ȭy<C8AC>{:
1. <20><><EFBFBD>g<EFBFBD>򥻸<EFBFBD><F2A5BBB8>T (<28><><EFBFBD><EFBFBD><EFBFBD>̡B<CCA1><42><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
2. <20><><EFBFBD>ܵ<EFBFBD><DCB5><EFBFBD> (1-5<><35>)
3. <20><>STAR<41><52><EFBFBD>c<EFBFBD><63><EFBFBD>g<EFBFBD>^<5E>X
4. <20>w<EFBFBD><77><EFBFBD>^<5E>X<EFBFBD><58><EFBFBD>e
5. <20><><EFBFBD><EFBFBD><EFBFBD>^<5E>X
6. <20>۰ʧ<DBB0><CAA7>s<EFBFBD><73><EFBFBD><EFBFBD><EFBFBD>̿n<CCBF><6E>
7. IJ<>o<EFBFBD>ƦW<C6A6><57><EFBFBD><EFBFBD> (<28><><EFBFBD><EFBFBD>)
5.2.3 <20>n<EFBFBD><6E><EFBFBD>ƦW<C6A6>Ҳ<EFBFBD>
<EFBFBD>\<5C><><EFBFBD>ؼ<EFBFBD>: <20>i<EFBFBD>ܭ<EFBFBD><DCAD>u<EFBFBD>n<EFBFBD><6E><EFBFBD>ƦW<C6A6>A<EFBFBD><41><EFBFBD>ѿE<D1BF>y<EFBFBD><79><EFBFBD><EFBFBD><EFBFBD>P<EFBFBD>Z<EFBFBD>ĥi<C4A5><69><EFBFBD><EFBFBD>
<EFBFBD>ƦW<EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
1. <20>`<60>n<EFBFBD><6E><EFBFBD>Ʀ<EFBFBD><C6A6>]: <20>֭p<D6AD>Ҧ<EFBFBD><D2A6><EFBFBD><EFBFBD>v<EFBFBD>n<EFBFBD><6E>
2. <20><><EFBFBD>ױƦ<D7B1><C6A6>]: <20>S<EFBFBD>w<EFBFBD><77><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>n<EFBFBD><6E><EFBFBD>ƦW
3. <20><><EFBFBD><EFBFBD><EFBFBD>Ʀ<EFBFBD><C6A6>]: <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>z<EFBFBD><EFBFBD>ƦW
<EFBFBD>ƦW<EFBFBD>p<EFBFBD><EFBFBD><EFBFBD>޿<EFBFBD>:
# <20>C<EFBFBD><43>1<EFBFBD><31><EFBFBD>۰ʰ<DBB0><CAB0><EFBFBD>
def calculate_monthly_ranking():
# 1. <20>έp<CEAD>W<EFBFBD><57><EFBFBD>Ҧ<EFBFBD><D2A6><EFBFBD><EFBFBD>u<EFBFBD>n<EFBFBD><6E>
# 2. <20><><EFBFBD>n<EFBFBD><6E><EFBFBD><EFBFBD><EFBFBD>DZƧ<C7B1>
# 3. <20>B<EFBFBD>z<EFBFBD>æC<C3A6>ƦW
# 4. <20>g<EFBFBD>J monthly_rankings <20><>
# 5. <20><><EFBFBD>m employee_points.monthly_points
<EFBFBD>ƦW<EFBFBD>W<EFBFBD>h:
* <20>n<EFBFBD><6E><EFBFBD>ۦP<DBA6>ɨæC<C3A6>P<EFBFBD>W<EFBFBD><57>
* <20>U<EFBFBD>@<40>W<EFBFBD><57><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (<28><>: 2<>W<EFBFBD>æC<C3A6><43>3, <20>U<EFBFBD>@<40>W<EFBFBD><57><EFBFBD><EFBFBD>5)
* <20>s<EFBFBD>n<EFBFBD><6E><EFBFBD><EFBFBD><EFBFBD>C<EFBFBD>J<EFBFBD>ƦW
<EFBFBD>d<EFBFBD>ߥ\<5C><>:
* <20>~<7E><><EFBFBD><EFBFBD><EFBFBD>ܾ<EFBFBD>
* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܾ<EFBFBD>
* <20><><EFBFBD><EFBFBD><EFBFBD>z<EFBFBD>
* <20><><EFBFBD>v<EFBFBD>ƦW<C6A6><57><EFBFBD><EFBFBD>
5.2.4 <20><><EFBFBD>ƺ޲z<DEB2>Ҳ<EFBFBD>
<EFBFBD>\<5C><><EFBFBD>ؼ<EFBFBD>: <20><><EFBFBD>ѧ<EFBFBD><D1A7><EFBFBD><E3AABA><EFBFBD><EFBFBD><EFBFBD>˵<EFBFBD><CBB5>B<EFBFBD>d<EFBFBD>ߡB<DFA1>ץX<D7A5>\<5C><>
<EFBFBD>d<EFBFBD>߱<EFBFBD><EFBFBD><EFBFBD>:
* <20><><EFBFBD><EFBFBD><EFBFBD>z<EFBFBD><7A>
* ¾<><C2BE><EFBFBD>z<EFBFBD><7A>
* <20><><EFBFBD>u<EFBFBD>m<EFBFBD>W<EFBFBD>j<EFBFBD>M
* <20><><EFBFBD><EFBFBD><EFBFBD>϶<EFBFBD><CFB6>z<EFBFBD><7A>
* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>z<EFBFBD><7A>
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>]<5D>p:
* <20>C<EFBFBD><43><EFBFBD><EFBFBD><EFBFBD><EFBFBD>20<32><30>
* <20><><EFBFBD><EFBFBD><EFBFBD>`<60><><EFBFBD><EFBFBD>
* <20><><EFBFBD>X<EFBFBD>ɯ<EFBFBD>
<EFBFBD>ץX<EFBFBD>\<5C><>:
1. Excel<65>榡 (.xlsx):
o <20>ϥ<EFBFBD> openpyxl <20>ͦ<EFBFBD>
o <20>]<5D>t<EFBFBD><EFBFBD>ƪ<EFBFBD><C6AA>Y
o <20><EFBFBD>h<EFBFBD>u<EFBFBD>@<40><>
2. CSV<53>榡:
o UTF-8 BOM<4F>s<EFBFBD>X (Excel<65>ۮe)
o <20>r<EFBFBD><72><EFBFBD><EFBFBD><EFBFBD>j
o <20>޸<EFBFBD><DEB8>]<5D>ЯS<D0AF><53><EFBFBD>r<EFBFBD><72>
<EFBFBD>ץX<EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƶץX:
- ID, <20><><EFBFBD><EFBFBD>, ¾<><C2BE>, <20><><EFBFBD>u<EFBFBD>m<EFBFBD>W, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20>إ߮ɶ<DFAE>
STAR<EFBFBD>^<5E>X<EFBFBD>ץX:
- ID, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD>, ¾<><C2BE>, S/T/A/R<><52><EFBFBD>e, <20><><EFBFBD><EFBFBD>, <20>n<EFBFBD><6E>, <20>^<5E>X<EFBFBD><58><EFBFBD><EFBFBD>, <20>إ߮ɶ<DFAE>
6. API<50><49><EFBFBD>I<EFBFBD>]<5D>p
6.1 RESTful API<50>W<EFBFBD>d
<EFBFBD><EFBFBD>¦URL: http://{host}:{port}
Content-Type: application/json
<EFBFBD>r<EFBFBD><EFBFBD><EFBFBD>s<EFBFBD>X: UTF-8
6.2 API<50><49><EFBFBD>I<EFBFBD>M<EFBFBD><4D>
6.2.1 <20><><EFBFBD>O<EFBFBD><4F><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
GET /api/capabilities
* <20>\<5C><>: <20><><EFBFBD>o<EFBFBD>Ҧ<EFBFBD><D2A6>ҥΪ<D2A5><CEAA><EFBFBD><EFBFBD>O<EFBFBD><4F><EFBFBD><EFBFBD>
* <20>ШD<D0A8>Ѽ<EFBFBD>: <20>L
* <20>^<5E><><EFBFBD>d<EFBFBD><64>:
{
"capabilities": [
{
"id": 1,
"name": "<22>{<7B><><EFBFBD>]<5D>p<EFBFBD>P<EFBFBD>}<7D>o",
"l1_description": "...",
"l2_description": "...",
"l3_description": "...",
"l4_description": "...",
"l5_description": "..."
}
]
}
POST /api/assessments
* <20>\<5C><>: <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>O<EFBFBD><4F><EFBFBD><EFBFBD>
* <20>ШDBody:
{
"department": "<22>޳N<DEB3><4E>",
"position": "<22><><EFBFBD>`<60>u<EFBFBD>{<7B>v",
"employee_name": "<22>i<EFBFBD>T",
"assessment_data": {
"L1": ["<22><><EFBFBD>O1"],
"L2": ["<22><><EFBFBD>O2", "<22><><EFBFBD>O3"],
...
}
}
* <20><><EFBFBD>ҳW<D2B3>h:
o department: <20><><EFBFBD><EFBFBD>
o position: <20><><EFBFBD><EFBFBD>
o assessment_data: <20><><EFBFBD><EFBFBD>, <20>ܤ֤@<40>ӯ<EFBFBD><D3AF>O<EFBFBD><4F><EFBFBD><EFBFBD>
* <20><><EFBFBD>\<5C>^<5E><> (201):
{
"success": true,
"message": "<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>\",
"assessment_id": 123
}
6.2.2 STAR<41>^<5E>X<EFBFBD><58><EFBFBD><EFBFBD>
POST /api/star-feedbacks
* <20>\<5C><>: <20><><EFBFBD><EFBFBD>STAR<41>^<5E>X
* <20>ШDBody:
{
"evaluator_name": "<22><><EFBFBD>|",
"evaluatee_name": "<22>i<EFBFBD>T",
"evaluatee_department": "<22>޳N<DEB3><4E>",
"evaluatee_position": "<22><><EFBFBD>`<60>u<EFBFBD>{<7B>v",
"situation": "<22>M<EFBFBD>׺<EFBFBD><D7BA><EFBFBD><EFBFBD>ݨD...",
"task": "<22>ݦb48<34>p<EFBFBD>ɤ<EFBFBD>...",
"action": "<22><>´<EFBFBD>󳡪<EFBFBD><F3B3A1AA>|ij...",
"result": "<22><><EFBFBD>\<5C><><EFBFBD>I<EFBFBD>\<5C><>...",
"score": 4,
"feedback_date": "2025-10-15"
}
* <20>~<7E><><EFBFBD>޿<EFBFBD>:
1. <20>p<EFBFBD><70><EFBFBD>n<EFBFBD><6E>: points_earned = score * 10
2. <20><><EFBFBD>s employee_points <20><>
3. <20>s<EFBFBD>W<EFBFBD>^<5E>X<EFBFBD>O<EFBFBD><4F>
* <20><><EFBFBD>\<5C>^<5E><> (201):
{
"success": true,
"message": "<22>^<5E>X<EFBFBD><58><EFBFBD><EFBFBD>\",
"points_earned": 40
}
6.2.3 <20>ƦW<C6A6><57><EFBFBD><EFBFBD>
GET /api/rankings/total
* <20>\<5C><>: <20><><EFBFBD>o<EFBFBD>`<60>n<EFBFBD><6E><EFBFBD>Ʀ<EFBFBD><C6A6>]
* <20>ШD<D0A8>Ѽ<EFBFBD>:
o department (<28><><EFBFBD><EFBFBD>): <20><><EFBFBD><EFBFBD><EFBFBD>z<EFBFBD><7A>
o limit (<28><><EFBFBD><EFBFBD>): <20><><EFBFBD>ܵ<EFBFBD><DCB5><EFBFBD>, <20>w<EFBFBD>]50
* <20>^<5E><><EFBFBD>d<EFBFBD><64>:
{
"rankings": [
{
"rank": 1,
"employee_name": "<22>i<EFBFBD>T",
"department": "<22>޳N<DEB3><4E>",
"position": "<22><><EFBFBD>`<60>u<EFBFBD>{<7B>v",
"total_points": 450
}
]
}
GET /api/rankings/monthly
* <20>\<5C><>: <20><><EFBFBD>o<EFBFBD><6F><EFBFBD>ױƦ<D7B1><C6A6>]
* <20>ШD<D0A8>Ѽ<EFBFBD>:
o year (<28><><EFBFBD><EFBFBD>): <20>~<7E><>
o month (<28><><EFBFBD><EFBFBD>): <20><><EFBFBD><EFBFBD> (1-12)
o department (<28><><EFBFBD><EFBFBD>): <20><><EFBFBD><EFBFBD><EFBFBD>z<EFBFBD><7A>
* <20>^<5E><><EFBFBD>d<EFBFBD><64>:
{
"year": 2025,
"month": 10,
"rankings": [...]
}
POST /api/rankings/calculate
* <20>\<5C><>: <20><><EFBFBD><EFBFBD>IJ<EFBFBD>o<EFBFBD><6F><EFBFBD>ױƦW<C6A6>p<EFBFBD><70>
* <20>v<EFBFBD><76>: <20>޲z<DEB2><7A>
* <20>ШDBody:
{
"year": 2025,
"month": 10
}
6.2.4 <20><><EFBFBD>ƺ޲z<DEB2><7A><EFBFBD><EFBFBD>
GET /api/assessments
* <20>\<5C><>: <20>d<EFBFBD>ߵ<EFBFBD><DFB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* <20>ШD<D0A8>Ѽ<EFBFBD>:
o page (<28><><EFBFBD><EFBFBD>): <20><><EFBFBD>X, <20>w<EFBFBD>]1
o per_page (<28><><EFBFBD><EFBFBD>): <20>C<EFBFBD><43><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20>w<EFBFBD>]20
o department (<28><><EFBFBD><EFBFBD>): <20><><EFBFBD><EFBFBD><EFBFBD>z<EFBFBD><7A>
o position (<28><><EFBFBD><EFBFBD>): ¾<><C2BE><EFBFBD>z<EFBFBD><7A>
o employee_name (<28><><EFBFBD><EFBFBD>): <20><><EFBFBD>u<EFBFBD>m<EFBFBD>W<EFBFBD>j<EFBFBD>M
* <20>^<5E><><EFBFBD>d<EFBFBD><64>:
{
"assessments": [...],
"total": 150,
"page": 1,
"per_page": 20,
"pages": 8
}
GET /api/export/assessments
* <20>\<5C><>: <20>ץX<D7A5><58><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* <20>ШD<D0A8>Ѽ<EFBFBD>:
o format: excel | csv
o <20><><EFBFBD>L<EFBFBD>z<EFBFBD><7A><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>P<EFBFBD>W
* <20>^<5E><>: <20>ɮפU<D7A4><55>
GET /api/export/star-feedbacks
* <20>\<5C><>: <20>ץXSTAR<41>^<5E>X<EFBFBD><58><EFBFBD><EFBFBD>
* <20>ШD<D0A8>Ѽ<EFBFBD>:
o format: excel | csv
o <20>z<EFBFBD><7A><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
7. <20>D<EFBFBD>\<5C><><EFBFBD>ݨD
7.1 <20>į<EFBFBD><C4AF>ݨD
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
<EFBFBD>ؼЭ<EFBFBD>
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>J<EFBFBD>ɶ<EFBFBD>
< 2<><32>
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>P<EFBFBD>D<EFBFBD>n<EFBFBD>\<5C>
API<EFBFBD>^<5E><><EFBFBD>ɶ<EFBFBD>
< 500ms
95<EFBFBD>ʤ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
<EFBFBD>õo<EFBFBD>ϥΪ<EFBFBD>
100+
<EFBFBD>P<EFBFBD>ɦb<EFBFBD>u<EFBFBD>ϥΪ̼<EFBFBD>
<EFBFBD><EFBFBD><EFBFBD>Ʈw<EFBFBD>d<EFBFBD><EFBFBD>
< 100ms
<EFBFBD><EFBFBD>d<EFBFBD>߮ɶ<EFBFBD>
<EFBFBD>ɮ׶ץX
< 5<><35>
1000<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƥH<EFBFBD><EFBFBD>
<EFBFBD>į<EFBFBD><EFBFBD>u<EFBFBD>Ƶ<EFBFBD><EFBFBD><EFBFBD>:
* <20><><EFBFBD>Ʈw<C6AE><77><EFBFBD><EFBFBD><EFBFBD>u<EFBFBD><75>
* <20>e<EFBFBD>ݸ귽<DDB8><EAB7BD><EFBFBD>Y<EFBFBD>P<EFBFBD>֨<EFBFBD>
* <20><><EFBFBD><EFBFBD><EFBFBD>d<EFBFBD>߭<EFBFBD><DFAD>C<EFBFBD>t<EFBFBD><74>
* <20>D<EFBFBD>P<EFBFBD>B<EFBFBD>B<EFBFBD>z<EFBFBD>j<EFBFBD>q<EFBFBD><71><EFBFBD>ƶץX
7.2 <20>w<EFBFBD><77><EFBFBD>ݨD
7.2.1 <20><><EFBFBD>e<EFBFBD><65><EFBFBD>@
? <20>w<EFBFBD><77><EFBFBD>@:
* <20><><EFBFBD><EFBFBD><EFBFBD>ܼƺ޲z<DEB2>ӷP<D3B7><50><EFBFBD>T (.env)
* CORS<52><53><EFBFBD><EFBFBD><EFBFBD>ШD<D0A8><44><EFBFBD><EFBFBD>
* SQL<51>`<60>J<EFBFBD><4A><EFBFBD>@ (SQLAlchemy<6D>ѼƤƬd<C6AC><64>)
* XSS<53><53><EFBFBD>@ (<28><><EFBFBD>J<EFBFBD><4A><EFBFBD>һP<D2BB>M<EFBFBD>z)
* <20><><EFBFBD>~<7E>T<EFBFBD><54><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* HTTPS<50>䴩 (<28>ݰt<DDB0>m)
? <20><><EFBFBD><EFBFBD><EFBFBD>@ (<28>Ͳ<EFBFBD><CDB2><EFBFBD><EFBFBD>ҥ<EFBFBD><D2A5><EFBFBD>):
* <20>ϥΪ̨<CEAA><CCA8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* Session<6F>޲z
* <20><><EFBFBD><EFBFBD><EFBFBD>v<EFBFBD><76><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* <20>ާ@<40><><EFBFBD>x<EFBFBD>O<EFBFBD><4F>
* API<50>t<EFBFBD>v<EFBFBD><76><EFBFBD><EFBFBD>
7.2.2 <20>w<EFBFBD><77><EFBFBD>t<EFBFBD>m<EFBFBD>ˬd<CBAC>M<EFBFBD><4D>
<EFBFBD><EFBFBD><EFBFBD>p<EFBFBD>e<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
<EFBFBD><EFBFBD> <20>ͦ<EFBFBD><CDA6>w<EFBFBD><77><EFBFBD><EFBFBD> SECRET_KEY (32<33>r<EFBFBD><72><EFBFBD>H<EFBFBD>W)
<EFBFBD><EFBFBD> <20>]<5D>w<EFBFBD>j<EFBFBD>K<EFBFBD>X<EFBFBD><58><EFBFBD><EFBFBD><EFBFBD>Ʈw<C6AE>b<EFBFBD><62>
<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ͳ<EFBFBD><CDB2><EFBFBD><EFBFBD><EFBFBD> DEBUG <20>Ҧ<EFBFBD>
<EFBFBD><EFBFBD> <20>t<EFBFBD>m<EFBFBD><6D><EFBFBD>T<EFBFBD><54> CORS_ORIGINS
<EFBFBD><EFBFBD> <20>ҥ<EFBFBD> HTTPS (Let's Encrypt)
<EFBFBD><EFBFBD> <20>w<EFBFBD><77><EFBFBD>ƥ<EFBFBD><C6A5><EFBFBD><EFBFBD>Ʈw
<EFBFBD><EFBFBD> <20><><EFBFBD>@<40>ϥΪ̻{<7B>Ҩt<D2A8><74>
7.2.3 <20><>ij<EFBFBD><C4B3><EFBFBD>v<EFBFBD><76><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
<EFBFBD>v<EFBFBD><EFBFBD>
<EFBFBD>@<40><><EFBFBD><EFBFBD><EFBFBD>u
<EFBFBD><EFBFBD><EFBFBD>g<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>B<EFBFBD>˵<EFBFBD><EFBFBD>ۤv<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
<EFBFBD>D<EFBFBD><EFBFBD>
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>U<EFBFBD>ݡB<EFBFBD>˵<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
HR
<EFBFBD>˵<EFBFBD><EFBFBD>Ҧ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ơB<EFBFBD>ץX<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
<EFBFBD>t<EFBFBD>κ޲z<EFBFBD><EFBFBD>
<EFBFBD>Ҧ<EFBFBD><EFBFBD>v<EFBFBD><EFBFBD><EFBFBD>B<EFBFBD>t<EFBFBD>γ]<5D>w
7.3 <20>i<EFBFBD>ΩʻݨD
<EFBFBD>ؼ<EFBFBD>: <20>t<EFBFBD>Υi<CEA5>Ω<EFBFBD> ? 99%
<EFBFBD>e<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
* <20><><EFBFBD>Ʈw<C6AE>s<EFBFBD>u<EFBFBD><75><EFBFBD>վ<EFBFBD><D5BE><EFBFBD>
* <20>u<EFBFBD><75><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>~<7E>B<EFBFBD>z
* <20>͵<EFBFBD><CDB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>~<7E><><EFBFBD>ܰT<DCB0><54>
* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƼȦs (<28><><EFBFBD><EFBFBD><EFBFBD>~<7E><><EFBFBD><EFBFBD>)
<EFBFBD>ƥ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
* <20>C<EFBFBD><43><EFBFBD>۰ʸ<DBB0><CAB8>Ʈw<C6AE>ƥ<EFBFBD>
* <20>O<EFBFBD>d30<33>ѳƥ<D1B3><C6A5><EFBFBD><EFBFBD>v
* <20><><EFBFBD>a<EFBFBD>ƥ<EFBFBD> (<28><>ij)
7.4 <20>i<EFBFBD><69><EFBFBD>@<40>ʻݨD
<EFBFBD>{<7B><><EFBFBD>X<EFBFBD>~<7E><>:
* <20>ҲդƳ]<5D>p
* <20>M<EFBFBD><4D><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* <20><><EFBFBD>`PEP 8<>W<EFBFBD>d
* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Git)
<EFBFBD><EFBFBD><EFBFBD>󧹾<EFBFBD><EFBFBD><EFBFBD>:
* API<50><49><EFBFBD><EFBFBD>
* <20><><EFBFBD>ƮwSchema<6D><61><EFBFBD><EFBFBD>
* <20><><EFBFBD>p<EFBFBD><70><EFBFBD>U
* <20>ϥΪ̤<CEAA><CCA4>U
7.5 <20>ۮe<DBAE>ʻݨD
<EFBFBD>s<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>䴩:
* Chrome 90+
* Firefox 88+
* Safari 14+
* Edge 90+
* <20><><EFBFBD>䴩 IE
<EFBFBD>˸m<EFBFBD>䴩:
* <20><EFBFBD>q<EFBFBD><71> (<28>D<EFBFBD>n)
* <20><><EFBFBD>O<EFBFBD>q<EFBFBD><71> (<28>T<EFBFBD><54><EFBFBD><EFBFBD>)
* <20><><EFBFBD><EFBFBD> (<28><><EFBFBD><EFBFBD><EFBFBD>䴩)
<EFBFBD>ù<EFBFBD><EFBFBD>ѪR<EFBFBD><EFBFBD>:
* <20>̧C: 1280x720