Browse Source

Merge branch 'aj_overseas_custorm'

hongze 1 year ago
parent
commit
7097bc3e2e

+ 20 - 1
controllers/company.go

@@ -2845,6 +2845,9 @@ func (this *CompanyController) Add() {
 	item.Enabled = 1
 	item.RegionType = req.RegionType
 	item.Remark = req.Reasons
+	item.Nation = req.Nation
+	item.OverseasStatus = "试用"
+	item.ResetBtn = 1
 	companyId, err := company.AddCompany(item)
 	if err != nil {
 		br.Msg = "新增失败"
@@ -2899,6 +2902,10 @@ func (this *CompanyController) Add() {
 	companyProduct.OpenCode = services.GenerateOpenCompanyProductCode(int(companyId), productId)
 	companyProduct.TodoStatus = "无任务"
 	companyProduct.TryStage = 1
+	companyProduct.OverseasLabel = 1
+	if seller.Mobile == "13065778668" {
+		companyProduct.IsOverseas = 1
+	}
 	companyProductId, err := company.AddCompanyProduct(companyProduct)
 	if err != nil {
 		br.Msg = "新增失败"
@@ -4093,6 +4100,7 @@ func (this *CompanyController) Edit() {
 	companyItem.Address = req.Province + req.City
 	companyItem.LastUpdatedTime = time.Now()
 	companyItem.Enabled = 1
+	companyItem.Nation = req.Nation
 	err = company.ModifyCompany(companyItem)
 	if err != nil {
 		br.Msg = "修改客户信息失败"
@@ -8756,8 +8764,19 @@ func (this *CompanyController) RoadShowList() {
 	}
 
 	companyId := this.GetString("CompanyId")
+
+	companyIdInt, _ := strconv.Atoi(companyId)
+	if companyIdInt <= 0 {
+		br.Msg = "参数错误"
+		return
+	}
+	var englishCompany int
+	if companyIdInt > utils.EnCompanyIdStep {
+		companyIdInt = companyIdInt - utils.EnCompanyIdStep
+		englishCompany = 1
+	}
 	var err error
-	roadShowList, err := company.GetRoadShowList(companyId)
+	roadShowList, err := company.GetRoadShowList(companyIdInt, englishCompany)
 	if err != nil {
 		br.Msg = "获取失败"
 		br.ErrMsg = "获取失败,Err:" + err.Error()

+ 96 - 0
controllers/company_user.go

@@ -3125,7 +3125,9 @@ func (this *CompanyUserController) ViewReportList() {
 	if pageSize <= 0 {
 		pageSize = utils.PageSize20
 	}
+	if userId > 0 {
 
+	}
 	item, err := models.GetWxUserByUserId(userId)
 	if err != nil {
 		br.Msg = "获取失败"
@@ -6259,3 +6261,97 @@ func (this *CompanyUserController) UpadteUserYanxuanPermission() {
 	br.Success = true
 	br.Msg = "操作成功"
 }
+
+// ListByReport
+// @Title 联系人列表
+// @Description 联系人列表接口
+// @Param   PageSize   query   int  true       "每页数据条数"
+// @Param   CurrentIndex   query   int  true       "当前页页码,从1开始"
+// @Param   CompanyId   query   int  true       "公司id,必填"
+// @Param   SortParam	query	int	false	"排序字段:1-点击量;2-点击时间"
+// @Param   SortType	query	int	false	"排序方式:1-倒序;2-正序"
+// @Success 200 {object} company.CompanyUserListResp
+// @router /user/listByReport [get]
+func (this *CompanyUserController) ListByReport() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	sysUser := this.SysUser
+	if sysUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser Is Empty"
+		br.Ret = 408
+		return
+	}
+	pageSize, _ := this.GetInt("PageSize")
+	currentIndex, _ := this.GetInt("CurrentIndex")
+	companyId, _ := this.GetInt("CompanyId")
+
+	sortParam, _ := this.GetInt("SortParam", 2)
+	sortType, _ := this.GetInt("SortType", 1)
+
+	if companyId <= 0 {
+		br.Msg = "请选择客户"
+		br.ErrMsg = "客户参数错误"
+		return
+	}
+	var startSize int
+	if pageSize <= 0 {
+		pageSize = utils.PageSize20
+	}
+	if currentIndex <= 0 {
+		currentIndex = 1
+	}
+	startSize = paging.StartIndex(currentIndex, pageSize)
+
+	var order string
+	sortArr := []int{1, 2}
+	if utils.InArrayByInt(sortArr, sortParam) && utils.InArrayByInt(sortArr, sortType) {
+		pMap := map[int]string{1: "ficc_view_total", 2: "ficc_last_view_time"}
+		tMap := map[int]string{1: "DESC", 2: "ASC"}
+		order = fmt.Sprintf(` ORDER BY %s %s`, pMap[sortParam], tMap[sortType])
+	}
+
+	total, err := company.GetCompanyUserListByReportCount(companyId)
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取数据总数失败,Err:" + err.Error()
+		return
+	}
+
+	list, err := company.GetCompanyUserListByReport(companyId, startSize, pageSize, order)
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取数据失败,Err:" + err.Error()
+		return
+	}
+
+	respList := make([]*company.CompanyViewResp, 0)
+	for i := range list {
+		v := &company.CompanyViewResp{
+			UserId:       int(list[i].UserId),
+			UserName:     list[i].RealName,
+			Mobile:       list[i].Mobile,
+			Email:        list[i].Email,
+			ViewTotal:    list[i].FiccViewTotal,
+			LastViewTime: list[i].FiccLastViewTime.Format(utils.FormatDateTime),
+		}
+		if v.LastViewTime == "0001-01-01 00:00:00" {
+			v.LastViewTime = ""
+		}
+		respList = append(respList, v)
+	}
+
+	page := paging.GetPaging(currentIndex, pageSize, total)
+	resp := &company.CompanyViewPageListResp{
+		Paging: page,
+		List:   respList,
+	}
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = resp
+}

+ 8 - 0
controllers/english_report/english_company.go

@@ -293,6 +293,14 @@ func (this *EnglishCompanyController) Save() {
 		item.ModifyTime = nowTime
 		item.Status = 1
 		item.Enabled = 1
+		if req.Country != "" && req.Nation == "" {
+			item.Nation = req.Country
+		} else {
+			item.Nation = req.Nation
+		}
+		item.OverseasLabel = 1
+		item.OverseasStatus = "试用"
+		item.ResetBtn = 1
 		if e = item.Create(); e != nil {
 			br.Msg = "保存失败"
 			br.ErrMsg = "新增英文客户失败, Err:" + e.Error()

+ 637 - 0
controllers/overseas_custom/custom.go

@@ -0,0 +1,637 @@
+package overseas_custom
+
+import (
+	"encoding/json"
+	"fmt"
+	"github.com/rdlucklib/rdluck_tools/paging"
+	"hongze/hz_crm_api/models"
+	"hongze/hz_crm_api/models/overseas_custom"
+	"hongze/hz_crm_api/utils"
+	"time"
+)
+
+// @Title 获取海外客户列表数据
+// @Description 获取海外客户列表数据
+// @Param   PageSize   query   int  true       "每页数据条数"
+// @Param   CurrentIndex   query   int  true       "当前页页码,从1开始"
+// @Param   Keywords	query	string	false	"关键词:客户名称/社会信用码/联系人手机号/邮箱"
+// @Param   CompanyStatus	query	string	false	"状态:全部,正式,试用,关闭"
+// @Param   SellerId	query	int		false	"销售ID"
+// @Param   CustomType	query	int		false	"1:海外客户,2:隐藏客户"
+// @Param   SortField	query	string		false	"排序字段:ViewTotal,RoadShowTotal,CreateTime"
+// @Param   SortDesc	query	int		false	"1:降序,默认,2:升序"
+// @Param   OverseasLabel	query	int		false	"海外客户试用子标签:1未分类、2  推进、3 跟踪、4 预备、"
+// @Success 200 {object} models.EnglishCompanyPageListResp
+// @router /custom/list [get]
+func (this *OverseasCustomController) CustomList() {
+	br := new(models.BaseResponse).Init()
+	br.IsSendEmail = false
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+
+	sysUser := this.SysUser
+	if sysUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser Is Empty"
+		br.Ret = 408
+		return
+	}
+
+	pageSize, _ := this.GetInt("PageSize")
+	currentIndex, _ := this.GetInt("CurrentIndex")
+	keywords := this.GetString("Keywords", "")
+	sellerId, _ := this.GetInt("SellerId", 0)
+	companyStatus := this.GetString("CompanyStatus")
+	sortField := this.GetString("SortField")
+	sortDesc, _ := this.GetInt("SortDesc")
+	overseasLabel, _ := this.GetInt("OverseasLabel", 0)
+	customType, _ := this.GetInt("CustomType", 0)
+
+	var startSize int
+	if pageSize <= 0 {
+		pageSize = utils.PageSize20
+	}
+	if currentIndex <= 0 {
+		currentIndex = 1
+	}
+	startSize = paging.StartIndex(currentIndex, pageSize)
+
+	page := paging.GetPaging(currentIndex, pageSize, 0)
+
+	resp := new(overseas_custom.CustomListResp)
+
+	obj := new(overseas_custom.Custom)
+
+	var condition string
+	var pars []interface{}
+	if keywords != "" {
+		k := "%" + keywords + "%"
+		enCompanyIds, e := overseas_custom.GetEnCompanyIdsByKeyword(k)
+		if e != nil {
+			br.Msg = "获取失败"
+			br.ErrMsg = "关键词获取英文客户IDs失败, Err: " + e.Error()
+			return
+		}
+
+		//获取中文客户
+
+		companyIds, err := obj.GetCompanyIdsByKeyword(k)
+		if err != nil {
+			br.Msg = "获取失败"
+			br.ErrMsg = "关键词获取客户IDs失败, Err: " + err.Error()
+			return
+		}
+
+		companyIds = append(companyIds, enCompanyIds...)
+
+		if len(companyIds) > 0 {
+			condition += fmt.Sprintf(` AND m.company_id IN (%s) `, utils.GetOrmInReplace(len(companyIds)))
+			pars = append(pars, companyIds)
+		}
+
+		if len(companyIds) <= 0 {
+			list := make([]*overseas_custom.Custom, 0)
+			resp.Paging = page
+			resp.List = list
+			br.Ret = 200
+			br.Success = true
+			br.Msg = "获取成功"
+			br.Data = resp
+			return
+		}
+	}
+	if sellerId > 0 {
+		condition += ` AND m.seller_id=? `
+		pars = append(pars, sellerId)
+	}
+
+	if overseasLabel > 0 {
+		condition += ` AND m.overseas_label=? `
+		pars = append(pars, overseasLabel)
+	}
+
+	if customType == 2 {
+		condition += ` AND m.is_hide=? `
+		pars = append(pars, 1)
+	} else {
+		condition += ` AND m.is_hide=? `
+		pars = append(pars, 0)
+	}
+
+	if companyStatus == "试用" {
+		condition += ` AND m.overseas_status='试用'`
+	} else if companyStatus == "正式" {
+		condition += ` AND m.overseas_status='正式' `
+	} else if companyStatus == "关闭" {
+		condition += ` AND m.overseas_status='关闭' `
+	}
+
+	total, err := obj.GetCustomListCount(condition, pars, companyStatus)
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取数据总数失败, Err: " + err.Error()
+		return
+	}
+
+	list, err := obj.GetCustomList(condition, pars, companyStatus, sortField, startSize, pageSize, sortDesc)
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取数据失败, Err: " + err.Error()
+		return
+	}
+
+	for _, v := range list {
+		if v.Source == 1 && v.OverseasStatus != "" {
+			v.CompanyStatus = v.OverseasStatus
+		}
+	}
+	page = paging.GetPaging(currentIndex, pageSize, total)
+	resp.Paging = page
+	resp.List = list
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = resp
+}
+
+// @Title 客户隐藏
+// @Description 客户隐藏
+// @Param	request  body  overseas_custom.CustomHideReq  true  "type json string"
+// @Success 200 string "操作成功"
+// @router /custom/hide [post]
+func (this *OverseasCustomController) CustomHide() {
+	br := new(models.BaseResponse).Init()
+	br.IsSendEmail = false
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	sysUser := this.SysUser
+	if sysUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser Is Empty"
+		br.Ret = 408
+		return
+	}
+
+	var req overseas_custom.CustomHideReq
+	if err := json.Unmarshal(this.Ctx.Input.RequestBody, &req); err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+
+	if req.CompanyId <= 0 {
+		br.Msg = "参数错误!"
+		return
+	}
+
+	//if req.CompanyId > utils.EnCompanyIdStep {
+	//	req.CompanyId = req.CompanyId - utils.EnCompanyIdStep
+	//}
+
+	obj := new(overseas_custom.Custom)
+	item, err := obj.GetCustomByCompanyId(req.CompanyId)
+	if err != nil {
+		if err.Error() == utils.ErrNoRow() {
+			br.Msg = "隐藏失败,客户信息不存在!"
+			br.ErrMsg = "隐藏失败,Err:" + err.Error()
+			return
+		}
+		br.Msg = "隐藏失败!"
+		br.ErrMsg = "隐藏失败,Err:" + err.Error()
+		return
+	}
+	//是否隐藏:0:不隐藏,1:隐藏
+	var isHide int
+	if item.IsHide == 1 {
+		isHide = 0
+	} else {
+		isHide = 1
+	}
+
+	if req.CompanyId > 1000000 {
+		enCompanyObj := new(models.EnglishCompany)
+		// 更新客户
+		nowTime := time.Now().Local()
+		enCompanyObj.CompanyId = req.CompanyId - utils.EnCompanyIdStep
+		enCompanyObj.IsHide = isHide
+		enCompanyObj.ModifyTime = nowTime
+		updateCols := []string{"IsHide", "ModifyTime"}
+		if err = enCompanyObj.Update(updateCols); err != nil {
+			br.Msg = "隐藏失败"
+			br.ErrMsg = "更新英文客户隐藏状态失败, Err:" + err.Error()
+			return
+		}
+	} else {
+		obj := new(overseas_custom.Custom)
+
+		updateParams := make(map[string]interface{})
+		updateParams["is_hide"] = isHide
+		updateParams["modify_time"] = time.Now()
+
+		whereParam := make(map[string]interface{})
+		whereParam["company_id"] = req.CompanyId
+
+		err := obj.UpdateCompany(updateParams, whereParam)
+		if err != nil {
+			br.Msg = "设置失败"
+			br.ErrMsg = "设置客户标签状态失败, Err:" + err.Error()
+			return
+		}
+	}
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "隐藏成功"
+}
+
+// @Title 客户状态设置
+// @Description 客户状态设置
+// @Param	request  body  overseas_custom.CustomHideReq  true  "type json string"
+// @Success 200 string "操作成功"
+// @router /custom/status_set [post]
+func (this *OverseasCustomController) CustomStatusSet() {
+	br := new(models.BaseResponse).Init()
+	br.IsSendEmail = false
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	sysUser := this.SysUser
+	if sysUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser Is Empty"
+		br.Ret = 408
+		return
+	}
+
+	var req overseas_custom.CustomHideReq
+	if err := json.Unmarshal(this.Ctx.Input.RequestBody, &req); err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+
+	if req.CompanyId <= 0 {
+		br.Msg = "参数错误!"
+		return
+	}
+
+	obj := new(overseas_custom.Custom)
+	item, err := obj.GetCustomByCompanyId(req.CompanyId)
+	if err != nil {
+		br.Msg = "设置失败!"
+		br.ErrMsg = "设置失败,Err:" + err.Error()
+		return
+	}
+	//是否隐藏:0:不隐藏,1:隐藏
+	var overseasStatus string
+	var resetBtn int
+
+	if item.OverseasStatus == "正式" && item.ResetBtn == 2 { //重置,获取当前客户的状态
+		overseasStatus = item.CompanyStatus
+		resetBtn = 1
+	} else if item.OverseasStatus == "试用" && (item.ResetBtn == 1 || item.ResetBtn == 0) { //转正式,获取当前客户的状态
+		overseasStatus = "正式"
+		resetBtn = 2
+	}
+
+	if req.CompanyId > 1000000 {
+		enCompanyObj := new(models.EnglishCompany)
+		// 更新客户
+		nowTime := time.Now().Local()
+		enCompanyObj.CompanyId = req.CompanyId - utils.EnCompanyIdStep
+		enCompanyObj.OverseasStatus = overseasStatus
+		enCompanyObj.ModifyTime = nowTime
+		enCompanyObj.ResetBtn = resetBtn
+		updateCols := []string{"OverseasStatus", "ResetBtn", "ModifyTime"}
+		if err = enCompanyObj.Update(updateCols); err != nil {
+			br.Msg = "设置失败"
+			br.ErrMsg = "更新英文客户转正式状态失败, Err:" + err.Error()
+			return
+		}
+	} else {
+		obj := new(overseas_custom.Custom)
+
+		updateParams := make(map[string]interface{})
+		updateParams["overseas_status"] = overseasStatus
+		updateParams["reset_btn"] = resetBtn
+		updateParams["modify_time"] = time.Now()
+
+		whereParam := make(map[string]interface{})
+		whereParam["company_id"] = req.CompanyId
+
+		err := obj.UpdateCompany(updateParams, whereParam)
+		if err != nil {
+			br.Msg = "设置失败"
+			br.ErrMsg = "设置客户标签状态失败, Err:" + err.Error()
+			return
+		}
+	}
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "操作成功"
+}
+
+// @Title 客户子标签设置
+// @Description 客户子标签设置
+// @Param	request  body  overseas_custom.CustomOverseasLabelSetReq  true  "type json string"
+// @Success 200 string "操作成功"
+// @router /custom/overseas_label_set [post]
+func (this *OverseasCustomController) CustomOverseasLabelSet() {
+	br := new(models.BaseResponse).Init()
+	br.IsSendEmail = false
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	//海外客户试用子标签:1未分类、2  推进、3 跟踪、4 预备、
+	sysUser := this.SysUser
+	if sysUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser Is Empty"
+		br.Ret = 408
+		return
+	}
+
+	var req overseas_custom.CustomOverseasLabelSetReq
+	if err := json.Unmarshal(this.Ctx.Input.RequestBody, &req); err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+
+	if req.CompanyId <= 0 {
+		br.Msg = "参数错误!"
+		return
+	}
+
+	nowTime := time.Now().Local()
+	if req.CompanyId > 1000000 {
+		enCompanyObj := new(models.EnglishCompany)
+		// 更新客户
+		enCompanyObj.CompanyId = req.CompanyId - utils.EnCompanyIdStep
+		enCompanyObj.OverseasLabel = req.OverseasLabel
+		enCompanyObj.ModifyTime = nowTime
+		updateCols := []string{"OverseasLabel", "ModifyTime"}
+		if err := enCompanyObj.Update(updateCols); err != nil {
+			br.Msg = "设置失败"
+			br.ErrMsg = "设置英文客户标签状态失败, Err:" + err.Error()
+			return
+		}
+	} else {
+		obj := new(overseas_custom.Custom)
+
+		updateParams := make(map[string]interface{})
+		updateParams["overseas_label"] = req.OverseasLabel
+		updateParams["modify_time"] = time.Now()
+
+		whereParam := make(map[string]interface{})
+		whereParam["company_id"] = req.CompanyId
+		whereParam["product_id"] = 1
+
+		err := obj.UpdateCompanyProduct(updateParams, whereParam)
+		if err != nil {
+			br.Msg = "设置失败"
+			br.ErrMsg = "设置客户标签状态失败, Err:" + err.Error()
+			return
+		}
+	}
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "设置成功"
+}
+
+// @Title 海外客户统计数据
+// @Description 海外客户统计数据
+// @Param   Keywords	query	string	false	"关键词:客户名称/社会信用码/联系人手机号/邮箱"
+// @Param   SellerId	query	int		false	"销售ID"
+// @Success 200 {object} models.EnglishCompanyPageListResp
+// @router /custom/statistics [get]
+func (this *OverseasCustomController) CustomStatistics() {
+	br := new(models.BaseResponse).Init()
+	br.IsSendEmail = false
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	sysUser := this.SysUser
+	if sysUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser Is Empty"
+		br.Ret = 408
+		return
+	}
+
+	keywords := this.GetString("Keywords", "")
+	sellerId, _ := this.GetInt("SellerId", 0)
+	customType, _ := this.GetInt("CustomType", 0)
+
+	obj := new(overseas_custom.Custom)
+
+	var condition string
+	var pars []interface{}
+	if keywords != "" {
+		k := "%" + keywords + "%"
+		enCompanyIds, e := overseas_custom.GetEnCompanyIdsByKeyword(k)
+		if e != nil {
+			br.Msg = "获取失败"
+			br.ErrMsg = "关键词获取英文客户IDs失败, Err: " + e.Error()
+			return
+		}
+
+		//获取中文客户
+
+		companyIds, err := obj.GetCompanyIdsByKeyword(k)
+		if err != nil {
+			br.Msg = "获取失败"
+			br.ErrMsg = "关键词获取客户IDs失败, Err: " + err.Error()
+			return
+		}
+
+		companyIds = append(companyIds, enCompanyIds...)
+
+		if len(companyIds) > 0 {
+			condition += fmt.Sprintf(` AND m.company_id IN (%s) `, utils.GetOrmInReplace(len(companyIds)))
+			pars = append(pars, companyIds)
+		} else {
+			statisticsDataStatusList := make([]*overseas_custom.CustomTotal, 0)
+
+			var statusArr = [3]string{"试用", "正式", "关闭"}
+
+			for _, v := range statusArr {
+				item := new(overseas_custom.CustomTotal)
+				item.CompanyStatus = v
+				statisticsDataStatusList = append(statisticsDataStatusList, item)
+			}
+
+			br.Ret = 200
+			br.Success = true
+			br.Msg = "获取成功"
+			br.Data = statisticsDataStatusList
+			return
+		}
+	}
+	if sellerId > 0 {
+		condition += ` AND m.seller_id=? `
+		pars = append(pars, sellerId)
+	}
+
+	if customType == 2 {
+		condition += ` AND m.is_hide=? `
+		pars = append(pars, 1)
+	} else {
+		condition += ` AND m.is_hide=? `
+		pars = append(pars, 0)
+	}
+
+	list, err := obj.GetCustomTotal(condition, pars)
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取各状态总数失败, Err: " + err.Error()
+		return
+	}
+
+	//total, err := obj.GetCustomOverseasStatusTotal(condition, pars)
+	//if err != nil && err.Error() != utils.ErrNoRow() {
+	//	br.Msg = "获取失败"
+	//	br.ErrMsg = "获取海外客户总计状态失败, Err: " + err.Error()
+	//	return
+	//}
+	statisticsDataStatusList := make([]*overseas_custom.CustomTotal, 0)
+	statisticsDataMap := make(map[string]int)
+	for _, v := range list {
+		statisticsDataMap[v.CompanyStatus] = v.Total
+	}
+
+	var statusArr = [3]string{"试用", "正式", "关闭"}
+
+	for _, v := range statusArr {
+		item := new(overseas_custom.CustomTotal)
+		item.CompanyStatus = v
+		if val, ok := statisticsDataMap[v]; ok {
+			item.Total = val
+		}
+		statisticsDataStatusList = append(statisticsDataStatusList, item)
+	}
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = statisticsDataStatusList
+}
+
+// @Title 海外客户标签统计数据
+// @Description 海外客户标签统计数据
+// @Param   Keywords	query	string	false	"关键词:客户名称/社会信用码/联系人手机号/邮箱"
+// @Param   SellerId	query	int		false	"销售ID"
+// @Success 200 {object} models.EnglishCompanyPageListResp
+// @router /custom/label/statistics [get]
+func (this *OverseasCustomController) CustomLabelStatistics() {
+	br := new(models.BaseResponse).Init()
+	br.IsSendEmail = false
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	sysUser := this.SysUser
+	if sysUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser Is Empty"
+		br.Ret = 408
+		return
+	}
+
+	keywords := this.GetString("Keywords", "")
+	sellerId, _ := this.GetInt("SellerId", 0)
+	customType, _ := this.GetInt("CustomType", 0)
+
+	obj := new(overseas_custom.Custom)
+
+	var condition string
+	var pars []interface{}
+
+	condition += " AND m.overseas_status='试用' "
+	if keywords != "" {
+		k := "%" + keywords + "%"
+		enCompanyIds, e := overseas_custom.GetEnCompanyIdsByKeyword(k)
+		if e != nil {
+			br.Msg = "获取失败"
+			br.ErrMsg = "关键词获取英文客户IDs失败, Err: " + e.Error()
+			return
+		}
+
+		//获取中文客户
+
+		companyIds, err := obj.GetCompanyIdsByKeyword(k)
+		if err != nil {
+			br.Msg = "获取失败"
+			br.ErrMsg = "关键词获取客户IDs失败, Err: " + err.Error()
+			return
+		}
+
+		companyIds = append(companyIds, enCompanyIds...)
+
+		if len(companyIds) > 0 {
+			condition += fmt.Sprintf(` AND m.company_id IN (%s) `, utils.GetOrmInReplace(len(companyIds)))
+			pars = append(pars, companyIds)
+		} else {
+			var labelArr = [4]int{1, 2, 3, 4}
+			labelList := make([]*overseas_custom.OverseasLabelTotal, 0)
+			for _, v := range labelArr {
+				item := new(overseas_custom.OverseasLabelTotal)
+				item.OverseasLabel = v
+				labelList = append(labelList, item)
+			}
+			br.Ret = 200
+			br.Success = true
+			br.Msg = "获取成功"
+			br.Data = labelList
+			return
+		}
+	}
+	if sellerId > 0 {
+		condition += ` AND m.seller_id=? `
+		pars = append(pars, sellerId)
+	}
+
+	if customType == 2 {
+		condition += ` AND m.is_hide=? `
+		pars = append(pars, 1)
+	} else {
+		condition += ` AND m.is_hide=? `
+		pars = append(pars, 0)
+	}
+
+	overseasLabelDataList, err := obj.GetCustomOverseasLabelTotal(condition, pars)
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取子标签总数失败, Err: " + err.Error()
+		return
+	}
+
+	labelDataMap := make(map[int]int)
+	for _, v := range overseasLabelDataList {
+		labelDataMap[v.OverseasLabel] = v.Total
+	}
+
+	var labelArr = [4]int{1, 2, 3, 4}
+
+	labelList := make([]*overseas_custom.OverseasLabelTotal, 0)
+
+	for _, v := range labelArr {
+		item := new(overseas_custom.OverseasLabelTotal)
+		item.OverseasLabel = v
+		if val, ok := labelDataMap[v]; ok {
+			item.Total = val
+		}
+		labelList = append(labelList, item)
+	}
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = labelList
+}

