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"` po.UserActivity } func main() { dao.Setup() Student() } 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") } }