@@ -185,284 +185,6 @@ def handle_bad_request(err):
185185@app .route ('/healthz' )
186186def healthz ():
187187 return jsonify ({'status' : 'ok' })
188- from flask import Flask , request , jsonify
189- from werkzeug .exceptions import BadRequest
190- from flask_cors import CORS
191-
192- app = Flask (__name__ )
193- CORS (app )
194-
195-
196- # In-memory data store for employees (for demo purposes)
197- employees = {
198- 'E001' : {
199- 'id' : 'E001' ,
200- 'name' : 'John Doe' ,
201- 'email' : 'john.doe@example.com' ,
202- 'phone' : '123-456-7890' ,
203- 'title' : 'Software Engineer' ,
204- 'department' : 'Engineering' ,
205- 'salary' : 5000 ,
206- 'status' : 'active' ,
207- },
208- 'E002' : {
209- 'id' : 'E002' ,
210- 'name' : 'Jane Smith' ,
211- 'email' : 'jane.smith@example.com' ,
212- 'phone' : '987-654-3210' ,
213- 'title' : 'Product Manager' ,
214- 'department' : 'Product' ,
215- 'salary' : 6500 ,
216- 'status' : 'active' ,
217- },
218- }
219-
220-
221- # 1. GPS定位
222- @app .route ('/gps' , methods = ['GET' ])
223- def get_location ():
224- # 这里需要调用GPS定位的API,获取用户的经纬度信息
225- # 由于GPS定位需要在移动设备上才能实现,这里我们只返回一个模拟数据
226- location = {'latitude' : 31.2304 , 'longitude' : 121.4737 }
227- return jsonify (location )
228-
229-
230- # 2. EPF (Employee Provident Fund) 公积金计算
231- @app .route ('/epf' , methods = ['POST' ])
232- def calculate_epf ():
233- data = request .get_json (silent = True ) or {}
234- if 'salary' not in data :
235- raise BadRequest ('Missing field: salary' )
236- try :
237- salary = float (data .get ('salary' ))
238- except (TypeError , ValueError ):
239- raise BadRequest ('Invalid salary' )
240-
241- # EPF的计算逻辑,这里假设员工和雇主各缴纳11%和13%
242- employee_contribution = round (salary * 0.11 , 2 )
243- employer_contribution = round (salary * 0.13 , 2 )
244- total_contribution = round (employee_contribution + employer_contribution , 2 )
245- return jsonify ({
246- 'employee_contribution' : employee_contribution ,
247- 'employer_contribution' : employer_contribution ,
248- 'total_contribution' : total_contribution
249- })
250-
251-
252- # 3. PERKESO (Social Security Organization) 社险计算
253- @app .route ('/perkeso' , methods = ['POST' ])
254- def calculate_perkeso ():
255- data = request .get_json (silent = True ) or {}
256- if 'salary' not in data :
257- raise BadRequest ('Missing field: salary' )
258- try :
259- salary = float (data .get ('salary' ))
260- except (TypeError , ValueError ):
261- raise BadRequest ('Invalid salary' )
262-
263- # PERKESO的计算逻辑,具体费率需要参考官方数据
264- employee_contribution = round (salary * 0.005 , 2 )
265- employer_contribution = round (salary * 0.01 , 2 )
266- total_contribution = round (employee_contribution + employer_contribution , 2 )
267- return jsonify ({
268- 'employee_contribution' : employee_contribution ,
269- 'employer_contribution' : employer_contribution ,
270- 'total_contribution' : total_contribution
271- })
272-
273-
274- # 4. PCB (Potongan Cukai Bulanan) 月度所得税计算
275- @app .route ('/pcb' , methods = ['POST' ])
276- def calculate_pcb ():
277- data = request .get_json (silent = True ) or {}
278- if 'salary' not in data :
279- raise BadRequest ('Missing field: salary' )
280- try :
281- salary = float (data .get ('salary' ))
282- except (TypeError , ValueError ):
283- raise BadRequest ('Invalid salary' )
284-
285- # PCB的计算逻辑非常复杂,需要参考LHDN的官方指南
286- # 这里我们只返回一个模拟数据
287- pcb = round (salary * 0.1 , 2 )
288- return jsonify ({'pcb' : pcb })
289-
290-
291- # 5. 打卡功能
292- @app .route ('/clock_in' , methods = ['POST' ])
293- def clock_in ():
294- data = request .get_json (silent = True ) or {}
295- employee_id = data .get ('employee_id' )
296- if not employee_id :
297- raise BadRequest ('Missing field: employee_id' )
298- # 这里需要记录打卡的时间和地点
299- return jsonify ({'message' : 'Clock in successful' })
300-
301-
302- # 6. 考勤表
303- @app .route ('/attendance' , methods = ['GET' ])
304- def get_attendance ():
305- employee_id = request .args .get ('employee_id' )
306- if not employee_id :
307- raise BadRequest ('Missing query param: employee_id' )
308- # 这里需要从数据库中查询考勤记录
309- attendance_records = [
310- {'date' : '2023-11-01' , 'clock_in' : '09:00' , 'clock_out' : '18:00' },
311- {'date' : '2023-11-02' , 'clock_in' : '09:05' , 'clock_out' : '17:55' }
312- ]
313- return jsonify (attendance_records )
314-
315-
316- # 7. 个人Payroll,加入Advance
317- @app .route ('/payroll' , methods = ['GET' ])
318- def get_payroll ():
319- employee_id = request .args .get ('employee_id' )
320- if not employee_id :
321- raise BadRequest ('Missing query param: employee_id' )
322- # 这里需要从数据库中查询Payroll记录
323- payroll_data = {
324- 'salary' : 5000 ,
325- 'epf' : 550 ,
326- 'perkeso' : 50 ,
327- 'pcb' : 500 ,
328- 'advance' : 200 ,
329- 'net_salary' : 4600
330- }
331- return jsonify (payroll_data )
332-
333-
334- # 8. Advance 预支工资
335- @app .route ('/advance' , methods = ['POST' ])
336- def request_advance ():
337- data = request .get_json (silent = True ) or {}
338- employee_id = data .get ('employee_id' )
339- amount = data .get ('amount' )
340- if not employee_id :
341- raise BadRequest ('Missing field: employee_id' )
342- try :
343- amount = float (amount )
344- except (TypeError , ValueError ):
345- raise BadRequest ('Invalid amount' )
346- # 这里需要记录预支工资的请求
347- return jsonify ({'message' : 'Advance request submitted' })
348-
349-
350- # 9. 个人资料
351- @app .route ('/profile' , methods = ['GET' ])
352- def get_profile ():
353- employee_id = request .args .get ('employee_id' )
354- if not employee_id :
355- raise BadRequest ('Missing query param: employee_id' )
356- # 这里需要从数据库中查询个人资料
357- profile_data = {
358- 'name' : 'John Doe' ,
359- 'email' : 'john.doe@example.com' ,
360- 'phone' : '123-456-7890'
361- }
362- return jsonify (profile_data )
363-
364-
365- # 9.1 员工管理(Employee Management)
366- @app .route ('/employees' , methods = ['GET' ])
367- def list_employees ():
368- # 返回所有员工列表
369- return jsonify (list (employees .values ()))
370-
371-
372- @app .route ('/employees/<employee_id>' , methods = ['GET' ])
373- def get_employee (employee_id ):
374- emp = employees .get (employee_id )
375- if not emp :
376- return jsonify ({'error' : f'Employee { employee_id } not found' }), 404
377- return jsonify (emp )
378-
379-
380- @app .route ('/employees' , methods = ['POST' ])
381- def create_employee ():
382- data = request .get_json (silent = True ) or {}
383- employee_id = data .get ('id' ) or data .get ('employee_id' )
384- if not employee_id :
385- raise BadRequest ('Missing field: id' )
386- if employee_id in employees :
387- return jsonify ({'error' : f'Employee { employee_id } already exists' }), 409
388-
389- # 基础字段
390- new_emp = {
391- 'id' : employee_id ,
392- 'name' : data .get ('name' , '' ),
393- 'email' : data .get ('email' , '' ),
394- 'phone' : data .get ('phone' , '' ),
395- 'title' : data .get ('title' , '' ),
396- 'department' : data .get ('department' , '' ),
397- 'salary' : data .get ('salary' , 0 ),
398- 'status' : data .get ('status' , 'active' ),
399- }
400- employees [employee_id ] = new_emp
401- return jsonify (new_emp ), 201
402-
403-
404- @app .route ('/employees/<employee_id>' , methods = ['PUT' ])
405- def update_employee (employee_id ):
406- emp = employees .get (employee_id )
407- if not emp :
408- return jsonify ({'error' : f'Employee { employee_id } not found' }), 404
409- data = request .get_json (silent = True ) or {}
410- # 更新允许的字段
411- for key in ['name' , 'email' , 'phone' , 'title' , 'department' , 'salary' , 'status' ]:
412- if key in data :
413- emp [key ] = data [key ]
414- employees [employee_id ] = emp
415- return jsonify (emp )
416-
417-
418- @app .route ('/employees/<employee_id>' , methods = ['DELETE' ])
419- def delete_employee (employee_id ):
420- if employee_id not in employees :
421- return jsonify ({'error' : f'Employee { employee_id } not found' }), 404
422- deleted = employees .pop (employee_id )
423- return jsonify ({'message' : 'Deleted' , 'employee' : deleted })
424-
425-
426- # 10. 聊天功能
427- @app .route ('/chat' , methods = ['POST' ])
428- def send_message ():
429- data = request .get_json (silent = True ) or {}
430- sender_id = data .get ('sender_id' )
431- receiver_id = data .get ('receiver_id' )
432- message = data .get ('message' )
433- if not sender_id or not receiver_id or not message :
434- raise BadRequest ('Missing sender_id, receiver_id or message' )
435- # 这里需要将消息保存到数据库中,并通知接收方
436- return jsonify ({'message' : 'Message sent' })
437-
438-
439- # 11. 语言翻译
440- @app .route ('/translate' , methods = ['POST' ])
441- def translate_text ():
442- data = request .get_json (silent = True ) or {}
443- text = data .get ('text' )
444- target_language = data .get ('target_language' )
445- if not text or not target_language :
446- raise BadRequest ('Missing text or target_language' )
447- # 这里需要调用翻译API,将文本翻译成目标语言
448- # 这里我们只返回一个模拟数据
449- translated_text = f'Translated to { target_language } : { text } '
450- return jsonify ({'translated_text' : translated_text })
451-
452-
453- @app .errorhandler (BadRequest )
454- def handle_bad_request (err ):
455- return jsonify ({'error' : str (err )}), 400
456-
457-
458- @app .route ('/healthz' )
459- def healthz ():
460- return jsonify ({'status' : 'ok' })
461-
462-
463- if __name__ == '__main__' :
464- # For local development; in production, use gunicorn with wsgi:app
465- app .run (host = '0.0.0.0' , port = 8000 , debug = True )
466188
467189
468190if __name__ == '__main__' :
0 commit comments