+ 152 - 0
controllers/overseas_custom/sale.go

@@ -0,0 +1,152 @@
+package overseas_custom
+
+import (
+	"encoding/json"
+	"hongze/hz_crm_api/controllers"
+	"hongze/hz_crm_api/models"
+	"hongze/hz_crm_api/models/overseas_custom"
+	"hongze/hz_crm_api/utils"
+	"time"
+)
+
+// 海外客户
+
+type OverseasCustomController struct {
+	controllers.BaseAuthController
+}
+
+// @Title 保存销售
+// @Description 保存销售
+// @Param	request  body  overseas_custom.OverseasCustomerSaleSaveReq  true  "type json string"
+// @Success Ret=200 操作成功
+// @router /sale/save [post]
+func (this *OverseasCustomController) SaleSave() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+
+	sysUser := this.SysUser
+	if sysUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser Is Empty"
+		br.Ret = 408
+		return
+	}
+
+	var req overseas_custom.OverseasCustomerSaleSaveReq
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+
+	if len(req.AddSellerIdArr) <= 0 && len(req.DelSellerIdArr) <= 0 {
+		br.Msg = "参数错误!"
+		return
+	}
+	obj := new(overseas_custom.OverseasCustomerSale)
+	list, err := obj.GetOverseasCustomerSaleAll()
+	if err != nil && err.Error() != utils.ErrNoRow() {
+		br.Msg = "保存失败!"
+		br.ErrMsg = "保存失败,GetOverseasCustomerSaleAll,Err:" + err.Error()
+		return
+	}
+
+	existMap := make(map[int]string)
+	for _, v := range list {
+		existMap[v.SellerId] = v.RealName
+	}
+	if len(req.AddSellerIdArr) > 0 {
+		for _, v := range req.AddSellerIdArr {
+			if _, ok := existMap[v]; !ok {
+				item := new(overseas_custom.OverseasCustomerSale)
+				item.SellerId = v
+				item.CreateTime = time.Now()
+				err = item.Create()
+				if err != nil {
+					br.Msg = "保存失败!"
+					br.ErrMsg = "保存失败,Err:" + err.Error()
+					return
+				}
+				err = obj.HandelOverseasCustomerSale(v, 1)
+				if err != nil {
+					br.Msg = "保存失败!"
+					br.ErrMsg = "保存失败,处理特定销售客户信息失败,Err:" + err.Error()
+					return
+				}
+			}
+			//修改客户状态
+			err = obj.HandelCompanyStatus(v)
+			if err != nil {
+				br.Msg = "保存失败!"
+				br.ErrMsg = "保存失败,同步客户状态失败,Err:" + err.Error()
+				return
+			}
+		}
+	}
+
+	if len(req.DelSellerIdArr) > 0 {
+		for _, id := range req.DelSellerIdArr {
+			obj.SellerId = id
+			err = obj.Delete()
+			if err != nil {
+				br.Msg = "保存失败!"
+				br.ErrMsg = "删除销售失败,Err:" + err.Error()
+				return
+			}
+			err = obj.HandelOverseasCustomerSale(id, 1)
+			if err != nil {
+				br.Msg = "保存失败!"
+				br.ErrMsg = "保存失败,处理特定销售客户信息失败,Err:" + err.Error()
+				return
+			}
+			////修改客户状态
+			//err = obj.HandelCompanyStatus(id)
+			//if err != nil {
+			//	br.Msg = "保存失败!"
+			//	br.ErrMsg = "保存失败,同步客户状态失败,Err:" + err.Error()
+			//	return
+			//}
+		}
+	}
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "保存成功"
+}
+
+// @Title 获取已保存销售列表
+// @Description 获取已保存销售列表
+// @Success 200 {object} overseas_custom.OverseasCustomerSaleView
+// @router /sale/list [get]
+func (this *OverseasCustomController) SaleList() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+
+	sysUser := this.SysUser
+	if sysUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser Is Empty"
+		br.Ret = 408
+		return
+	}
+
+	obj := new(overseas_custom.OverseasCustomerSale)
+	list, err := obj.GetOverseasCustomerSaleAll()
+	if err != nil && err.Error() != utils.ErrNoRow() {
+		br.Msg = "获取失败!"
+		br.ErrMsg = "获取失败,GetOverseasCustomerSaleAll,Err:" + err.Error()
+		return
+	}
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = list
+}

