Browse Source

Merge branch 'cygx/cygx_11.2' of http://8.136.199.33:3000/hongze/hz_crm_api

xingzai 1 year ago
parent
commit
189467085c

+ 124 - 2
controllers/cygx/activity.go

@@ -85,10 +85,30 @@ func (this *ActivityCoAntroller) PreserveAndPublish() {
 		br.ErrMsg = "参数解析失败,Err:" + err.Error()
 		return
 	}
+
+	//处理识图建会的会议信息列表 因为活动发布处理的业务逻辑过多,方便后期统一维护这里 根据 list 数据类型自己拼接 活动的 body  查研观向 11.12
+	listImgToText := req.ListImgToText
+
+	if len(listImgToText) > 0 {
+		var errmsg string
+		req, err, errmsg = cygxService.MakeActivityReqText(listImgToText)
+		if err != nil {
+			br.Msg = "识图建会失败!"
+			br.ErrMsg = "参数解析失败,Err:" + err.Error()
+			return
+		}
+		if errmsg != "" {
+			br.Msg = "识图建会失败," + errmsg
+			br.ErrMsg = "识图建会失败," + errmsg
+			return
+		}
+	}
 	if req.Body == "" {
 		br.Msg = "内容不可为空"
 		return
 	}
+
+	//return
 	//不限制人数的,强制改为全部客户可见
 	if req.LimitPeopleNum == 0 {
 		req.VisibleRange = 2
@@ -364,7 +384,6 @@ func (this *ActivityCoAntroller) PreserveAndPublish() {
 		}
 		itemPointsSet = itemResp
 	}
