chore: 首次簽入 Thinkyu ASP.NET 專案
- 加入 Visual Studio / ASP.NET .gitignore - 排除建置輸出、IDE 設定、NuGet packages、大型 MSI 安裝檔
@@ -0,0 +1,31 @@
|
||||
X-Sender: neo.sryang@gmail.com
|
||||
X-Receiver: =?utf-8?B?6Zmz5amJ5am3?= <tin526@hotmail.com>
|
||||
MIME-Version: 1.0
|
||||
From: neo.sryang@gmail.com
|
||||
To: =?utf-8?B?6Zmz5amJ5am3?= <tin526@hotmail.com>
|
||||
Date: 2 Aug 2026 09:36:30 +0800
|
||||
Subject: =?utf-8?B?44CQ6L6m6KiT57O757Wx5pKk57C96YCa55+l44CR6KGo5Zau6aGe5Yil77ya5pWZ5a245pel6KqM5pqo55Ww5bi454uA5rOBIOihqOWWru+8mltUWTAwMDE2Ml0gVEVTVCBbMV0gKDEwMynpq5jnuL7mlYjlnJjpmoot5omT6YCg5bm456aP5q2j5ZCR6IG35rav6aGn5ZWP5ZOB54mM5LmL6Lev?=
|
||||
Content-Type: text/html; charset=utf-8
|
||||
Content-Transfer-Encoding: base64
|
||||
|
||||
PCFET0NUWVBFIGh0bWw+DQo8aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94
|
||||
aHRtbCI+DQo8aGVhZD4NCiAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250
|
||||
ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+DQogIDx0aXRsZT7mkqTnsL3nsL3m
|
||||
oLjpgJrnn6U8L3RpdGxlPg0KICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KICAgIHRhYmxl
|
||||
IHsgZm9udC1zaXplOiAxNHB0IH0NCiAgICB0aCB7IGJhY2tncm91bmQtY29sb3I6ICNEMEQw
|
||||
RDA7IGZvbnQtd2VpZ2h0Om5vcm1hbDsgdGV4dC1hbGlnbjpsZWZ0OyB9DQogICAgdGQgeyBi
|
||||
YWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTsgfQ0KICA8L3N0eWxlPg0KPC9oZWFkPg0KPGJvZHkg
|
||||
c3R5bGU9ImZvbnQtZmFtaWx5OiDmqJnmpbfpq5QsIEthaVRpOyBmb250LXNpemU6IDE0cHQi
|
||||
Pg0KICA8cD7mgqjlpb3vvJo8L3A+DQogIDxwPui+puioiuezu+e1seaciemcgOimgeaCqOew
|
||||
veaguOeahOaSpOewveihqOWWrjwvcD4NCiAgPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRp
|
||||
bmc9IjMiIGNlbGxzcGFjaW5nPSIwIiANCiAgICBzdHlsZT0iYm9yZGVyLWNvbGxhcHNlOiBj
|
||||
b2xsYXBzZTsiPg0KICAgIDx0cj4NCiAgICAgIDx0aD7ooajllq7poZ7liKUNCiAgICAgIDwv
|
||||
dGg+DQogICAgICA8dGQ+DQogICAgICAgIOaVmeWtuOaXpeiqjOaaqOeVsOW4uOeLgOazgQ0K
|
||||
ICAgICAgPC90ZD4NCiAgICA8L3RyPg0KICAgIDx0cj4NCiAgICAgIDx0aD7ooajllq4NCiAg
|
||||
ICAgIDwvdGg+DQogICAgICA8dGQ+DQogICAgICAgIFtUWTAwMDE2Ml0gVEVTVDxicj5bMV0g
|
||||
KDEwMynpq5jnuL7mlYjlnJjpmoot5omT6YCg5bm456aP5q2j5ZCR6IG35rav6aGn5ZWP5ZOB
|
||||
54mM5LmL6LevDQogICAgICA8L3RkPg0KICAgIDwvdHI+DQogIDwvdGFibGU+DQogIDxwPg0K
|
||||
ICAgIOiri+eZu+WFpei+puioiuezu+e1seiZleeQhuaSpOewveewveaguOOAgjxiciAvPg0K
|
||||
ICAgIOisneisne+8gQ0KICA8L3A+DQogIDxwPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEy
|
||||
cHQiPijpgJnmmK/ns7vntbHoh6rli5XnmbzpgIHnmoTpg7Xku7bvvIzoq4vli7/lm57opoYp
|
||||
PC9zcGFuPjwvcD4NCjwvYm9keT4NCjwvaHRtbD4=
|
||||
@@ -0,0 +1,31 @@
|
||||
X-Sender: neo.sryang@gmail.com
|
||||
X-Receiver: =?utf-8?B?6Zmz55Cs5am3?= <tingting@thinkyu.com>
|
||||
MIME-Version: 1.0
|
||||
From: neo.sryang@gmail.com
|
||||
To: =?utf-8?B?6Zmz55Cs5am3?= <tingting@thinkyu.com>
|
||||
Date: 9 Aug 2026 06:40:50 +0800
|
||||
Subject: =?utf-8?B?44CQ6L6m6KiT57O757Wx57C95qC46YCa55+l44CR6KGo5Zau6aGe5Yil77ya6JmV55CG57WQ5p6c6L+96LmkIOihqOWWru+8mltUWTAwMDE2MV0g5Zug5oeJ5a6i5oi26ZyA5rGC5LmL5Zue5oeJ5oqA5ben6IiH5bel5YW35oeJ55SoIC0g5qGD5ZyS54+tIFsxXSDlm6Dmh4nlrqLmiLbpnIDmsYLkuYvlm57mh4nmioDlt6foiIflt6Xlhbfmh4nnlKg=?=
|
||||
Content-Type: text/html; charset=utf-8
|
||||
Content-Transfer-Encoding: base64
|
||||
|
||||
PCFET0NUWVBFIGh0bWw+DQo8aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94
|
||||
aHRtbCI+DQo8aGVhZD4NCiAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250
|
||||
ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+DQogIDx0aXRsZT7nsL3moLjpgJrn
|
||||
n6U8L3RpdGxlPg0KICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KICAgIHRhYmxlIHsgZm9u
|
||||
dC1zaXplOiAxNHB0IH0NCiAgICB0aCB7IGJhY2tncm91bmQtY29sb3I6ICNEMEQwRDA7IGZv
|
||||
bnQtd2VpZ2h0Om5vcm1hbDsgdGV4dC1hbGlnbjpsZWZ0OyB9DQogICAgdGQgeyBiYWNrZ3Jv
|
||||
dW5kLWNvbG9yOiB3aGl0ZTsgfQ0KICA8L3N0eWxlPg0KPC9oZWFkPg0KPGJvZHkgc3R5bGU9
|
||||
ImZvbnQtZmFtaWx5OiDmqJnmpbfpq5QsIEthaVRpOyBmb250LXNpemU6IDE0cHQiPg0KICA8
|
||||
cD7mgqjlpb3vvJo8L3A+DQogIDxwPui+puiok+ezu+e1seaciemcgOimgeaCqOewveaguOea
|
||||
hOihqOWWrjwvcD4NCiAgPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjMiIGNlbGxz
|
||||
cGFjaW5nPSIwIiANCiAgICBzdHlsZT0iYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTsiPg0K
|
||||
ICAgIDx0cj4NCiAgICAgIDx0aD7ooajllq7poZ7liKUNCiAgICAgIDwvdGg+DQogICAgICA8
|
||||
dGQ+DQogICAgICAgIOiZleeQhue1kOaenOi/vei5pA0KICAgICAgPC90ZD4NCiAgICA8L3Ry
|
||||
Pg0KICAgIDx0cj4NCiAgICAgIDx0aD7ooajllq4NCiAgICAgIDwvdGg+DQogICAgICA8dGQ+
|
||||
DQogICAgICAgIFtUWTAwMDE2MV0g5Zug5oeJ5a6i5oi26ZyA5rGC5LmL5Zue5oeJ5oqA5ben
|
||||
6IiH5bel5YW35oeJ55SoIC0g5qGD5ZyS54+tPGJyPlsxXSDlm6Dmh4nlrqLmiLbpnIDmsYLk
|
||||
uYvlm57mh4nmioDlt6foiIflt6Xlhbfmh4nnlKgNCiAgICAgIDwvdGQ+DQogICAgPC90cj4N
|
||||
CiAgPC90YWJsZT4NCiAgPHA+DQogICAg6KuL55m75YWl6L6m6KiT57O757Wx6JmV55CG57C9
|
||||
5qC444CCPGJyIC8+DQogICAg6Kyd6Kyd77yBDQogIDwvcD4NCiAgPHA+PHNwYW4gc3R5bGU9
|
||||
ImZvbnQtc2l6ZTogMTJwdCI+KOmAmeaYr+ezu+e1seiHquWLleeZvOmAgeeahOmDteS7tu+8
|
||||
jOiri+WLv+Wbnuimhik8L3NwYW4+PC9wPg0KPC9ib2R5Pg0KPC9odG1sPg==
|
||||
@@ -0,0 +1,31 @@
|
||||
X-Sender: neo.sryang@gmail.com
|
||||
X-Receiver: =?utf-8?B?6Zmz55Cs5am3?= <tingting@thinkyu.com>
|
||||
MIME-Version: 1.0
|
||||
From: neo.sryang@gmail.com
|
||||
To: =?utf-8?B?6Zmz55Cs5am3?= <tingting@thinkyu.com>
|
||||
Date: 8 Aug 2026 11:24:52 +0800
|
||||
Subject: =?utf-8?B?44CQ6L6m6KiT57O757Wx57C95qC46YCa55+l44CR6KGo5Zau6aGe5Yil77ya5pWZ5a245pel6KqM5pqo55Ww5bi454uA5rOBIOihqOWWru+8mltUWTAwMDE2MV0g5Zug5oeJ5a6i5oi26ZyA5rGC5LmL5Zue5oeJ5oqA5ben6IiH5bel5YW35oeJ55SoIC0g5qGD5ZyS54+tIFsxXSDlm6Dmh4nlrqLmiLbpnIDmsYLkuYvlm57mh4nmioDlt6foiIflt6Xlhbfmh4nnlKg=?=
|
||||
Content-Type: text/html; charset=utf-8
|
||||
Content-Transfer-Encoding: base64
|
||||
|
||||
PCFET0NUWVBFIGh0bWw+DQo8aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94
|
||||
aHRtbCI+DQo8aGVhZD4NCiAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250
|
||||
ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+DQogIDx0aXRsZT7nsL3moLjpgJrn
|
||||
n6U8L3RpdGxlPg0KICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KICAgIHRhYmxlIHsgZm9u
|
||||
dC1zaXplOiAxNHB0IH0NCiAgICB0aCB7IGJhY2tncm91bmQtY29sb3I6ICNEMEQwRDA7IGZv
|
||||
bnQtd2VpZ2h0Om5vcm1hbDsgdGV4dC1hbGlnbjpsZWZ0OyB9DQogICAgdGQgeyBiYWNrZ3Jv
|
||||
dW5kLWNvbG9yOiB3aGl0ZTsgfQ0KICA8L3N0eWxlPg0KPC9oZWFkPg0KPGJvZHkgc3R5bGU9
|
||||
ImZvbnQtZmFtaWx5OiDmqJnmpbfpq5QsIEthaVRpOyBmb250LXNpemU6IDE0cHQiPg0KICA8
|
||||
cD7mgqjlpb3vvJo8L3A+DQogIDxwPui+puiok+ezu+e1seaciemcgOimgeaCqOewveaguOea
|
||||
hOihqOWWrjwvcD4NCiAgPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjMiIGNlbGxz
|
||||
cGFjaW5nPSIwIiANCiAgICBzdHlsZT0iYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTsiPg0K
|
||||
ICAgIDx0cj4NCiAgICAgIDx0aD7ooajllq7poZ7liKUNCiAgICAgIDwvdGg+DQogICAgICA8
|
||||
dGQ+DQogICAgICAgIOaVmeWtuOaXpeiqjOaaqOeVsOW4uOeLgOazgQ0KICAgICAgPC90ZD4N
|
||||
CiAgICA8L3RyPg0KICAgIDx0cj4NCiAgICAgIDx0aD7ooajllq4NCiAgICAgIDwvdGg+DQog
|
||||
ICAgICA8dGQ+DQogICAgICAgIFtUWTAwMDE2MV0g5Zug5oeJ5a6i5oi26ZyA5rGC5LmL5Zue
|
||||
5oeJ5oqA5ben6IiH5bel5YW35oeJ55SoIC0g5qGD5ZyS54+tPGJyPlsxXSDlm6Dmh4nlrqLm
|
||||
iLbpnIDmsYLkuYvlm57mh4nmioDlt6foiIflt6Xlhbfmh4nnlKgNCiAgICAgIDwvdGQ+DQog
|
||||
ICAgPC90cj4NCiAgPC90YWJsZT4NCiAgPHA+DQogICAg6KuL55m75YWl6L6m6KiT57O757Wx
|
||||
6JmV55CG57C95qC444CCPGJyIC8+DQogICAg6Kyd6Kyd77yBDQogIDwvcD4NCiAgPHA+PHNw
|
||||
YW4gc3R5bGU9ImZvbnQtc2l6ZTogMTJwdCI+KOmAmeaYr+ezu+e1seiHquWLleeZvOmAgeea
|
||||
hOmDteS7tu+8jOiri+WLv+Wbnuimhik8L3NwYW4+PC9wPg0KPC9ib2R5Pg0KPC9odG1sPg==
|
||||
@@ -0,0 +1,29 @@
|
||||
X-Sender: neo.sryang@gmail.com
|
||||
X-Receiver: =?utf-8?B?6Zmz55Cs5am3?= <tingting@thinkyu.com>
|
||||
MIME-Version: 1.0
|
||||
From: neo.sryang@gmail.com
|
||||
To: =?utf-8?B?6Zmz55Cs5am3?= <tingting@thinkyu.com>
|
||||
Date: 8 Aug 2026 11:28:30 +0800
|
||||
Subject: =?utf-8?B?44CQ6L6m6KiT57O757Wx57C95qC46YCa55+l44CR6KGo5Zau6aGe5Yil77ya6KiT57e05qqi6KiO5aCx5ZGKIOihqOWWru+8mltUWTAwMDE2Ml0gVEVTVA==?=
|
||||
Content-Type: text/html; charset=utf-8
|
||||
Content-Transfer-Encoding: base64
|
||||
|
||||
PCFET0NUWVBFIGh0bWw+DQo8aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94
|
||||
aHRtbCI+DQo8aGVhZD4NCiAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250
|
||||
ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+DQogIDx0aXRsZT7nsL3moLjpgJrn
|
||||
n6U8L3RpdGxlPg0KICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KICAgIHRhYmxlIHsgZm9u
|
||||
dC1zaXplOiAxNHB0IH0NCiAgICB0aCB7IGJhY2tncm91bmQtY29sb3I6ICNEMEQwRDA7IGZv
|
||||
bnQtd2VpZ2h0Om5vcm1hbDsgdGV4dC1hbGlnbjpsZWZ0OyB9DQogICAgdGQgeyBiYWNrZ3Jv
|
||||
dW5kLWNvbG9yOiB3aGl0ZTsgfQ0KICA8L3N0eWxlPg0KPC9oZWFkPg0KPGJvZHkgc3R5bGU9
|
||||
ImZvbnQtZmFtaWx5OiDmqJnmpbfpq5QsIEthaVRpOyBmb250LXNpemU6IDE0cHQiPg0KICA8
|
||||
cD7mgqjlpb3vvJo8L3A+DQogIDxwPui+puiok+ezu+e1seaciemcgOimgeaCqOewveaguOea
|
||||
hOihqOWWrjwvcD4NCiAgPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjMiIGNlbGxz
|
||||
cGFjaW5nPSIwIiANCiAgICBzdHlsZT0iYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTsiPg0K
|
||||
ICAgIDx0cj4NCiAgICAgIDx0aD7ooajllq7poZ7liKUNCiAgICAgIDwvdGg+DQogICAgICA8
|
||||
dGQ+DQogICAgICAgIOiok+e3tOaqouiojuWgseWRig0KICAgICAgPC90ZD4NCiAgICA8L3Ry
|
||||
Pg0KICAgIDx0cj4NCiAgICAgIDx0aD7ooajllq4NCiAgICAgIDwvdGg+DQogICAgICA8dGQ+
|
||||
DQogICAgICAgIFtUWTAwMDE2Ml0gVEVTVA0KICAgICAgPC90ZD4NCiAgICA8L3RyPg0KICA8
|
||||
L3RhYmxlPg0KICA8cD4NCiAgICDoq4vnmbvlhaXovqboqJPns7vntbHomZXnkIbnsL3moLjj
|
||||
gII8YnIgLz4NCiAgICDorJ3orJ3vvIENCiAgPC9wPg0KICA8cD48c3BhbiBzdHlsZT0iZm9u
|
||||
dC1zaXplOiAxMnB0Ij4o6YCZ5piv57O757Wx6Ieq5YuV55m86YCB55qE6YO15Lu277yM6KuL
|
||||
5Yu/5Zue6KaGKTwvc3Bhbj48L3A+DQo8L2JvZHk+DQo8L2h0bWw+
|
||||
@@ -0,0 +1,29 @@
|
||||
X-Sender: neo.sryang@gmail.com
|
||||
X-Receiver: =?utf-8?B?6Zmz5amJ5am3?= <tin526@hotmail.com>
|
||||
MIME-Version: 1.0
|
||||
From: neo.sryang@gmail.com
|
||||
To: =?utf-8?B?6Zmz5amJ5am3?= <tin526@hotmail.com>
|
||||
Date: 2 Aug 2026 09:30:00 +0800
|
||||
Subject: =?utf-8?B?44CQ6L6m6KiT57O757Wx57C95qC46YCa55+l44CR6KGo5Zau6aGe5Yil77ya6Kqy56iL5LyB5YqDIOihqOWWru+8mltUWTAwMDE2Ml0gVEVTVA==?=
|
||||
Content-Type: text/html; charset=utf-8
|
||||
Content-Transfer-Encoding: base64
|
||||
|
||||
PCFET0NUWVBFIGh0bWw+DQo8aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94
|
||||
aHRtbCI+DQo8aGVhZD4NCiAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250
|
||||
ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+DQogIDx0aXRsZT7nsL3moLjpgJrn
|
||||
n6U8L3RpdGxlPg0KICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KICAgIHRhYmxlIHsgZm9u
|
||||
dC1zaXplOiAxNHB0IH0NCiAgICB0aCB7IGJhY2tncm91bmQtY29sb3I6ICNEMEQwRDA7IGZv
|
||||
bnQtd2VpZ2h0Om5vcm1hbDsgdGV4dC1hbGlnbjpsZWZ0OyB9DQogICAgdGQgeyBiYWNrZ3Jv
|
||||
dW5kLWNvbG9yOiB3aGl0ZTsgfQ0KICA8L3N0eWxlPg0KPC9oZWFkPg0KPGJvZHkgc3R5bGU9
|
||||
ImZvbnQtZmFtaWx5OiDmqJnmpbfpq5QsIEthaVRpOyBmb250LXNpemU6IDE0cHQiPg0KICA8
|
||||
cD7mgqjlpb3vvJo8L3A+DQogIDxwPui+puiok+ezu+e1seaciemcgOimgeaCqOewveaguOea
|
||||
hOihqOWWrjwvcD4NCiAgPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjMiIGNlbGxz
|
||||
cGFjaW5nPSIwIiANCiAgICBzdHlsZT0iYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTsiPg0K
|
||||
ICAgIDx0cj4NCiAgICAgIDx0aD7ooajllq7poZ7liKUNCiAgICAgIDwvdGg+DQogICAgICA8
|
||||
dGQ+DQogICAgICAgIOiqsueoi+S8geWKgw0KICAgICAgPC90ZD4NCiAgICA8L3RyPg0KICAg
|
||||
IDx0cj4NCiAgICAgIDx0aD7ooajllq4NCiAgICAgIDwvdGg+DQogICAgICA8dGQ+DQogICAg
|
||||
ICAgIFtUWTAwMDE2Ml0gVEVTVA0KICAgICAgPC90ZD4NCiAgICA8L3RyPg0KICA8L3RhYmxl
|
||||
Pg0KICA8cD4NCiAgICDoq4vnmbvlhaXovqboqJPns7vntbHomZXnkIbnsL3moLjjgII8YnIg
|
||||
Lz4NCiAgICDorJ3orJ3vvIENCiAgPC9wPg0KICA8cD48c3BhbiBzdHlsZT0iZm9udC1zaXpl
|
||||
OiAxMnB0Ij4o6YCZ5piv57O757Wx6Ieq5YuV55m86YCB55qE6YO15Lu277yM6KuL5Yu/5Zue
|
||||
6KaGKTwvc3Bhbj48L3A+DQo8L2JvZHk+DQo8L2h0bWw+
|
||||
@@ -0,0 +1,29 @@
|
||||
X-Sender: neo.sryang@gmail.com
|
||||
X-Receiver: =?utf-8?B?6Zmz5amJ5am3?= <tin526@hotmail.com>
|
||||
MIME-Version: 1.0
|
||||
From: neo.sryang@gmail.com
|
||||
To: =?utf-8?B?6Zmz5amJ5am3?= <tin526@hotmail.com>
|
||||
Date: 2 Aug 2026 09:30:01 +0800
|
||||
Subject: =?utf-8?B?44CQ6L6m6KiT57O757Wx5pKk57C96YCa55+l44CR6KGo5Zau6aGe5Yil77ya6Kqy56iL5LyB5YqDIOihqOWWru+8mltUWTAwMDE2Ml0gVEVTVA==?=
|
||||
Content-Type: text/html; charset=utf-8
|
||||
Content-Transfer-Encoding: base64
|
||||
|
||||
PCFET0NUWVBFIGh0bWw+DQo8aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94
|
||||
aHRtbCI+DQo8aGVhZD4NCiAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250
|
||||
ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+DQogIDx0aXRsZT7mkqTnsL3nsL3m
|
||||
oLjpgJrnn6U8L3RpdGxlPg0KICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KICAgIHRhYmxl
|
||||
IHsgZm9udC1zaXplOiAxNHB0IH0NCiAgICB0aCB7IGJhY2tncm91bmQtY29sb3I6ICNEMEQw
|
||||
RDA7IGZvbnQtd2VpZ2h0Om5vcm1hbDsgdGV4dC1hbGlnbjpsZWZ0OyB9DQogICAgdGQgeyBi
|
||||
YWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTsgfQ0KICA8L3N0eWxlPg0KPC9oZWFkPg0KPGJvZHkg
|
||||
c3R5bGU9ImZvbnQtZmFtaWx5OiDmqJnmpbfpq5QsIEthaVRpOyBmb250LXNpemU6IDE0cHQi
|
||||
Pg0KICA8cD7mgqjlpb3vvJo8L3A+DQogIDxwPui+puioiuezu+e1seaciemcgOimgeaCqOew
|
||||
veaguOeahOaSpOewveihqOWWrjwvcD4NCiAgPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRp
|
||||
bmc9IjMiIGNlbGxzcGFjaW5nPSIwIiANCiAgICBzdHlsZT0iYm9yZGVyLWNvbGxhcHNlOiBj
|
||||
b2xsYXBzZTsiPg0KICAgIDx0cj4NCiAgICAgIDx0aD7ooajllq7poZ7liKUNCiAgICAgIDwv
|
||||
dGg+DQogICAgICA8dGQ+DQogICAgICAgIOiqsueoi+S8geWKgw0KICAgICAgPC90ZD4NCiAg
|
||||
ICA8L3RyPg0KICAgIDx0cj4NCiAgICAgIDx0aD7ooajllq4NCiAgICAgIDwvdGg+DQogICAg
|
||||
ICA8dGQ+DQogICAgICAgIFtUWTAwMDE2Ml0gVEVTVA0KICAgICAgPC90ZD4NCiAgICA8L3Ry
|
||||
Pg0KICA8L3RhYmxlPg0KICA8cD4NCiAgICDoq4vnmbvlhaXovqboqIrns7vntbHomZXnkIbm
|
||||
kqTnsL3nsL3moLjjgII8YnIgLz4NCiAgICDorJ3orJ3vvIENCiAgPC9wPg0KICA8cD48c3Bh
|
||||
biBzdHlsZT0iZm9udC1zaXplOiAxMnB0Ij4o6YCZ5piv57O757Wx6Ieq5YuV55m86YCB55qE
|
||||
6YO15Lu277yM6KuL5Yu/5Zue6KaGKTwvc3Bhbj48L3A+DQo8L2JvZHk+DQo8L2h0bWw+
|
||||
@@ -0,0 +1,31 @@
|
||||
X-Sender: neo.sryang@gmail.com
|
||||
X-Receiver: =?utf-8?B?6Zmz5amJ5am3?= <tin526@hotmail.com>
|
||||
MIME-Version: 1.0
|
||||
From: neo.sryang@gmail.com
|
||||
To: =?utf-8?B?6Zmz5amJ5am3?= <tin526@hotmail.com>
|
||||
Date: 2 Aug 2026 09:36:29 +0800
|
||||
Subject: =?utf-8?B?44CQ6L6m6KiT57O757Wx57C95qC46YCa55+l44CR6KGo5Zau6aGe5Yil77ya5pWZ5a245pel6KqM5pqo55Ww5bi454uA5rOBIOihqOWWru+8mltUWTAwMDE2Ml0gVEVTVCBbMV0gKDEwMynpq5jnuL7mlYjlnJjpmoot5omT6YCg5bm456aP5q2j5ZCR6IG35rav6aGn5ZWP5ZOB54mM5LmL6Lev?=
|
||||
Content-Type: text/html; charset=utf-8
|
||||
Content-Transfer-Encoding: base64
|
||||
|
||||
PCFET0NUWVBFIGh0bWw+DQo8aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94
|
||||
aHRtbCI+DQo8aGVhZD4NCiAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250
|
||||
ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+DQogIDx0aXRsZT7nsL3moLjpgJrn
|
||||
n6U8L3RpdGxlPg0KICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KICAgIHRhYmxlIHsgZm9u
|
||||
dC1zaXplOiAxNHB0IH0NCiAgICB0aCB7IGJhY2tncm91bmQtY29sb3I6ICNEMEQwRDA7IGZv
|
||||
bnQtd2VpZ2h0Om5vcm1hbDsgdGV4dC1hbGlnbjpsZWZ0OyB9DQogICAgdGQgeyBiYWNrZ3Jv
|
||||
dW5kLWNvbG9yOiB3aGl0ZTsgfQ0KICA8L3N0eWxlPg0KPC9oZWFkPg0KPGJvZHkgc3R5bGU9
|
||||
ImZvbnQtZmFtaWx5OiDmqJnmpbfpq5QsIEthaVRpOyBmb250LXNpemU6IDE0cHQiPg0KICA8
|
||||
cD7mgqjlpb3vvJo8L3A+DQogIDxwPui+puiok+ezu+e1seaciemcgOimgeaCqOewveaguOea
|
||||
hOihqOWWrjwvcD4NCiAgPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjMiIGNlbGxz
|
||||
cGFjaW5nPSIwIiANCiAgICBzdHlsZT0iYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTsiPg0K
|
||||
ICAgIDx0cj4NCiAgICAgIDx0aD7ooajllq7poZ7liKUNCiAgICAgIDwvdGg+DQogICAgICA8
|
||||
dGQ+DQogICAgICAgIOaVmeWtuOaXpeiqjOaaqOeVsOW4uOeLgOazgQ0KICAgICAgPC90ZD4N
|
||||
CiAgICA8L3RyPg0KICAgIDx0cj4NCiAgICAgIDx0aD7ooajllq4NCiAgICAgIDwvdGg+DQog
|
||||
ICAgICA8dGQ+DQogICAgICAgIFtUWTAwMDE2Ml0gVEVTVDxicj5bMV0gKDEwMynpq5jnuL7m
|
||||
lYjlnJjpmoot5omT6YCg5bm456aP5q2j5ZCR6IG35rav6aGn5ZWP5ZOB54mM5LmL6LevDQog
|
||||
ICAgICA8L3RkPg0KICAgIDwvdHI+DQogIDwvdGFibGU+DQogIDxwPg0KICAgIOiri+eZu+WF
|
||||
pei+puiok+ezu+e1seiZleeQhuewveaguOOAgjxiciAvPg0KICAgIOisneisne+8gQ0KICA8
|
||||
L3A+DQogIDxwPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEycHQiPijpgJnmmK/ns7vntbHo
|
||||
h6rli5XnmbzpgIHnmoTpg7Xku7bvvIzoq4vli7/lm57opoYpPC9zcGFuPjwvcD4NCjwvYm9k
|
||||
eT4NCjwvaHRtbD4=
|
||||
@@ -0,0 +1,131 @@
|
||||
X-Sender: neo.sryang@gmail.com
|
||||
X-Receiver: =?utf-8?B?5qWK5qi55Lq6?= <neo.sryang@gmail.com>
|
||||
MIME-Version: 1.0
|
||||
From: neo.sryang@gmail.com
|
||||
To: =?utf-8?B?5qWK5qi55Lq6?= <neo.sryang@gmail.com>
|
||||
Date: 14 Mar 2026 14:43:38 +0800
|
||||
Subject: =?utf-8?B?6YCZ5piv5omj57mz5piO57Sw?=
|
||||
Content-Type: multipart/mixed; boundary=--boundary_1_0cbb6cef-d3c8-4239-b68e-b3891c4f5385
|
||||
|
||||
|
||||
----boundary_1_0cbb6cef-d3c8-4239-b68e-b3891c4f5385
|
||||
Content-Type: text/html; charset=utf-8
|
||||
Content-Transfer-Encoding: base64
|
||||
|
||||
PCFET0NUWVBFIGh0bWw+DQo8aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94
|
||||
aHRtbCI+DQo8aGVhZD4NCiAgICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNv
|
||||
bnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4NCiAgICA8dGl0bGU+6YCZ5piv
|
||||
5omj57mz5piO57SwPC90aXRsZT4NCiAgICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KICAg
|
||||
ICAgICB0YWJsZSB7DQogICAgICAgICAgICBmb250LXNpemU6IDE0cHQNCiAgICAgICAgfQ0K
|
||||
DQogICAgICAgIHRoIHsNCiAgICAgICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNEMEQwRDA7
|
||||
DQogICAgICAgICAgICBmb250LXdlaWdodDogbm9ybWFsOw0KICAgICAgICAgICAgdGV4dC1h
|
||||
bGlnbjogbGVmdDsNCiAgICAgICAgfQ0KDQogICAgICAgIHRkIHsNCiAgICAgICAgICAgIGJh
|
||||
Y2tncm91bmQtY29sb3I6IHdoaXRlOw0KICAgICAgICB9DQogICAgPC9zdHlsZT4NCjwvaGVh
|
||||
ZD4NCjxib2R5IHN0eWxlPSJmb250LWZhbWlseTog5qiZ5qW36auULCBLYWlUaTsgZm9udC1z
|
||||
aXplOiAxNHB0Ij4NCiAgICA8cD7oq4vlj4PplrHpmYTku7Y8L3A+DQogICAgPHA+PHNwYW4g
|
||||
c3R5bGU9ImZvbnQtc2l6ZTogMTJwdCI+KOmAmeaYr+ezu+e1seiHquWLleeZvOmAgeeahOmD
|
||||
teS7tu+8jOiri+WLv+Wbnuimhik8L3NwYW4+PC9wPg0KPC9ib2R5Pg0KPC9odG1sPg==
|
||||
----boundary_1_0cbb6cef-d3c8-4239-b68e-b3891c4f5385
|
||||
Content-Type: application/octet-stream; name="=?utf-8?B?5qWK5qi55Lq6X+aJo+e5s+mgmOaTmuaYjue0sC54bHN4?="
|
||||
Content-Transfer-Encoding: base64
|
||||
Content-Disposition: attachment; filename="=?UTF-8?B?5qWK5qi55Lq6X+aJo+e5s+mgmOaTmuaYjue0sC54bHN4?="
|
||||
|
||||
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
|
||||
----boundary_1_0cbb6cef-d3c8-4239-b68e-b3891c4f5385--
|
||||
|
||||
@@ -0,0 +1,13 @@
|
||||
|
||||
# All files
|
||||
[*]
|
||||
indent_style = space
|
||||
|
||||
# Xml files
|
||||
[*.xml]
|
||||
indent_size = 2
|
||||
|
||||
# 設定所有文字檔案使用 UTF-8 編碼
|
||||
[*]
|
||||
charset = utf-8-bom
|
||||
|
||||
@@ -0,0 +1,29 @@
|
||||
<!--
|
||||
您可以在 <windir>\Microsoft.NET\Framework\<ver>\CONFIG\Browsers 找到現有的瀏覽器定義
|
||||
-->
|
||||
<browsers>
|
||||
<browser id="Safari" parentID="Safari1Plus">
|
||||
<identification>
|
||||
<userAgent match="Safari/\d+\.\d+" />
|
||||
</identification>
|
||||
<capture>
|
||||
<userAgent match="Version/(?'version'\d+\.\d+)" />
|
||||
</capture>
|
||||
<capabilities>
|
||||
<capability name="browser" value="Safari" />
|
||||
<capability name="version" value="${version}" />
|
||||
</capabilities>
|
||||
<controlAdapters>
|
||||
<adapter controlType="System.Web.UI.WebControls.Menu"
|
||||
adapterType="" />
|
||||
</controlAdapters>
|
||||
</browser>
|
||||
<browser id="GoogleChrome" parentID="Safari">
|
||||
<identification>
|
||||
<userAgent match="Chrome/(?'version'\d+\.\d+)" />
|
||||
</identification>
|
||||
<capabilities>
|
||||
<capability name="browser" value="Googlebot" />
|
||||
</capabilities>
|
||||
</browser>
|
||||
</browsers>
|
||||
@@ -0,0 +1,547 @@
|
||||
a.button, button, input[type=button], submit, input[type=submit] {
|
||||
color: #000000;
|
||||
padding: 0;
|
||||
margin: 2px;
|
||||
/* height: 25px; */
|
||||
line-height: 25px;
|
||||
display: inline-block;
|
||||
font-family: Arial, Helvetica, sans-serif, "Microsoft JhengHei", "Microsoft YaHei", MingLiU, SimSun;
|
||||
font-size: 12pt;
|
||||
text-decoration: none;
|
||||
vertical-align: top;
|
||||
text-align: center;
|
||||
background-repeat: no-repeat;
|
||||
background-position: 0 0;
|
||||
/* 圓角 */
|
||||
-webkit-border-radius: 2px;
|
||||
-moz-border-radius: 2px;
|
||||
border-radius: 2px
|
||||
}
|
||||
|
||||
a.button:hover, button:hover, input[type=button]:hover, submit:hover, input[type=submit]:hover {
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
|
||||
a.blue120, button.blue120, input[type=button].blue120, submit.blue120, input[type=submit].blue120 {
|
||||
width: 120px;
|
||||
color: #2172B5;
|
||||
border: 1px solid #2172B5;
|
||||
FILTER: progid:DXImageTransform.Microsoft.Gradient(startColorStr=#8CC6EF,endColorStr=#FFFFFF,gradientType=0);
|
||||
background: -moz-linear-gradient(top, #8CC6EF, #FFFFFF);
|
||||
background: -ms-linear-gradient(top, #8CC6EF, #FFFFFF);
|
||||
background: -linear-gradient(top, #8CC6EF, #FFFFFF);
|
||||
background: -webkit-gradient(linear, left top, left bottom, from(#8CC6EF), to(#FFFFFF));
|
||||
background: -o-linear-gradient(top, #8CC6EF, #FFFFFF)
|
||||
}
|
||||
|
||||
a.orange120, button.orange120, input[type=button].orange120, submit.orange120, input[type=submit].orange120 {
|
||||
width: 120px;
|
||||
color: #B25300;
|
||||
border: 1px solid #B25300;
|
||||
FILTER: progid:DXImageTransform.Microsoft.Gradient(startColorStr=#FFAA5F,endColorStr=#FFFFFF,gradientType=0);
|
||||
background: -moz-linear-gradient(top, #FFAA5F, #FFFFFF);
|
||||
background: -ms-linear-gradient(top, #FFAA5F, #FFFFFF);
|
||||
background: -linear-gradient(top, #FFAA5F, #FFFFFF);
|
||||
background: -webkit-gradient(linear, left top, left bottom, from(#FFAA5F), to(#FFFFFF));
|
||||
background: -o-linear-gradient(top, #FFAA5F, #FFFFFF)
|
||||
}
|
||||
|
||||
a.red120, button.red120, input[type=button].red120, submit.red120, input[type=submit].red120 {
|
||||
width: 120px;
|
||||
color: #A71717;
|
||||
border: 1px solid #A71717;
|
||||
FILTER: progid:DXImageTransform.Microsoft.Gradient(startColorStr=#F4B4B4,endColorStr=#FFFFFF,gradientType=0);
|
||||
background: -moz-linear-gradient(top, #F4B4B4, #FFFFFF);
|
||||
background: -ms-linear-gradient(top, #F4B4B4, #FFFFFF);
|
||||
background: -linear-gradient(top, #F4B4B4, #FFFFFF);
|
||||
background: -webkit-gradient(linear, left top, left bottom, from(#F4B4B4), to(#FFFFFF));
|
||||
background: -o-linear-gradient(top, #F4B4B4, #FFFFFF)
|
||||
}
|
||||
|
||||
a.green120, button.green120, input[type=button].green120, submit.green120, input[type=submit].green120 {
|
||||
width: 120px;
|
||||
color: #055705;
|
||||
border: 1px solid #055705;
|
||||
FILTER: progid:DXImageTransform.Microsoft.Gradient(startColorStr=#6EF66E,endColorStr=#FFFFFF,gradientType=0);
|
||||
background: -moz-linear-gradient(top, #6EF66E, #FFFFFF);
|
||||
background: -ms-linear-gradient(top, #6EF66E, #FFFFFF);
|
||||
background: -linear-gradient(top, #6EF66E, #FFFFFF);
|
||||
background: -webkit-gradient(linear, left top, left bottom, from(#6EF66E), to(#FFFFFF));
|
||||
background: -o-linear-gradient(top, #6EF66E, #FFFFFF)
|
||||
}
|
||||
|
||||
a.purple120, button.purple120, input[type=button].purple120, submit.purple120, input[type=submit].purple120 {
|
||||
width: 120px;
|
||||
color: #800080;
|
||||
border: 1px solid #800080;
|
||||
FILTER: progid:DXImageTransform.Microsoft.Gradient(startColorStr=#F694F4,endColorStr=#FFFFFF,gradientType=0);
|
||||
background: -moz-linear-gradient(top, #F694F4, #FFFFFF);
|
||||
background: -ms-linear-gradient(top, #F694F4, #FFFFFF);
|
||||
background: -linear-gradient(top, #F694F4, #FFFFFF);
|
||||
background: -webkit-gradient(linear, left top, left bottom, from(#F694F4), to(#FFFFFF));
|
||||
background: -o-linear-gradient(top, #F694F4, #FFFFFF)
|
||||
}
|
||||
|
||||
a.gray120, button.gray120, input[type=button].gray120, submit.gray120, input[type=submit].gray120 {
|
||||
width: 120px;
|
||||
color: #303030;
|
||||
border: 1px solid #A7A7A7;
|
||||
FILTER: progid:DXImageTransform.Microsoft.Gradient(startColorStr=#D0D0D0,endColorStr=#FFFFFF,gradientType=0);
|
||||
background: -moz-linear-gradient(top, #D0D0D0, #FFFFFF);
|
||||
background: -ms-linear-gradient(top, #D0D0D0, #FFFFFF);
|
||||
background: -linear-gradient(top, #D0D0D0, #FFFFFF);
|
||||
background: -webkit-gradient(linear, left top, left bottom, from(#D0D0D0), to(#FFFFFF));
|
||||
background: -o-linear-gradient(top, #D0D0D0, #FFFFFF)
|
||||
}
|
||||
|
||||
a.yellow120, button.yellow120, input[type=button].yellow120, submit.yellow120, input[type=submit].yellow120 {
|
||||
width: 120px;
|
||||
color: #97A004;
|
||||
border: 1px solid #97A004;
|
||||
FILTER: progid:DXImageTransform.Microsoft.Gradient(startColorStr=#FAFFA3,endColorStr=#FFFFFF,gradientType=0);
|
||||
background: -moz-linear-gradient(top, #FAFFA3, #FFFFFF);
|
||||
background: -ms-linear-gradient(top, #FAFFA3, #FFFFFF);
|
||||
background: -linear-gradient(top, #FAFFA3, #FFFFFF);
|
||||
background: -webkit-gradient(linear, left top, left bottom, from(#FAFFA3), to(#FFFFFF));
|
||||
background: -o-linear-gradient(top, #FAFFA3, #FFFFFF)
|
||||
}
|
||||
|
||||
a.blue100, button.blue100, input[type=button].blue100, submit.blue100, input[type=submit].blue100 {
|
||||
width: 100px;
|
||||
color: #2172B5;
|
||||
border: 1px solid #2172B5;
|
||||
FILTER: progid:DXImageTransform.Microsoft.Gradient(startColorStr=#8CC6EF,endColorStr=#FFFFFF,gradientType=0);
|
||||
background: -moz-linear-gradient(top, #8CC6EF, #FFFFFF);
|
||||
background: -ms-linear-gradient(top, #8CC6EF, #FFFFFF);
|
||||
background: -linear-gradient(top, #8CC6EF, #FFFFFF);
|
||||
background: -webkit-gradient(linear, left top, left bottom, from(#8CC6EF), to(#FFFFFF));
|
||||
background: -o-linear-gradient(top, #8CC6EF, #FFFFFF)
|
||||
}
|
||||
|
||||
a.orange100, button.orange100, input[type=button].orange100, submit.orange100, input[type=submit].orange100 {
|
||||
width: 100px;
|
||||
color: #B25300;
|
||||
border: 1px solid #B25300;
|
||||
FILTER: progid:DXImageTransform.Microsoft.Gradient(startColorStr=#FFAA5F,endColorStr=#FFFFFF,gradientType=0);
|
||||
background: -moz-linear-gradient(top, #FFAA5F, #FFFFFF);
|
||||
background: -ms-linear-gradient(top, #FFAA5F, #FFFFFF);
|
||||
background: -linear-gradient(top, #FFAA5F, #FFFFFF);
|
||||
background: -webkit-gradient(linear, left top, left bottom, from(#FFAA5F), to(#FFFFFF));
|
||||
background: -o-linear-gradient(top, #FFAA5F, #FFFFFF)
|
||||
}
|
||||
|
||||
a.red100, button.red100, input[type=button].red100, submit.red100, input[type=submit].red100 {
|
||||
width: 100px;
|
||||
color: #A71717;
|
||||
border: 1px solid #A71717;
|
||||
FILTER: progid:DXImageTransform.Microsoft.Gradient(startColorStr=#F4B4B4,endColorStr=#FFFFFF,gradientType=0);
|
||||
background: -moz-linear-gradient(top, #F4B4B4, #FFFFFF);
|
||||
background: -ms-linear-gradient(top, #F4B4B4, #FFFFFF);
|
||||
background: -linear-gradient(top, #F4B4B4, #FFFFFF);
|
||||
background: -webkit-gradient(linear, left top, left bottom, from(#F4B4B4), to(#FFFFFF));
|
||||
background: -o-linear-gradient(top, #F4B4B4, #FFFFFF)
|
||||
}
|
||||
|
||||
a.green100, button.green100, input[type=button].green100, submit.green100, input[type=submit].green100 {
|
||||
width: 100px;
|
||||
color: #055705;
|
||||
border: 1px solid #055705;
|
||||
FILTER: progid:DXImageTransform.Microsoft.Gradient(startColorStr=#6EF66E,endColorStr=#FFFFFF,gradientType=0);
|
||||
background: -moz-linear-gradient(top, #6EF66E, #FFFFFF);
|
||||
background: -ms-linear-gradient(top, #6EF66E, #FFFFFF);
|
||||
background: -linear-gradient(top, #6EF66E, #FFFFFF);
|
||||
background: -webkit-gradient(linear, left top, left bottom, from(#6EF66E), to(#FFFFFF));
|
||||
background: -o-linear-gradient(top, #6EF66E, #FFFFFF)
|
||||
}
|
||||
|
||||
a.purple100, button.purple100, input[type=button].purple100, submit.purple100, input[type=submit].purple100 {
|
||||
width: 100px;
|
||||
color: #800080;
|
||||
border: 1px solid #800080;
|
||||
FILTER: progid:DXImageTransform.Microsoft.Gradient(startColorStr=#F694F4,endColorStr=#FFFFFF,gradientType=0);
|
||||
background: -moz-linear-gradient(top, #F694F4, #FFFFFF);
|
||||
background: -ms-linear-gradient(top, #F694F4, #FFFFFF);
|
||||
background: -linear-gradient(top, #F694F4, #FFFFFF);
|
||||
background: -webkit-gradient(linear, left top, left bottom, from(#F694F4), to(#FFFFFF));
|
||||
background: -o-linear-gradient(top, #F694F4, #FFFFFF)
|
||||
}
|
||||
|
||||
a.gray100, button.gray100, input[type=button].gray100, submit.gray100, input[type=submit].gray100 {
|
||||
width: 100px;
|
||||
color: #303030;
|
||||
border: 1px solid #A7A7A7;
|
||||
FILTER: progid:DXImageTransform.Microsoft.Gradient(startColorStr=#D0D0D0,endColorStr=#FFFFFF,gradientType=0);
|
||||
background: -moz-linear-gradient(top, #D0D0D0, #FFFFFF);
|
||||
background: -ms-linear-gradient(top, #D0D0D0, #FFFFFF);
|
||||
background: -linear-gradient(top, #D0D0D0, #FFFFFF);
|
||||
background: -webkit-gradient(linear, left top, left bottom, from(#D0D0D0), to(#FFFFFF));
|
||||
background: -o-linear-gradient(top, #D0D0D0, #FFFFFF)
|
||||
}
|
||||
|
||||
a.yellow100, button.yellow100, input[type=button].yellow100, submit.yellow100, input[type=submit].yellow100 {
|
||||
width: 100px;
|
||||
color: #97A004;
|
||||
border: 1px solid #97A004;
|
||||
FILTER: progid:DXImageTransform.Microsoft.Gradient(startColorStr=#FAFFA3,endColorStr=#FFFFFF,gradientType=0);
|
||||
background: -moz-linear-gradient(top, #FAFFA3, #FFFFFF);
|
||||
background: -ms-linear-gradient(top, #FAFFA3, #FFFFFF);
|
||||
background: -linear-gradient(top, #FAFFA3, #FFFFFF);
|
||||
background: -webkit-gradient(linear, left top, left bottom, from(#FAFFA3), to(#FFFFFF));
|
||||
background: -o-linear-gradient(top, #FAFFA3, #FFFFFF)
|
||||
}
|
||||
|
||||
a.blue80, button.blue80, input[type=button].blue80, submit.blue80, input[type=submit].blue80 {
|
||||
width: 80px;
|
||||
color: #2172B5;
|
||||
border: 1px solid #2172B5;
|
||||
FILTER: progid:DXImageTransform.Microsoft.Gradient(startColorStr=#8CC6EF,endColorStr=#FFFFFF,gradientType=0);
|
||||
background: -moz-linear-gradient(top, #8CC6EF, #FFFFFF);
|
||||
background: -ms-linear-gradient(top, #8CC6EF, #FFFFFF);
|
||||
background: -linear-gradient(top, #8CC6EF, #FFFFFF);
|
||||
background: -webkit-gradient(linear, left top, left bottom, from(#8CC6EF), to(#FFFFFF));
|
||||
background: -o-linear-gradient(top, #8CC6EF, #FFFFFF)
|
||||
}
|
||||
|
||||
a.orange80, button.orange80, input[type=button].orange80, submit.orange80, input[type=submit].orange80 {
|
||||
width: 80px;
|
||||
color: #B25300;
|
||||
border: 1px solid #B25300;
|
||||
FILTER: progid:DXImageTransform.Microsoft.Gradient(startColorStr=#FFAA5F,endColorStr=#FFFFFF,gradientType=0);
|
||||
background: -moz-linear-gradient(top, #FFAA5F, #FFFFFF);
|
||||
background: -ms-linear-gradient(top, #FFAA5F, #FFFFFF);
|
||||
background: -linear-gradient(top, #FFAA5F, #FFFFFF);
|
||||
background: -webkit-gradient(linear, left top, left bottom, from(#FFAA5F), to(#FFFFFF));
|
||||
background: -o-linear-gradient(top, #FFAA5F, #FFFFFF)
|
||||
}
|
||||
|
||||
a.red80, button.red80, input[type=button].red80, submit.red80, input[type=submit].red80 {
|
||||
width: 80px;
|
||||
color: #A71717;
|
||||
border: 1px solid #A71717;
|
||||
FILTER: progid:DXImageTransform.Microsoft.Gradient(startColorStr=#F4B4B4,endColorStr=#FFFFFF,gradientType=0);
|
||||
background: -moz-linear-gradient(top, #F4B4B4, #FFFFFF);
|
||||
background: -ms-linear-gradient(top, #F4B4B4, #FFFFFF);
|
||||
background: -linear-gradient(top, #F4B4B4, #FFFFFF);
|
||||
background: -webkit-gradient(linear, left top, left bottom, from(#F4B4B4), to(#FFFFFF));
|
||||
background: -o-linear-gradient(top, #F4B4B4, #FFFFFF)
|
||||
}
|
||||
|
||||
a.green80, button.green80, input[type=button].green80, submit.green80, input[type=submit].green80 {
|
||||
width: 80px;
|
||||
color: #055705;
|
||||
border: 1px solid #055705;
|
||||
FILTER: progid:DXImageTransform.Microsoft.Gradient(startColorStr=#6EF66E,endColorStr=#FFFFFF,gradientType=0);
|
||||
background: -moz-linear-gradient(top, #6EF66E, #FFFFFF);
|
||||
background: -ms-linear-gradient(top, #6EF66E, #FFFFFF);
|
||||
background: -linear-gradient(top, #6EF66E, #FFFFFF);
|
||||
background: -webkit-gradient(linear, left top, left bottom, from(#6EF66E), to(#FFFFFF));
|
||||
background: -o-linear-gradient(top, #6EF66E, #FFFFFF)
|
||||
}
|
||||
|
||||
a.purple80, button.purple80, input[type=button].purple80, submit.purple80, input[type=submit].purple80 {
|
||||
width: 80px;
|
||||
color: #800080;
|
||||
border: 1px solid #800080;
|
||||
FILTER: progid:DXImageTransform.Microsoft.Gradient(startColorStr=#F694F4,endColorStr=#FFFFFF,gradientType=0);
|
||||
background: -moz-linear-gradient(top, #F694F4, #FFFFFF);
|
||||
background: -ms-linear-gradient(top, #F694F4, #FFFFFF);
|
||||
background: -linear-gradient(top, #F694F4, #FFFFFF);
|
||||
background: -webkit-gradient(linear, left top, left bottom, from(#F694F4), to(#FFFFFF));
|
||||
background: -o-linear-gradient(top, #F694F4, #FFFFFF)
|
||||
}
|
||||
|
||||
a.gray80, button.gray80, input[type=button].gray80, submit.gray80, input[type=submit].gray80 {
|
||||
width: 80px;
|
||||
color: #303030;
|
||||
border: 1px solid #A7A7A7;
|
||||
FILTER: progid:DXImageTransform.Microsoft.Gradient(startColorStr=#D0D0D0,endColorStr=#FFFFFF,gradientType=0);
|
||||
background: -moz-linear-gradient(top, #D0D0D0, #FFFFFF);
|
||||
background: -ms-linear-gradient(top, #D0D0D0, #FFFFFF);
|
||||
background: -linear-gradient(top, #D0D0D0, #FFFFFF);
|
||||
background: -webkit-gradient(linear, left top, left bottom, from(#D0D0D0), to(#FFFFFF));
|
||||
background: -o-linear-gradient(top, #D0D0D0, #FFFFFF)
|
||||
}
|
||||
|
||||
a.yellow80, button.yellow80, input[type=button].yellow80, submit.yellow80, input[type=submit].yellow80 {
|
||||
width: 80px;
|
||||
color: #97A004;
|
||||
border: 1px solid #97A004;
|
||||
FILTER: progid:DXImageTransform.Microsoft.Gradient(startColorStr=#FAFFA3,endColorStr=#FFFFFF,gradientType=0);
|
||||
background: -moz-linear-gradient(top, #FAFFA3, #FFFFFF);
|
||||
background: -ms-linear-gradient(top, #FAFFA3, #FFFFFF);
|
||||
background: -linear-gradient(top, #FAFFA3, #FFFFFF);
|
||||
background: -webkit-gradient(linear, left top, left bottom, from(#FAFFA3), to(#FFFFFF));
|
||||
background: -o-linear-gradient(top, #FAFFA3, #FFFFFF)
|
||||
}
|
||||
|
||||
a.blue60, button.blue60, input[type=button].blue60, submit.blue60, input[type=submit].blue60 {
|
||||
width: 60px;
|
||||
color: #2172B5;
|
||||
border: 1px solid #2172B5;
|
||||
FILTER: progid:DXImageTransform.Microsoft.Gradient(startColorStr=#8CC6EF,endColorStr=#FFFFFF,gradientType=0);
|
||||
background: -moz-linear-gradient(top, #8CC6EF, #FFFFFF);
|
||||
background: -ms-linear-gradient(top, #8CC6EF, #FFFFFF);
|
||||
background: -linear-gradient(top, #8CC6EF, #FFFFFF);
|
||||
background: -webkit-gradient(linear, left top, left bottom, from(#8CC6EF), to(#FFFFFF));
|
||||
background: -o-linear-gradient(top, #8CC6EF, #FFFFFF)
|
||||
}
|
||||
|
||||
a.orange60, button.orange60, input[type=button].orange60, submit.orange60, input[type=submit].orange60 {
|
||||
width: 60px;
|
||||
color: #B25300;
|
||||
border: 1px solid #B25300;
|
||||
FILTER: progid:DXImageTransform.Microsoft.Gradient(startColorStr=#FFAA5F,endColorStr=#FFFFFF,gradientType=0);
|
||||
background: -moz-linear-gradient(top, #FFAA5F, #FFFFFF);
|
||||
background: -ms-linear-gradient(top, #FFAA5F, #FFFFFF);
|
||||
background: -linear-gradient(top, #FFAA5F, #FFFFFF);
|
||||
background: -webkit-gradient(linear, left top, left bottom, from(#FFAA5F), to(#FFFFFF));
|
||||
background: -o-linear-gradient(top, #FFAA5F, #FFFFFF)
|
||||
}
|
||||
|
||||
a.red60, button.red60, input[type=button].red60, submit.red60, input[type=submit].red60 {
|
||||
width: 60px;
|
||||
color: #A71717;
|
||||
border: 1px solid #A71717;
|
||||
FILTER: progid:DXImageTransform.Microsoft.Gradient(startColorStr=#F4B4B4,endColorStr=#FFFFFF,gradientType=0);
|
||||
background: -moz-linear-gradient(top, #F4B4B4, #FFFFFF);
|
||||
background: -ms-linear-gradient(top, #F4B4B4, #FFFFFF);
|
||||
background: -linear-gradient(top, #F4B4B4, #FFFFFF);
|
||||
background: -webkit-gradient(linear, left top, left bottom, from(#F4B4B4), to(#FFFFFF));
|
||||
background: -o-linear-gradient(top, #F4B4B4, #FFFFFF)
|
||||
}
|
||||
|
||||
a.green60, button.green60, input[type=button].green60, submit.green60, input[type=submit].green60 {
|
||||
width: 60px;
|
||||
color: #055705;
|
||||
border: 1px solid #055705;
|
||||
FILTER: progid:DXImageTransform.Microsoft.Gradient(startColorStr=#6EF66E,endColorStr=#FFFFFF,gradientType=0);
|
||||
background: -moz-linear-gradient(top, #6EF66E, #FFFFFF);
|
||||
background: -ms-linear-gradient(top, #6EF66E, #FFFFFF);
|
||||
background: -linear-gradient(top, #6EF66E, #FFFFFF);
|
||||
background: -webkit-gradient(linear, left top, left bottom, from(#6EF66E), to(#FFFFFF));
|
||||
background: -o-linear-gradient(top, #6EF66E, #FFFFFF)
|
||||
}
|
||||
|
||||
a.purple60, button.purple60, input[type=button].purple60, submit.purple60, input[type=submit].purple60 {
|
||||
width: 60px;
|
||||
color: #800080;
|
||||
border: 1px solid #800080;
|
||||
FILTER: progid:DXImageTransform.Microsoft.Gradient(startColorStr=#F694F4,endColorStr=#FFFFFF,gradientType=0);
|
||||
background: -moz-linear-gradient(top, #F694F4, #FFFFFF);
|
||||
background: -ms-linear-gradient(top, #F694F4, #FFFFFF);
|
||||
background: -linear-gradient(top, #F694F4, #FFFFFF);
|
||||
background: -webkit-gradient(linear, left top, left bottom, from(#F694F4), to(#FFFFFF));
|
||||
background: -o-linear-gradient(top, #F694F4, #FFFFFF)
|
||||
}
|
||||
|
||||
a.gray60, button.gray60, input[type=button].gray60, submit.gray60, input[type=submit].gray60 {
|
||||
width: 60px;
|
||||
color: #303030;
|
||||
border: 1px solid #A7A7A7;
|
||||
FILTER: progid:DXImageTransform.Microsoft.Gradient(startColorStr=#D0D0D0,endColorStr=#FFFFFF,gradientType=0);
|
||||
background: -moz-linear-gradient(top, #D0D0D0, #FFFFFF);
|
||||
background: -ms-linear-gradient(top, #D0D0D0, #FFFFFF);
|
||||
background: -linear-gradient(top, #D0D0D0, #FFFFFF);
|
||||
background: -webkit-gradient(linear, left top, left bottom, from(#D0D0D0), to(#FFFFFF));
|
||||
background: -o-linear-gradient(top, #D0D0D0, #FFFFFF)
|
||||
}
|
||||
|
||||
a.yellow60, button.yellow60, input[type=button].yellow60, submit.yellow60, input[type=submit].yellow60 {
|
||||
width: 60px;
|
||||
color: #97A004;
|
||||
border: 1px solid #97A004;
|
||||
FILTER: progid:DXImageTransform.Microsoft.Gradient(startColorStr=#FAFFA3,endColorStr=#FFFFFF,gradientType=0);
|
||||
background: -moz-linear-gradient(top, #FAFFA3, #FFFFFF);
|
||||
background: -ms-linear-gradient(top, #D0D0D0, #FFFFFF);
|
||||
background: -linear-gradient(top, #FAFFA3, #FFFFFF);
|
||||
background: -webkit-gradient(linear, left top, left bottom, from(#FAFFA3), to(#FFFFFF));
|
||||
background: -o-linear-gradient(top, #FAFFA3, #FFFFFF)
|
||||
}
|
||||
|
||||
a.blue40, button.blue40, input[type=button].blue40, submit.blue40, input[type=submit].blue40 {
|
||||
width: 40px;
|
||||
color: #2172B5;
|
||||
border: 1px solid #2172B5;
|
||||
FILTER: progid:DXImageTransform.Microsoft.Gradient(startColorStr=#8CC6EF,endColorStr=#FFFFFF,gradientType=0);
|
||||
background: -moz-linear-gradient(top, #8CC6EF, #FFFFFF);
|
||||
background: -ms-linear-gradient(top, #8CC6EF, #FFFFFF);
|
||||
background: -linear-gradient(top, #8CC6EF, #FFFFFF);
|
||||
background: -webkit-gradient(linear, left top, left bottom, from(#8CC6EF), to(#FFFFFF));
|
||||
background: -o-linear-gradient(top, #8CC6EF, #FFFFFF)
|
||||
}
|
||||
|
||||
a.orange40, button.orange40, input[type=button].orange40, submit.orange40, input[type=submit].orange40 {
|
||||
width: 40px;
|
||||
color: #B25300;
|
||||
border: 1px solid #B25300;
|
||||
FILTER: progid:DXImageTransform.Microsoft.Gradient(startColorStr=#FFAA5F,endColorStr=#FFFFFF,gradientType=0);
|
||||
background: -moz-linear-gradient(top, #FFAA5F, #FFFFFF);
|
||||
background: -ms-linear-gradient(top, #FFAA5F, #FFFFFF);
|
||||
background: -linear-gradient(top, #FFAA5F, #FFFFFF);
|
||||
background: -webkit-gradient(linear, left top, left bottom, from(#FFAA5F), to(#FFFFFF));
|
||||
background: -o-linear-gradient(top, #FFAA5F, #FFFFFF)
|
||||
}
|
||||
|
||||
a.red40, button.red40, input[type=button].red40, submit.red40, input[type=submit].red40 {
|
||||
width: 40px;
|
||||
color: #A71717;
|
||||
border: 1px solid #A71717;
|
||||
FILTER: progid:DXImageTransform.Microsoft.Gradient(startColorStr=#F4B4B4,endColorStr=#FFFFFF,gradientType=0);
|
||||
background: -moz-linear-gradient(top, #F4B4B4, #FFFFFF);
|
||||
background: -ms-linear-gradient(top, #F4B4B4, #FFFFFF);
|
||||
background: -linear-gradient(top, #F4B4B4, #FFFFFF);
|
||||
background: -webkit-gradient(linear, left top, left bottom, from(#F4B4B4), to(#FFFFFF));
|
||||
background: -o-linear-gradient(top, #F4B4B4, #FFFFFF)
|
||||
}
|
||||
|
||||
a.green40, button.green40, input[type=button].green40, submit.green40, input[type=submit].green40 {
|
||||
width: 40px;
|
||||
color: #055705;
|
||||
border: 1px solid #055705;
|
||||
FILTER: progid:DXImageTransform.Microsoft.Gradient(startColorStr=#6EF66E,endColorStr=#FFFFFF,gradientType=0);
|
||||
background: -moz-linear-gradient(top, #6EF66E, #FFFFFF);
|
||||
background: -ms-linear-gradient(top, #6EF66E, #FFFFFF);
|
||||
background: -linear-gradient(top, #6EF66E, #FFFFFF);
|
||||
background: -webkit-gradient(linear, left top, left bottom, from(#6EF66E), to(#FFFFFF));
|
||||
background: -o-linear-gradient(top, #6EF66E, #FFFFFF)
|
||||
}
|
||||
|
||||
a.purple40, button.purple40, input[type=button].purple40, submit.purple40, input[type=submit].purple40 {
|
||||
width: 40px;
|
||||
color: #800080;
|
||||
border: 1px solid #800080;
|
||||
FILTER: progid:DXImageTransform.Microsoft.Gradient(startColorStr=#F694F4,endColorStr=#FFFFFF,gradientType=0);
|
||||
background: -moz-linear-gradient(top, #F694F4, #FFFFFF);
|
||||
background: -ms-linear-gradient(top, #F694F4, #FFFFFF);
|
||||
background: -linear-gradient(top, #F694F4, #FFFFFF);
|
||||
background: -webkit-gradient(linear, left top, left bottom, from(#F694F4), to(#FFFFFF));
|
||||
background: -o-linear-gradient(top, #F694F4, #FFFFFF)
|
||||
}
|
||||
|
||||
a.gray40, button.gray40, input[type=button].gray40, submit.gray40, input[type=submit].gray40 {
|
||||
width: 40px;
|
||||
color: #303030;
|
||||
border: 1px solid #A7A7A7;
|
||||
FILTER: progid:DXImageTransform.Microsoft.Gradient(startColorStr=#D0D0D0,endColorStr=#FFFFFF,gradientType=0);
|
||||
background: -moz-linear-gradient(top, #D0D0D0, #FFFFFF);
|
||||
background: -ms-linear-gradient(top, #D0D0D0, #FFFFFF);
|
||||
background: -linear-gradient(top, #D0D0D0, #FFFFFF);
|
||||
background: -webkit-gradient(linear, left top, left bottom, from(#D0D0D0), to(#FFFFFF));
|
||||
background: -o-linear-gradient(top, #D0D0D0, #FFFFFF)
|
||||
}
|
||||
|
||||
a.yellow40, button.yellow40, input[type=button].yellow40, submit.yellow40, input[type=submit].yellow40 {
|
||||
width: 40px;
|
||||
color: #97A004;
|
||||
border: 1px solid #97A004;
|
||||
FILTER: progid:DXImageTransform.Microsoft.Gradient(startColorStr=#FAFFA3,endColorStr=#FFFFFF,gradientType=0);
|
||||
background: -moz-linear-gradient(top, #FAFFA3, #FFFFFF);
|
||||
background: -ms-linear-gradient(top, #FAFFA3, #FFFFFF);
|
||||
background: -linear-gradient(top, #FAFFA3, #FFFFFF);
|
||||
background: -webkit-gradient(linear, left top, left bottom, from(#FAFFA3), to(#FFFFFF));
|
||||
background: -o-linear-gradient(top, #FAFFA3, #FFFFFF)
|
||||
}
|
||||
|
||||
a.blue28, button.blue28, input[type=button].blue28, submit.blue28, input[type=submit].blue28 {
|
||||
width: 28px;
|
||||
color: #2172B5;
|
||||
border: 1px solid #2172B5;
|
||||
FILTER: progid:DXImageTransform.Microsoft.Gradient(startColorStr=#8CC6EF,endColorStr=#FFFFFF,gradientType=0);
|
||||
background: -moz-linear-gradient(top, #8CC6EF, #FFFFFF);
|
||||
background: -ms-linear-gradient(top, #8CC6EF, #FFFFFF);
|
||||
background: -linear-gradient(top, #8CC6EF, #FFFFFF);
|
||||
background: -webkit-gradient(linear, left top, left bottom, from(#8CC6EF), to(#FFFFFF));
|
||||
background: -o-linear-gradient(top, #8CC6EF, #FFFFFF)
|
||||
}
|
||||
|
||||
a.orange28, button.orange28, input[type=button].orange28, submit.orange28, input[type=submit].orange28 {
|
||||
width: 28px;
|
||||
color: #B25300;
|
||||
border: 1px solid #B25300;
|
||||
FILTER: progid:DXImageTransform.Microsoft.Gradient(startColorStr=#FFAA5F,endColorStr=#FFFFFF,gradientType=0);
|
||||
background: -moz-linear-gradient(top, #FFAA5F, #FFFFFF);
|
||||
background: -ms-linear-gradient(top, #FFAA5F, #FFFFFF);
|
||||
background: -linear-gradient(top, #FFAA5F, #FFFFFF);
|
||||
background: -webkit-gradient(linear, left top, left bottom, from(#FFAA5F), to(#FFFFFF));
|
||||
background: -o-linear-gradient(top, #FFAA5F, #FFFFFF)
|
||||
}
|
||||
|
||||
a.red28, button.red28, input[type=button].red28, submit.red28, input[type=submit].red28 {
|
||||
width: 28px;
|
||||
color: #A71717;
|
||||
border: 1px solid #A71717;
|
||||
FILTER: progid:DXImageTransform.Microsoft.Gradient(startColorStr=#F4B4B4,endColorStr=#FFFFFF,gradientType=0);
|
||||
background: -moz-linear-gradient(top, #F4B4B4, #FFFFFF);
|
||||
background: -ms-linear-gradient(top, #F4B4B4, #FFFFFF);
|
||||
background: -linear-gradient(top, #F4B4B4, #FFFFFF);
|
||||
background: -webkit-gradient(linear, left top, left bottom, from(#F4B4B4), to(#FFFFFF));
|
||||
background: -o-linear-gradient(top, #F4B4B4, #FFFFFF)
|
||||
}
|
||||
|
||||
a.green28, button.green28, input[type=button].green28, submit.green28, input[type=submit].green28 {
|
||||
width: 28px;
|
||||
color: #055705;
|
||||
border: 1px solid #055705;
|
||||
FILTER: progid:DXImageTransform.Microsoft.Gradient(startColorStr=#6EF66E,endColorStr=#FFFFFF,gradientType=0);
|
||||
background: -moz-linear-gradient(top, #6EF66E, #FFFFFF);
|
||||
background: -ms-linear-gradient(top, #6EF66E, #FFFFFF);
|
||||
background: -linear-gradient(top, #6EF66E, #FFFFFF);
|
||||
background: -webkit-gradient(linear, left top, left bottom, from(#6EF66E), to(#FFFFFF));
|
||||
background: -o-linear-gradient(top, #6EF66E, #FFFFFF)
|
||||
}
|
||||
|
||||
a.purple28, button.purple28, input[type=button].purple28, submit.purple28, input[type=submit].purple28 {
|
||||
width: 28px;
|
||||
color: #800080;
|
||||
border: 1px solid #800080;
|
||||
FILTER: progid:DXImageTransform.Microsoft.Gradient(startColorStr=#F694F4,endColorStr=#FFFFFF,gradientType=0);
|
||||
background: -moz-linear-gradient(top, #F694F4, #FFFFFF);
|
||||
background: -ms-linear-gradient(top, #F694F4, #FFFFFF);
|
||||
background: -linear-gradient(top, #F694F4, #FFFFFF);
|
||||
background: -webkit-gradient(linear, left top, left bottom, from(#F694F4), to(#FFFFFF));
|
||||
background: -o-linear-gradient(top, #F694F4, #FFFFFF)
|
||||
}
|
||||
|
||||
a.gray28, button.gray28, input[type=button].gray28, submit.gray28, input[type=submit].gray28 {
|
||||
width: 28px;
|
||||
color: #303030;
|
||||
border: 1px solid #A7A7A7;
|
||||
FILTER: progid:DXImageTransform.Microsoft.Gradient(startColorStr=#D0D0D0,endColorStr=#FFFFFF,gradientType=0);
|
||||
background: -moz-linear-gradient(top, #D0D0D0, #FFFFFF);
|
||||
background: -ms-linear-gradient(top, #D0D0D0, #FFFFFF);
|
||||
background: -linear-gradient(top, #D0D0D0, #FFFFFF);
|
||||
background: -webkit-gradient(linear, left top, left bottom, from(#D0D0D0), to(#FFFFFF));
|
||||
background: -o-linear-gradient(top, #D0D0D0, #FFFFFF)
|
||||
}
|
||||
|
||||
a.yellow28, button.yellow28, input[type=button].yellow28, submit.yellow28, input[type=submit].yellow28 {
|
||||
width: 28px;
|
||||
color: #97A004;
|
||||
border: 1px solid #97A004;
|
||||
FILTER: progid:DXImageTransform.Microsoft.Gradient(startColorStr=#FAFFA3,endColorStr=#FFFFFF,gradientType=0);
|
||||
background: -moz-linear-gradient(top, #FAFFA3, #FFFFFF);
|
||||
background: -ms-linear-gradient(top, #FAFFA3, #FFFFFF);
|
||||
background: -linear-gradient(top, #FAFFA3, #FFFFFF);
|
||||
background: -webkit-gradient(linear, left top, left bottom, from(#FAFFA3), to(#FFFFFF));
|
||||
background: -o-linear-gradient(top, #FAFFA3, #FFFFFF)
|
||||
}
|
||||
|
||||
a.pickupbutton {
|
||||
width: 16px;
|
||||
height: 16px;
|
||||
background-image: Url("Img/pickup.gif");
|
||||
}
|
||||
|
||||
a[disabled="disabled"], a.button[disabled="disabled"], button[disabled="disabled"], input[type=button][disabled="disabled"], submit[disabled="disabled"], input[type=submit][disabled="disabled"] {
|
||||
color: #808080;
|
||||
border: 1px solid #909090;
|
||||
FILTER: initial;
|
||||
background: none;
|
||||
background-color: #E0E0E0;
|
||||
}
|
||||
|
||||
a[disabled="disabled"]:hover {
|
||||
font-weight: normal;
|
||||
cursor: default;
|
||||
}
|
||||
|
After Width: | Height: | Size: 328 B |
|
After Width: | Height: | Size: 334 B |
|
After Width: | Height: | Size: 314 B |
|
After Width: | Height: | Size: 324 B |
|
After Width: | Height: | Size: 336 B |
|
After Width: | Height: | Size: 337 B |
|
After Width: | Height: | Size: 323 B |
|
After Width: | Height: | Size: 328 B |
|
After Width: | Height: | Size: 323 B |
|
After Width: | Height: | Size: 314 B |
|
After Width: | Height: | Size: 324 B |
|
After Width: | Height: | Size: 322 B |
|
After Width: | Height: | Size: 324 B |
|
After Width: | Height: | Size: 321 B |
|
After Width: | Height: | Size: 231 B |
|
After Width: | Height: | Size: 222 B |
|
After Width: | Height: | Size: 213 B |
|
After Width: | Height: | Size: 223 B |
|
After Width: | Height: | Size: 221 B |
|
After Width: | Height: | Size: 223 B |
|
After Width: | Height: | Size: 223 B |
|
After Width: | Height: | Size: 267 B |
|
After Width: | Height: | Size: 262 B |
|
After Width: | Height: | Size: 252 B |
|
After Width: | Height: | Size: 264 B |
|
After Width: | Height: | Size: 262 B |
|
After Width: | Height: | Size: 263 B |
|
After Width: | Height: | Size: 262 B |
|
After Width: | Height: | Size: 272 B |
|
After Width: | Height: | Size: 267 B |
|
After Width: | Height: | Size: 257 B |
|
After Width: | Height: | Size: 267 B |
|
After Width: | Height: | Size: 266 B |
|
After Width: | Height: | Size: 268 B |
|
After Width: | Height: | Size: 265 B |
|
After Width: | Height: | Size: 320 B |
|
After Width: | Height: | Size: 314 B |
|
After Width: | Height: | Size: 305 B |
|
After Width: | Height: | Size: 315 B |
|
After Width: | Height: | Size: 314 B |
|
After Width: | Height: | Size: 316 B |
|
After Width: | Height: | Size: 315 B |
|
After Width: | Height: | Size: 1.5 KiB |
|
After Width: | Height: | Size: 1.3 KiB |
|
After Width: | Height: | Size: 1.5 KiB |
|
After Width: | Height: | Size: 566 B |
|
After Width: | Height: | Size: 664 B |
|
After Width: | Height: | Size: 190 B |
|
After Width: | Height: | Size: 2.4 KiB |
|
After Width: | Height: | Size: 846 B |
|
After Width: | Height: | Size: 865 B |
|
After Width: | Height: | Size: 826 B |
|
After Width: | Height: | Size: 882 B |
|
After Width: | Height: | Size: 860 B |
|
After Width: | Height: | Size: 885 B |
|
After Width: | Height: | Size: 861 B |
|
After Width: | Height: | Size: 807 B |
|
After Width: | Height: | Size: 805 B |
|
After Width: | Height: | Size: 806 B |
|
After Width: | Height: | Size: 806 B |
|
After Width: | Height: | Size: 804 B |
@@ -0,0 +1,49 @@
|
||||
/* Loading 遮罩樣式 */
|
||||
.loading-overlay {
|
||||
position: fixed;
|
||||
top: 0;
|
||||
left: 0;
|
||||
right: 0;
|
||||
bottom: 0;
|
||||
background-color: rgba(0, 0, 0, 0);
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
z-index: 10000;
|
||||
}
|
||||
|
||||
.loading-spinner {
|
||||
background-color: white;
|
||||
padding: 40px;
|
||||
border-radius: 8px;
|
||||
text-align: center;
|
||||
box-shadow: 0 4px 20px rgba(0, 0, 0, 0.2);
|
||||
}
|
||||
|
||||
.loading-spinner p {
|
||||
margin-top: 15px;
|
||||
color: #333;
|
||||
font-size: 16px;
|
||||
font-weight: 500;
|
||||
}
|
||||
|
||||
/* 轉圈圈動畫 */
|
||||
.spinner {
|
||||
width: 50px;
|
||||
height: 50px;
|
||||
border: 4px solid #cccccc;
|
||||
border-top: 4px solid #ffffff;
|
||||
border-radius: 50%;
|
||||
animation: spin 1s linear infinite;
|
||||
margin: 0 auto;
|
||||
}
|
||||
|
||||
@keyframes spin {
|
||||
0% {
|
||||
transform: rotate(0deg);
|
||||
}
|
||||
|
||||
100% {
|
||||
transform: rotate(360deg);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,45 @@
|
||||
a.menu {
|
||||
display: inline-block;
|
||||
color: Black;
|
||||
width: 100%;
|
||||
height: 27px;
|
||||
line-height: 26px;
|
||||
vertical-align: top;
|
||||
overflow: hidden;
|
||||
text-align: left;
|
||||
cursor: pointer !important;
|
||||
z-index: 999;
|
||||
}
|
||||
|
||||
a.menu_toplevel {
|
||||
display: inline-block;
|
||||
color: White;
|
||||
width: 100%;
|
||||
height: 27px;
|
||||
line-height: 26px;
|
||||
vertical-align: top;
|
||||
text-align: left;
|
||||
cursor: pointer !important;
|
||||
z-index: 999;
|
||||
}
|
||||
|
||||
a.menuSelected {
|
||||
display: inline-block;
|
||||
color: White;
|
||||
width: 100%;
|
||||
height: 27px;
|
||||
line-height: 26px;
|
||||
vertical-align: top;
|
||||
text-align: left;
|
||||
z-index: 999;
|
||||
}
|
||||
|
||||
a.menu:hover {
|
||||
color: White;
|
||||
background-color: #007ACC;
|
||||
}
|
||||
|
||||
a.menu_toplevel:hover {
|
||||
color: White;
|
||||
background-color: #007ACC;
|
||||
}
|
||||
@@ -0,0 +1,105 @@
|
||||
div.popup_title_left_corner
|
||||
{
|
||||
padding:0;
|
||||
margin:0;
|
||||
width: 3px;
|
||||
height:27px;
|
||||
background-image:url("Img/window_caption_left_corner.gif");
|
||||
background-repeat:no-repeat;
|
||||
float:left;
|
||||
}
|
||||
|
||||
div.popup_title_right_corner
|
||||
{
|
||||
padding:0;
|
||||
margin:0;
|
||||
width: 3px;
|
||||
height: 27px;
|
||||
background-image:url("Img/window_caption_right_corner.gif");
|
||||
background-repeat:no-repeat;
|
||||
float:left;
|
||||
}
|
||||
|
||||
div.popup_title_left
|
||||
{
|
||||
padding:0;
|
||||
margin:0;
|
||||
width: 4px;
|
||||
height:27px;
|
||||
background-image:url("Img/window_caption_left.gif");
|
||||
background-repeat:no-repeat;
|
||||
float:left;
|
||||
}
|
||||
|
||||
div.popup_title_right
|
||||
{
|
||||
padding:0;
|
||||
margin:0;
|
||||
width: 4px;
|
||||
height:27px;
|
||||
background-image:url("Img/window_caption_right.gif");
|
||||
background-repeat:no-repeat;
|
||||
float:left;
|
||||
}
|
||||
|
||||
div.popup_title
|
||||
{
|
||||
padding:0;
|
||||
margin:0;
|
||||
height:27px;
|
||||
background-image:url("Img/window_caption.gif");
|
||||
background-repeat:repeat-x;
|
||||
float:left;
|
||||
}
|
||||
|
||||
div.popup_left_border
|
||||
{
|
||||
padding:0;
|
||||
margin:0;
|
||||
width:3px;
|
||||
background-image:url("Img/window_left_border.gif");
|
||||
background-repeat:repeat-y;
|
||||
float:left;
|
||||
}
|
||||
|
||||
div.popup_right_border
|
||||
{
|
||||
padding:0;
|
||||
margin:0;
|
||||
width:3px;
|
||||
background-image:url("Img/window_right_border.gif");
|
||||
background-repeat:repeat-y;
|
||||
float:left;
|
||||
}
|
||||
|
||||
div.popup_lower_left_corner
|
||||
{
|
||||
padding:0;
|
||||
margin:0;
|
||||
width:3px;
|
||||
height:3px;
|
||||
background-image:url("Img/window_lower_left_corner.gif");
|
||||
background-repeat:no-repeat;
|
||||
float:left;
|
||||
}
|
||||
|
||||
div.popup_lower_right_corner
|
||||
{
|
||||
padding:0;
|
||||
margin:0;
|
||||
width:3px;
|
||||
height:3px;
|
||||
background-image:url("Img/window_lower_right_corner.gif");
|
||||
background-repeat:no-repeat;
|
||||
float:left;
|
||||
}
|
||||
|
||||
div.popup_lower_border
|
||||
{
|
||||
padding:0;
|
||||
margin:0;
|
||||
height:3px;
|
||||
background-image:url("Img/window_lower_border.gif");
|
||||
background-repeat:repeat-x;
|
||||
float:left;
|
||||
}
|
||||
@@ -0,0 +1,107 @@
|
||||
<%--
|
||||
預設面板範本。下列面板僅提供做為範例的用途。
|
||||
|
||||
1. 具名控制面板。SkinId 應為唯一定義,因為在相同主題中,一個控制項型別不能具有重複的 SkinId。
|
||||
|
||||
<asp:GridView runat="server" SkinId="gridviewSkin" BackColor="White" >
|
||||
<AlternatingRowStyle BackColor="Blue" />
|
||||
</asp:GridView>
|
||||
|
||||
2. 預設面板。SkinId 未定義。在相同主題中,每個控制項型別只能有一個預設控制面板。
|
||||
|
||||
<asp:Image runat="server" ImageUrl="~/images/image1.jpg" />
|
||||
--%>
|
||||
|
||||
<%@ Register Assembly="WebLib" Namespace="WebLib" TagPrefix="weblib" %>
|
||||
|
||||
<asp:GridView runat="server"
|
||||
BackColor="White"
|
||||
BorderColor="#B0B0B0"
|
||||
BorderStyle="Solid"
|
||||
BorderWidth="1px"
|
||||
CellPadding="3"
|
||||
EnableModelValidation="True"
|
||||
ForeColor="Black"
|
||||
GridLines="Vertical"
|
||||
CSSClass="gridview">
|
||||
<RowStyle
|
||||
BorderColor="#B0B0B0" />
|
||||
<AlternatingRowStyle
|
||||
BorderColor="#B0B0B0"
|
||||
BackColor="#EEEEEE" />
|
||||
<FooterStyle
|
||||
BorderColor="#B0B0B0"
|
||||
BackColor="#B7DEFC" />
|
||||
<HeaderStyle
|
||||
BorderColor="#B0B0B0"
|
||||
BackColor="#B7DEFC" />
|
||||
<PagerStyle
|
||||
BorderWidth="1px"
|
||||
BorderColor="#B0B0B0"
|
||||
BackColor="#DDDDDD"
|
||||
HorizontalAlign="Right" />
|
||||
<SelectedRowStyle
|
||||
BorderColor="#B0B0B0"
|
||||
BackColor="#95D1FF" />
|
||||
<EditRowStyle
|
||||
BorderColor="#B0B0B0"
|
||||
BackColor="#95D1FF" />
|
||||
</asp:GridView>
|
||||
|
||||
<asp:TreeView
|
||||
runat="server">
|
||||
<HoverNodeStyle
|
||||
Font-Underline="False"
|
||||
ForeColor="#FFFFFF"
|
||||
BackColor="#007ACC" />
|
||||
<NodeStyle
|
||||
Font-Size="12pt"
|
||||
ForeColor="Black"
|
||||
HorizontalPadding="4px"
|
||||
NodeSpacing="0px"
|
||||
VerticalPadding="0px"
|
||||
Height="22px"
|
||||
CssClass="menu"
|
||||
Width="100%" />
|
||||
<ParentNodeStyle
|
||||
CssClass="menu"
|
||||
Width="100%"
|
||||
Font-Bold="False" />
|
||||
<SelectedNodeStyle
|
||||
Font-Underline="False"
|
||||
ForeColor="#FFFFFF"
|
||||
BackColor="#007ACC"
|
||||
HorizontalPadding="4px"
|
||||
VerticalPadding="0px"
|
||||
CssClass="menuSelected" />
|
||||
<RootNodeStyle
|
||||
CssClass="menu"
|
||||
Width="100%" />
|
||||
</asp:TreeView>
|
||||
|
||||
<asp:FormView runat="server"
|
||||
CssClass="formview">
|
||||
</asp:FormView>
|
||||
|
||||
<asp:Menu runat="server"
|
||||
Orientation="Horizontal"
|
||||
Font-Overline="False"
|
||||
StaticEnableDefaultPopOutImage="False"
|
||||
StaticSubMenuIndent="0"
|
||||
DynamicHorizontalOffset="0"
|
||||
DynamicVerticalOffset="0"
|
||||
StaticItemFormatString=" {0} "
|
||||
DynamicItemFormatString=" {0} "
|
||||
SkipLinkText="" >
|
||||
<StaticMenuItemStyle CssClass="menu_toplevel" />
|
||||
<StaticSelectedStyle BackColor="#007ACC" ForeColor="White" />
|
||||
<DynamicMenuItemStyle CssClass="menu" BackColor="#89CEFF" ForeColor="White" />
|
||||
<DynamicSelectedStyle BackColor="#007ACC" ForeColor="White" />
|
||||
</asp:Menu>
|
||||
|
||||
<weblib:DateTextBox runat="server"
|
||||
DateSeparator=""
|
||||
DateOrder="YMD" />
|
||||
|
||||
<weblib:GridViewPager runat="server"
|
||||
ButtonCssClass="button gray60" />
|
||||
@@ -0,0 +1,372 @@
|
||||
body, div, table {
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
body {
|
||||
font-family: Arial, Helvetica, sans-serif, "Microsoft JhengHei", "Microsoft YaHei", MingLiU, SimSun;
|
||||
font-size: 12pt;
|
||||
background-color: #eee;
|
||||
}
|
||||
|
||||
input:where([type="text"], [type="password"], [type="date"], [type="datetime"], [type="number"]),
|
||||
textarea,
|
||||
select {
|
||||
padding: 3px;
|
||||
border: solid 1px #ccc;
|
||||
border-radius: 3px;
|
||||
}
|
||||
|
||||
input:where([type="text"], [type="password"], [type="date"], [type="datetime"], [type="number"])[readonly],
|
||||
input:where([type="text"], [type="password"], [type="date"], [type="datetime"], [type="number"])[disabled],
|
||||
textarea[readonly],
|
||||
textarea[disabled],
|
||||
select[disabled] {
|
||||
background-color: #ccc;
|
||||
}
|
||||
|
||||
/*select {
|
||||
padding: 3px;
|
||||
height: 1.7em;
|
||||
background-color: #FFF;
|
||||
}
|
||||
*/
|
||||
|
||||
.hide {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.background {
|
||||
width: 100%;
|
||||
text-align: center;
|
||||
background-image: url('img/outbg.gif');
|
||||
}
|
||||
|
||||
.ta-center {
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.ta-left {
|
||||
text-align: left;
|
||||
}
|
||||
|
||||
.ta-right {
|
||||
text-align: right;
|
||||
}
|
||||
|
||||
.timeText {
|
||||
font-size: 12pt;
|
||||
color: Black;
|
||||
}
|
||||
|
||||
.labelCell {
|
||||
text-align: right;
|
||||
}
|
||||
|
||||
.displayCell {
|
||||
background-color: #C6E8FF;
|
||||
}
|
||||
|
||||
.inputCell {
|
||||
background-color: White;
|
||||
}
|
||||
|
||||
input {
|
||||
font-family: Arial, Helvetica, sans-serif, "Microsoft JhengHei", "Microsoft YaHei", MingLiU, SimSun;
|
||||
font-size: 12pt;
|
||||
word-break: break-all;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
||||
input[type="text"]:focus {
|
||||
background-color: #FFFFD0;
|
||||
}
|
||||
|
||||
input[type="password"]:focus {
|
||||
background-color: #FFFFD0;
|
||||
}
|
||||
|
||||
textarea {
|
||||
font-family: Arial, Helvetica, sans-serif, "Microsoft JhengHei", "Microsoft YaHei", MingLiU, SimSun;
|
||||
font-size: 12pt;
|
||||
word-break: break-all;
|
||||
line-height: 1.5em;
|
||||
}
|
||||
|
||||
textarea:focus {
|
||||
background-color: #FFFFD0;
|
||||
}
|
||||
|
||||
select {
|
||||
font-family: Arial, Helvetica, sans-serif, "Microsoft JhengHei", "Microsoft YaHei", MingLiU, SimSun;
|
||||
font-size: 12pt;
|
||||
margin-right: 0;
|
||||
height: auto;
|
||||
}
|
||||
|
||||
.inputFull {
|
||||
width: 100%;
|
||||
margin: 0;
|
||||
box-sizing: border-box;
|
||||
-moz-box-sizing: border-box;
|
||||
-webkit-box-sizing: border-box;
|
||||
_box-sizing: border-box;
|
||||
word-break: break-all;
|
||||
-ms-word-break: break-all;
|
||||
}
|
||||
|
||||
.inputFullBlock {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
margin: 0;
|
||||
box-sizing: border-box;
|
||||
-moz-box-sizing: border-box;
|
||||
-webkit-box-sizing: border-box;
|
||||
_box-sizing: border-box;
|
||||
font-size: 12pt;
|
||||
}
|
||||
|
||||
a.hiddenLink {
|
||||
text-decoration: none;
|
||||
color: Black;
|
||||
}
|
||||
|
||||
a.hiddenLink:hover {
|
||||
color: Blue;
|
||||
}
|
||||
|
||||
.functionTitle {
|
||||
font-size: 14pt;
|
||||
font-weight: bold;
|
||||
color: #004d7a;
|
||||
padding-top: 6px;
|
||||
padding-bottom: 6px;
|
||||
}
|
||||
|
||||
.marqueeText {
|
||||
font-size: 12pt;
|
||||
font-weight: bolder;
|
||||
color: Red;
|
||||
}
|
||||
|
||||
.groupHeaderCell {
|
||||
text-align: center;
|
||||
border-bottom-style: solid;
|
||||
border-bottom-width: 1px;
|
||||
border-bottom-color: black;
|
||||
}
|
||||
|
||||
.FunctionName {
|
||||
color: #2472B2;
|
||||
font-size: 12pt;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.ErrorMessage {
|
||||
color: red;
|
||||
font-size: 12pt;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
a.LogoutButton {
|
||||
height: 32px;
|
||||
width: 32px;
|
||||
background-image: Url("Img/logout.png");
|
||||
background-repeat: no-repeat;
|
||||
background-position: 0 0;
|
||||
}
|
||||
|
||||
a.election {
|
||||
color: Blue;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
a.cancelelection {
|
||||
color: Blue;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.padding0 {
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
.padding3 {
|
||||
padding: 3px;
|
||||
}
|
||||
|
||||
.padding5 {
|
||||
padding: 5px;
|
||||
}
|
||||
|
||||
.minwidth10 {
|
||||
min-width: 10px;
|
||||
}
|
||||
|
||||
.minwidth20 {
|
||||
min-width: 20px;
|
||||
}
|
||||
|
||||
.minwidth30 {
|
||||
min-width: 30px;
|
||||
}
|
||||
|
||||
.minwidth40 {
|
||||
min-width: 40px;
|
||||
}
|
||||
|
||||
.minwidth50 {
|
||||
min-width: 50px;
|
||||
}
|
||||
|
||||
.minwidth60 {
|
||||
min-width: 60px;
|
||||
}
|
||||
|
||||
.minwidth70 {
|
||||
min-width: 70px;
|
||||
}
|
||||
|
||||
.minwidth80 {
|
||||
min-width: 80px;
|
||||
}
|
||||
|
||||
.minwidth90 {
|
||||
min-width: 90px;
|
||||
}
|
||||
|
||||
.minwidth100 {
|
||||
min-width: 100px;
|
||||
}
|
||||
|
||||
.minwidth110 {
|
||||
min-width: 110px;
|
||||
}
|
||||
|
||||
.minwidth120 {
|
||||
min-width: 120px;
|
||||
}
|
||||
|
||||
.minwidth130 {
|
||||
min-width: 130px;
|
||||
}
|
||||
|
||||
.minwidth140 {
|
||||
min-width: 140px;
|
||||
}
|
||||
|
||||
.minwidth150 {
|
||||
min-width: 150px;
|
||||
}
|
||||
|
||||
.minwidth160 {
|
||||
min-width: 160px;
|
||||
}
|
||||
|
||||
.minwidth170 {
|
||||
min-width: 170px;
|
||||
}
|
||||
|
||||
.minwidth180 {
|
||||
min-width: 180px;
|
||||
}
|
||||
|
||||
.minwidth190 {
|
||||
min-width: 190px;
|
||||
}
|
||||
|
||||
.minwidth200 {
|
||||
min-width: 200px;
|
||||
}
|
||||
|
||||
.maxwidth10 {
|
||||
max-width: 10px;
|
||||
}
|
||||
|
||||
.maxwidth20 {
|
||||
max-width: 20px;
|
||||
}
|
||||
|
||||
.maxwidth30 {
|
||||
max-width: 30px;
|
||||
}
|
||||
|
||||
.maxwidth40 {
|
||||
max-width: 40px;
|
||||
}
|
||||
|
||||
.maxwidth50 {
|
||||
max-width: 50px;
|
||||
}
|
||||
|
||||
.maxwidth60 {
|
||||
max-width: 60px;
|
||||
}
|
||||
|
||||
.maxwidth70 {
|
||||
max-width: 70px;
|
||||
}
|
||||
|
||||
.maxwidth80 {
|
||||
max-width: 80px;
|
||||
}
|
||||
|
||||
.maxwidth90 {
|
||||
max-width: 90px;
|
||||
}
|
||||
|
||||
.maxwidth100 {
|
||||
max-width: 100px;
|
||||
}
|
||||
|
||||
.maxwidth110 {
|
||||
max-width: 110px;
|
||||
}
|
||||
|
||||
.maxwidth120 {
|
||||
max-width: 120px;
|
||||
}
|
||||
|
||||
.maxwidth130 {
|
||||
max-width: 130px;
|
||||
}
|
||||
|
||||
.maxwidth140 {
|
||||
max-width: 140px;
|
||||
}
|
||||
|
||||
.maxwidth150 {
|
||||
max-width: 150px;
|
||||
}
|
||||
|
||||
.maxwidth160 {
|
||||
max-width: 160px;
|
||||
}
|
||||
|
||||
.maxwidth170 {
|
||||
max-width: 170px;
|
||||
}
|
||||
|
||||
.maxwidth180 {
|
||||
max-width: 180px;
|
||||
}
|
||||
|
||||
.maxwidth190 {
|
||||
max-width: 190px;
|
||||
}
|
||||
|
||||
.maxwidth200 {
|
||||
max-width: 200px;
|
||||
}
|
||||
|
||||
.phraselink {
|
||||
text-decoration: none;
|
||||
margin-right: 1em;
|
||||
color: #007ACC;
|
||||
cursor: pointer;
|
||||
display: inline-block;
|
||||
}
|
||||
|
||||
.phraselink:hover {
|
||||
background-color: #007ACC;
|
||||
color: #FFF;
|
||||
}
|
||||
@@ -0,0 +1,36 @@
|
||||
/* 頁籤樣式 */
|
||||
a.tabButton
|
||||
{
|
||||
font-size: 12pt;
|
||||
text-decoration : none;
|
||||
text-align:center;
|
||||
padding-top: 0px;
|
||||
display: inline-block;
|
||||
vertical-align: top;
|
||||
width: 179px;
|
||||
height: 27px;
|
||||
line-height: 24px;
|
||||
background-image: Url("Img/TabYellow.png");
|
||||
background-repeat: no-repeat;
|
||||
background-position: 0 0;
|
||||
color : Black;
|
||||
font-weight: normal;
|
||||
}
|
||||
|
||||
a.tabButtonSelected
|
||||
{
|
||||
font-size: 12pt;
|
||||
text-decoration : none;
|
||||
text-align: center;
|
||||
padding-top: 0px;
|
||||
display: inline-block;
|
||||
vertical-align: top;
|
||||
width: 179px;
|
||||
height: 27px;
|
||||
line-height: 24px;
|
||||
background-image: Url("Img/TabYellow.png");
|
||||
background-repeat: no-repeat;
|
||||
background-position: 0 -27px;
|
||||
color : Black;
|
||||
font-weight: normal;
|
||||
}
|
||||
@@ -0,0 +1,90 @@
|
||||
table {
|
||||
font-family: Arial, Helvetica, sans-serif, "Microsoft JhengHei", "Microsoft YaHei", MingLiU, SimSun;
|
||||
font-size: 12pt;
|
||||
border-collapse: separate;
|
||||
border-spacing: 0;
|
||||
margin-bottom: 0;
|
||||
}
|
||||
|
||||
table.formview table {
|
||||
border-collapse: separate;
|
||||
border-spacing: 2px;
|
||||
}
|
||||
|
||||
table.fixedwithborder {
|
||||
table-layout: fixed;
|
||||
border-collapse: collapse;
|
||||
border: 1px solid #DDD;
|
||||
}
|
||||
|
||||
table.fixedwithoutborder {
|
||||
table-layout: fixed;
|
||||
border-collapse: collapse;
|
||||
border: 0;
|
||||
}
|
||||
|
||||
table.autowidth {
|
||||
table-layout: auto;
|
||||
}
|
||||
|
||||
th {
|
||||
padding: 3px;
|
||||
text-align: center;
|
||||
background-color: #DDDDDD;
|
||||
font-weight: normal;
|
||||
color: Black;
|
||||
border: 1px solid #DDD;
|
||||
word-break: break-all;
|
||||
}
|
||||
|
||||
td {
|
||||
word-break: break-all;
|
||||
}
|
||||
|
||||
td.caption {
|
||||
padding: 3px;
|
||||
text-align: right;
|
||||
background-color: #FFFFFF;
|
||||
word-break: break-all;
|
||||
}
|
||||
|
||||
td.captionCenter {
|
||||
padding: 3px;
|
||||
text-align: center;
|
||||
background-color: #FFFFFF;
|
||||
word-break: break-all;
|
||||
}
|
||||
|
||||
td.captionLeft {
|
||||
padding: 3px;
|
||||
text-align: left;
|
||||
background-color: #FFFFFF;
|
||||
word-break: break-all;
|
||||
}
|
||||
|
||||
td.datainput {
|
||||
padding: 3px;
|
||||
}
|
||||
|
||||
td.datadisplay {
|
||||
padding: 5px;
|
||||
background-color: #DEF0FC;
|
||||
word-wrap: break-word;
|
||||
word-break: break-all;
|
||||
}
|
||||
|
||||
td.widthcontrol {
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
height: 0;
|
||||
font-size: 0;
|
||||
}
|
||||
|
||||
table.gridview {
|
||||
border-collapse: collapse;
|
||||
}
|
||||
|
||||
table.gridview tr th, td {
|
||||
border-left-color: #DDD;
|
||||
border-right-color: #DDD;
|
||||
}
|
||||
@@ -0,0 +1,70 @@
|
||||
/* 警告訊息進入動畫 */
|
||||
@keyframes slideDown {
|
||||
from {
|
||||
opacity: 0;
|
||||
transform: translateY(-10px);
|
||||
}
|
||||
|
||||
to {
|
||||
opacity: 1;
|
||||
transform: translateY(0);
|
||||
}
|
||||
}
|
||||
|
||||
/* Toast 進入動畫 */
|
||||
@keyframes slideIn {
|
||||
from {
|
||||
transform: translateX(400px);
|
||||
opacity: 0;
|
||||
}
|
||||
|
||||
to {
|
||||
transform: translateX(0);
|
||||
opacity: 1;
|
||||
}
|
||||
}
|
||||
|
||||
/* Toast 訊息容器樣式 */
|
||||
.toast-message {
|
||||
position: fixed;
|
||||
top: 20px;
|
||||
right: 20px;
|
||||
padding: 15px 20px;
|
||||
border-radius: 4px;
|
||||
color: white;
|
||||
font-weight: 500;
|
||||
z-index: 9999;
|
||||
animation: slideIn 0.3s ease-out;
|
||||
max-width: 400px;
|
||||
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
|
||||
word-wrap: break-word;
|
||||
word-break: break-word;
|
||||
}
|
||||
|
||||
/* Toast 訊息類型樣式 */
|
||||
.toast-success {
|
||||
background-color: #28a745;
|
||||
}
|
||||
|
||||
.toast-error {
|
||||
background-color: #dc3545;
|
||||
}
|
||||
|
||||
.toast-warning {
|
||||
background-color: #ffc107;
|
||||
color: #333;
|
||||
}
|
||||
|
||||
.toast-info {
|
||||
background-color: #17a2b8;
|
||||
}
|
||||
|
||||
/* Vue transition 動畫 */
|
||||
.toast-enter-active, .toast-leave-active {
|
||||
transition: all 0.3s ease;
|
||||
}
|
||||
|
||||
.toast-enter, .toast-leave-to {
|
||||
transform: translateX(100%);
|
||||
opacity: 0;
|
||||
}
|
||||
@@ -0,0 +1,80 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Web;
|
||||
using System.Text;
|
||||
|
||||
namespace Education
|
||||
{
|
||||
public class EncDec
|
||||
{
|
||||
/// <summary>
|
||||
/// WLIB 新版密碼的加密函數
|
||||
/// </summary>
|
||||
/// <param name="S">欲加密之密碼字串,最大長度 8 位,僅可包含A-Z、a-z、0-9</param>
|
||||
/// <returns>加密後之密碼字串</returns>
|
||||
public static string KeyEnc(string S)
|
||||
{
|
||||
int k1 = 0;
|
||||
int k2 = 0;
|
||||
int i, j;
|
||||
Random rnd = new Random(DateTime.UtcNow.AddHours(8).Millisecond);
|
||||
byte[] inBuf = new byte[8];
|
||||
byte[] outBuf = new byte[10];
|
||||
string tmp;
|
||||
|
||||
while (true)
|
||||
{
|
||||
k1 = rnd.Next(31);
|
||||
k2 = rnd.Next(31);
|
||||
outBuf[0] = (byte)(k1 + 44);
|
||||
outBuf[9] = (byte)(k2 + 66);
|
||||
|
||||
if (S.Length < 8)
|
||||
inBuf = Encoding.ASCII.GetBytes(S.PadRight(8));
|
||||
else
|
||||
inBuf = Encoding.ASCII.GetBytes(S);
|
||||
|
||||
for (i = 1; i <= 8; i++)
|
||||
{
|
||||
j = (k1 % 31) + i;
|
||||
j = ((k2 + j) % 31) + 1;
|
||||
|
||||
outBuf[i] = (byte)(inBuf[i - 1] ^ j);
|
||||
}
|
||||
tmp = Encoding.ASCII.GetString(outBuf);
|
||||
if (tmp.IndexOf('\'') < 0 && tmp.IndexOf('"') < 0)
|
||||
break;
|
||||
}
|
||||
return tmp;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// WLIB 新版密碼的解密函數
|
||||
/// </summary>
|
||||
/// <param name="S">欲解密之密碼字串,固定 10 位</param>
|
||||
/// <returns>解密後之密碼字串。若參數 S 長度不是 10 位,則傳回".." + S + ".."</returns>
|
||||
public static string KeyDec(string S)
|
||||
{
|
||||
int i, j;
|
||||
int Key1, Key2;
|
||||
byte[] inBuf;
|
||||
byte[] outBuf = new byte[8];
|
||||
|
||||
if (S.Length != 10)
|
||||
return ".." + S + "..";
|
||||
|
||||
//解密
|
||||
inBuf = Encoding.ASCII.GetBytes(S);
|
||||
Key1 = inBuf[0] - 44;
|
||||
Key2 = inBuf[9] - 66;
|
||||
|
||||
for (i = 1; i <= 8; i++)
|
||||
{
|
||||
j = Key1 % 31 + i;
|
||||
j = (Key2 + j) % 31 + 1;
|
||||
outBuf[i - 1] = (byte)(inBuf[i] ^ j);
|
||||
}
|
||||
return Encoding.ASCII.GetString(outBuf).Trim();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,211 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Web;
|
||||
using System.Timers;
|
||||
using System.IO;
|
||||
using System.Data;
|
||||
using System.Data.Common;
|
||||
using System.Data.SqlClient;
|
||||
using WebLib;
|
||||
|
||||
namespace Education
|
||||
{
|
||||
public class FollowService
|
||||
{
|
||||
private static FollowService _instance = null;
|
||||
private Timer _timer = null;
|
||||
private static int _interval = 30;
|
||||
private static string _doWorkTime = "00:00";
|
||||
private static bool _enabled = false;
|
||||
private static bool _busy = false;
|
||||
private static 發送郵件 發送郵件 = new 發送郵件();
|
||||
private DAC_BPSN Dao員工;
|
||||
private DbConnection conn;
|
||||
|
||||
/// <summary>
|
||||
/// 發動時間,預設值為 00:00
|
||||
/// </summary>
|
||||
public static string DoWorkTime
|
||||
{
|
||||
get
|
||||
{
|
||||
return _doWorkTime;
|
||||
}
|
||||
set
|
||||
{
|
||||
_doWorkTime = value;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 郵件模版路徑
|
||||
/// </summary>
|
||||
public static string TemplatePath { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 設定或取得簽核跟催服務是否啟動
|
||||
/// </summary>
|
||||
public static bool Enabled
|
||||
{
|
||||
get
|
||||
{
|
||||
return _enabled;
|
||||
}
|
||||
set
|
||||
{
|
||||
if (value)
|
||||
{
|
||||
if (_enabled)
|
||||
return;
|
||||
|
||||
Instance._timer.Interval = _interval * 1000;
|
||||
Instance._timer.AutoReset = true;
|
||||
Instance._timer.Enabled = true;
|
||||
_enabled = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (!_enabled)
|
||||
return;
|
||||
|
||||
_enabled = false;
|
||||
Instance._timer.Enabled = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private FollowService()
|
||||
{
|
||||
_timer = new Timer();
|
||||
_timer.Enabled = false;
|
||||
_timer.Elapsed += new ElapsedEventHandler(DoFollowWork);
|
||||
conn = DAC.NewConnection();
|
||||
Dao員工 = new DAC_BPSN(conn);
|
||||
}
|
||||
|
||||
public static FollowService Instance
|
||||
{
|
||||
get
|
||||
{
|
||||
if (_instance == null)
|
||||
_instance = new FollowService();
|
||||
return _instance;
|
||||
}
|
||||
}
|
||||
|
||||
private void DoFollowWork(object sender, ElapsedEventArgs e)
|
||||
{
|
||||
string nowTime = DateTime.UtcNow.AddHours(8).ToString("HH:mm");
|
||||
if (nowTime.CompareTo(_doWorkTime) == 0 && !_busy)
|
||||
{
|
||||
_busy = true;
|
||||
try
|
||||
{
|
||||
DAC_表單簽核明細 dao表單簽核明細 = new DAC_表單簽核明細(conn);
|
||||
表單簽核明細List first = dao表單簽核明細.Select第一次稽催();
|
||||
表單簽核明細List second = dao表單簽核明細.Select第二次稽催();
|
||||
表單簽核明細List third = dao表單簽核明細.Select第三次稽催();
|
||||
|
||||
foreach (表單簽核明細 item in first)
|
||||
{
|
||||
SendFollowMail(item, 3);
|
||||
item.稽催狀態 = 1;
|
||||
dao表單簽核明細.UpdateOne(item);
|
||||
}
|
||||
|
||||
foreach (表單簽核明細 item in second)
|
||||
{
|
||||
SendFollowMail(item, 7);
|
||||
item.稽催狀態 = 2;
|
||||
dao表單簽核明細.UpdateOne(item);
|
||||
}
|
||||
|
||||
foreach (表單簽核明細 item in third)
|
||||
{
|
||||
SendFollowMail(item, 14);
|
||||
item.稽催狀態 = 3;
|
||||
dao表單簽核明細.UpdateOne(item);
|
||||
}
|
||||
|
||||
DoSurveyReminderWork();
|
||||
}
|
||||
finally
|
||||
{
|
||||
_busy = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void SendFollowMail(表單簽核明細 item, int 天數)
|
||||
{
|
||||
string 電子郵件 = Dao員工.Get電子郵件(item.簽核人員);
|
||||
string 員工姓名 = Dao員工.Get員工姓名(item.簽核人員);
|
||||
發送郵件 發送郵件 = new 發送郵件();
|
||||
發送郵件.發送簽核跟催郵件(item.簽核ID, 員工姓名, 電子郵件, 天數, TemplatePath);
|
||||
}
|
||||
|
||||
private void DoSurveyReminderWork()
|
||||
{
|
||||
if (string.IsNullOrEmpty(PublicVariable.SiteBaseUrl))
|
||||
return;
|
||||
|
||||
string 手機版網址 = PublicVariable.SiteBaseUrl + "/MobileSurvey/Login.aspx";
|
||||
int deadlineDays = PublicVariable.SurveyReminderDeadlineDays;
|
||||
DateTime minDate = PublicVariable.SurveyReminderMinCourseDate;
|
||||
string[] excludeEmps = PublicVariable.SurveyReminderExcludeEmployees
|
||||
.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
|
||||
|
||||
DbCommand cmd = conn.CreateCommand();
|
||||
cmd.CommandText =
|
||||
@"select A.學員編號, A.訓練課程編號, C.BPNME as 學員姓名, C.BPEML as 電子郵件,
|
||||
B.顯示編號, B.訓練名稱, B.訓練日期, B.訓練日期迄
|
||||
from 課程報名 A
|
||||
inner join 訓練課程企劃 B on A.訓練課程編號 = B.編號
|
||||
inner join BPSNView C on A.學員編號 = C.BPENO
|
||||
where (A.報名狀態 = 'Y' or A.報名狀態 = 'R')
|
||||
and B.訓練日期 >= @MinCourseDate
|
||||
and (A.滿意度催填狀態 is null or A.滿意度催填狀態 = '')
|
||||
and not exists (
|
||||
select 1 from 滿意度調查 D
|
||||
where D.訓練課程企劃編號 = A.訓練課程編號 and D.學員編號 = A.學員編號
|
||||
)
|
||||
and dateadd(day, @DeadlineDays, B.訓練日期迄) < getdate()
|
||||
order by A.學員編號";
|
||||
cmd.Parameters.Add(new SqlParameter("@MinCourseDate", minDate));
|
||||
cmd.Parameters.Add(new SqlParameter("@DeadlineDays", deadlineDays));
|
||||
|
||||
DataTable dt = new DataTable();
|
||||
using (var reader = cmd.ExecuteReader())
|
||||
{
|
||||
dt.Load(reader);
|
||||
}
|
||||
|
||||
foreach (DataRow row in dt.Rows)
|
||||
{
|
||||
string 學員編號 = DAC.GetString(row["學員編號"]);
|
||||
if (excludeEmps.Contains(學員編號))
|
||||
continue;
|
||||
|
||||
string 學員姓名 = DAC.GetString(row["學員姓名"]);
|
||||
string 電子郵件 = DAC.GetString(row["電子郵件"]);
|
||||
string 訓練名稱 = DAC.GetString(row["訓練名稱"]);
|
||||
DateTime 訓練日期 = DAC.GetDateTime(row["訓練日期"]);
|
||||
DateTime 訓練日期迄 = DAC.GetDateTime(row["訓練日期迄"]);
|
||||
int 訓練課程編號 = DAC.GetInt32(row["訓練課程編號"]);
|
||||
|
||||
發送郵件 發送郵件 = new 發送郵件();
|
||||
發送郵件.發送滿意度催填郵件(學員姓名, 電子郵件, 訓練名稱, 訓練日期, 訓練日期迄, 手機版網址);
|
||||
|
||||
DbCommand cmdUpd = conn.CreateCommand();
|
||||
cmdUpd.CommandText =
|
||||
"update 課程報名 set 滿意度催填狀態 = 'Y'" +
|
||||
" where 訓練課程編號 = @訓練課程編號 and 學員編號 = @學員編號";
|
||||
cmdUpd.Parameters.Add(new SqlParameter("@訓練課程編號", 訓練課程編號));
|
||||
cmdUpd.Parameters.Add(new SqlParameter("@學員編號", 學員編號));
|
||||
cmdUpd.ExecuteNonQuery();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,255 @@
|
||||
using NPOI.SS.Formula.Functions;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Diagnostics;
|
||||
using System.Web;
|
||||
using System.Web.UI.WebControls;
|
||||
using WebLib;
|
||||
|
||||
namespace Education
|
||||
{
|
||||
public class PublicVariable : WebLib.PublicVariable
|
||||
{
|
||||
private static Random r = new Random();
|
||||
|
||||
// 常用變數
|
||||
public static string[] 換行分隔 = { "\r\n" };
|
||||
|
||||
#region SESSION 變數名稱
|
||||
public const string CompanyId = "CompanyId";
|
||||
public const string EmployeeId = "EmployeeId";
|
||||
public const string EmployeeName = "EmployeeName";
|
||||
public const string EmployeeFunction = "EmployeeFunction";
|
||||
public const string CurrentPlace = "CurrentPlace";
|
||||
public const string CurrentPlaceName = "CurrentPlaceName";
|
||||
public const string UserGroups = "UserGroups";
|
||||
public const string EventPicturePath = "~/Upload/Event/";
|
||||
public const string BulletinAttachPath = "~/Upload/Attach/";
|
||||
public const string IsManager = "IsManager";
|
||||
public const string IsWorker = "IsWorker";
|
||||
public const string IsBackend = "IsBackend";
|
||||
#endregion
|
||||
|
||||
#region 檔案上傳/圖檔上傳路徑
|
||||
public const string 講師照片路徑 = "~/PhotoUpload/Teacher/";
|
||||
public const string 場地照片路徑 = "~/PhotoUpload/Place/";
|
||||
public const string 課程剪影路徑 = "~/PhotoUpload/Class/";
|
||||
public const string 證照上傳路徑 = "~/DocUpload/Certificate/";
|
||||
public const string 溝通記錄上傳路徑 = "~/DocUpload/Communication/";
|
||||
#endregion
|
||||
|
||||
#region 系統設定變數,由 Global.asax 讀取 web.config 中的設定
|
||||
|
||||
/// <summary>
|
||||
/// 系統名稱
|
||||
/// </summary>
|
||||
public static string SystemName = "Education";
|
||||
|
||||
/// <summary>
|
||||
/// 未登入時開放某些功能
|
||||
/// </summary>
|
||||
public static bool NoLoginFunction = false;
|
||||
|
||||
/// <summary>
|
||||
/// 是否為偵錯模式,會將系統錯誤訊息顯示在網頁上
|
||||
/// </summary>
|
||||
public static bool DEBUG = true;
|
||||
|
||||
/// <summary>
|
||||
/// 管理員群組
|
||||
/// </summary>
|
||||
public static string ManagerGroup = "'TR01'";
|
||||
|
||||
/// <summary>
|
||||
/// 承辦人群組
|
||||
/// </summary>
|
||||
public static string WorkerGroup = "'TR02'";
|
||||
|
||||
/// <summary>
|
||||
/// 總管理處ID
|
||||
/// </summary>
|
||||
public static int 總管理處ID = 2;
|
||||
|
||||
/// <summary>
|
||||
/// 人資部ID
|
||||
/// </summary>
|
||||
public static int 人資部ID = 56;
|
||||
|
||||
/// <summary>
|
||||
/// 財務部ID
|
||||
/// </summary>
|
||||
public static int 財務部ID = 60;
|
||||
|
||||
/// <summary>
|
||||
/// 是否使用 SSL 登入發郵件
|
||||
/// </summary>
|
||||
public static bool SendMailBySSL = false;
|
||||
|
||||
/// <summary>
|
||||
/// 郵件發送主機
|
||||
/// </summary>
|
||||
public static string SendMailHost = "";
|
||||
|
||||
/// <summary>
|
||||
/// 郵件發送通訊埠,不使用 SSL 的通常是 25,使用 SSL 的通常是 465
|
||||
/// </summary>
|
||||
public static int SendMailPort = 25;
|
||||
|
||||
/// <summary>
|
||||
/// 郵件發送帳號
|
||||
/// </summary>
|
||||
public static string SendMailUserName = "";
|
||||
|
||||
/// <summary>
|
||||
/// 郵件發送密碼
|
||||
/// </summary>
|
||||
public static string SendMailPassword = "";
|
||||
|
||||
#region 滿意度調查催填設定
|
||||
public const string SurveyReminderDeadlineDaysKey = "SurveyReminderDeadlineDays";
|
||||
public const string SurveyReminderExcludeEmployeesKey = "SurveyReminderExcludeEmployees";
|
||||
public const string SurveyReminderMinCourseDateKey = "SurveyReminderMinCourseDate";
|
||||
public const string SiteBaseUrlKey = "SiteBaseUrl";
|
||||
|
||||
/// <summary>
|
||||
/// 上課後幾天內要填寫滿意度調查
|
||||
/// </summary>
|
||||
public static int SurveyReminderDeadlineDays = 10;
|
||||
|
||||
/// <summary>
|
||||
/// 排除催填的員工編號(逗號分隔)
|
||||
/// </summary>
|
||||
public static string SurveyReminderExcludeEmployees = "00002,00003";
|
||||
|
||||
/// <summary>
|
||||
/// 只催填此日期之後的課程
|
||||
/// </summary>
|
||||
public static DateTime SurveyReminderMinCourseDate = new DateTime(2026, 7, 1);
|
||||
|
||||
/// <summary>
|
||||
/// 站台基礎 URL(如 http://hostname:port)
|
||||
/// </summary>
|
||||
public static string SiteBaseUrl = "";
|
||||
#endregion
|
||||
|
||||
#endregion
|
||||
|
||||
public static string SystemVersion
|
||||
{
|
||||
get
|
||||
{
|
||||
System.Reflection.Assembly assembly = System.Reflection.Assembly.GetExecutingAssembly();
|
||||
FileVersionInfo fvi = FileVersionInfo.GetVersionInfo(assembly.Location);
|
||||
return fvi.FileVersion;
|
||||
}
|
||||
}
|
||||
|
||||
private static DateTime? _領據關帳年月UpdateTime = null;
|
||||
private static string _領據關帳年月 = string.Empty;
|
||||
public static string 領據關帳年月
|
||||
{
|
||||
get
|
||||
{
|
||||
if (string.IsNullOrEmpty(_領據關帳年月) || !_領據關帳年月UpdateTime.HasValue || _領據關帳年月UpdateTime < DateTime.Now.AddMinutes(-10))
|
||||
{
|
||||
using (var conn = DAC.NewConnection())
|
||||
{
|
||||
var daoBWEX = new DAC_BWEX(conn);
|
||||
_領據關帳年月 = daoBWEX.Read領據關帳年月;
|
||||
_領據關帳年月UpdateTime = DateTime.Now;
|
||||
}
|
||||
}
|
||||
return _領據關帳年月;
|
||||
}
|
||||
set
|
||||
{
|
||||
_領據關帳年月 = value;
|
||||
_領據關帳年月UpdateTime = DateTime.Now;
|
||||
using (var conn = DAC.NewConnection())
|
||||
{
|
||||
new DAC_BWEX(conn).WriteSetting("領據關帳年月", 1, value);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static decimal? _領據執行業務所得課稅門檻 = null;
|
||||
public static decimal 領據執行業務所得課稅門檻
|
||||
{
|
||||
get
|
||||
{
|
||||
if (!_領據執行業務所得課稅門檻.HasValue)
|
||||
{
|
||||
using (var conn = DAC.NewConnection())
|
||||
{
|
||||
_領據執行業務所得課稅門檻 = new DAC_BRTE(conn).領據執行業務所得課稅門檻;
|
||||
}
|
||||
}
|
||||
return _領據執行業務所得課稅門檻.Value;
|
||||
}
|
||||
}
|
||||
|
||||
private static decimal? _領據薪資課稅門檻 = null;
|
||||
public static decimal 領據薪資課稅門檻
|
||||
{
|
||||
get
|
||||
{
|
||||
if (!_領據薪資課稅門檻.HasValue)
|
||||
{
|
||||
using (var conn = DAC.NewConnection())
|
||||
{
|
||||
_領據薪資課稅門檻 = new DAC_BRTE(conn).領據薪資課稅門檻;
|
||||
}
|
||||
}
|
||||
return _領據薪資課稅門檻.Value;
|
||||
}
|
||||
}
|
||||
|
||||
private static decimal? _領據基本工資 = null;
|
||||
public static decimal 領據基本工資
|
||||
{
|
||||
get
|
||||
{
|
||||
if (!_領據基本工資.HasValue)
|
||||
{
|
||||
using (var conn = DAC.NewConnection())
|
||||
{
|
||||
_領據基本工資 = new DAC_BRTE(conn).領據基本工資;
|
||||
}
|
||||
}
|
||||
return _領據基本工資.Value;
|
||||
}
|
||||
}
|
||||
|
||||
private static decimal? _領據執行業務所得稅率 = null;
|
||||
public static decimal 領據執行業務所得稅率
|
||||
{
|
||||
get
|
||||
{
|
||||
if (!_領據執行業務所得稅率.HasValue)
|
||||
{
|
||||
using (var conn = DAC.NewConnection())
|
||||
{
|
||||
_領據執行業務所得稅率 = new DAC_BRTE(conn).領據執行業務所得稅率;
|
||||
}
|
||||
}
|
||||
return _領據執行業務所得稅率.Value;
|
||||
}
|
||||
}
|
||||
|
||||
private static decimal? _領據薪資稅率 = null;
|
||||
public static decimal 領據薪資稅率
|
||||
{
|
||||
get
|
||||
{
|
||||
if (!_領據薪資稅率.HasValue)
|
||||
{
|
||||
using (var conn = DAC.NewConnection())
|
||||
{
|
||||
_領據薪資稅率 = new DAC_BRTE(conn).領據薪資稅率;
|
||||
}
|
||||
}
|
||||
return _領據薪資稅率.Value;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,220 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Data;
|
||||
using System.Data.Common;
|
||||
using System.Text;
|
||||
using WebLib;
|
||||
|
||||
namespace Education
|
||||
{
|
||||
/// <summary>
|
||||
/// 取得權限設定
|
||||
/// </summary>
|
||||
public class MWEB: DAC
|
||||
{
|
||||
public MWEB()
|
||||
{
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 檢查目前登入的員工是否有某程式的權限
|
||||
/// </summary>
|
||||
/// <param name="programId">程式編號</param>
|
||||
/// <param name="rightName">權限名稱</param>
|
||||
/// <param name="employeeId">員工編號</param>
|
||||
/// <returns></returns>
|
||||
public bool CheckRight(string programId, WRightName rightName, string employeeId)
|
||||
{
|
||||
if (programId == null)
|
||||
programId = "NO PROGRAM ID";
|
||||
if (employeeId == null)
|
||||
employeeId = "NOBODY";
|
||||
|
||||
// 取得員工權限
|
||||
string right1 = BWCPE_GetRight(programId, employeeId, rightName);
|
||||
|
||||
// 取得這個員工隸屬的群組
|
||||
string[] bpglps = BWEH_GetBpglpListByBpeno(employeeId);
|
||||
|
||||
// 取得各群組權限
|
||||
string[] right2 = new string[bpglps.Length];
|
||||
for (int i = 0; i < right2.Length; i++)
|
||||
{
|
||||
right2[i] = BWCPG_GetRight(programId, bpglps[i], rightName);
|
||||
}
|
||||
|
||||
// 綜合判斷權限
|
||||
string right = "";
|
||||
|
||||
if (right1 != "")
|
||||
right = right1;
|
||||
|
||||
if (right != "Y")
|
||||
for (int i = 0; i < right2.Length; i++)
|
||||
{
|
||||
if (right2[i] != "")
|
||||
{
|
||||
if (right != "Y" && right2[i] == "Y")
|
||||
right = "Y";
|
||||
else if (right != "Y" && right2[i] == "N")
|
||||
right = "N";
|
||||
}
|
||||
}
|
||||
return right == "Y";
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 取員工權限
|
||||
/// </summary>
|
||||
/// <param name="rightId">權限編號</param>
|
||||
/// <param name="employId">員工編號</param>
|
||||
/// <param name="functionName">功能名稱</param>
|
||||
/// <returns></returns>
|
||||
private string BWCPE_GetRight(string rightId, string employId, WRightName functionName)
|
||||
{
|
||||
string funcName = "";
|
||||
switch (functionName)
|
||||
{
|
||||
case WRightName.Execute:
|
||||
funcName = "BPRT1";
|
||||
break;
|
||||
case WRightName.Insert:
|
||||
funcName = "BPRTI";
|
||||
break;
|
||||
case WRightName.Update:
|
||||
funcName = "BPRTM";
|
||||
break;
|
||||
case WRightName.Delete:
|
||||
funcName = "BPRTD";
|
||||
break;
|
||||
case WRightName.Search:
|
||||
funcName = "BPRTF";
|
||||
break;
|
||||
case WRightName.Print:
|
||||
funcName = "BPRTP";
|
||||
break;
|
||||
}
|
||||
|
||||
DbCommand cmd = NewCommand();
|
||||
cmd.CommandText = @"SELECT BPRT1, BPRTI, BPRTM, BPRTD, BPRTF, BPRTP FROM BWCPE WHERE BPPRG=@BPPRG AND BPENO=@BPENO";
|
||||
|
||||
AddParam(cmd, "BPPRG", rightId);
|
||||
AddParam(cmd, "BPENO", employId);
|
||||
|
||||
DataTable data = Select(cmd);
|
||||
if (data.Rows.Count != 0)
|
||||
{
|
||||
return data.Rows[0][funcName].ToString();
|
||||
}
|
||||
return "";
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 取員工所屬群組
|
||||
/// </summary>
|
||||
/// <param name="employeeId"></param>
|
||||
/// <returns></returns>
|
||||
private string[] BWEH_GetBpglpListByBpeno(string employeeId)
|
||||
{
|
||||
DbCommand cmd = NewCommand();
|
||||
cmd.CommandText = @"SELECT E.BPGLP AS BPGLP
|
||||
FROM BWEG E, BWEH G
|
||||
WHERE E.BPGLP=G.BPGLP AND G.BPENO=@BPENO
|
||||
ORDER BY E.BPGLP ";
|
||||
AddParam(cmd, "BPENO", employeeId);
|
||||
|
||||
DataTable inGroup = Select(cmd);
|
||||
if (inGroup.Rows.Count == 0)
|
||||
return new string[0];
|
||||
else
|
||||
{
|
||||
string[] result = new string[inGroup.Rows.Count];
|
||||
for (int i = 0; i < inGroup.Rows.Count; i++)
|
||||
{
|
||||
result[i] = inGroup.Rows[i][0].ToString();
|
||||
}
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 取群組權限
|
||||
/// </summary>
|
||||
/// <param name="rightId">權限編號</param>
|
||||
/// <param name="groupId">群組編號</param>
|
||||
/// <param name="functionName">功能名稱</param>
|
||||
/// <returns></returns>
|
||||
/// <exception cref="NotImplementedException"></exception>
|
||||
private string BWCPG_GetRight(string rightId, string groupId, WRightName functionName)
|
||||
{
|
||||
string funcName = "";
|
||||
switch (functionName)
|
||||
{
|
||||
case WRightName.Execute:
|
||||
funcName = "BPRT1";
|
||||
break;
|
||||
case WRightName.Insert:
|
||||
funcName = "BPRTI";
|
||||
break;
|
||||
case WRightName.Update:
|
||||
funcName = "BPRTM";
|
||||
break;
|
||||
case WRightName.Delete:
|
||||
funcName = "BPRTD";
|
||||
break;
|
||||
case WRightName.Search:
|
||||
funcName = "BPRTF";
|
||||
break;
|
||||
case WRightName.Print:
|
||||
funcName = "BPRTP";
|
||||
break;
|
||||
}
|
||||
|
||||
DbCommand cmd = NewCommand();
|
||||
cmd.CommandText = @"SELECT BPRT1, BPRTI, BPRTM, BPRTD, BPRTF, BPRTP FROM BWCPG WHERE BPPRG=@BPPRG AND BPGLP=@BPGLP";
|
||||
|
||||
AddParam(cmd, "BPPRG", rightId);
|
||||
AddParam(cmd, "BPGLP", groupId);
|
||||
|
||||
DataTable data = Select(cmd);
|
||||
if (data.Rows.Count != 0)
|
||||
{
|
||||
return data.Rows[0][funcName].ToString();
|
||||
}
|
||||
return "";
|
||||
}
|
||||
}
|
||||
|
||||
public enum WRightName
|
||||
{
|
||||
/// <summary>
|
||||
/// 主檔
|
||||
/// </summary>
|
||||
Execute,
|
||||
/// <summary>
|
||||
/// 新增
|
||||
/// </summary>
|
||||
Insert,
|
||||
/// <summary>
|
||||
/// 更正
|
||||
/// </summary>
|
||||
Update,
|
||||
/// <summary>
|
||||
/// 刪除
|
||||
/// </summary>
|
||||
Delete,
|
||||
/// <summary>
|
||||
/// 查詢
|
||||
/// </summary>
|
||||
Search,
|
||||
/// <summary>
|
||||
/// 印表
|
||||
/// </summary>
|
||||
Print
|
||||
}
|
||||
|
||||
public class ProgramID
|
||||
{
|
||||
public const string 匯出基本資料 = "TR_EXPORT";
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,173 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
using System.Collections;
|
||||
using System.Timers;
|
||||
using System.IO;
|
||||
|
||||
namespace Wellan.Service
|
||||
{
|
||||
/// <summary>
|
||||
/// 檔案定時清除服務
|
||||
/// </summary>
|
||||
public class WDeleteFileService
|
||||
{
|
||||
private WDeleteFileService()
|
||||
{
|
||||
_deleteFilePatterns = new List<string>();
|
||||
_timer = new Timer();
|
||||
_timer.Enabled = false;
|
||||
_timer.Elapsed += new ElapsedEventHandler(DoDeleteFile);
|
||||
}
|
||||
|
||||
public static WDeleteFileService GetInstance()
|
||||
{
|
||||
if (_instance == null)
|
||||
_instance = new WDeleteFileService();
|
||||
return _instance;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 檔案刪除間隔時間,單位為秒。預設值為 600 秒
|
||||
/// </summary>
|
||||
public int Interval
|
||||
{
|
||||
get
|
||||
{
|
||||
return _interval;
|
||||
}
|
||||
set
|
||||
{
|
||||
_interval = value;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 要刪除多久之前的檔案,單位為秒。預設值為 600 秒
|
||||
/// </summary>
|
||||
public int FileAgeToDelete
|
||||
{
|
||||
get
|
||||
{
|
||||
return Convert.ToInt32(_fileAge.TotalSeconds);
|
||||
}
|
||||
set
|
||||
{
|
||||
_fileAge = new TimeSpan(value * TimeSpan.TicksPerSecond);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 設定或取得檔案定時清除服務是否啟動
|
||||
/// </summary>
|
||||
public bool Enabled
|
||||
{
|
||||
get
|
||||
{
|
||||
return _enabled;
|
||||
}
|
||||
set
|
||||
{
|
||||
if (value)
|
||||
{
|
||||
if (_enabled)
|
||||
return;
|
||||
|
||||
_timer.Interval = _interval * 1000;
|
||||
_timer.AutoReset = true;
|
||||
_timer.Enabled = true;
|
||||
_enabled = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (!_enabled)
|
||||
return;
|
||||
|
||||
_enabled = false;
|
||||
_timer.Enabled = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// <para>欲清除的檔案路徑及檔案名稱,檔案名稱可以使用萬用字元</para>
|
||||
/// <para>需要多個檔案路徑及檔案名稱時,請將所需的檔案路徑及檔案名稱一一加入</para>
|
||||
/// <para>例如:c:\temp\*.mdb 表示要清除 c:\temp 目錄下的 *.mdb</para>
|
||||
/// </summary>
|
||||
public List<string> DeletePatterns
|
||||
{
|
||||
get
|
||||
{
|
||||
return _deleteFilePatterns;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 實際執行刪除的動作
|
||||
/// </summary>
|
||||
private void DoDeleteFile(object sender, ElapsedEventArgs e)
|
||||
{
|
||||
if (!_enabled)
|
||||
{
|
||||
_timer.Enabled = false;
|
||||
return;
|
||||
}
|
||||
|
||||
_timer.Enabled = false;
|
||||
try
|
||||
{
|
||||
foreach (string pattern in _deleteFilePatterns)
|
||||
{
|
||||
string namepart = Path.GetFileName(pattern);
|
||||
string pathPart = pattern.Substring(0, pattern.Length - namepart.Length);
|
||||
try
|
||||
{
|
||||
DirectoryInfo dirInfo = new DirectoryInfo(pathPart);
|
||||
FileInfo[] matchFiles = dirInfo.GetFiles(namepart);
|
||||
foreach (FileInfo file in matchFiles)
|
||||
{
|
||||
try
|
||||
{
|
||||
if (DateTime.Now - file.LastWriteTime > _fileAge)
|
||||
file.Delete();
|
||||
}
|
||||
catch
|
||||
{
|
||||
// do nothing
|
||||
}
|
||||
}
|
||||
}
|
||||
catch
|
||||
{
|
||||
// do nothing
|
||||
}
|
||||
}
|
||||
}
|
||||
finally
|
||||
{
|
||||
_timer.Enabled = true;
|
||||
}
|
||||
}
|
||||
|
||||
private static WDeleteFileService _instance = null;
|
||||
private List<string> _deleteFilePatterns = null;
|
||||
private Timer _timer = null;
|
||||
private int _interval = 600;
|
||||
private TimeSpan _fileAge = new TimeSpan(TimeSpan.TicksPerSecond * 600);
|
||||
private bool _enabled = false;
|
||||
|
||||
#region UNIT TEST
|
||||
public static void Main()
|
||||
{
|
||||
WDeleteFileService delSrv = WDeleteFileService.GetInstance();
|
||||
delSrv.DeletePatterns.Add(@"c:\temp\*.*");
|
||||
delSrv.Interval = 5;
|
||||
delSrv.FileAgeToDelete = 1;
|
||||
delSrv.Enabled = true;
|
||||
Console.WriteLine("Press ENTER to end program");
|
||||
Console.ReadLine();
|
||||
delSrv.Enabled = false;
|
||||
}
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,129 @@
|
||||
using System;
|
||||
using System.Data;
|
||||
using System.Configuration;
|
||||
using System.Net;
|
||||
using System.Net.Mail;
|
||||
using System.Collections.Generic;
|
||||
using System.Timers;
|
||||
|
||||
/// <summary>
|
||||
/// 郵件傳送服務
|
||||
/// </summary>
|
||||
public class WMailSender
|
||||
{
|
||||
private static WMailSender _instance = null;
|
||||
private Queue<MailMessage> _queue = null;
|
||||
private bool _enabled = false;
|
||||
private int _interval = 30;
|
||||
private Timer _timer = null;
|
||||
private string _host = "";
|
||||
|
||||
private WMailSender()
|
||||
{
|
||||
_queue = new Queue<MailMessage>();
|
||||
|
||||
_timer = new Timer();
|
||||
_timer.Enabled = false;
|
||||
_timer.Elapsed += new ElapsedEventHandler(SendMailLoop);
|
||||
}
|
||||
|
||||
public static WMailSender GetInstance()
|
||||
{
|
||||
if (_instance == null)
|
||||
_instance = new WMailSender();
|
||||
return _instance;
|
||||
}
|
||||
|
||||
public string Host
|
||||
{
|
||||
set
|
||||
{
|
||||
_host = value;
|
||||
}
|
||||
get
|
||||
{
|
||||
return _host;
|
||||
}
|
||||
}
|
||||
|
||||
public void Send(MailMessage message)
|
||||
{
|
||||
_queue.Enqueue(message);
|
||||
}
|
||||
|
||||
private void SendMailLoop(object sender, ElapsedEventArgs e)
|
||||
{
|
||||
if (!_enabled)
|
||||
{
|
||||
_timer.Enabled = false;
|
||||
return;
|
||||
}
|
||||
|
||||
_timer.Enabled = false;
|
||||
|
||||
SmtpClient _client = new SmtpClient();
|
||||
//_client.DeliveryMethod = SmtpDeliveryMethod.Network;
|
||||
|
||||
try
|
||||
{
|
||||
while (_queue.Count > 0)
|
||||
{
|
||||
MailMessage message = _queue.Dequeue();
|
||||
try
|
||||
{
|
||||
_client.Send(message);
|
||||
}
|
||||
catch
|
||||
{
|
||||
// 如果傳送失敗,需重傳
|
||||
_queue.Enqueue(message);
|
||||
}
|
||||
}
|
||||
}
|
||||
finally
|
||||
{
|
||||
_timer.Enabled = true;
|
||||
}
|
||||
}
|
||||
|
||||
public int Interval
|
||||
{
|
||||
get
|
||||
{
|
||||
return _interval;
|
||||
}
|
||||
set
|
||||
{
|
||||
_interval = value;
|
||||
}
|
||||
}
|
||||
|
||||
public bool Enabled
|
||||
{
|
||||
get
|
||||
{
|
||||
return _enabled;
|
||||
}
|
||||
set
|
||||
{
|
||||
if (value)
|
||||
{
|
||||
if (_enabled)
|
||||
return;
|
||||
|
||||
_timer.Interval = _interval * 1000;
|
||||
_timer.AutoReset = true;
|
||||
_timer.Enabled = true;
|
||||
_enabled = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (!_enabled)
|
||||
return;
|
||||
|
||||
_enabled = false;
|
||||
_timer.Enabled = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,187 @@
|
||||
<?xml version="1.0" encoding="utf-8" ?>
|
||||
<LookupConfig xmlns="http://www.maolaoda.com.tw/LookupConfig.xsd">
|
||||
<Appearence dataTextColor="#000000"
|
||||
dataBackgroundColor="#FFFFFF"
|
||||
dataAltBackgroundColor="#CCCCCC"
|
||||
titleTextColor="#FFFFFF"
|
||||
titleBackgroundColor="#2472B2"
|
||||
titleTextSize="12pt"
|
||||
dataTextSize="12pt"/>
|
||||
|
||||
<Lookup name="BDPT"
|
||||
sql="SELECT BDNUM,BDNAM FROM BDPT WHERE :WHERE ORDER BY :ORDER"
|
||||
keyFields="BDNUM,BDMAN"
|
||||
listFields="BDNUM,BDNAM"
|
||||
outputFields="BDNUM,BDNAM"
|
||||
listTitles="部門編號,部門名稱"
|
||||
listTitleMids=""
|
||||
listWidths="80,150"
|
||||
maxRecord="20"
|
||||
notShowOnlyOneRecord="true"/>
|
||||
|
||||
<Lookup name="BPSN"
|
||||
sql="SELECT BPENO, BPNME, BPEML FROM BPSNView WHERE :WHERE ORDER BY :ORDER"
|
||||
keyFields="BPENO,BPNME,BPEML"
|
||||
listFields="BPENO,BPNME,BPEML"
|
||||
outputFields="BPENO,BPNME,BPEML"
|
||||
listTitles="員工編號,員工姓名,電子郵件"
|
||||
listTitleMids=""
|
||||
listWidths="80,150,200"
|
||||
maxRecord="20"
|
||||
notShowOnlyOneRecord="true"/>
|
||||
|
||||
<Lookup name="BPSN1"
|
||||
sql="SELECT BPENO, BPNME FROM BPSNView WHERE :WHERE AND (BPEDY IS NULL OR BPEDY >= CONVERT(DATETIME, CONVERT(VARCHAR, DATEADD(Month, -1, DATEADD(Day, -DAY(GETDATE()) + 1, GETDATE())), 112), 112)) ORDER BY :ORDER"
|
||||
keyFields="BPENO,BPNME"
|
||||
listFields="BPENO,BPNME"
|
||||
outputFields="BPENO,BPNME"
|
||||
listTitles="員工編號,員工姓名"
|
||||
listTitleMids=""
|
||||
listWidths="80,150"
|
||||
maxRecord="20"
|
||||
notShowOnlyOneRecord="true"/>
|
||||
|
||||
<Lookup name="BPSN2"
|
||||
sql="SELECT BPENO, BPNME, BPEML FROM BPSNView WHERE :WHERE AND BPEDY IS NULL AND BPDPT != 'F01' ORDER BY :ORDER"
|
||||
keyFields="BPENO,BPNME,BPEML"
|
||||
listFields="BPENO,BPNME,BPEML"
|
||||
outputFields="BPENO,BPNME,BPEML"
|
||||
listTitles="員工編號,員工姓名,電子郵件"
|
||||
listTitleMids=""
|
||||
listWidths="80,150,200"
|
||||
maxRecord="20"
|
||||
notShowOnlyOneRecord="true"/>
|
||||
|
||||
<Lookup name="BPSNEML"
|
||||
sql="SELECT BPENO, BPNME, BPEML FROM BPSNView WHERE :WHERE AND (BPEDY IS NULL OR BPEDY >= CONVERT(DATETIME, CONVERT(VARCHAR, DATEADD(Month, -1, DATEADD(Day, -DAY(GETDATE()) + 1, GETDATE())), 112), 112)) ORDER BY :ORDER"
|
||||
keyFields="BPNME,BPEML"
|
||||
listFields="BPNME,BPEML"
|
||||
outputFields="BPNME,BPEML"
|
||||
listTitles="員工姓名,電子郵件"
|
||||
listTitleMids=""
|
||||
listWidths="100,180"
|
||||
maxRecord="20"
|
||||
notShowOnlyOneRecord="true"/>
|
||||
|
||||
<Lookup name="BCLS"
|
||||
sql="SELECT BSCLS,BSSCR FROM BCLS WHERE :WHERE ORDER BY :ORDER"
|
||||
keyFields="BSCLS,BSSCR"
|
||||
listFields="BSCLS,BSSCR"
|
||||
outputFields="BSCLS,BSSCR"
|
||||
listTitles="類別編號,類別內容"
|
||||
listTitleMids=""
|
||||
listWidths="80,300"
|
||||
maxRecord="20"
|
||||
notShowOnlyOneRecord="true"/>
|
||||
|
||||
<Lookup name="BCLSEDIT"
|
||||
sql="SELECT '' BSCLS, '' BSSCR UNION SELECT BSCLS,BSSCR FROM BCLS WHERE :WHERE ORDER BY :ORDER"
|
||||
keyFields="BSCLS,BSSCR"
|
||||
listFields="BSCLS,BSSCR"
|
||||
outputFields="BSCLS,BSSCR"
|
||||
listTitles="類別編號,類別內容"
|
||||
listTitleMids=""
|
||||
listWidths="80,300"
|
||||
maxRecord="20"
|
||||
notShowOnlyOneRecord="true"/>
|
||||
|
||||
<Lookup name="BPNO"
|
||||
sql="SELECT BPPNO,BPNAM FROM BPNO WHERE :WHERE ORDER BY :ORDER"
|
||||
keyFields="BPPNO,BPNAM"
|
||||
listFields="BPPNO,BPNAM"
|
||||
outputFields="BPPNO,BPNAM"
|
||||
listTitles="專案編號,專案名稱"
|
||||
listTitleMids=""
|
||||
listWidths="80,150"
|
||||
maxRecord="20"
|
||||
notShowOnlyOneRecord="true"/>
|
||||
|
||||
<Lookup name="BCUS"
|
||||
sql="SELECT BCNUM,BCNAM FROM BCUS WHERE :WHERE ORDER BY :ORDER"
|
||||
keyFields="BCNUM,BCNAM"
|
||||
listFields="BCNUM,BCNAM"
|
||||
outputFields="BCNUM,BCNAM"
|
||||
listTitles="客戶編號,客戶名稱"
|
||||
listTitleMids=""
|
||||
listWidths="80,300"
|
||||
maxRecord="20"
|
||||
notShowOnlyOneRecord="true"/>
|
||||
|
||||
<Lookup name="BPRJ"
|
||||
sql="SELECT BPPNM, BPPME FROM BPRJ WHERE :WHERE ORDER BY :ORDER"
|
||||
keyFields="BPPNM,BPPME"
|
||||
listFields="BPPNM,BPPME"
|
||||
outputFields="BPPNM,BPPME"
|
||||
listTitles="專案編號,專案名稱"
|
||||
listTitleMids=""
|
||||
listWidths="80,300"
|
||||
maxRecord="20"
|
||||
notShowOnlyOneRecord="true"/>
|
||||
|
||||
<Lookup name="BPAA"
|
||||
sql="SELECT BPPYN, BPPYM FROM BPAA WHERE :WHERE ORDER BY :ORDER"
|
||||
keyFields="BPPYN,BPPYM"
|
||||
listFields="BPPYN,BPPYM"
|
||||
outputFields="BPPYN,BPPYM"
|
||||
listTitles="專案年度編號,專案年度名稱"
|
||||
listTitleMids=""
|
||||
listWidths="120,300"
|
||||
maxRecord="20"
|
||||
notShowOnlyOneRecord="true"/>
|
||||
|
||||
<Lookup name="BRML"
|
||||
sql="SELECT BCNUM, BCNAM FROM BRML WHERE :WHERE ORDER BY :ORDER"
|
||||
keyFields="BCNUM,BCNAM"
|
||||
listFields="BCNUM,BCNAM"
|
||||
outputFields="BCNUM,BCNAM"
|
||||
listTitles="銀行代號,銀行名稱"
|
||||
listTitleMids=""
|
||||
listWidths="120,300"
|
||||
maxRecord="20"
|
||||
notShowOnlyOneRecord="true"/>
|
||||
|
||||
<Lookup name="BFRM"
|
||||
sql="SELECT BFNUM, BFNAM, BFFRM FROM BFRM WHERE :WHERE ORDER BY :ORDER"
|
||||
keyFields="BFNUM,BFNAM"
|
||||
listFields="BFNUM,BFNAM"
|
||||
outputFields="BFNUM,BFNAM,BFFRM"
|
||||
listTitles="公式代號,公式名稱"
|
||||
listTitleMids=""
|
||||
listWidths="120,300"
|
||||
maxRecord="20"
|
||||
notShowOnlyOneRecord="true"/>
|
||||
|
||||
<Lookup name="BPAP"
|
||||
sql="SELECT BPENO, BPNME FROM BPAP WHERE :WHERE ORDER BY :ORDER"
|
||||
keyFields="BPENO,BPNME"
|
||||
listFields="BPENO,BPNME"
|
||||
outputFields="BPENO,BPNME"
|
||||
listTitles="人員編號,人員姓名"
|
||||
listTitleMids=""
|
||||
listWidths="80,150"
|
||||
maxRecord="20"
|
||||
notShowOnlyOneRecord="true"/>
|
||||
|
||||
<Lookup name="組織類別"
|
||||
sql="SELECT 組織類別ID,組織類別名稱 FROM 組織類別 WHERE :WHERE ORDER BY :ORDER"
|
||||
keyFields="組織類別ID,組織類別名稱"
|
||||
listFields="組織類別ID,組織類別名稱"
|
||||
outputFields="組織類別ID,組織類別名稱"
|
||||
listTitles="組織類別ID,組織類別名稱"
|
||||
listTitleMids=""
|
||||
listWidths="80,150"
|
||||
maxRecord="20"
|
||||
notShowOnlyOneRecord="true"/>
|
||||
|
||||
<Lookup name="職務"
|
||||
sql="SELECT 職務ID, 職務名稱 FROM 職務 WHERE :WHERE ORDER BY :ORDER"
|
||||
keyFields="職務ID,職務名稱"
|
||||
listFields="職務ID,職務名稱"
|
||||
outputFields="職務ID,職務名稱"
|
||||
listTitles="職務ID,職務名稱"
|
||||
listTitleMids=""
|
||||
listWidths="80,150"
|
||||
maxRecord="20"
|
||||
notShowOnlyOneRecord="true"/>
|
||||
</LookupConfig>
|
||||
|
||||
@@ -0,0 +1,36 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<xs:schema id="LookupConfig" targetNamespace="http://www.maolaoda.com.tw/LookupConfig.xsd"
|
||||
elementFormDefault="qualified" xmlns="http://www.maolaoda.com.tw/LookupConfig.xsd"
|
||||
xmlns:mstns="http://www.maolaoda.com.tw/LookupConfig.xsd"
|
||||
xmlns:xs="http://www.w3.org/2001/XMLSchema"
|
||||
xmlns:msprop="urn:schemas-microsoft-com:xml-msprop">
|
||||
<xs:complexType name="Lookup">
|
||||
<xs:attribute name="name" type="xs:string" use="required"/>
|
||||
<xs:attribute name="sql" type="xs:string" use="required"/>
|
||||
<xs:attribute name="keyFields" type="xs:string" use="required"/>
|
||||
<xs:attribute name="listFields" type="xs:string" use="required"/>
|
||||
<xs:attribute name="outputFields" type="xs:string" use="required"/>
|
||||
<xs:attribute name="listTitles" type="xs:string" use="required"/>
|
||||
<xs:attribute name="listTitleMids" type="xs:string" use="optional"/>
|
||||
<xs:attribute name="listWidths" type="xs:string" use="optional"/>
|
||||
<xs:attribute name="maxRecord" type="xs:int" use="required"/>
|
||||
<xs:attribute name="notShowOnlyOneRecord" type="xs:boolean" use="optional"/>
|
||||
</xs:complexType>
|
||||
<xs:complexType name="Appearence">
|
||||
<xs:attribute name="titleBackgroundColor" type="xs:string"/>
|
||||
<xs:attribute name="dataBackgroundColor" type="xs:string"/>
|
||||
<xs:attribute name="dataTextColor" type="xs:string"/>
|
||||
<xs:attribute name="dataAltBackgroundColor" type="xs:string"/>
|
||||
<xs:attribute name="titleTextColor" type="xs:string"/>
|
||||
<xs:attribute name="titleTextSize" type="xs:string"/>
|
||||
<xs:attribute name="dataTextSize" type="xs:string"/>
|
||||
</xs:complexType>
|
||||
<xs:element name="LookupConfig">
|
||||
<xs:complexType>
|
||||
<xs:sequence>
|
||||
<xs:element name="Appearence" maxOccurs="1" minOccurs="0" type="Appearence"/>
|
||||
<xs:element name="Lookup" type="Lookup" maxOccurs="unbounded" minOccurs="0"/>
|
||||
</xs:sequence>
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
</xs:schema>
|
||||
@@ -0,0 +1,10 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!--This file is auto-generated by the XML Schema Designer. It holds layout information for components on the designer surface.-->
|
||||
<XSDDesignerLayout Style="TopDown" layoutVersion="2" viewPortLeft="-659" viewPortTop="0" zoom="100">
|
||||
<Lookup_XmlComplexType left="0" top="715" width="10054" height="6614" selected="0" zOrder="1" index="0" expanded="1" />
|
||||
<LookupConfig_XmlElement left="13785" top="848" width="7196" height="3280" selected="0" zOrder="2" index="1" expanded="1">
|
||||
<Appearence_XmlElement left="11774" top="4636" width="5292" height="3281" selected="0" zOrder="4" index="0" expanded="0" />
|
||||
<Lookup_XmlElement left="17700" top="4636" width="5292" height="3281" selected="0" zOrder="7" index="1" expanded="0" />
|
||||
</LookupConfig_XmlElement>
|
||||
<Appearence_XmlComplexType left="-26" top="8203" width="8890" height="6138" selected="0" zOrder="10" index="2" expanded="1" />
|
||||
</XSDDesignerLayout>
|
||||
@@ -0,0 +1,36 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<xs:schema id="LookupConfig" targetNamespace="http://www.maolaoda.com.tw/LookupConfig.xsd"
|
||||
elementFormDefault="qualified" xmlns="http://www.maolaoda.com.tw/LookupConfig.xsd"
|
||||
xmlns:mstns="http://www.maolaoda.com.tw/LookupConfig.xsd"
|
||||
xmlns:xs="http://www.w3.org/2001/XMLSchema"
|
||||
xmlns:msprop="urn:schemas-microsoft-com:xml-msprop">
|
||||
<xs:complexType name="Lookup">
|
||||
<xs:attribute name="name" type="xs:string" use="required"/>
|
||||
<xs:attribute name="sql" type="xs:string" use="required"/>
|
||||
<xs:attribute name="keyFields" type="xs:string" use="required"/>
|
||||
<xs:attribute name="listFields" type="xs:string" use="required"/>
|
||||
<xs:attribute name="outputFields" type="xs:string" use="required"/>
|
||||
<xs:attribute name="listTitles" type="xs:string" use="required"/>
|
||||
<xs:attribute name="listTitleMids" type="xs:string" use="required"/>
|
||||
<xs:attribute name="listWidths" type="xs:string" use="required"/>
|
||||
<xs:attribute name="maxRecord" type="xs:int" use="required"/>
|
||||
<xs:attribute name="notShowOnlyOneRecord" type="xs:boolean" use="optional"/>
|
||||
</xs:complexType>
|
||||
<xs:complexType name="Appearence">
|
||||
<xs:attribute name="titleBackgroundColor" type="xs:string"/>
|
||||
<xs:attribute name="dataBackgroundColor" type="xs:string"/>
|
||||
<xs:attribute name="dataTextColor" type="xs:string"/>
|
||||
<xs:attribute name="dataAltBackgroundColor" type="xs:string"/>
|
||||
<xs:attribute name="titleTextColor" type="xs:string"/>
|
||||
<xs:attribute name="titleTextSize" type="xs:string"/>
|
||||
<xs:attribute name="dataTextSize" type="xs:string"/>
|
||||
</xs:complexType>
|
||||
<xs:element name="LookupConfig">
|
||||
<xs:complexType>
|
||||
<xs:sequence>
|
||||
<xs:element name="Appearence" maxOccurs="1" minOccurs="0" type="Appearence"/>
|
||||
<xs:element name="Lookup" type="Lookup" maxOccurs="unbounded" minOccurs="0"/>
|
||||
</xs:sequence>
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
</xs:schema>
|
||||
@@ -0,0 +1,33 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Web;
|
||||
using WebLib;
|
||||
|
||||
namespace Education
|
||||
{
|
||||
public class DAC_檔案圖示: NameValueList
|
||||
{
|
||||
public DAC_檔案圖示()
|
||||
{
|
||||
Add("doc.png", "doc");
|
||||
Add("doc.png", "docx");
|
||||
Add("xls.png", "xls");
|
||||
Add("xls.png", "xlsx");
|
||||
Add("txt.png", "txt");
|
||||
Add("exe.png", "exe");
|
||||
Add("gif.png", "gif");
|
||||
Add("html.png", "htm");
|
||||
Add("html.png", "html");
|
||||
Add("jpg.png", "jpg");
|
||||
Add("jpg.png", "jpeg");
|
||||
Add("pdf.png", "pdf");
|
||||
Add("png.png", "png");
|
||||
Add("ppt.png", "ppt");
|
||||
Add("rar.png", "rar");
|
||||
Add("rtf.png", "rtf");
|
||||
Add("swf.png", "swf");
|
||||
Add("zip.png", "zip");
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,79 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Web;
|
||||
using System.Data.Common;
|
||||
using WebLib;
|
||||
|
||||
namespace Education
|
||||
{
|
||||
public class DAC_GetData : DAC
|
||||
{
|
||||
public DAC_GetData()
|
||||
: base()
|
||||
{ }
|
||||
|
||||
public DAC_GetData(DbConnection conn)
|
||||
: base(conn)
|
||||
{ }
|
||||
|
||||
public 場地 取得選定場地(int 課程企劃id)
|
||||
{
|
||||
DAC_場地 Dao場地 = new DAC_場地(conn);
|
||||
DAC_訓練課程企劃 Dao訓練課程企劃 = new DAC_訓練課程企劃(conn);
|
||||
int 場地編號 = Dao訓練課程企劃.Select選定場地(課程企劃id);
|
||||
if (場地編號 > 0)
|
||||
{
|
||||
場地List d = Dao場地.SelectOne(場地編號);
|
||||
if (d.Count > 0)
|
||||
return d[0];
|
||||
}
|
||||
else
|
||||
{
|
||||
string 場地名稱 = Dao訓練課程企劃.Select選定場地名稱(課程企劃id);
|
||||
if (!string.IsNullOrEmpty(場地名稱))
|
||||
{
|
||||
場地 result = new 場地();
|
||||
result.場地名稱 = 場地名稱;
|
||||
return result;
|
||||
}
|
||||
}
|
||||
return new 場地();
|
||||
}
|
||||
|
||||
public 講師 取得選定講師(int 課程企劃id, int 課程序號)
|
||||
{
|
||||
DAC_講師 Dao講師 = new DAC_講師(conn);
|
||||
DAC_訓練課程企劃 Dao訓練課程企劃 = new DAC_訓練課程企劃(conn);
|
||||
int 講師編號 = Dao訓練課程企劃.Select選定講師(課程企劃id, 課程序號);
|
||||
if (講師編號 > 0)
|
||||
{
|
||||
講師List d = Dao講師.SelectOne(講師編號);
|
||||
if (d.Count > 0)
|
||||
return d[0];
|
||||
}
|
||||
else
|
||||
{
|
||||
string 講師姓名 = Dao訓練課程企劃.Select選定講師名稱(課程企劃id, 課程序號);
|
||||
if (!string.IsNullOrEmpty(講師姓名))
|
||||
{
|
||||
講師 result = new 講師();
|
||||
result.姓名 = 講師姓名;
|
||||
return result;
|
||||
}
|
||||
}
|
||||
return new 講師();
|
||||
}
|
||||
|
||||
public 講師 取得選定講師(object 課程企劃id, object 課程序號)
|
||||
{
|
||||
return 取得選定講師(DAC.GetInt32(課程企劃id), DAC.GetInt32(課程序號));
|
||||
}
|
||||
|
||||
public string 取得檢附資料參考(string id)
|
||||
{
|
||||
return new DAC_BCLS().Get類別名稱(DAC_檢附資料參考.BSPAR, id).Replace("\r\n", "<br/>").Replace("\r", "<br/>").Replace("\n", "<br/>");
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,235 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
using Wellan.Common;
|
||||
using System.Data;
|
||||
using System.Data.Common;
|
||||
|
||||
namespace Education
|
||||
{
|
||||
/// <summary>
|
||||
/// 員工權限
|
||||
/// </summary>
|
||||
public class BWCPE_DAC : DAC
|
||||
{
|
||||
private DbCommand cmdSelect = null;
|
||||
private DbCommand cmdSelectRight = null;
|
||||
private DbCommand cmdCheckExist = null;
|
||||
private DbCommand cmdInsert = null;
|
||||
private DbCommand cmdUpdate = null;
|
||||
|
||||
public BWCPE_DAC()
|
||||
{
|
||||
}
|
||||
|
||||
public BWCPE_DAC(string connectionConfig, string connectionConfigName)
|
||||
: base(connectionConfig, connectionConfigName)
|
||||
{
|
||||
}
|
||||
|
||||
private void PrepareSql()
|
||||
{
|
||||
EnsureQuery();
|
||||
string tblBwcpe = WGuard1.WCFA("BWCPE");
|
||||
|
||||
if (cmdSelect == null)
|
||||
{
|
||||
cmdSelect = Query.NewCommand(Query.ReplaceParamNamePrefix(
|
||||
"SELECT B.BPPRG AS BPPRG, B.BPENO AS BPENO, A.BPENO AS BBPENO, A.BPNME AS BBPNME, "
|
||||
+ " B.BPRT1 AS BPRT1, B.BPRTI AS BPRTI, B.BPRTM AS BPRTM, B.BPRTD AS BPRTD, "
|
||||
+ " B.BPRTF AS BPRTF, B.BPRTP AS BPRTP, B.TRDAT AS TRDAT, B.TRMOD AS TRMOD, "
|
||||
+ " B.TRUSR AS TRUSR "
|
||||
+ " FROM " + WGuard1.WCFA("BPSN") + " A "
|
||||
+ " LEFT OUTER JOIN " + tblBwcpe + " B ON A.BPENO=B.BPENO AND B.BPPRG=@BPPRG "
|
||||
+ " WHERE A.BPEDY IS NULL AND A.BPENO <> ' ' "
|
||||
+ " ORDER BY A.BPENO "));
|
||||
cmdSelect.Parameters.Add(Query.NewParameter("BPPRG", DbType.AnsiString));
|
||||
}
|
||||
|
||||
if (cmdCheckExist == null)
|
||||
{
|
||||
cmdCheckExist = Query.NewCommand(Query.ReplaceParamNamePrefix("SELECT COUNT(1) FROM " + tblBwcpe + " WHERE BPPRG=@BPPRG AND BPENO=@BPENO"));
|
||||
cmdCheckExist.Parameters.Add(Query.NewParameter("BPPRG", DbType.AnsiString));
|
||||
cmdCheckExist.Parameters.Add(Query.NewParameter("BPENO", DbType.AnsiString));
|
||||
}
|
||||
|
||||
if (cmdInsert == null)
|
||||
{
|
||||
cmdInsert = Query.NewCommand(Query.ReplaceParamNamePrefix(
|
||||
"INSERT INTO " + tblBwcpe + " (BPPRG, BPENO, BPRT1, BPRTI, BPRTM, BPRTD, BPRTF, BPRTP, TRDAT, TRMOD, TRUSR) "
|
||||
+ " VALUES (@BPPRG, @BPENO, @BPRT1, @BPRTI, @BPRTM, @BPRTD, @BPRTF, @BPRTP, @TRDAT, 'INSERT', @TRUSR)"));
|
||||
cmdInsert.Parameters.Add(Query.NewParameter("BPPRG", DbType.AnsiString));
|
||||
cmdInsert.Parameters.Add(Query.NewParameter("BPENO", DbType.AnsiString));
|
||||
cmdInsert.Parameters.Add(Query.NewParameter("BPRT1", DbType.AnsiString));
|
||||
cmdInsert.Parameters.Add(Query.NewParameter("BPRTI", DbType.AnsiString));
|
||||
cmdInsert.Parameters.Add(Query.NewParameter("BPRTM", DbType.AnsiString));
|
||||
cmdInsert.Parameters.Add(Query.NewParameter("BPRTD", DbType.AnsiString));
|
||||
cmdInsert.Parameters.Add(Query.NewParameter("BPRTF", DbType.AnsiString));
|
||||
cmdInsert.Parameters.Add(Query.NewParameter("BPRTP", DbType.AnsiString));
|
||||
cmdInsert.Parameters.Add(Query.NewParameter("TRDAT", DbType.DateTime));
|
||||
cmdInsert.Parameters.Add(Query.NewParameter("TRUSR", DbType.AnsiString));
|
||||
}
|
||||
|
||||
if (cmdUpdate == null)
|
||||
{
|
||||
cmdUpdate = Query.NewCommand(Query.ReplaceParamNamePrefix(
|
||||
"UPDATE " + tblBwcpe
|
||||
+ " SET BPRT1=@BPRT1, BPRTI=@BPRTI, BPRTM=@BPRTM, BPRTD=@BPRTD, BPRTF=@BPRTF,"
|
||||
+ " BPRTP=@BPRTP, TRDAT=@TRDAT, TRMOD='UPDATE', TRUSR=@TRUSR"
|
||||
+ " WHERE BPPRG=@BPPRG AND BPENO=@BPENO"));
|
||||
cmdUpdate.Parameters.Add(Query.NewParameter("BPPRG", DbType.AnsiString));
|
||||
cmdUpdate.Parameters.Add(Query.NewParameter("BPENO", DbType.AnsiString));
|
||||
cmdUpdate.Parameters.Add(Query.NewParameter("BPRT1", DbType.AnsiString));
|
||||
cmdUpdate.Parameters.Add(Query.NewParameter("BPRTI", DbType.AnsiString));
|
||||
cmdUpdate.Parameters.Add(Query.NewParameter("BPRTM", DbType.AnsiString));
|
||||
cmdUpdate.Parameters.Add(Query.NewParameter("BPRTD", DbType.AnsiString));
|
||||
cmdUpdate.Parameters.Add(Query.NewParameter("BPRTF", DbType.AnsiString));
|
||||
cmdUpdate.Parameters.Add(Query.NewParameter("BPRTP", DbType.AnsiString));
|
||||
cmdUpdate.Parameters.Add(Query.NewParameter("TRDAT", DbType.DateTime));
|
||||
cmdUpdate.Parameters.Add(Query.NewParameter("TRUSR", DbType.AnsiString));
|
||||
}
|
||||
|
||||
if (cmdSelectRight == null)
|
||||
{
|
||||
cmdSelectRight = Query.NewCommand(Query.ReplaceParamNamePrefix(
|
||||
"SELECT BPRT1, BPRTI, BPRTM, BPRTD, BPRTF, BPRTP "
|
||||
+ " FROM " + tblBwcpe + " WHERE BPPRG=@BPPRG AND BPENO=@BPENO "));
|
||||
cmdSelectRight.Parameters.Add(Query.NewParameter("BPPRG", DbType.AnsiString));
|
||||
cmdSelectRight.Parameters.Add(Query.NewParameter("BPENO", DbType.AnsiString));
|
||||
}
|
||||
}
|
||||
|
||||
public DataTable Select(string bpprg)
|
||||
{
|
||||
PrepareSql();
|
||||
cmdSelect.Parameters["BPPRG"].Value = bpprg;
|
||||
return Query.Select(cmdSelect);
|
||||
}
|
||||
|
||||
public bool CheckExist(string bpprg, string bpeno)
|
||||
{
|
||||
PrepareSql();
|
||||
cmdCheckExist.Parameters["BPPRG"].Value = bpprg;
|
||||
cmdCheckExist.Parameters["BPENO"].Value = bpeno;
|
||||
int i = Convert.ToInt16(Query.ExecuteScalar(cmdCheckExist));
|
||||
return !(i == 0);
|
||||
}
|
||||
|
||||
public void Insert(string bpprg, string bpeno, string bprt1, string bprti,
|
||||
string bprtm, string bprtd, string bprtf, string bprtp)
|
||||
{
|
||||
PrepareSql();
|
||||
FillParameters(cmdInsert, bpprg, bpeno, bprt1, bprti, bprtm, bprtd, bprtf, bprtp);
|
||||
Query.ExecuteNonQuery(cmdInsert);
|
||||
}
|
||||
|
||||
public void Update(string bpprg, string bpeno, string bprt1, string bprti,
|
||||
string bprtm, string bprtd, string bprtf, string bprtp)
|
||||
{
|
||||
PrepareSql();
|
||||
FillParameters(cmdUpdate, bpprg, bpeno, bprt1, bprti, bprtm, bprtd, bprtf, bprtp);
|
||||
Query.ExecuteNonQuery(cmdUpdate);
|
||||
}
|
||||
|
||||
public void SetAllRight(string bpprg, string bpeno, bool right)
|
||||
{
|
||||
string r = right ? "Y" : "N";
|
||||
if (!CheckExist(bpprg, bpeno))
|
||||
{
|
||||
Insert(bpprg, bpeno, r, r, r, r, r, r);
|
||||
}
|
||||
else
|
||||
{
|
||||
Update(bpprg, bpeno, r, r, r, r, r, r);
|
||||
}
|
||||
}
|
||||
|
||||
private void FillParameters(DbCommand cmd, string bpprg, string bpeno, string bprt1, string bprti,
|
||||
string bprtm, string bprtd, string bprtf, string bprtp)
|
||||
{
|
||||
cmd.Parameters["BPPRG"].Value = bpprg;
|
||||
cmd.Parameters["BPENO"].Value = bpeno;
|
||||
cmd.Parameters["BPRT1"].Value = bprt1 == "Y" || bprt1 == "N" ? bprt1 : "N";
|
||||
cmd.Parameters["BPRTI"].Value = bprti == "Y" || bprti == "N" ? bprti : "N";
|
||||
cmd.Parameters["BPRTM"].Value = bprtm == "Y" || bprtm == "N" ? bprtm : "N";
|
||||
cmd.Parameters["BPRTD"].Value = bprtd == "Y" || bprtd == "N" ? bprtd : "N";
|
||||
cmd.Parameters["BPRTF"].Value = bprtf == "Y" || bprtf == "N" ? bprtf : "N";
|
||||
cmd.Parameters["BPRTP"].Value = bprtp == "Y" || bprtp == "N" ? bprtp : "N";
|
||||
cmd.Parameters["TRDAT"].Value = DateTime.UtcNow.AddHours(8);
|
||||
cmd.Parameters["TRUSR"].Value = WGuard1.CUSR;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 取得員工權限<para></para>
|
||||
/// "Y" 表示有權限 "N" 表示無權限 "" 表示未設定
|
||||
/// </summary>
|
||||
/// <param name="bpprg">程式名稱</param>
|
||||
/// <param name="bpeno">員工編號</param>
|
||||
/// <param name="right">權限</param>
|
||||
/// <returns>"Y" 表示有權限 "N" 表示無權限 "" 表示未設定</returns>
|
||||
public string GetRight(string bpprg, string bpeno, WRightName right)
|
||||
{
|
||||
PrepareSql();
|
||||
string funcName = "";
|
||||
switch (right)
|
||||
{
|
||||
case WRightName.Execute:
|
||||
funcName = "BPRT1";
|
||||
break;
|
||||
case WRightName.Insert:
|
||||
funcName = "BPRTI";
|
||||
break;
|
||||
case WRightName.Update:
|
||||
funcName = "BPRTM";
|
||||
break;
|
||||
case WRightName.Delete:
|
||||
funcName = "BPRTD";
|
||||
break;
|
||||
case WRightName.Search:
|
||||
funcName = "BPRTF";
|
||||
break;
|
||||
case WRightName.Print:
|
||||
funcName = "BPRTP";
|
||||
break;
|
||||
}
|
||||
|
||||
cmdSelectRight.Parameters["BPPRG"].Value = bpprg;
|
||||
cmdSelectRight.Parameters["BPENO"].Value = bpeno;
|
||||
DataTable data = Query.Select(cmdSelectRight);
|
||||
|
||||
if (data.Rows.Count != 0)
|
||||
{
|
||||
return data.Rows[0][funcName].ToString();
|
||||
}
|
||||
return "";
|
||||
}
|
||||
}
|
||||
|
||||
public enum WRightName
|
||||
{
|
||||
/// <summary>
|
||||
/// 主檔
|
||||
/// </summary>
|
||||
Execute,
|
||||
/// <summary>
|
||||
/// 新增
|
||||
/// </summary>
|
||||
Insert,
|
||||
/// <summary>
|
||||
/// 更正
|
||||
/// </summary>
|
||||
Update,
|
||||
/// <summary>
|
||||
/// 刪除
|
||||
/// </summary>
|
||||
Delete,
|
||||
/// <summary>
|
||||
/// 查詢
|
||||
/// </summary>
|
||||
Search,
|
||||
/// <summary>
|
||||
/// 印表
|
||||
/// </summary>
|
||||
Print
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,206 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
using Wellan.Common;
|
||||
using System.Data;
|
||||
using System.Data.Common;
|
||||
|
||||
namespace Education
|
||||
{
|
||||
/// <summary>
|
||||
/// 群組權限
|
||||
/// </summary>
|
||||
public class BWCPG_DAC : DAC
|
||||
{
|
||||
private DbCommand cmdSelect = null;
|
||||
private DbCommand cmdSelectRight = null;
|
||||
private DbCommand cmdCheckExist = null;
|
||||
private DbCommand cmdInsert = null;
|
||||
private DbCommand cmdUpdate = null;
|
||||
|
||||
public BWCPG_DAC()
|
||||
{
|
||||
}
|
||||
|
||||
public BWCPG_DAC(string connectionConfig, string connectionConfigName)
|
||||
: base(connectionConfig, connectionConfigName)
|
||||
{
|
||||
}
|
||||
|
||||
private void PrepareSql()
|
||||
{
|
||||
EnsureQuery();
|
||||
string tblBwcpg = WGuard1.WCFA("BWCPG");
|
||||
|
||||
if (cmdSelect == null)
|
||||
{
|
||||
cmdSelect = Query.NewCommand(Query.ReplaceParamNamePrefix(
|
||||
"SELECT B.BPPRG AS BPPRG, B.BPGLP AS BPGLP, A.BPGLP AS BBPGLP, A.BPDSP AS BBPDSP, "
|
||||
+ " B.BPRT1 AS BPRT1, B.BPRTI AS BPRTI, B.BPRTM AS BPRTM, B.BPRTD AS BPRTD, "
|
||||
+ " B.BPRTF AS BPRTF, B.BPRTP AS BPRTP, B.TRDAT AS TRDAT, B.TRMOD AS TRMOD, "
|
||||
+ " B.TRUSR AS TRUSR "
|
||||
+ " FROM " + WGuard1.WCFA("BWEG") + " A "
|
||||
+ " LEFT OUTER JOIN " + tblBwcpg + " B ON A.BPGLP=B.BPGLP AND B.BPPRG=@BPPRG "
|
||||
+ " ORDER BY A.BPGLP "));
|
||||
cmdSelect.Parameters.Add(Query.NewParameter("BPPRG", DbType.AnsiString));
|
||||
}
|
||||
|
||||
if (cmdCheckExist == null)
|
||||
{
|
||||
cmdCheckExist = Query.NewCommand(Query.ReplaceParamNamePrefix("SELECT COUNT(1) FROM " + tblBwcpg + " WHERE BPPRG=@BPPRG AND BPGLP=@BPGLP"));
|
||||
cmdCheckExist.Parameters.Add(Query.NewParameter("BPPRG", DbType.AnsiString));
|
||||
cmdCheckExist.Parameters.Add(Query.NewParameter("BPGLP", DbType.AnsiString));
|
||||
}
|
||||
|
||||
if (cmdInsert == null)
|
||||
{
|
||||
cmdInsert = Query.NewCommand(Query.ReplaceParamNamePrefix(
|
||||
"INSERT INTO " + tblBwcpg + " (BPPRG, BPGLP, BPRT1, BPRTI, BPRTM, BPRTD, BPRTF, BPRTP, TRDAT, TRMOD, TRUSR) "
|
||||
+ " VALUES (@BPPRG, @BPGLP, @BPRT1, @BPRTI, @BPRTM, @BPRTD, @BPRTF, @BPRTP, @TRDAT, 'INSERT', @TRUSR)"));
|
||||
cmdInsert.Parameters.Add(Query.NewParameter("BPPRG", DbType.AnsiString));
|
||||
cmdInsert.Parameters.Add(Query.NewParameter("BPGLP", DbType.AnsiString));
|
||||
cmdInsert.Parameters.Add(Query.NewParameter("BPRT1", DbType.AnsiString));
|
||||
cmdInsert.Parameters.Add(Query.NewParameter("BPRTI", DbType.AnsiString));
|
||||
cmdInsert.Parameters.Add(Query.NewParameter("BPRTM", DbType.AnsiString));
|
||||
cmdInsert.Parameters.Add(Query.NewParameter("BPRTD", DbType.AnsiString));
|
||||
cmdInsert.Parameters.Add(Query.NewParameter("BPRTF", DbType.AnsiString));
|
||||
cmdInsert.Parameters.Add(Query.NewParameter("BPRTP", DbType.AnsiString));
|
||||
cmdInsert.Parameters.Add(Query.NewParameter("TRDAT", DbType.DateTime));
|
||||
cmdInsert.Parameters.Add(Query.NewParameter("TRUSR", DbType.AnsiString));
|
||||
}
|
||||
|
||||
if (cmdUpdate == null)
|
||||
{
|
||||
cmdUpdate = Query.NewCommand(Query.ReplaceParamNamePrefix(
|
||||
"UPDATE " + tblBwcpg
|
||||
+ " SET BPRT1=@BPRT1, BPRTI=@BPRTI, BPRTM=@BPRTM, BPRTD=@BPRTD, BPRTF=@BPRTF,"
|
||||
+ " BPRTP=@BPRTP, TRDAT=@TRDAT, TRMOD='UPDATE', TRUSR=@TRUSR"
|
||||
+ " WHERE BPPRG=@BPPRG AND BPGLP=@BPGLP"));
|
||||
cmdUpdate.Parameters.Add(Query.NewParameter("BPPRG", DbType.AnsiString));
|
||||
cmdUpdate.Parameters.Add(Query.NewParameter("BPGLP", DbType.AnsiString));
|
||||
cmdUpdate.Parameters.Add(Query.NewParameter("BPRT1", DbType.AnsiString));
|
||||
cmdUpdate.Parameters.Add(Query.NewParameter("BPRTI", DbType.AnsiString));
|
||||
cmdUpdate.Parameters.Add(Query.NewParameter("BPRTM", DbType.AnsiString));
|
||||
cmdUpdate.Parameters.Add(Query.NewParameter("BPRTD", DbType.AnsiString));
|
||||
cmdUpdate.Parameters.Add(Query.NewParameter("BPRTF", DbType.AnsiString));
|
||||
cmdUpdate.Parameters.Add(Query.NewParameter("BPRTP", DbType.AnsiString));
|
||||
cmdUpdate.Parameters.Add(Query.NewParameter("TRDAT", DbType.DateTime));
|
||||
cmdUpdate.Parameters.Add(Query.NewParameter("TRUSR", DbType.AnsiString));
|
||||
}
|
||||
|
||||
if (cmdSelectRight == null)
|
||||
{
|
||||
cmdSelectRight = Query.NewCommand(Query.ReplaceParamNamePrefix(
|
||||
"SELECT BPRT1, BPRTI, BPRTM, BPRTD, BPRTF, BPRTP "
|
||||
+ " FROM " + tblBwcpg + " WHERE BPPRG=@BPPRG AND BPGLP=@BPGLP "));
|
||||
cmdSelectRight.Parameters.Add(Query.NewParameter("BPPRG", DbType.AnsiString));
|
||||
cmdSelectRight.Parameters.Add(Query.NewParameter("BPGLP", DbType.AnsiString));
|
||||
}
|
||||
}
|
||||
|
||||
public DataTable Select(string bpprg)
|
||||
{
|
||||
PrepareSql();
|
||||
cmdSelect.Parameters["BPPRG"].Value = bpprg;
|
||||
return Query.Select(cmdSelect);
|
||||
}
|
||||
|
||||
public bool CheckExist(string bpprg, string bpglp)
|
||||
{
|
||||
PrepareSql();
|
||||
cmdCheckExist.Parameters["BPPRG"].Value = bpprg;
|
||||
cmdCheckExist.Parameters["BPGLP"].Value = bpglp;
|
||||
int i = Convert.ToInt16(Query.ExecuteScalar(cmdCheckExist));
|
||||
return i != 0;
|
||||
}
|
||||
|
||||
public void Insert(string bpprg, string bpglp, string bprt1, string bprti,
|
||||
string bprtm, string bprtd, string bprtf, string bprtp)
|
||||
{
|
||||
PrepareSql();
|
||||
FillParameters(cmdInsert, bpprg, bpglp, bprt1, bprti, bprtm, bprtd, bprtf, bprtp);
|
||||
Query.ExecuteNonQuery(cmdInsert);
|
||||
}
|
||||
|
||||
public void Update(string bpprg, string bpglp, string bprt1, string bprti,
|
||||
string bprtm, string bprtd, string bprtf, string bprtp)
|
||||
{
|
||||
PrepareSql();
|
||||
FillParameters(cmdUpdate, bpprg, bpglp, bprt1, bprti, bprtm, bprtd, bprtf, bprtp);
|
||||
Query.ExecuteNonQuery(cmdUpdate);
|
||||
}
|
||||
|
||||
public void SetAllRight(string bpprg, string bpglp, bool right)
|
||||
{
|
||||
string r = right ? "Y" : "N";
|
||||
if (!CheckExist(bpprg, bpglp))
|
||||
{
|
||||
Insert(bpprg, bpglp, r, r, r, r, r, r);
|
||||
}
|
||||
else
|
||||
{
|
||||
Update(bpprg, bpglp, r, r, r, r, r, r);
|
||||
}
|
||||
}
|
||||
|
||||
private void FillParameters(DbCommand cmd, string bpprg, string bpglp, string bprt1, string bprti,
|
||||
string bprtm, string bprtd, string bprtf, string bprtp)
|
||||
{
|
||||
cmd.Parameters["BPPRG"].Value = bpprg;
|
||||
cmd.Parameters["BPGLP"].Value = bpglp;
|
||||
cmd.Parameters["BPRT1"].Value = bprt1 == "Y" || bprt1 == "N" ? bprt1 : "N";
|
||||
cmd.Parameters["BPRTI"].Value = bprti == "Y" || bprti == "N" ? bprti : "N";
|
||||
cmd.Parameters["BPRTM"].Value = bprtm == "Y" || bprtm == "N" ? bprtm : "N";
|
||||
cmd.Parameters["BPRTD"].Value = bprtd == "Y" || bprtd == "N" ? bprtd : "N";
|
||||
cmd.Parameters["BPRTF"].Value = bprtf == "Y" || bprtf == "N" ? bprtf : "N";
|
||||
cmd.Parameters["BPRTP"].Value = bprtp == "Y" || bprtp == "N" ? bprtp : "N";
|
||||
cmd.Parameters["TRDAT"].Value = DateTime.UtcNow.AddHours(8);
|
||||
cmd.Parameters["TRUSR"].Value = WGuard1.CUSR;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 取得群組權限<para></para>
|
||||
/// "Y" 表示有權限 "N" 表示無權限 "" 表示未設定
|
||||
/// </summary>
|
||||
/// <param name="bpprg">程式名稱</param>
|
||||
/// <param name="bpglp">群組編號</param>
|
||||
/// <param name="right">權限</param>
|
||||
/// <returns>"Y" 表示有權限 "N" 表示無權限 "" 表示未設定</returns>
|
||||
public string GetRight(string bpprg, string bpglp, WRightName right)
|
||||
{
|
||||
PrepareSql();
|
||||
string funcName = "";
|
||||
switch (right)
|
||||
{
|
||||
case WRightName.Execute:
|
||||
funcName = "BPRT1";
|
||||
break;
|
||||
case WRightName.Insert:
|
||||
funcName = "BPRTI";
|
||||
break;
|
||||
case WRightName.Update:
|
||||
funcName = "BPRTM";
|
||||
break;
|
||||
case WRightName.Delete:
|
||||
funcName = "BPRTD";
|
||||
break;
|
||||
case WRightName.Search:
|
||||
funcName = "BPRTF";
|
||||
break;
|
||||
case WRightName.Print:
|
||||
funcName = "BPRTP";
|
||||
break;
|
||||
}
|
||||
|
||||
cmdSelectRight.Parameters["BPPRG"].Value = bpprg;
|
||||
cmdSelectRight.Parameters["BPGLP"].Value = bpglp;
|
||||
DataTable data = Query.Select(cmdSelectRight);
|
||||
|
||||
if (data.Rows.Count != 0)
|
||||
{
|
||||
return data.Rows[0][funcName].ToString();
|
||||
}
|
||||
return "";
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,215 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
using System.Data;
|
||||
using System.Data.Common;
|
||||
using Wellan.Common;
|
||||
|
||||
namespace Education
|
||||
{
|
||||
/// <summary>
|
||||
/// 員工群組
|
||||
/// </summary>
|
||||
public class BWEH_DAC : DAC
|
||||
{
|
||||
DbCommand cmdInsert = null;
|
||||
DbCommand cmdDelete = null;
|
||||
|
||||
public BWEH_DAC()
|
||||
{
|
||||
}
|
||||
|
||||
public BWEH_DAC(string connectionConfig, string connectionConfigName)
|
||||
: base(connectionConfig, connectionConfigName)
|
||||
{
|
||||
}
|
||||
|
||||
private void PrepareSql()
|
||||
{
|
||||
EnsureQuery();
|
||||
|
||||
if (cmdInsert == null)
|
||||
{
|
||||
cmdInsert = Query.NewCommand("INSERT INTO " + WGuard1.WCFA("BWEH") + " (BPGLP, BPENO) VALUES (@BPGLP, @BPENO)");
|
||||
cmdInsert.Parameters.Add(Query.NewParameter("BPGLP", DbType.String));
|
||||
cmdInsert.Parameters.Add(Query.NewParameter("BPENO", DbType.String));
|
||||
}
|
||||
|
||||
if (cmdDelete == null)
|
||||
{
|
||||
cmdDelete = Query.NewCommand("DELETE FROM " + WGuard1.WCFA("BWEH") + " WHERE BPGLP=@BPGLP AND BPENO=@BPENO");
|
||||
cmdDelete.Parameters.Add(Query.NewParameter("BPGLP", DbType.String));
|
||||
cmdDelete.Parameters.Add(Query.NewParameter("BPENO", DbType.String));
|
||||
}
|
||||
}
|
||||
|
||||
public void SelectByBpglp(string bpglp, out DataTable inGroup, out DataTable outGroup)
|
||||
{
|
||||
PrepareSql();
|
||||
inGroup = Query.Select(
|
||||
"SELECT E.BPENO AS BPENO, E.BPNME AS BPNME "
|
||||
+ " FROM " + WGuard1.WCFA("BPSN") + " E," + WGuard1.WCFA("BWEH") + " G"
|
||||
+ " WHERE G.BPENO=E.BPENO AND G.BPGLP='" + bpglp +"' "
|
||||
+ " AND E.BPEDY IS NULL "
|
||||
+ " ORDER BY E.BPENO ");
|
||||
|
||||
outGroup = Query.Select(
|
||||
"SELECT BPENO, BPNME FROM " + WGuard1.WCFA("BPSN")
|
||||
+ " WHERE BPENO<>' ' "
|
||||
+ " AND BPEDY IS NULL "
|
||||
+ " AND BPENO NOT IN (SELECT E.BPENO AS BPENO "
|
||||
+ " FROM " + WGuard1.WCFA("BPSN") + " E," + WGuard1.WCFA("BWEH") + " G"
|
||||
+ " WHERE G.BPENO=E.BPENO AND G.BPGLP='" + bpglp + "' "
|
||||
+ " AND E.BPEDY IS NULL ) "
|
||||
+ " ORDER BY BPENO");
|
||||
}
|
||||
|
||||
public string[] GetBpenoListByBpglp(string bpglp)
|
||||
{
|
||||
PrepareSql();
|
||||
DataTable inGroup = Query.Select(
|
||||
"SELECT E.BPENO AS BPENO "
|
||||
+ " FROM " + WGuard1.WCFA("BPSN") + " E," + WGuard1.WCFA("BWEH") + " G"
|
||||
+ " WHERE G.BPENO=E.BPENO AND G.BPGLP='" + bpglp + "' "
|
||||
+ " AND E.BPEDY IS NULL "
|
||||
+ " ORDER BY E.BPENO ");
|
||||
|
||||
if (inGroup.Rows.Count == 0)
|
||||
return new string[0];
|
||||
else
|
||||
{
|
||||
string[] result = new string[inGroup.Rows.Count];
|
||||
for (int i = 0; i < inGroup.Rows.Count; i++)
|
||||
{
|
||||
result[i] = inGroup.Rows[i][0].ToString();
|
||||
}
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
||||
public void UpdateByBpglp(string bpglp, DataTable updateTable)
|
||||
{
|
||||
PrepareSql();
|
||||
DbConnection conn = Query.NewConnection();
|
||||
cmdDelete.Connection = conn;
|
||||
cmdInsert.Connection = conn;
|
||||
conn.Open();
|
||||
|
||||
DbTransaction tran = conn.BeginTransaction();
|
||||
cmdDelete.Transaction = tran;
|
||||
cmdInsert.Transaction = tran;
|
||||
try
|
||||
{
|
||||
foreach (DataRow row in updateTable.Rows)
|
||||
{
|
||||
if (row.RowState == DataRowState.Added)
|
||||
{
|
||||
cmdInsert.Parameters["BPGLP"].Value = bpglp;
|
||||
cmdInsert.Parameters["BPENO"].Value = row["BPENO", DataRowVersion.Current];
|
||||
cmdInsert.ExecuteNonQuery();
|
||||
}
|
||||
|
||||
if (row.RowState == DataRowState.Deleted)
|
||||
{
|
||||
cmdDelete.Parameters["BPGLP"].Value = bpglp;
|
||||
cmdDelete.Parameters["BPENO"].Value = row["BPENO", DataRowVersion.Original];
|
||||
cmdDelete.ExecuteNonQuery();
|
||||
}
|
||||
}
|
||||
tran.Commit();
|
||||
updateTable.AcceptChanges();
|
||||
}
|
||||
catch
|
||||
{
|
||||
tran.Rollback();
|
||||
}
|
||||
finally
|
||||
{
|
||||
conn.Close();
|
||||
cmdInsert.Dispose();
|
||||
cmdDelete.Dispose();
|
||||
}
|
||||
}
|
||||
|
||||
public void SelectByBpeno(string bpeno, out DataTable inGroup, out DataTable outGroup)
|
||||
{
|
||||
PrepareSql();
|
||||
inGroup = Query.Select(
|
||||
"SELECT E.BPGLP AS BPGLP, E.BPDSP AS BPDSP "
|
||||
+ " FROM " + WGuard1.WCFA("BWEG") + " E," + WGuard1.WCFA("BWEH") + " G"
|
||||
+ " WHERE E.BPGLP=G.BPGLP AND G.BPENO='" + bpeno + "' "
|
||||
+ " ORDER BY E.BPGLP ");
|
||||
|
||||
outGroup = Query.Select(
|
||||
"SELECT BPGLP, BPDSP FROM " + WGuard1.WCFA("BWEG")
|
||||
+ " WHERE BPGLP NOT IN (SELECT BPGLP FROM " + WGuard1.WCFA("BWEH") + " WHERE BPENO='" + bpeno + "')"
|
||||
+ " ORDER BY BPGLP");
|
||||
}
|
||||
|
||||
public string[] GetBpglpListByBpeno(string bpeno)
|
||||
{
|
||||
PrepareSql();
|
||||
DataTable inGroup = Query.Select(
|
||||
"SELECT E.BPGLP AS BPGLP "
|
||||
+ " FROM " + WGuard1.WCFA("BWEG") + " E," + WGuard1.WCFA("BWEH") + " G"
|
||||
+ " WHERE E.BPGLP=G.BPGLP AND G.BPENO='" + bpeno + "' "
|
||||
+ " ORDER BY E.BPGLP ");
|
||||
|
||||
if (inGroup.Rows.Count == 0)
|
||||
return new string[0];
|
||||
else
|
||||
{
|
||||
string[] result = new string[inGroup.Rows.Count];
|
||||
for (int i = 0; i < inGroup.Rows.Count; i++)
|
||||
{
|
||||
result[i] = inGroup.Rows[i][0].ToString();
|
||||
}
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
||||
public void UpdateByBpeno(string bpeno, DataTable updateTable)
|
||||
{
|
||||
PrepareSql();
|
||||
DbConnection conn = Query.NewConnection();
|
||||
cmdDelete.Connection = conn;
|
||||
cmdInsert.Connection = conn;
|
||||
conn.Open();
|
||||
|
||||
DbTransaction tran = conn.BeginTransaction();
|
||||
cmdDelete.Transaction = tran;
|
||||
cmdInsert.Transaction = tran;
|
||||
try
|
||||
{
|
||||
foreach (DataRow row in updateTable.Rows)
|
||||
{
|
||||
if (row.RowState == DataRowState.Added)
|
||||
{
|
||||
cmdInsert.Parameters["BPENO"].Value = bpeno;
|
||||
cmdInsert.Parameters["BPGLP"].Value = row["BPGLP", DataRowVersion.Current];
|
||||
cmdInsert.ExecuteNonQuery();
|
||||
}
|
||||
|
||||
if (row.RowState == DataRowState.Deleted)
|
||||
{
|
||||
cmdDelete.Parameters["BPENO"].Value = bpeno;
|
||||
cmdDelete.Parameters["BPGLP"].Value = row["BPGLP", DataRowVersion.Original];
|
||||
cmdDelete.ExecuteNonQuery();
|
||||
}
|
||||
}
|
||||
tran.Commit();
|
||||
updateTable.AcceptChanges();
|
||||
}
|
||||
catch
|
||||
{
|
||||
tran.Rollback();
|
||||
}
|
||||
finally
|
||||
{
|
||||
conn.Close();
|
||||
cmdDelete.Dispose();
|
||||
cmdInsert.Dispose();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,139 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Web;
|
||||
using System.Data;
|
||||
using System.Data.Common;
|
||||
using System.ComponentModel;
|
||||
using WebLib;
|
||||
|
||||
namespace Education
|
||||
{
|
||||
[DataObject]
|
||||
public class DAC_BCLS : DAC
|
||||
{
|
||||
public DAC_BCLS()
|
||||
{ }
|
||||
|
||||
public DAC_BCLS(DbConnection conn)
|
||||
: base(conn)
|
||||
{ }
|
||||
|
||||
[DataObjectMethod(DataObjectMethodType.Select)]
|
||||
public NameValueList Get類別資料By大類ForList(string 大類)
|
||||
{
|
||||
NameValueList result = new NameValueList();
|
||||
|
||||
DbCommand cmd = NewCommand();
|
||||
cmd.CommandText = @"SELECT BSCLS, BSSCR FROM BCLS WHERE BSPAR=@BSPAR AND (BLOCK='' OR BLOCK IS NULL)";
|
||||
AddParam(cmd, "BSPAR", 大類);
|
||||
|
||||
bool wantClose;
|
||||
IDataReader reader = ExecuteReader(cmd, out wantClose);
|
||||
try
|
||||
{
|
||||
result.Fill(reader, 1, 0);
|
||||
cmd.Cancel();
|
||||
reader.Close();
|
||||
}
|
||||
finally
|
||||
{
|
||||
cmd.Dispose();
|
||||
reader.Dispose();
|
||||
CloseConnection(wantClose);
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
[DataObjectMethod(DataObjectMethodType.Select)]
|
||||
public NameValueList Get類別資料By大類ForDropDown(string 大類)
|
||||
{
|
||||
NameValueList result = new NameValueList();
|
||||
result.Add("(請選擇)", DBNull.Value);
|
||||
|
||||
DbCommand cmd = NewCommand();
|
||||
cmd.CommandText = @"SELECT BSCLS, BSSCR FROM BCLS WHERE BSPAR=@BSPAR AND (BLOCK='' OR BLOCK IS NULL)";
|
||||
AddParam(cmd, "BSPAR", 大類);
|
||||
|
||||
bool wantClose;
|
||||
IDataReader reader = ExecuteReader(cmd, out wantClose);
|
||||
try
|
||||
{
|
||||
result.Fill(reader, 1, 0, false);
|
||||
cmd.Cancel();
|
||||
reader.Close();
|
||||
}
|
||||
finally
|
||||
{
|
||||
cmd.Dispose();
|
||||
reader.Dispose();
|
||||
CloseConnection(wantClose);
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
public string Get類別名稱(object 大類, object 類別編號)
|
||||
{
|
||||
if (大類 == null)
|
||||
大類 = DBNull.Value;
|
||||
if (類別編號 == null)
|
||||
類別編號 = DBNull.Value;
|
||||
|
||||
DbCommand cmd = NewCommand();
|
||||
cmd.CommandText = @"SELECT BSSCR FROM BCLS WHERE BSPAR=@BSPAR AND BSCLS=@BSCLS";
|
||||
AddParam(cmd, "BSPAR", 大類);
|
||||
AddParam(cmd, "BSCLS", 類別編號);
|
||||
string result;
|
||||
ExecuteScalar(cmd, out result);
|
||||
return result;
|
||||
}
|
||||
|
||||
public void UpdateOne(object 大類, object 類別編號, object 類別值)
|
||||
{
|
||||
if (大類 == null)
|
||||
大類 = DBNull.Value;
|
||||
if (類別編號 == null)
|
||||
類別編號 = DBNull.Value;
|
||||
if (類別值 == null)
|
||||
類別值 = DBNull.Value;
|
||||
|
||||
DbCommand cmd = NewCommand();
|
||||
cmd.CommandText = @"SELECT COUNT(1) FROM BCLS WHERE BSPAR=@BSPAR AND BSCLS=@BSCLS";
|
||||
AddParam(cmd, "BSPAR", 大類);
|
||||
AddParam(cmd, "BSCLS", 類別編號);
|
||||
int count;
|
||||
ExecuteScalar(cmd, out count);
|
||||
|
||||
if (count == 0)
|
||||
{
|
||||
cmd.CommandText =
|
||||
@"INSERT INTO BCLS (BSPAR, BSCLS, BSSCR, BLOCK, TRDAT, TRMOD, TRUSR, BSRMK, DB_APPNO)
|
||||
VALUES (@BSPAR, @BSCLS, @BSSCR, '', GETDATE(), 'INSERT', @TRUSR, '', 1)";
|
||||
AddParam(cmd, "BSPAR", 大類);
|
||||
AddParam(cmd, "BSCLS", 類別編號);
|
||||
AddParam(cmd, "BSSCR", 類別值);
|
||||
AddParam(cmd, "TRUSR", CurrentUserId);
|
||||
ExecuteNonQuery(cmd);
|
||||
}
|
||||
else
|
||||
{
|
||||
cmd.CommandText =
|
||||
@"UPDATE BCLS
|
||||
SET BSSCR = @BSSCR ,
|
||||
TRDAT = GETDATE() ,
|
||||
TRMOD = 'UPDATE' ,
|
||||
TRUSR = @TRUSR ,
|
||||
DB_APPNO = DB_APPNO + 1
|
||||
WHERE BSPAR = @BSPAR
|
||||
AND BSCLS = @BSCLS";
|
||||
|
||||
AddParam(cmd, "BSPAR", 大類);
|
||||
AddParam(cmd, "BSCLS", 類別編號);
|
||||
AddParam(cmd, "BSSCR", 類別值);
|
||||
AddParam(cmd, "TRUSR", CurrentUserId);
|
||||
ExecuteNonQuery(cmd);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,129 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Web;
|
||||
using System.Data;
|
||||
using System.Data.Common;
|
||||
using System.ComponentModel;
|
||||
using WebLib;
|
||||
|
||||
namespace Education
|
||||
{
|
||||
[DataObject]
|
||||
public class DAC_BPAA: DAC
|
||||
{
|
||||
/// <summary>
|
||||
/// 取得指定年度專案計畫代號與名稱,不含總公司
|
||||
/// </summary>
|
||||
/// <param name="year">指定年度</param>
|
||||
/// <returns></returns>
|
||||
public DataTable GetBpaa(int year)
|
||||
{
|
||||
DbCommand cmd = NewCommand();
|
||||
cmd.CommandText =
|
||||
@"SELECT BPPYN, ISNULL('【' + (SELECT TOP 1 BSSCR FROM BCLS WHERE BSPAR='BCUSZON' AND BSCLS=SUBSTRING(BPPYN,LEN(BPPYN)-5,1)) + '】', '') + BPPYM BPPYM
|
||||
FROM BPAA WHERE (BPYER=@BPYER) AND (BPCSD IS NULL) AND (BPPYN <> '000000001') AND (BPPYN <> '103JYB00001') AND (BPPYN <> '103TYB00001')
|
||||
ORDER BY BPPYN";
|
||||
AddParam(cmd, "BPYER", year - PublicVariable.CY11);
|
||||
return Select(cmd);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 取得所有年度專案計畫代號與名稱,含總公司
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
public DataTable GetBpaaWithTY()
|
||||
{
|
||||
DbCommand cmd = NewCommand();
|
||||
cmd.CommandText =
|
||||
@"SELECT '000000001' BPPYN, '【非專案人員】' BPPYM
|
||||
UNION
|
||||
SELECT BPPYN, ISNULL('【' + (SELECT TOP 1 BSSCR FROM BCLS WHERE BSPAR='BCUSZON' AND BSCLS=SUBSTRING(BPPYN,LEN(BPPYN)-5,1)) + '】', '') + BPPYM BPPYM
|
||||
FROM BPAA WHERE (BPCSD IS NULL) AND (BPPYN <> '000000001') AND (BPPYN <> '103JYB00001') AND (BPPYN <> '103TYB00001') AND (BPPYN <> '102JYB00001') AND (BPPYN <> '102TYB00001')
|
||||
UNION
|
||||
SELECT BPPYN, ISNULL('【' + (SELECT TOP 1 BSSCR FROM BCLS WHERE BSPAR='BCUSZON' AND BSCLS=SUBSTRING(BPPYN,LEN(BPPYN)-5,1)) + '】', '') + BPPYM BPPYM
|
||||
FROM BPAA WHERE (BPCSD IS NULL) AND (BPPYN = '103JYB00001' OR BPPYN = '103TYB00001')
|
||||
ORDER BY BPPYN";
|
||||
return Select(cmd);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 取得所有年度專案計畫代號與名稱,含總公司,並加上一個空項目
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
public DataTable GetBpaaWithTYPlusNone()
|
||||
{
|
||||
DbCommand cmd = NewCommand();
|
||||
cmd.CommandText =
|
||||
@"SELECT '' BPPYN, '【全部】' BPPYM
|
||||
UNION
|
||||
SELECT '000000001' BPPYN, '【非專案人員】' BPPYM
|
||||
UNION
|
||||
SELECT BPPYN, ISNULL('【' + (SELECT TOP 1 BSSCR FROM BCLS WHERE BSPAR='BCUSZON' AND BSCLS=SUBSTRING(BPPYN,LEN(BPPYN)-5,1)) + '】', '') + BPPYM BPPYM
|
||||
FROM BPAA WHERE (BPCSD IS NULL) AND (BPPYN <> '000000001') AND (BPPYN <> '103JYB00001') AND (BPPYN <> '103TYB00001') AND (BPPYN <> '103JYB00001') AND (BPPYN <> '103TYB00001')
|
||||
UNION
|
||||
SELECT BPPYN, ISNULL('【' + (SELECT TOP 1 BSSCR FROM BCLS WHERE BSPAR='BCUSZON' AND BSCLS=SUBSTRING(BPPYN,LEN(BPPYN)-5,1)) + '】', '') + BPPYM BPPYM
|
||||
FROM BPAA WHERE (BPCSD IS NULL) AND (BPPYN = '103JYB00001' OR BPPYN = '103TYB00001')
|
||||
ORDER BY BPPYN";
|
||||
return Select(cmd);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 取得指定年度專案計畫代號與名稱,含總公司
|
||||
/// </summary>
|
||||
/// <param name="year">指定年度</param>
|
||||
/// <param name="companyID">公司別</param>
|
||||
/// <returns></returns>
|
||||
public DataTable GetBpaaWithTY(int year, string companyID)
|
||||
{
|
||||
DbCommand cmd = NewCommand();
|
||||
cmd.CommandText =
|
||||
@"SELECT '000000001' AS BPPYN, '【非專案人員】' AS BPPYM
|
||||
UNION
|
||||
SELECT BPPYN, BPPYM FROM
|
||||
(
|
||||
SELECT BPPYN,
|
||||
ISNULL('【' + (SELECT TOP 1 BSSCR FROM BCLS WHERE BSPAR='BCUSZON' AND BSCLS=SUBSTRING(BPPYN,LEN(BPPYN)-5,1)) + '】', '') + BPPYM AS BPPYM,
|
||||
(SELECT TOP 1 BPCPY FROM BPRJ WHERE BPRJ.BPPNM=BPAA.BPPNM) AS BPCPY
|
||||
FROM BPAA WHERE (BPYER=@BPYER) AND (BPPYN <> '000000001') AND (BPPYN <> '103JYB00001') AND (BPPYN <> '103TYB00001') AND (BPPYN <> '102JYB00001') AND (BPPYN <> '102TYB00001')
|
||||
UNION
|
||||
SELECT BPPYN,
|
||||
ISNULL('【' + (SELECT TOP 1 BSSCR FROM BCLS WHERE BSPAR='BCUSZON' AND BSCLS=SUBSTRING(BPPYN,LEN(BPPYN)-5,1)) + '】', '') + BPPYM AS BPPYM,
|
||||
(SELECT TOP 1 BPCPY FROM BPRJ WHERE BPRJ.BPPNM=BPAA.BPPNM) AS BPCPY
|
||||
FROM BPAA WHERE (BPPYN = '103JYB00001') OR (BPPYN = '103TYB00001')
|
||||
) AS TMP1 WHERE BPCPY=@BPCPY
|
||||
ORDER BY BPPYN";
|
||||
|
||||
// @"SELECT '000000001' BPPYN, '【非專案人員】' BPPYM
|
||||
// UNION
|
||||
// SELECT BPPYN, '【' + (SELECT TOP 1 BSSCR FROM BCLS WHERE BSPAR='BCUSZON' AND BSCLS=SUBSTRING(BPPYN,LEN(BPPYN)-5,1)) + '】' + BPPYM BPPYM
|
||||
// FROM BPAA WHERE (BPYER=@BPYER) AND (BPPYN <> '000000001')
|
||||
// ORDER BY BPPYN";
|
||||
AddParam(cmd, "BPYER", year);
|
||||
AddParam(cmd, "BPCPY", companyID);
|
||||
return Select(cmd);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 取得指定年度專案計畫代號與名稱,含總公司,並加上一個空項目
|
||||
/// </summary>
|
||||
/// <param name="year">指定年度</param>
|
||||
/// <returns></returns>
|
||||
public DataTable GetBpaaWithTYPlusNone(int year)
|
||||
{
|
||||
DbCommand cmd = NewCommand();
|
||||
cmd.CommandText =
|
||||
@"SELECT '' BPPYN, '【全部】' BPPYM
|
||||
UNION
|
||||
SELECT '000000001' BPPYN, '【非專案人員】' BPPYM
|
||||
UNION
|
||||
SELECT BPPYN, ISNULL('【' + (SELECT TOP 1 BSSCR FROM BCLS WHERE BSPAR='BCUSZON' AND BSCLS=SUBSTRING(BPPYN,LEN(BPPYN)-5,1)) + '】', '') + BPPYM BPPYM
|
||||
FROM BPAA WHERE (BPYER=@BPYER) AND (BPPYN <> '000000001') AND (BPPYN <> '103JYB00001') AND (BPPYN <> '103TYB00001') AND (BPPYN <> '102JYB00001') AND (BPPYN <> '102TYB00001')
|
||||
UNION
|
||||
SELECT BPPYN, ISNULL('【' + (SELECT TOP 1 BSSCR FROM BCLS WHERE BSPAR='BCUSZON' AND BSCLS=SUBSTRING(BPPYN,LEN(BPPYN)-5,1)) + '】', '') + BPPYM BPPYM
|
||||
FROM BPAA WHERE (BPPYN = '103JYB00001' OR BPPYN = '103TYB00001')
|
||||
ORDER BY BPPYN";
|
||||
AddParam(cmd, "BPYER", year - PublicVariable.CY11);
|
||||
return Select(cmd);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,124 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Web;
|
||||
using System.Data;
|
||||
using System.Data.Common;
|
||||
using System.ComponentModel;
|
||||
using WebLib;
|
||||
|
||||
namespace Education
|
||||
{
|
||||
[DataObject]
|
||||
public class DAC_BPSN : DAC
|
||||
{
|
||||
public DAC_BPSN()
|
||||
{ }
|
||||
|
||||
public DAC_BPSN(DbConnection conn)
|
||||
: base(conn)
|
||||
{ }
|
||||
|
||||
public string Get員工姓名(object BPENO)
|
||||
{
|
||||
if (BPENO == null)
|
||||
BPENO = DBNull.Value;
|
||||
|
||||
DbCommand cmd = NewCommand();
|
||||
cmd.CommandText = @"SELECT BPNME FROM BPSNView WHERE BPENO=@BPENO";
|
||||
AddParam(cmd, "BPENO", BPENO);
|
||||
string result;
|
||||
ExecuteScalar(cmd, out result);
|
||||
return result;
|
||||
}
|
||||
|
||||
public string Get電子郵件(object BPENO)
|
||||
{
|
||||
if (BPENO == null)
|
||||
BPENO = DBNull.Value;
|
||||
|
||||
DbCommand cmd = NewCommand();
|
||||
cmd.CommandText = @"SELECT BPEML FROM BPSNView WHERE BPENO=@BPENO";
|
||||
AddParam(cmd, "BPENO", BPENO);
|
||||
string result;
|
||||
ExecuteScalar(cmd, out result);
|
||||
return result;
|
||||
}
|
||||
|
||||
public string Get公司電話(object BPENO)
|
||||
{
|
||||
if (BPENO == null)
|
||||
BPENO = DBNull.Value;
|
||||
|
||||
DbCommand cmd = NewCommand();
|
||||
cmd.CommandText = @"SELECT BPOTL FROM BPSNView WHERE BPENO=@BPENO";
|
||||
AddParam(cmd, "BPENO", BPENO);
|
||||
string result;
|
||||
ExecuteScalar(cmd, out result);
|
||||
return result;
|
||||
}
|
||||
|
||||
public bool Is管理群組(object BPENO)
|
||||
{
|
||||
if (BPENO == null)
|
||||
return false;
|
||||
|
||||
DbCommand cmd = NewCommand();
|
||||
cmd.CommandText =
|
||||
String.Format(@"SELECT COUNT(1) FROM BWEH WHERE BPENO=@BPENO AND BPGLP IN ({0})", PublicVariable.ManagerGroup);
|
||||
AddParam(cmd, "BPENO", BPENO);
|
||||
int i;
|
||||
ExecuteScalar(cmd, out i);
|
||||
return i > 0;
|
||||
}
|
||||
|
||||
public bool Is承辦人群組(object BPENO)
|
||||
{
|
||||
if (BPENO == null)
|
||||
return false;
|
||||
|
||||
DbCommand cmd = NewCommand();
|
||||
cmd.CommandText =
|
||||
String.Format(@"SELECT COUNT(1) FROM BWEH WHERE BPENO=@BPENO AND BPGLP IN ({0})", PublicVariable.WorkerGroup);
|
||||
AddParam(cmd, "BPENO", BPENO);
|
||||
int i;
|
||||
ExecuteScalar(cmd, out i);
|
||||
return i > 0;
|
||||
}
|
||||
|
||||
|
||||
[DataObjectMethod(DataObjectMethodType.Select)]
|
||||
public DataTable Select(string BPENO, string BPNME)
|
||||
{
|
||||
DbCommand cmdSelect = NewCommand();
|
||||
cmdSelect.CommandText =
|
||||
@"select C.BPENO AS 員工編號, C.BPNME as 員工姓名, C.BPEML as 電子郵件,
|
||||
D.RAPYN AS 計畫年度編號, ISNULL('【' + I.BSSCR + '】', '') + E.BPPYM AS 計畫年度名稱,
|
||||
D.RABRH AS 站別編號, F.BSSCR AS 站別名稱,
|
||||
D.RAJNO AS 職務編號, G.BPJME AS 職務名稱,
|
||||
D.RACNO AS 等級編號, H.BPCME AS 等級名稱
|
||||
from BPSNView C
|
||||
left outer join RASN D on C.BPENO = D.RANUM and D.RAEDT is NULL
|
||||
left outer join BPAA E on D.RAPYN = E.BPPYN
|
||||
left outer join BCLS F on F.BSCLS = D.RABRH and F.BSPAR = 'BPSNBRH'
|
||||
left outer join BPJA G on G.BPPYN = D.RAPYN and G.BPJNO = D.RAJNO
|
||||
left outer join BPJB H on H.BPPYN = D.RAPYN and H.BPJNO = D.RAJNO and H.BPCNO = D.RACNO
|
||||
left outer join BCLS I on I.BSCLS = SUBSTRING(D.RAPYN, LEN(D.RAPYN)-5,1) and I.BSPAR = 'BCUSZON'
|
||||
where C.BPEDY is null ";
|
||||
|
||||
if (BPENO != null && BPENO.Length > 0)
|
||||
{
|
||||
cmdSelect.CommandText += " and C.BPENO like @BPENO ";
|
||||
AddParam(cmdSelect, "BPENO", BPENO + "%");
|
||||
}
|
||||
|
||||
if (BPNME != null && BPNME.Length > 0)
|
||||
{
|
||||
cmdSelect.CommandText += " and C.BPNME like @BPNME ";
|
||||
AddParam(cmdSelect, "BPNME", BPNME + "%");
|
||||
}
|
||||
|
||||
cmdSelect.CommandText += " order by C.BPENO";
|
||||
return Select(cmdSelect);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,69 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Data.Common;
|
||||
using System.Linq;
|
||||
using System.Web;
|
||||
using WebLib;
|
||||
|
||||
namespace Education
|
||||
{
|
||||
public class DAC_BRTE : DAC
|
||||
{
|
||||
public DAC_BRTE()
|
||||
{ }
|
||||
|
||||
public DAC_BRTE(DbConnection conn)
|
||||
: base(conn)
|
||||
{ }
|
||||
|
||||
private decimal GetValue(string brtyp)
|
||||
{
|
||||
DbCommand cmd = NewCommand();
|
||||
cmd.CommandText = @"SELECT TOP 1 BRRTE FROM BRTE WHERE BRTYP=@BRTYP AND BRSDT <= @TODAY ORDER BY BRSDT DESC";
|
||||
AddParam(cmd, "BRTYP", brtyp);
|
||||
AddParam(cmd, "TODAY", PublicVariable.TaiwanNow.Date);
|
||||
ExecuteScalar<decimal>(cmd, out decimal value);
|
||||
return value;
|
||||
}
|
||||
|
||||
public decimal 領據執行業務所得課稅門檻
|
||||
{
|
||||
get
|
||||
{
|
||||
return GetValue("領據執行業務所得課稅門檻");
|
||||
}
|
||||
}
|
||||
|
||||
public decimal 領據薪資課稅門檻
|
||||
{
|
||||
get
|
||||
{
|
||||
return GetValue("領據薪資課稅門檻");
|
||||
}
|
||||
}
|
||||
|
||||
public decimal 領據基本工資
|
||||
{
|
||||
get
|
||||
{
|
||||
return GetValue("領據基本工資");
|
||||
}
|
||||
}
|
||||
|
||||
public decimal 領據執行業務所得稅率
|
||||
{
|
||||
get
|
||||
{
|
||||
return GetValue("領據執行業務所得稅率");
|
||||
}
|
||||
}
|
||||
|
||||
public decimal 領據薪資稅率
|
||||
{
|
||||
get
|
||||
{
|
||||
return GetValue("領據薪資稅率");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||