activity_signup.go 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369
  1. package cygx
  2. import (
  3. "encoding/json"
  4. "errors"
  5. "fmt"
  6. "hongze/hz_crm_api/models"
  7. "hongze/hz_crm_api/models/cygx"
  8. "hongze/hz_crm_api/services"
  9. "hongze/hz_crm_api/services/alarm_msg"
  10. "hongze/hz_crm_api/utils"
  11. "io"
  12. "io/ioutil"
  13. "net/http"
  14. "os"
  15. "strconv"
  16. "strings"
  17. "time"
  18. )
  19. // 获取所有关注了该产业大套餐客户的openid
  20. func GetCygxBigTypeUserIndustryFllowOpneidByActivityIds(activityId int) (items []*models.OpenIdList, err error) {
  21. companyIds, e := models.GetCygxIndustryFollowCompanyIdsByActivityId(activityId)
  22. if e != nil {
  23. err = e
  24. return
  25. }
  26. permissionList, e := cygx.GetCompanyPermissionByUsersZhengShi(*companyIds)
  27. if e != nil {
  28. err = e
  29. return
  30. }
  31. permissionListMap := make(map[int]string, 0)
  32. for _, item := range permissionList {
  33. if permission, ok := permissionListMap[item.CompanyId]; !ok {
  34. permissionListMap[item.CompanyId] = item.Permission
  35. } else {
  36. permissionListMap[item.CompanyId] = permission + "," + item.Permission
  37. }
  38. }
  39. var companyIdslice []string
  40. for k, v := range permissionListMap {
  41. permissionZhengShiStr := v
  42. if strings.Count(permissionZhengShiStr, "医药") == 2 && strings.Count(permissionZhengShiStr, "消费") == 2 && strings.Count(permissionZhengShiStr, "科技") == 2 && strings.Count(permissionZhengShiStr, "智造") == 2 {
  43. companyIdslice = append(companyIdslice, strconv.Itoa(k))
  44. }
  45. }
  46. finalIds := strings.Join(companyIdslice, ",")
  47. if finalIds != "" {
  48. items, e = models.GetCygxUserIndustryFllowOpneidByActivityIdAndCompanyIds(activityId, finalIds)
  49. if e != nil {
  50. err = e
  51. return
  52. }
  53. }
  54. return
  55. }
  56. // 获取所有关注了该产业行业套餐客户的openid
  57. func GetCygxIndustryPackageUserIndustryFllowOpneidByActivityIds(activityId int) (items []*models.OpenIdList, err error) {
  58. companyIds, e := models.GetCygxIndustryFollowCompanyIdsByActivityId(activityId)
  59. if e != nil {
  60. err = e
  61. return
  62. }
  63. permissionList, e := cygx.GetCompanyPermissionByUsersZhengShi(*companyIds)
  64. if e != nil {
  65. err = e
  66. return
  67. }
  68. activityInfo, errInfo := cygx.GetAddActivityInfoById(activityId)
  69. if errInfo != nil {
  70. err = errInfo
  71. return
  72. }
  73. permissionListMap := make(map[int]string, 0)
  74. for _, item := range permissionList {
  75. if permission, ok := permissionListMap[item.CompanyId]; !ok {
  76. permissionListMap[item.CompanyId] = item.Permission
  77. } else {
  78. permissionListMap[item.CompanyId] = permission + "," + item.Permission
  79. }
  80. }
  81. var companyIdslice []string
  82. for k, v := range permissionListMap {
  83. permissionZhengShiStr := v
  84. if strings.Count(permissionZhengShiStr, "医药") == 2 && strings.Count(permissionZhengShiStr, "消费") == 2 && strings.Count(permissionZhengShiStr, "科技") == 2 && strings.Count(permissionZhengShiStr, "智造") == 2 {
  85. continue
  86. } else if strings.Contains(permissionZhengShiStr, activityInfo.ChartPermissionName) {
  87. companyIdslice = append(companyIdslice, strconv.Itoa(k))
  88. }
  89. }
  90. finalIds := strings.Join(companyIdslice, ",")
  91. if finalIds != "" {
  92. items, e = models.GetCygxUserIndustryFllowOpneidByActivityIdAndCompanyIds(activityId, finalIds)
  93. if e != nil {
  94. err = e
  95. return
  96. }
  97. }
  98. return
  99. }
  100. // 获取所有关注了该产业其他行业套餐客户的openid
  101. func GetCygxOtherIndustryPackageUserIndustryFllowOpneidByActivityIds(activityId int) (items []*models.OpenIdList, err error) {
  102. companyIds, e := models.GetCygxIndustryFollowCompanyIdsByActivityId(activityId)
  103. if e != nil {
  104. err = e
  105. return
  106. }
  107. permissionList, e := cygx.GetCompanyPermissionByUsersZhengShi(*companyIds)
  108. if e != nil {
  109. err = e
  110. return
  111. }
  112. activityInfo, errInfo := cygx.GetAddActivityInfoById(activityId)
  113. if errInfo != nil {
  114. err = errInfo
  115. return
  116. }
  117. permissionListMap := make(map[int]string, 0)
  118. for _, item := range permissionList {
  119. if permission, ok := permissionListMap[item.CompanyId]; !ok {
  120. permissionListMap[item.CompanyId] = item.Permission
  121. } else {
  122. permissionListMap[item.CompanyId] = permission + "," + item.Permission
  123. }
  124. }
  125. var companyIdslice []string
  126. for k, v := range permissionListMap {
  127. permissionZhengShiStr := v
  128. if strings.Count(permissionZhengShiStr, "医药") == 2 && strings.Count(permissionZhengShiStr, "消费") == 2 && strings.Count(permissionZhengShiStr, "科技") == 2 && strings.Count(permissionZhengShiStr, "智造") == 2 {
  129. continue
  130. } else if !strings.Contains(permissionZhengShiStr, activityInfo.ChartPermissionName) {
  131. companyIdslice = append(companyIdslice, strconv.Itoa(k))
  132. }
  133. }
  134. finalIds := strings.Join(companyIdslice, ",")
  135. if finalIds != "" {
  136. items, e = models.GetCygxUserIndustryFllowOpneidByActivityIdAndCompanyIds(activityId, finalIds)
  137. if e != nil {
  138. err = e
  139. return
  140. }
  141. }
  142. return
  143. }
  144. // 获取所有关注了该产业其他行业套餐客户的openid
  145. func GetCygxInteractiveUserOpneidByActivityIds(activityId int) (items []*models.OpenIdList, err error) {
  146. userIds, e := models.GetCygxInteractiveUserByActivityId(activityId)
  147. if e != nil {
  148. err = e
  149. return
  150. }
  151. var idSlice []string
  152. for _, id := range userIds {
  153. idSlice = append(idSlice, strconv.Itoa(*id))
  154. }
  155. ids := strings.Join(idSlice, ",")
  156. if ids != "" {
  157. items, e = models.GetCygxUserOpneidByUserIds(ids)
  158. if e != nil {
  159. err = e
  160. return
  161. }
  162. }
  163. return
  164. }
  165. // ReturnBodyRule 微信返回通过结果集
  166. type ReturnBodyRule struct {
  167. ErrorCode int `json:"errcode,omitempty"`
  168. ErrorMessage string `json:"errmsg,omitempty"`
  169. }
  170. func init232() {
  171. MakeActivitySigninImg(2161)
  172. }
  173. // MakeActivitySigninImg 生成活动签到图片
  174. func MakeActivitySigninImg12(activityId int) (err error) {
  175. var msg string
  176. defer func() {
  177. if err != nil {
  178. fmt.Println(err)
  179. go alarm_msg.SendAlarmMsg("扫码签到日志记录,失败,活动ID:"+strconv.Itoa(activityId)+err.Error()+";msg:"+msg, 3)
  180. }
  181. }()
  182. itemToken, err := models.GetWxToken(utils.WxCygxAppId, utils.WxCygxAppSecret)
  183. if err != nil {
  184. return
  185. }
  186. if itemToken.AccessToken == "" {
  187. msg = "accessToken is empty"
  188. return
  189. }
  190. var envVersion string
  191. var resourceUrl string
  192. if utils.RunMode == "release" {
  193. envVersion = "release"
  194. } else {
  195. envVersion = "develop"
  196. }
  197. url := "https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token=" + itemToken.AccessToken
  198. method := "POST"
  199. payload := strings.NewReader(`{
  200. "page":"` + utils.WX_MSG_PATH_ACTIVITY_SIGNIN + `",
  201. "scene":"` + strconv.Itoa(activityId) + `",
  202. "env_version":"` + envVersion + `",
  203. "check_path":false,
  204. "auto_color":true
  205. }`)
  206. client := &http.Client{}
  207. req, err := http.NewRequest(method, url, payload)
  208. if err != nil {
  209. msg = "获取微信二维码失败,Err:" + err.Error()
  210. return
  211. }
  212. req.Header.Add("Content-Type", "application/json")
  213. postBody, err := client.Do(req)
  214. if err != nil {
  215. msg = "获取微信二维码失败,Err:" + err.Error()
  216. return
  217. }
  218. defer postBody.Body.Close()
  219. uploadDir := "static/img/share/"
  220. uuid := utils.GetRandStringNoSpecialChar(28)
  221. if !utils.FileIsExist(uploadDir) {
  222. err = os.MkdirAll(uploadDir, 0755)
  223. if err != nil {
  224. msg = "生成文件夹失败,Err:" + err.Error()
  225. return
  226. }
  227. }
  228. imagePath := uploadDir + uuid + ".jpg"
  229. switch header := postBody.Header.Get("Content-Type"); {
  230. case strings.HasPrefix(header, "application/json"):
  231. tokenResp := ReturnBodyRule{}
  232. decoder := json.NewDecoder(postBody.Body)
  233. if decodeErr := decoder.Decode(&tokenResp); decodeErr != nil {
  234. msg = "获取微信二维码失败,Err:" + decodeErr.Error()
  235. return
  236. }
  237. case strings.HasPrefix(header, "image"):
  238. reply, e := ioutil.ReadAll(postBody.Body)
  239. if e != nil {
  240. err = e
  241. msg = "获取微信二维码失败,Err:" + err.Error()
  242. return
  243. }
  244. imageContent, e := os.Create(imagePath)
  245. if e != nil {
  246. err = e
  247. msg = "获取微信二维码失败,Err:" + err.Error()
  248. return
  249. }
  250. writeStringRes, e := io.WriteString(imageContent, string(reply))
  251. if e != nil {
  252. err = e
  253. fmt.Println(writeStringRes)
  254. return
  255. }
  256. closeErr := imageContent.Close()
  257. if closeErr != nil {
  258. err = closeErr
  259. return
  260. }
  261. randStr := utils.GetRandStringNoSpecialChar(28)
  262. fileName := randStr + ".jpg"
  263. savePath := uploadDir + time.Now().Format("200601/20060102/")
  264. savePath += fileName
  265. //上传到阿里云
  266. err = services.UploadFileToAliyun(fileName, imagePath, savePath)
  267. if err != nil {
  268. fmt.Println("文件上传失败,Err:" + err.Error())
  269. return
  270. }
  271. fileHost := "https://hzstatic.hzinsights.com/"
  272. resourceUrl = fileHost + savePath
  273. defer func() {
  274. os.Remove(imagePath)
  275. }()
  276. default:
  277. msg = "生成二维码失败"
  278. return
  279. }
  280. fmt.Println(resourceUrl)
  281. return
  282. }
  283. // 校验报名截止时间
  284. func CheckSiginupDeadline(activityInfo *cygx.ActivityDetail) (checkTime bool, popupMsg string) {
  285. checkTime = true
  286. if activityInfo.SiginupDeadline != utils.EmptyDateTimeStr {
  287. timeResp := utils.StrTimeToTime(activityInfo.SiginupDeadline)
  288. if timeResp.Before(time.Now()) {
  289. checkTime = false
  290. popupMsg = "该活动已截止报名"
  291. }
  292. }
  293. return
  294. }
  295. // 校验报名点数
  296. func CheckActivityPoints(activityInfo *cygx.ActivityDetail, wxUser *models.WxUser) (checkPoints bool, popupMsg, companyPoints, activityPoints string, err error) {
  297. checkPoints = true
  298. if activityInfo.IsResearchPoints == 1 {
  299. //获取活动对用户要扣的点
  300. userPointsNum, e := cygx.GetCygxActivityPointsSetUserNum(activityInfo.ActivityId)
  301. if e != nil {
  302. err = errors.New("GetCygxActivityPointsSetUserNum, Err: " + e.Error())
  303. return
  304. }
  305. // 获取用户所在公司剩余的点
  306. companyPointsNum, e := cygx.GetCompanyPoints(wxUser.CompanyId)
  307. if e != nil && e.Error() != utils.ErrNoRow() {
  308. err = errors.New("GetCompanyPoints, Err: " + e.Error())
  309. return
  310. }
  311. if companyPointsNum-userPointsNum < 0 {
  312. checkPoints = false
  313. popupMsg = "点数不足"
  314. }
  315. companyPoints = fmt.Sprint(companyPointsNum)
  316. activityPoints = fmt.Sprint(userPointsNum)
  317. }
  318. return
  319. }
  320. // 校验报名是否需要绑定邮箱
  321. func CheckActivityUserEmail(activityInfo *cygx.ActivityDetail, wxUser *models.WxUser) (checkEmail bool, popupMsg string) {
  322. checkEmail = true
  323. if activityInfo.IsNeedEmail == 1 {
  324. if wxUser.Email == "" {
  325. checkEmail = false
  326. popupMsg = "应上市公司要求,该会议报名需\n提供邮箱,用户邮箱为空"
  327. }
  328. }
  329. return
  330. }
  331. // 校验报名顺序 截止时间>点数>邮箱
  332. func CheckActivityUserAll(activityInfo *cygx.ActivityDetail, wxUser *models.WxUser) (popupMsg string, err error) {
  333. _, popupMsg = CheckSiginupDeadline(activityInfo)
  334. if popupMsg != "" {
  335. return
  336. }
  337. _, popupMsg, _, _, err = CheckActivityPoints(activityInfo, wxUser)
  338. if popupMsg != "" {
  339. return
  340. }
  341. _, popupMsg = CheckActivityUserEmail(activityInfo, wxUser)
  342. if popupMsg != "" {
  343. return
  344. }
  345. return
  346. }