B
    òÕÄc9›  ã               @   sX  d dl Z d dlZd dlZd dlZd dlZd dlmZ d dlmZ d dl	m
Z
 d dlmZ d dlmZ d dlmZ d dlmZ d d	lmZ d d
lmZ d dlmZmZ d dlmZ eeƒZdZdZdZ dZ!dZ"dd„ Z#ej$ddddd„ ƒZ%ej$ddddd„ ƒZ&ej$ddddd„ ƒZ'ej$dddd d!„ ƒZ(dqd"d#„Z)ej$dd$ddrd%d&„ƒZ*d'd(„ Z+d)d*„ Z,ed+d,d-d.d/„ ƒZ-d0d1„ Z.ej$dd2de#d3d4„ ƒƒZ/ej$dd5dej 0¡ fd6d7„ƒZ1ej$dd8dd9d:„ ƒZ2ej$dd;dd<d=„ ƒZ3ej$dd>de#dsd@dA„ƒƒZ4ej$ddBde#dCdD„ ƒƒZ5ej$ddEde#dFdG„ ƒƒZ6ej$ddHddIdJ„ ƒZ7ej$ddKde#dtdLdM„ƒƒZ8ej$ddNde#dOdP„ ƒƒZ9ej$ddQde#dRdS„ ƒƒZ:ej$dTdUd-e#dVdW„ ƒƒZ;ej$ddXde#dYdZ„ ƒƒZ<ej$dd[de#d\d]„ ƒƒZ=ej$d^d_e#d`da„ ƒƒZ>ej$dbd_e#dcdd„ ƒƒZ?eed d dedfd-dgdh„ ƒZ@didj„ ZAdkdl„ ZBedmdnd-dodp„ ƒZCdS )ué    N)Úsettings)Úcache)Ú
connection)Úperiodic_task)Úget_task_logger)Úcrontab)Ú
celery_app)ÚTransaction)Ú	formatPIN)ÚtempFileÚcustomSqlEx)ÚgetSQL_insert_newéd   Zemp_change_flag_Zchanged_scan_times_Zchanged_scan_time_Zdata_sync_started_c                s   ‡ fdd„}|S )Nc           
      sN   ˆ | |Ž}yt  ¡  t  ¡  W n* tk
rH } zt|ƒ W d d }~X Y nX |S )N)r   ÚcommitÚcloseÚ	ExceptionÚprint)ÚargsÚkwargsÚretÚe)Úfunc© ú,G:\easytimepro\master/mysite/iclock\tasks.pyÚwrapper"   s    
z$close_db_connection.<locals>.wrapperr   )r   r   r   )r   r   Úclose_db_connection!   s    	r   Tz iclock.tasks.write_att_into_file)ZbindÚnamec       	      C   s†   ddl m} ddlm} tj |d¡}tt 	¡ ƒ|j
 }tj ||¡}tj |¡s\t |¡ t|dƒ}| tj||d¡ | ¡  d S )Nr   )ÚJSONEncoder)ÚADDITION_FILE_ROOTz	att_data/Úa)Úcls)Úmysite.utilsr   Zmysite.settingsr   ÚosÚpathÚjoinÚstrÚuuidZuuid4ÚsnÚexistsÚmakedirsÚopenÚwriteÚjsonÚdumpsr   )	ÚtaskÚdeviceÚparamsr   r   Zatt_data_pathZatt_data_file_nameZatt_file_pathÚfr   r   r   Úwrite_att_into_file.   s    

r2   z"iclock.tasks.real_time_transactionc             C   s   dS )a  
    Real-time transaction interface
    :param task:
    :param device: Device instance(Getting from cache)
    :param emp: Employee instance(Getting from cache)
    :param line: transaction
    :param params: parameter sorted form line (Dict)
    :return:
    Nr   )r.   r/   ÚempÚliner0   r   r   r   Úreal_time_transaction<   s    r5   ziclock.tasks.device_log_uploadc             C   s   dS )z›
    Device operation log interface
    :param task:
    :param fields:  4      0       2018-04-14 14:24:50     0       0       0       0
    :return:
    Nr   )r.   r/   Úfieldsr   r   r   Údevice_log_uploadJ   s    r7   ziclock.tasks.device_user_uploadc             C   s   dS )aW  
    Device user upload interface
    :param task:
    :param device: Device instance
    :param pin: Employee code
    :param emp: Employee instance
    :param fields: The data upload from device
    {'TZ': '0001000100000000', 'Name': 'ARVIN', 'Grp': '1', 'Passwd': '', 'Verify': '-1', 'PIN': '2789', 'Pri': '0', 'Card': ''}
    :return:
    Nr   )r.   r/   Úpinr3   r6   r   r   r   Údevice_user_uploadU   s    r9   c             C   s  ddl m} ddlm} ddlm} ddlm} ddlm	} t
