123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236 |
- package admin
- import (
- "fmt"
- "strings"
- "time"
- "zhiyuan/models"
- "zhiyuan/pkg/app"
- "zhiyuan/pkg/db"
- "zhiyuan/pkg/utils"
- "github.com/gin-gonic/gin"
- "github.com/tealeg/xlsx/v3"
- )
- func DailyImport(c *gin.Context) {
- file, err := c.FormFile("file")
- if err != nil {
- app.Error(c, fmt.Sprintf("get form err: %s", err.Error()))
- return
- }
- fileExt := utils.FileExt(file.Filename)
- attachKey := utils.RandomStr() + fileExt
- file.Filename = "data/" + attachKey
- if err := c.SaveUploadedFile(file, file.Filename); err != nil {
- app.Error(c, fmt.Sprintf("上传文件失败%s", err.Error()))
- return
- }
- wb, err := xlsx.OpenFile(file.Filename)
- if err != nil {
- app.Error(c, err.Error())
- return
- }
- for typ, sh := range wb.Sheet {
- datas := make([]map[string]interface{}, 0)
- headers := make([]string, 0)
- sh.ForEachRow(func(r *xlsx.Row) error {
- if r.GetCoordinate() <= 0 {
- err := r.ForEachCell(func(c *xlsx.Cell) error {
- headers = append(headers, c.String())
- return nil
- })
- if err != nil {
- return err
- }
- } else {
- data := make(map[string]interface{}, 0)
- data["type"] = typ
- content := ""
- for i, header := range headers {
- value := r.GetCell(i).String()
- switch header {
- case "工号":
- data["number"] = value
- case "填报人":
- data["name"] = value
- case "部门":
- data["dept"] = value
- case "填报时间":
- t, _ := time.ParseInLocation("2006年01月02日 15:04", value, time.Local)
- data["ctime"] = t.Unix()
- case "最后一次修改时间":
- t, _ := time.ParseInLocation("2006年01月02日 15:04", value, time.Local)
- data["utime"] = t.Unix()
- default:
- content += header + "\n" + value + "\n"
- }
- }
- data["content"] = content
- datas = append(datas, data)
- }
- return nil
- })
- db.InsertModels(db.Type(models.Daily{}), datas)
- }
- app.Success(c, nil)
- }
- func DailyAdminImport(c *gin.Context) {
- file, err := c.FormFile("file")
- if err != nil {
- app.Error(c, fmt.Sprintf("get form err: %s", err.Error()))
- return
- }
- fileExt := utils.FileExt(file.Filename)
- attachKey := utils.RandomStr() + fileExt
- file.Filename = "data/" + attachKey
- if err := c.SaveUploadedFile(file, file.Filename); err != nil {
- app.Error(c, fmt.Sprintf("上传文件失败%s", err.Error()))
- return
- }
- wb, err := xlsx.OpenFile(file.Filename)
- if err != nil {
- app.Error(c, err.Error())
- return
- }
- for _, sh := range wb.Sheet {
- datas := make([]map[string]interface{}, 0)
- headers := make([]string, 0)
- sh.ForEachRow(func(r *xlsx.Row) error {
- if r.GetCoordinate() <= 0 {
- err := r.ForEachCell(func(c *xlsx.Cell) error {
- headers = append(headers, c.String())
- return nil
- })
- if err != nil {
- return err
- }
- } else {
- data := make(map[string]interface{}, 0)
- for i, header := range headers {
- value := r.GetCell(i).String()
- switch header {
- case "姓名":
- data["name"] = value
- case "岗位":
- data["post"] = value
- }
- }
- datas = append(datas, data)
- }
- return nil
- })
- db.InsertModels(db.Type(models.DailyAdmin{}), datas)
- }
- app.Success(c, nil)
- }
- func DailyStatist(c *gin.Context) {
- var post map[string]interface{}
- if err := c.ShouldBindJSON(&post); err != nil {
- }
- var statistType models.DailyStatistType
- db.GetModel(map[string]interface{}{"id": post["typeId"]}, &statistType)
- if statistType.ID == 0 {
- app.ErrorMsg(c, "统计类型不存在", nil)
- return
- }
- startTime, ok1 := db.ToInt64(post["startTime"])
- endTime, ok2 := db.ToInt64(post["endTime"])
- if !ok1 || !ok2 {
- app.ErrorMsg(c, "参数错误", nil)
- return
- }
- times := make([]int64, 0)
- t := time.Unix(startTime, 0)
- switch statistType.Statist {
- case 0:
- t = time.Date(t.Year(), t.Month(), t.Day(), 0, 0, 0, 0, time.Local)
- case 1:
- t = time.Date(t.Year(), t.Month(), t.Day(), 0, 0, 0, 0, time.Local).AddDate(0, 0, int(time.Monday-t.Weekday()))
- case 2:
- t = time.Date(t.Year(), t.Month(), 1, 0, 0, 0, 0, time.Local)
- }
- for t.Unix() < endTime+24*60*60 {
- times = append(times, t.Unix())
- switch statistType.Statist {
- case 0:
- t = t.AddDate(0, 0, 1)
- case 1:
- t = t.AddDate(0, 0, 7)
- case 2:
- t = t.AddDate(0, 1, 0)
- }
- }
- s := db.ModelQuery(db.Type(models.DailyStatist{}), post, false)
- timeSelects := make([]string, 0)
- for _, t := range times {
- timeSelects = append(timeSelects, fmt.Sprintf("select %d as `time`", t))
- }
- s.TableName = fmt.Sprintf("(%s) as `date`", strings.Join(timeSelects, " union "))
- s.InnerJoin = []db.Join{
- {
- models.DailyStatistPost{}.TableName(),
- "post",
- []string{
- "`post`.`deleted_at` = 0",
- fmt.Sprintf("`post`.`typeId` = %s", s.Param(post["typeId"])),
- },
- },
- {
- models.DailyAdmin{}.TableName(),
- "admin",
- []string{
- "`admin`.`deleted_at` = 0",
- "FIND_IN_SET(`admin`.`post`, `post`.`posts`)",
- },
- },
- }
- timeField := "`date`.`time`"
- if statistType.Statist == 2 {
- timeField = "IF(WEEKDAY(from_unixtime(`date`.`time`))>3, `date`.`time` + 24 * 3600 * (7 - WEEKDAY(from_unixtime(`date`.`time`))), `date`.`time` - 24 * 3600 * WEEKDAY(from_unixtime(`date`.`time`)))"
- }
- s.LeftJoin = []db.Join{
- {
- models.Daily{}.TableName(),
- "daily",
- []string{
- "`daily`.`deleted_at` = 0",
- "`daily`.`name` = `admin`.`name`",
- fmt.Sprintf("FIND_IN_SET(`daily`.`type`, %s)", s.Param(statistType.Types)),
- fmt.Sprintf("`daily`.`ctime` >= (%s + `post`.`starthour` * 3600)", timeField),
- fmt.Sprintf("`daily`.`ctime` < (%s + `post`.`endhour` * 3600)", timeField),
- },
- },
- }
- s.GroupBy = "`date`.`time`, `post`.`id`, `admin`.`id`"
- if s.OrderBy == "``.`id` DESC" {
- s.OrderBy = "`date`.`time`, `admin`.`id` DESC"
- }
- query, params := s.Query()
- list, err := db.QueryMap(query, params, models.Daily{}.DB())
- if err != nil {
- app.ErrorMsg(c, err.Error(), nil)
- return
- }
- if list == nil {
- list = make([]map[string]interface{}, 0)
- }
- data := gin.H{
- "list": list,
- }
- count, err := db.GetCount(s, models.Daily{}.DB())
- if err != nil {
- app.ErrorMsg(c, err.Error(), nil)
- return
- }
- data["count"] = count
- app.Success(c, data)
- }
|