-
 	for k, v := range slice {
 		//如果内容不存在 时间:字段则不予处理
 		if strings.Contains(v, "时间:") || strings.Contains(v, "时间:") {
@@ -423,7 +442,14 @@ func (this *ActivityCoAntroller) PreserveAndPublish() {
 			item.IsYidongConduct = req.IsYidongConduct
 			item.IsCanOutboundCall = req.IsCanOutboundCall
 			item.IsNeedEmail = isNeedEmail
-			item.SiginupDeadline = siginupDeadline
+
+			if len(listImgToText) > 0 {
+				resultTime := utils.StrTimeToTime(item.ActivityTime)                                       //时间字符串格式转时间格式
+				item.SiginupDeadline = resultTime.AddDate(0, 0, -1).Format(utils.FormatDate) + " 15:30:00" //批量建会报名截止之前默认:活动前一天15:30:00
+			} else {
+				item.SiginupDeadline = siginupDeadline
+			}
+
 			if isResearchPoints == 1 {
 				item.IsResearchPoints = 1
 			}
@@ -1474,3 +1500,99 @@ func (this *ActivityCoAntroller) DeadlineSet() {
 	br.Success = true
 	br.Data = list
 }
+
+// @Title 根据图片获取建会信息接口
+// @Description 根据图片获取建会信息接口
+// @Param   request	body cygx.ActivityIdRep true "type json string"
+// @Success Ret=200
+// @router /activity/imgToText [post]
+func (this *ActivityCoAntroller) ImgToText() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	AdminUser := this.SysUser
+	if AdminUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser Is Empty"
+		br.Ret = 408
+		return
+	}
+	var req cygx.AliyunOcrImgUrlReq
+	resp := new(cygx.AliyunOcrTextActivityListResp)
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+	imgUrl := req.ImgUrl
+	if imgUrl == "" {
+		br.Msg = "请上传图片"
+		return
+	}
+
+	ocrResp, err := services.AliOcrByImageToText(imgUrl)
+	if err != nil {
+		br.Msg = "图片解析失败!"
+		br.ErrMsg = "图片解析失败,Err:" + err.Error()
+		return
+	}
+	if len(ocrResp.Ret) == 0 {
+		br.Msg = "图片解析失败!"
+		return
+	}
+
+	var titmeYMD string
+	var titmeHM string
+	var company string
+	var list []*cygx.AliyunOcrTextActivityResp
+	var mapTitmeYMD = make(map[int]string)
+	var mapTitmeHM = make(map[int]string)
+	var mapCompany = make(map[int]string)
+	var lineNum int
+	for k, v := range ocrResp.Ret {
+		if k == 0 && !strings.Contains(v.Word, "/") {
+			continue
+		}
+		if strings.Contains(v.Word, "/") {
+			mapTitmeYMD[lineNum] = v.Word
+			titmeYMD = v.Word
+		}
+		if strings.Contains(v.Word, "AM") || strings.Contains(v.Word, "PM") {
+			mapTitmeHM[lineNum] = v.Word
+			titmeHM = v.Word
+		}
+		if strings.Contains(v.Word, "(") && strings.Contains(v.Word, ")") {
+			if mapTitmeYMD[lineNum] == "" {
+				mapTitmeYMD[lineNum] = mapTitmeYMD[lineNum-1]
+			}
+			titmeYMD = mapTitmeYMD[lineNum]
+			mapCompany[lineNum] = v.Word
+			company = v.Word
+			lineNum++
+
+		}
+		if titmeYMD != "" && titmeHM != "" && company != "" {
+			item := new(cygx.AliyunOcrTextActivityResp)
+			item.TitmeYMD = titmeYMD
+			item.TitmeHM = titmeHM
+			item.Company = company
+			list = append(list, item)
+			titmeYMD = ""
+			titmeHM = ""
+			company = ""
+		}
+	}
+
+	for _, v := range list {
+		v.TitmeYMD = cygxService.ConvertActivityTitmeYMD(v.TitmeYMD)
+		v.TitmeHM = cygxService.ConvertActivityTitmeHM(v.TitmeHM)
+	}
+	resp.List = list
+	br.Ret = 200
+	br.Success = true
+	br.Data = resp
+	br.IsAddLog = true
+}

+ 7 - 5
go.mod

@@ -51,8 +51,9 @@ require (
 	github.com/alibabacloud-go/tea-utils v1.3.6 // indirect
 	github.com/alibabacloud-go/tea-xml v1.1.2 // indirect
 	github.com/aliyun/credentials-go v1.1.2 // indirect
-	github.com/andybalholm/cascadia v1.3.1 // indirect
+	github.com/andybalholm/cascadia v1.3.2 // indirect
 	github.com/antlr/antlr4/runtime/Go/antlr v0.0.0-20211218165449-dd623ecc2f02 // indirect
+	github.com/axgle/mahonia v0.0.0-20180208002826-3358181d7394 // indirect
 	github.com/baiyubin/aliyun-sts-go-sdk v0.0.0-20180326062324-cfa1a18b161f // indirect
 	github.com/beorn7/perks v1.0.1 // indirect
 	github.com/bradfitz/gomemcache v0.0.0-20220106215444-fb4bf637b56d // indirect
@@ -92,6 +93,7 @@ require (
 	github.com/shiena/ansicolor v0.0.0-20200904210342-c7312218db18 // indirect
 	github.com/sirupsen/logrus v1.9.0 // indirect
 	github.com/spf13/cast v1.5.0 // indirect
+	github.com/stevenyao/go-opencc v0.0.0-20161014062826-cc376a51b65e // indirect
 	github.com/stretchr/testify v1.8.1 // indirect
 	github.com/tidwall/gjson v1.14.1 // indirect
 	github.com/tidwall/match v1.1.1 // indirect
@@ -100,9 +102,9 @@ require (
 	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/net v0.5.0 // indirect
-	golang.org/x/sys v0.4.0 // indirect
-	golang.org/x/text v0.6.0 // 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
 	google.golang.org/protobuf v1.28.1 // indirect
 	gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc // indirect
@@ -111,4 +113,4 @@ require (
 	gopkg.in/yaml.v3 v3.0.1 // indirect
 	xorm.io/builder v0.3.6 // indirect
 	xorm.io/core v0.7.2-0.20190928055935-90aeac8d08eb // indirect
-)
+)

+ 33 - 0
go.sum

@@ -84,6 +84,8 @@ github.com/aliyun/credentials-go v1.1.2 h1:qU1vwGIBb3UJ8BwunHDRFtAhS6jnQLnde/yk0
 github.com/aliyun/credentials-go v1.1.2/go.mod h1:ozcZaMR5kLM7pwtCMEpVmQ242suV6qTJya2bDq4X1Tw=
 github.com/andybalholm/cascadia v1.3.1 h1:nhxRkql1kdYCc8Snf7D5/D3spOX+dBgjA6u8x004T2c=
 github.com/andybalholm/cascadia v1.3.1/go.mod h1:R4bJ1UQfqADjvDa4P6HZHLh/3OxWWEqc0Sk8XGwHqvA=
+github.com/andybalholm/cascadia v1.3.2 h1:3Xi6Dw5lHF15JtdcmAHD3i1+T8plmv7BQ/nsViSLyss=
+github.com/andybalholm/cascadia v1.3.2/go.mod h1:7gtRlve5FxPPgIgX36uWBX58OdBsSS6lUvCFb+h7KvU=
 github.com/antlr/antlr4/runtime/Go/antlr v0.0.0-20211218165449-dd623ecc2f02 h1:o2oaBQGTzO+xNh12e7xWkphNe7H2DTiWv1ml9a2P9PQ=
 github.com/antlr/antlr4/runtime/Go/antlr v0.0.0-20211218165449-dd623ecc2f02/go.mod h1:F7bn7fEU90QkQ3tnmaTx3LTKLEDqnwWODIYppRQ5hnY=
 github.com/apache/thrift v0.12.0 h1:pODnxUFNcjP9UTLZGTdeh+j16A8lJbRvD3rOtrk/7bs=
@@ -92,6 +94,8 @@ github.com/astaxie/beego v1.12.3 h1:SAQkdD2ePye+v8Gn1r4X6IKZM1wd28EyUOVQ3PDSOOQ=
 github.com/astaxie/beego v1.12.3/go.mod h1:p3qIm0Ryx7zeBHLljmd7omloyca1s4yu1a8kM1FkpIA=
 github.com/aws/aws-sdk-go v1.42.23 h1:V0V5hqMEyVelgpu1e4gMPVCJ+KhmscdNxP/NWP1iCOA=
 github.com/aws/aws-sdk-go v1.42.23/go.mod h1:gyRszuZ/icHmHAVE4gc/r+cfCmhA1AD+vqfWbgI+eHs=
+github.com/axgle/mahonia v0.0.0-20180208002826-3358181d7394 h1:OYA+5W64v3OgClL+IrOD63t4i/RW7RqrAVl9LTZ9UqQ=
+github.com/axgle/mahonia v0.0.0-20180208002826-3358181d7394/go.mod h1:Q8n74mJTIgjX4RBBcHnJ05h//6/k6foqmgE45jTQtxg=
 github.com/baiyubin/aliyun-sts-go-sdk v0.0.0-20180326062324-cfa1a18b161f h1:ZNv7On9kyUzm7fvRZumSyy/IUiSC7AzL0I1jKKtwooA=
 github.com/baiyubin/aliyun-sts-go-sdk v0.0.0-20180326062324-cfa1a18b161f/go.mod h1:AuiFmCCPBSrqvVMvuqFuk0qogytodnVFVSN5CeJB8Gc=
 github.com/beego/bee/v2 v2.0.4 h1:nEjPwxJ8D+cr54eWChJGoGRH7bJ7OQwbhx8rU0OQf7E=
@@ -494,6 +498,8 @@ github.com/spf13/pflag v1.0.3 h1:zPAT6CGy6wXeQ7NtTnaTerfKOsV6V6F8agHXFiazDkg=
 github.com/spf13/viper v1.7.0 h1:xVKxvI7ouOI5I+U9s2eeiUfMaWBVoXA3AWskkrqK0VM=
 github.com/ssdb/gossdb v0.0.0-20180723034631-88f6b59b84ec h1:q6XVwXmKvCRHRqesF3cSv6lNqqHi0QWOvgDlSohg8UA=
 github.com/ssdb/gossdb v0.0.0-20180723034631-88f6b59b84ec/go.mod h1:QBvMkMya+gXctz3kmljlUCu/yB3GZ6oee+dUozsezQE=
+github.com/stevenyao/go-opencc v0.0.0-20161014062826-cc376a51b65e h1:EScGwVsN5G1/xRUdOKtUGugKseKjvHrvA71486Q39zg=
+github.com/stevenyao/go-opencc v0.0.0-20161014062826-cc376a51b65e/go.mod h1:lHc78mZexRHu9CQrKCEO0CLFl7GN0Xpj3PH3jBJ5EpY=
 github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
 github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
 github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE=
@@ -548,6 +554,8 @@ github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de
 github.com/yuin/goldmark v1.1.30/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
 github.com/yuin/goldmark v1.2.1 h1:ruQGxdhGHe7FWOJPT0mKs5+pD2Xs1Bm/kdGlHO04FmM=
 github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
+github.com/yuin/goldmark v1.4.13 h1:fVcFKWvrslecOb/tg+Cc05dkeYx540o0FuFt3nUVDoE=
+github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
 github.com/yuin/gopher-lua v0.0.0-20171031051903-609c9cd26973 h1:iCnkJ/qjKZGdZnlcj1N55AxPDan814kpc3s1cDpQKd8=
 github.com/yuin/gopher-lua v0.0.0-20171031051903-609c9cd26973/go.mod h1:aEV29XrmTYFr3CiRxZeGHpkvbwq+prZduBqMaascyCU=
 github.com/ziutek/mymysql v1.5.4 h1:GB0qdRGsTwQSBVYuVShFBKaXSnSnYYC2d9knnE1LHFs=
@@ -574,6 +582,7 @@ golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8U
 golang.org/x/crypto v0.0.0-20191219195013-becbf705a915/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
 golang.org/x/crypto v0.0.0-20200510223506-06a226fb4e37/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
 golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
+golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
 golang.org/x/crypto v0.0.0-20220411220226-7b82a4e95df4/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
 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=
@@ -590,6 +599,9 @@ golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHl
 golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
 golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
 golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4 h1:6zppjxzCulZykYSLyVDYbneBfbaBIQPYMevg0bEwv2s=
+golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
+golang.org/x/mod v0.8.0 h1:LUYupSeNrTNCGzR/hVBk2NHZO4hXcVaW1k4Qx7rjPx8=
+golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
 golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
@@ -606,14 +618,19 @@ golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/
 golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
 golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
 golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
+golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
 golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk=
 golang.org/x/net v0.0.0-20210916014120-12bc252f5db8/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
 golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
 golang.org/x/net v0.0.0-20211209124913-491a49abca63/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
 golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
+golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
 golang.org/x/net v0.0.0-20220812174116-3211cb980234/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk=
 golang.org/x/net v0.5.0 h1:GyT4nK/YDHSqa1c4753ouYCDajOYKTja9Xb/OHtgvSw=
 golang.org/x/net v0.5.0/go.mod h1:DivGGAXEgPSlEBzxGzZI+ZLohi+xUj054jfeKui00ws=
+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/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/oauth2 v0.3.0 h1:6l90koy8/LaBLmLu8jpHeHexzMwEita0zFfYlggy2F8=
@@ -625,7 +642,9 @@ golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJ
 golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sync v0.1.0 h1:wsuoTGHzEhffawBOhz5CYhcrV4IdKZbEyZjBMuTp12o=
+golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
@@ -649,14 +668,22 @@ golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7w
 golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.4.0 h1:Zr2JFtRQNX3BCZ8YtxRE9hNJYC8J6I1MVbMg6owUp18=
 golang.org/x/sys v0.4.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+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/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.4.0 h1:O7UWfv5+A2qiuulQk30kVinPoMtoIPeVaKLEgLpVkvg=
+golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=
+golang.org/x/term v0.7.0 h1:BEvjmm5fURWqcfbSKTdpkDXYBrUS1c0m8agp14W48vQ=
+golang.org/x/term v0.7.0/go.mod h1:P32HKFT3hSsZrRxla30E9HqToFYAQPCMs/zFMBUFqPY=
 golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
 golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
 golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
@@ -665,6 +692,9 @@ golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
 golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
 golang.org/x/text v0.6.0 h1:3XmdazWV+ubf7QgHSTWeykHOci5oeekaGJBLkrkaw4k=
 golang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
+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/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=
@@ -681,6 +711,9 @@ golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtn
 golang.org/x/tools v0.0.0-20200509030707-2212a7e161a5/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
 golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
 golang.org/x/tools v0.1.12 h1:VveCTK38A2rkS8ZqFY25HIDFscX5X9OoEhJd3quQmXU=
+golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
+golang.org/x/tools v0.6.0 h1:BOw41kyTf3PuCW1pVQf8+Cyg8pMlkYB1oo9iJ6D/lKM=
+golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=
 golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=

+ 20 - 8
models/cygx/activity.go

@@ -84,6 +84,7 @@ type ActivityRep struct {
 	List                    []*ActivityGroupIndustrialRep
 	VoiceList               []*CygxActivityVoiceReq
 	VideoDetail             *CygxActivityVideoReq
+	ListImgToText           []*AliyunOcrTextActivityResp `description:"识图建会的会议信息列表"`
 }
 
 // 活动添加、修改入参
@@ -297,15 +298,16 @@ func AddActivity(items []*CygxActivity, industrialActivityItems [][]*CygxIndustr
 				}
 			}
 		}
-	}
 
