1782 lines
72 KiB
Go
1782 lines
72 KiB
Go
|
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
|
|||
|
}
|