j tjd¡}t
j |¡s\d S t
 |¡}t|ƒdkrvd S xœ|D ]’}| d¡d }	|jj|	d	}
|
s¦q~|
d }tt
j ||¡d
ƒ"}| ¡ }| ¡  | ¡  ¡ }W d Q R X |st
 t
j ||¡¡ d S g }tj ¡ }i }xœtdt|ƒtƒD ]†}|||t … }xl|D ]b}| d¡}||d  ¡ ƒ}d }||kr„|| }nFy|j||j d}|||< W n( t!k
rÈ } zwLW d d }~X Y nX ytj "|d d¡}W n t!k
rú   wLY nX |sqLn¦t#jj||d $¡ }|r&qL|j%}|j&||d |d |j'|j(|j)j*|d d|||j+|j+ddœ}y |t#j,j-|ƒ\}}|||ƒ W n$ t!k
r¬ } zW d d }~X Y nX qLW q.W yJt
 t
j ||¡¡ t.dtj ¡  /d¡ dtj ¡  /d¡d| f ƒ W q~   Y q~X q~W d S )Nr   )Ú
format_pin)ÚEmployee)ÚTerminal)r   )r   Zusb_dataÚ_)r'   Úrú	)Ú
company_idé   z%Y-%m-%d %H:%M:%S)r3   Ú
punch_timeé   é   é   Ú )Úemp_coderB   Úpunch_stateÚverify_typeÚterminal_snÚterminal_aliasÚ
area_aliasÚ	work_codeÚcrcÚupload_timeÚpurposeÚemp_idÚterminal_idÚsourcez
job_%s.txtz%Y%mz%s %sz%Y%m%d%H%M%Sz%s upload done )0Úmysite.personnel.utilsr:   Úmysite.personnel.modelsr;   Úmysite.iclock.modelsr<   Úmysite.core.zktoolsr   r!   r   r"   r#   r$   r   r   r(   ÚlistdirÚlenÚsplitÚobjectsÚfilterr*   Úreadr   ÚstripÚ
splitlinesÚremoveÚdatetimeÚnowÚrangeÚBATCHÚobjByPINr@   r   Ústrptimer	   ÚcountÚproduct_typerG   r'   ÚaliasÚareaÚ	area_nameÚpkZ_metaÚdb_tabler   Ústrftime)Úufiler:   r;   r<   r   r   Z
store_pathÚfilesr1   r'   Údevr/   ZrfZrdataÚdataZbulkrb   Zemp_dictÚiZrsr>   ÚcolsrG   r3   r   rB   ZtsrP   ZlogDictÚsqlr0   r   r   r   Útransaction_from_file2dbd   s‚    
 




"rv   z*iclock.tasks.save_transaction_from_file2dbc             C   s   t |ƒ d S )N)rv   )r.   ro   r   r   r   Úsave_transaction_from_file2db¶   s    rw   c             C   s¤   ddl m}m}m}m} |j ¡ }x|D ]}|| |ƒ q(W |j ¡ }x|D ]}	|| |	ƒ qJW |j ¡ }
x|
D ]}|| |ƒ qlW |j	 ¡ }x|D ]}|| |ƒ qŽW d S )Nr   )Údelete_acc_holidayÚdelete_acc_groupÚdelete_combinationÚdelete_timezone)
Zmysite.acc.utilsrx   ry   rz   r{   Zacctimezone_setÚallZaccholiday_setZaccgroups_setZacccombination_set)r/   Zpre_arearx   ry   rz   r{   Z	timezonesÚtimezoneZholidaysZholidayÚgroupsÚgroupÚcombinationsZcombinationr   r   r   Údelete_access_data»   s    







r   c             C   sæ  ddl m} ddlm}m} ddlm} tj ¡ }d}| j	}|rF|j
rJd S | jsTd S t dj| jd| j¡}	|	s~t dd	d	¡}	td
| j|	f ƒ tjt| d	dd g }
|jj|	||gd ¡ }|jj|	|gdjdd ¡ }|jj|	|gdjdd ¡ }|	jdkr4|j| jdd}|j| jd}|j| jd}|rLt|jdddƒ}
t|jddd ¡ ƒ}t|jddd ¡ ƒ}| |¡ x8|D ]0}||
ksˆ| ¡ |
kr¨qˆ|
 | ¡ ¡ qˆW tt|
