admin.go 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391
  1. package mobile
  2. import (
  3. "strings"
  4. "time"
  5. "zhiyuan/models"
  6. "zhiyuan/pkg/app"
  7. "zhiyuan/pkg/config"
  8. "zhiyuan/pkg/db"
  9. "zhiyuan/pkg/utils"
  10. "zhiyuan/services/admin"
  11. "zhiyuan/services/dept"
  12. "zhiyuan/services/form"
  13. "zhiyuan/services/mobile"
  14. "zhiyuan/services/role"
  15. "github.com/gin-gonic/gin"
  16. )
  17. func Login(c *gin.Context) {
  18. var form form.AdminLogin
  19. if app.Bind(c, &form) != nil {
  20. return
  21. }
  22. token, err := mobile.Login(form.Phone, form.Password)
  23. if err != nil {
  24. app.ErrorMsg(c, err.Error(), nil)
  25. return
  26. }
  27. app.Success(c, map[string]string{
  28. "token": token,
  29. })
  30. }
  31. type WorkArrangeItem struct {
  32. Date int64 `json:"date"`
  33. Day int64 `json:"day"`
  34. Type int64 `json:"type"`
  35. Item models.WorkArrangeItem `json:"item"`
  36. Log *models.WorkArrangeLog `json:"log"`
  37. }
  38. func Info(c *gin.Context) {
  39. type SettingInfo struct {
  40. ImgHost string `json:"img_host"`
  41. PageSize int `json:"page_size"`
  42. }
  43. type AdminInfo struct {
  44. ID int `json:"id"`
  45. UserName string `json:"username"`
  46. Phone string `json:"phone"`
  47. RoleIds string `json:"role_ids"`
  48. RoleName string `json:"role_name"`
  49. DeptId int `json:"dept_id"`
  50. DeptName string `json:"dept_name"`
  51. EntryDate int64 `json:"entry_date"`
  52. RestDay string `json:"rest_day"`
  53. Setting SettingInfo `json:"setting"`
  54. WorkArranges []WorkArrangeItem `json:"workarranges"`
  55. SubAdmins []map[string]interface{} `json:"sub_admins"`
  56. }
  57. var adminInfo AdminInfo
  58. _, err := admin.GetInfoByID(c.GetInt("adminID"), []string{"id", "username", "phone", "role_ids", "dept_id", "entry_date", "rest_day"}, &adminInfo)
  59. if err != nil {
  60. app.ErrorMsg(c, err.Error(), nil)
  61. return
  62. }
  63. roleListMap := make(map[int]string)
  64. if roleList, err := role.GetList(nil, []string{"id, name"}, app.Page{}, nil); err == nil {
  65. for _, v := range roleList {
  66. roleListMap[v.ID] = v.Name
  67. }
  68. }
  69. roleNames := ""
  70. roleSlice := strings.Split(adminInfo.RoleIds, ",")
  71. for _, vv := range roleSlice {
  72. roleNames += "," + roleListMap[utils.ToInt(vv)]
  73. }
  74. adminInfo.RoleName = strings.TrimLeft(roleNames, ",")
  75. deptInfo, _ := dept.GetInfoByID(adminInfo.DeptId)
  76. if deptInfo != nil {
  77. adminInfo.DeptName = deptInfo.Name
  78. }
  79. adminInfo.Setting = SettingInfo{
  80. ImgHost: config.Cfg.App.ImgHost,
  81. PageSize: config.Cfg.App.PageLimitMin,
  82. }
  83. query := "SELECT `id`, `username`, `headimgurl` from `zy_admin` where FIND_IN_SET({{adminID}}, `log_ids`) and `entry_date` != 0 and `state` = 1"
  84. params := make(map[string]interface{})
  85. params["adminID"] = c.GetInt("adminID")
  86. admins, _ := db.QueryMap(query, params, nil)
  87. adminInfo.SubAdmins = admins
  88. if adminInfo.EntryDate == 0 {
  89. app.Success(c, adminInfo)
  90. return
  91. }
  92. arranges := make([]models.WorkArrange, 0)
  93. db.GetModel(map[string]interface{}{
  94. "state": 1,
  95. "deleted_at": 0,
  96. }, &arranges)
  97. arrangeID := int64(-1)
  98. af:
  99. for _, v := range arranges {
  100. arrangeRoles := strings.Split(v.RoleIds, ",")
  101. for _, arrangeRole := range arrangeRoles {
  102. for _, role := range roleSlice {
  103. r1, ok1 := db.ToInt64(arrangeRole)
  104. r2, ok2 := db.ToInt64(role)
  105. if r1 == r2 && ok1 && ok2 {
  106. arrangeID = v.ID
  107. break af
  108. }
  109. }
  110. }
  111. }
  112. if arrangeID < 0 {
  113. app.Success(c, adminInfo)
  114. return
  115. }
  116. arrangeItems := make([]models.WorkArrangeItem, 0)
  117. db.GetModel(map[string]interface{}{
  118. "arrange_id": arrangeID,
  119. "deleted_at": 0,
  120. }, &arrangeItems)
  121. day := int64(0)
  122. arrangeItemMap := make(map[int64]map[int64]models.WorkArrangeItem)
  123. for _, item := range arrangeItems {
  124. if _, ok := arrangeItemMap[item.Day]; !ok {
  125. arrangeItemMap[item.Day] = make(map[int64]models.WorkArrangeItem)
  126. }
  127. arrangeItemMap[item.Day][item.Type] = item
  128. if item.Day > day {
  129. day = item.Day
  130. }
  131. }
  132. arrangeLogs := make([]models.WorkArrangeLog, 0)
  133. arrangeLogMap := make(map[int64]models.WorkArrangeLog)
  134. db.GetModel(map[string]interface{}{
  135. "arrange_id": arrangeID,
  136. "created_id": adminInfo.ID,
  137. "deleted_at": 0,
  138. }, &arrangeLogs)
  139. for _, log := range arrangeLogs {
  140. arrangeLogMap[log.ItemId] = log
  141. }
  142. restDayMap := make(map[int]int)
  143. restDay := strings.Split(adminInfo.RestDay, ",")
  144. for _, rest := range restDay {
  145. if len(rest) == 2 {
  146. if week, ok := db.ToInt64(string(rest[1])); ok {
  147. if rest[0] == 'a' {
  148. restDayMap[int(week)] = 1
  149. }
  150. if rest[0] == 'b' {
  151. restDayMap[int(week)] = 2
  152. }
  153. }
  154. }
  155. }
  156. date := time.Unix(adminInfo.EntryDate, 0)
  157. nowDate := date
  158. nowDay := int64(1)
  159. items := make([]WorkArrangeItem, 0)
  160. for {
  161. if nowDay > day {
  162. break
  163. }
  164. week := nowDate.Weekday()
  165. isWeek := 0
  166. if restDayMap[int(week)] == 2 {
  167. diff := nowDate.Sub(date)
  168. weekDiff := int(diff.Hours() / 24 / 7)
  169. if weekDiff%2 == 0 {
  170. isWeek = 1
  171. }
  172. } else if restDayMap[int(week)] != 1 {
  173. isWeek = 1
  174. }
  175. if isWeek == 1 {
  176. if arrangeItemType, ok := arrangeItemMap[nowDay]; ok {
  177. for typ, arrangeItem := range arrangeItemType {
  178. item := WorkArrangeItem{
  179. Date: nowDate.Unix(),
  180. Day: nowDay,
  181. Type: typ,
  182. Item: arrangeItem,
  183. }
  184. if log, ok := arrangeLogMap[arrangeItem.ID]; ok {
  185. item.Log = &log
  186. }
  187. items = append(items, item)
  188. }
  189. }
  190. nowDay += 1
  191. }
  192. nowDate = nowDate.AddDate(0, 0, 1)
  193. }
  194. if len(items) == 0 {
  195. app.Success(c, adminInfo)
  196. return
  197. }
  198. adminInfo.WorkArranges = items
  199. app.Success(c, adminInfo)
  200. }
  201. func Logout(c *gin.Context) {
  202. if err := mobile.Logout(c.GetInt("adminID")); err != nil {
  203. app.ErrorMsg(c, err.Error(), nil)
  204. return
  205. }
  206. app.Success(c, nil)
  207. }
  208. func Password(c *gin.Context) {
  209. var form form.Password
  210. if app.Bind(c, &form) != nil {
  211. return
  212. }
  213. if err := mobile.Password(c.GetInt("adminID"), form); err != nil {
  214. app.ErrorMsg(c, err.Error(), nil)
  215. return
  216. }
  217. app.Success(c, nil)
  218. }
  219. func WorkArrangeInfo(c *gin.Context) {
  220. id := utils.ToInt(c.Param("id"))
  221. if id <= 0 {
  222. app.Error(c, "人员id有误")
  223. return
  224. }
  225. var adminInfo *models.Admin
  226. _, err := admin.GetInfoByID(id, nil, &adminInfo)
  227. if adminInfo == nil {
  228. app.ErrorMsg(c, err.Error(), nil)
  229. return
  230. }
  231. if adminInfo.EntryDate == 0 {
  232. app.Success(c, nil)
  233. return
  234. }
  235. roles := strings.Split(adminInfo.RoleIds, ",")
  236. arranges := make([]models.WorkArrange, 0)
  237. db.GetModel(map[string]interface{}{
  238. "state": 1,
  239. "deleted_at": 0,
  240. }, &arranges)
  241. arrangeID := int64(-1)
  242. af:
  243. for _, v := range arranges {
  244. arrangeRoles := strings.Split(v.RoleIds, ",")
  245. for _, arrangeRole := range arrangeRoles {
  246. for _, role := range roles {
  247. r1, ok1 := db.ToInt64(arrangeRole)
  248. r2, ok2 := db.ToInt64(role)
  249. if r1 == r2 && ok1 && ok2 {
  250. arrangeID = v.ID
  251. break af
  252. }
  253. }
  254. }
  255. }
  256. if arrangeID < 0 {
  257. app.Success(c, nil)
  258. return
  259. }
  260. arrangeItems := make([]models.WorkArrangeItem, 0)
  261. db.GetModel(map[string]interface{}{
  262. "arrange_id": arrangeID,
  263. "deleted_at": 0,
  264. }, &arrangeItems)
  265. day := int64(0)
  266. arrangeItemMap := make(map[int64]map[int64]models.WorkArrangeItem)
  267. for _, item := range arrangeItems {
  268. if _, ok := arrangeItemMap[item.Day]; !ok {
  269. arrangeItemMap[item.Day] = make(map[int64]models.WorkArrangeItem)
  270. }
  271. arrangeItemMap[item.Day][item.Type] = item
  272. if item.Day > day {
  273. day = item.Day
  274. }
  275. }
  276. arrangeLogs := make([]models.WorkArrangeLog, 0)
  277. arrangeLogMap := make(map[int64]models.WorkArrangeLog)
  278. db.GetModel(map[string]interface{}{
  279. "arrange_id": arrangeID,
  280. "created_id": adminInfo.ID,
  281. "deleted_at": 0,
  282. }, &arrangeLogs)
  283. for _, log := range arrangeLogs {
  284. arrangeLogMap[log.ItemId] = log
  285. }
  286. restDayMap := make(map[int]int)
  287. restDay := strings.Split(adminInfo.RestDay, ",")
  288. for _, rest := range restDay {
  289. if len(rest) == 2 {
  290. if week, ok := db.ToInt64(string(rest[1])); ok {
  291. if rest[0] == 'a' {
  292. restDayMap[int(week)] = 1
  293. }
  294. if rest[0] == 'b' {
  295. restDayMap[int(week)] = 2
  296. }
  297. }
  298. }
  299. }
  300. date := time.Unix(adminInfo.EntryDate, 0)
  301. nowDate := date
  302. nowDay := int64(1)
  303. items := make([]WorkArrangeItem, 0)
  304. for {
  305. if nowDay > day {
  306. break
  307. }
  308. week := nowDate.Weekday()
  309. isWeek := 0
  310. if restDayMap[int(week)] == 2 {
  311. diff := nowDate.Sub(date)
  312. weekDiff := int(diff.Hours() / 24 / 7)
  313. if weekDiff%2 == 0 {
  314. isWeek = 1
  315. }
  316. } else if restDayMap[int(week)] != 1 {
  317. isWeek = 1
  318. }
  319. if isWeek == 1 {
  320. if arrangeItemType, ok := arrangeItemMap[nowDay]; ok {
  321. for typ, arrangeItem := range arrangeItemType {
  322. item := WorkArrangeItem{
  323. Date: nowDate.Unix(),
  324. Day: nowDay,
  325. Type: typ,
  326. Item: arrangeItem,
  327. }
  328. if log, ok := arrangeLogMap[arrangeItem.ID]; ok {
  329. item.Log = &log
  330. }
  331. items = append(items, item)
  332. }
  333. }
  334. nowDay += 1
  335. }
  336. nowDate = nowDate.AddDate(0, 0, 1)
  337. }
  338. if len(items) == 0 {
  339. app.Success(c, nil)
  340. return
  341. }
  342. app.Success(c, gin.H{
  343. "username": adminInfo.Username,
  344. "items": items,
  345. })
  346. }