def update_user(emps): """ 更新服务器人员信息,使之与redis 同步 """ if emps: pin_dict = dict([(format_pin(e.get("PIN")), e) for e in emps]) emp_objs = Employee.all_objects.filter(PIN__in=pin_dict.keys()) db_emps_dict = emp_objs and dict([(e.PIN, e) for e in emp_objs]) or {} param_pins = pin_dict.keys() # redis 中存在的人员PIN db_pins = db_emps_dict.keys() # 数据库中存在的人员 insert_emps = set(param_pins) - set(db_pins) update_emps = set(db_pins) for e in insert_emps: if pin_dict.has_key(e): emp_dict = pin_dict.get(e) emp = Employee() emp = set_user(emp_dict, emp) emp.DeptID_id = 1 emp.from_dev = True try: super(Employee, emp).save() except IntegrityError: conn._rollback() conn.close() db_emps_dict[e] = Employee.all_objects.filter( PIN__exact=format_pin(emp_dict.get("PIN")))[0] update_emps.add(e) continue #保存卡 if emp_dict.has_key("Card"): if emp_dict.get("Card"): set_card(emp, emp_dict.get("Card")) '''保存区域''' save_area(emp.id, emp.PIN) for e in update_emps: if db_emps_dict.has_key(e) and pin_dict.has_key(e): emp_dict = pin_dict.get(e) emp = db_emps_dict.get(e) emp = set_user(emp_dict, emp) emp.from_dev = True super(Employee, emp).save() #保存卡 if emp_dict.has_key("Card"): if emp_dict.get("Card"): set_card(emp, emp_dict.get("Card")) '''更新''' save_area(emp.id, emp.PIN)
def doTransDB(cursor, opts, maxRow=10000, **filter): sqls = [] if filter: rows = Transaction.objects.filter(filter) else: rows = Transaction.objects.all()[:10] rows = rows[:maxRow].values() if len(rows) <= 0: return tail = opts['dexp_db_sql_tail'] head = opts['dexp_db_sql_head'] row_tail = '\n' row_fmt = opts['dexp_db_sql_trans'] has_alia = ("%(Device_Alias)" in row_fmt) has_alia = ("%(Device_Alias)" in row_fmt) has_state = ("%(State)" in row_fmt) has_verify = ("%(Verify)" in row_fmt) has_workcode = ("%(WorkCode)" in row_fmt) has_reserved = ("%(Reserved)" in row_fmt) has_userid = ("%(Employee_ID)" in row_fmt) if has_userid: userid_cache = {} emp_search_sql = opts['emp_search_sql'] if has_state: has_state = getTransState("c_state_", opts) if has_verify: has_verify = getTransState("c_verify_", opts) if has_workcode: has_workcode = getTransWC("c_wc_", opts) if has_reserved: has_reserved = getTransWC("c_rs_", opts) sqls.append(head) for r in rows: appendDevFields(r, 'SN_id', has_alia) appendTimeFields(r, "TTime_", r['TTime']) e = Employee.objByID(r['UserID_id']) r['PIN'] = e.PIN r['Employee_Name'] = e.EName r['TTime'] = ("%s" % r['TTime'])[:19] transKey(r, 'State', has_state) transKey(r, 'Verify', has_verify) transKey(r, 'WorkCode', has_workcode) transKey(r, 'Reserved', has_reserved) if has_userid: r['Employee_ID'] = searchUserID(cursor, r['PIN'], userid_cache, emp_search_sql) for c in r: if r[c] == None: r[c] = "" s = (row_fmt % r) sqls.append(s) sqls.append(tail) try_sql(cursor, sqls)
def doTransDB(cursor, opts, maxRow=10000, **filter): sqls=[] if filter: rows=Transaction.objects.filter(filter) else: rows=Transaction.objects.all()[:10] rows=rows[:maxRow].values() if len(rows)<=0: return tail=opts['dexp_db_sql_tail'] head=opts['dexp_db_sql_head'] row_tail='\n' row_fmt=opts['dexp_db_sql_trans'] has_alia=("%(Device_Alias)" in row_fmt) has_alia=("%(Device_Alias)" in row_fmt) has_state=("%(State)" in row_fmt) has_verify=("%(Verify)" in row_fmt) has_workcode=("%(WorkCode)" in row_fmt) has_reserved=("%(Reserved)" in row_fmt) has_userid=("%(Employee_ID)" in row_fmt) if has_userid: userid_cache={} emp_search_sql=opts['emp_search_sql'] if has_state: has_state=getTransState("c_state_", opts) if has_verify: has_verify=getTransState("c_verify_", opts) if has_workcode: has_workcode=getTransWC("c_wc_", opts) if has_reserved: has_reserved=getTransWC("c_rs_", opts) sqls.append(head) for r in rows: appendDevFields(r,'SN_id',has_alia) appendTimeFields(r, "TTime_", r['TTime']) e=Employee.objByID(r['UserID_id']) r['PIN']=e.PIN r['Employee_Name']=e.EName r['TTime']=("%s"%r['TTime'])[:19] transKey(r, 'State', has_state) transKey(r, 'Verify', has_verify) transKey(r, 'WorkCode', has_workcode) transKey(r, 'Reserved', has_reserved) if has_userid: r['Employee_ID']=searchUserID(cursor, r['PIN'], userid_cache, emp_search_sql) for c in r: if r[c]==None: r[c]="" s=(row_fmt%r) sqls.append(s) sqls.append(tail) try_sql(cursor, sqls)
def doTransExportData(opts, emps, fn): tail=opts['dexp_t_tail'] head=opts['dexp_t_head'] row_tail='\r\n' if opts['dexp_rowsp']=='rowsp13': row_tail='\n' elif opts['dexp_rowsp']=='rowsp10': row_tail='\r' row_fmt=opts['dexp_t_row'] has_alia=("%(Device_Alias)" in row_fmt) has_state=("%(State)" in row_fmt) has_verify=("%(Verify)" in row_fmt) has_workcode=("%(WorkCode)" in row_fmt) has_reserved=("%(Reserved)" in row_fmt) if has_state: has_state=getTransState("c_state_", opts) if has_verify: has_verify=getTransState("c_verify_", opts) if has_workcode: has_workcode=getTransWC("c_wc_", opts) if has_reserved: has_reserved=getTransWC("c_rs_", opts) f=file(fn, "a+b") try: if head: f.write(head+row_tail) for r in emps: appendDevFields(r,'SN_id',has_alia) appendTimeFields(r, "TTime_", r['TTime']) e=Employee.objByID(r['UserID_id']) r['PIN']=e.PIN r['Employee_Name']=e.EName r['TTime']=("%s"%r['TTime'])[:19] transKey(r, 'State', has_state) transKey(r, 'Verify', has_verify) transKey(r, 'WorkCode', has_workcode) transKey(r, 'Reserved', has_reserved) for c in r: if r[c]==None: r[c]="" s=(row_fmt%r)+row_tail f.write(s.encode('utf-8')) if tail: f.write(tail+row_tail) finally: f.close()
def save_addition_emp(pin): ''' 将人员新增到数据库 ''' from mysite.personnel.models import Employee pin = format_pin(pin) emp = Employee() emp.PIN = pin emp.EName = '' #str(pin) emp.DeptID_id = 1 emp.from_dev = True try: super(Employee, emp).save() eid = emp.id except IntegrityError: eid = get_uid_by_pin(pin) finally: # '''保存区域''' save_area(eid, pin) return eid
def process_row(self, row_data, calculate_dict): u''' 特殊情况给开发人员提供的接口 row_data 这一行的数据 calculate_dict 文档附加的列,如人员编号, 记录表是没有人员编号的,人员编号是用来初始化员工字段UserID的 ''' from mysite.personnel.models import Employee #print "calculate_dict:",calculate_dict,"\n" key = u"%s" % _(u"人员编号") emp_pin = u"%s" % calculate_dict[key] emp_pin = format_pin(emp_pin) try: obj_emp = Employee.all_objects.get(PIN=emp_pin) except: #判断是使用默认还是创建新的人员 obj_emp = Employee() obj_emp.PIN = emp_pin obj_emp.DeptID_id = 1 obj_emp.save() row_data["userid"] = u"%s" % obj_emp.pk #初始化人员 return row_data
def upload_data(request): # 上传导出到U盘的数据 emps = [] result = "" sqlList = [] from django.db import connection as conn cursor = conn.cursor() device = check_device(request, None) sn = request.POST.get("SN", None) if not device: return render_to_response("info.html", { "title": _(u"失败"), "content": _(u"<h1>数据上传失败</h1>,<br />请选择考勤机") }) SNs = getUserIclocks(request.user) if SNs != settings.ALL_TAG and (device.SN not in SNs): return render_to_response( "info.html", { "title": _(u"失败"), "content": _(u"<h1>数据上传失败</h1>,<br />没有权限导入考勤机%(object_name)s上的数据") % { 'object_name': sn } }) fs = request.FILES pin_pin2 = {} # 根据用户信息得到 pin 到 pin2 的一一对映,用以保存指纹模版 errorRecs = [] if fs.has_key("file_user"): # 用户信息 try: dept = get_default_dept() # 默认部门 f = fs["file_user"] data = "" for chunk in f.chunks(): data += chunk # typedef struct _User_{ //size:72 # U16 PIN; //[:2] # U8 Privilege; //[2:3] Privilege # char Password[8]; //[3:11] Password # char Name[24]; //[11:35] EName # U8 Card[4]; //[35:39] //卡号码,用于存储对应的ID卡的号码 # U8 Group; //[39:40] AccGroup //用户所属的分组 # U16 TimeZones[4]; //[40:48] TimeZones //用户可用的时间段,位标志 # char PIN2[24]; //[48:] PIN # }GCC_PACKED TUser, *PUser; fsn, upload_user, sum = checkRecData(data, 72) if not fsn: raise Exception("Error of format") if fsn != sn: return render_to_response( "info.html", { "title": _(u"失败"), "content": _(u"<h1>数据上传失败</h1><br />人员信息数据文件不是来自考勤机%(object_name)s" ) % { 'object_name': sn } }) i, count = 0, len(upload_user) / 72 if not (count > 0 and count * 72 == len(upload_user)): raise Exception() i_insert, i_update, i_rep = 0, 0, 0 while i < count: buf = upload_user[i * 72:(i + 1) * 72] pin = format_pin(getStr_c_decode(buf[48:])) i += 1 pin_pin2[ord(buf[0]) + ord(buf[1]) * 256] = pin if int(pin) not in settings.DISABLED_PINS: try: emp = Employee.objects.filter(PIN=pin)[0] except: sql = getSQL_insert( "userinfo", BadgeNumber=pin, defaultdeptid=dept.DeptID, OffDuty=0, DelTag=0, Name=getStr_c_decode(buf[11:35]), Password=getStr_c_decode(buf[3:11]), AccGroup=ord(buf[39:40]), TimeZones=getStr_c_decode(buf[40:48]), SN_id=sn) checkAndRunSql(cursor, sqlList, sql) i_insert += 1 else: ename = getStr_c_decode(buf[11:35]) #Password = getStr_c_decode(buf[3:11]), #AccGroup = ord(buf[39:40]), TimeZones = getStr_c_decode(buf[40:48]) if ename == emp.EName: i_rep += 1 else: sql = getSQL_update("userinfo", whereBadgeNumber=pin, name=ename, SN_id=sn) checkAndRunSql(cursor, sqlList, sql) i_update += 1 emps.append(pin) else: errorRecs.append(u"PIN=%s" % pin) checkAndRunSql(cursor, sqlList) conn._commit() result += reportError(_(u"个人信息"), i, i_insert, i_update, i_rep, errorRecs) except: errorLog(request) return render_to_response("info.html", { "title": _(u"导入数据"), "content": _(u"用户信息数据不匹配,请选择正确的用户信息数据文件") }) if fs.has_key("file_fptemp"): # 指纹模版 try: errorRecs = [] data = fs["file_fptemp"]["content"] # typedef struct _Template_{ //size:608 # U16 Size; //[:2] # U16 PIN; //[2:4] pin # BYTE FingerID; //[4:5] FingerID # BYTE Valid; //[5:6] # BYTE Template[MAXTEMPLATESIZE]; //[6:] Template //maximize template length 602 # }GCC_PACKED TTemplate, *PTemplate; fsn, upload_fptemp, sum = checkRecData(data, 608) if not fsn: raise Exception("Error of format") if fsn != sn: return render_to_response( "info.html", { "title": _(u"失败"), "content": _(u"<h1>数据上传失败</h1>,<br />人员指纹数据文件不是来自考勤机 %(object_name)s" ) % { 'object_name': sn } }) i, count = 0, len(upload_fptemp) / 608 if not (count > 0 and ord(upload_fptemp[6]) == 0xA1 and ord(upload_fptemp[7]) == 0xCA and count * 608 == len(upload_fptemp)): raise Exception() if not pin_pin2: return render_to_response( "info.html", { "title": _(u"失败"), "content": _(u"如果上传指纹模版,必须同时上传相关的用户信息文件") }) i_insert, i_update, i_rep = 0, 0, 0 while i < count: buf = getFptemp_c(upload_fptemp[i * 608:(i + 1) * 608]) i += 1 uid = pin_pin2[ord(buf[2]) + ord(buf[3]) * 256] if int(pin) not in settings.DISABLED_PINS: try: fp = fptemp.objects.filter(UserID=uid, FingerID=ord(buf[4:5]))[0] except: sql = getSQL_insert("template", UserID=uid, Template=buf[6:].encode("base64"), FingerID=ord(buf[4:5]), Valid=ord(buf[5:6]), SN=sn, DelTag=0) checkAndRunSql(cursor, sqlList, sql) i_insert += 1 else: fptmp = buf[6:] if fp.Template.decode("base64") == fptmp: i_rep += 1 else: sql = getSQL_update( "template", whereUserID=uid, Template=fptmp.encode("base64"), whereFingerID=ord(buf[4:5]), Valid=ord(buf[5:6]), SN=sn, DelTag=0) checkAndRunSql(cursor, sqlList, sql) i_update += 1 checkAndRunSql(cursor, sqlList) conn._commit() result += reportError(_(u"指纹模版"), i, i_insert, i_update, i_rep, errorRecs) except: errorLog(request) return render_to_response( "info.html", { "title": _(u"导入数据"), "content": _(u"<h1>数据上传成功</h1><br /><br />%(object_name)s<br /><h1>数据导入失败</h1><br /><br />指纹模版数据不匹配或者数据文件为空,请选择正确的<b>指纹模版</b>数据文件" ) % { 'object_name': result, } }) if fs.has_key("file_transaction"): # 考勤记录 try: data = fs["file_transaction"]["content"] fsn, upload_transaction, sum = checkALogData(data) if not fsn: raise Exception("Error of format") if fsn != sn: return render_to_response( "info.html", { "title": _(u"失败"), "content": "<h1>" + _(u'上传数据失败') + "</h1>,<br />" + _(u'考勤记录数据文件不是来自考勤机') + u" %s" % (sn) }) arr = upload_transaction.split("\n") count = len(arr) i, i_insert = 0, 0 errorRecs = [] maxtime = ( datetime.datetime.now() + datetime.timedelta(1, 0, 0)).strftime("%Y-%m-%d %H:%M:%S") for row in arr: if row == "": continue arr_row = row.split("\t") i += 1 pin = arr_row[0].strip() time = arr_row[1] if pin.isdigit() and (len(time) in [ 19, 16 ]) and (maxtime > time) and (int(pin) not in settings.DISABLED_PINS): pin = format_pin(pin) e = Employee.objByPIN(pin, device) sql = getSQL_insert("checkinout", userid=e.id, checktime=time, SN=sn, checktype=arr_row[3], verifycode=arr_row[2]) checkAndRunSql(cursor, sqlList, sql) i_insert += 1 else: errorRecs.append(row) checkAndRunSql(cursor, sqlList) conn._commit() result += reportError(_(u"考勤记录"), i, i_insert, 0, 0, errorRecs) except: errorLog(request) return render_to_response( "info.html", { "title": _(u"导入数据"), "content": (u"<h1>%s" % _(u'数据导入结果')) + "</h1><br /><br />" + u"%s" % (result, ) + (u"<br /><h1>%s" % _(u'数据导入失败')) + u"</h1><br /><br />%s" % _(u"选择正确的考勤记录数据文件") }) return render_to_response( "info.html", { "title": _(u"导入数据"), "content": u"<h1>%s</h1><br /><br />%s" % (_(u'数据导入结果'), result) })
def mainReport(request, reportType=0): '''考勤汇总表/每日考勤统计表''' from mysite.att.models import AttException, attShifts, EmpSpecDay if settings.ATT_CALCULATE_NEW: from mysite.att.calculate.global_cache import C_ATT_RULE from mysite.att.att_param import GetLeaveClasses, GetRptIndex from mysite.att.report_utils import NormalAttValue, SaveValue C_ATT_RULE.action_init() else: from mysite.iclock.datas import GetLeaveClasses, GetRptIndex, NormalAttValue, SaveValue from mysite.iclock.datasproc import FetchDisabledFields AbnomiteRptItems = GetLeaveClasses() AttAbnomiteRptIndex = GetRptIndex(AbnomiteRptItems) userids, deptids, d1, d2, offset = parse_report_arg(request, True) auHour = 1 aaBLeave = 1003 if reportType == 0: dic = [('userid', _(u'用户ID')), ('badgenumber', _(u'人员编号')), ('username', _(u'姓名')), ('deptid', _(u'部门名称')), ('duty', _(u'应到')), ('realduty', _(u'实到')), ('late', _(u'迟到')), ('early', _(u'早退')), ('absent', _(u'旷工')), ('dutyinout', _(u'应签次数')), ('clockin', _(u'应签到')), ('clockout', _(u'应签退')), ('noin', _(u'未签到')), ('noout', _(u'未签退')), ('worktime', _(u'出勤时长')), ('overtime', _(u'加班时间')), ('SSpeDayNormalOT', _(u'平日加班')), ('SSpeDayWeekendOT', _(u'休息日加班')), ('SSpeDayHolidayOT', _(u'节假日加班')), ('Leave', _(u'请假'))] elif reportType == 1: dic = [ ('userid', _(u'用户ID')), ('badgenumber', _(u'人员编号')), ('username', _(u'姓名')), ('deptid', _(u'部门名称')), ] t = d1 while t <= d2: f = str(t.day) dic.append((f, f)) t = t + datetime.timedelta(1) dic = dic + [('duty', _(u'应到')), ('realduty', _(u'实到')), ('late', _(u'迟到')), ('early', _(u'早退')), ('absent', _(u'旷工')), ('overtime', _(u'加班时间')), ('SSpeDayNormalOT', _(u'平日加班')), ('SSpeDayWeekendOT', _(u'休息日加班')), ('SSpeDayHolidayOT', _(u'节假日加班')), ('Leave', _(u'请假'))] LClasses1 = GetLeaveClasses(1) for t in LClasses1: fName = 'Leave_' + str(t['LeaveId']) dic.append((fName, t['LeaveName'])) calculate = AttCalculateBase(dic) ct = 0 for uid in userids: ct += 1 rmdAttday = calculate.NewItem() uid = int(uid) sql = report_sql.get_calc_report_sql(uid, d1, d2) cs = customSql(sql, False) desc = cs.description fldNames = {} i = 0 for c in desc: fldNames[c[0].lower()] = i i = i + 1 rows = cs.fetchall() if not len(rows) > 0: try: emp = Employee.objByID(uid) except: continue rmdAttday['userid'] = uid rmdAttday['deptid'] = emp.DeptID.name rmdAttday['badgenumber'] = emp.PIN rmdAttday['username'] = emp.EName try: ##################################### 常规计算结果汇总统计 ################################ for t in rows: if not rmdAttday['userid']: rmdAttday['userid'] = t[fldNames['userid']] rmdAttday['deptid'] = t[fldNames['deptname']] rmdAttday['badgenumber'] = t[fldNames['pin']] rmdAttday['username'] = t[fldNames['name']] ################# 应到、实到、迟到、早退、旷工 ################### rmdAttday['duty'] = SaveValue(rmdAttday['duty'], t[fldNames['workday']]) rmdAttday['realduty'] = SaveValue(rmdAttday['realduty'], t[fldNames['realworkday']]) rmdAttday['late'] = SaveValue(rmdAttday['late'], t[fldNames['late']]) rmdAttday['early'] = SaveValue(rmdAttday['early'], t[fldNames['early']]) if t[fldNames['absent']] > 0: try: rmdAttday['absent'] = SaveValue( rmdAttday['absent'], t[fldNames['absent']]) except: import traceback traceback.print_exc() ######################### 加班时间计算 ######################### rmdAttday['overtime'] = SaveValue(rmdAttday['overtime'], t[fldNames['overtime']]) rmdAttday['SSpeDayNormalOT'] = SaveValue( rmdAttday['SSpeDayNormalOT'], t[fldNames['sspedaynormalot']]) rmdAttday['SSpeDayWeekendOT'] = SaveValue( rmdAttday['SSpeDayWeekendOT'], t[fldNames['sspedayweekendot']]) rmdAttday['SSpeDayHolidayOT'] = SaveValue( rmdAttday['SSpeDayHolidayOT'], t[fldNames['sspedayholidayot']]) ################# 应签次数、应签到、应签退、未签到、未签退、出勤时长、工作时间 #################### if reportType == 0: if t[fldNames['mustin']]: rmdAttday['dutyinout'] = int( float(SaveValue(rmdAttday['dutyinout'], 1))) rmdAttday['clockin'] = int( float(SaveValue(rmdAttday['clockin'], 1))) if t[fldNames['mustout']]: rmdAttday['dutyinout'] = int( float(SaveValue(rmdAttday['dutyinout'], 1))) rmdAttday['clockout'] = int( float(SaveValue(rmdAttday['clockout'], 1))) if t[fldNames['mustin']] and t[ fldNames['starttime']] is None: rmdAttday['noin'] = int( float(SaveValue(rmdAttday['noin'], 1))) if t[fldNames['mustout']] and t[ fldNames['endtime']] is None: rmdAttday['noout'] = int( float(SaveValue(rmdAttday['noout'], 1))) rmdAttday['worktime'] = SaveValue(rmdAttday['worktime'], t[fldNames['worktime']]) #rmdAttday['workmins']=SaveValue(rmdAttday['workmins'],t[fldNames['workmins']]) ######################### 每日考勤情况 ######################### if reportType == 1: dt = t[fldNames['attdate']] dof = str(dt.day) tt = t[fldNames['symbol']] if tt: rmdAttday[dof] = rmdAttday[dof] + tt ##################################### 异常计算结果汇总统计 ################################ if len(rows) > 0 and (reportType == 0 or reportType == 1): attExcept = AttException.objects.filter(UserID=uid, AttDate__gte=d1, AttDate__lte=d2) for ex in attExcept: if ex.UserID_id != rmdAttday['userid']: continue exceptid = EmpSpecDay.objects.get( pk=ex.ExceptionID).leaveclass.pk #ex.ExceptionID wd = attShifts.objects.filter(AttDate__exact=ex.AttDate, UserID=ex.UserID) wdmins = 0 #当天时段分钟数之和 for w in wd: wdmins = wdmins + w.AttTime if exceptid in [-4, -3, -2, -1]: pass elif exceptid > 0: if exceptid in AttAbnomiteRptIndex: if (reportType == 0) or (reportType == 1): AbnomiteRptItem = AbnomiteRptItems[ AttAbnomiteRptIndex[exceptid]] if AbnomiteRptItem['RemaindCount'] == 0: v = NormalAttValue( ex.InScopeTime, AbnomiteRptItem['MinUnit'], AbnomiteRptItem['Unit'], AbnomiteRptItem['RemaindProc'], auHour, wdmins) else: v = ex.InScopeTime v = NormalAttValue( ex.InScopeTime, AbnomiteRptItem['MinUnit'], AbnomiteRptItem['Unit'], AbnomiteRptItem['RemaindProc'], auHour, wdmins) rmdAttday['Leave_' + str(exceptid)] = SaveValue( rmdAttday['Leave_' + str(exceptid)], v) if AbnomiteRptItem['IsLeave'] == 1: #请假汇总 aaBLeave_RptItem = AbnomiteRptItems[ AttAbnomiteRptIndex[aaBLeave]] v = NormalAttValue( ex.InScopeTime, aaBLeave_RptItem['MinUnit'], aaBLeave_RptItem['Unit'], aaBLeave_RptItem['RemaindProc'], auHour, wdmins) rmdAttday['Leave'] = SaveValue( rmdAttday['Leave'], v) ################## 计算结果的后处理 ################ if reportType == 0: rmdAttday['worktime'] = formatdTime(rmdAttday['worktime']) #rmdAttday['workmins']=formatdTime(rmdAttday['workmins']) for ttt in rmdAttday.keys(): if type(rmdAttday[ttt]) == type(1.0): if rmdAttday[ttt] > int(rmdAttday[ttt]): rmdAttday[ttt] = smart_str(rmdAttday[ttt]) except: import traceback traceback.print_exc() calculate.AddItem(rmdAttday) ################## 返回字典的属性补充 ################### Result = calculate.ResultDic(offset) if reportType == 0: Result['disableCols'] = FetchDisabledFields(request.user, 'attTotal') elif reportType == 1: Result['disableCols'] = FetchDisabledFields(request.user, 'attDailyTotal') return getJSResponse(smart_str(dumps(Result)))
def calcLeaveReport(request): ''' 请假汇总表 ''' from mysite.att.models import AttException, attShifts if settings.ATT_CALCULATE_NEW: from mysite.att.calculate.global_cache import C_ATT_RULE from mysite.att.att_param import GetLeaveClasses, GetRptIndex from mysite.att.report_utils import NormalAttValue, SaveValue C_ATT_RULE.action_init() else: from mysite.iclock.datas import GetLeaveClasses, GetRptIndex, NormalAttValue, SaveValue AbnomiteRptItems = GetLeaveClasses() AttAbnomiteRptIndex = GetRptIndex(AbnomiteRptItems) userids, deptids, d1, d2, offset = parse_report_arg(request, True) auHour = 1 aaBLeave = 1003 dic = [('userid', _(u'用户ID')), ('badgenumber', _(u'人员编号')), ('username', _(u'姓名')), ('deptid', _(u'部门名称')), ('Leave', _(u'请假'))] LClasses1 = GetLeaveClasses(1) for t in LClasses1: fName = 'Leave_' + str(t['LeaveId']) dic.append((fName, t['LeaveName'])) calculate = AttCalculateBase(dic) for uid in userids: rmdAttday = calculate.NewItem() uid = int(uid) try: emp = Employee.objByID(uid) except: continue attExcept = AttException.objects.filter(UserID=uid, AttDate__gte=d1, AttDate__lte=d2) if not len(attExcept) > 0: continue rmdAttday['userid'] = uid rmdAttday['deptid'] = emp.DeptID.name rmdAttday['badgenumber'] = emp.PIN rmdAttday['username'] = emp.EName try: for ex in attExcept: exceptid = ex.ExceptionID if settings.ATT_CALCULATE_NEW: from mysite.att.models import EmpSpecDay ask_obj = EmpSpecDay.objects.get(pk=ex.ExceptionID) exceptid = ask_obj.leaveclass.pk InScopeTime = ex.InScopeTime wd = attShifts.objects.filter(AttDate__exact=ex.AttDate, UserID=ex.UserID) wdmins = 0 for w in wd: wdmins = wdmins + w.AttTime if exceptid in [-4, -3, -2, -1]: continue elif exceptid > 0: AbnomiteRptItem = AbnomiteRptItems[ AttAbnomiteRptIndex[exceptid]] v = NormalAttValue(InScopeTime, AbnomiteRptItem['MinUnit'], AbnomiteRptItem['Unit'], AbnomiteRptItem['RemaindProc'], auHour, wdmins) rmdAttday['Leave_' + str(exceptid)] = SaveValue( rmdAttday['Leave_' + str(exceptid)], v) if AbnomiteRptItems[AttAbnomiteRptIndex[exceptid]][ 'IsLeave'] == 1: #只有计为请假时才累计 aaBLeave_RptItem = AbnomiteRptItems[ AttAbnomiteRptIndex[aaBLeave]] v = NormalAttValue(InScopeTime, aaBLeave_RptItem['MinUnit'], aaBLeave_RptItem['Unit'], aaBLeave_RptItem['RemaindProc'], auHour, wdmins) #print 'hhhhhhhhhhhhh',v,InScopeTime,ex.ExceptionID rmdAttday['Leave'] = SaveValue(rmdAttday['Leave'], v) except: import traceback traceback.print_exc() calculate.AddItem(rmdAttday) return getJSResponse(smart_str(dumps(calculate.ResultDic(offset))))
def ForMakeDataExcepSum(hander, userids, d1, d2): from mysite.personnel.models import Employee from mysite.att.models import AttException, attShifts from mysite.att.calculate.global_cache import C_ATT_RULE from mysite.att.att_param import GetLeaveClasses, GetRptIndex from mysite.att.report_utils import NormalAttValue, SaveValue C_ATT_RULE.action_init() AbnomiteRptItems = GetLeaveClasses() AttAbnomiteRptIndex = GetRptIndex(AbnomiteRptItems) auHour = 1 aaBLeave = 1003 hander.grid.InitItems() for uid in userids: rmdAttday = hander.grid.NewItem() uid = int(uid) try: emp = Employee.objByID(uid) except: continue attExcept = AttException.objects.filter(UserID=uid, AttDate__gte=d1, AttDate__lte=d2) if not len(attExcept) > 0: continue rmdAttday['userid'] = uid rmdAttday['deptid'] = emp.DeptID.name rmdAttday['badgenumber'] = emp.PIN rmdAttday['username'] = emp.EName rmdAttday['Leave'] = 0 try: for ex in attExcept: exceptid = ex.ExceptionID if settings.ATT_CALCULATE_NEW: from mysite.att.models import EmpSpecDay ask_obj = EmpSpecDay.objects.get(pk=ex.ExceptionID) exceptid = ask_obj.leaveclass.pk InScopeTime = ex.InScopeTime wd = attShifts.objects.filter(AttDate__exact=ex.AttDate, UserID=ex.UserID) wdmins = 0 for w in wd: wdmins = wdmins + w.AttTime if exceptid in [-4, -3, -2, -1]: continue elif exceptid > 0: AbnomiteRptItem = AbnomiteRptItems[ AttAbnomiteRptIndex[exceptid]] v = NormalAttValue(InScopeTime, AbnomiteRptItem['MinUnit'], AbnomiteRptItem['Unit'], AbnomiteRptItem['RemaindProc'], auHour, wdmins) rmdAttday['Leave_' + str(exceptid)] = SaveValue( rmdAttday['Leave_' + str(exceptid)], v) if AbnomiteRptItems[AttAbnomiteRptIndex[exceptid]][ 'IsLeave'] == 1: #只有计为请假时才累计 aaBLeave_RptItem = AbnomiteRptItems[ AttAbnomiteRptIndex[aaBLeave]] v = NormalAttValue(InScopeTime, aaBLeave_RptItem['MinUnit'], aaBLeave_RptItem['Unit'], aaBLeave_RptItem['RemaindProc'], auHour, wdmins) rmdAttday['Leave'] = SaveValue(rmdAttday['Leave'], v) except: import traceback traceback.print_exc() hander.grid.AddItem(rmdAttday)
def upload_data(request): # 上传导出到U盘的数据 emps=[] result = "" sqlList=[] from django.db import connection as conn cursor = conn.cursor() device=check_device(request, None) sn = request.POST.get("SN", None) if not device: return render_to_response("info.html", {"title": _(u"失败"), "content": _(u"<h1>数据上传失败</h1>,<br />请选择考勤机") }); SNs=getUserIclocks(request.user) if SNs!=settings.ALL_TAG and (device.SN not in SNs): return render_to_response("info.html", {"title": _(u"失败"), "content": _(u"<h1>数据上传失败</h1>,<br />没有权限导入考勤机%(object_name)s上的数据")%{'object_name':sn} }); fs = request.FILES pin_pin2 = {} # 根据用户信息得到 pin 到 pin2 的一一对映,用以保存指纹模版 errorRecs=[] if fs.has_key("file_user"): # 用户信息 try: dept = get_default_dept() # 默认部门 f = fs["file_user"] data="" for chunk in f.chunks(): data+=chunk # typedef struct _User_{ //size:72 # U16 PIN; //[:2] # U8 Privilege; //[2:3] Privilege # char Password[8]; //[3:11] Password # char Name[24]; //[11:35] EName # U8 Card[4]; //[35:39] //卡号码,用于存储对应的ID卡的号码 # U8 Group; //[39:40] AccGroup //用户所属的分组 # U16 TimeZones[4]; //[40:48] TimeZones //用户可用的时间段,位标志 # char PIN2[24]; //[48:] PIN # }GCC_PACKED TUser, *PUser; fsn,upload_user,sum=checkRecData(data, 72) if not fsn: raise Exception("Error of format") if fsn!=sn: return render_to_response("info.html", {"title": _(u"失败"), "content": _(u"<h1>数据上传失败</h1><br />人员信息数据文件不是来自考勤机%(object_name)s")%{'object_name':sn} }); i, count = 0, len(upload_user) / 72 if not (count>0 and count*72==len(upload_user)): raise Exception() i_insert, i_update, i_rep = 0, 0, 0 while i < count: buf = upload_user[i*72:(i+1)*72] pin= format_pin(getStr_c_decode(buf[48:])) i += 1 pin_pin2[ord(buf[0])+ord(buf[1])*256] = pin if int(pin) not in settings.DISABLED_PINS: try: emp=Employee.objects.filter(PIN=pin)[0] except: sql = getSQL_insert("userinfo", BadgeNumber = pin, defaultdeptid = dept.DeptID, OffDuty=0, DelTag=0, Name = getStr_c_decode(buf[11:35]), Password = getStr_c_decode(buf[3:11]), AccGroup = ord(buf[39:40]), TimeZones = getStr_c_decode(buf[40:48]), SN_id=sn) checkAndRunSql(cursor, sqlList, sql) i_insert += 1 else: ename=getStr_c_decode(buf[11:35]) #Password = getStr_c_decode(buf[3:11]), #AccGroup = ord(buf[39:40]), TimeZones = getStr_c_decode(buf[40:48]) if ename==emp.EName: i_rep += 1 else: sql = getSQL_update("userinfo", whereBadgeNumber = pin, name = ename, SN_id=sn) checkAndRunSql(cursor, sqlList, sql) i_update += 1 emps.append(pin) else: errorRecs.append(u"PIN=%s"%pin) checkAndRunSql(cursor, sqlList) conn._commit() result+=reportError(_(u"个人信息"), i, i_insert, i_update, i_rep, errorRecs) except: errorLog(request) return render_to_response("info.html", {"title": _(u"导入数据"), "content": _(u"用户信息数据不匹配,请选择正确的用户信息数据文件") }) if fs.has_key("file_fptemp"): # 指纹模版 try: errorRecs=[] data = fs["file_fptemp"]["content"] # typedef struct _Template_{ //size:608 # U16 Size; //[:2] # U16 PIN; //[2:4] pin # BYTE FingerID; //[4:5] FingerID # BYTE Valid; //[5:6] # BYTE Template[MAXTEMPLATESIZE]; //[6:] Template //maximize template length 602 # }GCC_PACKED TTemplate, *PTemplate; fsn,upload_fptemp,sum=checkRecData(data, 608) if not fsn: raise Exception("Error of format") if fsn!=sn: return render_to_response("info.html", {"title": _(u"失败"), "content": _(u"<h1>数据上传失败</h1>,<br />人员指纹数据文件不是来自考勤机 %(object_name)s")%{'object_name':sn} }); i, count = 0, len(upload_fptemp) / 608 if not (count>0 and ord(upload_fptemp[6])==0xA1 and ord(upload_fptemp[7])==0xCA and count*608==len(upload_fptemp)): raise Exception() if not pin_pin2: return render_to_response("info.html", {"title": _(u"失败"), "content": _(u"如果上传指纹模版,必须同时上传相关的用户信息文件") }); i_insert, i_update, i_rep = 0, 0, 0 while i < count: buf = getFptemp_c(upload_fptemp[i*608:(i+1)*608]) i += 1 uid = pin_pin2[ord(buf[2])+ord(buf[3])*256] if int(pin) not in settings.DISABLED_PINS: try: fp=fptemp.objects.filter(UserID=uid, FingerID = ord(buf[4:5]))[0] except: sql = getSQL_insert("template", UserID=uid, Template = buf[6:].encode("base64"), FingerID = ord(buf[4:5]), Valid = ord(buf[5:6]), SN = sn, DelTag=0) checkAndRunSql(cursor, sqlList, sql) i_insert += 1 else: fptmp=buf[6:] if fp.Template.decode("base64")==fptmp: i_rep += 1 else: sql = getSQL_update("template", whereUserID=uid, Template = fptmp.encode("base64"), whereFingerID = ord(buf[4:5]), Valid = ord(buf[5:6]), SN = sn, DelTag=0) checkAndRunSql(cursor, sqlList, sql) i_update += 1 checkAndRunSql(cursor, sqlList) conn._commit() result+=reportError(_(u"指纹模版"), i, i_insert, i_update, i_rep, errorRecs) except: errorLog(request) return render_to_response("info.html", {"title": _(u"导入数据"), "content": _(u"<h1>数据上传成功</h1><br /><br />%(object_name)s<br /><h1>数据导入失败</h1><br /><br />指纹模版数据不匹配或者数据文件为空,请选择正确的<b>指纹模版</b>数据文件" )% {'object_name':result,}}); if fs.has_key("file_transaction"): # 考勤记录 try: data = fs["file_transaction"]["content"] fsn,upload_transaction,sum=checkALogData(data) if not fsn: raise Exception("Error of format") if fsn!=sn: return render_to_response("info.html", {"title": _(u"失败"), "content": "<h1>"+_(u'上传数据失败')+"</h1>,<br />"+_(u'考勤记录数据文件不是来自考勤机')+u" %s"%(sn) }); arr = upload_transaction.split("\n") count=len(arr) i, i_insert = 0, 0 errorRecs=[] maxtime=(datetime.datetime.now()+datetime.timedelta(1, 0, 0)).strftime("%Y-%m-%d %H:%M:%S") for row in arr: if row=="": continue arr_row = row.split("\t") i += 1 pin=arr_row[0].strip() time=arr_row[1] if pin.isdigit() and (len(time) in [19,16]) and (maxtime>time) and (int(pin) not in settings.DISABLED_PINS): pin=format_pin(pin) e=Employee.objByPIN(pin, device) sql = getSQL_insert("checkinout", userid=e.id, checktime=time, SN=sn, checktype=arr_row[3], verifycode =arr_row[2]) checkAndRunSql(cursor, sqlList, sql) i_insert += 1 else: errorRecs.append(row) checkAndRunSql(cursor, sqlList) conn._commit() result+=reportError(_(u"考勤记录"), i, i_insert, 0, 0, errorRecs) except: errorLog(request) return render_to_response("info.html", {"title": _(u"导入数据"), "content": (u"<h1>%s"%_(u'数据导入结果'))+"</h1><br /><br />"+u"%s"%(result,)+(u"<br /><h1>%s"%_(u'数据导入失败'))+u"</h1><br /><br />%s"%_(u"选择正确的考勤记录数据文件")}); return render_to_response("info.html", {"title": _(u"导入数据"), "content": u"<h1>%s</h1><br /><br />%s"%(_(u'数据导入结果'),result)});