浏览代码

Merge branch 'cygx/need_1027' of http://8.136.199.33:3000/hongze/hz_crm_api into debug

zhangchuanxing 1 月之前
父节点
当前提交
33b09274ba
共有 7 个文件被更改,包括 274 次插入7 次删除
  1. 1 0
      controllers/cygx/activity.go
  2. 6 5
      go.mod
  3. 12 0
      go.sum
  4. 9 0
      models/cygx/activity.go
  5. 11 0
      models/cygx/activity_special.go
  6. 234 0
      services/cygx/activity_poster.go
  7. 1 2
      services/cygx/resource_data.go

+ 1 - 0
controllers/cygx/activity.go

@@ -851,6 +851,7 @@ func (this *ActivityCoAntroller) PreserveAndPublish() {
 				//}()
 			}
 			go cygxService.MakeActivitySigninImg(v)
+			go cygxService.MakeActivityDetailImg2(v)
 		}
 	} else {
 		if req.DoType == 1 {

+ 6 - 5
go.mod

@@ -64,6 +64,7 @@ require (
 	github.com/fsnotify/fsnotify v1.6.0 // indirect
 	github.com/garyburd/redigo v1.6.3 // indirect
 	github.com/go-redis/redis/v8 v8.11.6-0.20220405070650-99c79f7041fc // indirect
+	github.com/go-resty/resty/v2 v2.16.5 // indirect
 	github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 // indirect
 	github.com/golang/protobuf v1.5.3 // indirect
 	github.com/gonum/blas v0.0.0-20181208220705-f22b278b28ac // indirect
@@ -100,12 +101,12 @@ require (
 	github.com/tjfoc/gmsm v1.3.2 // indirect
 	github.com/xuri/efp v0.0.0-20220603152613-6918739fd470 // indirect
 	github.com/xuri/nfp v0.0.0-20220409054826-5e722a1d9e22 // indirect
-	golang.org/x/crypto v0.5.0 // indirect
+	golang.org/x/crypto v0.31.0 // indirect
 	golang.org/x/image v0.0.0-20220413100746-70e8d0d3baa9 // indirect
-	golang.org/x/net v0.9.0 // indirect
-	golang.org/x/sys v0.7.0 // indirect
-	golang.org/x/text v0.9.0 // indirect
-	golang.org/x/time v0.0.0-20220609170525-579cf78fd858 // indirect
+	golang.org/x/net v0.33.0 // indirect
+	golang.org/x/sys v0.28.0 // indirect
+	golang.org/x/text v0.21.0 // indirect
+	golang.org/x/time v0.6.0 // indirect
 	google.golang.org/protobuf v1.30.0 // indirect
 	gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc // indirect
 	gopkg.in/ini.v1 v1.67.0 // indirect

+ 12 - 0
go.sum

@@ -154,6 +154,8 @@ github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V
 github.com/go-redis/redis v6.14.2+incompatible/go.mod h1:NAIEuMOZ/fxfXJIrKDQDz8wamY7mA7PouImQ2Jvg6kA=
 github.com/go-redis/redis/v8 v8.11.6-0.20220405070650-99c79f7041fc h1:jZY+lpZB92nvBo2f31oPC/ivGll6NcsnEOORm8Fkr4M=
 github.com/go-redis/redis/v8 v8.11.6-0.20220405070650-99c79f7041fc/go.mod h1:25mL1NKxbJhB63ihiK8MnNeTRd+xAizd6bOdydrTLUQ=
+github.com/go-resty/resty/v2 v2.16.5 h1:hBKqmWrr7uRc3euHVqmh1HTHcKn99Smr7o5spptdhTM=
+github.com/go-resty/resty/v2 v2.16.5/go.mod h1:hkJtXbA2iKHzJheXYvQ8snQES5ZLGKMwQ07xAwp/fiA=
 github.com/go-sql-driver/mysql v1.4.1/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w=
 github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg=
 github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg=
@@ -455,6 +457,8 @@ golang.org/x/crypto v0.0.0-20220411220226-7b82a4e95df4/go.mod h1:IxCIyHEi3zRg3s0
 golang.org/x/crypto v0.0.0-20220817201139-bc19a97f63c8/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
 golang.org/x/crypto v0.5.0 h1:U/0M97KRkSFvyD/3FSmdP5W5swImpNgle/EHFhOsQPE=
 golang.org/x/crypto v0.5.0/go.mod h1:NK/OQwhpMQP3MwtdjgLlYHnH9ebylxKWv3e0fK+mkQU=
+golang.org/x/crypto v0.31.0 h1:ihbySMvVjLAeSH1IbfcRTkD/iNscyz8rGzjF/E5hV6U=
+golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk=
 golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
 golang.org/x/image v0.0.0-20190501045829-6d32002ffd75/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=
 golang.org/x/image v0.0.0-20220413100746-70e8d0d3baa9 h1:LRtI4W37N+KFebI/qV0OFiLUv4GLOWeEW5hn/KEJvxE=
@@ -494,6 +498,8 @@ golang.org/x/net v0.0.0-20220812174116-3211cb980234/go.mod h1:YDH+HFinaLZZlnHAfS
 golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
 golang.org/x/net v0.9.0 h1:aWJ/m6xSmxWBx+V0XRHTlrYrPG56jKsLdTFmsSsCzOM=
 golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns=
+golang.org/x/net v0.33.0 h1:74SYHlV8BIgHIFC/LrYkOGIwL19eTYXQ5wc6TBuO36I=
+golang.org/x/net v0.33.0/go.mod h1:HXLR5J+9DxmrqMwG9qjGCxZ+zKXxBru04zlTvWlWuN4=
 golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
 golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
 golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
@@ -537,6 +543,8 @@ golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBc
 golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.7.0 h1:3jlCCIQZPdOYu1h8BkNvLz8Kgwtae2cagcG/VamtZRU=
 golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA=
+golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
 golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
 golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
 golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=
@@ -550,10 +558,14 @@ golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
 golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
 golang.org/x/text v0.9.0 h1:2sjJmO8cDvYveuX97RDLsxlyUxLl+GHoLxBiRdHllBE=
 golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
+golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo=
+golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ=
 golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
 golang.org/x/time v0.0.0-20200416051211-89c76fbcd5d1/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
 golang.org/x/time v0.0.0-20220609170525-579cf78fd858 h1:Dpdu/EMxGMFgq0CeYMh4fazTD2vtlZRYE7wyynxJb9U=
 golang.org/x/time v0.0.0-20220609170525-579cf78fd858/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
+golang.org/x/time v0.6.0 h1:eTDhh4ZXt5Qf0augr54TN6suAUudPcawVZeIAPU7D4U=
+golang.org/x/time v0.6.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM=
 golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
 golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
 golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=

+ 9 - 0
models/cygx/activity.go

@@ -586,6 +586,7 @@ type CygxActivityList struct {
 	SigninImg                 string `description:"签到码图片"`
 	ChartPermissionNameDeputy string `description:"副行业名称"`
 	TopTime                   int    `description:"置顶时间"`
+	XcxDetailImg              string `description:"小程序二维码详情图片"`
 }
 
 type GetCygxActivityListRep struct {
@@ -740,6 +741,14 @@ func UpdateCygxActivityMomentsImg(momentsImg string, activityId int) (err error)
 	return
 }
 
+// 添加活动详情图片
+func UpdateCygxActivityXcxDetailImg(xcxDetailImg string, activityId int) (err error) {
+	sql := `UPDATE cygx_activity SET  xcx_detail_img=?  WHERE activity_id=? `
+	o := orm.NewOrmUsingDB("hz_cygx")
+	_, err = o.Raw(sql, xcxDetailImg, activityId).Exec()
+	return
+}
+
 // UpdateCygxActivityyidongActivityId  ,建立与易董的活动关联
 func UpdateCygxActivityyidongActivityId(yidongActivityId string, activityId int) (err error) {
 	o := orm.NewOrmUsingDB("hz_cygx")

+ 11 - 0
models/cygx/activity_special.go

@@ -499,3 +499,14 @@ func GetactivitySpecilIdsByLabel(name string) (activityIds string, err error) {
 	err = o.Raw(sql).QueryRow(&activityIds)
 	return
 }
+
+// 获取数量
+func GetActivitySpecilCount(condition string, pars []interface{}) (count int, err error) {
+	sqlCount := ` SELECT COUNT(1) AS count  FROM cygx_activity_special as art WHERE 1= 1  `
+	if condition != "" {
+		sqlCount += condition
+	}
+	o := orm.NewOrmUsingDB("hz_cygx")
+	err = o.Raw(sqlCount, pars).QueryRow(&count)
+	return
+}

+ 234 - 0
services/cygx/activity_poster.go

@@ -4,6 +4,7 @@ import (
 	"encoding/json"
 	"errors"
 	"fmt"
+	"github.com/go-resty/resty/v2"
 	"hongze/hz_crm_api/models"
 	"hongze/hz_crm_api/models/cygx"
 	"hongze/hz_crm_api/services"
@@ -198,6 +199,7 @@ func MakeActivitySigninImg(activityId int) (imgUrl string, err error) {
 		return
 	}
 
+	fmt.Println("resourceUrl", resourceUrl)
 	detailConfig, e := cygx.GetCygxConfigDetailByCode(Cygx_activity_sigin_html)
 	if e != nil {
 		err = errors.New("GetCygxConfigDetailByCode 获取配置签到码格式信息失败, Err: " + e.Error())
@@ -582,3 +584,235 @@ func MakeActivityMomentsImg(activityId int) {
 //	err = cygx.AddCygxActivityPoster(item)
 //	return
 //}
+
+//func init() {
+//	MakeActivityDetailImg2(2992)
+//}
+
+//func init() {
+//	var condition string
+//	var pars []interface{}
+//
+//	condition = " AND active_state = 1   AND xcx_detail_img = ''   "
+//	list, errList := cygx.GetActivityListAll(condition, pars, 0, 999)
+//	if errList != nil {
+//		fmt.Println(errList)
+//		return
+//	}
+//
+//	for _, v := range list {
+//		MakeActivityDetailImg2(v.ActivityId)
+//	}
+//}
+
+// MakeActivityDetailImg  生成活动详情二维码 生成太阳码并上传OSS 30天有效
+func MakeActivityDetailImg(activityId int) (imgUrl string, err error) {
+	var msg string
+	defer func() {
+		if err != nil || msg != "" {
+			fmt.Println(err)
+			go alarm_msg.SendAlarmMsg("生成活动详情二维码,失败,MakeActivityDetailImg 活动ID:"+strconv.Itoa(activityId)+err.Error()+";msg:"+msg, 3)
+		}
+	}()
+	activityInfo, e := cygx.GetAddActivityInfoById(activityId)
+	if e != nil {
+		err = errors.New("活动不存在, Err: " + e.Error())
+		return
+	}
+	if activityInfo == nil {
+		return
+	}
+	itemToken, err := models.GetWxToken(utils.WxCygxAppId, utils.WxCygxAppSecret)
+	if err != nil {
+		return
+	}
+	if itemToken.AccessToken == "" {
+		msg = "accessToken is empty"
+		return
+	}
+	client := resty.New()
+	resp, err := client.R().
+		SetQueryParam("access_token", itemToken.AccessToken).
+		SetBody(map[string]interface{}{
+			"path":  "activityPages/activityDetail/activityDetail?id=" + strconv.Itoa(activityId),
+			"width": 430,
+		}).
+		Post("https://api.weixin.qq.com/wxa/getwxacode")
+
+	if err != nil {
+		return
+	}
+	if resp.StatusCode() != http.StatusOK {
+		return
+	}
+	fmt.Println(resp.Status())
+	var resourceUrl string
+
+	uploadDir := "static/img/share/"
+	uuid := utils.GetRandStringNoSpecialChar(28)
+	if !utils.FileIsExist(uploadDir) {
+		err = os.MkdirAll(uploadDir, 0755)
+		if err != nil {
+			msg = "生成文件夹失败,Err:" + err.Error()
+			return
+		}
+	}
+	imagePath := uploadDir + uuid + ".jpg"
+	imageContent, e := os.Create(imagePath)
+	if e != nil {
+		err = e
+		msg = "获取微信二维码失败,Err:" + err.Error()
+		return
+	}
+	writeStringRes, e := io.WriteString(imageContent, string(resp.Body()))
+	if e != nil {
+		err = e
+		fmt.Println("writeStringRes", writeStringRes)
+		return
+	}
+	closeErr := imageContent.Close()
+	if closeErr != nil {
+		err = closeErr
+		return
+	}
+	randStr := utils.GetRandStringNoSpecialChar(28)
+	fileName := randStr + ".jpg"
+	savePath := uploadDir + time.Now().Format("200601/20060102/")
+	savePath += fileName
+	//上传到阿里云
+	err = services.UploadFileToAliyun(fileName, imagePath, savePath)
+	if err != nil {
+		fmt.Println("文件上传失败,Err:" + err.Error())
+		return
+	}
+	fileHost := "https://hzstatic.hzinsights.com/"
+	resourceUrl = fileHost + savePath
+	defer func() {
+		os.Remove(imagePath)
+	}()
+	fmt.Println(resourceUrl)
+	return
+}
+
+// MakeActivityDetailImg2  生成活动详情二维码 生成太阳码并上传OSS 永久有效
+func MakeActivityDetailImg2(activityId int) (imgUrl string, err error) {
+	var msg string
+	defer func() {
+		if err != nil || msg != "" {
+			fmt.Println(err)
+			go alarm_msg.SendAlarmMsg("生成活动详情二维码,失败,活动ID:"+strconv.Itoa(activityId)+err.Error()+";msg:"+msg, 3)
+		}
+	}()
+	activityInfo, e := cygx.GetAddActivityInfoById(activityId)
+	if e != nil {
+		err = errors.New("活动不存在, Err: " + e.Error())
+		return
+	}
+	if activityInfo == nil {
+		return
+	}
+
+	itemToken, err := models.GetWxToken(utils.WxCygxAppId, utils.WxCygxAppSecret)
+	if err != nil {
+		return
+	}
+	if itemToken.AccessToken == "" {
+		msg = "accessToken is empty"
+		return
+	}
+	var envVersion string
+	var resourceUrl string
+	if utils.RunMode == "release" {
+		envVersion = "release"
+	} else {
+		envVersion = "trial"
+	}
+	url := "https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token=" + itemToken.AccessToken
+	method := "POST"
+	payload := strings.NewReader(`{
+		"page":"activityPages/activityDetail/activityDetail",
+		"scene":"` + strconv.Itoa(activityId) + `",
+		"env_version":"` + envVersion + `",
+		"check_path":false,
+		"auto_color":true
+				}`)
+	client := &http.Client{}
+	req, err := http.NewRequest(method, url, payload)
+	if err != nil {
+		msg = "获取微信二维码失败,Err:" + err.Error()
+		return
+	}
+	req.Header.Add("Content-Type", "application/json")
+	postBody, err := client.Do(req)
+	if err != nil {
+		msg = "获取微信二维码失败,Err:" + err.Error()
+		return
+	}
+	defer postBody.Body.Close()
+	uploadDir := "static/img/share/"
+	uuid := utils.GetRandStringNoSpecialChar(28)
+	if !utils.FileIsExist(uploadDir) {
+		err = os.MkdirAll(uploadDir, 0755)
+		if err != nil {
+			msg = "生成文件夹失败,Err:" + err.Error()
+			return
+		}
+	}
+	imagePath := uploadDir + uuid + ".jpg"
+	switch header := postBody.Header.Get("Content-Type"); {
+	case strings.HasPrefix(header, "application/json"):
+		tokenResp := ReturnBodyRule{}
+		decoder := json.NewDecoder(postBody.Body)
+		if decodeErr := decoder.Decode(&tokenResp); decodeErr != nil {
+			msg = "获取微信二维码失败,Err:" + decodeErr.Error()
+			return
+		}
+	case strings.HasPrefix(header, "image"):
+		reply, e := ioutil.ReadAll(postBody.Body)
+		if e != nil {
+			err = e
+			msg = "获取微信二维码失败,Err:" + err.Error()
+			return
+		}
+		imageContent, e := os.Create(imagePath)
+		if e != nil {
+			err = e
+			msg = "获取微信二维码失败,Err:" + err.Error()
+			return
+		}
+		writeStringRes, e := io.WriteString(imageContent, string(reply))
+		if e != nil {
+			err = e
+			fmt.Println(writeStringRes)
+			return
+		}
+		closeErr := imageContent.Close()
+		if closeErr != nil {
+			err = closeErr
+			return
+		}
+		randStr := utils.GetRandStringNoSpecialChar(28)
+		fileName := randStr + ".jpg"
+		savePath := uploadDir + time.Now().Format("200601/20060102/")
+		savePath += fileName
+		//上传到阿里云
+		err = services.UploadFileToAliyun(fileName, imagePath, savePath)
+		if err != nil {
+			fmt.Println("文件上传失败,Err:" + err.Error())
+			return
+		}
+		fileHost := "https://hzstatic.hzinsights.com/"
+		resourceUrl = fileHost + savePath
+		defer func() {
+			os.Remove(imagePath)
+		}()
+	default:
+		msg = "生成二维码失败"
+		return
+	}
+
+	err = cygx.UpdateCygxActivityXcxDetailImg(resourceUrl, activityId)
+	fmt.Println("resourceUrl", resourceUrl)
+
+	return
+}

+ 1 - 2
services/cygx/resource_data.go

@@ -181,7 +181,7 @@ func UpdateActivitySpecialResourceData(sourceId int) {
 	var pars []interface{}
 	condition = ` AND publish_status = 1  AND  activity_id = ?  `
 	pars = append(pars, sourceId)
-	total, e := cygx.GetActivityCount(condition, pars)
+	total, e := cygx.GetActivitySpecilCount(condition, pars)
 	if e != nil {
 		err = errors.New("GetCygxReportSelection, Err: " + e.Error())
 		return
@@ -229,7 +229,6 @@ func UpdateActivitySpecialResourceData(sourceId int) {
 		} else {
 			item.SearchOrderTime = activityInfo.PublishDate
 		}
-
 		if totalData == 0 {
 			newId, e := cygx.AddCygxResourceData(item)
 			if e != nil {