-	{
-		//添加研选扣点内容
-		if itemPointsSet.PointsObject != "" {
-			itemPointsSet.ActivityId = int(newId)
-			_, err = to.Insert(itemPointsSet)
-			if err != nil {
-				return
+		{
+			//添加研选扣点内容
+			if itemPointsSet.PointsObject != "" {
+				itemPointsSet.ActivityId = int(newId)
+				itemPointsSet.Id = 0 // 二次插入的时候主键被赋值了
+				_, err = to.Insert(itemPointsSet)
+				if err != nil {
+					return
+				}
 			}
 		}
 	}
@@ -742,3 +744,13 @@ func UpdateCygxActivitySigninImg(signinImg string, activityId int) (err error) {
 	_, err = o.Raw(sql, signinImg, activityId).Exec()
 	return
 }
+
+type AliyunOcrTextActivityResp struct {
+	TitmeYMD string `description:"时间年月日"`
+	TitmeHM  string `description:"时间时分"`
+	Company  string `description:"公司名称"`
+}
+
+type AliyunOcrTextActivityListResp struct {
+	List []*AliyunOcrTextActivityResp
+}

+ 23 - 0
models/cygx/aliyun_ocr_log.go

@@ -0,0 +1,23 @@
+package cygx
+
+import (
+	"github.com/beego/beego/v2/client/orm"
+	"time"
+)
+
+type AliyunOcrImgUrlReq struct {
+	ImgUrl string `description:"图片地址"`
+}
+
+type AliyunOcrLog struct {
+	Id         int       `orm:"column(id);pk"`
+	ImgUrl     string    `description:"图片地址"`
+	Result     string    `description:"手机号"`
+	CreateTime time.Time `description:"创建时间"`
+}
+
+func AddAliyunOcrLog(item *AliyunOcrLog) (err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	_, err = o.Insert(item)
+	return
+}

+ 8 - 0
models/db.go

@@ -87,6 +87,13 @@ func init() {
 	fms_datadb, _ := orm.GetDB("fms")
 	fms_datadb.SetConnMaxLifetime(10 * time.Minute)
 
+	_ = orm.RegisterDataBase("hz_cygx", "mysql", utils.MYSQL_URL_CYGX)
+	orm.SetMaxIdleConns("hz_cygx", 50)
+	orm.SetMaxOpenConns("hz_cygx", 100)
+
+	cygx_db, _ := orm.GetDB("hz_cygx")
+	cygx_db.SetConnMaxLifetime(10 * time.Minute)
+
 	orm.Debug = true
 	orm.DebugLog = orm.NewLog(utils.Binlog)
 
@@ -430,6 +437,7 @@ func initCygx() {
 		new(cygx.CygxActivityPointsBill),
 		new(cygx.CygxActivityPointsCompany),
 		new(cygx.CygxTag),
+		new(cygx.AliyunOcrLog),
 	)
 }
 

+ 9 - 0
routers/commentsRouter.go

@@ -538,6 +538,15 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:ActivityCoAntroller"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:ActivityCoAntroller"],
+        beego.ControllerComments{
+            Method: "ImgToText",
+            Router: `/activity/imgToText`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:ActivityCoAntroller"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:ActivityCoAntroller"],
         beego.ControllerComments{
             Method: "ActivityList",

+ 80 - 0
services/aliyun_ocr.go

@@ -0,0 +1,80 @@
+package services
+
+import (
+	"encoding/json"
+	"fmt"
+	"hongze/hz_crm_api/models/cygx"
+	"io/ioutil"
+	"net/http"
+	"strings"
+	"time"
+)
+
+var (
+	AliyunAppCode = "22553c4ba74545568aba70ac6cfd441d" // AppCode
+)
+
+type AliOcrByImageToTextResp struct {
+	RequestID string `json:"request_id"`
+	Ret       []struct {
+		Rect struct {
+			Angle  int64 `json:"angle"`
+			Height int64 `json:"height"`
+			Left   int64 `json:"left"`
+			Top    int64 `json:"top"`
+			Width  int64 `json:"width"`
+		} `json:"rect"`
+		Word string `json:"word"`
+	} `json:"ret"`
+	Success bool `json:"success"`
+}
+
+//func init() {
+//	AliOcrByImageToText("https://hzstatic.hzinsights.com/cygx/config/a2.jpg")
+//}
+
+// 阿里云OCR将图片转文字
+func AliOcrByImageToText(imageurl string) (item *AliOcrByImageToTextResp, err error) {
+	url := "https://tysbgpu.market.alicloudapi.com/api/predict/ocr_general"
+	method := "POST"
+
+	payload := strings.NewReader(`{
+    "image":"` + imageurl + `"
+}`)
+
+	client := &http.Client{}
+	req, err := http.NewRequest(method, url, payload)
+
+	if err != nil {
+		fmt.Println(err)
+		return
+	}
+	req.Header.Add("Authorization", "APPCODE "+AliyunAppCode)
+	req.Header.Add("Content-Type", "application/json")
+
+	res, err := client.Do(req)
+	if err != nil {
+		fmt.Println(err)
+		return
+	}
+	defer res.Body.Close()
+
+	body, err := ioutil.ReadAll(res.Body)
+	if err != nil {
+		fmt.Println(err)
+		return
+	}
+
+	err = json.Unmarshal(body, &item)
+	if err != nil {
+		fmt.Println(err)
+		return
+	}
+
+	logItem := new(cygx.AliyunOcrLog)
+	logItem.ImgUrl = imageurl
+	logItem.Result = string(body)
+	logItem.CreateTime = time.Now()
+	err = cygx.AddAliyunOcrLog(logItem)
+	return
+}

+ 157 - 0
services/cygx/activity_ocr.go

@@ -0,0 +1,157 @@
+package cygx
+
+import (
+	"errors"
+	"hongze/hz_crm_api/models/cygx"
+	"hongze/hz_crm_api/utils"
+	"strconv"
+	"strings"
+	"time"
+)
+
+//处理OCR识别图片建会的逻辑
+
+//星期日 Sunday=Sun. 读音:英[ˈsʌndeɪ]美[ˈsʌnˌdeɪ]
+//
+//星期一 Monday=Mon. 读音:英[ˈmʌndeɪ]美[ˈmʌndeɪ]
+//
+//星期二 Tuesday=Tues. 读音:英[ˈtju:zdeɪ]美[ˈtu:zdeɪ]
+//
+//星期三 Wednesday=Wed. 读音:英[ˈwenzdeɪ]美[ˈwɛnzdi, -ˌde]
+//
+//星期四 Thursday=Thur./Thurs. 读音:英[ˈθɜ:zdeɪ]美[ˈθɜ:rzdeɪ]
+//
+//星期五 Friday=Fri. 读音:英[ˈfraɪdeɪ]美[ˈfraɪˌdeɪ]
+//
+//星期六 Saturday=Sat. 读音: 英[ˈsætədeɪ]美[ˈsætərdeɪ]
+
+// 处理年月日格式
+func ConvertActivityTitmeYMD(TitmeYMD string) (titmeYMDNew string) {
+	titmeYMDNew = TitmeYMD
+	titmeYMDNew = strings.Replace(titmeYMDNew, "/", "月", -1)
+	//titmeYMDNew = strings.Replace(titmeYMDNew, "SUN", "日(周日)", -1)
+	//titmeYMDNew = strings.Replace(titmeYMDNew, "MON", "日(周一)", -1)
+	//titmeYMDNew = strings.Replace(titmeYMDNew, "TUE", "日(周二)", -1)
+	//titmeYMDNew = strings.Replace(titmeYMDNew, "WED", "日(周三)", -1)
+	//titmeYMDNew = strings.Replace(titmeYMDNew, "THU", "日(周四)", -1)
+	//titmeYMDNew = strings.Replace(titmeYMDNew, "FRI", "日(周五)", -1)
+	//titmeYMDNew = strings.Replace(titmeYMDNew, "SAT", "日(周六)", -1)
+
+	titmeYMDNew = strings.Replace(titmeYMDNew, "SUN", "日", -1)
+	titmeYMDNew = strings.Replace(titmeYMDNew, "MON", "日", -1)
+	titmeYMDNew = strings.Replace(titmeYMDNew, "TUE", "日", -1)
+	titmeYMDNew = strings.Replace(titmeYMDNew, "WED", "日", -1)
+	titmeYMDNew = strings.Replace(titmeYMDNew, "THU", "日", -1)
+	titmeYMDNew = strings.Replace(titmeYMDNew, "FRI", "日", -1)
+	titmeYMDNew = strings.Replace(titmeYMDNew, "SAT", "日", -1)
+	titmeYMDNew = strconv.Itoa(time.Now().Year()) + "年" + titmeYMDNew
+	return
+}
+
+// 处理时分PM格式
+func ConvertActivityTitmeHM(titmeHM string) (titmeHMNew string) {
+	titmeHMNew = titmeHM
+	//var hNum int
+	var amOrPm string
+	if strings.Contains(titmeHM, "PM") {
+		//hNum = 12
+		amOrPm = "PM"
+	} else {
+		amOrPm = "AM"
+	}
+	titmeHM = strings.Replace(titmeHM, "AM", "", -1)
+	titmeHM = strings.Replace(titmeHM, "PM", "", -1)
+	sliceHm := strings.Split(titmeHM, ":")
+	if len(sliceHm) != 2 {
+		return
+	}
+	hourNum, _ := strconv.Atoi(sliceHm[0])
+	minute := sliceHm[1]
+	titmeHMNew = strconv.Itoa(hourNum) + ":" + minute + " " + amOrPm
+	return
+}
+
+// 活动内容模版
+var ActivityOcrTemplate = "<p>【买方研选-小范围公司线上交流】{{COMPANY}}</p><p>时间:{{TIME}}</p><p>嘉宾:IR</p><p>主持人:IR</p><p>链接参会:(会前一天下午更新)</p><p>备注:</p><p>1、请先报名,我们将于会议前一天提供【Webex】入会链接(可电话拨入or网络端参会);</p><p>2、会议语言:{{LANGUAGE}};</p><p>3、本场会议报名截止时间为会议开始前一天下午3点半;</p><p>4、本次会议扣0.5次研选服务点。</p>"
+
+func MakeActivityReqText(list []*cygx.AliyunOcrTextActivityResp) (req cygx.ActivityRep, err error, errMsg string) {
+	for _, v := range list {
+		ActivityOcrTmp := ActivityOcrTemplate
+		sliceCompany := strings.Split(v.Company, "(")
+		company := sliceCompany[0]
+		ActivityOcrTmp = strings.Replace(ActivityOcrTmp, "{{COMPANY}}", company, -1)
+		v.TitmeYMD = strings.Replace(v.TitmeYMD, "年", "-", -1)
+		v.TitmeYMD = strings.Replace(v.TitmeYMD, "月", "-", -1)
+		v.TitmeYMD = strings.Replace(v.TitmeYMD, "日", "", -1)
+		weeknum := utils.StrDateTimeToWeek(v.TitmeYMD + " 00:00:00")
+
+		havePm := strings.Contains(v.TitmeHM, "PM")
+		var activityTime string
+		activityTime = strings.Replace(v.TitmeHM, " ", "", -1)
+		activityTime = strings.Replace(activityTime, "AM", "", -1)
+		activityTime = strings.Replace(activityTime, "PM", "", -1)
+
+		activityTime = v.TitmeYMD + " " + activityTime + ":00"
+		resultTime := utils.StrTimeToTime(activityTime)
+		var amOrPm string
+		if havePm {
+			//前端传过来的是 2:00PM 这里转成 14:00 PM
+			slicePm := strings.Split(v.TitmeHM, ":")
+			for sk, sv := range slicePm {
+				// 如果是中午 12:30 PM 就不做任何处理
+				if sk == 0 && sv != "12" {
+					resultTime = resultTime.Add(12 * time.Hour)
+					activityTime = resultTime.Format(utils.FormatDateTime)
+				}
+			}
+			amOrPm = "PM"
+		} else {
+			amOrPm = "AM"
+		}
+		var condition string
+		var pars []interface{}
+		condition = " AND activity_type_id = 3 AND  activity_time = ? AND temporary_label = ? "
+		pars = append(pars, activityTime, company)
+		total, e := cygx.GetActivityCount(condition, pars)
+		if e != nil {
+			err = errors.New("GetActivityCount,Err" + e.Error())
+			return
+		}
+
+		if total > 0 {
+			errMsg = "相同时段已存在对应活动"
+			return
+		}
+		ActivityOcrTmp = strings.Replace(ActivityOcrTmp, "{{TIME}}", v.TitmeYMD+"("+weeknum+")"+resultTime.Format(utils.FormatTimeHm)+amOrPm, -1)
+		if !utils.CheckStrHaveLetter(company) {
+			ActivityOcrTmp = strings.Replace(ActivityOcrTmp, "{{LANGUAGE}}", "中文", -1)
+		} else {
+			ActivityOcrTmp = strings.Replace(ActivityOcrTmp, "{{LANGUAGE}}", "英文", -1)
+		}
+		req.Body += ActivityOcrTmp + "<hr>" //分隔符标签
+		label := new(cygx.ActivityGroupIndustrialRep)
+		label.TemporaryLabel = company
+		req.List = append(req.List, label)
+	}
+	//初始化相关活动参数信息
+	req.Body = strings.TrimRight(req.Body, "<hr>")
+	req.DoType = 1
+	req.ActivityTypeId = 3
+	req.PermissionName = utils.CHART_PERMISSION_NAME_MF_YANXUAN
+	req.CustomerTypeIds = "1,2,8,10,3,9,5,6,7"
+	req.IsAllCustomerType = 1
+	req.LimitPeopleNum = 10
+	req.LabelType = 1
+	req.VisibleRange = 2
+	req.IsResearchPoints = 1
+	req.IsNeedEmail = 1
+	// 研选点数
+	pointsSet := new(cygx.CygxActivityPointsSetRsq)
+	pointsSet.PointsObject = "1"
+	pointsSet.UserPointsNum = "0.5"
+	pointsSet.PointsType = "1"
+	pointsSet.CompanyPointsNum = "0"
+	pointsSet.CancelDeadlineType = "1"
+	req.PointsSet = pointsSet
+	return
+}

+ 12 - 0
utils/common.go

@@ -2087,3 +2087,15 @@ func FormatTableDataShowValue(x float64) (res string) {
 	}
 	return
 }
+
+// 校验字符是否包含字母
+func CheckStrHaveLetter(checkString string) (checked bool) {
+	allLetterDigit := []string{"A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"}
+	for _, v := range allLetterDigit {
+		if strings.Contains(checkString, v) {
+			checked = true
+			return true
+		}
+	}
+	return
+}

+ 2 - 0
utils/config.go

@@ -18,6 +18,7 @@ var (
 	MYSQL_URL_COMEIN_DATA  string // 路演记录数据库
 	MYSQL_URL_WEEKLY_TRIAL string // ETA试用
 	MYSQL_URL_FMS          string // 财务系统
+	MYSQL_URL_CYGX         string // 查研观向
 
 	REDIS_CACHE string       //缓存地址
 	Rc          *cache.Cache //redis缓存
@@ -194,6 +195,7 @@ func init() {
 	MYSQL_URL_COMEIN_DATA = config["mysql_url_comein_data"]
 	MYSQL_URL_WEEKLY_TRIAL = config["mysql_url_weekly_trial"]
 	MYSQL_URL_FMS = config["mysql_url_fms"]
+	MYSQL_URL_CYGX = config["mysql_url_cygx"]
 
 	REDIS_CACHE = config["beego_cache"]
 	if len(REDIS_CACHE) <= 0 {