示例#1
0
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)
示例#2
0
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)
示例#3
0
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)
示例#4
0
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()
示例#5
0
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()
示例#6
0
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
示例#7
0
    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
示例#8
0
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)
        })
示例#9
0
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)))
示例#10
0
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))))
示例#11
0
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)
示例#12
0
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)});