package services import ( "context" "encoding/json" "fmt" "github.com/tealeg/xlsx" "hongze/hongze_cygx/models" "hongze/hongze_cygx/utils" "io/ioutil" "net/http" "os" "path/filepath" "strconv" "strings" "time" ) type GetShangHaiTokenResultApi struct { Code int `json:"code"` Msg string `json:"msg"` Time int `json:"time"` Data ShangHaiResultApidate `json:"data"` } type ShangHaiResultApidate struct { AccessToken string `json:"access_token"` ExpireIn int `json:"expire_in"` } type GetShangHaiTokenResultApiComPany struct { Code int `json:"code"` Msg string `json:"msg"` Time int `json:"time"` Data FailInfos `json:"data"` } type FailInfos struct { TotalCount int `json:"total_count"` FailInfo []ShangHaiResultApidateComPany `json:"fail_info"` } type ShangHaiResultApidateComPany struct { ErrVal string `json:"errVal"` ErrMsg string `json:"errMsg"` } //c func SendComapnyToShanghai(url, jsonCompany, postType string) (err error) { var msg string defer func() { if err != nil { go utils.SendAlarmMsg(msg, 1) go utils.SendEmail("同步策略平台获取数据信息失败"+"【"+utils.APPNAME+"】"+time.Now().Format("2006-01-02 15:04:05"), msg+";Err:"+err.Error(), utils.EmailSendToExpert) } }() method := "POST" payload := strings.NewReader(jsonCompany) client := &http.Client{} req, err := http.NewRequest(method, url, payload) if err != nil { msg = "NewRequest Err:" + err.Error() return err } req.Header.Add("Content-Type", "application/json") res, err := client.Do(req) if err != nil { msg = "client.Do Err:" + err.Error() return err } defer res.Body.Close() body, err := ioutil.ReadAll(res.Body) if err != nil { msg = "ioutil.ReadAll Err:" + err.Error() return err } var result GetShangHaiTokenResultApiComPany err = json.Unmarshal(body, &result) if err != nil { msg = "json.Unmarshal Err:" + err.Error() return err } item := new(models.CygxShanghaiCompanyLog) item.CreateTime = time.Now() item.Url = url item.Body = jsonCompany item.Result = string(body) go models.AddCygxShanghaiCompanyLog(item) for _, v := range result.Data.FailInfo { if v.ErrMsg != "" { //companyCode += "'" + v.ErrVal + "'," item := new(models.CygxShanghaiErrLog) item.CreateTime = time.Now() item.ErrMsg = v.ErrMsg item.ErrVal = v.ErrVal item.ErrType = postType go models.AddCygxShanghaiErrLog(item) } } return } func DotongbuShangHai(cont context.Context) (err error) { var condition string updateTime := time.Now().Add(-time.Minute * 22).Format("2006-01-02 15:04:05") listUpdateUser, err := models.GetWxUserOpLog(updateTime) if err != nil && err.Error() != utils.ErrNoRow() { return err } var companyIds string if len(listUpdateUser) > 0 { for _, v := range listUpdateUser { companyIds += strconv.Itoa(v.CompanyId) + "," } } condition = ` AND p.modify_time > ` + "'" + updateTime + "'" //偶尔需要单独同步某一个公司的人员 //condition = ` AND c.company_id = 8284 ` //同30小时有变更的公司 go DotongbuShangHaApi(condition) //原有的公司如果新增了也同步 companyIds = strings.TrimRight(companyIds, ",") if companyIds != "" { condition = ` AND c.company_id IN (` + companyIds + ")" go DotongbuShangHaApi(condition) } return } //func DotongbuShangHai(cont context.Context) (err error) { func DotongbuShangHaApi(condition string) (err error) { var msg string defer func() { if err != nil { 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) 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 { msg = "GetSendCompanyList Err:" + err.Error() return } fmt.Println("权益客户", len(companyList)) var companyItems []*models.CompanyJson if len(companyList) > 0 { url = "https://crm.hzinsights.com/openapi/v1/Customer/batchSyncFiccCustomer?access_token=" + accessToken for k, _ := range companyList { companyList[k].Fe = "权益" companyList[k].EndDate = strconv.Itoa(int(companyList[k].EndDateTime.Unix())) //一次同步一百条 companyItems = append(companyItems, companyList[k]) if (k+1)%100 == 0 { data, err := json.Marshal(companyItems) if err != nil { msg = "companyItems Err:" + err.Error() return err } jsonstr := string(data) jsonstr = "{\"sync_data\": " + jsonstr + " }" SendComapnyToShanghai(url, jsonstr, "权益") companyItems = make([]*models.CompanyJson, 0) } } //如果剩下还有则同步剩下的部分 if len(companyItems) > 0 { data, err := json.Marshal(companyItems) if err != nil { msg = "companyItems Err:" + err.Error() return err } jsonstr := string(data) jsonstr = "{\"sync_data\": " + jsonstr + " }" SendComapnyToShanghai(url, jsonstr, "权益") companyItems = make([]*models.CompanyJson, 0) } } //同步FICC客户 companyFiccList, err := models.GetSendCompanyFiccList(condition) if err != nil { msg = "GetSendCompanyFiccList Err:" + err.Error() return err } 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 for k, _ := range companyFiccList { companyFiccList[k].Fe = "FICC" companyFiccList[k].EndDate = strconv.Itoa(int(companyFiccList[k].EndDateTime.Unix())) //一次同步一百条 companyFiccItems = append(companyFiccItems, companyFiccList[k]) if (k+1)%100 == 0 { data, err := json.Marshal(companyFiccItems) if err != nil { msg = "companyFiccItems Err:" + err.Error() return err } jsonstr := string(data) jsonstr = "{\"sync_data\": " + jsonstr + " }" SendComapnyToShanghai(url, jsonstr, "FICC") companyFiccItems = make([]*models.CompanyJson, 0) } } //如果剩下还有则同步剩下的部分 if len(companyFiccItems) > 0 { data, err := json.Marshal(companyFiccItems) if err != nil { msg = "companyFiccItems Err:" + err.Error() return err } jsonstr := string(data) jsonstr = "{\"sync_data\": " + jsonstr + " }" SendComapnyToShanghai(url, jsonstr, "FICC") } } userList, err := models.GetSendUserList(condition) if err != nil { msg = "GetSendUserList Err:" + err.Error() return err } fmt.Println("用户", len(userList)) var userItems []*models.UserJson if len(userList) > 0 { url = "https://crm.hzinsights.com/openapi/v1/CustomerContact/batchSyncFiccCustomerContact?access_token=" + accessToken for k, v := range userList { if v.Sex == "1" { userList[k].Sex = "男" } else { userList[k].Sex = "女" } if v.IsMaker == "1" { userList[k].IsMaker = "是" } else { userList[k].IsMaker = "否" } userList[k].CountryCode = "+" + v.CountryCode userList[k].OutboundCountryCode = "+" + v.OutboundCountryCode if userList[k].Mobile != "" && userList[k].OutboundMobile != "" && userList[k].Mobile == userList[k].OutboundMobile { userList[k].OutboundMobile = "" userList[k].OutboundCountryCode = "" } //一次同步一百条 userItems = append(userItems, userList[k]) if (k+1)%100 == 0 { data, err := json.Marshal(userItems) if err != nil { msg = "userItems Err:" + err.Error() return err } fmt.Println(k) jsonstr := string(data) jsonstr = "{\"sync_data\": " + jsonstr + " }" SendComapnyToShanghai(url, jsonstr, "user") userItems = make([]*models.UserJson, 0) } } //如果剩下还有则同步剩下的部分 if len(userItems) > 0 { data, err := json.Marshal(userItems) if err != nil { msg = "userItems Err:" + err.Error() return err } jsonstr := string(data) jsonstr = "{\"sync_data\": " + jsonstr + " }" SendComapnyToShanghai(url, jsonstr, "user") companyItems = make([]*models.CompanyJson, 0) } } return } func DotongbuShangHaiSendEmail(cont context.Context) (err error) { var msg string defer func() { if err != nil { go utils.SendAlarmMsg("发送邮件:同步用户到策略平台信息失败", 2) go utils.SendEmail("发送邮件:同步用户到策略平台信息失败"+"【"+utils.APPNAME+"】"+time.Now().Format("2006-01-02 15:04:05"), msg+";Err:"+err.Error(), utils.EmailSendToExpert) } }() list, err := models.GetCygxShanghaiCompanyLog() if err != nil { msg = "GetCygxShanghaiCompanyLog Err:" + err.Error() return err } mapErrMsg := make(map[string]string) for _, v := range list { data := new(GetShangHaiTokenResultApiComPany) err := json.Unmarshal([]byte(v.Result), &data) if err != nil { msg = "GetShangHaiTokenResultApiComPany Err:" + err.Error() return err } if len(data.Data.FailInfo) > 0 { for _, vCompany := range data.Data.FailInfo { mapErrMsg[vCompany.ErrVal] = vCompany.ErrMsg } } } //创建excel dir, err := os.Executable() exPath := filepath.Dir(dir) downLoadnFilePath := exPath + "/" + time.Now().Format(utils.FormatDateTimeUnSpace) + utils.GetRandDigit(5) + ".xlsx" xlsxFile := xlsx.NewFile() if err != nil { return } style := xlsx.NewStyle() alignment := xlsx.Alignment{ Horizontal: "center", Vertical: "center", WrapText: true, } style.Alignment = alignment style.ApplyAlignment = true sheet, err := xlsxFile.AddSheet("上海策略品台同步名单") if err != nil { return } //设置宽度 _ = sheet.SetColWidth(0, 1, 30) _ = sheet.SetColWidth(2, 2, 10) _ = sheet.SetColWidth(3, 3, 30) //标头 rowTitle := sheet.AddRow() cellA := rowTitle.AddCell() cellA.Value = "客户名称" cellB := rowTitle.AddCell() cellB.Value = "社会信用码" cellC := rowTitle.AddCell() cellC.Value = "客户类型" cellD := rowTitle.AddCell() cellD.Value = "错误消息" for _, v := range list { data := new(models.CompanyUnJsonList) err := json.Unmarshal([]byte(v.Body), &data) if err != nil { msg = "CompanyUnJsonList Err:" + err.Error() return err } if len(data.SyncData) > 0 { for _, item := range data.SyncData { row := sheet.AddRow() cellA := row.AddCell() cellA.Value = item.CompanyName cellB := row.AddCell() cellB.Value = item.CreditCode cellC := row.AddCell() cellC.Value = item.Fe if mapErrMsg[item.CreditCode] != "" { cellD := row.AddCell() cellD.Value = mapErrMsg[item.CreditCode] } } } } title := time.Now().Format(utils.FormatDate) + "上海策略品台同步名单" content := time.Now().Format(utils.FormatDate) + "上海策略品台同步名单" fileName := downLoadnFilePath err = xlsxFile.Save(downLoadnFilePath) if err != nil { return } if len(list) > 0 { utils.SendEmailByHongze(title, content, "cxzhang@hzinsights.com;tshen@hzinsights.com", fileName, title+".xlsx") } os.Remove(downLoadnFilePath) go models.DeleteCygxShanghaiCompanyLog() return }