ƒƒ}
tdt|
ƒ ƒ |
r¼tdtj ¡   d¡ dtj ¡   d¡d| jt|
ƒf f ƒ |  !|¡ | j"dgd  x„t#t$t|
ƒd	 d d	 ƒƒD ]d}|
|d |d	 d … }|rPtjt| d	d!d |jj|d"}|| d#|d d	d	d	d	d	d	dd$ qPW d}|rÞ|  !|¡ | j"dgd  | S d S d S )%Nr   )Úzk_set_data)ÚBioDataÚBioPhoto)r;   Fzpush_time_{sn})r'   iÐ  rA   zdata_sync--sn=%s----stamp=%siX  )Útimeout)Úupdate_time__gtZupdate_time__lteZarea__in)r†   Úemployee__area__inr   )Zemployee__status)Zapproval_time__gtr‡   im  )Ú	enroll_snÚreserved)rˆ   ÚidT)ÚflatZemployeezdata_sync--employee count=%sztasks_%s.txtz%Y%mz%s %sz%Y%m%d%H%M%Sz%s data-sync employee count=%sÚ	push_time)Úupdate_fieldsi,  )Úid__inZuserinfo)ZcmdTimeZ	is_fingerZis_faceZis_picZis_pvZis_fvZis_biophotoÚactive_async)%Úmysite.core.zkcmdprocr‚   rV   rƒ   r„   rU   r;   ra   rb   rj   Z
is_defaultÚplatformr   ÚgetÚformatr'   rŒ   r   ÚsetÚSYNCINGr[   r\   ZdistinctZexcludeZyearÚlistÚvalues_listÚextendÚlowerÚappendrY   r   rn   Zset_push_timeÚsaverc   Úint)r/   r@   r‚   rƒ   r„   r;   ÚntZupdate_flagrj   ZstampZempidsÚempsZbiodatasZ	biophotosZbio_empsZ
photo_empsZbio_emprs   Zeidsr   r   r   Ú	data_syncÎ   sh    

 

(
"
rŸ   é   z"iclock.tasks.data_sync_gard_circle)Z	run_everyr   c              C   sp   ddl m}  | j ¡ }tjdkrNtdtj ¡  	d¡ dtj ¡  	d¡df ƒ x|D ]}t
t|jƒd	 qTW d S )
Nr   )ÚDeviceConfigrA   ztasks_%s.txtz%Y%mz%s %sz%Y%m%d%H%M%Szbegin to sync )r@   )rV   r¡   r[   r|   r   ÚDEBUGr   ra   rb   rn   Údata_sync_guardr%   r@   )r¡   Zconfig_queryZconfigr   r   r   Údata_sync_gard_circle  s    


r¤   c             C   sŽ  ddl m} ddlm}m} ddlm} ddlm} t	j	 
¡ }t t|  ¡}|rTdS |dd| d	}|s¦td
ƒ tjr¢tdt	j	 
¡  d¡ dt	j	 
¡  d¡df ƒ dS |jj| d	}	g }
tdt	j	 
¡  ƒ x˜|	D ]}| ¡ |j|j|jfkrÐ||jƒ}y t|| ƒ}|r|
 |j¡ W qÐ tk
r^ } z(t t|  d¡ t t|  |¡ t|ƒS d }~X Y qÐX qÐW t t|  d¡ t t|  |¡ d  |
¡S )Nr   )Úconst)Ú	getDeviceÚget_company)Úget_comm_setting)r<   rF   Zenable_synchronization_datarA   )r@   zdata_sync_guard-auto sync=Falseztasks_%s.txtz%Y%mz%s %sz%Y%m%d%H%M%Sz%enable_synchronization_data is False z'begin to run sync employee to device %sú,)!Úmysite.iclockr¥   Úmysite.iclock.utilsr¦   r§   Zmysite.iclock.comm.utilsr¨   rV   r<   ra   rb   r   r’   r•   r   r   r¢   r   rn   r[   r\   ZgetDynStateÚTERMINAL_NORMALÚTERMINAL_UPLOADÚTERMINAL_COMMUNICATIONr'   rŸ   rš   r   r”   Ú	SCAN_TIMEr%   r$   )r@   r¥   r¦   r§   r¨   r<   rb   Z
processingZ	auto_syncZdevicesZ	synced_snrq   r/   r   r   r   r   r   r£     s@    



