fonchain-fiee/pkg/service/oa_new/oa_logic/collectionLogic.go

1782 lines
72 KiB
Go
Raw Normal View History

2025-02-19 06:24:15 +00:00
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
}