+ 17 - 5
models/company/company.go

@@ -41,6 +41,10 @@ type Company struct {
 	Remark          string    `description:"备注信息"`
 	RegionType      string    `description:"地区类型,国内,国外"`
 	OpenCompanyCode string    `description:"开放给第三方的客户编码,不让第三方定位我们的客户信息"`
+	Nation          string    `description:"所属国家"`
+	IsHide          int       `description:"是否隐藏:0:不隐藏,1:隐藏"`
+	OverseasStatus  string    `description:"海外客户状态:'正式','试用','关闭'"`
+	ResetBtn        int       `description:"转正式和重置按钮:同步过来默认为0:显示转正式为1:显示重置为2"`
 }
 
 // 新增客户
@@ -91,6 +95,7 @@ type CompanySearchItem struct {
 	ShareSellerId   int    `description:"共享销售员id"`
 	IsShare         int    `description:"0:非共享用户,1:共享客户"`
 	IsScrounge      int    `description:"是否白嫖 0不是 1是"`
+	Nation          string `description:"所属国家"`
 }
 
 type CompanySearchListResp struct {
@@ -206,6 +211,7 @@ type CompanyItem struct {
 	ServiceTimes     int                  `description:"服务次数"`
 	CloseReason      string               `description:"关闭原因"`
 	CloseTime        string               `description:"关闭时间"`
+	Nation           string               `description:"所属国家"`
 }
 
 type CompanyListItem struct {
@@ -370,7 +376,8 @@ as sort_todo_end_time,
 			MIN(b.end_date) as min_end_date,
 			SUM(b.view_total) as all_view_total,
 			SUM(b.try_out_day_total) as all_try_out_day_total,
-			IF(LEFT(GROUP_CONCAT(DISTINCT b.last_view_time ORDER BY b.product_id), 19) >= "` + t + `", 1, 0) AS week_view_active
+			IF(LEFT(GROUP_CONCAT(DISTINCT b.last_view_time ORDER BY b.product_id), 19) >= "` + t + `", 1, 0) AS week_view_active,
+			a.nation
 			FROM company AS a
 			INNER JOIN company_product AS b ON a.company_id=b.company_id
 			WHERE a.enabled=1  `
@@ -548,6 +555,7 @@ type CompanyAddReq struct {
 	RegionType    string `description:"地区类型,国内,海外"`
 	UserId        int    `description:"联系人ID"`
 	Scale         string `description:"管理规模,空不填,1::50亿以下,2:50~100亿,3:100亿以上。"`
+	Nation        string `description:"所属国家"`
 }
 
 // 新增客户请求参数
@@ -582,6 +590,7 @@ type CompanyDetail struct {
 	ShareSeller     string `description:"共享销售员"`
 	ShareSellerId   int    `description:"共享销售员id"`
 	IsScrounge      int    `description:"是否白嫖 0不是 1是"`
+	Nation          string `description:"所属国家"`
 }
 
 type CompanyDetailResp struct {
@@ -686,6 +695,7 @@ type CompanyEditReq struct {
 	CreditCode  string                   `description:"社会统一信用码"`
 	Province    string                   `description:"省"`
 	City        string                   `description:"市"`
+	Nation      string                   `description:"所属国家"`
 	Products    []*CompanyProductEditReq `description:"产品信息"`
 }
 
@@ -742,9 +752,10 @@ func ModifyCompany(item *Company) (err error) {
 			  address = ?,
 			  last_updated_time = NOW(),
 			  province = ?,
-			  city = ?
+			  city = ?,
+			  nation=?
 			WHERE company_id =?`
-	_, err = o.Raw(sql, item.CompanyName, item.CreditCode, item.Address, item.Province, item.City, item.CompanyId).Exec()
+	_, err = o.Raw(sql, item.CompanyName, item.CreditCode, item.Address, item.Province, item.City, item.Nation, item.CompanyId).Exec()
 	return
 }
 
@@ -1622,7 +1633,7 @@ type RoadShowCalendar struct {
 	EndDate          time.Time
 }
 
-func GetRoadShowList(companyId string) (items []*RoadShowCalendar, err error) {
+func GetRoadShowList(companyId, englishCompany int) (items []*RoadShowCalendar, err error) {
 	o := orm.NewOrm()
 	sql := `SELECT
 	a.*,b.end_date
@@ -1633,9 +1644,10 @@ WHERE
 	a.source = 0 
 	AND a.company_id=?
 	AND b.status = 2 
+    AND a.english_company=?
 	AND NOW()> DATE_FORMAT( CONCAT( end_date, " ", end_time ), '%Y-%m-%d %H:%i:%S' ) 
 	GROUP BY rs_calendar_id  ORDER BY create_time DESC `
-	_, err = o.Raw(sql, companyId).QueryRows(&items)
+	_, err = o.Raw(sql, companyId, englishCompany).QueryRows(&items)
 	return
 }
 

+ 2 - 0
models/company/company_product.go

@@ -54,6 +54,8 @@ type CompanyProduct struct {
 	TryOutDayTotal      int       `description:"客户总试用天数"`
 	CloseReason         string    `description:"关闭原因"`
 	CloseTime           time.Time `description:"关闭时间"`
+	OverseasLabel       int       `description:"海外客户试用子标签:1未分类、2  推进、3 跟踪、4 预备、"`
+	IsOverseas          int       `description:"是否显示在海外客户0:显示,1:不显示"`
 }
 
 // 新增客户产品

+ 49 - 0
models/company/company_user.go

@@ -480,3 +480,52 @@ func GetViewReportListByDate(startDate, endDate string) (items []*ViewReportList
 
 	return
 }
+
+// CompanyViewResp
+// @Description: 客户报告阅读统计
+type CompanyViewResp struct {
+	UserId       int    `description:"联系人ID"`
+	UserName     string `description:"联系人姓名"`
+	Mobile       string `description:"手机号"`
+	Email        string `description:"邮箱地址"`
+	ViewTotal    int    `description:"累计点击量"`
+	LastViewTime string `description:"创建时间"`
+}
+
+// CompanyViewPageListResp 客户-点击量分页列表响应体
+type CompanyViewPageListResp struct {
+	List   []*CompanyViewResp
+	Paging *paging.PagingItem `description:"分页数据"`
+}
+
+func GetCompanyUserListByReportCount(companyId int) (count int, err error) {
+	o := orm.NewOrm()
+	sql := ` SELECT COUNT(1) AS count FROM wx_user WHERE  company_id =? AND ficc_view_total>0 `
+	err = o.Raw(sql, companyId).QueryRow(&count)
+	return
+}
+
+// GetCompanyUserListByReport
+// @Description: 根据报告阅读情况获取联系人列表
+// @author: Roc
+// @datetime 2024-02-01 16:07:59
+// @param companyId int
+// @param startSize int
+// @param pageSize int
+// @param order string
+// @return items []*CompanyUser
+// @return err error
+func GetCompanyUserListByReport(companyId, startSize, pageSize int, order string) (items []*CompanyUser, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT * FROM wx_user  WHERE company_id = ? AND ficc_view_total>0 `
+
+	if order != "" {
+		sql += order
+	} else {
+		sql += ` ORDER BY create_time DESC`
+	}
+	sql += ` LIMIT ?,?`
+	_, err = o.Raw(sql, companyId, startSize, pageSize).QueryRows(&items)
+
+	return
+}

+ 10 - 0
models/db.go

@@ -19,6 +19,7 @@ import (
 	"hongze/hz_crm_api/models/eta_training_video"
 	"hongze/hz_crm_api/models/eta_trial"
 	"hongze/hz_crm_api/models/help_doc"
+	"hongze/hz_crm_api/models/overseas_custom"
 	"hongze/hz_crm_api/models/roadshow"
 	"hongze/hz_crm_api/models/seal"
 	"hongze/hz_crm_api/models/system"
@@ -204,6 +205,9 @@ func init() {
 
 	// ETA培训视频
 	initEtaTrainingVideo()
+
+	//海外客户
+	initOverseasCustom()
 }
 
 // initSystem 系统表 数据表
@@ -721,3 +725,9 @@ func initEtaTrainingVideo() {
 		new(eta_training_video.EtaTrainingVideoClassifyRelate), // 分类关联表
 	)
 }
+
+func initOverseasCustom() {
+	orm.RegisterModel(
+		new(overseas_custom.OverseasCustomerSale),
+	)
+}

+ 18 - 12
models/english_company.go

@@ -14,18 +14,23 @@ const (
 
 // EnglishCompany 英文客户
 type EnglishCompany struct {
-	CompanyId   int       `orm:"column(company_id);pk" description:"英文客户ID"`
-	CompanyName string    `description:"客户名称"`
-	CountryCode string    `description:"国家Code"`
-	Country     string    `description:"国家"`
-	SellerId    int       `description:"销售ID"`
-	SellerName  string    `description:"销售姓名"`
-	ViewTotal   int       `description:"累计点击量/阅读量"`
-	IsDeleted   int       `description:"删除状态:0-正常;1-已删除"`
-	CreateTime  time.Time `description:"创建时间"`
-	ModifyTime  time.Time `description:"更新时间"`
-	Enabled     int       `description:"0-禁用; 1-启用; 2-部分禁用"`
-	Status      int       `description:"1:正式,2:临时,3:终止"`
+	CompanyId      int       `orm:"column(company_id);pk" description:"英文客户ID"`
+	CompanyName    string    `description:"客户名称"`
+	CountryCode    string    `description:"国家Code"`
+	Country        string    `description:"国家"`
+	SellerId       int       `description:"销售ID"`
+	SellerName     string    `description:"销售姓名"`
+	ViewTotal      int       `description:"累计点击量/阅读量"`
+	IsDeleted      int       `description:"删除状态:0-正常;1-已删除"`
+	CreateTime     time.Time `description:"创建时间"`
+	ModifyTime     time.Time `description:"更新时间"`
+	Enabled        int       `description:"0-禁用; 1-启用; 2-部分禁用"`
+	Status         int       `description:"1:正式,2:临时,3:终止"`
+	Nation         string    `description:"所属国家"`
+	IsHide         int       `description:"是否隐藏:0:不隐藏,1:隐藏"`
+	OverseasStatus string    `description:"海外客户状态:'正式','试用','关闭'"`
+	OverseasLabel  int       `description:"海外客户试用子标签:1未分类、2  推进、3 跟踪、4 预备、"`
+	ResetBtn       int       `description:"转正式和重置按钮:同步过来默认为0:显示转正式为1:显示重置为2"`
 }
 
 type EnglishCompanyListItem struct {
@@ -56,6 +61,7 @@ type EnglishCompanySaveReq struct {
 	CountryCode   string `description:"国家代码"`
 	Country       string `description:"国家"`
 	SellerId      int    `description:"销售ID"`
+	Nation        string `description:"所属国家"`
 	EnPermissions []int  `description:"英文权限IDs"`
 }
 

+ 4 - 4
models/english_report_email.go

@@ -285,10 +285,10 @@ func GetEnCompanyIdsByKeyword(keyword string) (companyIds []int, err error) {
 	sql := `SELECT DISTINCT
 				a.company_id
 			FROM
-				english_report_email AS a
-			JOIN english_company AS b ON a.company_id = b.company_id AND b.is_deleted = 0
+				english_company AS a
+			LEFT JOIN english_report_email AS b ON a.company_id = b.company_id AND b.is_deleted = 0
 			WHERE
-				a.is_deleted = 0 AND a.status = 1 AND (a.email LIKE ? OR a.mobile LIKE ? OR b.company_name LIKE ?)`
-	_, err = o.Raw(sql, keyword, keyword, keyword).QueryRows(&companyIds)
+				a.is_deleted = 0 AND a.status = 1 AND (b.email LIKE ? OR b.mobile LIKE ? OR a.company_name LIKE ? OR a.country_code LIKE ? )`
+	_, err = o.Raw(sql, keyword, keyword, keyword, keyword).QueryRows(&companyIds)
 	return
 }

+ 381 - 0
models/overseas_custom/custom.go

@@ -0,0 +1,381 @@
+package overseas_custom
+
+import (
+	"fmt"
+	"github.com/beego/beego/v2/client/orm"
+	"github.com/rdlucklib/rdluck_tools/paging"
+	"hongze/hz_crm_api/utils"
+)
+
+type Custom struct {
+	CompanyId      int    `description:"客户id"`
+	CompanyName    string `description:"客户名称"`
+	Nation         string `description:"国家"`
+	SellerId       int    `description:"销售id"`
+	SellerName     string `description:"销售名称"`
+	CompanyStatus  string `description:"状态"`
+	ViewTotal      int    `description:"累计点击量"`
+	RoadShowTotal  int    `description:"路演数量"`
+	LastViewTime   string `description:"最近阅读时间"`
+	CreateTime     string `description:"创建时间"`
+	IsHide         int    `description:"是否隐藏:0:不隐藏,1:隐藏"`
+	OverseasStatus string `description:"海外客户状态:'正式','试用','关闭'"`
+	Source         int    `description:"来源:1,英文客户,2:客户列表"`
+	OverseasLabel  int    `description:"海外客户试用子标签:1未分类、2  推进、3 跟踪、4 预备、"`
+	ResetBtn       int    `description:"转正式和重置按钮:同步过来默认为0:显示转正式为1:显示重置为2"`
+}
+
+type CustomTotal struct {
+	CompanyStatus string `description:"状态"`
+	Total         int    `description:"总数"`
+}
+
+func (obj *Custom) GetCustomTotal(condition string, pars []interface{}) (list []*CustomTotal, err error) {
+	o := orm.NewOrm()
+	sql := ``
+	var databaseName string
+	if utils.RunMode == "debug" {
+		databaseName = "test_v2_hongze_rddp"
+	} else {
+		databaseName = "hongze_rddp"
+	}
+
+	sql = `SELECT overseas_status AS company_status,COUNT(1) AS total,is_hide FROM (
+				SELECT a.company_id,a.company_name,a.nation,b.seller_id,b.seller_name,
+				b.view_total,b.road_show_total,a.created_time AS create_time,b.last_view_time,a.is_hide,a.overseas_status,b.overseas_label
+				FROM company AS a
+				INNER JOIN company_product AS b ON a.company_id=b.company_id
+				INNER JOIN overseas_custom_seller AS c ON b.seller_id=c.seller_id
+				WHERE b.is_overseas = 0
+				UNION ALL
+				SELECT t.company_id+10000000,t.company_name,t.nation,t.seller_id,t.seller_name,
+				t.view_total,0 AS road_show_total,t.create_time,'' AS last_view_time,t.is_hide,t.overseas_status,t.overseas_label
+				FROM %s.english_company AS t
+				INNER JOIN overseas_custom_seller AS n ON t.seller_id=n.seller_id
+				WHERE 1=1 AND t.is_deleted=0
+				)AS m
+		WHERE 1=1                       
+`
+
+	if condition != "" {
+		sql += condition
+	}
+
+	sql += ` GROUP BY m.overseas_status `
+
+	sql = fmt.Sprintf(sql, databaseName)
+
+	_, err = o.Raw(sql, pars).QueryRows(&list)
+	return
+}
+
+//
+//func (obj *Custom) GetCustomOverseasStatusTotal(condition string, pars []interface{}) (total int, err error) {
+//	o := orm.NewOrm()
+//	sql := ``
+//	var databaseName string
+//	if utils.RunMode == "debug" {
+//		databaseName = "test_v2_hongze_rddp"
+//	} else {
+//		databaseName = "hongze_rddp"
+//	}
+//
+//	sql = `SELECT COUNT(1) AS total FROM (
+//				SELECT a.company_id,a.company_name,a.nation,b.seller_id,b.seller_name,
+//				b.view_total,b.road_show_total,a.created_time AS create_time,b.last_view_time,a.is_hide,a.overseas_status,b.overseas_label
+//				FROM company AS a
+//				INNER JOIN company_product AS b ON a.company_id=b.company_id
+//				INNER JOIN overseas_custom_seller AS c ON b.seller_id=c.seller_id
+//				WHERE b.is_overseas = 0
+//				UNION ALL
+//				SELECT t.company_id+10000000,t.company_name,t.nation,t.seller_id,t.seller_name,
+//				t.view_total,0 AS road_show_total,t.create_time,'' AS last_view_time,t.is_hide,t.overseas_status,t.overseas_label
+//				FROM %s.english_company AS t
+//				INNER JOIN overseas_custom_seller AS n ON t.seller_id=n.seller_id
+//				WHERE 1=1 AND t.is_deleted=0
+//				)AS m
+//		WHERE 1=1
+// AND m.is_hide=0
+//AND m. overseas_status='正式' `
+//
+//	if condition != "" {
+//		sql += condition
+//	}
+//
+//	sql += ` GROUP BY m.overseas_status `
+//
+//	sql = fmt.Sprintf(sql, databaseName)
+//
+//	err = o.Raw(sql, pars).QueryRow(&total)
+//	return
+//}
+
+// GetCompanyIdsByKeyword 关键词获取客户IDs
+func (obj *Custom) GetCompanyIdsByKeyword(keyword string) (companyIds []int, err error) {
+	o := orm.NewOrm()
+	sql := ` SELECT DISTINCT b.company_id FROM wx_user AS a
+INNER JOIN company AS b ON a.company_id=b.company_id
+WHERE 1=1 AND (a.email LIKE ? OR a.mobile LIKE ? OR b.company_name LIKE ? OR b.credit_code LIKE ? ) `
+	_, err = o.Raw(sql, keyword, keyword, keyword, keyword).QueryRows(&companyIds)
+	return
+}
+
+func (obj *Custom) GetCustomListCount(condition string, pars []interface{}, companyStatus string) (count int, err error) {
+	o := orm.NewOrm()
+	sql := ``
+	var databaseName string
+	if utils.RunMode == "debug" {
+		databaseName = "test_v2_hongze_rddp"
+	} else {
+		databaseName = "hongze_rddp"
+	}
+
+	sql = `SELECT COUNT(1) AS count FROM (
+				SELECT a.company_id,a.company_name,a.nation,b.seller_id,b.seller_name,
+				b.view_total,b.road_show_total,a.created_time AS create_time,b.last_view_time,a.is_hide,a.overseas_status,b.overseas_label
+				FROM company AS a
+				INNER JOIN company_product AS b ON a.company_id=b.company_id
+				INNER JOIN overseas_custom_seller AS c ON b.seller_id=c.seller_id
+				WHERE b.is_overseas = 0`
+	if companyStatus == "正式" {
+		sql += ` AND b.status IN('正式','永续') `
+	} else if companyStatus == "试用" {
+		sql += ` AND b.status='试用' `
+	} else if companyStatus == "关闭" {
+		sql += ` AND b.status IN('冻结','流失','关闭') `
+	}
+	sql += `
+				UNION ALL
+				SELECT t.company_id+10000000,t.company_name,t.nation,t.seller_id,t.seller_name,
+				t.view_total,0 AS road_show_total,t.create_time,'' AS last_view_time,t.is_hide,t.overseas_status,t.overseas_label
+				FROM %s.english_company AS t
+				INNER JOIN overseas_custom_seller AS n ON t.seller_id=n.seller_id
+             WHERE 1=1 AND t.is_deleted=0 `
+	if companyStatus == "试用" {
+		sql += ` AND t.enabled IN(1,2)`
+	} else if companyStatus == "禁用" {
+		sql += ` AND t.enabled = 0 `
+	}
+
+	sql += `		)AS m
+		WHERE 1=1 `
+
+	if condition != "" {
+		sql += condition
+	}
+	sql = fmt.Sprintf(sql, databaseName)
+	err = o.Raw(sql, pars).QueryRow(&count)
+	return
+}
+
+func (obj *Custom) GetCustomList(condition string, pars []interface{}, companyStatus, sortField string, startSize, pageSize, sortDesc int) (list []*Custom, err error) {
+	o := orm.NewOrm()
+	sql := ``
+	var databaseName string
+	if utils.RunMode == "debug" {
+		databaseName = "test_v2_hongze_rddp"
+	} else {
+		databaseName = "hongze_rddp"
+	}
+
+	sql = `SELECT * FROM (
+				SELECT a.company_id,a.company_name,a.nation,b.seller_id,b.seller_name,
+				b.view_total,b.road_show_total,a.created_time AS create_time,b.last_view_time,a.is_hide,a.overseas_status,
+				2 AS source,b.overseas_label,a.reset_btn
+				FROM company AS a
+				INNER JOIN company_product AS b ON a.company_id=b.company_id
+				INNER JOIN overseas_custom_seller AS c ON b.seller_id=c.seller_id
+				WHERE b.product_id=1 AND b.is_overseas = 0`
+	if companyStatus == "正式" {
+		sql += ` AND b.status IN('正式','永续') `
+	} else if companyStatus == "试用" {
+		sql += ` AND b.status='试用' `
+	} else if companyStatus == "关闭" {
+		sql += ` AND b.status IN('冻结','流失','关闭') `
+	}
+	sql += `
+				UNION ALL
+				SELECT t.company_id+10000000,t.company_name,t.nation,t.seller_id,t.seller_name,
+				t.view_total,t.road_show_total,t.create_time,t.last_view_time,t.is_hide,t.overseas_status,
+				1 AS source,t.overseas_label,t.reset_btn
+				FROM %s.english_company AS t
+				INNER JOIN overseas_custom_seller AS n ON t.seller_id=n.seller_id
+             WHERE 1=1 AND t.is_deleted=0 `
+	if companyStatus == "试用" {
+		sql += ` AND t.enabled IN(1,2)`
+	} else if companyStatus == "禁用" {
+		sql += ` AND t.enabled = 0 `
+	}
+
+	sql += `		)AS m WHERE 1=1 `
+
+	if condition != "" {
+		sql += condition
+	}
+
+	var sortFieldStr, sortDescStr string
+	if sortField != "" {
+		if sortField == "ViewTotal" {
+			sortFieldStr = "view_total"
+		} else if sortField == "RoadShowTotal" {
+			sortFieldStr = "road_show_total"
+		} else if sortField == "CreateTime" {
+			sortFieldStr = "create_time"
+		} else if sortField == "LastViewTime" {
+			sortFieldStr = "last_view_time"
+		}
+	}
+
+	if sortDesc == 1 {
+		sortDescStr = "DESC"
+	} else {
+		sortDescStr = "ASC"
+	}
+
+	sql += ` ORDER BY %s %s,m.create_time `
+	sql += ` LIMIT ?,? `
+	sql = fmt.Sprintf(sql, databaseName, sortFieldStr, sortDescStr)
+	_, err = o.Raw(sql, pars, startSize, pageSize).QueryRows(&list)
+	return
+}
+
+type CustomListResp struct {
+	Paging *paging.PagingItem
+	List   []*Custom
+}
+
+type CustomHideReq struct {
+	CompanyId int `description:"客户ID"`
+}
+
+func (obj *Custom) GetCustomByCompanyId(companyId int) (item *Custom, err error) {
+	o := orm.NewOrm()
+	sql := ``
+	var databaseName string
+	if utils.RunMode == "debug" {
+		databaseName = "test_v2_hongze_rddp"
+	} else {
+		databaseName = "hongze_rddp"
+	}
+
+	//if companyId > utils.EnCompanyIdStep {
+	//	companyId = companyId - utils.EnCompanyIdStep
+	//}
+
+	sql = `SELECT * FROM (
+				SELECT a.company_id,a.company_name,a.nation,b.seller_id,b.seller_name,
+				b.view_total,b.road_show_total,a.created_time AS create_time,b.last_view_time,a.is_hide,a.overseas_status,a.reset_btn,
+				CASE b.status 
+				WHEN '正式' THEN '正式'
+				WHEN '永续' THEN '正式'
+				WHEN '试用' THEN '试用'
+				ELSE '关闭' END AS company_status
+				FROM company AS a
+				INNER JOIN company_product AS b ON a.company_id=b.company_id
+				INNER JOIN overseas_custom_seller AS c ON b.seller_id=c.seller_id
+				WHERE b.is_overseas = 0`
+	sql += ` UNION ALL
+				SELECT t.company_id+10000000,t.company_name,t.nation,t.seller_id,t.seller_name,
+				t.view_total,0 AS road_show_total,t.create_time,'' AS last_view_time,t.is_hide,t.overseas_status,t.reset_btn,
+				CASE t.enabled
+				WHEN 0 THEN '关闭'
+				ELSE '试用' END AS company_status
+				FROM %s.english_company AS t
+				INNER JOIN overseas_custom_seller AS n ON t.seller_id=n.seller_id
+             WHERE 1=1 `
+
+	sql += `		)AS m WHERE 1=1 `
+
+	sql += ` AND m.company_id=? `
+	sql = fmt.Sprintf(sql, databaseName)
+	err = o.Raw(sql, companyId).QueryRow(&item)
+	return
+}
+
+type OverseasLabelTotal struct {
+	OverseasLabel int `description:"海外客户试用子标签:1未分类、2  推进、3 跟踪、4 预备、"`
+	Total         int `description:"总数"`
+}
+
+func (obj *Custom) GetCustomOverseasLabelTotal(condition string, pars []interface{}) (list []*OverseasLabelTotal, err error) {
+	o := orm.NewOrm()
+	sql := ``
+	var databaseName string
+	if utils.RunMode == "debug" {
+		databaseName = "test_v2_hongze_rddp"
+	} else {
+		databaseName = "hongze_rddp"
+	}
+
+	sql = `SELECT overseas_label,COUNT(1) AS total FROM (
+				SELECT a.company_id,a.company_name,a.nation,b.seller_id,b.seller_name,
+				b.view_total,b.road_show_total,a.created_time AS create_time,b.last_view_time,a.is_hide,a.overseas_status,b.overseas_label
+				FROM company AS a
+				INNER JOIN company_product AS b ON a.company_id=b.company_id
+				INNER JOIN overseas_custom_seller AS c ON b.seller_id=c.seller_id
+				WHERE b.is_overseas = 0
+				UNION ALL
+				SELECT t.company_id+10000000,t.company_name,t.nation,t.seller_id,t.seller_name,
+				t.view_total,0 AS road_show_total,t.create_time,'' AS last_view_time,t.is_hide,t.overseas_status,t.overseas_label
+				FROM %s.english_company AS t
+				INNER JOIN overseas_custom_seller AS n ON t.seller_id=n.seller_id
+				WHERE 1=1 AND t.is_deleted=0
+				)AS m
+		WHERE 1=1                       
+`
+
+	if condition != "" {
+		sql += condition
+	}
+
+	sql += ` GROUP BY m.overseas_label `
+
+	sql = fmt.Sprintf(sql, databaseName)
+
+	_, err = o.Raw(sql, pars).QueryRows(&list)
+	return
+}
+
+type CustomOverseasLabelSetReq struct {
+	CompanyId     int `description:"客户ID"`
+	OverseasLabel int `description:"海外客户试用子标签:1未分类、2  推进、3 跟踪、4 预备、"`
+}
+
+// 更新客户产品信息
+func (obj *Custom) UpdateCompanyProduct(updateParams, whereParam map[string]interface{}) (err error) {
+	to := orm.NewOrm()
+	ptrStructOrTableName := "company_product"
+
+	qs := to.QueryTable(ptrStructOrTableName)
+	for expr, exprV := range whereParam {
+		qs = qs.Filter(expr, exprV)
+	}
+	_, err = qs.Update(updateParams)
+	return
+}
+
+// 更新客户产品信息
+func (obj *Custom) UpdateCompany(updateParams, whereParam map[string]interface{}) (err error) {
+	to := orm.NewOrm()
+	ptrStructOrTableName := "company"
+
+	qs := to.QueryTable(ptrStructOrTableName)
+	for expr, exprV := range whereParam {
+		qs = qs.Filter(expr, exprV)
+	}
+	_, err = qs.Update(updateParams)
+	return
+}
+
+// GetEnCompanyIdsByKeyword 关键词获取英文客户IDs
+func GetEnCompanyIdsByKeyword(keyword string) (companyIds []int, err error) {
+	o := orm.NewOrmUsingDB("rddp")
+	sql := ` SELECT (a.company_id+10000000) AS company_id 
+ FROM english_company AS a
+ LEFT JOIN english_report_email AS b ON a.company_id=b.company_id
+ WHERE a.is_deleted=0
+AND ( a.company_name LIKE ? OR a.country_code LIKE ? OR b.email LIKE ? OR b.mobile LIKE ?)
+GROUP BY a.company_id `
+	_, err = o.Raw(sql, keyword, keyword, keyword, keyword).QueryRows(&companyIds)
+	return
+}

+ 168 - 0
models/overseas_custom/overseas_custom_seller.go

@@ -0,0 +1,168 @@
+package overseas_custom
+
+import (
+	"fmt"
+	"github.com/beego/beego/v2/client/orm"
+	"hongze/hz_crm_api/models/company"
+	"hongze/hz_crm_api/utils"
+	"time"
+)
+
+// 海外客户销售
+type OverseasCustomerSale struct {
+	OverseasCustomSellerId int       `orm:"column(overseas_custom_seller_id);pk"`
+	SellerId               int       `description:"销售id"`
+	CreateTime             time.Time `description:"创建时间"`
+}
+
+// 海外客户销售
+type OverseasCustomerSaleView struct {
+	SellerId int    `description:"销售id"`
+	RealName string `description:"销售姓名"`
+}
+
+func (m *OverseasCustomerSale) Create() (err error) {
+	o := orm.NewOrm()
+	id, err := o.Insert(m)
+	if err != nil {
+		return
+	}
+	m.OverseasCustomSellerId = int(id)
+	return
+}
+
+func (m *OverseasCustomerSale) Delete() (err error) {
+	o := orm.NewOrm()
+	sql := ` DELETE FROM overseas_custom_seller WHERE seller_id=? `
+	_, err = o.Raw(sql, m.SellerId).Exec()
+	return
+}
+
+func (m *OverseasCustomerSale) TableName() string {
+	return "overseas_custom_seller"
+}
+
+// OverseasCustomerSaleSaveReq 保存销售
+type OverseasCustomerSaleSaveReq struct {
+	AddSellerIdArr []int `description:"新增销售id,数组"`
+	DelSellerIdArr []int `description:"删除销售id,数组"`
+}
+
+func (m *OverseasCustomerSale) GetOverseasCustomerSaleAll() (list []*OverseasCustomerSaleView, err error) {
+	o := orm.NewOrm()
+	sql := ` SELECT a.*,b.real_name FROM overseas_custom_seller AS a
+			INNER JOIN admin AS b ON a.seller_id=b.admin_id `
+	_, err = o.Raw(sql).QueryRows(&list)
+	return
+}
+
+type AdminItem struct {
+	AdminId   int    `description:"系统用户id"`
+	AdminName string `description:"系统用户名称"`
+	RealName  string `description:"系统用户姓名"`
+	Mobile    string `description:"手机号"`
+}
+
+func (m *OverseasCustomerSale) HandelOverseasCustomerSale(sellerId, isOverseas int) (err error) {
+	o := orm.NewOrm()
+	sellerItem := new(AdminItem)
+	sql := ` SELECT * FROM admin WHERE admin_id=? `
+	err = o.Raw(sql, sellerId).QueryRow(&sellerItem)
+	if err != nil {
+		return err
+	}
+	if sellerItem.Mobile == "13065778668" {
+		sql = ` UPDATE company_product SET is_overseas = ? WHERE seller_id=? AND company_id IN (SELECT company_id FROM company WHERE region_type='国内') `
+		_, err = o.Raw(sql, isOverseas, sellerId).Exec()
+		return err
+	}
+	return err
+}
+
+// EnglishCompany 英文客户
+type EnglishCompany struct {
+	CompanyId      int       `orm:"column(company_id);pk" description:"英文客户ID"`
+	CompanyName    string    `description:"客户名称"`
+	CountryCode    string    `description:"国家Code"`
+	Country        string    `description:"国家"`
+	SellerId       int       `description:"销售ID"`
+	SellerName     string    `description:"销售姓名"`
+	ViewTotal      int       `description:"累计点击量/阅读量"`
+	IsDeleted      int       `description:"删除状态:0-正常;1-已删除"`
+	CreateTime     time.Time `description:"创建时间"`
+	ModifyTime     time.Time `description:"更新时间"`
+	Enabled        int       `description:"0-禁用; 1-启用; 2-部分禁用"`
+	Status         int       `description:"1:正式,2:临时,3:终止"`
+	Nation         string    `description:"所属国家"`
+	IsHide         int       `description:"是否隐藏:0:不隐藏,1:隐藏"`
+	OverseasStatus string    `description:"海外客户状态:'正式','试用','关闭'"`
+	OverseasLabel  int       `description:"海外客户试用子标签:1未分类、2  推进、3 跟踪、4 预备、"`
+}
+
+func (m *OverseasCustomerSale) HandelCompanyStatus(sellerId int) (err error) {
+	var databaseName string
+	if utils.RunMode == "debug" {
+		databaseName = "test_v2_hongze_rddp"
+	} else {
+		databaseName = "hongze_rddp"
+	}
+
+	o := orm.NewOrm()
+	enCompanyList := make([]*EnglishCompany, 0)
+	sql := ` SELECT * FROM %s.english_company WHERE seller_id=? AND is_deleted=0 `
+	sql = fmt.Sprintf(sql, databaseName)
+	_, err = o.Raw(sql, sellerId).QueryRows(&enCompanyList)
+	if err != nil {
+		return err
+	}
+
+	if len(enCompanyList) > 0 {
+		for _, v := range enCompanyList {
+			var overseasStatus string
+			var resetBtn int
+			if v.Enabled == 0 {
+				overseasStatus = "关闭"
+				resetBtn = 0
+			} else {
+				overseasStatus = "试用"
+				resetBtn = 1
+			}
+			sql = ` UPDATE %s.english_company SET overseas_status=?,reset_btn=? WHERE company_id=? `
+			sql = fmt.Sprintf(sql, databaseName)
+			_, err = o.Raw(sql, overseasStatus, resetBtn, v.CompanyId).Exec()
+			if err != nil {
+				return err
+			}
+		}
+	}
+
+	companyList := make([]*company.CompanyProduct, 0)
+	sql = ` SELECT * FROM company_product WHERE seller_id=? `
+	_, err = o.Raw(sql, sellerId).QueryRows(&companyList)
+	if err != nil {
+		return err
+	}
+
+	if len(companyList) > 0 {
+		for _, v := range companyList {
+			var overseasStatus string
+			var resetBtn int
+			if v.Status == "正式" || v.Status == "永续" {
+				overseasStatus = "正式"
+				resetBtn = 0
+			} else if v.Status == "试用" {
+				overseasStatus = "试用"
+				resetBtn = 1
+			} else {
+				overseasStatus = "关闭"
+				resetBtn = 0
+			}
+			sql = ` UPDATE company SET overseas_status=?,reset_btn=? WHERE company_id=? `
+			_, err = o.Raw(sql, overseasStatus, resetBtn, v.CompanyId).Exec()
+			if err != nil {
+				return err
+			}
+		}
+	}
+	return err
+}

+ 81 - 0
routers/commentsRouter.go

@@ -7189,6 +7189,78 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/overseas_custom:OverseasCustomController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/overseas_custom:OverseasCustomController"],
+        beego.ControllerComments{
+            Method: "CustomHide",
+            Router: `/custom/hide`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/overseas_custom:OverseasCustomController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/overseas_custom:OverseasCustomController"],
+        beego.ControllerComments{
+            Method: "CustomLabelStatistics",
+            Router: `/custom/label/statistics`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/overseas_custom:OverseasCustomController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/overseas_custom:OverseasCustomController"],
+        beego.ControllerComments{
+            Method: "CustomList",
+            Router: `/custom/list`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/overseas_custom:OverseasCustomController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/overseas_custom:OverseasCustomController"],
+        beego.ControllerComments{
+            Method: "CustomOverseasLabelSet",
+            Router: `/custom/overseas_label_set`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/overseas_custom:OverseasCustomController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/overseas_custom:OverseasCustomController"],
+        beego.ControllerComments{
+            Method: "CustomStatistics",
+            Router: `/custom/statistics`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/overseas_custom:OverseasCustomController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/overseas_custom:OverseasCustomController"],
+        beego.ControllerComments{
+            Method: "CustomStatusSet",
+            Router: `/custom/status_set`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/overseas_custom:OverseasCustomController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/overseas_custom:OverseasCustomController"],
+        beego.ControllerComments{
+            Method: "SaleList",
+            Router: `/sale/list`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/overseas_custom:OverseasCustomController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/overseas_custom:OverseasCustomController"],
+        beego.ControllerComments{
+            Method: "SaleSave",
+            Router: `/sale/save`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/roadshow:CalendarController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/roadshow:CalendarController"],
         beego.ControllerComments{
             Method: "Accept",
@@ -9880,6 +9952,15 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["hongze/hz_crm_api/controllers:CompanyUserController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers:CompanyUserController"],
+        beego.ControllerComments{
+            Method: "ListByReport",
+            Router: `/user/listByReport`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["hongze/hz_crm_api/controllers:CompanyUserController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers:CompanyUserController"],
         beego.ControllerComments{
             Method: "GetOtherProduct",

+ 6 - 0
routers/router.go

@@ -24,6 +24,7 @@ import (
 	"hongze/hz_crm_api/controllers/eta_business"
 	"hongze/hz_crm_api/controllers/eta_training_video"
 	"hongze/hz_crm_api/controllers/help_doc"
+	"hongze/hz_crm_api/controllers/overseas_custom"
 	"hongze/hz_crm_api/controllers/roadshow"
 	"hongze/hz_crm_api/controllers/seal"
 	"hongze/hz_crm_api/controllers/yb"
@@ -338,6 +339,11 @@ func init() {
 				&eta_training_video.EtaTrainingVideoTagController{},
 			),
 		),
+		web.NSNamespace("/overseas_custom",
+			web.NSInclude(
+				&overseas_custom.OverseasCustomController{},
+			),
+		),
 	)
 	web.AddNamespace(ns)
 }

+ 4 - 0
utils/constants.go

@@ -573,3 +573,7 @@ func GetWeeklyDatabase() (databaseName string) {
 	}
 	return
 }
+
+const (
+	EnCompanyIdStep = 10000000
+)