package main import ( "integrity-checkin/dao" "integrity-checkin/data/po" "io" "os" "sort" "strconv" ) type UserActivityWithRealName struct { RealName string `json:"real_name"` Username string `json:"username"` ActivityName string `json:"activity_name"` po.UserActivity } func main() { dao.Setup() UserActivity() } func UserActivity() { var userActivities []UserActivityWithRealName err := dao.DB.Raw("select u.real_name,u.username,a.name activity_name,ua.* from user_activity ua " + " left join users u on u.id=ua.user_id " + " left join activities a on a.id=ua.activity_id where u.type=1 and ua.credit!=0").Find(&userActivities).Error if err != nil { panic(err) } f, err := os.OpenFile("out.csv", os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0644) if err != nil { panic(err) } io.WriteString(f, "姓名,学号,日期,活动,图片\n") for _, userActivity := range userActivities { io.WriteString(f, userActivity.RealName+","+userActivity.Username+","+ userActivity.Day+","+userActivity.ActivityName+","+userActivity.Files+"\n") } } func Student() { var userActivities []UserActivityWithRealName err := dao.DB.Raw("select u.real_name,u.username,ua.* from user_activity ua " + " left join users u on u.id=ua.user_id where u.type=1").Find(&userActivities).Error if err != nil { panic(err) } days := map[string]struct{}{} studentDays := map[string]map[string]int{} username2realName := map[string]string{} for _, userActivity := range userActivities { if _, ok := days[userActivity.Day]; !ok { days[userActivity.Day] = struct{}{} } if studentDays[userActivity.Username] == nil { studentDays[userActivity.Username] = map[string]int{} username2realName[userActivity.Username] = userActivity.RealName } studentDays[userActivity.Username][userActivity.Day] += userActivity.Credit } var daysArr []string for day := range days { daysArr = append(daysArr, day) } sort.Slice(daysArr, func(i, j int) bool { return daysArr[i] < daysArr[j] }) f, err := os.OpenFile("out.csv", os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0644) if err != nil { panic(err) } io.WriteString(f, "姓名,学号") for _, day := range daysArr { io.WriteString(f, ","+day) } io.WriteString(f, "\n") for username, studentMap := range studentDays { io.WriteString(f, username2realName[username]+",") io.WriteString(f, username) for _, day := range daysArr { if credit, ok := studentMap[day]; ok { io.WriteString(f, ","+strconv.Itoa(credit)) } else { io.WriteString(f, ",0") } } io.WriteString(f, "\n") } } func Teacher() { var userActivities []UserActivityWithRealName err := dao.DB.Raw("select u.real_name,u.username,ua.* from user_activity ua " + " left join users u on u.id=ua.user_id where u.type=2").Find(&userActivities).Error if err != nil { panic(err) } days := map[string]struct{}{} teacherDays := map[string]map[string]struct{}{} username2realName := map[string]string{} for _, userActivity := range userActivities { if _, ok := days[userActivity.Day]; !ok { days[userActivity.Day] = struct{}{} } if teacherDays[userActivity.Username] == nil { teacherDays[userActivity.Username] = map[string]struct{}{} username2realName[userActivity.Username] = userActivity.RealName } teacherDays[userActivity.Username][userActivity.Day] = struct{}{} } var daysArr []string for day := range days { daysArr = append(daysArr, day) } sort.Slice(daysArr, func(i, j int) bool { return daysArr[i] < daysArr[j] }) f, err := os.OpenFile("out.csv", os.O_WRONLY|os.O_CREATE, 0644) if err != nil { panic(err) } io.WriteString(f, "姓名,工号") for _, day := range daysArr { io.WriteString(f, ","+day) } io.WriteString(f, "\n") for username, teacherMap := range teacherDays { io.WriteString(f, username2realName[username]+",") io.WriteString(f, username) for _, day := range daysArr { if _, ok := teacherMap[day]; ok { io.WriteString(f, ",1") } else { io.WriteString(f, ",0") } } io.WriteString(f, "\n") } }