Răsfoiți Sursa

Merge branch 'master' of http://8.136.199.33:3000/hongze/hz_crm_api into cygx/mfyx_2.0

xingzai 9 luni în urmă
părinte
comite
af45f2e46e

+ 122 - 5
controllers/company.go

@@ -2836,10 +2836,35 @@ func (this *CompanyController) Add() {
 		}
 	}
 
-	// 每个权益销售手中的试用客户最多30个
-	if productId == utils.COMPANY_PRODUCT_RAI_ID && tryOutCount >= utils.COMPANY_STATUS_TRY_OUT_COUNT_RAI {
-		br.Msg = "您的试用客户总数,已超过上限,不可继续新增"
-		return
+	//// 每个权益销售手中的试用客户最多30个
+	//if productId == utils.COMPANY_PRODUCT_RAI_ID && tryOutCount >= utils.COMPANY_STATUS_TRY_OUT_COUNT_RAI {
+	//	br.Msg = "您的试用客户总数,已超过上限,不可继续新增"
+	//	return
+	//}
+
+	//如果是权益客户,在选择非研选行业试用时,需要判断当前有多少非研选的试用客户(试用状态,且行业是非研选)
+	if productId == utils.COMPANY_PRODUCT_RAI_ID {
+		permissionArr := strings.Split(req.PermissionIds, ",")
+		//如果所选行业不属于研选订阅跟研选扣点包,那就是非研选试用客户
+		var isNoResearch bool
+		for _, v := range permissionArr {
+			if v != strconv.Itoa(utils.CHART_PERMISSION_ID_YANXUAN) && v != strconv.Itoa(utils.YAN_XUAN_KOU_DIAN_BAO_ID) {
+				isNoResearch = true
+				continue
+			}
+		}
+		if isNoResearch {
+			tryOutCountRai, err := company.GetRaiCompanyTryOutCountNoResearch(seller.AdminId)
+			if err != nil {
+				br.Msg = "判断试用客户量失败"
+				br.ErrMsg = "判断试用客户量失败,Err:" + err.Error()
+				return
+			}
+			if tryOutCountRai >= utils.COMPANY_STATUS_TRY_OUT_COUNT_RAI {
+				br.Msg = "非研选试用客户最多30家"
+				return
+			}
+		}
 	}
 
 	if seller == nil {
@@ -3921,6 +3946,38 @@ func (this *CompanyController) Edit() {
 
 	productId := services.GetProductId(sysUser.RoleTypeCode) //产品权限id
 	for _, v := range req.Products {
+
+		if productId == utils.COMPANY_PRODUCT_RAI_ID {
+
+			//查询客户的产品权限
+			companyReportPermissionListOld, err := company.GetCompanyReportPermission(req.CompanyId, productId)
+			if err != nil {
+				br.Msg = "查询客户的产品权限异常"
+				br.ErrMsg = "查询客户的产品权限异常:" + err.Error()
+				return
+			}
+			permissionArr := strings.Split(v.PermissionIds, ",")
+			//如果所选行业不属于研选订阅跟研选扣点包,那就是非研选试用客户
+			var isNoResearch bool
+			for _, v := range permissionArr {
+				if v != strconv.Itoa(utils.CHART_PERMISSION_ID_YANXUAN) && v != strconv.Itoa(utils.YAN_XUAN_KOU_DIAN_BAO_ID) {
+					isNoResearch = true
+					continue
+				}
+			}
+			if isNoResearch && len(companyReportPermissionListOld) != len(permissionArr) {
+				tryOutCountRai, err := company.GetRaiCompanyTryOutCountNoResearch(sysUser.AdminId)
+				if err != nil {
+					br.Msg = "判断试用客户量失败"
+					br.ErrMsg = "判断试用客户量失败,Err:" + err.Error()
+					return
+				}
+				if tryOutCountRai >= utils.COMPANY_STATUS_TRY_OUT_COUNT_RAI {
+					br.Msg = "非研选试用客户最多30家"
+					return
+				}
+			}
+		}
 		if v.IndustryId <= 0 {
 			br.Msg = "请选择行业"
 			br.IsSendEmail = false
@@ -4893,6 +4950,36 @@ func (this *CompanyController) Receive() {
 		productName = utils.COMPANY_PRODUCT_RAI_NAME
 	}
 
+	if productId == utils.COMPANY_PRODUCT_RAI_ID {
+		//查询客户的产品权限
+		companyReportPermissionListOld, err := company.GetCompanyReportPermission(req.CompanyId, productId)
+		if err != nil {
+			br.Msg = "查询客户的产品权限异常"
+			br.ErrMsg = "查询客户的产品权限异常:" + err.Error()
+			return
+		}
+		var isNoResearch bool
+		for _, v := range companyReportPermissionListOld {
+			if v.ChartPermissionId != utils.CHART_PERMISSION_ID_YANXUAN && v.ChartPermissionId != utils.YAN_XUAN_KOU_DIAN_BAO_ID {
+				isNoResearch = true
+				continue
+			}
+		}
+		//如果所选行业不属于研选订阅跟研选扣点包,那就是非研选试用客户
+		if isNoResearch {
+			tryOutCountRai, err := company.GetRaiCompanyTryOutCountNoResearch(req.SellsId)
+			if err != nil {
+				br.Msg = "判断试用客户量失败"
+				br.ErrMsg = "判断试用客户量失败,Err:" + err.Error()
+				return
+			}
+			if tryOutCountRai >= utils.COMPANY_STATUS_TRY_OUT_COUNT_RAI {
+				br.Msg = "非研选试用客户最多30家"
+				return
+			}
+		}
+	}
+
 	if cp != nil {
 		if cp.Status != utils.COMPANY_STATUS_LOSE {
 			br.Msg = "客户状态为:" + cp.Status + ";不可领取"
@@ -5144,6 +5231,37 @@ func (this *CompanyController) MoveSeller() {
 		br.ErrMsg = "无效的客户类型"
 		return
 	}
+
+	if productId == utils.COMPANY_PRODUCT_RAI_ID {
+		//查询客户的产品权限
+		companyReportPermissionListOld, err := company.GetCompanyReportPermission(req.CompanyId, productId)
+		if err != nil {
+			br.Msg = "查询客户的产品权限异常"
+			br.ErrMsg = "查询客户的产品权限异常:" + err.Error()
+			return
+		}
+		var isNoResearch bool
+		for _, v := range companyReportPermissionListOld {
+			if v.ChartPermissionId != utils.CHART_PERMISSION_ID_YANXUAN && v.ChartPermissionId != utils.YAN_XUAN_KOU_DIAN_BAO_ID {
+				isNoResearch = true
+				continue
+			}
+		}
+		//如果所选行业不属于研选订阅跟研选扣点包,那就是非研选试用客户
+		if isNoResearch {
+			tryOutCountRai, err := company.GetRaiCompanyTryOutCountNoResearch(req.SellsId)
+			if err != nil {
+				br.Msg = "判断试用客户量失败"
+				br.ErrMsg = "判断试用客户量失败,Err:" + err.Error()
+				return
+			}
+			if tryOutCountRai >= utils.COMPANY_STATUS_TRY_OUT_COUNT_RAI {
+				br.Msg = seller.RealName + "的非研选试用客户已超过30家"
+				return
+			}
+		}
+	}
+
 	cp, err := company.GetCompanyProductByCompanyIdAndProductId(req.CompanyId, productId)
 	if err != nil && err.Error() != utils.ErrNoRow() {
 		if err.Error() == utils.ErrNoRow() {
@@ -5155,7 +5273,6 @@ func (this *CompanyController) MoveSeller() {
 		br.ErrMsg = "获取客户信息失败,Err:" + err.Error()
 		return
 	}
-	fmt.Println(cp)
 	if cp == nil {
 		br.Msg = "客户信息不存在,请刷新页面"
 		br.ErrMsg = "客户信息不存在"

+ 5 - 5
controllers/company_apply.go

@@ -184,7 +184,7 @@ func (this *CompanyApplyController) ApplyContractHistoryList() {
 							}
 						}
 
-						if n.ChartPermissionId == utils.YAN_XUAN_KOU_DIAN_BAO_ID && pints > 0 {
+						if n.ChartPermissionId == utils.YAN_XUAN_KOU_DIAN_BAO_ID {
 							n.PermissionName += "(" + fmt.Sprint(pints) + "点)"
 						}
 						checkList = append(checkList, n.ChartPermissionId)
@@ -217,7 +217,7 @@ func (this *CompanyApplyController) ApplyContractHistoryList() {
 							//n.PermissionName += "(3w)"
 						}
 
-						if n.ChartPermissionId == utils.YAN_XUAN_KOU_DIAN_BAO_ID && pints > 0 {
+						if n.ChartPermissionId == utils.YAN_XUAN_KOU_DIAN_BAO_ID {
 							n.PermissionName += "(" + fmt.Sprint(pints) + "点)"
 						}
 						//n.PermissionName += expMap[match.ExpensiveYx]
@@ -497,13 +497,13 @@ func (this *CompanyApplyController) ApplyContractDetail() {
 					//expensiveYx = v.ExpensiveYx
 				}
 
-				if v.Points > 0 && v.ChartPermissionId == utils.YAN_XUAN_KOU_DIAN_BAO_ID {
+				if v.ChartPermissionId == utils.YAN_XUAN_KOU_DIAN_BAO_ID {
 					points = v.Points
 				}
 				permissions = append(permissions, v.ChartPermissionId)
 			}
 			for _, n := range items {
-				if points > 0 && n.ChartPermissionId == utils.YAN_XUAN_KOU_DIAN_BAO_ID {
+				if n.ChartPermissionId == utils.YAN_XUAN_KOU_DIAN_BAO_ID {
 					n.PermissionName += fmt.Sprint("(", points, "点)")
 				}
 				if utils.InArrayByInt(permissions, n.ChartPermissionId) {
@@ -571,7 +571,7 @@ func (this *CompanyApplyController) ApplyContractDetail() {
 				if v.ExpensiveYx == 1 {
 					mapExpensive[v.ChartPermissionId] = true
 				}
-				if v.Points > 0 && v.ChartPermissionId == utils.YAN_XUAN_KOU_DIAN_BAO_ID {
+				if v.ChartPermissionId == utils.YAN_XUAN_KOU_DIAN_BAO_ID {
 					points = v.Points
 				}
 				permissions = append(permissions, v.ChartPermissionId)

+ 47 - 0
controllers/company_apply_v2.go

@@ -1464,6 +1464,28 @@ func (this *CompanyApplyController) ApplyThaw() {
 			br.ErrMsg = "获取客户申请的次数失败,Err:" + err.Error()
 			return
 		}
+
+		permissionArr := strings.Split(req.PermissionIds, ",")
+		//如果所选行业不属于研选订阅跟研选扣点包,那就是非研选试用客户
+		var isNoResearch bool
+		for _, v := range permissionArr {
+			if v != strconv.Itoa(utils.CHART_PERMISSION_ID_YANXUAN) && v != strconv.Itoa(utils.YAN_XUAN_KOU_DIAN_BAO_ID) {
+				isNoResearch = true
+				continue
+			}
+		}
+		if isNoResearch {
+			tryOutCountRai, err := company.GetRaiCompanyTryOutCountNoResearch(sysUser.AdminId)
+			if err != nil {
+				br.Msg = "判断试用客户量失败"
+				br.ErrMsg = "判断试用客户量失败,Err:" + err.Error()
+				return
+			}
+			if tryOutCountRai >= utils.COMPANY_STATUS_TRY_OUT_COUNT_RAI {
+				br.Msg = "非研选试用客户最多30家"
+				return
+			}
+		}
 	}
 	companyProduct, err := company.GetCompanyProductByCompanyIdAndProductId(req.CompanyId, productId)
 	if err != nil {
@@ -1943,6 +1965,31 @@ func (this *CompanyApplyController) ApplyReceive() {
 		return
 	}
 
+	//如果是权益客户,在选择非研选行业试用时,需要判断当前有多少非研选的试用客户(试用状态,且行业是非研选)
+	if productId == utils.COMPANY_PRODUCT_RAI_ID {
+		permissionArr := strings.Split(req.PermissionIds, ",")
+		//如果所选行业不属于研选订阅跟研选扣点包,那就是非研选试用客户
+		var isNoResearch bool
+		for _, v := range permissionArr {
+			if v != strconv.Itoa(utils.CHART_PERMISSION_ID_YANXUAN) && v != strconv.Itoa(utils.YAN_XUAN_KOU_DIAN_BAO_ID) {
+				isNoResearch = true
+				continue
+			}
+		}
+		if isNoResearch {
+			tryOutCountRai, err := company.GetRaiCompanyTryOutCountNoResearch(sysUser.AdminId)
+			if err != nil {
+				br.Msg = "判断试用客户量失败"
+				br.ErrMsg = "判断试用客户量失败,Err:" + err.Error()
+				return
+			}
+			if tryOutCountRai >= utils.COMPANY_STATUS_TRY_OUT_COUNT_RAI {
+				br.Msg = "非研选试用客户最多30家"
+				return
+			}
+		}
+	}
+
 	//添加缓存,避免多次点击提交
 	{
 		deleteCache := true

+ 35 - 17
controllers/eta_business/eta_business.go

@@ -162,6 +162,14 @@ func (this *EtaBusinessController) PageList() {
 			cond += fmt.Sprintf(` AND %s = ?`, eta_business.EtaBusinessColumns.IndustryId)
 			pars = append(pars, industryId)
 		}
+
+		// 国家
+		nation := this.GetString("Nation", "")
+		nation = strings.TrimSpace(nation)
+		if nation != "" {
+			cond += ` AND nation = ? `
+			pars = append(pars, nation)
+		}
 	}
 
 	order := ``
@@ -228,6 +236,7 @@ func (this *EtaBusinessController) PageList() {
 		b.ExpiredTime = utils.TimeTransferString(utils.FormatDate, v.ExpiredTime)
 		b.CreateTime = v.CreateTime.Format(utils.FormatDateTime)
 		b.ModifyTime = v.ModifyTime.Format(utils.FormatDateTime)
+		b.Nation = v.Nation
 		items = append(items, b)
 	}
 
@@ -291,15 +300,18 @@ func (this *EtaBusinessController) Add() {
 		return
 	}
 	req.Province = strings.TrimSpace(req.Province)
-	if req.Province == "" {
-		br.Msg = "省份不可为空"
-		return
-	}
-	req.City = strings.TrimSpace(req.City)
-	if req.City == "" {
-		br.Msg = "城市不可为空"
-		return
+	if req.Nation == "" {
+		if req.Province == "" {
+			br.Msg = "省份不可为空"
+			return
+		}
+		req.City = strings.TrimSpace(req.City)
+		if req.City == "" {
+			br.Msg = "城市不可为空"
+			return
+		}
 	}
+
 	req.Leader = strings.TrimSpace(req.Leader)
 	if req.Leader == "" {
 		br.Msg = "决策人不可为空"
@@ -431,6 +443,7 @@ func (this *EtaBusinessController) Add() {
 	businessItem.ExpiredTime = expiredTime
 	businessItem.CreateTime = now
 	businessItem.ModifyTime = now
+	businessItem.Nation = req.Nation
 	contractItem := new(eta_business.EtaBusinessContract)
 	if !signTime.IsZero() && !expiredTime.IsZero() {
 		contractItem.SigningTime = signTime
@@ -505,16 +518,19 @@ func (this *EtaBusinessController) Edit() {
 		br.ErrMsg = "参数有误, 商家ID为空"
 		return
 	}
-	req.Province = strings.TrimSpace(req.Province)
-	if req.Province == "" {
-		br.Msg = "省份不可为空"
-		return
-	}
-	req.City = strings.TrimSpace(req.City)
-	if req.City == "" {
-		br.Msg = "城市不可为空"
-		return
+	if req.Nation == "" {
+		req.Province = strings.TrimSpace(req.Province)
+		if req.Province == "" {
+			br.Msg = "省份不可为空"
+			return
+		}
+		req.City = strings.TrimSpace(req.City)
+		if req.City == "" {
+			br.Msg = "城市不可为空"
+			return
+		}
 	}
+
 	req.Leader = strings.TrimSpace(req.Leader)
 	if req.Leader == "" {
 		br.Msg = "决策人不可为空"
@@ -566,6 +582,7 @@ func (this *EtaBusinessController) Edit() {
 	item.CapitalScale = req.CapitalScale
 	item.ResearchTeamSize = req.ResearchTeamSize
 	item.UserMax = req.UserMax
+	item.Nation = req.Nation
 	item.ModifyTime = time.Now().Local()
 	cols := []string{
 		"Province", "City", "Address", "Leader", "IndustryId", "IndustryName", "CapitalScale", "ResearchTeamSize", "UserMax", "ModifyTime",
@@ -1039,6 +1056,7 @@ func (this *EtaBusinessController) Detail() {
 	resp.ExpiredTime = utils.TimeTransferString(utils.FormatDate, item.ExpiredTime)
 	resp.CreateTime = item.CreateTime.Format(utils.FormatDateTime)
 	resp.ModifyTime = item.ModifyTime.Format(utils.FormatDateTime)
+	resp.Nation = item.Nation
 
 	br.Data = resp
 	br.Ret = 200

+ 36 - 0
controllers/sys_user.go

@@ -6,6 +6,7 @@ import (
 	"hongze/hz_crm_api/models"
 	"hongze/hz_crm_api/models/system"
 	"hongze/hz_crm_api/services"
+	"hongze/hz_crm_api/services/eta_forum"
 	"hongze/hz_crm_api/utils"
 	"time"
 )
@@ -356,3 +357,38 @@ func (this *SysUserController) AuthCodeLogin() {
 	br.Success = true
 	br.Msg = "获取成功"
 }
+
+// GetEtaForumAdminAuthCode
+// @Title 免密登录-获取登录ETA社区管理后台系统的编码
+// @Description 免密登录-获取登录ETA社区管理后台系统的编码
+// @Success 200 Ret=200 获取成功
+// @router /forum_admin/auth_code [get]
+func (this *SysUserAuthController) GetEtaForumAdminAuthCode() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		if br.ErrMsg == "" {
+			br.IsSendEmail = false
+		}
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	sysUser := this.SysUser
+	if sysUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser Is Empty"
+		br.Ret = 408
+		return
+	}
+
+	code, e := eta_forum.GetForumAdminAuthCode(sysUser.AdminName)
+	if e != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取登录编码失败, Err: " + e.Error()
+		return
+	}
+
+	br.Data = code
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+}

+ 164 - 0
controllers/yb_research_signup_statistics.go

@@ -0,0 +1,164 @@
+package controllers
+
+import (
+	"hongze/hz_crm_api/models"
+)
+
+// @Title 调研报名统计列表
+// @Description 获取分类
+// @Success 200 {object} models.BannerListResp
+// @router /research_statistics/list [get]
+func (this *BannerController) StatisticsList() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+
+	list, err := models.GetYbResearchSignupStatisticsItems()
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取失败,Err:" + err.Error()
+		return
+	}
+	resp := new(models.YbResearchSignupStatisticsResp)
+
+	for _, v := range list {
+		if v.Enable == 1 {
+			resp.OngoingList = append(resp.OngoingList, v)
+		} else {
+			resp.OverList = append(resp.OverList, v)
+		}
+	}
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = resp
+}
+
+// @Title 调研报名统计列表
+// @Description 获取分类
+// @Param   BannerId   query   int  true       "图片id"
+// @Success 200 {object} models.BannerListResp
+// @router /research_statistics/item [get]
+func (this *BannerController) StatisticsItem() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+
+	bannerId, _ := this.GetInt("BannerId")
+
+	if bannerId <= 0 {
+		br.Msg = "参数错误"
+		br.ErrMsg = "参数错误"
+		return
+	}
+	var resp models.YbResearchSignupStatisticsItemsResp
+
+
+	list, err := models.GetYbResearchSignupStatisticsItemsById(bannerId)
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "GetYbResearchSignupStatisticsItemsById,Err:" + err.Error()
+		return
+	}
+	resp.List = list
+	for _, v := range list {
+		resp.Total += v.Count
+	}
+
+	amountList, err := models.GetYbResearchSignupStatisticsAmount(bannerId)
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "GetYbResearchSignupStatisticsAmount,Err:" + err.Error()
+		return
+	}
+	for _, v := range amountList {
+		if v.Amount > 0 {
+			resp.HasPayed.Amount += v.Amount
+			resp.HasPayed.Count += 1
+		} else {
+			resp.NoPay.Count += 1
+		}
+	}
+	resp.HasPayed.Name = "已付款"
+	resp.NoPay.Name = "未付款"
+	resp.NoPay.Percentage = resp.NoPay.Count * 100 / resp.Total
+	resp.HasPayed.Percentage = resp.HasPayed.Count * 100 / resp.Total
+
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = resp
+}
+
+// @Title 调研报名统计列表
+// @Description 获取分类
+// @Param   Mobile   query   int  true       "分享人手机号"
+// @Success 200 {object} models.BannerListResp
+// @router /research_statistics/detail [get]
+func (this *BannerController) StatisticsDetail() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+
+	mobile := this.GetString("Mobile")
+	bannerId, _ := this.GetInt("BannerId")
+
+	if mobile == "" {
+		br.Msg = "参数错误"
+		br.ErrMsg = "参数错误"
+		return
+	}
+	list, err := models.GetYbResearchSignupStatisticsItemsByMobile(mobile, bannerId)
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取失败,Err:" + err.Error()
+		return
+	}
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = list
+}
+
+// @Title 调研报名统计列表
+// @Description 获取分类
+// @Param   Amount   query   float64  true       "付款金额"
+// @Param   YbResearchSignupStatisticsId   query   int  true       "报名id"
+// @Success 200 {object} models.BannerListResp
+// @router /research_statistics/amount [get]
+func (this *BannerController) Amount() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+
+	ybResearchSignupStatisticsId, _ := this.GetInt("YbResearchSignupStatisticsId")
+	amount, _ := this.GetFloat("Amount")
+
+	if ybResearchSignupStatisticsId <= 0 {
+		br.Msg = "参数错误"
+		br.ErrMsg = "参数错误"
+		return
+	}
+
+	err := models.UpdateYbResearchSignupStatisticsAmountById(amount, ybResearchSignupStatisticsId)
+	if err != nil {
+		br.Msg = "更新付款金额失败"
+		br.ErrMsg = "UpdateYbResearchSignupStatisticsAmountById,Err:" + err.Error()
+		return
+	}
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "修改成功"
+}

+ 86 - 68
models/company/company.go

@@ -145,74 +145,74 @@ func GetCompanySearchCount(condition string, pars []interface{}) (count int, err
 }
 
 type CompanyItem struct {
-	CompanyId        int    `orm:"column(company_id);pk"`
-	CompanyName      string `description:"客户名称"`
-	CreditCode       string `description:"社会统一信用码"`
-	CompanyCode      string `description:"客户编码"`
-	StartDate        string `description:"合同开始日期"`
-	EndDate          string `description:"合同结束日期"`
-	LoseReason       string `description:"流失原因"`
-	RenewalReason    string `description:"续约说明"`
-	FreezeReason     string `description:"冻结理由"`
-	LossTime         string `description:"流失时间"`
-	Status           string `description:"客户状态:'试用','永续','冻结','流失','正式' "`
-	StatusStr        string `description:"客户状态:'试用','永续','冻结','流失','正式' 如果是共享客户会加上 '(共享)'" `
-	CompanyType      string `description:"客户类型:ficc/权益"`
-	ApproveStatus    string `description:"审批状态:'待审批','已审批','驳回' 审批状态为空时,表示没有审批申请"`
-	SellerName       string `description:"销售:吉根龙/颖丹"`
-	SellerId         int    `description:"销售ID"`
-	SellerIds        string `description:"销售ID集合,包含ficc和权益的销售id"`
-	ShareSeller      string `description:"共享销售员"`
-	ShareSellerId    int    `description:"共享销售员id"`
-	ShareSellerIds   string `description:"共享销售员ids"`
-	PackageTypes     string `description:"套餐类型集合,包含ficc和权益的套餐类型" json:"-"`
-	FiccPackageType  int    `description:"ficc的套餐类型"`
-	ExpireDay        string `description:"到期天数"`
-	FreezeTime       string `description:"冻结时间"`
-	GroupId          int    `description:"分组id"`
-	GroupIds         string `description:"分组id集合,包含ficc和权益的小组id" json:"-"`
-	DepartmentId     int    `description:"部门id"`
-	IndustryName     string `description:"所属行业"`
-	IsSuspend        int    `description:"是否暂停:1:暂停,0:启用 "`
-	CreatedTime      string `description:"创建时间"`
-	Source           string `description:"客户来源"`
-	Province         string `description:"省"`
-	City             string `description:"市"`
-	Address          string `description:"详细地址"`
-	Reasons          string `description:"新增理由"`
-	FreezeStartDate  string `description:"冻结开始日期"`
-	FreezeEndDate    string `description:"冻结结束日期"`
-	FreezeExpireDays int    `description:"冻结到期天数"`
-	BtnItem          *ButtonPermission
-	ProductId        int                  `json:"-"`
-	ProductIds       string               `description:"产品id集合,包含ficc和权益的产品id" json:"-"`
-	FormalTime       string               `description:"转正时间"`
-	IsShared         bool                 `description:"是否共享客户"`
-	RegionType       string               `description:"区域:国内,海外"`
-	FiccLastViewTime string               `description:"ficc最近一次阅读时间"`
-	RaiLastViewTime  string               `description:"权益最近一次阅读时间"`
-	ViewTotals       string               `description:"阅读次数集合,包含ficc和权益的阅读次数" json:"-"`
-	LastViewTimes    string               `description:"最近一次阅读时间集合,包含ficc和权益的最近一次阅读时间" json:"-"`
-	FiccView         int                  `description:"Ficc报告阅读次数" json:"-"`
-	RaiView          int                  `description:"权益报告阅读次数" json:"-"`
-	RoadShowTotal    int                  `description:"累计路演次数"`
-	TodoStatuss      string               `description:"任务状态"`
-	TryStageStr      string               `description:"试用客户子标签"`
-	TryStageSlice    []*TryStageSliceItem `description:"试用状态相关"`
-	AllViewTotal     int                  `description:"总阅读数"`
-	Deadline         string               `description:"未完成的todo任务的截止日期,截止目前还剩余的天数"`
-	TodoEndTimeStr   string               `description:"未完成的todo任务的截止日期拼接格式"`
-	TodoEndTime      time.Time            `description:"未完成的todo任务的截止日期"`
-	TryOutDayTotals  string               `description:"试用天数集合,包含ficc和权益的试用天数" json:"-"`
-	FiccTryOutDay    int                  `description:"Ficc试用天数" json:"-"`
-	RaiTryOutDay     int                  `description:"权益试用天数" json:"-"`
-	WeekViewActive   int                  `description:"周阅读活跃: 0-七日内无阅读; 1-活跃"`
-	IsShare          int                  `description:"0:非共享用户,1:共享客户"`
-	LastServiceTime  string               `description:"最后服务时间"`
-	ServiceTimes     int                  `description:"服务次数"`
-	CloseReason      string               `description:"关闭原因"`
-	CloseTime        string               `description:"关闭时间"`
-	Nation           string               `description:"所属国家"`
+	CompanyId           int    `orm:"column(company_id);pk"`
+	CompanyName         string `description:"客户名称"`
+	CreditCode          string `description:"社会统一信用码"`
+	CompanyCode         string `description:"客户编码"`
+	StartDate           string `description:"合同开始日期"`
+	EndDate             string `description:"合同结束日期"`
+	LoseReason          string `description:"流失原因"`
+	RenewalReason       string `description:"续约说明"`
+	FreezeReason        string `description:"冻结理由"`
+	LossTime            string `description:"流失时间"`
+	Status              string `description:"客户状态:'试用','永续','冻结','流失','正式' "`
+	StatusStr           string `description:"客户状态:'试用','永续','冻结','流失','正式' 如果是共享客户会加上 '(共享)'" `
+	CompanyType         string `description:"客户类型:ficc/权益"`
+	ApproveStatus       string `description:"审批状态:'待审批','已审批','驳回' 审批状态为空时,表示没有审批申请"`
+	SellerName          string `description:"销售:吉根龙/颖丹"`
+	SellerId            int    `description:"销售ID"`
+	SellerIds           string `description:"销售ID集合,包含ficc和权益的销售id"`
+	ShareSeller         string `description:"共享销售员"`
+	ShareSellerId       int    `description:"共享销售员id"`
+	ShareSellerIds      string `description:"共享销售员ids"`
+	PackageTypes        string `description:"套餐类型集合,包含ficc和权益的套餐类型" json:"-"`
+	FiccPackageType     int    `description:"ficc的套餐类型"`
+	ExpireDay           string `description:"到期天数"`
+	FreezeTime          string `description:"冻结时间"`
+	GroupId             int    `description:"分组id"`
+	GroupIds            string `description:"分组id集合,包含ficc和权益的小组id" json:"-"`
+	DepartmentId        int    `description:"部门id"`
+	IndustryName        string `description:"所属行业"`
+	IsSuspend           int    `description:"是否暂停:1:暂停,0:启用 "`
+	CreatedTime         string `description:"创建时间"`
+	Source              string `description:"客户来源"`
+	Province            string `description:"省"`
+	City                string `description:"市"`
+	Address             string `description:"详细地址"`
+	Reasons             string `description:"新增理由"`
+	FreezeStartDate     string `description:"冻结开始日期"`
+	FreezeEndDate       string `description:"冻结结束日期"`
+	FreezeExpireDays    int    `description:"冻结到期天数"`
+	BtnItem             *ButtonPermission
+	ProductId           int                  `json:"-"`
+	ProductIds          string               `description:"产品id集合,包含ficc和权益的产品id" json:"-"`
+	FormalTime          string               `description:"转正时间"`
+	IsShared            bool                 `description:"是否共享客户"`
+	RegionType          string               `description:"区域:国内,海外"`
+	FiccLastViewTime    string               `description:"ficc最近一次阅读时间"`
+	RaiLastViewTime     string               `description:"权益最近一次阅读时间"`
+	ViewTotals          string               `description:"阅读次数集合,包含ficc和权益的阅读次数" json:"-"`
+	LastViewTimes       string               `description:"最近一次阅读时间集合,包含ficc和权益的最近一次阅读时间" json:"-"`
+	FiccView            int                  `description:"Ficc报告阅读次数" json:"-"`
+	RaiView             int                  `description:"权益报告阅读次数" json:"-"`
+	RoadShowTotal       int                  `description:"累计路演次数"`
+	TodoStatuss         string               `description:"任务状态"`
+	TryStageStr         string               `description:"试用客户子标签"`
+	TryStageSlice       []*TryStageSliceItem `description:"试用状态相关"`
+	AllViewTotal        int                  `description:"总阅读数"`
+	Deadline            string               `description:"未完成的todo任务的截止日期,截止目前还剩余的天数"`
+	TodoEndTimeStr      string               `description:"未完成的todo任务的截止日期拼接格式"`
+	TodoEndTime         time.Time            `description:"未完成的todo任务的截止日期"`
+	TryOutDayTotals     string               `description:"试用天数集合,包含ficc和权益的试用天数" json:"-"`
+	FiccTryOutDay       int                  `description:"Ficc试用天数" json:"-"`
+	RaiTryOutDay        int                  `description:"权益试用天数" json:"-"`
+	WeekViewActive      int                  `description:"周阅读活跃: 0-七日内无阅读; 1-活跃"`
+	IsShare             int                  `description:"0:非共享用户,1:共享客户"`
+	LastServiceTime     string               `description:"最后服务时间"`
+	ServiceTimes        int                  `description:"服务次数"`
+	CloseReason         string               `description:"关闭原因"`
+	CloseTime           string               `description:"关闭时间"`
+	Nation              string               `description:"所属国家"`
 	LatestServiceRecord time.Time            `description:"最近沟通时间"`
 	FirstDate           time.Time            `description:"首次服务时间"`
 }
@@ -690,6 +690,24 @@ func GetCompanyTryOutCount(status string, sellerId int) (count int, err error) {
 	return
 }
 
+// 获取权益销售开通的非研选试用客户数量
+func GetRaiCompanyTryOutCountNoResearch(sellerId int) (count int, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT
+			COUNT( DISTINCT a.company_id ) AS count
+		FROM
+			company AS a
+			INNER JOIN company_product AS b ON a.company_id = b.company_id
+			INNER JOIN company_report_permission AS p ON p.company_id = a.company_id 
+		WHERE
+			b.status = '试用' 
+			AND p.status = '试用' 
+			AND b.seller_id = ? 
+			AND p.chart_permission_id  NOT IN(31,52) `
+	err = o.Raw(sql, sellerId).QueryRow(&count)
+	return
+}
+
 type CompanySearchResp struct {
 	List []*CompanyItem
 }

+ 4 - 0
models/eta_business/eta_business.go

@@ -41,6 +41,7 @@ type EtaBusiness struct {
 	ExpiredTime      time.Time `description:"当前合约的到期时间"`
 	CreateTime       time.Time `description:"创建时间"`
 	ModifyTime       time.Time `description:"更新时间"`
+	Nation           string    `description:"所属国家"`
 }
 
 func (m *EtaBusiness) TableName() string {
@@ -247,6 +248,7 @@ type EtaBusinessAddReq struct {
 	SigningTime      string `description:"签约时间"`
 	ExpiredTime      string `description:"到期时间"`
 	IsCheck          bool   `description:"是否只做校验而不实际新增(业务操作上基础信息和签约时间分成两个步骤了)"`
+	Nation           string `description:"所属国家"`
 }
 
 // EtaBusinessEditReq 编辑商家请求体
@@ -260,6 +262,7 @@ type EtaBusinessEditReq struct {
 	CapitalScale     string `description:"资金规模"`
 	ResearchTeamSize string `description:"研究团队规模"`
 	UserMax          int    `description:"用户上限"`
+	Nation           string `description:"所属国家"`
 }
 
 // EtaBusinessSigningReq 商家签约请求体
@@ -325,4 +328,5 @@ type EtaBusinessItem struct {
 	ExpiredTime      string `description:"当前合约的到期时间"`
 	CreateTime       string `description:"创建时间"`
 	ModifyTime       string `description:"更新时间"`
+	Nation           string `description:"所属国家"`
 }

+ 140 - 0
models/yb_research_signup_statistics.go

@@ -0,0 +1,140 @@
+package models
+
+import (
+	"github.com/beego/beego/v2/client/orm"
+	"time"
+)
+
+// YbResearchSignupStatistics 调研报名统计结构体
+type YbResearchSignupStatistics struct {
+	YbResearchSignupStatisticsId int       // 主键ID
+	UserId                       int       // 分享人ID
+	RealName                     string    // 分享人姓名
+	Mobile                       string    // 分享人手机号
+	CompanyName                  string    // 公司名称
+	BannerId                     int       // 活动ID
+	CreateTime                   time.Time // 创建时间
+	Amount                       float64   // 付款金额
+	CustomName                   string    // 报名人姓名
+	CustomMobile                 string    // 报名人手机号
+	CustomCompanyName            string    // 报名人公司名称
+}
+
+type YbResearchSignupStatisticsListItem struct {
+	YbResearchSignupStatisticsId int     // 主键ID
+	BannerId                     int     // 活动ID
+	Amount                       float64 // 付款金额
+	Count                        int     // 报名人数
+	Remark                       string  // 备注-活动名称
+	StartDate                    string  // 活动开始时间
+	EndDate                      string  // 活动结束时间
+	Enable                       int     // 1:有效,0:禁用
+}
+
+func GetYbResearchSignupStatisticsItems() (items []*YbResearchSignupStatisticsListItem, err error) {
+	sql := ` SELECT
+	a.*,
+	b.start_date,
+	b.end_date,
+	b.remark,
+	b.enable,
+	COUNT( 1 ) AS count 
+FROM
+	yb_research_signup_statistics AS a
+	INNER JOIN banner AS b ON a.banner_id = b.id 
+WHERE
+	1 = 1 
+GROUP BY
+	a.banner_id 
+ORDER BY
+	start_date DESC `
+	o := orm.NewOrm()
+	_, err = o.Raw(sql).QueryRows(&items)
+	return
+}
+
+type YbResearchSignupStatisticsResp struct {
+	OngoingList []*YbResearchSignupStatisticsListItem
+	OverList    []*YbResearchSignupStatisticsListItem
+}
+
+type YbResearchSignupStatisticsItem struct {
+	YbResearchSignupStatisticsId int     // 主键ID
+	UserId                       int     // 分享人ID
+	RealName                     string  // 分享人姓名
+	Mobile                       string  // 分享人手机号
+	CompanyName                  string  // 公司名称
+	BannerId                     int     // 活动ID
+	CreateTime                   string  // 创建时间
+	Amount                       float64 // 付款金额
+	CustomName                   string  // 报名人姓名
+	CustomMobile                 string  // 报名人手机号
+	CustomCompanyName            string  // 报名人公司名称
+	Count                        int     // 报名人数
+	Enable                       int     // 1:有效,0:禁用
+}
+
+type YbResearchSignupStatisticsItemsResp struct {
+	List     []*YbResearchSignupStatisticsItem
+	Total    int
+	HasPayed PayItem
+	NoPay    PayItem
+}
+type PayItem struct {
+	Name       string
+	Count      int
+	Amount     float64
+	Percentage int
+}
+
+func GetYbResearchSignupStatisticsItemsById(bannerId int) (items []*YbResearchSignupStatisticsItem, err error) {
+	sql := ` SELECT
+	*,count(1) as count
+FROM
+	yb_research_signup_statistics 
+WHERE
+	1 = 1 and banner_id = ?
+GROUP BY
+	mobile 
+ORDER BY
+	count DESC `
+	o := orm.NewOrm()
+	_, err = o.Raw(sql, bannerId).QueryRows(&items)
+	return
+}
+
+func GetYbResearchSignupStatisticsItemsByMobile(mobile string, bannerId int) (items []*YbResearchSignupStatisticsItem, err error) {
+	sql := `SELECT
+	a.*,b.enable
+FROM
+	yb_research_signup_statistics AS a
+	INNER JOIN banner AS b ON a.banner_id = b.id 
+WHERE
+	1 = 1 AND mobile = ? and banner_id = ? 
+ORDER BY
+	create_time DESC `
+	o := orm.NewOrm()
+	_, err = o.Raw(sql, mobile, bannerId).QueryRows(&items)
+	return
+}
+
+// UpdateYbResearchSignupStatistics 更新付款金额
+func UpdateYbResearchSignupStatisticsAmountById(amount float64, id int) (err error) {
+	o := orm.NewOrm()
+	sql := `UPDATE yb_research_signup_statistics SET amount=? WHERE yb_research_signup_statistics_id=?`
+	_, err = o.Raw(sql, amount, id).Exec()
+	return
+}
+
+func GetYbResearchSignupStatisticsAmount(bannerId int) (items []*YbResearchSignupStatisticsListItem, err error) {
+	sql := ` SELECT
+	a.*
+FROM
+	yb_research_signup_statistics AS a
+	INNER JOIN banner AS b ON a.banner_id = b.id 
+WHERE
+	1 = 1 AND a.banner_id = ? `
+	o := orm.NewOrm()
+	_, err = o.Raw(sql, bannerId).QueryRows(&items)
+	return
+}

+ 45 - 0
routers/commentsRouter.go

@@ -8935,6 +8935,42 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["hongze/hz_crm_api/controllers:BannerController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers:BannerController"],
+        beego.ControllerComments{
+            Method: "Amount",
+            Router: `/research_statistics/amount`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hz_crm_api/controllers:BannerController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers:BannerController"],
+        beego.ControllerComments{
+            Method: "StatisticsDetail",
+            Router: `/research_statistics/detail`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hz_crm_api/controllers:BannerController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers:BannerController"],
+        beego.ControllerComments{
+            Method: "StatisticsItem",
+            Router: `/research_statistics/item`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hz_crm_api/controllers:BannerController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers:BannerController"],
+        beego.ControllerComments{
+            Method: "StatisticsList",
+            Router: `/research_statistics/list`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["hongze/hz_crm_api/controllers:BannerController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers:BannerController"],
         beego.ControllerComments{
             Method: "BannerStatistic",
@@ -11320,6 +11356,15 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["hongze/hz_crm_api/controllers:SysUserAuthController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers:SysUserAuthController"],
+        beego.ControllerComments{
+            Method: "GetEtaForumAdminAuthCode",
+            Router: `/forum_admin/auth_code`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["hongze/hz_crm_api/controllers:SysUserAuthController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers:SysUserAuthController"],
         beego.ControllerComments{
             Method: "GetEtaAuthCode",

+ 54 - 0
services/eta_forum/eta_forum_hub.go

@@ -0,0 +1,54 @@
+package eta_forum
+
+import (
+	"encoding/json"
+	"fmt"
+)
+
+type GetForumAdminAuthCodeResp struct {
+	Ret         int
+	Msg         string
+	ErrMsg      string
+	ErrCode     string
+	Data        *LoginAuthCode
+	Success     bool `description:"true 执行成功,false 执行失败"`
+	IsSendEmail bool `json:"-" description:"true 发送邮件,false 不发送邮件"`
+	IsAddLog    bool `json:"-" description:"true 新增操作日志,false 不新增操作日志" `
+}
+type LoginAuthCode struct {
+	AuthCode string `json:"auth_code" description:"登录凭证"`
+}
+
+// GetLoginAuthCodeReq 获取登录编码请求体
+type GetLoginAuthCodeReq struct {
+	AdminName string `description:"用户名"`
+	Source    int    `description:"来源: 1-CRM; 2-ETA"`
+}
+
+// GetForumAdminAuthCode 获取登录凭证
+func GetForumAdminAuthCode(adminName string) (authCode string, err error) {
+	// 查询图表信息
+	param := GetLoginAuthCodeReq{
+		Source:    1,
+		AdminName: adminName,
+	}
+	reqJson, e := json.Marshal(param)
+	if e != nil {
+		err = fmt.Errorf("data json marshal err: %s", e.Error())
+		return
+	}
+	respItem, err := GetForumAdminAuthCodeLib(string(reqJson))
+	if err != nil {
+		err = fmt.Errorf("获取登录凭证,Err:" + err.Error())
+		return
+	}
+	if respItem.Ret != 200 {
+		err = fmt.Errorf("获取登录凭证,Err:" + respItem.ErrMsg)
+		return
+	}
+
+	if respItem.Data != nil {
+		authCode = respItem.Data.AuthCode
+	}
+	return
+}

+ 65 - 0
services/eta_forum/eta_forum_hub_lib.go

@@ -0,0 +1,65 @@
+package eta_forum
+
+import (
+	"encoding/json"
+	"fmt"
+	"hongze/hz_crm_api/models"
+	"hongze/hz_crm_api/utils"
+
+	"io/ioutil"
+	"net/http"
+	"strings"
+)
+
+// GetForumAdminAuthCodeLib 获取登录凭证
+func GetForumAdminAuthCodeLib(req string) (resp *GetForumAdminAuthCodeResp, err error) {
+	_, resultByte, err := post(req, "/v1/auth/auth_code")
+	err = json.Unmarshal(resultByte, &resp)
+	if err != nil {
+		return
+	}
+	return
+}
+
+// post
+func post(paramStr string, urlStr string) (resp *models.BaseResponse, result []byte, err error) {
+	if utils.ETA_FORUM_HUB_URL == "" {
+		err = fmt.Errorf("ETA社区桥接服务地址为空")
+		return
+	}
+	postUrl := utils.ETA_FORUM_HUB_URL + urlStr
+	result, err = HttpPost(postUrl, paramStr, "application/json")
+	if err != nil {
+		err = fmt.Errorf("调用ETA社区桥接服务接口失败 error:%s", err.Error())
+		return
+	}
+	err = json.Unmarshal(result, &resp)
+	if err != nil {
+		return
+	}
+
+	return
+}
+
+func HttpPost(url, postData string, params ...string) ([]byte, error) {
+	body := ioutil.NopCloser(strings.NewReader(postData))
+	client := &http.Client{}
+	req, err := http.NewRequest("POST", url, body)
+	if err != nil {
+		return nil, err
+	}
+	contentType := "application/x-www-form-urlencoded;charset=utf-8"
+	if len(params) > 0 && params[0] != "" {
+		contentType = params[0]
+	}
+	req.Header.Set("Content-Type", contentType)
+	req.Header.Set("authorization", utils.MD5(utils.ETA_FORUM_HUB_NAME_EN+utils.ETA_FORUM_HUB_MD5_KEY))
+	resp, err := client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer resp.Body.Close()
+	b, err := ioutil.ReadAll(resp.Body)
+	utils.FileLog.Debug("HttpPost:" + string(b))
+	return b, err
+}

+ 21 - 0
utils/config.go

@@ -160,6 +160,13 @@ var MayCurBaseUrl string
 // CrmEtaServerUrl CRM-ETA服务地址
 var CrmEtaServerUrl string
 
+// eta_forum_hub ETA社区桥接服务地址
+var (
+	ETA_FORUM_HUB_URL     string
+	ETA_FORUM_HUB_NAME_EN string
+	ETA_FORUM_HUB_MD5_KEY string
+)
+
 func init() {
 	tmpRunMode, err := web.AppConfig.String("run_mode")
 	if err != nil {
@@ -276,6 +283,13 @@ ZwIDAQAB
 
 		// CRM-ETA服务地址
 		CrmEtaServerUrl = "http://127.0.0.1:8708"
+
+		// eta_forum_hub ETA社区桥接服务地址
+		{
+			ETA_FORUM_HUB_URL = config["eta_forum_hub_url"]
+			ETA_FORUM_HUB_NAME_EN = config["eta_forum_hub_name_en"]
+			ETA_FORUM_HUB_MD5_KEY = config["eta_forum_hub_md5_key"]
+		}
 	} else {
 
 		TemplateRedirectUrl = "http://rddpweb.brilliantstart.cn/reportdtl?id="
@@ -317,6 +331,13 @@ ZwIDAQAB
 
 		// CRM-ETA服务地址
 		CrmEtaServerUrl = "http://127.0.0.1:8702"
+
+		// eta_forum_hub ETA社区桥接服务地址
+		{
+			ETA_FORUM_HUB_URL = config["eta_forum_hub_url"]
+			ETA_FORUM_HUB_NAME_EN = config["eta_forum_hub_name_en"]
+			ETA_FORUM_HUB_MD5_KEY = config["eta_forum_hub_md5_key"]
+		}
 	}
 	tmpLibreOfficePath, err := web.AppConfig.String("libreOfficePath")
 	if err != nil {