material.go 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  1. package service
  2. import (
  3. "app.yhyue.com/moapp/jybase/date"
  4. entity "bp.jydev.jianyu360.cn/BaseService/biService/entity"
  5. "bp.jydev.jianyu360.cn/BaseService/biService/rpc/pb"
  6. "crypto/rand"
  7. "encoding/binary"
  8. "errors"
  9. "fmt"
  10. "github.com/gogf/gf/v2/util/gconv"
  11. "net/url"
  12. "strings"
  13. "time"
  14. )
  15. func MaterialSave(in *pb.MaterialSaveReq, title, content string) (msgId, mId int64, err error) {
  16. if len(strings.Split(in.ReceiveUserId, ",")) < 1 {
  17. return 0, 0, errors.New("物料发送人员为空")
  18. }
  19. //先插入message_log
  20. saveMsg := map[string]interface{}{
  21. "msg_type": "14",
  22. "title": title,
  23. "content": content,
  24. "send_mode": 2,
  25. "send_time": time.Now().Format(date.Date_Full_Layout),
  26. "send_status": 4,
  27. "update_time": time.Now().Format(date.Date_Full_Layout),
  28. "link": "",
  29. "isdel": 1,
  30. "update_user": in.CreateUser,
  31. "Sign": 1,
  32. "group_id": 11,
  33. "createtime": time.Now().Format(date.Date_Full_Layout),
  34. }
  35. msgId = entity.JyMysql.Insert("message_send_log", saveMsg)
  36. if msgId < 0 {
  37. return 0, 0, errors.New("插入消息表message_send_log出错")
  38. }
  39. saveMap := map[string]interface{}{
  40. "task_name": in.TaskName,
  41. "task_description": in.TaskDescription,
  42. "material_content": in.MaterialContent,
  43. "qrcode_url": in.QrcodeUrl,
  44. "receive_user_name": in.ReceiveUserName,
  45. "receive_position_id": in.ReceiveUserId,
  46. "file_url": in.FileUrl,
  47. "createtime": time.Now().Format(date.Date_Full_Layout),
  48. "create_user": in.CreateUser,
  49. "msg_id": msgId,
  50. "img_webpage": in.ImgWebpage,
  51. }
  52. mId = entity.BiService.Insert("operating_materials", saveMap)
  53. if mId < 0 {
  54. return 0, 0, errors.New("插入物料表operating_materials出错")
  55. }
  56. return msgId, mId, nil
  57. }
  58. func GetSendUserId(positionIds string, entId int64) []string {
  59. //拿职位id找mgoid
  60. userIdArr := []string{}
  61. useridMap := entity.JyBiTidb.SelectBySql("SELECT userid FROM `dwd_f_userbase_id_mapping` WHERE position_id in (?) AND ent_id = ?", positionIds, entId)
  62. if useridMap != nil && len(*useridMap) > 0 {
  63. for _, val := range *useridMap {
  64. userIdArr = append(userIdArr, gconv.String(val["userid"]))
  65. }
  66. }
  67. return userIdArr
  68. }
  69. func PersonImageSave(imgUrl string, msgId, positionId, materialsId int64) bool {
  70. saveMap := map[string]interface{}{
  71. "file_url": imgUrl,
  72. "msg_id": msgId,
  73. "position_id": positionId,
  74. "materials_id": materialsId,
  75. "createtime": time.Now().Format(date.Date_Full_Layout),
  76. }
  77. return entity.BiService.Insert("operating_materials_attachment", saveMap) > 0
  78. }
  79. func PersonImgSaveComposite(fileUrl, qrcodeUrl, name string) ([]byte, error) {
  80. //根据职位id获取到对应的渠道码
  81. code := ""
  82. data := entity.JyBiTidb.FindOne("dwd_d_userbase_belongto_rulecode", map[string]interface{}{"name": name}, "code", "")
  83. if data != nil && len(*data) > 0 {
  84. code = gconv.String((*data)["code"])
  85. } else {
  86. //没有code,生成一个
  87. code = GenerateUniqueRandomString(6)
  88. entity.JyBiTidb.Insert("dwd_d_userbase_belongto_rulecode", map[string]interface{}{
  89. "code": code,
  90. "pcode": "04",
  91. "level": "2",
  92. "name": name,
  93. "remark": "人员渠道码",
  94. "SZ_LEVEL": 1,
  95. "SZ_LEAF": 1,
  96. "SZ_PID0": "04",
  97. "SZ_PID1": code,
  98. })
  99. }
  100. //合成图片
  101. ok, err := hasAnyParameters(qrcodeUrl)
  102. if err != nil {
  103. return nil, err
  104. }
  105. if ok {
  106. qrcodeUrl = fmt.Sprintf("%s&personnelChannel=%s", qrcodeUrl, code)
  107. } else {
  108. qrcodeUrl = fmt.Sprintf("%s?personnelChannel=%s", qrcodeUrl, code)
  109. }
  110. err, imgByte := compositeImage(fileUrl, qrcodeUrl)
  111. return imgByte, err
  112. }
  113. func GenerateUniqueRandomString(length int) string {
  114. // 获取当前时间(纳秒级)
  115. now := time.Now().UnixNano()
  116. // 生成随机数
  117. var randNum uint64
  118. if err := binary.Read(rand.Reader, binary.BigEndian, &randNum); err != nil {
  119. randNum = uint64(now)
  120. }
  121. // 组合时间和随机数
  122. uniqueValue := now ^ int64(randNum)
  123. // 转换为base36字符串(0-9a-z)
  124. charset := "0123456789abcdefghijklmnopqrstuvwxyz"
  125. result := make([]byte, length)
  126. for i := range result {
  127. // 使用模运算选择字符
  128. result[i] = charset[uniqueValue%36]
  129. uniqueValue /= 36
  130. // 如果值耗尽,重新生成
  131. if uniqueValue == 0 {
  132. uniqueValue = time.Now().UnixNano()
  133. }
  134. }
  135. return string(result)
  136. }
  137. func hasAnyParameters(rawURL string) (bool, error) {
  138. parsedURL, err := url.Parse(rawURL)
  139. if err != nil {
  140. return false, err
  141. }
  142. // 检查查询参数或片段标识符中的参数
  143. return parsedURL.RawQuery != "" || (parsedURL.Fragment != "" && strings.Contains(parsedURL.Fragment, "=")), nil
  144. }