Selaa lähdekoodia

权益CRM客户信息同步 新增冻结客户,流失客户同步,用户禁用

xingzai 2 vuotta sitten
vanhempi
commit
d3e26f7c1e
5 muutettua tiedostoa jossa 209 lisäystä ja 53 poistoa
  1. 45 14
      models/send_company_user.go
  2. 154 39
      services/send_company_user.go
  3. 1 0
      services/task.go
  4. 5 0
      utils/config.go
  5. 4 0
      utils/constants.go

+ 45 - 14
models/send_company_user.go

@@ -49,6 +49,13 @@ type CompanyUnJsonList struct {
 	SyncData []CompanyJson `json:"sync_data"`
 }
 
+//删除用户
+type ShangHaiCrmUserDeleteResp struct {
+	Social string `json:"social"`
+	Mobile string `json:"phone"`
+	Name   string `json:"name"`
+}
+
 //获取公司
 func GetSendCompanyList(condition string) (items []*CompanyJson, err error) {
 	o := orm.NewOrm()
@@ -60,7 +67,7 @@ func GetSendCompanyList(condition string) (items []*CompanyJson, err error) {
 			p.industry_name,
 			am.real_name,
 			am.mobile,
-			a.status,
+			p.status,
 			p.end_date as end_date_time,
 			UNIX_TIMESTAMP( p.start_date ) AS start_date,
 			UNIX_TIMESTAMP( p.end_date ) AS end_date,
@@ -72,8 +79,7 @@ func GetSendCompanyList(condition string) (items []*CompanyJson, err error) {
 					WHERE  a.company_id=cid
 					AND c.enabled = 1 
 					AND b.cygx_auth=1
-					AND c.status IN('正式','试用')
-					AND a.status IN('正式','试用')) AS permission
+					AND c.status IN('正式','试用','冻结','流失')) AS permission
 		FROM
 			company_report_permission AS a
 			INNER JOIN chart_permission AS b ON a.chart_permission_id = b.chart_permission_id
@@ -85,8 +91,7 @@ func GetSendCompanyList(condition string) (items []*CompanyJson, err error) {
 			1 = 1 
 			AND c.enabled = 1 
 			AND b.cygx_auth = 1
-			AND p.STATUS IN ( '正式', '试用' ) 
-			AND a.STATUS IN ( '正式', '试用' )
+			AND p.STATUS IN ( '正式', '试用','冻结','流失' )
 			AND( c.credit_code LIKE '91%'  OR  c.credit_code LIKE 'HZ%' )
 			AND p.product_id = 2 ` + condition +
 		`GROUP BY 
@@ -106,7 +111,7 @@ func GetSendCompanyFiccList(condition string) (items []*CompanyJson, err error)
 			p.industry_name,
 			am.real_name,
 			am.mobile,
-			a.status,
+			p.status,
 			p.end_date AS end_date_time,
 			UNIX_TIMESTAMP( p.start_date ) AS start_date,
 			UNIX_TIMESTAMP( p.end_date ) AS end_date,
@@ -123,8 +128,7 @@ func GetSendCompanyFiccList(condition string) (items []*CompanyJson, err error)
 				a.company_id = cid 
 				AND c.enabled = 1 
 				AND b.cygx_auth = 1 
-				AND c.STATUS IN ( '正式', '试用' ) 
-			AND a.STATUS IN ( '正式', '试用' )) AS permission 
+				AND c.STATUS IN ( '正式', '试用' ,'冻结','流失')) AS permission 
 		FROM
 			company_report_permission AS a
 			INNER JOIN chart_permission AS b ON a.chart_permission_id = b.chart_permission_id
@@ -136,8 +140,7 @@ func GetSendCompanyFiccList(condition string) (items []*CompanyJson, err error)
 			1 = 1 
 			AND c.enabled = 1 
 			AND b.cygx_auth = 1
