package svc import ( "applet/app/admin/md" "applet/app/db" "applet/app/db/model" "applet/app/enum" "applet/app/utils" "applet/app/utils/logx" "archive/zip" "encoding/json" "fmt" "github.com/360EntSecGroup-Skylar/excelize" "github.com/syyongx/php2go" "io" "os" "strconv" "time" ) func NursingHomeDataStatisticsExport(req md.NursingHomeDataStatisticsExportReq) { var titleList []string var fileName string var now = time.Now() xlsx := excelize.NewFile() xlsx.SetSheetRow("Sheet1", "A1", &titleList) switch req.Kind { case 1: //订单列表 fileName = "/export/nursing_home/订单列表_" + utils.Int64ToStr(now.UnixMilli()) + ".xlsx" //查找订单数据 sess := db.Db.Desc("nursing_home_package_ord.id") if req.EnterpriseId != 0 { sess.And("nursing_home_package_ord.enterprise_id =?", req.EnterpriseId) } if req.StartDate != "" { sess.And("nursing_home_package_ord.create_at >= ?", req.StartDate) } if req.EndDate != "" { sess.And("nursing_home_package_ord.create_at <= ?", req.EndDate) } var m []*db.NursingHomePackageOrdWithUserIdentity _, err := sess. Join("LEFT", "user_identity", "nursing_home_package_ord.user_identity_id = user_identity.id"). Join("LEFT", "enterprise", "enterprise.id = nursing_home_package_ord.enterprise_id"). Join("LEFT", "user", "user.id = nursing_home_package_ord.uid"). FindAndCount(&m) if err != nil { logx.Error(err) println("<<<>>>>Error:::", err.Error()) return } titleList = []string{"单位名称", "用户身份名称", "用户手机号", "购买类型", "总价", "商户订单号", "支付状态", "购买时间"} xlsx.SetSheetRow("Sheet1", "A1", &titleList) j := 2 //表头被第一行用了,只能从第二行开始 for _, v := range m { var kind string //1:按年购买 2:按月购买 3:按天购买 4:补餐 switch v.NursingHomePackageOrd.Kind { case 1: kind = "按年购买" break case 2: kind = "按月购买" break case 3: kind = "按天购买" break case 4: kind = "补餐" break } var state string //0:待支付 1:支付成功 2:支付失败 switch v.NursingHomePackageOrd.State { case enum.NursingHomePackageOrdStateForWait: state = enum.NursingHomePackageOrdState.String(enum.NursingHomePackageOrdStateForWait) break case enum.NursingHomePackageOrdStateForSuccess: state = enum.NursingHomePackageOrdState.String(enum.NursingHomePackageOrdStateForWait) break case enum.NursingHomePackageOrdStateForFail: state = enum.NursingHomePackageOrdState.String(enum.NursingHomePackageOrdStateForFail) break } xlsx.SetSheetRow("Sheet1", "A"+strconv.Itoa(j), &[]interface{}{v.Enterprise.Name, v.NursingHomePackageOrd.UserIdentityName, v.User.Phone, kind, v.NursingHomePackageOrd.TotalPrice, v.NursingHomePackageOrd.OutTradeNo, state, v.NursingHomePackageOrd.CreateAt}) j++ } break case 2: //退款申请表 fileName = "/export/nursing_home/退款申请表_" + utils.Int64ToStr(now.UnixMilli()) + ".xlsx" var m []*db.NursingHomeUserRefundDayWithData sess := db.Db.Desc("nursing_home_user_refund_day.id") if req.EnterpriseId != 0 { sess.And("enterprise.enterprise_id =?", req.EnterpriseId) } if req.StartDate != "" { sess.And("nursing_home_user_refund_day.create_at >= ?", req.StartDate) } if req.EndDate != "" { sess.And("nursing_home_user_refund_day.create_at <= ?", req.EndDate) } _, err := sess. Join("LEFT", "nursing_home_user_with_day", "nursing_home_user_refund_day.records_id = nursing_home_user_with_day.id"). Join("LEFT", "nursing_home_package_ord", "nursing_home_user_refund_day.out_trade_no = nursing_home_package_ord.out_trade_no"). Join("LEFT", "user_identity", "nursing_home_user_with_day.identity_id = user_identity.id"). Join("LEFT", "user", "user_identity.uid = user.id"). Join("LEFT", "enterprise", "user_identity.enterprise_id = enterprise.id"). Desc("nursing_home_user_refund_day.id"). FindAndCount(&m) if err != nil { logx.Error(err) println("<<<>>>>Error:::", err.Error()) return } titleList = []string{"退款单号", "所属订单号", "单位名称", "用户身份名称", "用户手机号", "就餐类型", "就餐时间", "金额", "状态", "退款时间"} xlsx.SetSheetRow("Sheet1", "A1", &titleList) j := 2 //表头被第一行用了,只能从第二行开始 for _, v := range m { var kind string //就餐类型(1:早餐 2:午餐 3:晚餐) switch v.NursingHomeUserWithDay.Kind { case enum.NursingHomeUserWithDayKindForBreakfast: kind = enum.NursingHomeUserWithDayKind.String(enum.NursingHomeUserWithDayKindForBreakfast) break case enum.NursingHomeUserWithDayKindForLunch: kind = enum.NursingHomeUserWithDayKind.String(enum.NursingHomeUserWithDayKindForLunch) break case enum.NursingHomeUserWithDayKindForDinner: kind = enum.NursingHomeUserWithDayKind.String(enum.NursingHomeUserWithDayKindForDinner) break } var state string //状态(1:审核中 2:审核通过 3:审核拒绝 4:退款已完成) switch v.NursingHomeUserRefundDay.State { case enum.NursingHomeUserRefundDayStateForAuditing: state = enum.NursingHomeUserRefundDayState.String(enum.NursingHomeUserRefundDayStateForAuditing) break case enum.NursingHomeUserRefundDayStateForAuditPass: state = enum.NursingHomeUserRefundDayState.String(enum.NursingHomeUserRefundDayStateForAuditPass) break case enum.NursingHomeUserRefundDayStateForAuditReject: state = enum.NursingHomeUserRefundDayState.String(enum.NursingHomeUserRefundDayStateForAuditReject) break case enum.NursingHomeUserRefundDayStateForAuditComplete: state = enum.NursingHomeUserRefundDayState.String(enum.NursingHomeUserRefundDayStateForAuditComplete) break } xlsx.SetSheetRow("Sheet1", "A"+strconv.Itoa(j), &[]interface{}{v.NursingHomeUserRefundDay.OutRequestNo, v.NursingHomeUserRefundDay.OutTradeNo, v.Enterprise.Name, v.NursingHomePackageOrd.UserIdentityName, v.User.Phone, kind, v.NursingHomeUserWithDay.Date, v.NursingHomeUserRefundDay.Amount, state, v.NursingHomeUserRefundDay.RefundDate}) j++ } xlsx.SaveAs("./static" + fileName + ".xlsx") break case 3: //预定统计表 fileName = "/export/nursing_home/预定统计表_" + utils.Int64ToStr(now.UnixMilli()) + ".xlsx" var m []*db.NursingHomePackageOrdForReserveWithUserIdentity sess := db.Db.Desc("nursing_home_package_ord_for_reserve.id") if req.EnterpriseId != 0 { sess.And("enterprise.enterprise_id =?", req.EnterpriseId) } if req.StartDate != "" { sess.And("nursing_home_package_ord_for_reserve.meal_time_start >= ?", req.StartDate) } if req.EndDate != "" { sess.And("nursing_home_package_ord_for_reserve.meal_time_start <= ?", req.EndDate) } _, err := sess. Join("LEFT", "nursing_home_package_ord", "nursing_home_package_ord_for_reserve.out_trade_no = nursing_home_package_ord.out_trade_no"). Join("LEFT", "user_identity", "nursing_home_package_ord.user_identity_id = user_identity.id"). Join("LEFT", "enterprise", "enterprise.id = user_identity.enterprise_id"). Join("LEFT", "user", "user.id = user_identity.uid").FindAndCount(&m) if err != nil { logx.Error(err) println("<<<>>>>Error:::", err.Error()) return } titleList = []string{"所属订单号", "单位名称", "用户身份名称", "用户手机号", "预定类型", "预定月份", "就餐时间-开始", "就餐时间-截止"} xlsx.SetSheetRow("Sheet1", "A1", &titleList) j := 2 //表头被第一行用了,只能从第二行开始 for _, v := range m { var kind string //预定类型(1:早餐 2:午餐 3:晚餐) switch v.NursingHomePackageOrdForReserve.Kind { case enum.NursingHomeUserWithDayKindForBreakfast: kind = enum.NursingHomeUserWithDayKind.String(enum.NursingHomeUserWithDayKindForBreakfast) break case enum.NursingHomeUserWithDayKindForLunch: kind = enum.NursingHomeUserWithDayKind.String(enum.NursingHomeUserWithDayKindForLunch) break case enum.NursingHomeUserWithDayKindForDinner: kind = enum.NursingHomeUserWithDayKind.String(enum.NursingHomeUserWithDayKindForDinner) break } xlsx.SetSheetRow("Sheet1", "A"+strconv.Itoa(j), &[]interface{}{v.NursingHomePackageOrdForReserve.OutTradeNo, v.Enterprise.Name, v.NursingHomePackageOrd.UserIdentityName, v.User.Phone, kind, v.NursingHomePackageOrdForReserve.ReserveMonth, v.NursingHomePackageOrdForReserve.MealTimeStart, v.NursingHomePackageOrdForReserve.MealTimeEnd}) j++ } xlsx.SaveAs("./static" + fileName + ".xlsx") break } //新增数据 nursingHomeExportRecordsDb := db.NursingHomeExportRecordsDb{} nursingHomeExportRecordsDb.Set() marshal, _ := json.Marshal(req) nursingHomeExportRecordsDb.NursingHomeExportRecordsInsert(&model.NursingHomeExportRecords{ Name: fileName, DownloadPath: fileName, Kind: req.Kind, ReqContent: string(marshal), CreateAt: now.Format("2006-01-02 15:04:05"), UpdateAt: now.Format("2006-01-02 15:04:05"), }) } func SelfSupportForSchoolDataStatisticsExport(req md.SelfSupportForSchoolDataStatisticsExportReq) { var titleList []string var fileName, downloadPath string var now = time.Now() xlsx := excelize.NewFile() xlsx.SetSheetRow("Sheet1", "A1", &titleList) switch req.Kind { case 1: //学生列表 fileName = "学生列表_" + utils.Int64ToStr(now.UnixMilli()) + ".xlsx" downloadPath = "/export/self_support_for_school/" + fileName //查找订单数据 sess := db.Db.Desc("user_identity.id") sess.And("user_identity.identity =?", enum.UserIdentityForSelfSupportForStudent) if req.EnterpriseId != 0 { sess.And("user_identity.enterprise_id =?", req.EnterpriseId) } if req.StartDate != "" { sess.And("user_identity.create_at >= ?", req.StartDate) } if req.EndDate != "" { sess.And("user_identity.create_at <= ?", req.EndDate) } var m []*db.UserIdentityWithUser _, err := sess. Join("LEFT", "user", "user_identity.uid = user.id"). Join("LEFT", "enterprise", "user_identity.enterprise_id = enterprise.id"). Join("LEFT", "class_with_user", "class_with_user.user_identity_id = user_identity.id"). Join("LEFT", "class", "class_with_user.class_id = class.id"). Join("LEFT", "grade", "class.grade_id = grade.id"). Join("LEFT", "self_support_for_user_face_info", "user_identity.id = self_support_for_user_face_info.user_identity_id"). FindAndCount(&m) if err != nil { logx.Error(err) println("<<<>>>>Error:::", err.Error()) return } titleList = []string{"单位名称", "姓名", "身份证号", "家长电话", "采脸方式", "支付状态", "刷脸状态", "年级", "班级", "注册时间"} xlsx.SetSheetRow("Sheet1", "A1", &titleList) j := 2 //表头被第一行用了,只能从第二行开始 for _, v := range m { var kind string //采集人脸方式(1:个采 2:集采) switch v.SelfSupportForUserFaceInfo.CollectFaceType { case 1: kind = "个采" break case 2: kind = "集采" break } xlsx.SetSheetRow("Sheet1", "A"+strconv.Itoa(j), &[]interface{}{v.Enterprise.Name, v.UserIdentity.Name, v.UserIdentity.IdNo, v.User.Phone, kind, v.SelfSupportForUserFaceInfo.SchoolFacePaymentStatus, v.SelfSupportForUserFaceInfo.SchoolFacePassStatus, v.Grade.Name, v.Class.Name, v.UserIdentity.CreateAt}) j++ } break case 2: //教师列表 fileName = "教师列表_" + utils.Int64ToStr(now.UnixMilli()) + ".xlsx" downloadPath = "/export/self_support_for_school/" + fileName //查找订单数据 sess := db.Db.Desc("user_identity.id") sess.And("user_identity.identity =?", enum.UserIdentityForSelfSupportForTeacher) if req.EnterpriseId != 0 { sess.And("user_identity.enterprise_id =?", req.EnterpriseId) } if req.StartDate != "" { sess.And("user_identity.create_at >= ?", req.StartDate) } if req.EndDate != "" { sess.And("user_identity.create_at <= ?", req.EndDate) } var m []*db.UserIdentityWithUser _, err := sess. Join("LEFT", "user", "user_identity.uid = user.id"). Join("LEFT", "enterprise", "user_identity.enterprise_id = enterprise.id"). Join("LEFT", "self_support_for_user_face_info", "user_identity.id = self_support_for_user_face_info.user_identity_id"). FindAndCount(&m) if err != nil { logx.Error(err) println("<<<>>>>Error:::", err.Error()) return } titleList = []string{"单位名称", "姓名", "身份证号", "电话", "采脸方式", "支付状态", "刷脸状态", "注册时间"} xlsx.SetSheetRow("Sheet1", "A1", &titleList) j := 2 //表头被第一行用了,只能从第二行开始 for _, v := range m { var kind string //采集人脸方式(1:个采 2:集采) switch v.SelfSupportForUserFaceInfo.CollectFaceType { case 1: kind = "个采" break case 2: kind = "集采" break } xlsx.SetSheetRow("Sheet1", "A"+strconv.Itoa(j), &[]interface{}{v.Enterprise.Name, v.UserIdentity.Name, v.UserIdentity.IdNo, v.User.Phone, kind, v.SelfSupportForUserFaceInfo.SchoolFacePaymentStatus, v.SelfSupportForUserFaceInfo.SchoolFacePassStatus, v.UserIdentity.CreateAt}) j++ } break case 3: //消费明细表 fileName = "消费明细表_" + utils.Int64ToStr(now.UnixMilli()) + ".xlsx" downloadPath = "/export/self_support_for_school/" + fileName var m []*db.SelfSupportForSchoolOrdWithUserIdentity sess := db.Db.Desc("self_support_for_school_ord.id") if req.EnterpriseId != 0 { sess.And("self_support_for_school_ord.enterprise_id =?", req.EnterpriseId) } if req.StartDate != "" { sess.And("self_support_for_school_ord.face_time >= ?", req.StartDate) } if req.EndDate != "" { sess.And("self_support_for_school_ord.face_time <= ?", req.EndDate) } _, err := sess. Join("LEFT", "user_identity", "self_support_for_school_ord.user_identity_id = user_identity.id"). Join("LEFT", "enterprise", "enterprise.id = user_identity.enterprise_id"). Join("LEFT", "user", "user.id = user_identity.uid"). Join("LEFT", "class_with_user", "class_with_user.user_identity_id = user_identity.id"). Join("LEFT", "class", "class_with_user.class_id = class.id"). Join("LEFT", "grade", "class.grade_id = grade.id"). FindAndCount(&m) if err != nil { logx.Error(err) println("<<<>>>>Error:::", err.Error()) return } titleList = []string{"订单编号", "支付交易号", "用户手机号", "就餐人姓名", "学校名称", "年级", "班级", "金额", "支付状态", "就餐时间", "设备编号", "身份"} xlsx.SetSheetRow("Sheet1", "A1", &titleList) j := 2 //表头被第一行用了,只能从第二行开始 for _, v := range m { var state string //支付状态(0:待支付 1:支付成功) switch v.SelfSupportForSchoolOrd.OrderStatus { case 1: state = "待支付" break case 2: state = "支付成功" break } var identity string switch v.UserIdentity.Identity { case enum.UserIdentityForSelfSupportForTeacher: identity = enum.UserIdentity.String(enum.UserIdentityForSelfSupportForTeacher) break case enum.UserIdentityForSelfSupportForStudent: identity = enum.UserIdentity.String(enum.UserIdentityForSelfSupportForStudent) break default: identity = "未知" } xlsx.SetSheetRow("Sheet1", "A"+strconv.Itoa(j), &[]interface{}{v.SelfSupportForSchoolOrd.OutOrderNo, v.SelfSupportForSchoolOrd.TradeNo, v.User.Phone, v.UserIdentity.Name, v.Enterprise.Name, v.Grade.Name, v.Class.Name, v.SelfSupportForSchoolOrd.TradeAmount, state, v.SelfSupportForSchoolOrd.FaceTime, v.SelfSupportForSchoolOrd.DeviceSn, identity}) j++ } break } //将文件保存至服务器 xlsx.SaveAs("./static" + downloadPath) //新增数据 selfSupportForSchoolExportRecordsDb := db.SelfSupportForSchoolExportRecordsDb{} selfSupportForSchoolExportRecordsDb.Set() marshal, _ := json.Marshal(req) selfSupportForSchoolExportRecordsDb.SelfSupportForSchoolExportRecordsInsert(&model.SelfSupportForSchoolExportRecords{ Name: fileName, DownloadPath: downloadPath, Kind: req.Kind, ReqContent: string(marshal), CreateAt: now.Format("2006-01-02 15:04:05"), UpdateAt: now.Format("2006-01-02 15:04:05"), }) } func CentralKitchenForSchoolDataStatisticsExport(req md.CentralKitchenForSchoolDataStatisticsExportReq) { var titleList []string var fileName, downloadPath string var now = time.Now() xlsx := excelize.NewFile() switch req.Kind { case 1: //订单列表 fileName = "订单列表_" + utils.Int64ToStr(now.UnixMilli()) + ".xlsx" downloadPath = "/export/central_kitchen_for_school/" + fileName //查找订单数据 sess := db.Db.Desc("central_kitchen_for_school_package_ord.id") sess.And("central_kitchen_for_school_package_ord.state =?", enum.CentralKitchenForSchoolPackageOrdStateForSuccess) if req.EnterpriseId != 0 { sess.And("central_kitchen_for_school_package_ord.enterprise_id =?", req.EnterpriseId) } if req.StartDate != "" { sess.And("central_kitchen_for_school_package_ord.create_at >= ?", req.StartDate) } if req.EndDate != "" { sess.And("central_kitchen_for_school_package_ord.create_at <= ?", req.EndDate) } var m []*db.CentralKitchenForSchoolPackageOrdWithUserIdentity _, err := sess. Join("LEFT", "user_identity", "central_kitchen_for_school_package_ord.user_identity_id = user_identity.id"). Join("LEFT", "enterprise", "enterprise.id = user_identity.enterprise_id"). Join("LEFT", "user", "user.id = user_identity.uid"). Join("LEFT", "class_with_user", "class_with_user.user_identity_id = user_identity.id"). Join("LEFT", "class", "class_with_user.class_id = class.id"). Join("LEFT", "grade", "class.grade_id = grade.id"). FindAndCount(&m) if err != nil { logx.Error(err) println("<<<>>>>Error:::", err.Error()) return } titleList = []string{"订单号", "学生姓名", "学校", "年级", "班级", "家长电话", "预定日期", "预定天数", "订单价格", "支付时间", "订单状态"} xlsx.SetSheetRow("Sheet1", "A1", &titleList) j := 2 //表头被第一行用了,只能从第二行开始 for _, v := range m { var ordState string //订单状态(0:待支付 1:预约成功 2:退款中 3:部分退款 4:已退款 5:已完成) switch v.CentralKitchenForSchoolPackageOrd.OrdState { case enum.CentralKitchenForSchoolPackageOrdOrdStateForWait: ordState = enum.CentralKitchenForSchoolPackageOrdOrdState.String(enum.CentralKitchenForSchoolPackageOrdOrdStateForWait) break case enum.CentralKitchenForSchoolPackageOrdOrdStateForSuccess: ordState = enum.CentralKitchenForSchoolPackageOrdOrdState.String(enum.CentralKitchenForSchoolPackageOrdOrdStateForSuccess) break case enum.CentralKitchenForSchoolPackageOrdOrdStateForRefunding: ordState = enum.CentralKitchenForSchoolPackageOrdOrdState.String(enum.CentralKitchenForSchoolPackageOrdOrdStateForRefunding) break case enum.CentralKitchenForSchoolPackageOrdOrdStateForPartRefunded: ordState = enum.CentralKitchenForSchoolPackageOrdOrdState.String(enum.CentralKitchenForSchoolPackageOrdOrdStateForPartRefunded) break case enum.CentralKitchenForSchoolPackageOrdOrdStateForRefunded: ordState = enum.CentralKitchenForSchoolPackageOrdOrdState.String(enum.CentralKitchenForSchoolPackageOrdOrdStateForRefunded) break case enum.CentralKitchenForSchoolPackageOrdOrdStateForComplete: ordState = enum.CentralKitchenForSchoolPackageOrdOrdState.String(enum.CentralKitchenForSchoolPackageOrdOrdStateForComplete) break } //预定天数、预定日期 var list []*model.CentralKitchenForSchoolUserWithDay err1 := json.Unmarshal([]byte(v.CentralKitchenForSchoolPackageOrd.WithDayData), &list) if err1 != nil { logx.Error(err) println("<<<>>>>Error:::", err.Error()) return } var reserveDays string for _, v1 := range list { reserveDays += v1.Date } if v.Grade.Name == "" { v.Grade.Name = "教师" } if v.Class.Name == "" { v.Class.Name = "教师" } xlsx.SetSheetRow("Sheet1", "A"+strconv.Itoa(j), &[]interface{}{v.CentralKitchenForSchoolPackageOrd.OutTradeNo, v.CentralKitchenForSchoolPackageOrd.UserIdentityName, v.Enterprise.Name, v.Grade.Name, v.Class.Name, v.User.Phone, reserveDays, len(list), v.CentralKitchenForSchoolPackageOrd.TotalPrice, v.CentralKitchenForSchoolPackageOrd.CreateAt, ordState}) j++ } //将文件保存至服务器 xlsx.SaveAs("./static" + downloadPath) break case 2: //退款申请表 fileName = "退款申请表_" + utils.Int64ToStr(now.UnixMilli()) + ".xlsx" downloadPath = "/export/central_kitchen_for_school/" + fileName //查找退款申请数据 sess := db.Db.Desc("central_kitchen_for_school_user_refund_day.id") if req.EnterpriseId != 0 { sess.And("enterprise.id =?", req.EnterpriseId) } if req.StartDate != "" { sess.And("central_kitchen_for_school_user_refund_day.create_at >= ?", req.StartDate) } if req.EndDate != "" { sess.And("central_kitchen_for_school_user_refund_day.create_at <= ?", req.EndDate) } var m []*db.CentralKitchenForSchoolUserRefundDayWithData _, err := sess. Join("LEFT", "central_kitchen_for_school_user_with_day", "central_kitchen_for_school_user_refund_day.records_id = central_kitchen_for_school_user_with_day.id"). Join("LEFT", "central_kitchen_for_school_package_ord", "central_kitchen_for_school_user_refund_day.out_trade_no = central_kitchen_for_school_package_ord.out_trade_no"). Join("LEFT", "user_identity", "central_kitchen_for_school_user_with_day.identity_id = user_identity.id"). Join("LEFT", "user", "user_identity.uid = user.id"). Join("LEFT", "enterprise", "user_identity.enterprise_id = enterprise.id"). Join("LEFT", "class_with_user", "user_identity.id = class_with_user.user_identity_id"). Join("LEFT", "class", "class_with_user.class_id = class.id"). Join("LEFT", "grade", "class.grade_id = grade.id"). Desc("central_kitchen_for_school_user_refund_day.id"). FindAndCount(&m) if err != nil { logx.Error(err) println("<<<>>>>Error:::", err.Error()) return } titleList = []string{"学生姓名", "学校", "年级", "班级", "家长电话", "退款日期", "餐型", "退款金额", "退款状态", "支付时间", "退款操作时间"} xlsx.SetSheetRow("Sheet1", "A1", &titleList) j := 2 //表头被第一行用了,只能从第二行开始 for _, v := range m { var kind string //就餐类型(1:早餐 2:午餐 3:晚餐) switch v.CentralKitchenForSchoolUserWithDay.Kind { case enum.CentralKitchenForSchoolUserWithDayKindForBreakfast: kind = enum.CentralKitchenForSchoolUserWithDayKind.String(enum.CentralKitchenForSchoolUserWithDayKindForBreakfast) break case enum.CentralKitchenForSchoolUserWithDayKindForLunch: kind = enum.CentralKitchenForSchoolUserWithDayKind.String(enum.CentralKitchenForSchoolUserWithDayKindForLunch) break case enum.CentralKitchenForSchoolUserWithDayKindForDinner: kind = enum.CentralKitchenForSchoolUserWithDayKind.String(enum.CentralKitchenForSchoolUserWithDayKindForDinner) break } var state string //状态(1:审核中 2:审核通过 3:审核拒绝 4:退款已完成) switch v.CentralKitchenForSchoolUserRefundDay.State { case enum.CentralKitchenForSchoolUserRefundDayStateForAuditing: state = enum.CentralKitchenForSchoolUserRefundDayState.String(enum.CentralKitchenForSchoolUserRefundDayStateForAuditing) break case enum.CentralKitchenForSchoolUserRefundDayStateForAuditPass: state = enum.CentralKitchenForSchoolUserRefundDayState.String(enum.CentralKitchenForSchoolUserRefundDayStateForAuditPass) break case enum.CentralKitchenForSchoolUserRefundDayStateForAuditReject: state = enum.CentralKitchenForSchoolUserRefundDayState.String(enum.CentralKitchenForSchoolUserRefundDayStateForAuditReject) break case enum.CentralKitchenForSchoolUserRefundDayStateForAuditComplete: state = enum.CentralKitchenForSchoolUserRefundDayState.String(enum.CentralKitchenForSchoolUserRefundDayStateForAuditComplete) break } xlsx.SetSheetRow("Sheet1", "A"+strconv.Itoa(j), &[]interface{}{v.CentralKitchenForSchoolPackageOrd.UserIdentityName, v.Enterprise.Name, v.Grade.Name, v.Class.Name, v.User.Phone, v.CentralKitchenForSchoolUserWithDay.Date, kind, v.CentralKitchenForSchoolUserRefundDay.Amount, state, v.CentralKitchenForSchoolPackageOrd.CreateAt, v.CentralKitchenForSchoolUserRefundDay.RefundDate}) j++ } //将文件保存至服务器 xlsx.SaveAs("./static" + downloadPath) break case 3: //学校预定统计表 fileName = "学校预定统计表_" + utils.Int64ToStr(now.UnixMilli()) + ".zip" downloadPath = "/export/central_kitchen_for_school/" + fileName var m []*db.CentralKitchenForSchoolPackageOrdForReserveWithUserIdentity sess := db.Db.Desc("central_kitchen_for_school_package_ord_for_reserve.id") if req.EnterpriseId != 0 { sess.And("self_support_for_school_ord.enterprise_id =?", req.EnterpriseId) } if req.StartDate != "" { sess.And("central_kitchen_for_school_package_ord_for_reserve.meal_time_start >= ?", req.StartDate) } if req.EndDate != "" { sess.And("central_kitchen_for_school_package_ord_for_reserve.meal_time_start <= ?", req.EndDate) } _, err := sess. Join("LEFT", "central_kitchen_for_school_package_ord", "central_kitchen_for_school_package_ord_for_reserve.out_trade_no = central_kitchen_for_school_package_ord.out_trade_no"). Join("LEFT", "user_identity", "central_kitchen_for_school_package_ord.user_identity_id = user_identity.id"). Join("LEFT", "enterprise", "enterprise.id = user_identity.enterprise_id"). Join("LEFT", "user", "user.id = user_identity.uid"). Join("LEFT", "class_with_user", "class_with_user.user_identity_id = user_identity.id"). Join("LEFT", "class", "class_with_user.class_id = class.id"). Join("LEFT", "grade", "class.grade_id = grade.id"). FindAndCount(&m) if err != nil { logx.Error(err) println("<<<>>>>Error:::", err.Error()) return } centralKitchenForSchoolUserWithDayDb := db.CentralKitchenForSchoolUserWithDayDb{} centralKitchenForSchoolUserWithDayDb.Set(0) var list = map[string]map[string]map[string]map[string]int64{} var xlsFileName, xlsDownloadPath []string for _, v := range m { if list[v.Enterprise.Name] == nil { list[v.Enterprise.Name] = make(map[string]map[string]map[string]int64) } if list[v.Enterprise.Name][v.Grade.Name] == nil { list[v.Enterprise.Name][v.Grade.Name] = make(map[string]map[string]int64) } if list[v.Enterprise.Name][v.Grade.Name][v.Class.Name] == nil { list[v.Enterprise.Name][v.Grade.Name][v.Class.Name] = make(map[string]int64) } count, err2 := centralKitchenForSchoolUserWithDayDb.CountCentralKitchenForSchoolUserWithDayByOrdNo(v.CentralKitchenForSchoolPackageOrdForReserve.OutTradeNo, enum.CentralKitchenForSchoolUserWithDayStateForCancel) if err2 != nil { logx.Error(err) println("<<<>>>>Error:::", err.Error()) return } time.Sleep(50 * time.Millisecond) // 50毫秒 if v.CentralKitchenForSchoolPackageOrdForReserve.Kind == enum.CentralKitchenForSchoolUserWithDayKindForBreakfast { list[v.Enterprise.Name][v.Grade.Name][v.Class.Name]["breakfast"] += count } if v.CentralKitchenForSchoolPackageOrdForReserve.Kind == enum.CentralKitchenForSchoolUserWithDayKindForLunch { list[v.Enterprise.Name][v.Grade.Name][v.Class.Name]["lunch"] += count } if v.CentralKitchenForSchoolPackageOrdForReserve.Kind == enum.CentralKitchenForSchoolUserWithDayKindForDinner { list[v.Enterprise.Name][v.Grade.Name][v.Class.Name]["dinner"] += count } } for k1, v1 := range list { tmpFileName := k1 + "学校预定统计表_" + utils.Int64ToStr(now.UnixMilli()) + ".xlsx" tmpDownloadPath := "./static/export/central_kitchen_for_school/" + tmpFileName titleList = []string{"年级", "班级", "早餐", "午餐", "晚餐"} xlsx.SetSheetRow("Sheet1", "A1", &titleList) j := 2 //表头被第一行用了,只能从第二行开始 for k2, v2 := range v1 { if k2 == "" { //若年级为空,则为教师餐 k2 = "教师餐" } for k3, v3 := range v2 { if k3 == "" { //若班级为空,则为教师餐 k3 = "教师餐" } xlsx.SetSheetRow("Sheet1", "A"+strconv.Itoa(j), &[]interface{}{ k2, k3, v3["breakfast"], v3["lunch"], v3["dinner"]}) j++ } } //将文件保存至服务器 err1 := xlsx.SaveAs(tmpDownloadPath) if err1 != nil { logx.Error(err1) println("<<<>>>>Error:::", err1.Error()) panic(err1) } xlsDownloadPath = append(xlsDownloadPath, tmpDownloadPath) xlsFileName = append(xlsFileName, tmpFileName) } archive, err := os.Create("./static" + downloadPath) //第一步,创建 zip 文件 if err != nil { logx.Error(err) println("<<<>>>>Error:::", err.Error()) panic(err) } defer archive.Close() zipWriter := zip.NewWriter(archive) //第二步,创建一个新的 *Writer 对象 for k, v := range xlsDownloadPath { w, err1 := zipWriter.Create("学校预定统计/" + xlsFileName[k]) //向 zip 文件中添加一个文件,返回一个待压缩的文件内容应写入的 Writer if err1 != nil { logx.Error(err1) println("<<<>>>>Error:::", err1.Error()) panic(err1) } f, err1 := os.Open(v) //打开待压缩的文件 if err1 != nil { logx.Error(err1) println("<<<>>>>Error:::", err1.Error()) panic(err1) } if _, err1 = io.Copy(w, f); err != nil { logx.Error(err1) println("<<<>>>>Error:::", err1.Error()) panic(err1) } if err1 != nil { logx.Error(err1) println("<<<>>>>Error:::", err1.Error()) panic(err1) } f.Close() os.RemoveAll(v) //TODO::移除源文件 } zipWriter.Close() // 第四步,关闭 zip writer,将所有数据写入指向基础 zip 文件的数据流 if err != nil { panic(err) } break case 4: //班级明细表 fileName = "班级明细表_" + utils.Int64ToStr(now.UnixMilli()) + ".zip" downloadPath = "/export/central_kitchen_for_school/" + fileName var m []*db.CentralKitchenForSchoolPackageOrdForReserveWithUserIdentity sess := db.Db.Desc("central_kitchen_for_school_package_ord_for_reserve.id") if req.EnterpriseId != 0 { sess.And("self_support_for_school_ord.enterprise_id =?", req.EnterpriseId) } if req.StartDate != "" { sess.And("central_kitchen_for_school_package_ord_for_reserve.meal_time_start >= ?", req.StartDate) } if req.EndDate != "" { sess.And("central_kitchen_for_school_package_ord_for_reserve.meal_time_start <= ?", req.EndDate) } _, err := sess. Join("LEFT", "central_kitchen_for_school_package_ord", "central_kitchen_for_school_package_ord_for_reserve.out_trade_no = central_kitchen_for_school_package_ord.out_trade_no"). Join("LEFT", "user_identity", "central_kitchen_for_school_package_ord.user_identity_id = user_identity.id"). Join("LEFT", "enterprise", "enterprise.id = user_identity.enterprise_id"). Join("LEFT", "user", "user.id = user_identity.uid"). Join("LEFT", "class_with_user", "class_with_user.user_identity_id = user_identity.id"). Join("LEFT", "class", "class_with_user.class_id = class.id"). Join("LEFT", "grade", "class.grade_id = grade.id"). FindAndCount(&m) if err != nil { logx.Error(err) println("<<<>>>>Error:::", err.Error()) return } var list = map[string]map[string]map[string]map[string]map[string]int64{} var xlsFileName, xlsDownloadPath []string centralKitchenForSchoolUserWithDayDb := db.CentralKitchenForSchoolUserWithDayDb{} centralKitchenForSchoolUserWithDayDb.Set(0) for _, v := range m { if list[v.Enterprise.Name] == nil { list[v.Enterprise.Name] = make(map[string]map[string]map[string]map[string]int64) } if list[v.Enterprise.Name][v.Grade.Name] == nil { list[v.Enterprise.Name][v.Grade.Name] = make(map[string]map[string]map[string]int64) } if list[v.Enterprise.Name][v.Grade.Name][v.Class.Name] == nil { list[v.Enterprise.Name][v.Grade.Name][v.Class.Name] = make(map[string]map[string]int64) } if list[v.Enterprise.Name][v.Grade.Name][v.Class.Name][v.UserIdentity.Name] == nil { list[v.Enterprise.Name][v.Grade.Name][v.Class.Name][v.UserIdentity.Name] = make(map[string]int64) } count, err2 := centralKitchenForSchoolUserWithDayDb.CountCentralKitchenForSchoolUserWithDayByOrdNo(v.CentralKitchenForSchoolPackageOrdForReserve.OutTradeNo, enum.CentralKitchenForSchoolUserWithDayStateForCancel) if err2 != nil { logx.Error(err) println("<<<>>>>Error:::", err.Error()) return } time.Sleep(50 * time.Millisecond) // 50毫秒 if v.CentralKitchenForSchoolPackageOrdForReserve.Kind == enum.CentralKitchenForSchoolUserWithDayKindForBreakfast { list[v.Enterprise.Name][v.Grade.Name][v.Class.Name][v.UserIdentity.Name]["breakfast"] += count } if v.CentralKitchenForSchoolPackageOrdForReserve.Kind == enum.CentralKitchenForSchoolUserWithDayKindForLunch { list[v.Enterprise.Name][v.Grade.Name][v.Class.Name][v.UserIdentity.Name]["lunch"] += count } if v.CentralKitchenForSchoolPackageOrdForReserve.Kind == enum.CentralKitchenForSchoolUserWithDayKindForDinner { list[v.Enterprise.Name][v.Grade.Name][v.Class.Name][v.UserIdentity.Name]["dinner"] += count } } for k1, v1 := range list { tmpFileName := k1 + "班级明细_" + utils.Int64ToStr(now.UnixMilli()) + ".xlsx" tmpDownloadPath := "./static/export/central_kitchen_for_school/" + tmpFileName for k2, v2 := range v1 { if k2 == "" { //若年级为空,则为教师餐 continue } for k3, v3 := range v2 { titleList = []string{"姓名", "早餐", "午餐", "晚餐"} xlsx.NewSheet(k3) xlsx.SetSheetRow(k3, "A1", &titleList) j := 2 //表头被第一行用了,只能从第二行开始 for k4, v4 := range v3 { xlsx.SetSheetRow(k3, "A"+strconv.Itoa(j), &[]interface{}{ k4, v4["breakfast"], v4["lunch"], v4["dinner"]}) j++ } } } //将文件保存至服务器 xlsx.DeleteSheet("Sheet1") //TODO::只能放这里删除 err1 := xlsx.SaveAs(tmpDownloadPath) if err1 != nil { logx.Error(err1) println("<<<>>>>Error:::", err1.Error()) panic(err1) } xlsDownloadPath = append(xlsDownloadPath, tmpDownloadPath) xlsFileName = append(xlsFileName, tmpFileName) } archive, err := os.Create("./static" + downloadPath) //第一步,创建 zip 文件 if err != nil { logx.Error(err) println("<<<>>>>Error:::", err.Error()) panic(err) } defer archive.Close() zipWriter := zip.NewWriter(archive) //第二步,创建一个新的 *Writer 对象 for k, v := range xlsDownloadPath { w, err1 := zipWriter.Create("班级明细/" + xlsFileName[k]) //向 zip 文件中添加一个文件,返回一个待压缩的文件内容应写入的 Writer if err1 != nil { logx.Error(err1) println("<<<>>>>Error:::", err1.Error()) panic(err1) } f, err1 := os.Open(v) //打开待压缩的文件 if err1 != nil { logx.Error(err1) println("<<<>>>>Error:::", err1.Error()) panic(err1) } if _, err1 = io.Copy(w, f); err != nil { logx.Error(err1) println("<<<>>>>Error:::", err1.Error()) panic(err1) } if err1 != nil { logx.Error(err1) println("<<<>>>>Error:::", err1.Error()) panic(err1) } f.Close() os.RemoveAll(v) //TODO::移除源文件 } zipWriter.Close() // 第四步,关闭 zip writer,将所有数据写入指向基础 zip 文件的数据流 if err != nil { panic(err) } break case 5: //退款明细表 fileName = "退款明细表_" + utils.Int64ToStr(now.UnixMilli()) + ".zip" downloadPath = "/export/central_kitchen_for_school/" + fileName sess := db.Db.Where("central_kitchen_for_school_user_refund_day.state =?", enum.CentralKitchenForSchoolUserRefundDayStateForAuditComplete).Desc("central_kitchen_for_school_user_refund_day.id") if req.EnterpriseId != 0 { sess.And("enterprise.id =?", req.EnterpriseId) } if req.StartDate != "" { sess.And("central_kitchen_for_school_user_refund_day.create_at >= ?", req.StartDate) } if req.EndDate != "" { sess.And("central_kitchen_for_school_user_refund_day.create_at <= ?", req.EndDate) } var m []*db.CentralKitchenForSchoolUserRefundDayWithData _, err := sess. Join("LEFT", "central_kitchen_for_school_user_with_day", "central_kitchen_for_school_user_refund_day.records_id = central_kitchen_for_school_user_with_day.id"). Join("LEFT", "central_kitchen_for_school_package_ord", "central_kitchen_for_school_user_refund_day.out_trade_no = central_kitchen_for_school_package_ord.out_trade_no"). Join("LEFT", "user_identity", "central_kitchen_for_school_user_with_day.identity_id = user_identity.id"). Join("LEFT", "user", "user_identity.uid = user.id"). Join("LEFT", "enterprise", "user_identity.enterprise_id = enterprise.id"). Join("LEFT", "class_with_user", "user_identity.id = class_with_user.user_identity_id"). Join("LEFT", "class", "class_with_user.class_id = class.id"). Join("LEFT", "grade", "class.grade_id = grade.id"). Desc("central_kitchen_for_school_user_refund_day.id"). FindAndCount(&m) if err != nil { logx.Error(err) println("<<<>>>>Error:::", err.Error()) return } var list = map[string]map[string]map[string]map[string]map[string]int{} var xlsFileName, xlsDownloadPath []string for _, v := range m { if list[v.Enterprise.Name] == nil { list[v.Enterprise.Name] = make(map[string]map[string]map[string]map[string]int) } if list[v.Enterprise.Name][v.Grade.Name] == nil { list[v.Enterprise.Name][v.Grade.Name] = make(map[string]map[string]map[string]int) } if list[v.Enterprise.Name][v.Grade.Name][v.Class.Name] == nil { list[v.Enterprise.Name][v.Grade.Name][v.Class.Name] = make(map[string]map[string]int) } if list[v.Enterprise.Name][v.Grade.Name][v.Class.Name][v.UserIdentity.Name] == nil { list[v.Enterprise.Name][v.Grade.Name][v.Class.Name][v.UserIdentity.Name] = make(map[string]int) } //就餐类型(1:早餐 2:午餐 3:晚餐) if v.CentralKitchenForSchoolUserWithDay.Kind == enum.CentralKitchenForSchoolUserWithDayKindForBreakfast { list[v.Enterprise.Name][v.Grade.Name][v.Class.Name][v.UserIdentity.Name]["breakfast"]++ } if v.CentralKitchenForSchoolUserWithDay.Kind == enum.CentralKitchenForSchoolUserWithDayKindForLunch { list[v.Enterprise.Name][v.Grade.Name][v.Class.Name][v.UserIdentity.Name]["lunch"]++ } if v.CentralKitchenForSchoolUserWithDay.Kind == enum.CentralKitchenForSchoolUserWithDayKindForDinner { list[v.Enterprise.Name][v.Grade.Name][v.Class.Name][v.UserIdentity.Name]["dinner"]++ } } for k1, v1 := range list { tmpFileName := k1 + "退款明细_" + utils.Int64ToStr(now.UnixMilli()) + ".xlsx" tmpDownloadPath := "./static/export/central_kitchen_for_school/" + tmpFileName for k2, v2 := range v1 { if k2 == "" { //若年级为空,则为教师餐 continue } for k3, v3 := range v2 { titleList = []string{"姓名", "早餐", "午餐", "晚餐"} xlsx.NewSheet(k3) xlsx.SetSheetRow(k3, "A1", &titleList) j := 2 //表头被第一行用了,只能从第二行开始 for k4, v4 := range v3 { xlsx.SetSheetRow(k3, "A"+strconv.Itoa(j), &[]interface{}{ k4, v4["breakfast"], v4["lunch"], v4["dinner"]}) j++ } } } //将文件保存至服务器 xlsx.DeleteSheet("Sheet1") //TODO::只能放这里删除 err1 := xlsx.SaveAs(tmpDownloadPath) if err1 != nil { logx.Error(err1) println("<<<>>>>Error:::", err1.Error()) panic(err1) } xlsDownloadPath = append(xlsDownloadPath, tmpDownloadPath) xlsFileName = append(xlsFileName, tmpFileName) } archive, err := os.Create("./static" + downloadPath) //第一步,创建 zip 文件 if err != nil { logx.Error(err) println("<<<>>>>Error:::", err.Error()) panic(err) } defer archive.Close() zipWriter := zip.NewWriter(archive) //第二步,创建一个新的 *Writer 对象 for k, v := range xlsDownloadPath { w, err1 := zipWriter.Create("退款明细/" + xlsFileName[k]) //向 zip 文件中添加一个文件,返回一个待压缩的文件内容应写入的 Writer if err1 != nil { logx.Error(err1) println("<<<>>>>Error:::", err1.Error()) panic(err1) } f, err1 := os.Open(v) //打开待压缩的文件 if err1 != nil { logx.Error(err1) println("<<<>>>>Error:::", err1.Error()) panic(err1) } if _, err1 = io.Copy(w, f); err != nil { logx.Error(err1) println("<<<>>>>Error:::", err1.Error()) panic(err1) } if err1 != nil { logx.Error(err1) println("<<<>>>>Error:::", err1.Error()) panic(err1) } f.Close() os.RemoveAll(v) //TODO::移除源文件 } zipWriter.Close() // 第四步,关闭 zip writer,将所有数据写入指向基础 zip 文件的数据流 if err != nil { panic(err) } break case 6: //收款统计表 fileName = "收款统计表_" + utils.Int64ToStr(now.UnixMilli()) + ".xlsx" downloadPath = "/export/central_kitchen_for_school/" + fileName //查找数据 var m []model.Enterprise sess := db.Db.Desc("id") if req.EnterpriseId != 0 { sess.And("id = ?", req.EnterpriseId) } err := sess.Find(&m) if err != nil { logx.Error(err) println("<<<>>>>Error:::", err.Error()) return } titleList = []string{"学校名称", "预定总费用", "退款总计"} xlsx.SetSheetRow("Sheet1", "A1", &titleList) for _, v := range m { var income, refund string //统计收入 sql1 := fmt.Sprintf("SELECT sum(total_price) as total FROM central_kitchen_for_school_package_ord where state = 1 and enterprise_id = %d and create_at >= '%s' and create_at < '%s'", v.Id, req.StartDate, req.EndDate) mapArr1, err := db.QueryNativeString(db.Db, sql1) if err != nil { logx.Error(err) println("<<<>>>>Error:::", err.Error()) return } if mapArr1 != nil { income = mapArr1[0]["total"] } //统计退款 //查询出当前学校下所有的学生 userIdentityDb := db.UserIdentityDb{} userIdentityDb.Set(0) userIdentities, _ := userIdentityDb.FindUserIdentityForEnterprise(v.Id) var userIdentityIds []string for _, v := range *userIdentities { userIdentityIds = append(userIdentityIds, utils.IntToStr(v.Id)) } userIdentityStr := php2go.Implode(",", userIdentityIds) sql2 := fmt.Sprintf("SELECT sum(amount) as total FROM central_kitchen_for_school_user_refund_day where state = %d and identity_id IN (%s) and refund_date >= '%s' and refund_date < '%s'", enum.CentralKitchenForSchoolUserRefundDayStateForAuditComplete, userIdentityStr, req.StartDate, req.EndDate) mapArr2, err := db.QueryNativeString(db.Db, sql2) if err != nil { logx.Error(err) println("<<<>>>>Error:::", err.Error()) return } if mapArr2 != nil { refund = mapArr2[0]["total"] } j := 2 //表头被第一行用了,只能从第二行开始 xlsx.SetSheetRow("Sheet1", "A"+strconv.Itoa(j), &[]interface{}{v.Name, income, refund}) j++ } //将文件保存至服务器 xlsx.SaveAs("./static" + downloadPath) break case 7: //班级收款明细表 fileName = "班级收款明细表_" + utils.Int64ToStr(now.UnixMilli()) + ".zip" downloadPath = "/export/central_kitchen_for_school/" + fileName //查找订单数据 sess := db.Db.Desc("central_kitchen_for_school_package_ord.id") sess.And("central_kitchen_for_school_package_ord.state =?", enum.CentralKitchenForSchoolPackageOrdStateForSuccess) if req.EnterpriseId != 0 { sess.And("central_kitchen_for_school_package_ord.enterprise_id =?", req.EnterpriseId) } if req.StartDate != "" { sess.And("central_kitchen_for_school_package_ord.create_at >= ?", req.StartDate) } if req.EndDate != "" { sess.And("central_kitchen_for_school_package_ord.create_at <= ?", req.EndDate) } var m []*db.CentralKitchenForSchoolPackageOrdWithUserIdentity _, err := sess. Join("LEFT", "user_identity", "central_kitchen_for_school_package_ord.user_identity_id = user_identity.id"). Join("LEFT", "enterprise", "enterprise.id = user_identity.enterprise_id"). Join("LEFT", "user", "user.id = user_identity.uid"). Join("LEFT", "class_with_user", "class_with_user.user_identity_id = user_identity.id"). Join("LEFT", "class", "class_with_user.class_id = class.id"). Join("LEFT", "grade", "class.grade_id = grade.id"). FindAndCount(&m) if err != nil { logx.Error(err) println("<<<>>>>Error:::", err.Error()) return } sess1 := db.Db.Where("central_kitchen_for_school_user_refund_day.state =?", enum.CentralKitchenForSchoolUserRefundDayStateForAuditComplete).Desc("central_kitchen_for_school_user_refund_day.id") if req.EnterpriseId != 0 { sess1.And("enterprise.id =?", req.EnterpriseId) } if req.StartDate != "" { sess1.And("central_kitchen_for_school_user_refund_day.create_at >= ?", req.StartDate) } if req.EndDate != "" { sess1.And("central_kitchen_for_school_user_refund_day.create_at <= ?", req.EndDate) } var mm []*db.CentralKitchenForSchoolUserRefundDayWithData _, err = sess1. Join("LEFT", "central_kitchen_for_school_user_with_day", "central_kitchen_for_school_user_refund_day.records_id = central_kitchen_for_school_user_with_day.id"). Join("LEFT", "central_kitchen_for_school_package_ord", "central_kitchen_for_school_user_refund_day.out_trade_no = central_kitchen_for_school_package_ord.out_trade_no"). Join("LEFT", "user_identity", "central_kitchen_for_school_user_with_day.identity_id = user_identity.id"). Join("LEFT", "user", "user_identity.uid = user.id"). Join("LEFT", "enterprise", "user_identity.enterprise_id = enterprise.id"). Join("LEFT", "class_with_user", "user_identity.id = class_with_user.user_identity_id"). Join("LEFT", "class", "class_with_user.class_id = class.id"). Join("LEFT", "grade", "class.grade_id = grade.id"). Desc("central_kitchen_for_school_user_refund_day.id"). FindAndCount(&mm) if err != nil { logx.Error(err) println("<<<>>>>Error:::", err.Error()) return } var list = map[string]map[string]map[string]map[string]float64{} for _, v := range m { if list[v.Enterprise.Name] == nil { list[v.Enterprise.Name] = make(map[string]map[string]map[string]float64) } if list[v.Enterprise.Name][v.Grade.Name] == nil { list[v.Enterprise.Name][v.Grade.Name] = make(map[string]map[string]float64) } if list[v.Enterprise.Name][v.Grade.Name][v.Class.Name] == nil { list[v.Enterprise.Name][v.Grade.Name][v.Class.Name] = make(map[string]float64) } list[v.Enterprise.Name][v.Grade.Name][v.Class.Name]["income"] += utils.StrToFloat64(v.CentralKitchenForSchoolPackageOrd.TotalPrice) } for _, v := range mm { if list[v.Enterprise.Name] == nil { list[v.Enterprise.Name] = make(map[string]map[string]map[string]float64) } if list[v.Enterprise.Name][v.Grade.Name] == nil { list[v.Enterprise.Name][v.Grade.Name] = make(map[string]map[string]float64) } if list[v.Enterprise.Name][v.Grade.Name][v.Class.Name] == nil { list[v.Enterprise.Name][v.Grade.Name][v.Class.Name] = make(map[string]float64) } list[v.Enterprise.Name][v.Grade.Name][v.Class.Name]["refund"] += utils.StrToFloat64(v.CentralKitchenForSchoolUserRefundDay.Amount) } var xlsFileName, xlsDownloadPath []string for k1, v1 := range list { tmpFileName := k1 + "班级收款明细_" + utils.Int64ToStr(now.UnixMilli()) + ".xlsx" tmpDownloadPath := "./static/export/central_kitchen_for_school/" + tmpFileName titleList = []string{"年级", "班级", "预定总费用", "退款总计"} xlsx.SetSheetRow("Sheet1", "A1", &titleList) j := 2 //表头被第一行用了,只能从第二行开始 for k2, v2 := range v1 { if k2 == "" { //若年级为空,则为教师餐 continue } for k3, v3 := range v2 { xlsx.SetSheetRow("Sheet1", "A"+strconv.Itoa(j), &[]interface{}{k2, k3, utils.Float64ToStr(v3["income"]), utils.Float64ToStr(v3["refund"])}) j++ } } //将文件保存至服务器 err1 := xlsx.SaveAs(tmpDownloadPath) if err1 != nil { logx.Error(err1) println("<<<>>>>Error:::", err1.Error()) panic(err1) } xlsDownloadPath = append(xlsDownloadPath, tmpDownloadPath) xlsFileName = append(xlsFileName, tmpFileName) } archive, err := os.Create("./static" + downloadPath) //第一步,创建 zip 文件 if err != nil { logx.Error(err) println("<<<>>>>Error:::", err.Error()) panic(err) } defer archive.Close() zipWriter := zip.NewWriter(archive) //第二步,创建一个新的 *Writer 对象 for k, v := range xlsDownloadPath { w, err1 := zipWriter.Create("班级收款明细/" + xlsFileName[k]) //向 zip 文件中添加一个文件,返回一个待压缩的文件内容应写入的 Writer if err1 != nil { logx.Error(err1) println("<<<>>>>Error:::", err1.Error()) panic(err1) } f, err1 := os.Open(v) //打开待压缩的文件 if err1 != nil { logx.Error(err1) println("<<<>>>>Error:::", err1.Error()) panic(err1) } if _, err1 = io.Copy(w, f); err != nil { logx.Error(err1) println("<<<>>>>Error:::", err1.Error()) panic(err1) } if err1 != nil { logx.Error(err1) println("<<<>>>>Error:::", err1.Error()) panic(err1) } f.Close() os.RemoveAll(v) //TODO::移除源文件 } zipWriter.Close() // 第四步,关闭 zip writer,将所有数据写入指向基础 zip 文件的数据流 if err != nil { panic(err) } break case 8: //学校预定数量统计表 fileName = "学校预定数量统计表_" + utils.Int64ToStr(now.UnixMilli()) + ".xlsx" downloadPath = "/export/central_kitchen_for_school/" + fileName var m []*db.CentralKitchenForSchoolPackageOrdForReserveWithUserIdentity sess := db.Db.Desc("central_kitchen_for_school_package_ord_for_reserve.id") if req.EnterpriseId != 0 { sess.And("self_support_for_school_ord.enterprise_id =?", req.EnterpriseId) } if req.StartDate != "" { sess.And("central_kitchen_for_school_package_ord_for_reserve.meal_time_start >= ?", req.StartDate) } if req.EndDate != "" { sess.And("central_kitchen_for_school_package_ord_for_reserve.meal_time_start <= ?", req.EndDate) } _, err := sess. Join("LEFT", "central_kitchen_for_school_package_ord", "central_kitchen_for_school_package_ord_for_reserve.out_trade_no = central_kitchen_for_school_package_ord.out_trade_no"). Join("LEFT", "user_identity", "central_kitchen_for_school_package_ord.user_identity_id = user_identity.id"). Join("LEFT", "enterprise", "enterprise.id = user_identity.enterprise_id"). FindAndCount(&m) if err != nil { logx.Error(err) println("<<<>>>>Error:::", err.Error()) return } var list = map[string]int64{} centralKitchenForSchoolUserWithDayDb := db.CentralKitchenForSchoolUserWithDayDb{} centralKitchenForSchoolUserWithDayDb.Set(0) for _, v := range m { count, err2 := centralKitchenForSchoolUserWithDayDb.CountCentralKitchenForSchoolUserWithDayByOrdNo(v.CentralKitchenForSchoolPackageOrdForReserve.OutTradeNo, enum.CentralKitchenForSchoolUserWithDayStateForCancel) if err2 != nil { logx.Error(err) println("<<<>>>>Error:::", err.Error()) return } time.Sleep(50 * time.Millisecond) // 50毫秒 list[v.Enterprise.Name] += count } titleList = []string{"学校名称", "预定总数"} xlsx.SetSheetRow("Sheet1", "A1", &titleList) j := 2 //表头被第一行用了,只能从第二行开始 for k, v := range list { xlsx.SetSheetRow("Sheet1", "A"+strconv.Itoa(j), &[]interface{}{k, v}) j++ } //将文件保存至服务器 xlsx.SaveAs("./static" + downloadPath) break } //新增数据 centralKitchenForSchoolExportRecordsDb := db.CentralKitchenForSchoolExportRecordsDb{} centralKitchenForSchoolExportRecordsDb.Set() marshal, _ := json.Marshal(req) centralKitchenForSchoolExportRecordsDb.CentralKitchenForSchoolExportRecordsInsert(&model.CentralKitchenForSchoolExportRecords{ Name: fileName, DownloadPath: downloadPath, Kind: req.Kind, ReqContent: string(marshal), CreateAt: now.Format("2006-01-02 15:04:05"), UpdateAt: now.Format("2006-01-02 15:04:05"), }) }