r£   ziclock.tasks.save_device_logc       	      C   sÈ   ddl m} y| d¡}tj |d d d… d¡}|d dkrš|jj||d ¡ }|sš|||j|d	 |d ||d
 |d |d |d tj 	¡ d
}| 
¡  |S  tk
rÂ } zt|ƒS d }~X Y nX d S )Nr   )ÚTerminalLogr?   é   é   z%Y-%m-%d %H:%M:%S)rC   Ú3)ÚterminalÚaction_timerA   rC   rD   rE   é   )
r´   Úterminal_tzZadminZaction_namerµ   ÚobjectZparam1Zparam2Zparam3rO   )rV   r°   rZ   ra   rf   r[   r\   rg   r·   rb   r›   r   r%   )	r.   r/   r6   r°   rt   Zlog_timer(   Úobjr   r   r   r   Úsave_device_log\  s    
rº   z#iclock.tasks.save_device_upload_logc       	      C   sN   ddl m} ||||||dœ}y|f |Žjdd W n tk
rH   Y nX d S )Nr   )ÚTerminalUploadLog)rR   Zupload_countZerror_countÚcontentrO   ZeventT)Úforce_insert)rV   r»   r›   r   )	r.   r´   ZcntZecntr¹   ÚoprO   r»   ÚdDictr   r   r   Úsave_device_upload_logr  s    	
rÀ   z iclock.tasks.save_device_capturec       
   
   C   sÆ   ddl m} | dd¡}|d|d d… |f d|ƒ}yt tj |¡d ¡ W n" tk
rp } zW d d }~X Y nX |rºt| 	dd¡ƒd	krºt
|d
ƒ }|d dd … }	| |	¡ W d Q R X dj|dS )Nr   )ÚgetUploadFileNameú:ú-z%s/%sr¶   rF   Úsizeiè  ÚwbrA   zEmployee {emp} photo saved)r3   )r!   rÁ   Úreplacer"   r)   r#   rZ   r   rœ   r’   r*   r+   r“   )
r.   rG   r¼   r'   r0   rÁ   Úfnamer   r1   Údr   r   r   Úsave_device_capture‡  s    rÉ   z iclock.tasks.save_employee_photoc          
   C   sÎ   ddl m} |d  d¡}|jjj ¡ }d|t|d ƒ|d f }d|ƒ |f }t 	|d ¡}t
|d	ƒ}	|	 |¡ W d Q R X yd
|ƒ |f }t |¡ W n" tk
r¼ }
 zW d d }
~
X Y nX dj||jdS )Nr   )ÚphotoDirZFileNameÚ.z%s_%s.%srA   z%s/%sZContentrÅ   z%s/thumbnail/%szUpload {file} from {sn})Úfiler'   )r!   rÊ   rZ   rj   Úcompanyr   r™   r
   Úbase64Ú	b64decoder*   r+   r"   r`   r   r“   r'   )r.   r/   r6   rÊ   ÚfnZcompany_nameÚ	file_namerÇ   Zls_fr1   r   r   r   r   Úsave_employee_photo™  s    rÒ   ziclock.tasks.prepare_commandéÈ   c             C   s¤  ddl m}m} ddlm} ddlm} ddlm}m} t	|t
