worker.go 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276
  1. package work
  2. import (
  3. "fmt"
  4. "strings"
  5. "time"
  6. "zhiyuan/models"
  7. "zhiyuan/pkg/app"
  8. "zhiyuan/pkg/db"
  9. "zhiyuan/pkg/utils"
  10. "zhiyuan/services/geo"
  11. "zhiyuan/services/work/worker"
  12. "github.com/gin-gonic/gin"
  13. "github.com/tealeg/xlsx/v3"
  14. )
  15. func WorkerList(c *gin.Context) {
  16. page := app.HandlePageNums(c)
  17. where := map[string]string{
  18. "where": "`zy_worker`.`id`>0",
  19. "_group_by": "`zy_worker`.`id`",
  20. "_order_by": "`zy_worker`.`id` desc",
  21. }
  22. if page.PageSize != 0 {
  23. where["_page_size"] = utils.ToStr(page.PageSize)
  24. where["_page_num"] = utils.ToStr(page.PageNum)
  25. }
  26. param := make(map[string]interface{})
  27. name := c.Query("name")
  28. if name != "" {
  29. where["where"] = where["where"] + " AND `zy_worker`.`name` LIKE {{name}}"
  30. param["name"] = "%" + name + "%"
  31. }
  32. phone := c.Query("phone")
  33. if phone != "" {
  34. where["where"] = where["where"] + " AND `zy_worker`.`phone` LIKE {{phone}}"
  35. param["phone"] = "%" + phone + "%"
  36. }
  37. idcode := c.Query("idcode")
  38. if idcode != "" {
  39. where["where"] = where["where"] + " AND `zy_worker`.`idcode` LIKE {{idcode}}"
  40. param["idcode"] = "%" + idcode + "%"
  41. }
  42. typeId := c.Query("type_id")
  43. if typeId != "" {
  44. where["where"] = where["where"] + " AND FIND_IN_SET({{type_id}}, `zy_worker`.`type_ids`)"
  45. param["type_id"] = typeId
  46. }
  47. state := utils.ToInt(c.Query("state"))
  48. if state != 0 {
  49. where["where"] = where["where"] + " AND `zy_worker`.`state`={{state}}"
  50. param["state"] = state
  51. }
  52. total, err := worker.CountRaw(where["where"], param)
  53. if err != nil {
  54. app.Error(c, err.Error())
  55. return
  56. }
  57. type WorkerList struct {
  58. ID int `json:"id"`
  59. Name string `json:"name"`
  60. Phone string `json:"phone"`
  61. TypeIds string `json:"type_ids"`
  62. TypeNames string `json:"type_names"`
  63. Idcode string `json:"idcode"`
  64. Idcard1 string `json:"idcard1"`
  65. Idcard2 string `json:"idcard2"`
  66. State string `json:"state"`
  67. CreatedAt int `json:"created_at"`
  68. UpdatedAt int `json:"updated_at"`
  69. }
  70. workerList := make([]WorkerList, 0)
  71. if err = worker.GetWorkersRaw(where, param, &workerList); err != nil {
  72. app.Error(c, err.Error())
  73. return
  74. }
  75. data := gin.H{
  76. "list": workerList,
  77. "total": total,
  78. "limit": page.PageSize,
  79. }
  80. app.Success(c, data)
  81. }
  82. func WorkerVerify(c *gin.Context) {
  83. id := utils.ToInt(c.Param("id"))
  84. if id <= 0 {
  85. app.ErrorMsg(c, "worker id must be a number", nil)
  86. return
  87. }
  88. err := worker.VerifyByID(id)
  89. if err != nil {
  90. app.ErrorMsg(c, err.Error(), nil)
  91. return
  92. }
  93. app.Success(c, nil)
  94. }
  95. func WorkerImport(c *gin.Context) {
  96. file, err := c.FormFile("file")
  97. if err != nil {
  98. app.Error(c, fmt.Sprintf("get form err: %s", err.Error()))
  99. return
  100. }
  101. fileExt := utils.FileExt(file.Filename)
  102. attachKey := utils.RandomStr() + fileExt
  103. file.Filename = "data/" + attachKey
  104. if err := c.SaveUploadedFile(file, file.Filename); err != nil {
  105. app.Error(c, fmt.Sprintf("上传文件失败%s", err.Error()))
  106. return
  107. }
  108. wb, err := xlsx.OpenFile(file.Filename)
  109. if err != nil {
  110. app.Error(c, err.Error())
  111. return
  112. }
  113. sh, ok := wb.Sheet["Sheet1"]
  114. if !ok {
  115. fmt.Println("Sheet does not exist")
  116. return
  117. }
  118. typeList := make([]models.WorkType, 0)
  119. db.GetModel(map[string]interface{}{}, &typeList)
  120. datas := make([]map[string]interface{}, 0)
  121. headers := make([]string, 0)
  122. err = sh.ForEachRow(func(r *xlsx.Row) error {
  123. if r.GetCoordinate() <= 0 {
  124. err := r.ForEachCell(func(c *xlsx.Cell) error {
  125. headers = append(headers, c.String())
  126. return nil
  127. })
  128. if err != nil {
  129. return err
  130. }
  131. } else {
  132. var data models.Worker
  133. for i, header := range headers {
  134. value := r.GetCell(i).String()
  135. switch header {
  136. case "姓名":
  137. data.Name = value
  138. case "电话号码":
  139. data.Phone = value
  140. case "性别":
  141. sex := 0
  142. if value == "男" {
  143. sex = 1
  144. } else if value == "女" {
  145. sex = 2
  146. }
  147. data.Sex = sex
  148. case "年龄":
  149. age, _ := db.ToInt64(value)
  150. data.Age = int(age)
  151. case "身份证号":
  152. data.Idcode = value
  153. case "工种":
  154. types := make([]string, 0)
  155. nameList := strings.Split(value, ",")
  156. for _, name := range nameList {
  157. if name != "" {
  158. for _, typ := range typeList {
  159. if strings.Index(typ.Name, name) == 0 {
  160. types = append(types, db.ToString(typ.ID))
  161. break
  162. }
  163. }
  164. }
  165. }
  166. data.TypeIds = strings.Join(types, ",")
  167. case "所在区域":
  168. names := strings.Split(value, "/")
  169. code := ""
  170. out:
  171. for _, name := range names {
  172. list, err := geo.Lower(code)
  173. if err != nil {
  174. break
  175. }
  176. for _, l := range list {
  177. if n, ok := l["name"]; ok {
  178. if name == db.ToString(n) {
  179. if c, ok := l["code"]; ok {
  180. code = db.ToString(c)
  181. continue out
  182. }
  183. }
  184. }
  185. }
  186. break
  187. }
  188. data.Areacode = code
  189. case "是否买保险":
  190. insure := 0
  191. if value == "是" {
  192. insure = 1
  193. }
  194. data.Insure = insure
  195. case "保险开始日期":
  196. insure_start, _ := time.ParseInLocation("2006-01-02", value, time.Local)
  197. s := int(insure_start.Unix())
  198. if s > 0 {
  199. s = 0
  200. }
  201. data.InsureStart = s
  202. case "保险结束日期":
  203. insure_end, _ := time.ParseInLocation("2006-01-02", value, time.Local)
  204. s := int(insure_end.Unix())
  205. if s > 0 {
  206. s = 0
  207. }
  208. data.InsureEnd = s
  209. case "开户行":
  210. data.BankName = value
  211. case "银行卡号":
  212. data.BankCardNo = value
  213. default:
  214. }
  215. }
  216. if data.Name == "" || data.Phone == "" {
  217. return nil
  218. }
  219. var worker models.Worker
  220. db.GetModel(map[string]interface{}{
  221. "phone": data.Phone,
  222. "deleted_at": 0,
  223. }, &worker)
  224. da := map[string]interface{}{
  225. "name": data.Name,
  226. "phone": data.Phone,
  227. "sex": data.Sex,
  228. "age": data.Age,
  229. "idcode": data.Idcode,
  230. "type_ids": data.TypeIds,
  231. "areacode": data.Areacode,
  232. "insure": data.Insure,
  233. "insure_start": data.InsureStart,
  234. "insure_end": data.InsureEnd,
  235. "bank_name": data.BankName,
  236. "bank_card_no": data.BankCardNo,
  237. }
  238. if worker.ID == 0 {
  239. datas = append(datas, da)
  240. } else {
  241. if worker.Name == data.Name {
  242. err := db.UpdateModel(db.Type(worker), int64(worker.ID), da)
  243. if err != nil {
  244. return err
  245. }
  246. }
  247. }
  248. }
  249. return nil
  250. })
  251. if err != nil {
  252. app.Error(c, err.Error())
  253. return
  254. }
  255. db.InsertModels(db.Type(models.Worker{}), datas)
  256. app.Success(c, nil)
  257. }