-			AND p.STATUS IN ( '正式', '试用' ) 
-			AND a.STATUS IN ( '正式', '试用' ) 
+			AND p.STATUS IN ( '正式', '试用','冻结','流失' )
 			AND ( c.credit_code LIKE '91%' OR c.credit_code LIKE 'HZ%' ) 
 			AND p.product_id = 1 ` + condition +
 		`AND c.company_id NOT IN (
@@ -154,8 +157,7 @@ func GetSendCompanyFiccList(condition string) (items []*CompanyJson, err error)
 				1 = 1 
 				AND c.enabled = 1 
 				AND b.cygx_auth = 1 
-				AND p.STATUS IN ( '正式', '试用' ) 
-				AND a.STATUS IN ( '正式', '试用' ) 
+				AND p.STATUS IN  ( '正式', '试用' ,'冻结','流失')
 				AND ( c.credit_code LIKE '91%' OR c.credit_code LIKE 'HZ%' ) 
 				AND p.product_id = 2
 			GROUP BY
@@ -202,8 +204,7 @@ func GetSendUserList(condition string) (items []*UserJson, err error) {
 				1 = 1 
 				AND c.enabled = 1 
 				AND b.cygx_auth = 1 
-				AND p.STATUS IN ( '正式', '试用' ) 
-				AND a.STATUS IN ( '正式', '试用' )
+				AND p.STATUS IN ( '正式', '试用','冻结','流失')
 				AND us.create_time  != '' ` + condition +
 		`GROUP BY
 				c.company_id 
@@ -222,6 +223,15 @@ type WxUserOpLogResp struct {
 	Mobile    string `description:"用户ID"`
 }
 
+type WxUserOpLogDeleteResp struct {
+	CompanyId        int    `description:"客户ID"`
+	UserId           int    `description:"用户ID"`
+	Mobile           string `description:"用户ID"`
+	OriginalUserInfo string `description:"用户详情"`
+	CreditCode       string `description:"社会信用码"`
+	RealName         string `description:"真实姓名"`
+}
+
 //获取指定时间内更新的用户
 func GetWxUserOpLog(createTime string) (items []*WxUserOpLogResp, err error) {
 	o := orm.NewOrm()
@@ -236,6 +246,27 @@ func GetWxUserOpLog(createTime string) (items []*WxUserOpLogResp, err error) {
 	return
 }
 
+//获取指定时间内删除的用户
+func GetWxUserOpLogDelete(createTime string) (items []*WxUserOpLogDeleteResp, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT
+			l.*,
+			c.credit_code 
+		FROM
+			wx_user_op_log AS l
+			INNER JOIN company AS c ON c.company_id = l.company_id  WHERE l.log_type = 'delete' AND l.create_time >=  '` + createTime + `'`
+	_, err = o.Raw(sql).QueryRows(&items)
+	return
+}
+
+//获取指定时间内试用转冻结,冻结转流失的客户
+func GetCompanyFreezeAndLoss(createTime string) (items []*WxUserOpLogResp, err error) {
+	o := orm.NewOrm()
+	sql := ` SELECT * FROM  company_operation_record WHERE status IN ('冻结','流失') AND  create_time >  '` + createTime + `'  GROUP BY company_id `
+	_, err = o.Raw(sql).QueryRows(&items)
+	return
+}
+
 //获取指定时间内被移动的用户
 func GetWxUserOpLogList(startDate, endDate string) (items []*WxUserOpLogResp, err error) {
 	o := orm.NewOrm()

+ 154 - 39
services/send_company_user.go

@@ -44,6 +44,11 @@ type ShangHaiResultApidateComPany struct {
 	ErrMsg string `json:"errMsg"`
 }
 
+type OriginalUserInfoResp struct {
+	Mobile   string `json:"Mobile"`
+	RealName string `json:"RealName"`
+}
+
 //c
 func SendComapnyToShanghai(url, jsonCompany, postType string) (err error) {
 	var msg string
@@ -102,10 +107,14 @@ func SendComapnyToShanghai(url, jsonCompany, postType string) (err error) {
 }
 
 func DotongbuShangHai(cont context.Context) (err error) {
+	//func DotongbuShangHai() (err error) {
+	//先删除被禁用的用户
+	DeleteUserDotongbuShangHaiApi()
 	var condition string
-	updateTime := time.Now().Add(-time.Minute * 22).Format("2006-01-02 15:04:05")
+	updateTime := time.Now().Add(-time.Minute * 2).Format("2006-01-02 15:04:05")
 	listUpdateUser, err := models.GetWxUserOpLog(updateTime)
 	if err != nil && err.Error() != utils.ErrNoRow() {
+		fmt.Println(err)
 		return err
 	}
 	var companyIds string
@@ -114,69 +123,55 @@ func DotongbuShangHai(cont context.Context) (err error) {
 			companyIds += strconv.Itoa(v.CompanyId) + ","
 		}
 	}
+	////获取冻结跟流失的用户
+	listFreezeAndLoss, err := models.GetCompanyFreezeAndLoss(updateTime)
+	if err != nil && err.Error() != utils.ErrNoRow() {
+		return err
+	}
+	if len(listFreezeAndLoss) > 0 {
+		for _, v := range listFreezeAndLoss {
+			companyIds += strconv.Itoa(v.CompanyId) + ","
+		}
+	}
 	condition = ` AND p.modify_time > ` + "'" + updateTime + "'"
 	companyIds = strings.TrimRight(companyIds, ",")
+
+	fmt.Println("获取冻结跟流失的用户", len(listFreezeAndLoss))
+	//return err
 	if companyIds != "" {
 		//这一部分先不推送,避免并发推送
 		condition += ` AND c.company_id  NOT  IN (` + companyIds + ") "
 	}
 
 	//偶尔需要单独同步某一个公司的人员
-	//condition = ` AND c.company_id  =  8284  `
+	//condition = ` AND c.company_id  =  5676  `
+
 	//同30小时有变更的公司
-	go DotongbuShangHaApi(condition)
+	DotongbuShangHaApi(condition)
 
 	//原有的公司如果新增了也同步
-	//companyIds = strings.TrimRight(companyIds, ",")
+	companyIds = strings.TrimRight(companyIds, ",")
 	if companyIds != "" {
 		condition = ` AND c.company_id  IN (` + companyIds + ")"
-		go DotongbuShangHaApi(condition)
+		DotongbuShangHaApi(condition)
 	}
 	return
 }
 
-//func DotongbuShangHai(cont context.Context) (err error) {
 func DotongbuShangHaApi(condition string) (err error) {
 	var msg string
 	defer func() {
 		if err != nil {
+			fmt.Println(err)
 			go utils.SendAlarmMsg("同步策略平台获取数据信息失败", 2)
 			go utils.SendEmail("同步策略平台获取数据信息失败"+"【"+utils.APPNAME+"】"+time.Now().Format("2006-01-02 15:04:05"), msg+";Err:"+err.Error(), utils.EmailSendToExpert)
 		}
 	}()
-	//同步24小时之前的数据到上海平台,为防止遗漏改成30小时
-
-	//updateTime := time.Now().Add(-time.Hour * 30).Format("2006-01-02 15:04:05")
-	//condition = ` AND p.modify_time > ` + "'" + updateTime + "'"
-	//fmt.Println(condition)
-	//获取token
-	url := "https://crm.hzinsights.com/openapi/v1/auth/getAccessToken?app_key=26945134&app_secret=b99cb2bdec70d20156000f664ec5ac30"
-	method := "GET"
-	client := &http.Client{}
-	req, err := http.NewRequest(method, url, nil)
-	if err != nil {
-		msg = "GetToken Err:" + err.Error()
-		return err
-	}
-	res, err := client.Do(req)
+	var url string
+	accessToken, err := GetShangHaiCrmApiToken()
 	if err != nil {
-		msg = "client Err:" + err.Error()
-		return err
-	}
-	defer res.Body.Close()
-	body, err := ioutil.ReadAll(res.Body)
-	if err != nil {
-		msg = "body Err:" + err.Error()
-		return
-	}
-	var result GetShangHaiTokenResultApi
-	err = json.Unmarshal(body, &result)
-	if err != nil {
-		msg = "Get result Err:" + err.Error()
 		return
 	}
-	accessToken := result.Data.AccessToken
-	fmt.Println(accessToken)
 	//同步权益客户
 	companyList, err := models.GetSendCompanyList(condition)
 	if err != nil {
@@ -186,7 +181,8 @@ func DotongbuShangHaApi(condition string) (err error) {
 	fmt.Println("权益客户", len(companyList))
 	var companyItems []*models.CompanyJson
 	if len(companyList) > 0 {
-		url = "https://crm.hzinsights.com/openapi/v1/Customer/batchSyncFiccCustomer?access_token=" + accessToken
+		//url = "https://crm.hzinsights.com/openapi/v1/Customer/batchSyncFiccCustomer?access_token=" + accessToken
+		url = utils.ShangHaiCrmApiLink + "openapi/v1/Customer/batchSyncFiccCustomer?access_token=" + accessToken
 		for k, _ := range companyList {
 			companyList[k].Fe = "权益"
 			companyList[k].EndDate = strconv.Itoa(int(companyList[k].EndDateTime.Unix()))
@@ -226,7 +222,8 @@ func DotongbuShangHaApi(condition string) (err error) {
 	fmt.Println("FICC客户", len(companyFiccList))
 	var companyFiccItems []*models.CompanyJson
 	if len(companyFiccList) > 0 {
-		url = "https://crm.hzinsights.com/openapi/v1/Customer/batchSyncFiccCustomer?access_token=" + accessToken
+		//url = "https://crm.hzinsights.com/openapi/v1/Customer/batchSyncFiccCustomer?access_token=" + accessToken
+		url = utils.ShangHaiCrmApiLink + "openapi/v1/Customer/batchSyncFiccCustomer?access_token=" + accessToken
 		for k, _ := range companyFiccList {
 			companyFiccList[k].Fe = "FICC"
 			companyFiccList[k].EndDate = strconv.Itoa(int(companyFiccList[k].EndDateTime.Unix()))
@@ -265,7 +262,8 @@ func DotongbuShangHaApi(condition string) (err error) {
 	fmt.Println("用户", len(userList))
 	var userItems []*models.UserJson
 	if len(userList) > 0 {
-		url = "https://crm.hzinsights.com/openapi/v1/CustomerContact/batchSyncFiccCustomerContact?access_token=" + accessToken
+		//url = "https://crm.hzinsights.com/openapi/v1/CustomerContact/batchSyncFiccCustomerContact?access_token=" + accessToken
+		url = utils.ShangHaiCrmApiLink + "openapi/v1/CustomerContact/batchSyncFiccCustomerContact?access_token=" + accessToken
 		for k, v := range userList {
 			if v.Sex == "1" {
 				userList[k].Sex = "男"
@@ -414,3 +412,120 @@ func DotongbuShangHaiSendEmail(cont context.Context) (err error) {
 	go models.DeleteCygxShanghaiCompanyLog()
 	return
 }
+
+//DeleteUserDotongbuShangHaApi 删除用户进行同步
+func DeleteUserDotongbuShangHaiApi() (err error) {
+	var msg string
+	defer func() {
+		if err != nil {
+			go utils.SendAlarmMsg("同步策略平台获取数据信息失败 DeleteUserDotongbuShangHaApi"+err.Error()+msg, 2)
+		}
+	}()
+	updateTime := time.Now().Add(-time.Minute * 2).Format("2006-01-02 15:04:05")
+	listDeleteUser, err := models.GetWxUserOpLogDelete(updateTime)
+	if err != nil && err.Error() != utils.ErrNoRow() {
+		return err
+	}
+	fmt.Println("删除用户", len(listDeleteUser))
+	if len(listDeleteUser) > 0 {
+		var deleteCompanyIds string
+		for k, v := range listDeleteUser {
+			deleteCompanyIds += strconv.Itoa(v.CompanyId) + ","
+			var resultUser OriginalUserInfoResp
+			if err := json.Unmarshal([]byte(v.OriginalUserInfo), &resultUser); err == nil {
+				listDeleteUser[k].RealName = resultUser.RealName
+			} else {
+				return err
+			}
+		}
+	} else {
+		return err
+	}
+	var url string
+	accessToken, err := GetShangHaiCrmApiToken()
+	if err != nil {
+		return
+	}
+	var userItems []*models.ShangHaiCrmUserDeleteResp
+	if len(listDeleteUser) > 0 {
+		url = utils.ShangHaiCrmApiLink + "openapi/v1/CustomerContact/batchDisableCustomerContact?access_token=" + accessToken
+		for k, v := range listDeleteUser {
+			userItem := new(models.ShangHaiCrmUserDeleteResp)
+			userItem.Name = v.RealName
+			userItem.Mobile = v.Mobile
+			userItem.Social = v.CreditCode
+			//一次同步一百条
+			userItems = append(userItems, userItem)
+			if (k+1)%100 == 0 {
+				data, err := json.Marshal(userItems)
+				if err != nil {
+					msg = "companyItems Err:" + err.Error()
+					return err
+				}
+				jsonstr := string(data)
+				jsonstr = "{\"data\": " + jsonstr + " }"
+				SendComapnyToShanghai(url, jsonstr, "权益")
+				userItems = make([]*models.ShangHaiCrmUserDeleteResp, 0)
+			}
+		}
+		//如果剩下还有则同步剩下的部分
+		if len(userItems) > 0 {
+			data, err := json.Marshal(userItems)
+			if err != nil {
+				msg = "companyItems Err:" + err.Error()
+				return err
+			}
+			jsonstr := string(data)
+			jsonstr = "{\"data\": " + jsonstr + " }"
+			SendComapnyToShanghai(url, jsonstr, "权益")
+			userItems = make([]*models.ShangHaiCrmUserDeleteResp, 0)
+		}
+	}
+	return
+}
+
+//获取用户的Token
+func GetShangHaiCrmApiToken() (token string, err error) {
+	var msg string
+	defer func() {
+		if err != nil {
+			go utils.SendAlarmMsg("同步策略平台获取数据信息失败 DeleteUserDotongbuShangHaApi"+err.Error()+msg, 2)
+		}
+	}()
+	cacheKey := utils.SHANG_HAI_CRM_API_TOKEN
+	ttlTime := utils.Rc.GetRedisTTL(cacheKey)
+	if ttlTime > 0 {
+		token, _ = utils.Rc.RedisString(cacheKey)
+	}
+	if token == "" {
+		//获取token
+		url := utils.ShangHaiCrmApiLink + "openapi/v1/auth/getAccessToken?app_key=26945134&app_secret=b99cb2bdec70d20156000f664ec5ac30"
+		method := "GET"
+		client := &http.Client{}
+		req, errReq := http.NewRequest(method, url, nil)
+		if errReq != nil {
+			err = errReq
+			return
+		}
+		res, errReq := client.Do(req)
+		if errReq != nil {
+			err = errReq
+			return
+		}
+		defer res.Body.Close()
+		body, errReq := ioutil.ReadAll(res.Body)
+		if errReq != nil {
+			err = errReq
+			return
+		}
+		var result GetShangHaiTokenResultApi
+		errReq = json.Unmarshal(body, &result)
+		if errReq != nil {
+			err = errReq
+			return
+		}
+		token = result.Data.AccessToken
+		utils.Rc.Put(cacheKey, token, time.Second*7000)
+	}
+	return
+}

+ 1 - 0
services/task.go

@@ -95,6 +95,7 @@ func Task() {
 		getArticleListByApi := task.NewTask("getArticleListByApi", "0 */60 * * * *", GetArticleListByApi) //通过三方接口获取策略平台上的文章
 		task.AddTask("getArticleListByApi", getArticleListByApi)
 	}
+
 	//CreateIndexNameArticleHistory()
 	//AddAllArticleHistory()
 	//DoCompany()

+ 5 - 0
utils/config.go

@@ -79,6 +79,7 @@ var (
 	YiDongZhengTongYunSecret  string //易董 证通云请求secret
 	YiDongHuaWeiYunUrl        string //易董 华为云请求域名
 	YiDonggetOriginalLink     string //易董 短连接转为长链接
+	ShangHaiCrmApiLink        string //上海CRM用户同步api调用地址
 )
 
 func init() {
@@ -168,6 +169,8 @@ func init() {
 		ActSendMsgMobile = "15618524605"
 		ArticleTaskClassMobile = "15557270714,18767183922,15216736473,15000123056,18701809782,17706316791,18652179672"
 
+		ShangHaiCrmApiLink = "https://crm.hzinsights.com/"
+
 	} else {
 		WxAppId = "wxcc32b61f96720d2f"
 		WxAppSecret = "06894933fafb24dafead7eaae09c08e0"
@@ -199,6 +202,8 @@ func init() {
 		WxMsgTemplateIdAskMsgMobile = "15557270714,17634786714,18767183922,17516315016"
 		ActSendMsgMobile = "17634786714"
 		ArticleTaskClassMobile = "15557270714,18767183922,17706316791"
+
+		ShangHaiCrmApiLink = "http://106.15.192.100:8100/"
 	}
 
 	//查研观向小助手

+ 4 - 0
utils/constants.go

@@ -103,6 +103,10 @@ const (
 	YD_TOKEN = "yidong_token"
 )
 
+const (
+	SHANG_HAI_CRM_API_TOKEN = "SHANG_HAI_CRM_API_TOKEN"
+)
+
 const (
 	//专项调研背景图片
 	//ACTIVITY_ZXDY_ImgUrl1 = "https://hzstatic.hzinsights.com/static/temp/20220427202204/20220427/b2Bj3fGakP16iJRFKisQohCWnCNl.png"