ƒrFd S t |jtj|jf ¡}	|	rz|j|j|j|jfkr tj ¡ }
|
tjdd }|jj||
dd	 |dd
||dB ¡ d¡d tj… }| ddd¡}g }d}x‚|D ]z}t|d ƒ}||jkr$|jj|d dj|
|
|d qè|| |jkr6P |  |d |d |d pRddœ¡ ||7 }qèW |rŒt !|j"j#|j$d||j%d ¡ dj#|j$t|ƒdS d S )Nr   )ÚQÚCount)ÚTerminalCommand)r¥   )Ú	cache_keyr¥   i  )ÚsecondsT)r´   Zcommit_time__lteZreturn_time__isnull)Ztransfer_time__isnull)Ztransfer_time__gtrŠ   r¼   Útransfer_time)rŠ   )rÙ   Úreturn_timeÚreturn_valuerF   )rŠ   r¼   Ztransfer)r'   i,  zCommand count:{sn} - {count})r'   rg   )&Zdjango.db.modelsrÔ   rÕ   rV   rÖ   Zmysite.iclock.commr¥   rª   r×   Ú
isinstancer–   r   r’   ZTERMINAL_WITHOUT_CMDr   ZUNITrŠ   Ústater¬   r®   r­   ra   rb   Ú	timedeltar[   r\   Úorder_byZPREPARE_CMD_SIZEÚvaluesrY   ZMAX_CMD_DATA_SIZEÚupdaterš   r”   ZTERMINAL_CMDr“   r'   Z	heartbeat)r.   r/   rÄ   rÔ   rÕ   rÖ   Úcr×   r¥   Zhas_cmdrb   Zvalid_periodZcmdsZcommandsZ
ready_cmdsZ	total_cmdÚcmdZnew_cmdr   r   r   Úprepare_command½  sB    


 rä   z"iclock.tasks.update_command_resultc          
   C   s`   ddl m} y(|jj|dj|dd djt|ƒdS  tk
rZ } zt|ƒS d }~X Y nX d S )Nr   )rÖ   )rŽ   )rÚ   rÛ   z{count} commands updated.)rg   )	rV   rÖ   r[   r\   rá   r“   rY   r   r%   )r.   rã   rÚ   rÖ   r   r   r   r   Úupdate_command_resultä  s    rå   z(iclock.tasks.update_command_error_resultc          
   C   s¢   ddl m} yj|jj|d ¡ }|s(d S |jp0d}t|ƒdkr\|dk r\|d |_| ¡  d S ||_||_|jdd	 d
S  t	k
rœ } zt|ƒS d }~X Y nX d S )Nr   )rÖ   )rŠ   i'  z-10i'  rA   )rÚ   rÛ   )r   zCommands updated.)
rV   rÖ   r[   r\   ÚfirstrÛ   r%   r›   rÚ   r   )r.   Zcmd_idÚresultrÚ   rÖ   rã   Zrepeat_counterr   r   r   r   Úupdate_command_error_resultï  s     

rè   z#iclock.tasks.upload_all_data2devicec          
   K   s†   ddl m} ddlm} y,||jƒ}|s,i }d|d< |||f|Ž W n, tk
rp } ztd|ƒ W d d }~X Y nX t d|j ¡ d S )Nr   )Úzk_set_user_data)r¦   r   Úupload_data2devicezsync_data_to_device_%s)	r   ré   r«   r¦   r'   r   r   r   Údelete)r.   r/   rž   r   ré   r¦   rq   r   r   r   r   rê   )  s    
rê   ziclock.tasks.upload_employeec       	      C   sä   ddl m} ddlm} dj|jd}|rRt||ƒrR||j|ƒ dj|j|jdS |rš|jj	|dj
d	d
d}x|D ]}||j|ƒ qtW dj|j|jdS |jj	|j ¡ dj
d	d
d}x|D ]}||j|ƒ q¾W dj|jdS d S )Nr   )ÚsaveCmd)r<   zDATA QUERY USERINFO PIN={pin})r8   zUpload {pin} from device({sn}))r8   r'   )rj   rl   T)r‹   zUpload {pin} from area({area}))r8   rj   zUpload {pin} from device)r!   rì   rV   r<   r“   rG   rÜ   rl   r[   r\   r—   rŠ   rk   rj   r|   )	r.   r3   r/   rj   rì   r<   rã   Zdevsrq   r   r   r   Úupload_employee:  s    

rí   z#iclock.tasks.transaction_correctionc             C   sP   ddl m} djt|ƒd d… t|ƒd d… d}||j|ƒ dj|||jdS )Nr   )rì   z1VERIFY SUM ATTLOG StartTime={start}	EndTime={end}r²   )ÚstartÚendz>Verify summary transactions between {start} and {end} for {sn})rî   rï   r'   )r!   rì   r“   r%   rl   r'   )r.   r/   rî   rï   rì   rã   r   r   r   Útransaction_correctionO  s    "rð   z+iclock.tasks.transaction_correction_recheckc          	   C   s¾   ddl m} ddlm}m} |d d d… |d d d…  }}|jj|j||fd ¡ }d}	| 	d| 	d	d¡¡}
|t
|
ƒk ršd
}	dj||d}||j|ƒ ||tj ¡ |||
||	d ¡  d S )Nr   )rì   )r	   ÚTransactionProofCmdZ	StartTimer²   ZEndTime)rJ   Zpunch_time__rangeZ	AttlogSumZAttlogCountéÿÿÿÿz1DATA QUERY ATTLOG StartTime={start}	EndTime={end})rî   rï   )r´   rµ   Z
start_timeZend_timeZterminal_countZserver_countÚflag)r!   rì   rV   r	   rñ   r[   r\   r'   rg   r’   rœ   r“   rl   ra   rb   r›   )r.   r/   r0   rì   r	   rñ   rî   rï   Zstore_countró   Z	dev_countrã   r   r   r   Útransaction_correction_recheck[  s    "rô   i  ziclock.tasks.authorized_devicec             C   s*   ddl m} |j ¡  ¡ }t d|¡ d S )Nr   )r<   Zdevice_limit)rV   r<   r[   r|   rg   r   r”   )r.   r<   Ztotal_terminalsr   r   r   Úauthorized_devicem  s    rõ   z&iclock.tasks.update_terminal_parameterc       
      C   s¼   ddl m} | ¡ }|jj||djddd}t|ƒt|ƒ }x:|D ]2}||||| d}y| ¡  W qD   wDY qDX qDW d}	|	|kr¸x0|D ](}||krŒ|jj||d	j|| d
 qŒW dS )z¢
    update device parameters when device information upload
    :param task:
    :param device: device instance
    :param params: type -> dict
    :return:
    r   )ÚTerminalParameter)r´   Zparam_name__inÚ
param_nameT)r‹   )r´   r÷   Úparam_valueZ	IPAddress)r´   r÷   )rø   N)	rV   rö   Úkeysr[   r\   r—   r”   r›   rá   )
r.   r/   r0   rö   rù   Zdb_keysZinsert_keysÚkeyÚtpZ
update_keyr   r   r   Úupdate_terminal_parameteru  s"    


rü   ziclock.tasks.get_terminal_filec             C   s(   ddl m} dj|d}||j|ƒ dS )zˆ
    Download the file from device
    :param task:
    :param device: Device
    :param file_path: The path in device
    :return:
    r   )rì   zGetFile {path})r#   N)r!   rì   r“   rl   )r.   r/   Ú	file_pathrì   rã   r   r   r   Úget_terminal_file’  s    
rþ   ziclock.tasks.save_error_log)r   c             C   sÀ   ddl m} yˆ|| t| dd¡p"dƒd d… t| dd¡p<dƒd d… | dd¡pTdt| d	d¡pddƒd d… t | d
d¡p€d¡|djdd W n& tk
rº } zt|ƒS d }~X Y nX d S )Nr   )ÚErrorCommandLogZErrCoderF   é   Ú	error_msgé2   Z
DataOriginZCmdIdZ
Additional)r´   Z
error_coder  Zdata_originrã   Z
additionalrO   T)r½   )rV   rÿ   r%   r’   rÎ   rÏ   r›   r   )r/   r6   r   rÿ   r   r   r   r   Úsave_error_log¡  s    r  ziclock.tasks.employee_filterc             C   sr   ddl m}m} ddlm} ddlm} y0| | |j¡}|j	||fkrV||| 
¡ gƒ W n tk
rl   Y nX d S )Nr   )ÚSTATUS_RESIGNÚSTATUS_INVALID)Údelete_users_data)r;   )Zmysite.admin.modelsr  r  Zmysite.core.commr  rU   r;   re   r@   Ústatusr8   r   )r8   r/   r  r  r  r;   r3   r   r   r   Úemployee_filter²  s    r  )ZhourZminuteziclock.tasks.data_cleanc              C   s0   ddl m}  | j ¡ }x|D ]}t|ƒ qW d S )Nr   )ÚCompany)Zmysite.cloud.modelsr	  r[   r|   Údata_clean_operate)r	  Z	companiesrÍ   r   r   r   Ú
data_cleanÀ  s    

r  c             C   sf  ddl m}m}m}m}m} tdtj ¡  	d¡ dtj ¡  	d¡df ƒ |j
j| d ¡ }tj ¡ }|rbd	|j  kr‚d
k r¨n n"|j
j|tj|jd | d ¡  d|j  kr¾d
k rän n"|j
j|tj|jd | d ¡  d|j  krüd
k r"n n"|j
j|tj|jd | d ¡  d|j  kr<d
k rbn n"|j
j|tj|jd | d ¡  d S )Nr   )r¡   r	   rÖ   r°   r»   ztasks_%s.txtz%Y%mz%s %sz%Y%m%d%H%M%Sz
data-clean)rÍ   éZ   i'  )Zdays)Úpunch_time__ltrÍ   é   )Zcommit_time__ltÚterminal__company)Zupload_time__ltr  )rV   r¡   r	   rÖ   r°   r»   r   ra   rb   rn   r[   r\   ræ   Ztransaction_retentionrÞ   rë   Zcommand_retentionZdev_log_retentionZupload_log_retention)rÍ   r¡   r	   rÖ   r°   r»   Zdcrb   r   r   r   r
  È  s$    
r
  c              C   s²  t  d¡} | rdS d}tjd }t  d¡}|r4|}nltj |¡r‚t|dƒ}| ¡ }| 	¡  yt
|ƒ}td| ƒ W q    Y q X ntj ¡  d¡ ¡ }|r |j}tjj|d	 d
¡}t  d|¡ td| ƒ d}d}	d}
d}x&|D ]}|
d }
|j}i }|
d dkrt jdddd |j d¡|d< |j ¡ |d< |j|d< |jdd… |d< d|d< d|d< |j|d< y.t||ƒ\}}t||ƒ |	d }	t||ƒ W qä tk
r  } zDtd|ƒ tdtj ¡  d¡ dtj ¡  d¡d ||f f ƒ W dd}~X Y qäX qäW ||kr@|}t  d|¡ t|d!ƒ}|  t!|ƒ¡ | 	¡  td"tj ¡ |
|
|	 |f ƒ |
dkr¤tdtj ¡  d¡ dtj ¡  d¡d#|
|
|	 |f f ƒ t  "d¡ dS )$z°
        this task is working for sync tranasaction log to third db,now this function is vaccant
        you can change code for customization and uncomment @periodic_task
    Úis_syncing_transactionNr   z/log_stamp.datZlast_id_syncr>   z
file id=%sz-id)Úid__gtrŠ   zbegin to sync logs,id=%szupis.trtatndrA   r   éx   )r…   z%H%MZattimeZatdateZempnoéýÿÿÿZtrtnoró   ÚNr  ZlupdtÚtransaction_synczlogs_%s.txtz%Y%mz%s %sz%Y%m%d%H%M%Szlog_id=%s,info=%sÚwz.logs sync time=%s,count=%s,failed=%s,max id=%sz%log-sync count=%s,failed=%s,max id=%s)#r   r’   r   r   r"   r#   r(   r*   r]   r   rœ   r   r	   r[   r|   rß   ræ   rŠ   r\   r”   rB   rn   ÚdaterG   rJ   rO   r   r   r   r   ra   rb   r+   r%   rë   )Ú
is_syncingÚlast_idrÐ   Úid_Úfprr   r¹   Úobjsrm   Újrâ   Úmax_idÚtr¿   ru   r0   r   r   r   r   r  à  sz    







8


r  é   z)iclock.tasks.parallel_db_transaction_syncc        (         s|  ddl m} m} ddlm} ddlm} ddlm} ddl	m
} ddlm} tjdkrZd S t d	¡}|rld S | j ¡ }xô|D ]ê}	|	j}
d}tjd
|
  }t d|
 ¡}|r´|}nFtj |¡rút|dƒ}| ¡ }W d Q R X | ¡ rút|ƒ}td| ƒ |jj|
d}|sq~|	j|	j|	j |	j!|	j"|	j#|	j$dœ}|d oFt|d ƒ}||ddd}|s^q~t%jj|
|d &d¡}t 'd|
 |¡ td|
|t(j( )¡ f ƒ d}d } } }}||j*ƒ}||j+ƒ}||j,ƒ}xôt-|dƒD ]ä\}‰ |d dkrtj'd	ddd |rFˆ j.t(j/|d }ˆ j.}t%jj|
ˆ j0||d ¡ }|rFqÜ|rÜ|	rÜ|rÜ| 1¡ }|d } | j0ˆ j0i}!‡ fdd„}"|d dkrª| j2rÂˆ j. 3d ¡|!| j2< n| j2rÂˆ j. 4¡ |!| j2< | j.rô| j5dkræ|"d!ƒ|!| j.< n|"d"ƒ|!| j.< d#d$d%d&d'd(d)d*d+d,d-d.d/g}#x.|#D ]&}$t6| |$d0ƒ}|rt6ˆ |$ƒ|!|< qW | j7r`t8| ˆ j9¡ƒ|!| j7< | j:rÐˆ j;r¶ˆ j;j<|j=krœt8| t8ˆ j>ƒ¡ƒ|!| j:< nt8| ˆ j;j<¡ƒ|!| j:< nt8| t8ˆ j>ƒ¡ƒ|!| j:< | j?ròˆ j;rèˆ j;jnd |!| j?< | j@rˆ j.|!| j@< | jA}|||!ƒ\}%}&t|%|&ƒ zˆy| B|%|&¡ ˆ jC}|d }W nd tDk
r¨ }' zDtd1|'ƒ tEd2t(j( )¡  3d3¡ d4t(j( )¡  3d5¡d6||'f f ƒ W d d }'~'X Y nX W d | F¡  | G¡  X qÜW ||kr|}t 'd|
 |¡ t|d7ƒ}| Ht8|ƒ¡ | G¡  td8t(j( )¡ ||| ||
f ƒ |dkr~tEd2t(j( )¡  3d3¡ d4t(j( )¡  3d5¡d9||| ||
f f ƒ q~W t Id	¡ d S ):Nr   )Ú
ParallelDbÚParallelDBExport)Úget_connection)r   )Úchoices)Úbase_choices)ÚOrderedDictrA   r  z/log_stamp_%s.datzlast_id_sync_%sr>   z
file id=%s)r@   )ÚdatabaseÚ
ip_addressÚportÚdatabase_nameÚpasswordÚuserÚduplicate_punchr-  T)ÚtestZis_parallel_db)r@   r  rŠ   z:begin to sync transaction logs,company id=%s,id=%s,time=%srF   r   r  )r…   )rØ   )r@   rG   Zpunch_time__gter  c                s   ˆ j  | ¡S )N)rB   rn   )Útime_format)r  r   r   Úget_punch_timem  s    z4parallel_db_transaction_sync.<locals>.get_punch_timer'  Zoraclez%Y-%m-%dz%H:%M:%Sz%H:%MrJ   rI   rK   rL   rM   rO   rP   rQ   rR   rS   ZtemperatureZ	mask_flagrH   Fr  zlogs_%s.txtz%Y%mz%s %sz%Y%m%d%H%M%Szlog_id=%s,info=%sr  zBlogs sync done, time=%s,count=%s,failed=%s,max id=%s,company id=%sz3log-sync count=%s,failed=%s,max id=%s,company id=%s)JZmysite.base.modelsr!  r"  Zmysite.base.views.intergrationr#  rW   r   rª   r$  Úmysiter%  Úcollectionsr&  r   ZCLOUD_VERSIONr   r’   r[   r|   r@   r   r"   r#   r(   r*   r]   Ú	isnumericrœ   r   r\   r'  r(  r)  r*  r+  r,  r-  r	   rß   r”   ra   rb   ZVERIFY_TYPEZDEVICE_DIRECTIONZPUNCH_STATEÚ	enumeraterB   rÞ   rG   ÚcursorZ
punch_datern   r  r/  ÚgetattrÚverify_typesr%   rI   Úpunch_statesr´   Zdevice_directionZDEVICE_IN_OUTrH   Zterminal_ipZpunch_date_timeZ
table_nameZexecuterŠ   r   r   r   r   r+   rë   )(r!  r"  r#  r   r$  r%  r&  r  Zdatabase_datasZdatabase_dataZcurrent_company_idr  rÐ   r  r  rr   Zdatabase_table_datar0   r-  Zconnr  rm   r  râ   r  r7  Zdevice_directionsr8  ÚstZetZlogsr5  Z
table_datarÈ   r0  r6   Zfieldru   Zcolumn_valuer   r   )r  r   Úparallel_db_transaction_sync)  sæ    









(

r:  )N)N)rÓ   )NN)Dr"   rÎ   ra   r,   r&   Zdjango.confr   Zdjango.core.cacher   Z	django.dbr   Zcelery.taskr   Zcelery.utils.logr   Zcelery.schedulesr   r1  r   rV   r	   rT   r
   r!   r   r   rW   r   Ú__name__Úloggerrd   ZEMPLOYEE_CHANGED_KEYZ
SCAN_TIMESr¯   r•   r   r.   r2   r5   r7   r9   rv   rw   r   rŸ   r¤   r£   rº   rb   rÀ   rÉ   rÒ   rä   rå   rè   rê   rí   rð   rô   rõ   rü   rþ   r  r  r  r
  r  r:  r   r   r   r   Ú<module>   sˆ   
RC@$%
9

I