package oa_logic import ( "bytes" "context" "fmt" "github.com/fonchain_enterprise/fonchain-main/api/account" "github.com/fonchain_enterprise/fonchain-main/api/employee" "github.com/fonchain_enterprise/fonchain-main/api/oa" "github.com/fonchain_enterprise/fonchain-main/api/rule" "github.com/fonchain_enterprise/fonchain-main/pkg/e" "github.com/fonchain_enterprise/fonchain-main/pkg/serializer" "github.com/fonchain_enterprise/fonchain-main/pkg/service" "github.com/fonchain_enterprise/fonchain-main/pkg/service/oa_new/common" "github.com/fonchain_enterprise/fonchain-main/pkg/service/oa_new/model" "github.com/fonchain_enterprise/fonchain-main/pkg/utils/holiday" "github.com/gin-gonic/gin" "github.com/xuri/excelize/v2" "io" "log" "os" "strconv" "strings" "sync" "time" ) // WorkDayMonth 出勤详情 func WorkDayMonth(req *model.CollectionDetailReq, workingTime *oa.WorkingTime) (status bool, allDayLeave []*model.WorkDayDetail, allDayLeaveNum, needAttendanceDayNum, attendanceDayNum, attendanceRestDayNum, attendanceHolidayNum, attendanceWorkDayNum int, workDay []*model.WorkDayDetail, err error) { return QueryOaRecordMonth(req.StaffUID, req.Month, workingTime) } // WorkDayDates 出勤详情 func WorkDayDates(req *model.CollectionDetailReq, workingTime *oa.WorkingTime) (status bool, allDayLeave []*model.WorkDayDetail, allDayLeaveNum, needAttendanceDayNum, attendanceDayNum, attendanceRestDayNum, attendanceHolidayNum, attendanceWorkDayNum int, workDay []*model.WorkDayDetail, err error) { return QueryOaRecordDates(req.StaffUID, req.Dates, workingTime) } // WorkDayDate 出勤详情 func WorkDayDate(req *model.CollectionDetailReq, workingTime *oa.WorkingTime) (workDay *model.WorkDayDetail, err error) { return QueryOaRecordDate(req.StaffUID, req.Date, workingTime) } // AverageHour 平均工时 func AverageHour(req *model.CollectionDetailReq, workingTime *oa.WorkingTime) (totalHours, averageHourNum float64, averageHour []*model.AverageHourDetail, err error) { _, _, _, _, _, _, _, _, workDay, oaRecordErr := QueryOaRecordDates(req.StaffUID, req.Dates, workingTime) if oaRecordErr != nil { return 0, 0, nil, oaRecordErr } averageHour = make([]*model.AverageHourDetail, 0) totalHours, averageHourNum, averageHour, err = CalcAverageHour(workDay) return } // RestDay 休息天数 func RestDay(req *model.CollectionDetailReq, workingTime *oa.WorkingTime) (restDayNum int, restDay []*model.RestDayDetail, err error) { _, _, _, _, _, _, _, _, workDay, oaRecordErr := QueryOaRecordDates(req.StaffUID, req.Dates, workingTime) if oaRecordErr != nil { return 0, nil, oaRecordErr } restDay = make([]*model.RestDayDetail, 0) restDayNum, restDay, err = CalcRestDay(workDay, req.Month, req.Dates) return } // MissRecord 缺卡记录 func MissRecord(req *model.CollectionDetailReq, workingTime *oa.WorkingTime) (missNum int, miss []*model.MissDetail, err error) { _, _, _, _, _, _, _, _, workDay, oaRecordErr := QueryOaRecordDates(req.StaffUID, req.Dates, workingTime) if oaRecordErr != nil { return 0, nil, oaRecordErr } miss = make([]*model.MissDetail, 0) missNum, miss, err = SelectMiss(workDay, req.StaffUID) return } // MakeUpRecord 补卡记录 func MakeUpRecord(req *model.CollectionDetailReq, workingTime *oa.WorkingTime) (makeUpNum int, makeUp []*model.MakeUpDetail, err error) { _, _, _, _, _, _, _, _, workDay, oaRecordErr := QueryOaRecordDates(req.StaffUID, req.Dates, workingTime) if oaRecordErr != nil { return 0, nil, oaRecordErr } makeUp = make([]*model.MakeUpDetail, 0) makeUpNum, makeUp, err = SelectMakeUp(workDay) return } // LateRecord 迟到记录 func LateRecord(req *model.CollectionDetailReq, workingTime *oa.WorkingTime) (lateNum int, commonLateNum int, commonLateDuration float64, extremeLateNum int, extremeLateDuration float64, late []*model.LateDetail, err error) { _, _, _, _, _, _, _, _, workDay, oaRecordErr := QueryOaRecordDates(req.StaffUID, req.Dates, workingTime) if oaRecordErr != nil { return 0, 0, 0, 0, 0, nil, oaRecordErr } late = make([]*model.LateDetail, 0) lateNum, commonLateNum, commonLateDuration, extremeLateNum, extremeLateDuration, late, err = SelectLate(workDay) return } // BeforeRecord 早退记录 func BeforeRecord(req *model.CollectionDetailReq, workingTime *oa.WorkingTime) (beforeNum int, commonBeforeDuration float64, before []*model.BeforeDetail, err error) { _, _, _, _, _, _, _, _, workDay, oaRecordErr := QueryOaRecordDates(req.StaffUID, req.Dates, workingTime) if oaRecordErr != nil { return 0, 0, nil, oaRecordErr } before = make([]*model.BeforeDetail, 0) beforeNum, commonBeforeDuration, before, err = SelectBefore(workDay) return } // AbsentRecord 旷工记录 func AbsentRecord(req *model.CollectionDetailReq, workingTime *oa.WorkingTime) (absentDayNum int, absentDay []*model.MissDayDetail, err error) { _, _, _, _, _, _, _, _, workDay, oaRecordErr := QueryOaRecordDates(req.StaffUID, req.Dates, workingTime) if oaRecordErr != nil { return 0, nil, oaRecordErr } absentDay = make([]*model.MissDayDetail, 0) absentDayNum, absentDay, err = SelectAbsent(workDay) return } // OutWorkRecord 外勤记录 func OutWorkRecord(req *model.CollectionDetailReq, workingTime *oa.WorkingTime) (outWorkNum int, outWork []*model.OutWorkDetail, err error) { _, _, _, _, _, _, _, _, workDay, oaRecordErr := QueryOaRecordDates(req.StaffUID, req.Dates, workingTime) if oaRecordErr != nil { return 0, nil, oaRecordErr } outWork = make([]*model.OutWorkDetail, 0) outWorkNum, outWork, err = SelectOutWork(workDay) return } // OverTimeRecord 加班记录 func OverTimeRecord(req *model.CollectionDetailReq, workingTime *oa.WorkingTime) (overTimeNum, doingNum int, overTime *model.OverWorkDetail, err error) { _, _, _, _, _, _, _, _, workDay, oaRecordErr := QueryOaRecordDates(req.StaffUID, req.Dates, workingTime) if oaRecordErr != nil { return 0, 0, nil, oaRecordErr } overTimeNum, doingNum, overTime, err = SelectOverTime(req, workDay) return } // LeaveRecord 事假记录 func LeaveRecord(req *model.CollectionDetailReq, workingTime *oa.WorkingTime) (leaveNum, doingNum float64, leave []*model.LeaveDetail, err error) { leave = make([]*model.LeaveDetail, 0) leaveNum, doingNum, leave, err = SelectLeave(req, workingTime) return } // AnnualLeave 年假详情 func AnnualLeave(req *model.CollectionDetailReq, workingTime *oa.WorkingTime) (leaveNum, doingNum float64, leave []*model.LeaveDetail, err error) { leave = make([]*model.LeaveDetail, 0) leaveNum, doingNum, leave, err = SelectAnnualLeave(req, workingTime) return } // Sick 病假详情 func Sick(req *model.CollectionDetailReq, workingTime *oa.WorkingTime) (leaveNum, doingNum float64, leave []*model.LeaveDetail, err error) { leave = make([]*model.LeaveDetail, 0) leaveNum, doingNum, leave, err = SelectSick(req, workingTime) return } // BreastFeedingLeave 哺乳假详情 func BreastFeedingLeave(req *model.CollectionDetailReq, workingTime *oa.WorkingTime) (leaveNum, doingNum float64, leave []*model.LeaveDetail, err error) { leave = make([]*model.LeaveDetail, 0) leaveNum, doingNum, leave, err = SelectBreastFeedingLeave(req, workingTime) return } // PaternityLeave 陪产假详情 func PaternityLeave(req *model.CollectionDetailReq, workingTime *oa.WorkingTime) (leaveNum, doingNum int, leave []*model.LeaveDetail, err error) { leave = make([]*model.LeaveDetail, 0) leaveNum, doingNum, leave, err = SelectPaternityLeave(req, workingTime) return } // MaritalLeave 婚假详情 func MaritalLeave(req *model.CollectionDetailReq, workingTime *oa.WorkingTime) (leaveNum, doingNum int, leave []*model.LeaveDetail, err error) { leave = make([]*model.LeaveDetail, 0) leaveNum, doingNum, leave, err = SelectMaritalLeave(req, workingTime) return } // FuneralLeave 丧假详情 func FuneralLeave(req *model.CollectionDetailReq, workingTime *oa.WorkingTime) (leaveNum, doingNum float64, leave []*model.LeaveDetail, err error) { leave = make([]*model.LeaveDetail, 0) leaveNum, doingNum, leave, err = SelectFuneralLeave(req, workingTime) return } // MaternityLeave 产假详情 func MaternityLeave(req *model.CollectionDetailReq, workingTime *oa.WorkingTime) (leaveNum, doingNum float64, leave []*model.LeaveDetail, err error) { leave = make([]*model.LeaveDetail, 0) leaveNum, doingNum, leave, err = SelectMaternityLeave(req, workingTime) return } // DayOffRecord 调休记录 func DayOffRecord(req *model.CollectionDetailReq, workingTime *oa.WorkingTime) (dayOffNum, doingNum int, dayOffHours float64, dayOff []*model.LeaveDetail, err error) { dayOff = make([]*model.LeaveDetail, 0) dayOffNum, doingNum, dayOffHours, dayOff, err = SelectDayOff(req, workingTime) return } // GoOutRecord 外出记录 func GoOutRecord(req *model.CollectionDetailReq, workingTime *oa.WorkingTime) (goOutDuration, doingNum float64, goOut []*model.LeaveDetail, err error) { goOut = make([]*model.LeaveDetail, 0) goOutDuration, doingNum, goOut, err = SelectGoOut(req, workingTime) return } // BusinessTripRecord 出差记录 func BusinessTripRecord(req *model.CollectionDetailReq, workingTime *oa.WorkingTime) (businessTripDuration, doingNum float64, businessTrip []*model.LeaveDetail, err error) { businessTrip = make([]*model.LeaveDetail, 0) businessTripDuration, doingNum, businessTrip, err = SelectBusinessTrip(req, workingTime) return } // ParentalLeave 育儿假 func ParentalLeave(req *model.CollectionDetailReq, workingTime *oa.WorkingTime) (parentalLeaveNum, doingNum float64, parentalLeave []*model.LeaveDetail, err error) { parentalLeave = make([]*model.LeaveDetail, 0) parentalLeaveNum, doingNum, parentalLeave, err = SelectParentalLeave(req, workingTime) return } // NursingLeave 独生子女护理假 func NursingLeave(req *model.CollectionDetailReq, workingTime *oa.WorkingTime) (nursingLeaveNum, doingNum float64, nursingLeave []*model.LeaveDetail, err error) { nursingLeave = make([]*model.LeaveDetail, 0) nursingLeaveNum, doingNum, nursingLeave, err = SelectNursingLeave(req, workingTime) return } // AbortLeave 流产假 func AbortLeave(req *model.CollectionDetailReq, workingTime *oa.WorkingTime) (abortLeaveNum, doingNum float64, abortLeave []*model.LeaveDetail, err error) { abortLeave = make([]*model.LeaveDetail, 0) abortLeaveNum, doingNum, abortLeave, err = SelectAbortLeave(req, workingTime) return } // MatingCheckLeave 孕检假 func MatingCheckLeave(req *model.CollectionDetailReq, workingTime *oa.WorkingTime) (matingCheckLeaveNum, doingNum float64, matingCheckLeave []*model.LeaveDetail, err error) { matingCheckLeave = make([]*model.LeaveDetail, 0) matingCheckLeaveNum, doingNum, matingCheckLeave, err = SelectMatingCheckLeave(req, workingTime) return } // AllLeaveRecord 全部请假记录 func AllLeaveRecord(req *model.CollectionDetailReq, workingTime *oa.WorkingTime) (allLeaveNum int, allLeave []*model.AllLeaveDetail, err error) { allLeaveNum, allLeave, err = SelectAllLeave(req, workingTime) return } func AllRecord(req *model.CollectionDetailReq, workingTime *oa.WorkingTime) (res *model.CollectionDetailRes, err error) { res = new(model.CollectionDetailRes) fmt.Println("================ StaffCollectionDetail model.All enter =======================") if req.Month != "" { var workDayErr error fmt.Println("================ StaffCollectionDetail model.All WorkDayMonth enter =======================") res.Status, res.AllDayLeave, res.AllDayLeaveNum, res.NeedAttendanceDayNum, res.AttendanceDayNum, res.AttendanceRestDayNum, res.AttendanceHolidayNum, res.AttendanceWorkDayNum, res.WorkDay, workDayErr = WorkDayMonth(req, workingTime) if workDayErr != nil { return nil, workDayErr } fmt.Println("================ StaffCollectionDetail model.All WorkDayMonth out =======================") } else { var workDayErr error fmt.Println("================ StaffCollectionDetail model.All WorkDayMonth enter =======================") res.Status, res.AllDayLeave, res.AllDayLeaveNum, res.NeedAttendanceDayNum, res.AttendanceDayNum, res.AttendanceRestDayNum, res.AttendanceHolidayNum, res.AttendanceWorkDayNum, res.WorkDay, workDayErr = WorkDayDates(req, workingTime) if workDayErr != nil { return nil, workDayErr } fmt.Println("================ StaffCollectionDetail model.All WorkDayMonth out =======================") } var averageHourErr error fmt.Println("================ StaffCollectionDetail model.All CalcAverageHour enter =======================") res.AverageHour = make([]*model.AverageHourDetail, 0) res.TotalHours, res.AverageHourNum, res.AverageHour, averageHourErr = CalcAverageHour(res.WorkDay) if averageHourErr != nil { return nil, averageHourErr } fmt.Println("================ StaffCollectionDetail model.All CalcAverageHour out =======================") var restDayErr error fmt.Println("================ StaffCollectionDetail model.All CalcRestDay enter =======================") res.RestDay = make([]*model.RestDayDetail, 0) res.RestDayNum, res.RestDay, restDayErr = CalcRestDay(res.WorkDay, req.Month, req.Dates) if restDayErr != nil { return nil, restDayErr } fmt.Println("================ StaffCollectionDetail model.All CalcRestDay out =======================") var missErr error fmt.Println("================ StaffCollectionDetail model.All SelectMiss enter =======================") res.Miss = make([]*model.MissDetail, 0) res.MissNum, res.Miss, missErr = SelectMiss(res.WorkDay, req.StaffUID) if missErr != nil { return nil, missErr } fmt.Println("================ StaffCollectionDetail model.All SelectMiss out =======================") var makeUpErr error fmt.Println("================ StaffCollectionDetail model.All SelectMakeUp enter =======================") res.MakeUp = make([]*model.MakeUpDetail, 0) res.MakeUpNum, res.MakeUp, makeUpErr = SelectMakeUp(res.WorkDay) if makeUpErr != nil { return nil, makeUpErr } fmt.Println("================ StaffCollectionDetail model.All SelectMakeUp out =======================") var lateErr error fmt.Println("================ StaffCollectionDetail model.All SelectLate enter =======================") res.Late = make([]*model.LateDetail, 0) res.LateNum, res.CommonLateNum, res.CommonLateDuration, res.ExtremeLateNum, res.ExtremeLateDuration, res.Late, lateErr = SelectLate(res.WorkDay) if lateErr != nil { return nil, lateErr } fmt.Println("================ StaffCollectionDetail model.All SelectLate out =======================") var beforeErr error fmt.Println("================ StaffCollectionDetail model.All SelectBefore enter =======================") res.Before = make([]*model.BeforeDetail, 0) res.BeforeNum, res.CommonBeforeDuration, res.Before, beforeErr = SelectBefore(res.WorkDay) if beforeErr != nil { return nil, beforeErr } fmt.Println("================ StaffCollectionDetail model.All SelectBefore out =======================") var absentErr error fmt.Println("================ StaffCollectionDetail model.All SelectAbsent enter =======================") res.MissDay = make([]*model.MissDayDetail, 0) res.MissDayNum, res.MissDay, absentErr = SelectAbsent(res.WorkDay) if absentErr != nil { return nil, absentErr } fmt.Println("================ StaffCollectionDetail model.All SelectAbsent out =======================") var outWorkErr error fmt.Println("================ StaffCollectionDetail model.All SelectOutWork enter =======================") res.OutWork = make([]*model.OutWorkDetail, 0) res.OutWorkNum, res.OutWork, outWorkErr = SelectOutWork(res.WorkDay) if outWorkErr != nil { return nil, outWorkErr } fmt.Println("================ StaffCollectionDetail model.All SelectOutWork out =======================") var overTimeErr error fmt.Println("================ StaffCollectionDetail model.All SelectOverTime enter =======================") res.OverTime = new(model.OverWorkDetail) res.OverTimeNum, res.OverTimeDoingNum, res.OverTime, overTimeErr = SelectOverTime(req, res.WorkDay) if overTimeErr != nil { return nil, overTimeErr } fmt.Println("================ StaffCollectionDetail model.All SelectOverTime out =======================") var leaveErr error fmt.Println("================ StaffCollectionDetail model.All SelectLeave enter =======================") res.Leave = make([]*model.LeaveDetail, 0) res.LeaveNum, _, res.Leave, leaveErr = SelectLeave(req, workingTime) if leaveErr != nil { return nil, leaveErr } fmt.Println("================ StaffCollectionDetail model.All SelectLeave out =======================") var annualLeaveErr error fmt.Println("================ StaffCollectionDetail model.All SelectAnnualLeave enter =======================") res.AnnualLeave = make([]*model.LeaveDetail, 0) res.AnnualLeaveNum, _, res.AnnualLeave, annualLeaveErr = SelectAnnualLeave(req, workingTime) if annualLeaveErr != nil { return nil, annualLeaveErr } fmt.Println("================ StaffCollectionDetail model.All SelectAnnualLeave out =======================") var sickErr error fmt.Println("================ StaffCollectionDetail model.All SelectSick enter =======================") res.Sick = make([]*model.LeaveDetail, 0) res.SickDayNum, _, res.Sick, sickErr = SelectSick(req, workingTime) if sickErr != nil { return nil, sickErr } fmt.Println("================ StaffCollectionDetail model.All SelectSick out =======================") var breastFeedingLeaveErr error fmt.Println("================ StaffCollectionDetail model.All SelectBreastFeedingLeave enter =======================") res.BreastFeedingLeave = make([]*model.LeaveDetail, 0) res.BreastFeedingLeaveNum, _, res.BreastFeedingLeave, breastFeedingLeaveErr = SelectBreastFeedingLeave(req, workingTime) if breastFeedingLeaveErr != nil { return nil, breastFeedingLeaveErr } fmt.Println("================ StaffCollectionDetail model.All SelectBreastFeedingLeave out =======================") var paternityLeaveErr error fmt.Println("================ StaffCollectionDetail model.All SelectPaternityLeave enter =======================") res.PaternityLeave = make([]*model.LeaveDetail, 0) res.PaternityLeaveNum, res.PaternityLeaveDoingNum, res.PaternityLeave, paternityLeaveErr = SelectPaternityLeave(req, workingTime) if paternityLeaveErr != nil { return nil, paternityLeaveErr } fmt.Println("================ StaffCollectionDetail model.All SelectPaternityLeave out =======================") var maritalLeaveErr error fmt.Println("================ StaffCollectionDetail model.All SelectMaritalLeave enter =======================") res.MaritalLeave = make([]*model.LeaveDetail, 0) res.MaritalLeaveNum, res.MaritalLeaveDoingNum, res.MaritalLeave, maritalLeaveErr = SelectMaritalLeave(req, workingTime) if maritalLeaveErr != nil { return nil, maritalLeaveErr } fmt.Println("================ StaffCollectionDetail model.All SelectMaritalLeave out =======================") var funeralLeaveErr error fmt.Println("================ StaffCollectionDetail model.All SelectFuneralLeave enter =======================") res.FuneralLeave = make([]*model.LeaveDetail, 0) res.FuneralLeaveNum, res.FuneralLeaveDoingNum, res.FuneralLeave, funeralLeaveErr = SelectFuneralLeave(req, workingTime) if funeralLeaveErr != nil { return nil, funeralLeaveErr } fmt.Println("================ StaffCollectionDetail model.All SelectFuneralLeave out =======================") var dayOffErr error fmt.Println("================ StaffCollectionDetail model.All SelectDayOff enter =======================") res.DayOff = make([]*model.LeaveDetail, 0) res.DayOffNum, res.DayOffDoingNum, res.DayOffHours, res.DayOff, dayOffErr = SelectDayOff(req, workingTime) if dayOffErr != nil { return nil, dayOffErr } fmt.Println("================ StaffCollectionDetail model.All SelectDayOff out =======================") var maternityLeaveErr error fmt.Println("================ StaffCollectionDetail model.All SelectMaternityLeave enter =======================") res.MaternityLeave = make([]*model.LeaveDetail, 0) res.MaternityLeaveNum, res.MaternityLeaveDoingNum, res.MaternityLeave, maternityLeaveErr = SelectMaternityLeave(req, workingTime) if maternityLeaveErr != nil { return nil, maternityLeaveErr } fmt.Println("================ StaffCollectionDetail model.All SelectMaternityLeave out =======================") var goOutErr error fmt.Println("================ StaffCollectionDetail model.All SelectGoOut enter =======================") res.GoOut = make([]*model.LeaveDetail, 0) res.GoOutDuration, res.GoOutDurationDoing, res.GoOut, goOutErr = SelectGoOut(req, workingTime) if goOutErr != nil { return nil, goOutErr } fmt.Println("================ StaffCollectionDetail model.All SelectGoOut out =======================") var businessTripErr error fmt.Println("================ StaffCollectionDetail model.All SelectBusinessTrip enter =======================") res.BusinessTrip = make([]*model.LeaveDetail, 0) res.BusinessTripDuration, res.BusinessTripDurationDoing, res.BusinessTrip, businessTripErr = SelectBusinessTrip(req, workingTime) if businessTripErr != nil { return nil, businessTripErr } fmt.Println("================ StaffCollectionDetail model.All SelectBusinessTrip out =======================") var parentalLeaveErr error fmt.Println("================ StaffCollectionDetail model.All SelectParentalLeave enter =======================") res.ParentalLeave = make([]*model.LeaveDetail, 0) res.ParentalLeaveNum, res.ParentalLeaveDoingNum, res.ParentalLeave, parentalLeaveErr = SelectParentalLeave(req, workingTime) if parentalLeaveErr != nil { return nil, parentalLeaveErr } fmt.Println("================ StaffCollectionDetail model.All SelectParentalLeave out =======================") var nursingLeaveErr error fmt.Println("================ StaffCollectionDetail model.All SelectNursingLeave enter =======================") res.NursingLeave = make([]*model.LeaveDetail, 0) res.NursingLeaveNum, res.NursingLeaveDoingNum, res.NursingLeave, nursingLeaveErr = SelectNursingLeave(req, workingTime) if nursingLeaveErr != nil { return nil, nursingLeaveErr } fmt.Println("================ StaffCollectionDetail model.All SelectNursingLeave out =======================") var abortLeaveErr error fmt.Println("================ StaffCollectionDetail model.All SelectAbortLeave enter =======================") res.AbortLeave = make([]*model.LeaveDetail, 0) res.AbortLeaveNum, res.AbortLeaveDoingNum, res.AbortLeave, abortLeaveErr = SelectAbortLeave(req, workingTime) if abortLeaveErr != nil { return nil, abortLeaveErr } fmt.Println("================ StaffCollectionDetail model.All SelectAbortLeave out =======================") var matingCheckLeaveErr error fmt.Println("================ StaffCollectionDetail model.All SelectMatingCheckLeave enter =======================") res.MatingCheckLeave = make([]*model.LeaveDetail, 0) res.MatingCheckLeaveNum, res.MatingCheckLeaveDoingNum, res.MatingCheckLeave, matingCheckLeaveErr = SelectMatingCheckLeave(req, workingTime) if matingCheckLeaveErr != nil { return nil, matingCheckLeaveErr } fmt.Println("================ StaffCollectionDetail model.All SelectMatingCheckLeave out =======================") var allLeaveErr error fmt.Println("================ StaffCollectionDetail model.All SelectAllLeave enter =======================") res.AllLeaveDetail = make([]*model.AllLeaveDetail, 0) res.AllLeaveNum, res.AllLeaveDetail, allLeaveErr = SelectAllLeave(req, workingTime) if allLeaveErr != nil { return nil, allLeaveErr } fmt.Println("================ StaffCollectionDetail model.All SelectAllLeave out =======================") fmt.Println("================ StaffCollectionDetail model.All res =======================") fmt.Printf("StaffCollectionDetail res %+v\n", res) return res, nil } // GetAllEmployeesInfo 获取所有员工的详细信息 func GetAllEmployeesInfo(staffUIDs []uint64) ([]*account.AccountInfo, error) { accountReq := new(account.ListRequest) accountReq.Domain = "fontree" accountReq.Page = 1 accountReq.PageSize = 999999 accountRes, err := service.AccountProvider.List(context.Background(), accountReq) if err != nil { return nil, fmt.Errorf("service.AccountProvider.List err: %v", err) } // 查询部门 puRequest := &rule.PositionUserListRequest{} puRes, err := service.RuleProvider.PositionUserList(context.Background(), puRequest) if err != nil { return nil, fmt.Errorf("service.RuleProvider.PositionUserList err: %v", err) } // 关联职位和部门信息 for i := range accountRes.Data { for j := range puRes.Data { if accountRes.Data[i].ID == puRes.Data[j].UserId { accountRes.Data[i].Positions = append(accountRes.Data[i].Positions, &account.PositionUser{ PositionID: puRes.Data[j].PositionID, PositionName: puRes.Data[j].PositionName, DepartmentId: puRes.Data[j].DepartmentId, DepartmentCode: puRes.Data[j].DepartmentCode, DepartmentName: puRes.Data[j].DepartmentName, UserId: puRes.Data[j].UserId, UserName: puRes.Data[j].UserName, }) } } } // 过滤出需要的员工信息 if staffUIDs != nil && len(staffUIDs) > 0 { employees := make([]*account.AccountInfo, 0) for _, staffUID := range staffUIDs { for _, acc := range accountRes.Data { if acc.ID == staffUID { employees = append(employees, acc) break } } } return employees, nil } return accountRes.Data, nil } // GetAllEmployeesInfoForEmployees 获取所有员工的详细信息 func GetAllEmployeesInfoForEmployees(staffUIDs []uint64) ([]*employee.FindEmployeeFileListInfo, error) { accountReq := new(employee.FindEmployeeFileListRequest) //accountReq.WorkingConditionId = 80 accountReq.Page = 1 accountReq.PageSize = 999999 accountRes, err := service.GrpcEmployeeProvider.FindEmployeeFileList(context.Background(), accountReq) if err != nil { return nil, fmt.Errorf("service.GrpcEmployeeProvider.FindEmployeeFileList err: %v", err) } // 过滤出需要的员工信息 if staffUIDs != nil && len(staffUIDs) > 0 { employees := make([]*employee.FindEmployeeFileListInfo, 0) for _, staffUID := range staffUIDs { for _, acc := range accountRes.EmployeeFileList { if acc.UserId == staffUID { employees = append(employees, acc) break } } } return employees, nil } return accountRes.EmployeeFileList, nil } // GetAttendanceInfo 获取员工考勤信息 func GetAttendanceInfo(month string, accountData []*account.AccountInfo) ([]*oa.OaMonth, error) { if month == "" { month = common.CurrentMonth() } queryMonth := &model.CollectionDetailReq{ Month: month, CollectionType: model.All, } saveOaMonths := make([]*oa.OaMonth, 0) for _, acc := range accountData { saveOaMonth := new(oa.OaMonth) allRecordReq := *queryMonth allRecordReq.StaffUID = acc.ID positionUser := make([]*rule.PositionUser, 0) for i := 0; i < len(acc.Positions); i++ { positionUser = append(positionUser, &rule.PositionUser{ PositionID: acc.Positions[i].PositionID, PositionName: acc.Positions[i].PositionName, DepartmentId: acc.Positions[i].DepartmentId, DepartmentCode: acc.Positions[i].DepartmentCode, }) } workingTime, workingTimeErr := QueryWorkingTimeInUse(positionUser, acc.ID) if workingTimeErr != nil { //return nil, fmt.Errorf("QueryWorkingTimeInUseTempAccount err: %v", workingTimeErr) fmt.Errorf("QueryWorkingTimeInUseTempAccount err: %v", workingTimeErr) continue } allRecord, allRecordErr := AllRecord(&allRecordReq, workingTime) if allRecordErr != nil { //return nil, fmt.Errorf("AllRecord err: %v", allRecordErr) fmt.Errorf("AllRecord err: %v", allRecordErr) continue } var departments []string var positions []string for _, pos := range acc.Positions { positions = append(positions, pos.PositionName) departments = append(departments, pos.DepartmentName) } //saveOaMonth.DepartmentName = strings.Join(departments, ",") saveOaMonth.DepartmentName = workingTime.DepartmentName saveOaMonth.DepartmentUID, _ = strconv.ParseInt(workingTime.DepartmentUID, 10, 64) //saveOaMonth.PositionName = strings.Join(positions, ",") saveOaMonth.PositionName = workingTime.PositionName saveOaMonth.PositionUID, _ = strconv.ParseInt(workingTime.PositionUID, 10, 64) saveOaMonth.StaffUID = acc.ID saveOaMonth.StaffName = acc.NickName saveOaMonth.Status = allRecord.Status saveOaMonth.StaffNum = acc.JobNum saveOaMonth.Month = month saveOaMonth.AttendanceGroupName = workingTime.WorkTimeTemplateName saveOaMonth.WorkDays = int32(allRecord.AttendanceDayNum) saveOaMonth.AverageHour = float32(allRecord.AverageHourNum) if allRecord.OverTime != nil { saveOaMonth.OverWork = float32(allRecord.OverTime.OverWorkHour) saveOaMonth.OverWorkWorkDay = float32(allRecord.OverTime.WorkDayHour) saveOaMonth.OverWorkRestDay = float32(allRecord.OverTime.RestDayHour) saveOaMonth.OverWorkHoliday = float32(allRecord.OverTime.HolidayHour) } saveOaMonth.DayOff = float32(allRecord.DayOffHours) saveOaMonth.Late = int32(allRecord.LateNum) saveOaMonth.CommonLateNum = int32(allRecord.CommonLateNum) saveOaMonth.CommonLateDuration = float32(allRecord.CommonLateDuration) saveOaMonth.ExtremeLateNum = int32(allRecord.ExtremeLateNum) saveOaMonth.ExtremeLateDuration = float32(allRecord.ExtremeLateDuration) saveOaMonth.Before = int32(allRecord.BeforeNum) saveOaMonth.Miss = int32(allRecord.MissNum) saveOaMonth.MakeUp = int32(allRecord.MakeUpNum) saveOaMonth.OutWork = int32(allRecord.OutWorkNum) saveOaMonth.MissDay = int32(allRecord.MissDayNum) saveOaMonth.RestDays = int32(allRecord.RestDayNum) // jhc 2024-07-06 修改 saveOaMonth.Leave = float32(allRecord.LeaveNum) saveOaMonth.Sick = float32(allRecord.SickDayNum) saveOaMonth.AnnualLeave = float32(allRecord.AnnualLeaveNum) saveOaMonth.MaternityLeave = float32(allRecord.MaternityLeaveNum) saveOaMonth.PaternityLeave = float32(allRecord.PaternityLeaveNum) saveOaMonth.MaritalLeave = float32(allRecord.MaritalLeaveNum) saveOaMonth.FuneralLeave = float32(allRecord.FuneralLeaveNum) saveOaMonth.BreastFeedingLeave = float32(allRecord.BreastFeedingLeaveNum) saveOaMonth.AttendanceGroupName = workingTime.WorkTimeTemplateName saveOaMonth.StaffNum = acc.JobNum saveOaMonth.AllDayLeaveNum = int32(allRecord.AllDayLeaveNum) saveOaMonth.TotalHours = float32(allRecord.TotalHours) saveOaMonth.CommonBeforeDuration = float32(allRecord.CommonBeforeDuration) saveOaMonth.GoOutDuration = float32(allRecord.GoOutDuration) saveOaMonth.BusinessTripDuration = float32(allRecord.BusinessTripDuration) saveOaMonth.NursingLeave = float32(allRecord.NursingLeaveNum) saveOaMonth.ParentalLeave = float32(allRecord.ParentalLeaveNum) saveOaMonth.AbortLeave = float32(allRecord.AbortLeaveNum) saveOaMonth.MatingCheckLeave = float32(allRecord.MatingCheckLeaveNum) saveOaMonth.Date = common.CurrentTimeStr() /*if allRecord.Leave != nil { for _, leave := range allRecord.Leave { switch leave.ApplyType { case common.TypeLeave: saveOaMonth.Leave = int32(leave.Duration) case common.TypeAnnualLeave: saveOaMonth.AnnualLeave = float32(leave.Duration) case common.TypeSick: saveOaMonth.Sick = float32(leave.Duration) case common.TypeMaternityLeave: saveOaMonth.MaternityLeave = float32(leave.Duration) case common.TypePaternityLeave: saveOaMonth.PaternityLeave = float32(leave.Duration) case common.TypeMaritalLeave: saveOaMonth.MaritalLeave = float32(leave.Duration) case common.TypeFuneralLeave: saveOaMonth.FuneralLeave = float32(leave.Duration) case common.TypeBreastFeedingLeave: saveOaMonth.BreastFeedingLeave = float32(leave.Duration) } } }*/ saveOaMonths = append(saveOaMonths, saveOaMonth) } return saveOaMonths, nil } // GetAttendanceInfoForEmployees 获取员工考勤信息 员工档案 func GetAttendanceInfoForEmployees(month string, accountData []*employee.FindEmployeeFileListInfo) ([]*oa.OaMonth, error) { if month == "" { month = common.CurrentMonth() } queryMonth := &model.CollectionDetailReq{ Month: month, CollectionType: model.All, } saveOaMonths := make([]*oa.OaMonth, 0) for _, acc := range accountData { saveOaMonth := new(oa.OaMonth) allRecordReq := *queryMonth allRecordReq.StaffUID = acc.UserId workingTime, workingTimeErr := QueryWorkingTimeFormal(acc.CurrentAttendanceSectionUuid) if workingTimeErr != nil { fmt.Errorf("QueryWorkingTimeInUseTempAccount err: %v", workingTimeErr) // 返回默认数据 continue } allRecord, allRecordErr := AllRecord(&allRecordReq, workingTime) if allRecordErr != nil { //return nil, fmt.Errorf("AllRecord err: %v", allRecordErr) fmt.Errorf("AllRecord err: %v", allRecordErr) continue } var departments []string var positions []string for _, pos := range acc.DepartmentPostList { positions = append(positions, pos.PostName) departments = append(departments, pos.DepartmentName) } // 获取员工档案信息 中的 部门 岗位信息 employeeInfo := MakeDefaultOaMonthByDatesSingleEmployee(acc) //saveOaMonth.DepartmentName = strings.Join(departments, ",") //saveOaMonth.DepartmentName = workingTime.DepartmentName saveOaMonth.DepartmentName = employeeInfo.DepartmentName saveOaMonth.DepartmentUID, _ = strconv.ParseInt(workingTime.DepartmentUID, 10, 64) //saveOaMonth.PositionName = strings.Join(positions, ",") //saveOaMonth.PositionName = workingTime.PositionName saveOaMonth.PositionName = employeeInfo.PositionName saveOaMonth.PositionUID, _ = strconv.ParseInt(workingTime.PositionUID, 10, 64) saveOaMonth.StaffUID = acc.UserId saveOaMonth.StaffName = acc.Name saveOaMonth.Status = allRecord.Status saveOaMonth.StaffNum = acc.JobNumber saveOaMonth.Month = month saveOaMonth.AttendanceGroupName = workingTime.WorkTimeTemplateName saveOaMonth.WorkDays = int32(allRecord.AttendanceDayNum) saveOaMonth.AverageHour = float32(allRecord.AverageHourNum) if allRecord.OverTime != nil { saveOaMonth.OverWork = float32(allRecord.OverTime.OverWorkHour) saveOaMonth.OverWorkWorkDay = float32(allRecord.OverTime.WorkDayHour) saveOaMonth.OverWorkRestDay = float32(allRecord.OverTime.RestDayHour) saveOaMonth.OverWorkHoliday = float32(allRecord.OverTime.HolidayHour) } saveOaMonth.DayOff = float32(allRecord.DayOffHours) saveOaMonth.DayOffDoing = float32(allRecord.DayOffDoingNum) saveOaMonth.Late = int32(allRecord.LateNum) saveOaMonth.CommonLateNum = int32(allRecord.CommonLateNum) saveOaMonth.CommonLateDuration = float32(allRecord.CommonLateDuration) saveOaMonth.ExtremeLateNum = int32(allRecord.ExtremeLateNum) saveOaMonth.ExtremeLateDuration = float32(allRecord.ExtremeLateDuration) saveOaMonth.Before = int32(allRecord.BeforeNum) saveOaMonth.Miss = int32(allRecord.MissNum) saveOaMonth.MakeUp = int32(allRecord.MakeUpNum) saveOaMonth.OutWork = int32(allRecord.OutWorkNum) saveOaMonth.OutWorkDoing = int32(allRecord.OutWorkDoingNum) saveOaMonth.MissDay = int32(allRecord.MissDayNum) saveOaMonth.RestDays = int32(allRecord.RestDayNum) // jhc 2024-07-06 修改 saveOaMonth.Leave = float32(allRecord.LeaveNum) saveOaMonth.LeaveDoing = float32(allRecord.LeaveDoingNum) saveOaMonth.Sick = float32(allRecord.SickDayNum) saveOaMonth.SickDoing = float32(allRecord.SickDayDoingNum) saveOaMonth.AnnualLeave = float32(allRecord.AnnualLeaveNum) saveOaMonth.AnnualLeaveDoing = float32(allRecord.AnnualLeaveDoingNum) saveOaMonth.MaternityLeave = float32(allRecord.MaternityLeaveNum) saveOaMonth.MaternityLeaveDoing = float32(allRecord.MaternityLeaveDoingNum) saveOaMonth.PaternityLeave = float32(allRecord.PaternityLeaveNum) saveOaMonth.PaternityLeaveDoing = float32(allRecord.PaternityLeaveDoingNum) saveOaMonth.MaritalLeave = float32(allRecord.MaritalLeaveNum) saveOaMonth.MaritalLeaveDoing = float32(allRecord.MaritalLeaveDoingNum) saveOaMonth.FuneralLeave = float32(allRecord.FuneralLeaveNum) saveOaMonth.FuneralLeaveDoing = float32(allRecord.FuneralLeaveDoingNum) saveOaMonth.BreastFeedingLeave = float32(allRecord.BreastFeedingLeaveNum) saveOaMonth.BreastFeedingLeaveDoing = float32(allRecord.BreastFeedingLeaveDoingNum) saveOaMonth.AttendanceGroupName = workingTime.WorkTimeTemplateName saveOaMonth.AllDayLeaveNum = int32(allRecord.AllDayLeaveNum) saveOaMonth.TotalHours = float32(allRecord.TotalHours) saveOaMonth.CommonBeforeDuration = float32(allRecord.CommonBeforeDuration) saveOaMonth.GoOutDuration = float32(allRecord.GoOutDuration) saveOaMonth.GoOutDurationDoing = float32(allRecord.GoOutDurationDoing) saveOaMonth.BusinessTripDuration = float32(allRecord.BusinessTripDuration) saveOaMonth.BusinessTripDurationDoing = float32(allRecord.BusinessTripDurationDoing) saveOaMonth.NursingLeave = float32(allRecord.NursingLeaveNum) saveOaMonth.NursingLeaveDoing = float32(allRecord.NursingLeaveDoingNum) saveOaMonth.ParentalLeave = float32(allRecord.ParentalLeaveNum) saveOaMonth.ParentalLeaveDoing = float32(allRecord.ParentalLeaveDoingNum) saveOaMonth.AbortLeave = float32(allRecord.AbortLeaveNum) saveOaMonth.AbortLeaveDoing = float32(allRecord.AbortLeaveDoingNum) saveOaMonth.MatingCheckLeave = float32(allRecord.MatingCheckLeaveNum) saveOaMonth.MatingCheckLeaveDoing = float32(allRecord.MatingCheckLeaveDoingNum) saveOaMonth.Date = common.CurrentTimeStr() saveOaMonth.EmployeeID = int64(acc.Id) // 离职员工 且 离职日期 if acc.WorkingConditionId == 81 { if acc.ResignationDate == "" { saveOaMonth.EmployeeStatus = 81 // 离职 } else if common.IsBeforeOrEqualCollectionMonthV2(acc.ResignationDate, month, "", "") { saveOaMonth.EmployeeStatus = 80 // 在职 } else { saveOaMonth.EmployeeStatus = 81 // 离职 } } saveOaMonths = append(saveOaMonths, saveOaMonth) } return saveOaMonths, nil } type OaMonthList struct { OaMonth []*oa.OaMonth // Stores month summary information for each employee AttendanceList map[uint64][]ExcelAttendanceInfo // Map to hold daily attendance for each employee (keyed by StaffUID) AllRecord map[uint64]model.CollectionDetailRes } func GenerateExcelFile(c *gin.Context, oaMonth OaMonthList, oaMonthField *oa.OaMonthField, month string) (url string, err error) { // 创建一个新的 Excel 文件 f := excelize.NewFile() var sheetHeaders []string for _, field := range oaMonthField.Field { sheetHeaders = append(sheetHeaders, field.ColumnName) } layout := "2006-01" parsedMonth, err := time.Parse(layout, month) if err != nil { service.ResponseMsg(c, e.SUCCESS, serializer.Response{ Msg: "Invalid month format. Use 'YYYY-MM'", Status: e.Failed, }) return } // 获取上个月的 26 号到这个月的 25 号 startDate := time.Date(parsedMonth.Year(), parsedMonth.Month()-1, 26, 0, 0, 0, 0, time.Local) endDate := time.Date(parsedMonth.Year(), parsedMonth.Month(), 25, 0, 0, 0, 0, time.Local) //currentDate := time.Now() // 把上个月 26 号到这个月 25 号的日期添加到表头 for d := startDate; !d.After(endDate); d = d.AddDate(0, 0, 1) { sheetHeaders = append(sheetHeaders, d.Format("01-02")) // 日期格式:月-日 } sheet := "考勤" f.SetSheetName("Sheet1", sheet) f.SetCellValue(sheet, "A1", fmt.Sprintf("月度汇总 统计日期:%s 至 %s", startDate.Format("2006-01-02"), endDate.Format("2006-01-02"))) f.MergeCell(sheet, "A1", getExcelColumnName(len(sheetHeaders)-1)+"1") A1Style, err := f.NewStyle(&excelize.Style{ Font: &excelize.Font{ Bold: true, Size: 24, Family: "新宋体", Color: "#008080", }, Alignment: &excelize.Alignment{ Horizontal: "left", Vertical: "center", }, Fill: excelize.Fill{ Type: "pattern", Color: []string{"#ccfcfc"}, // 填充背景色 Pattern: 1, }, Border: []excelize.Border{ {Type: "left", Style: 1, Color: "#000000"}, {Type: "top", Style: 1, Color: "#000000"}, {Type: "right", Style: 1, Color: "#000000"}, {Type: "bottom", Style: 1, Color: "#000000"}, }, }) f.SetCellStyle(sheet, "A1", getExcelColumnName(len(sheetHeaders)-1)+"1", A1Style) f.SetRowHeight(sheet, 1, 51.25) f.SetCellValue(sheet, "A2", fmt.Sprintf("报表生成时间: %s", time.Now().Format("2006-01-02 15:04"))) err = f.MergeCell(sheet, "A2", getExcelColumnName(len(sheetHeaders)-1)+"2") A2Style, err := f.NewStyle(&excelize.Style{ Font: &excelize.Font{ Bold: true, Size: 14, Family: "新宋体", Color: "#008080", }, Alignment: &excelize.Alignment{ Horizontal: "left", Vertical: "center", }, Fill: excelize.Fill{ Type: "pattern", Color: []string{"#ccfcfc"}, // 填充背景色 Pattern: 1, }, Border: []excelize.Border{ {Type: "left", Style: 1, Color: "#000000"}, {Type: "top", Style: 1, Color: "#000000"}, {Type: "right", Style: 1, Color: "#000000"}, {Type: "bottom", Style: 1, Color: "#000000"}, }, }) if err != nil { log.Println("Failed to create style for A2:", err) } err = f.SetCellStyle(sheet, "A2", getExcelColumnName(len(sheetHeaders)-1)+"2", A2Style) if err != nil { log.Println("Failed to set style for A2:", err) } f.SetRowHeight(sheet, 2, 25.75) if err != nil { log.Println("Failed to merge cells for A2:", err) } // 填充表头到 Excel headerStyle, err := f.NewStyle(&excelize.Style{ Font: &excelize.Font{ Bold: true, // 字体加粗 Size: 12, // 字体大小 }, Alignment: &excelize.Alignment{ Horizontal: "center", // 水平居中 Vertical: "center", // 垂直居中 }, Fill: excelize.Fill{ Type: "pattern", Color: []string{"#D9EAD3"}, // 表头背景颜色 Pattern: 1, }, Border: []excelize.Border{ {Type: "left", Style: 1, Color: "#000000"}, {Type: "right", Style: 1, Color: "#000000"}, {Type: "top", Style: 1, Color: "#000000"}, {Type: "bottom", Style: 1, Color: "#000000"}, }, }) headerStartRow := 3 for i, header := range sheetHeaders { colName := getExcelColumnName(i) + fmt.Sprint(headerStartRow) // 从第1行开始 f.SetCellValue(sheet, colName, header) // 填充表头内容 // 设置表头单元格样式 f.SetCellStyle(sheet, colName, colName, headerStyle) // 设置列宽 f.SetColWidth(sheet, getExcelColumnName(i), getExcelColumnName(i), 20) // 设置列宽为20,视具体需求调整 } for rowIndex, monthData := range oaMonth.OaMonth { rowData := []interface{}{} //colorStyles := []int{} // 用于存储样式的切片 for _, field := range oaMonthField.Field { var cellValue interface{} switch field.FieldTag { case "StaffName": cellValue = monthData.StaffName case "StaffNum": cellValue = monthData.StaffNum case "DepartmentName": cellValue = monthData.DepartmentName case "PositionName": cellValue = monthData.PositionName case "AttendanceGroupName": cellValue = monthData.AttendanceGroupName case "Status": status := "异常" if monthData.Status { status = "正常" } cellValue = status case "WorkDays": cellValue = monthData.WorkDays case "TotalHours": cellValue = monthData.TotalHours case "AverageHour": cellValue = monthData.AverageHour case "RestDays": cellValue = monthData.RestDays case "Miss": cellValue = monthData.Miss case "MakeUp": cellValue = monthData.MakeUp case "CommonLateNum": cellValue = monthData.CommonLateNum case "CommonLateDuration": cellValue = monthData.CommonLateDuration case "ExtremeLateNum": cellValue = monthData.ExtremeLateNum case "ExtremeLateDuration": cellValue = monthData.ExtremeLateDuration case "Before": cellValue = monthData.Before case "CommonBeforeDuration": cellValue = monthData.CommonBeforeDuration case "MissDay": cellValue = monthData.MissDay case "DayOff": //leaveRecords := oaMonth.AllRecord[monthData.StaffUID].DayOff //if len(leaveRecords) == 0 { // cellValue = "0" //} else { // var strValues []string // for _, record := range leaveRecords { // strValues = append(strValues, record.ApplyStartTime+" - "+record.ApplyEndTime) // } // cellValue = strings.Join(strValues, "\n") //} cellValue = monthData.DayOff case "OverWork": //leaveRecords := oaMonth.AllRecord[monthData.StaffUID].OverTime.OverWorkDetail //if len(leaveRecords) == 0 { // cellValue = "0" //} else { // var strValues []string // for _, record := range leaveRecords { // strValues = append(strValues, record.ApplyStartTime+" - "+record.ApplyEndTime) // } // cellValue = strings.Join(strValues, "\n") //} cellValue = monthData.OverWork case "OverWorkWorkDay": cellValue = monthData.OverWorkWorkDay case "OverWorkRestDay": cellValue = monthData.OverWorkRestDay case "OverWorkHoliday": cellValue = monthData.OverWorkHoliday case "OutWork": //leaveRecords := oaMonth.AllRecord[monthData.StaffUID].OutWork //if len(leaveRecords) == 0 { // cellValue = "0" //} else { // var strValues []string // for _, record := range leaveRecords { // strValues = append(strValues, record.WorkDate) // } // cellValue = strings.Join(strValues, "\n") //} cellValue = monthData.OutWork case "BusinessTripDuration": leaveRecords := oaMonth.AllRecord[monthData.StaffUID].BusinessTrip if len(leaveRecords) == 0 { cellValue = "0" } else { var strValues []string for _, record := range leaveRecords { if len(record.ItineraryList) > 0 { for _, s := range record.ItineraryList { strValues = append(strValues, s.ApplyStartTime+" - "+s.ApplyEndTime) } cellValue = strings.Join(strValues, "\n") } } } case "GoOutDuration": leaveRecords := oaMonth.AllRecord[monthData.StaffUID].GoOut if len(leaveRecords) == 0 { cellValue = "0" } else { var strValues []string for _, record := range leaveRecords { strValues = append(strValues, record.ApplyStartTime+" - "+record.ApplyEndTime) } cellValue = strings.Join(strValues, "\n") } //cellValue = monthData.GoOutDuration case "AllDayLeaveNum": cellValue = monthData.AllDayLeaveNum case "AnnualLeave": //leaveRecords := oaMonth.AllRecord[monthData.StaffUID].AnnualLeave //if len(leaveRecords) == 0 { // cellValue = "0" //} else { // var strValues []string // for _, record := range leaveRecords { // strValues = append(strValues, record.ApplyStartTime+" - "+record.ApplyEndTime) // } // cellValue = strings.Join(strValues, "\n") //} cellValue = monthData.AnnualLeave case "Leave": //leaveRecords := oaMonth.AllRecord[monthData.StaffUID].Leave //if len(leaveRecords) == 0 { // cellValue = "0" //} else { // var strValues []string // for _, record := range leaveRecords { // strValues = append(strValues, record.ApplyStartTime+" - "+record.ApplyEndTime) // } // cellValue = strings.Join(strValues, "\n") //} cellValue = monthData.Leave case "Sick": //leaveRecords := oaMonth.AllRecord[monthData.StaffUID].Sick //if len(leaveRecords) == 0 { // cellValue = "0" //} else { // var strValues []string // for _, record := range leaveRecords { // strValues = append(strValues, record.ApplyStartTime+" - "+record.ApplyEndTime) // } // cellValue = strings.Join(strValues, "\n") //} cellValue = monthData.Sick case "MaternityLeave": //leaveRecords := oaMonth.AllRecord[monthData.StaffUID].MaternityLeave //if len(leaveRecords) == 0 { // cellValue = "0" //} else { // var strValues []string // for _, record := range leaveRecords { // strValues = append(strValues, record.ApplyStartTime+" - "+record.ApplyEndTime) // } // cellValue = strings.Join(strValues, "\n") //} cellValue = monthData.MaternityLeave case "BreastFeedingLeave": //leaveRecords := oaMonth.AllRecord[monthData.StaffUID].BreastFeedingLeave //if len(leaveRecords) == 0 { // cellValue = "0" //} else { // var strValues []string // for _, record := range leaveRecords { // strValues = append(strValues, record.ApplyStartTime+" - "+record.ApplyEndTime) // } // cellValue = strings.Join(strValues, "\n") //} cellValue = monthData.BreastFeedingLeave case "PaternityLeave": //leaveRecords := oaMonth.AllRecord[monthData.StaffUID].PaternityLeave //if len(leaveRecords) == 0 { // cellValue = "0" //} else { // var strValues []string // for _, record := range leaveRecords { // strValues = append(strValues, record.ApplyStartTime+" - "+record.ApplyEndTime) // } // cellValue = strings.Join(strValues, "\n") //} cellValue = monthData.PaternityLeave case "MaritalLeave": //leaveRecords := oaMonth.AllRecord[monthData.StaffUID].MaritalLeave //if len(leaveRecords) == 0 { // cellValue = "0" //} else { // var strValues []string // for _, record := range leaveRecords { // strValues = append(strValues, record.ApplyStartTime+" - "+record.ApplyEndTime) // } // cellValue = strings.Join(strValues, "\n") //} cellValue = monthData.MaritalLeave case "FuneralLeave": //leaveRecords := oaMonth.AllRecord[monthData.StaffUID].FuneralLeave //if len(leaveRecords) == 0 { // cellValue = "0" //} else { // var strValues []string // for _, record := range leaveRecords { // strValues = append(strValues, record.ApplyStartTime+" - "+record.ApplyEndTime) // } // cellValue = strings.Join(strValues, "\n") //} cellValue = monthData.FuneralLeave case "ParentalLeave": //leaveRecords := oaMonth.AllRecord[monthData.StaffUID].ParentalLeave //if len(leaveRecords) == 0 { // cellValue = "0" //} else { // var strValues []string // for _, record := range leaveRecords { // strValues = append(strValues, record.ApplyStartTime+" - "+record.ApplyEndTime) // } // cellValue = strings.Join(strValues, "\n") //} cellValue = monthData.ParentalLeave case "NursingLeave": //leaveRecords := oaMonth.AllRecord[monthData.StaffUID].NursingLeave //if len(leaveRecords) == 0 { // cellValue = "0" //} else { // var strValues []string // for _, record := range leaveRecords { // strValues = append(strValues, record.ApplyStartTime+" - "+record.ApplyEndTime) // } // cellValue = strings.Join(strValues, "\n") //} cellValue = monthData.NursingLeave case "AbortLeave": //leaveRecords := oaMonth.AllRecord[monthData.StaffUID].AbortLeave //if len(leaveRecords) == 0 { // cellValue = "0" //} else { // var strValues []string // for _, record := range leaveRecords { // strValues = append(strValues, record.ApplyStartTime+" - "+record.ApplyEndTime) // } // cellValue = strings.Join(strValues, "\n") //} cellValue = monthData.AbortLeave case "MatingCheckLeave": //leaveRecords := oaMonth.AllRecord[monthData.StaffUID].MatingCheckLeave //if len(leaveRecords) == 0 { // cellValue = "0" //} else { // var strValues []string // for _, record := range leaveRecords { // strValues = append(strValues, record.ApplyStartTime+" - "+record.ApplyEndTime) // } // cellValue = strings.Join(strValues, "\n") //} cellValue = monthData.MatingCheckLeave default: cellValue = "" } rowData = append(rowData, cellValue) col := getExcelColumnName(len(rowData)-1) + fmt.Sprint(rowIndex+4) // 获取当前列名 cellStyle, err := f.NewStyle(&excelize.Style{ Alignment: &excelize.Alignment{ Horizontal: "center", // 水平居中 Vertical: "center", // 垂直居中 WrapText: true, // 启用换行 }, Border: []excelize.Border{ {Type: "left", Style: 1, Color: "#000000"}, {Type: "right", Style: 1, Color: "#000000"}, {Type: "top", Style: 1, Color: "#000000"}, {Type: "bottom", Style: 1, Color: "#000000"}, }, }) if err == nil { f.SetCellStyle(sheet, col, col, cellStyle) // 设置边框样式 } } // 处理每日考勤数据 if attendance, ok := oaMonth.AttendanceList[monthData.StaffUID]; ok { for _, i := range attendance { rowData = append(rowData, i.Attendance) // 只填充日期的颜色样式 if i.Date != "" { // 假设 i.Date 是日期字段 col := getExcelColumnName(len(rowData) - 1) // 获取当前列名 cell := col + fmt.Sprint(rowIndex+4) // 行号从2开始,因为1是表头 nowStyle, _ := f.NewStyle(i.Colour) f.SetCellStyle(sheet, cell, cell, nowStyle) // 设置样式 } } } // 填充每行的数据到 Excel for colIndex, cellValue := range rowData { col := getExcelColumnName(colIndex) + fmt.Sprint(rowIndex+4) // 行号从2开始,因为1是表头 f.SetCellValue(sheet, col, cellValue) } } // 将文件写入内存 var buffer bytes.Buffer if err := f.Write(&buffer); err != nil { c.JSON(500, gin.H{"error": "Failed to generate Excel file"}) return "", fmt.Errorf("Failed to generate Excel file: %w", err) } // 设置响应头,返回 Excel 文件 fileName := fmt.Sprintf("月度汇总%s~%s.xlsx", startDate.Format("20060102"), endDate.Format("20060102")) content := bytes.NewReader(buffer.Bytes()) localFile, err := os.Create("./data/" + fileName) fileDir := "/attendance/excel/" + fmt.Sprintf("%d", time.Now().Unix()) + "_" + fileName if err != nil { return "", fmt.Errorf("failed to create local file: %w", err) } defer localFile.Close() // 将内容写入本地文件 _, err = io.Copy(localFile, content) if err != nil { return "", fmt.Errorf("failed to write content to local file: %w", err) } inputUrl, err := service.PutBosWithName(localFile.Name(), true, fileDir) if err != nil { //return "", fmt.Errorf("failed to upload file to OSS: %w", err) } return inputUrl, nil //utils.ResponseXls(c, content, fileName) } func getExcelColumnName(colIndex int) string { columnName := "" for colIndex >= 0 { columnName = string('A'+(colIndex%26)) + columnName colIndex = colIndex/26 - 1 } return columnName } // FilterEmployeesInfo 筛选员工信息 func FilterEmployeesInfo(accountInfos []*account.AccountInfo, staffName, departmentName string) []*account.AccountInfo { // 1. 通过部门名称过滤员工信息 filterNoIDAccountInfos := make([]*account.AccountInfo, 0) for _, accountInfo := range accountInfos { retAccountInfo := accountInfo if retAccountInfo.ID == 0 || retAccountInfo.Positions == nil || len(retAccountInfo.Positions) == 0 { continue } else { filterNoIDAccountInfos = append(filterNoIDAccountInfos, retAccountInfo) } } if departmentName == "" && staffName == "" { return filterNoIDAccountInfos } if departmentName != "" { filterDepartmentNameAccountInfos := make([]*account.AccountInfo, 0) for _, accountInfo := range filterNoIDAccountInfos { retAccountInfo := accountInfo for _, pos := range retAccountInfo.Positions { if pos.DepartmentName == departmentName { filterDepartmentNameAccountInfos = append(filterDepartmentNameAccountInfos, retAccountInfo) break } } } filterNoIDAccountInfos = filterDepartmentNameAccountInfos } if staffName != "" { filterStaffNameAccountInfos := make([]*account.AccountInfo, 0) for _, accountInfo := range filterNoIDAccountInfos { retAccountInfo := accountInfo if strings.Contains(retAccountInfo.NickName, staffName) { filterStaffNameAccountInfos = append(filterStaffNameAccountInfos, retAccountInfo) } } filterNoIDAccountInfos = filterStaffNameAccountInfos } return filterNoIDAccountInfos } func MakeOaMonthByDates(req *oa.OaMonthReq, accountInfos []*account.AccountInfo) []*model.CollectionEmployeesDetailRes { collectionDetails := make([]*model.CollectionEmployeesDetailRes, 0) accountChan := make(chan []*account.AccountInfo) // 启动一个goroutine来填充通道 go func() { defer close(accountChan) for page := int((req.Page - 1) * req.PageSize); page < len(accountInfos); page += int(req.PageSize) { // 确保页面计算不会超出accountInfos的长度 start := page end := start + int(req.PageSize) if end > len(accountInfos) { end = len(accountInfos) } accountChan <- accountInfos[start:end] break } }() // 使用sync.WaitGroup来等待所有goroutine完成 var wg sync.WaitGroup // 启动多个goroutine来处理通道中的数据 for accountInfoInChain := range accountChan { // 确保不会处理超出accountInfos长度的数据 if len(accountInfoInChain) == 0 { break // 如果没有数据,退出循环 } for _, info := range accountInfoInChain { // 为每个数据项启动一个goroutine wg.Add(1) go func(info *account.AccountInfo) { collectionDetails = append(collectionDetails, MakeOaMonthByDatesSingleAccount(req, info)) // 处理数据项 wg.Done() // 完成时减少计数 }(info) } } // 等待所有goroutine完成 wg.Wait() return collectionDetails } // MakeOaMonthByDatesSingleAccount 生成考勤统计信息 func MakeOaMonthByDatesSingleAccount(req *oa.OaMonthReq, accountInfo *account.AccountInfo) *model.CollectionEmployeesDetailRes { res := new(model.CollectionEmployeesDetailRes) useInfo := accountInfo positionUser := make([]*rule.PositionUser, 0) for i := 0; i < len(accountInfo.Positions); i++ { positionUser = append(positionUser, &rule.PositionUser{ PositionID: accountInfo.Positions[i].PositionID, PositionName: accountInfo.Positions[i].PositionName, DepartmentId: accountInfo.Positions[i].DepartmentId, DepartmentCode: accountInfo.Positions[i].DepartmentName, }) } workingTime, workingTimeErr := QueryWorkingTimeInUse(positionUser, useInfo.ID) if workingTimeErr != nil { fmt.Errorf("QueryWorkingTimeInUseTempAccount err: %v", workingTimeErr) return res } // 从 req 中获取日期 dates := holiday.SplitDates(req.StartDate, req.EndDate, common.YYMMDD) allRecordReq := &model.CollectionDetailReq{ StaffUID: accountInfo.ID, Dates: dates, } collectionDetailRes, err := AllRecord(allRecordReq, workingTime) // 剔除 特殊情况的记录 collectionDetailRes.WorkDay = RemoveRecord(collectionDetailRes.WorkDay) res.StaffUID = useInfo.ID res.StaffName = useInfo.NickName res.StaffNum = useInfo.JobNum res.DepartmentUID, _ = strconv.ParseInt(workingTime.DepartmentUID, 10, 64) res.DepartmentName = workingTime.DepartmentName res.PositionUID, _ = strconv.ParseInt(workingTime.PositionUID, 10, 64) res.PositionName = workingTime.PositionName res.AttendanceGroupName = workingTime.WorkTimeTemplateName res.TotalHours = collectionDetailRes.TotalHours res.Status = collectionDetailRes.Status res.WorkDay = collectionDetailRes.WorkDay res.AllDayLeaveNum = collectionDetailRes.AllDayLeaveNum res.AllDayLeave = collectionDetailRes.AllDayLeave res.NeedAttendanceDayNum = collectionDetailRes.NeedAttendanceDayNum res.WorkDays = collectionDetailRes.AttendanceDayNum res.AttendanceDayNum = collectionDetailRes.AttendanceDayNum res.AttendanceRestDayNum = collectionDetailRes.AttendanceRestDayNum res.AttendanceHolidayNum = collectionDetailRes.AttendanceHolidayNum res.AttendanceWorkDayNum = collectionDetailRes.AttendanceWorkDayNum res.AverageHourDetail = collectionDetailRes.AverageHour res.AverageHour = collectionDetailRes.AverageHourNum res.RestDaysDetail = collectionDetailRes.RestDay res.RestDays = collectionDetailRes.RestDayNum res.MissDetail = collectionDetailRes.Miss res.Miss = collectionDetailRes.MissNum res.MakeUpDetail = collectionDetailRes.MakeUp res.MakeUp = collectionDetailRes.MakeUpNum res.LateDetail = collectionDetailRes.Late res.Late = collectionDetailRes.LateNum res.CommonLateNum = collectionDetailRes.CommonLateNum res.CommonLateDuration = collectionDetailRes.CommonLateDuration res.ExtremeLateNum = collectionDetailRes.ExtremeLateNum res.ExtremeLateDuration = collectionDetailRes.ExtremeLateDuration res.BeforeDetail = collectionDetailRes.Before res.Before = collectionDetailRes.BeforeNum res.CommonBeforeDuration = collectionDetailRes.CommonBeforeDuration res.MissDayDetail = collectionDetailRes.MissDay res.MissDay = collectionDetailRes.MissDayNum res.OutWorkDetail = collectionDetailRes.OutWork res.OutWork = collectionDetailRes.OutWorkNum res.OverWorkDetail = collectionDetailRes.OverTime res.OverWork = float32(collectionDetailRes.OverTime.OverWorkHour) res.OverWorkWorkDay = float32(collectionDetailRes.OverTime.WorkDayHour) res.OverWorkRestDay = float32(collectionDetailRes.OverTime.RestDayHour) res.OverWorkHoliday = float32(collectionDetailRes.OverTime.HolidayHour) res.LeaveDetail = collectionDetailRes.Leave res.Leave = collectionDetailRes.LeaveNum res.AnnualLeaveDetail = collectionDetailRes.AnnualLeave res.AnnualLeave = collectionDetailRes.AnnualLeaveNum res.SickDetail = collectionDetailRes.Sick res.Sick = collectionDetailRes.SickDayNum res.BreastFeedingLeaveDetail = collectionDetailRes.BreastFeedingLeave res.BreastFeedingLeave = collectionDetailRes.BreastFeedingLeaveNum res.PaternityLeaveDetail = collectionDetailRes.PaternityLeave res.PaternityLeave = collectionDetailRes.PaternityLeaveNum res.MaritalLeaveDetail = collectionDetailRes.MaritalLeave res.MaritalLeave = collectionDetailRes.MaritalLeaveNum res.FuneralLeaveDetail = collectionDetailRes.FuneralLeave res.FuneralLeave = collectionDetailRes.FuneralLeaveNum res.MaternityLeaveDetail = collectionDetailRes.MaternityLeave res.MaternityLeave = collectionDetailRes.MaternityLeaveNum res.DayOffDetail = collectionDetailRes.DayOff res.DayOff = collectionDetailRes.DayOffHours res.DayOffNum = collectionDetailRes.DayOffNum res.GoOutDetail = collectionDetailRes.GoOut res.GoOutDuration = collectionDetailRes.GoOutDuration res.BusinessTripDetail = collectionDetailRes.BusinessTrip res.BusinessTripDuration = collectionDetailRes.BusinessTripDuration res.ParentalLeaveDetail = collectionDetailRes.ParentalLeave res.ParentalLeave = collectionDetailRes.ParentalLeaveNum res.NursingLeaveDetail = collectionDetailRes.NursingLeave res.NursingLeave = collectionDetailRes.NursingLeaveNum res.AbortLeaveDetail = collectionDetailRes.AbortLeave res.AbortLeave = collectionDetailRes.AbortLeaveNum res.MatingCheckLeaveDetail = collectionDetailRes.MatingCheckLeave res.MatingCheckLeave = collectionDetailRes.MatingCheckLeaveNum res.AllLeaveDetail = collectionDetailRes.AllLeaveDetail res.AllLeave = collectionDetailRes.AllLeaveNum res.CollectionType = model.All fmt.Printf("res %+v\n", res) fmt.Printf("err %+v\n", err) return res } // FilterEmployeesInfoEmployee 筛选员工信息 员工档案 添加 剔除 离职员工 逻辑 func FilterEmployeesInfoEmployee(accountInfos []*employee.FindEmployeeFileListInfo, staffName string, departmentUID int64, month, startDate, endDate string) []*employee.FindEmployeeFileListInfo { // 1. 通过部门名称过滤员工信息 filterNoIDAccountInfos := make([]*employee.FindEmployeeFileListInfo, 0) for _, accountInfo := range accountInfos { retAccountInfo := accountInfo if retAccountInfo.UserId == 0 { continue } else if retAccountInfo.WorkingConditionId == 81 { if retAccountInfo.ResignationDate == "" { continue } if !common.IsBeforeOrEqualCollectionMonthV2(retAccountInfo.ResignationDate, month, startDate, endDate) { continue } } filterNoIDAccountInfos = append(filterNoIDAccountInfos, retAccountInfo) } if departmentUID == 0 && staffName == "" { return filterNoIDAccountInfos } if departmentUID != 0 { filterDepartmentNameAccountInfos := make([]*employee.FindEmployeeFileListInfo, 0) for _, accountInfo := range filterNoIDAccountInfos { retAccountInfo := accountInfo for _, pos := range retAccountInfo.DepartmentPostList { if pos.DepartmentId == uint64(departmentUID) { filterDepartmentNameAccountInfos = append(filterDepartmentNameAccountInfos, retAccountInfo) break } } } filterNoIDAccountInfos = filterDepartmentNameAccountInfos } if staffName != "" { filterStaffNameAccountInfos := make([]*employee.FindEmployeeFileListInfo, 0) for _, accountInfo := range filterNoIDAccountInfos { retAccountInfo := accountInfo if strings.Contains(retAccountInfo.Name, staffName) { filterStaffNameAccountInfos = append(filterStaffNameAccountInfos, retAccountInfo) } } filterNoIDAccountInfos = filterStaffNameAccountInfos } return filterNoIDAccountInfos } // MakeOaMonthByDatesEmployee 生成考勤统计信息 员工档案 func MakeOaMonthByDatesEmployee(req *oa.OaMonthReq, accountInfos []*employee.FindEmployeeFileListInfo) []*model.CollectionEmployeesDetailRes { collectionDetails := make([]*model.CollectionEmployeesDetailRes, 0) accountChan := make(chan []*employee.FindEmployeeFileListInfo) // 启动一个goroutine来填充通道 go func() { defer close(accountChan) for page := int((req.Page - 1) * req.PageSize); page < len(accountInfos); page += int(req.PageSize) { // 确保页面计算不会超出accountInfos的长度 start := page end := start + int(req.PageSize) if end > len(accountInfos) { end = len(accountInfos) } accountChan <- accountInfos[start:end] break } }() // 使用sync.WaitGroup来等待所有goroutine完成 var wg sync.WaitGroup // 启动多个goroutine来处理通道中的数据 for accountInfoInChain := range accountChan { // 确保不会处理超出accountInfos长度的数据 if len(accountInfoInChain) == 0 { break // 如果没有数据,退出循环 } for _, info := range accountInfoInChain { // 为每个数据项启动一个goroutine wg.Add(1) go func(info *employee.FindEmployeeFileListInfo) { collectionDetails = append(collectionDetails, MakeOaMonthByDatesSingleEmployee(req, info)) // 处理数据项 wg.Done() // 完成时减少计数 }(info) } } // 等待所有goroutine完成 wg.Wait() return collectionDetails } // MakeOaMonthByDatesSingleEmployee 生成考勤统计信息 员工档案 func MakeOaMonthByDatesSingleEmployee(req *oa.OaMonthReq, accountInfo *employee.FindEmployeeFileListInfo) *model.CollectionEmployeesDetailRes { res := new(model.CollectionEmployeesDetailRes) useInfo := accountInfo workingTime, workingTimeErr := QueryWorkingTimeFormal(accountInfo.CurrentAttendanceSectionUuid) if workingTimeErr != nil { fmt.Errorf("QueryWorkingTimeInUseTempAccount err: %v", workingTimeErr) // 返回默认数据 return MakeDefaultOaMonthByDatesSingleEmployee(accountInfo) } // 从 req 中获取日期 dates := holiday.SplitDates(req.StartDate, req.EndDate, common.YYMMDD) allRecordReq := &model.CollectionDetailReq{ StaffUID: accountInfo.UserId, Dates: dates, } collectionDetailRes, err := AllRecord(allRecordReq, workingTime) // 剔除 特殊情况的记录 //collectionDetailRes.WorkDay = RemoveRecord(collectionDetailRes.WorkDay) // 获取员工档案信息 中的 部门 岗位信息 employeeInfo := MakeDefaultOaMonthByDatesSingleEmployee(accountInfo) res.StaffUID = useInfo.UserId res.StaffName = useInfo.Name res.StaffNum = useInfo.JobNumber res.DepartmentUID, _ = strconv.ParseInt(workingTime.DepartmentUID, 10, 64) res.DepartmentName = employeeInfo.DepartmentName res.PositionUID, _ = strconv.ParseInt(workingTime.PositionUID, 10, 64) res.PositionName = employeeInfo.PositionName res.AttendanceGroupName = workingTime.WorkTimeTemplateName res.TotalHours = collectionDetailRes.TotalHours res.Status = collectionDetailRes.Status res.WorkDay = collectionDetailRes.WorkDay res.AllDayLeaveNum = collectionDetailRes.AllDayLeaveNum res.AllDayLeave = collectionDetailRes.AllDayLeave res.NeedAttendanceDayNum = collectionDetailRes.NeedAttendanceDayNum res.WorkDays = collectionDetailRes.AttendanceDayNum res.AttendanceDayNum = collectionDetailRes.AttendanceDayNum res.AttendanceRestDayNum = collectionDetailRes.AttendanceRestDayNum res.AttendanceHolidayNum = collectionDetailRes.AttendanceHolidayNum res.AttendanceWorkDayNum = collectionDetailRes.AttendanceWorkDayNum res.AverageHourDetail = collectionDetailRes.AverageHour res.AverageHour = collectionDetailRes.AverageHourNum res.RestDaysDetail = collectionDetailRes.RestDay res.RestDays = collectionDetailRes.RestDayNum res.MissDetail = collectionDetailRes.Miss res.Miss = collectionDetailRes.MissNum res.MakeUpDetail = collectionDetailRes.MakeUp res.MakeUp = collectionDetailRes.MakeUpNum //res.MakeUpDoing = collectionDetailRes.MakeUpDoingNum res.LateDetail = collectionDetailRes.Late res.Late = collectionDetailRes.LateNum res.CommonLateNum = collectionDetailRes.CommonLateNum res.CommonLateDuration = collectionDetailRes.CommonLateDuration res.ExtremeLateNum = collectionDetailRes.ExtremeLateNum res.ExtremeLateDuration = collectionDetailRes.ExtremeLateDuration res.BeforeDetail = collectionDetailRes.Before res.Before = collectionDetailRes.BeforeNum res.CommonBeforeDuration = collectionDetailRes.CommonBeforeDuration res.MissDayDetail = collectionDetailRes.MissDay res.MissDay = collectionDetailRes.MissDayNum res.OutWorkDetail = collectionDetailRes.OutWork res.OutWork = collectionDetailRes.OutWorkNum res.OutWorkDoing = collectionDetailRes.OutWorkDoingNum res.OverWorkDetail = collectionDetailRes.OverTime res.OverWork = float32(collectionDetailRes.OverTime.OverWorkHour) res.OverWorkDoing = float32(collectionDetailRes.OverTimeDoingNum) res.OverWorkWorkDay = float32(collectionDetailRes.OverTime.WorkDayHour) res.OverWorkRestDay = float32(collectionDetailRes.OverTime.RestDayHour) res.OverWorkHoliday = float32(collectionDetailRes.OverTime.HolidayHour) res.LeaveDetail = collectionDetailRes.Leave res.Leave = collectionDetailRes.LeaveNum res.LeaveDoing = collectionDetailRes.LeaveDoingNum res.AnnualLeaveDetail = collectionDetailRes.AnnualLeave res.AnnualLeave = collectionDetailRes.AnnualLeaveNum res.AnnualLeaveDoing = collectionDetailRes.AnnualLeaveDoingNum res.SickDetail = collectionDetailRes.Sick res.Sick = collectionDetailRes.SickDayNum res.SickDoing = collectionDetailRes.SickDayDoingNum res.BreastFeedingLeaveDetail = collectionDetailRes.BreastFeedingLeave res.BreastFeedingLeave = collectionDetailRes.BreastFeedingLeaveNum res.BreastFeedingLeaveDoing = collectionDetailRes.BreastFeedingLeaveDoingNum res.PaternityLeaveDetail = collectionDetailRes.PaternityLeave res.PaternityLeave = collectionDetailRes.PaternityLeaveNum res.PaternityLeaveDoing = collectionDetailRes.PaternityLeaveDoingNum res.MaritalLeaveDetail = collectionDetailRes.MaritalLeave res.MaritalLeave = collectionDetailRes.MaritalLeaveNum res.MaritalLeaveDoing = collectionDetailRes.MaritalLeaveDoingNum res.FuneralLeaveDetail = collectionDetailRes.FuneralLeave res.FuneralLeave = collectionDetailRes.FuneralLeaveNum res.FuneralLeaveDoing = collectionDetailRes.FuneralLeaveDoingNum res.MaternityLeaveDetail = collectionDetailRes.MaternityLeave res.MaternityLeave = collectionDetailRes.MaternityLeaveNum res.MaternityLeaveDoing = collectionDetailRes.MaternityLeaveDoingNum res.DayOffDetail = collectionDetailRes.DayOff res.DayOff = collectionDetailRes.DayOffHours res.DayOffNum = collectionDetailRes.DayOffNum res.DayOffNumDoing = collectionDetailRes.DayOffDoingNum res.GoOutDetail = collectionDetailRes.GoOut res.GoOutDuration = collectionDetailRes.GoOutDuration res.GoOutDurationDoing = collectionDetailRes.GoOutDurationDoing res.BusinessTripDetail = collectionDetailRes.BusinessTrip res.BusinessTripDuration = collectionDetailRes.BusinessTripDuration res.BusinessTripDurationDoing = collectionDetailRes.BusinessTripDurationDoing res.ParentalLeaveDetail = collectionDetailRes.ParentalLeave res.ParentalLeave = collectionDetailRes.ParentalLeaveNum res.ParentalLeaveDoing = collectionDetailRes.ParentalLeaveDoingNum res.NursingLeaveDetail = collectionDetailRes.NursingLeave res.NursingLeave = collectionDetailRes.NursingLeaveNum res.NursingLeaveDoing = collectionDetailRes.NursingLeaveDoingNum res.AbortLeaveDetail = collectionDetailRes.AbortLeave res.AbortLeave = collectionDetailRes.AbortLeaveNum res.AbortLeaveDoing = collectionDetailRes.AbortLeaveDoingNum res.MatingCheckLeaveDetail = collectionDetailRes.MatingCheckLeave res.MatingCheckLeave = collectionDetailRes.MatingCheckLeaveNum res.MatingCheckLeaveDoing = collectionDetailRes.MatingCheckLeaveDoingNum res.AllLeaveDetail = collectionDetailRes.AllLeaveDetail res.AllLeave = collectionDetailRes.AllLeaveNum res.CollectionType = model.All fmt.Printf("res %+v\n", res) fmt.Printf("err %+v\n", err) return res } func MakeDefaultOaMonthByDatesSingleEmployee(accountInfo *employee.FindEmployeeFileListInfo) *model.CollectionEmployeesDetailRes { res := new(model.CollectionEmployeesDetailRes) res.StaffUID = accountInfo.UserId res.StaffName = accountInfo.Name res.StaffNum = accountInfo.JobNumber // 查询员工档案信息 infoRes, err := service.GrpcEmployeeProvider.QueryBasicInfoAboutEmployees(context.Background(), &employee.QueryBasicInfoAboutEmployeesRequest{ EmployeeFileId: []uint64{accountInfo.Id}, }) if err != nil { fmt.Errorf("QueryBasicInfoAboutEmployees err: %v", err) return res } if len(infoRes.List) == 0 { return res } res.DepartmentName = infoRes.List[0].DepartmentNames res.PositionName = infoRes.List[0].PositionNames return res }