daily.go 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236
  1. package admin
  2. import (
  3. "fmt"
  4. "strings"
  5. "time"
  6. "zhiyuan/models"
  7. "zhiyuan/pkg/app"
  8. "zhiyuan/pkg/db"
  9. "zhiyuan/pkg/utils"
  10. "github.com/gin-gonic/gin"
  11. "github.com/tealeg/xlsx/v3"
  12. )
  13. func DailyImport(c *gin.Context) {
  14. file, err := c.FormFile("file")
  15. if err != nil {
  16. app.Error(c, fmt.Sprintf("get form err: %s", err.Error()))
  17. return
  18. }
  19. fileExt := utils.FileExt(file.Filename)
  20. attachKey := utils.RandomStr() + fileExt
  21. file.Filename = "data/" + attachKey
  22. if err := c.SaveUploadedFile(file, file.Filename); err != nil {
  23. app.Error(c, fmt.Sprintf("上传文件失败%s", err.Error()))
  24. return
  25. }
  26. wb, err := xlsx.OpenFile(file.Filename)
  27. if err != nil {
  28. app.Error(c, err.Error())
  29. return
  30. }
  31. for typ, sh := range wb.Sheet {
  32. datas := make([]map[string]interface{}, 0)
  33. headers := make([]string, 0)
  34. sh.ForEachRow(func(r *xlsx.Row) error {
  35. if r.GetCoordinate() <= 0 {
  36. err := r.ForEachCell(func(c *xlsx.Cell) error {
  37. headers = append(headers, c.String())
  38. return nil
  39. })
  40. if err != nil {
  41. return err
  42. }
  43. } else {
  44. data := make(map[string]interface{}, 0)
  45. data["type"] = typ
  46. content := ""
  47. for i, header := range headers {
  48. value := r.GetCell(i).String()
  49. switch header {
  50. case "工号":
  51. data["number"] = value
  52. case "填报人":
  53. data["name"] = value
  54. case "部门":
  55. data["dept"] = value
  56. case "填报时间":
  57. t, _ := time.ParseInLocation("2006年01月02日 15:04", value, time.Local)
  58. data["ctime"] = t.Unix()
  59. case "最后一次修改时间":
  60. t, _ := time.ParseInLocation("2006年01月02日 15:04", value, time.Local)
  61. data["utime"] = t.Unix()
  62. default:
  63. content += header + "\n" + value + "\n"
  64. }
  65. }
  66. data["content"] = content
  67. datas = append(datas, data)
  68. }
  69. return nil
  70. })
  71. db.InsertModels(db.Type(models.Daily{}), datas)
  72. }
  73. app.Success(c, nil)
  74. }
  75. func DailyAdminImport(c *gin.Context) {
  76. file, err := c.FormFile("file")
  77. if err != nil {
  78. app.Error(c, fmt.Sprintf("get form err: %s", err.Error()))
  79. return
  80. }
  81. fileExt := utils.FileExt(file.Filename)
  82. attachKey := utils.RandomStr() + fileExt
  83. file.Filename = "data/" + attachKey
  84. if err := c.SaveUploadedFile(file, file.Filename); err != nil {
  85. app.Error(c, fmt.Sprintf("上传文件失败%s", err.Error()))
  86. return
  87. }
  88. wb, err := xlsx.OpenFile(file.Filename)
  89. if err != nil {
  90. app.Error(c, err.Error())
  91. return
  92. }
  93. for _, sh := range wb.Sheet {
  94. datas := make([]map[string]interface{}, 0)
  95. headers := make([]string, 0)
  96. sh.ForEachRow(func(r *xlsx.Row) error {
  97. if r.GetCoordinate() <= 0 {
  98. err := r.ForEachCell(func(c *xlsx.Cell) error {
  99. headers = append(headers, c.String())
  100. return nil
  101. })
  102. if err != nil {
  103. return err
  104. }
  105. } else {
  106. data := make(map[string]interface{}, 0)
  107. for i, header := range headers {
  108. value := r.GetCell(i).String()
  109. switch header {
  110. case "姓名":
  111. data["name"] = value
  112. case "岗位":
  113. data["post"] = value
  114. }
  115. }
  116. datas = append(datas, data)
  117. }
  118. return nil
  119. })
  120. db.InsertModels(db.Type(models.DailyAdmin{}), datas)
  121. }
  122. app.Success(c, nil)
  123. }
  124. func DailyStatist(c *gin.Context) {
  125. var post map[string]interface{}
  126. if err := c.ShouldBindJSON(&post); err != nil {
  127. }
  128. var statistType models.DailyStatistType
  129. db.GetModel(map[string]interface{}{"id": post["typeId"]}, &statistType)
  130. if statistType.ID == 0 {
  131. app.ErrorMsg(c, "统计类型不存在", nil)
  132. return
  133. }
  134. startTime, ok1 := db.ToInt64(post["startTime"])
  135. endTime, ok2 := db.ToInt64(post["endTime"])
  136. if !ok1 || !ok2 {
  137. app.ErrorMsg(c, "参数错误", nil)
  138. return
  139. }
  140. times := make([]int64, 0)
  141. t := time.Unix(startTime, 0)
  142. switch statistType.Statist {
  143. case 0:
  144. t = time.Date(t.Year(), t.Month(), t.Day(), 0, 0, 0, 0, time.Local)
  145. case 1:
  146. t = time.Date(t.Year(), t.Month(), t.Day(), 0, 0, 0, 0, time.Local).AddDate(0, 0, int(time.Monday-t.Weekday()))
  147. case 2:
  148. t = time.Date(t.Year(), t.Month(), 1, 0, 0, 0, 0, time.Local)
  149. }
  150. for t.Unix() < endTime+24*60*60 {
  151. times = append(times, t.Unix())
  152. switch statistType.Statist {
  153. case 0:
  154. t = t.AddDate(0, 0, 1)
  155. case 1:
  156. t = t.AddDate(0, 0, 7)
  157. case 2:
  158. t = t.AddDate(0, 1, 0)
  159. }
  160. }
  161. s := db.ModelQuery(db.Type(models.DailyStatist{}), post, false)
  162. timeSelects := make([]string, 0)
  163. for _, t := range times {
  164. timeSelects = append(timeSelects, fmt.Sprintf("select %d as `time`", t))
  165. }
  166. s.TableName = fmt.Sprintf("(%s) as `date`", strings.Join(timeSelects, " union "))
  167. s.InnerJoin = []db.Join{
  168. {
  169. models.DailyStatistPost{}.TableName(),
  170. "post",
  171. []string{
  172. "`post`.`deleted_at` = 0",
  173. fmt.Sprintf("`post`.`typeId` = %s", s.Param(post["typeId"])),
  174. },
  175. },
  176. {
  177. models.DailyAdmin{}.TableName(),
  178. "admin",
  179. []string{
  180. "`admin`.`deleted_at` = 0",
  181. "FIND_IN_SET(`admin`.`post`, `post`.`posts`)",
  182. },
  183. },
  184. }
  185. timeField := "`date`.`time`"
  186. if statistType.Statist == 2 {
  187. 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`)))"
  188. }
  189. s.LeftJoin = []db.Join{
  190. {
  191. models.Daily{}.TableName(),
  192. "daily",
  193. []string{
  194. "`daily`.`deleted_at` = 0",
  195. "`daily`.`name` = `admin`.`name`",
  196. fmt.Sprintf("FIND_IN_SET(`daily`.`type`, %s)", s.Param(statistType.Types)),
  197. fmt.Sprintf("`daily`.`ctime` >= (%s + `post`.`starthour` * 3600)", timeField),
  198. fmt.Sprintf("`daily`.`ctime` < (%s + `post`.`endhour` * 3600)", timeField),
  199. },
  200. },
  201. }
  202. s.GroupBy = "`date`.`time`, `post`.`id`, `admin`.`id`"
  203. if s.OrderBy == "``.`id` DESC" {
  204. s.OrderBy = "`date`.`time`, `admin`.`id` DESC"
  205. }
  206. query, params := s.Query()
  207. list, err := db.QueryMap(query, params, models.Daily{}.DB())
  208. if err != nil {
  209. app.ErrorMsg(c, err.Error(), nil)
  210. return
  211. }
  212. if list == nil {
  213. list = make([]map[string]interface{}, 0)
  214. }
  215. data := gin.H{
  216. "list": list,
  217. }
  218. count, err := db.GetCount(s, models.Daily{}.DB())
  219. if err != nil {
  220. app.ErrorMsg(c, err.Error(), nil)
  221. return
  222. }
  223. data["count"] = count
  224. app.Success(c, data)
  225. }