Browse Source

Merge branch 'debug' of http://8.136.199.33:3000/hongze/hz_crm_api into bzq/fix_help_cf

zqbao 6 months ago
parent
commit
2e4f28e282

+ 40 - 20
controllers/company.go

@@ -384,6 +384,11 @@ func (this *CompanyController) SearchList() {
 			btnItem.IsResearchShow = true
 		}
 		list[i].BtnItem = btnItem
+
+		// 签约未签约按钮回显展示
+		btnCompanyStatusItem := new(company.CompanyStatusButton)
+		btnCompanyStatusItem = services.GetLsitCompanyStatusButton(list[i].CompanyType, list[i].Status, list[i].SigningStatus)
+		list[i].CompanyStatusButton = btnCompanyStatusItem
 	}
 
 	for _, v := range list {
@@ -429,6 +434,7 @@ func (this *CompanyController) SearchList() {
 // @Param   SortByTodo   query   bool  true       "是否根据待办排序,true或false"
 // @Param   TryStage   query   int  false       "试用客户子标签:0全部、1未分类、2 推进、3 跟踪、4 预备"
 // @Param   IncludeShare   query   bool  true       "是否包含共享客户: true-包含; false-不包含"
+// @Param   IsSigning   query   int  true       "是否签约过: -1-默认全部; 0-否; 1-是"
 // @Success 200 {object} company.CompanyListResp
 // @router /list [get]
 func (this *CompanyController) List() {
@@ -468,6 +474,7 @@ func (this *CompanyController) List() {
 	todoStatus := this.GetString("TodoStatus")      //任务状态
 	tryStage, _ := this.GetInt("TryStage")          //试用客户标签
 	includeShare, _ := this.GetBool("IncludeShare") // 是否包含试用客户
+	isSigning, _ := this.GetInt("IsSigning", -1)
 
 	// 套餐类型
 	packageType, _ := this.GetInt("PackageType")
@@ -586,6 +593,12 @@ func (this *CompanyController) List() {
 		pars = append(pars, regionType)
 	}
 
+	//是否签约过
+	if isSigning == 0 || isSigning == 1 {
+		condition += ` AND b.is_signing = ?  `
+		pars = append(pars, isSigning)
+	}
+
 	if keyWord != "" {
 		companyIdStr, err := company.GetCompanyIdByKeyWord(keyWord)
 		if err != nil {
@@ -1352,6 +1365,11 @@ func (this *CompanyController) List() {
 		}
 		btnItem.BtnServiceRecord = btnServiceRecordMap[list[i].CompanyId]
 
+		// 签约未签约按钮回显展示
+		btnCompanyStatusItem := new(company.CompanyStatusButton)
+		btnCompanyStatusItem = services.GetLsitCompanyStatusButton(list[i].CompanyType, list[i].Status, list[i].SigningStatus)
+		list[i].CompanyStatusButton = btnCompanyStatusItem
+
 		//productIdArr := strings.Split(item.ProductIds, "/")
 		//// 套餐类型
 		//packageTypeArr := strings.Split(item.PackageTypes, "/")
@@ -1755,26 +1773,28 @@ func (this *CompanyController) List() {
 				//RaiView:          viewTotal[1],
 				//FiccView: ficcViewTotal,
 				//RaiView:  raiViewTotal,
-				FiccView:        v.FiccView,
-				RaiView:         v.RaiView,
-				FiccTryOutDay:   v.FiccTryOutDay,
-				RaiTryOutDay:    v.RaiTryOutDay,
-				AllViewTotal:    v.AllViewTotal,
-				RoadShowTotal:   v.RoadShowTotal,
-				TodoStatus:      todoStatus,
-				CanConfirm:      canConfirm,
-				HiddenConfirm:   hiddenConfirm,
-				HiddenCreate:    hiddenCreate,
-				TodoButtonColor: todoButtonColor,
-				TryStageSlice:   v.TryStageSlice,
-				Deadline:        v.Deadline,
-				WeekViewActive:  v.WeekViewActive,
-				IsShare:         v.IsShare,
-				CloseTime:       v.CloseTime,
-				CloseReason:     v.CloseReason,
-				ShareSellerId:   v.ShareSellerId,
-				ShareSellerIds:  v.ShareSellerIds,
-				IsUserMaker:     v.IsUserMaker,
+				FiccView:            v.FiccView,
+				RaiView:             v.RaiView,
+				FiccTryOutDay:       v.FiccTryOutDay,
+				RaiTryOutDay:        v.RaiTryOutDay,
+				AllViewTotal:        v.AllViewTotal,
+				RoadShowTotal:       v.RoadShowTotal,
+				TodoStatus:          todoStatus,
+				CanConfirm:          canConfirm,
+				HiddenConfirm:       hiddenConfirm,
+				HiddenCreate:        hiddenCreate,
+				TodoButtonColor:     todoButtonColor,
+				TryStageSlice:       v.TryStageSlice,
+				Deadline:            v.Deadline,
+				WeekViewActive:      v.WeekViewActive,
+				IsShare:             v.IsShare,
+				CloseTime:           v.CloseTime,
+				CloseReason:         v.CloseReason,
+				IsSigning:           v.IsSigning,
+				CompanyStatusButton: v.CompanyStatusButton,
+				ShareSellerId:       v.ShareSellerId,
+				ShareSellerIds:      v.ShareSellerIds,
+				IsUserMaker:         v.IsUserMaker,
 			}
 			if v.ShareSellerIds != "" {
 				shareSellerIds := strings.Split(v.ShareSellerIds, ",")

+ 42 - 0
controllers/company_user.go

@@ -16,6 +16,7 @@ import (
 	"hongze/hz_crm_api/models/system"
 	"hongze/hz_crm_api/models/yb"
 	"hongze/hz_crm_api/services"
+	"hongze/hz_crm_api/services/alarm_msg"
 	cygxService "hongze/hz_crm_api/services/cygx"
 	"hongze/hz_crm_api/services/elastic"
 	"hongze/hz_crm_api/utils"
@@ -1658,6 +1659,11 @@ func (this *CompanyUserController) EditUser() {
 		br.Msg = "获取信息失败"
 		return
 	}
+	//如果用户已经存在名片的情况下,但是二次编辑的时候前端没传名片信息,那么名片信息不做任何变更,并发送异常信息提醒
+	if wxUser.BusinessCardUrl != "" && req.BusinessCardUrl == "" {
+		req.BusinessCardUrl = wxUser.BusinessCardUrl
+		go alarm_msg.SendAlarmMsg(fmt.Sprint("用户已经存在名片的情况下,但是二次编辑的时候前端没传名片信息。操作销售:", sysUser.RealName, "被操作UserId:", req.UserId), 3)
+	}
 
 	//获取当前操作员产品权限
 	companyProductList, productErr := getSysCompanyProductList(productId, wxUser.CompanyId)
@@ -6325,6 +6331,42 @@ func (this *CompanyUserController) UpadteUserYanxuanPermission() {
 	br.Msg = "操作成功"
 }
 
+// @Title 客户联系人详情
+// @Description 客户联系人详情接口
+// @Param   UserId  query  int	  true  "用户ID"
+// @router /user/detail [get]
+func (this *CompanyUserController) DetailUser() {
+	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
+	}
+	userId, _ := this.GetInt("UserId")
+	if userId <= 0 {
+		br.Msg = "参数错误!"
+		return
+	}
+	wxUser, err := models.GetWxUserByUserId(userId)
+	if err != nil {
+		br.ErrMsg = "获取信息失败,Err:" + err.Error()
+		br.Msg = "获取信息失败"
+		return
+	}
+	resp := new(models.WxUserResp)
+	resp.Detail = wxUser
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = resp
+}
+
 // ListByReport
 // @Title 联系人列表
 // @Description 联系人列表接口

+ 4 - 0
controllers/cygx/apply_record.go

@@ -175,6 +175,8 @@ func (this *ApplyRecordController) ListSysRole() {
 			list[i].CompanyIdTypeName = "现有客户(冻结)"
 		case 8:
 			list[i].CompanyIdTypeName = "现有客户(流失)"
+		case 9:
+			list[i].CompanyIdTypeName = "永续客户"
 		}
 
 		switch v.RegisterPlatform {
@@ -184,6 +186,8 @@ func (this *ApplyRecordController) ListSysRole() {
 			list[i].ApplicationSource = "网页版"
 		case 5:
 			list[i].ApplicationSource = "研选小程序"
+		case 6:
+			list[i].ApplicationSource = "买方研选网页版"
 		}
 
 		switch v.InviteCompanySource {

+ 2 - 2
controllers/cygx/contract_allocation.go

@@ -616,7 +616,7 @@ func (this *ContractAllocationController) CompanyContracDetail() {
 	} else {
 		resp.TotalPointsContent = fmt.Sprint(resp.Money, "W")
 	}
-	sysUserList, err := cygx.GetAskEmailList()
+	sysUserList, err := cygx.GetAskEmailListPoint()
 	if err != nil {
 		br.Msg = "获取失败"
 		br.ErrMsg = "获取失败,GetAskEmailList Err: " + err.Error()
@@ -1035,7 +1035,7 @@ func (this *ContractAllocationController) CompanyContractStatistics() {
 		}
 	}
 
-	sysUserList, err := cygx.GetAskEmailList()
+	sysUserList, err := cygx.GetAskEmailListPoint()
 	if err != nil {
 		br.Msg = "获取失败"
 		br.ErrMsg = "获取失败,GetAskEmailList Err: " + err.Error()

+ 1 - 1
controllers/cygx/enter_score.go

@@ -117,7 +117,7 @@ func (this *EnterScoreController) EnterScoreDetail() {
 	var itemsGroup []*cygx.EnterScoreGroupListResp                     //自定义分组
 	if enterScoreId == 0 {
 		//权益研究员
-		sysUserList, err := cygx.GetAskEmailList()
+		sysUserList, err := cygx.GetAskEmailListPoint()
 		if err != nil {
 			br.Msg = "获取失败"
 			br.ErrMsg = "获取失败,GetAskEmailList Err: " + err.Error()

+ 1 - 1
controllers/cygx/report_selection.go

@@ -199,7 +199,7 @@ func (this *ReportSelectionController) PreserveAndPublish() {
 	//			}
 	//		}
 	//	}
-	//	existMap[v.ChartPermissionId] = v.ChartPermissionId
+	//	existMap[v.ChartPermissionId] = v.ChartPermissionId 0
 	//}
 	go cygxService.UpdateReportSelectionResourceData(req.ArticleId) //首页最新页面数据逻辑处理 V11.1.1
 	br.Ret = 200

+ 2 - 1
controllers/eta_business/eta_business_menu.go

@@ -475,10 +475,11 @@ func (this *EtaBusinessMenuController) Edit() {
 	item.Component = req.Component
 	item.Hidden = req.Hidden
 	item.ButtonCode = req.ButtonCode
+	item.ParentId = req.ParentId
 	item.ModifyTime = time.Now().Local()
 	// TODO:多级菜单
 	cols := make([]string, 0)
-	cols = append(cols, "Name", "Sort", "Path", "IconPath", "Component", "Hidden", "ButtonCode", "ModifyTime")
+	cols = append(cols, "Name", "Sort", "Path", "IconPath", "Component", "Hidden", "ButtonCode", "ParentId", "ModifyTime")
 	if item.ParentId > 0 {
 		item.LevelPath = item.Component
 		cols = append(cols, "LevelPath")

+ 1 - 1
controllers/overseas_custom/custom.go

@@ -304,7 +304,7 @@ func (this *OverseasCustomController) CustomStatusSet() {
 		enCompanyObj.CompanyId = req.CompanyId - utils.EnCompanyIdStep
 		enCompanyObj.OverseasStatus = overseasStatus
 		enCompanyObj.ModifyTime = nowTime
-		enCompanyObj.ResetBtn = resetBtn
+		enCompanyObj.ResetBtn = resetBtn //转正式和重置按钮:同步过来默认为0:显示转正式为1:显示重置为2
 		updateCols := []string{"OverseasStatus", "ResetBtn", "ModifyTime"}
 		if err = enCompanyObj.Update(updateCols); err != nil {
 			br.Msg = "设置失败"

+ 3 - 32
controllers/roadshow/calendar.go

@@ -73,7 +73,7 @@ func (this *CalendarController) Add() {
 	var checkIsAdd []string
 
 	//获取所有自定义的权益研究员
-	sysUserList, err := cygx.GetAskEmailList()
+	sysUserList, err := cygx.GetAskEmailListResearcher()
 	if err != nil {
 		br.Msg = "获取失败"
 		br.ErrMsg = "获取失败,GetAskEmailList Err: " + err.Error()
@@ -84,17 +84,6 @@ func (this *CalendarController) Add() {
 		raiAskadminMap[v.AdminId] = true
 	}
 
-	sysUserFwang, e := system.GetSysUserByAdminName("fwang") // 手动拼接王芳到权益的策略行业下 start
-	if e != nil {
-		if e.Error() == utils.ErrNoRow() {
-			br.Msg = "用户不存在, 请检查"
-			return
-		}
-		br.Msg = "账号错误, 请重新输入"
-		br.ErrMsg = "fwang 用户名获取用户失败, Err: " + e.Error()
-		return
-	}
-	raiAskadminMap[sysUserFwang.AdminId] = true // 手动拼接王芳到权益的策略行业下 end
 	//var tipMsg string
 	for _, v := range req.ResearcherList {
 		if v.ResearcherId <= 0 {
@@ -624,7 +613,7 @@ func (this *CalendarController) Edit() {
 	for _, ev := range existList {
 		existResearcherMap[ev.ResearcherId] = ev.ResearcherName
 	}
-	sysUserList, err := cygx.GetAskEmailList()
+	sysUserList, err := cygx.GetAskEmailListResearcher()
 	if err != nil {
 		br.Msg = "获取失败"
 		br.ErrMsg = "获取失败,GetAskEmailList Err: " + err.Error()
@@ -1070,7 +1059,7 @@ func (this *CalendarController) ResearcherList() {
 	for _, v := range sysUserList {
 		adminMap[v.AdminId] = v
 	}
-	askUserList, err := cygx.GetAskEmailList()
+	askUserList, err := cygx.GetAskEmailListResearcher()
 	if err != nil {
 		br.Msg = "获取失败"
 		br.ErrMsg = "获取失败,GetAskEmailList Err: " + err.Error()
@@ -1088,24 +1077,6 @@ func (this *CalendarController) ResearcherList() {
 		mapPermissionId[v.PermissionName] = v.ChartPermissionId
 	}
 
-	sysUserFwang, e := system.GetSysUserByAdminName("fwang") // 手动拼接王芳到权益的策略行业下 start
-	if e != nil {
-		if e.Error() == utils.ErrNoRow() {
-			br.Msg = "用户不存在, 请检查"
-			return
-		}
-		br.Msg = "账号错误, 请重新输入"
-		br.ErrMsg = "fwang 用户名获取用户失败, Err: " + e.Error()
-		return
-	}
-	itemFwang := new(roadshow.ResearcherGroup)
-	itemFwang.AdminId = sysUserFwang.AdminId
-	itemFwang.GroupId = sysUserFwang.GroupId
-	itemFwang.GroupName = sysUserFwang.GroupName
-	itemFwang.RealName = sysUserFwang.RealName
-	itemFwang.RoleTypeCode = sysUserFwang.RoleTypeCode
-	mapPermissionUser["策略"] = append(mapPermissionUser["策略"], itemFwang) // 手动拼接王芳到权益的策略行业下 end
-
 	for _, v := range askUserList {
 		if admin, ok := adminMap[v.AdminId]; ok {
 			item := &roadshow.ResearcherGroup{

+ 5 - 0
controllers/roadshow/company.go

@@ -60,6 +60,7 @@ func (this *CalendarController) CompanySearch() {
 // @Description 我的日历列表接口
 // @Param   CompanyId   query   int  true       "公司id"
 // @Param   EnglishCompany   query   int  true       "是否为英文客户"
+// @Param   CompanyType   query   string  true       "客户类型:'ficc','权益',传空默认为ficc,"
 // @Success 200 {object} roadshow.CompanyDetailView
 // @router /company/detail [get]
 func (this *CalendarController) CompanyDetail() {
@@ -84,10 +85,14 @@ func (this *CalendarController) CompanyDetail() {
 		return
 	}
 	englishCompany, _ := this.GetInt("EnglishCompany")
+	companyType := this.GetString("CompanyType")
 	productId := services.GetProductId(sysUser.RoleTypeCode)
 	if productId == 0 {
 		productId = 1
 	}
+	if companyType == utils.COMPANY_CLASSIFY_RAI {
+		productId = 2
+	}
 	detailView := new(roadshow.CompanyDetailView)
 	if englishCompany == 0 {
 		companyProductItem, err := company.GetCompanyProductByCompanyIdAndProductId(companyId, productId)

+ 215 - 61
controllers/roadshow/report.go

@@ -5,6 +5,7 @@ import (
 	"github.com/rdlucklib/rdluck_tools/paging"
 	"hongze/hz_crm_api/models"
 	"hongze/hz_crm_api/models/company"
+	"hongze/hz_crm_api/models/cygx"
 	"hongze/hz_crm_api/models/roadshow"
 	"hongze/hz_crm_api/models/system"
 	"hongze/hz_crm_api/services"
@@ -21,6 +22,7 @@ import (
 // @Param   DataType   query   string  true       "枚举值:week、month、time_interval"
 // @Param   StartDate   query   string  true       "开始日期,格式:2022-04-06"
 // @Param   EndDate   query   string  true       "结束日期,格式:2022-04-06"
+// @Param   CompanyType   query   string  true       "客户类型:'ficc','权益',传空默认为ficc,"
 // @Success 200 {object} roadshow.RsReportRecordResp
 // @router /report/researcher/list [get]
 func (this *CalendarController) ResearcherReportList() {
@@ -39,7 +41,7 @@ func (this *CalendarController) ResearcherReportList() {
 	dataType := this.GetString("DataType")
 	startDate := this.GetString("StartDate")
 	endDate := this.GetString("EndDate")
-
+	companyType := this.GetString("CompanyType", "ficc")
 	var adminDataList []roadshowService.AdminDataMap
 	var err error
 	//var firstDate time.Time
@@ -71,19 +73,74 @@ func (this *CalendarController) ResearcherReportList() {
 			br.ErrMsg = "数据异常,Err:" + err.Error()
 			return
 		}
-
-	}
-	group, err := roadshow.GetResearcherGroup()
-	if err != nil {
-		br.Msg = "获取信息失败!"
-		br.ErrMsg = "获取分组信息失败!Err:" + err.Error()
-		return
 	}
-	researcherList, err := roadshow.GetResearcherV2()
-	if err != nil {
-		br.Msg = "获取信息失败!"
-		br.ErrMsg = "获取分组信息失败!,GetResearcherV2 Err:" + err.Error()
-		return
+
+	var group []*roadshow.ResearcherGroup
+	var researcherList []*roadshow.ResearcherGroup
+
+	switch companyType {
+	case utils.COMPANY_CLASSIFY_FICC:
+		group, err = roadshow.GetResearcherGroup()
+		if err != nil {
+			br.Msg = "获取信息失败!"
+			br.ErrMsg = "获取分组信息失败!Err:" + err.Error()
+			return
+		}
+		researcherList, err = roadshow.GetResearcherV2()
+		if err != nil {
+			br.Msg = "获取信息失败!"
+			br.ErrMsg = "获取分组信息失败!,GetResearcherV2 Err:" + err.Error()
+			return
+		}
+	case utils.COMPANY_CLASSIFY_RAI:
+		mapPermissionUser := make(map[string][]*roadshow.ResearcherGroup)
+		listPermission, err := cygx.GetChartPermissionAll()
+		if err != nil {
+			br.Msg = "获取信息失败"
+			br.ErrMsg = "获取品种信息失败,Err:" + err.Error()
+			return
+		}
+		mapPermissionId := make(map[string]int)
+		for _, v := range listPermission {
+			mapPermissionId[v.PermissionName] = v.ChartPermissionId
+		}
+		askUserList, err := cygx.GetAskEmailListResearcher()
+		if err != nil {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取失败,GetAskEmailListResearcher Err: " + err.Error()
+			return
+		}
+		sysUserList, err := system.GetAdminList()
+		if err != nil {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取admin列表失败, Err:" + err.Error()
+			return
+		}
+		adminMap := make(map[int]*system.Admin, 0)
+		for _, v := range sysUserList {
+			adminMap[v.AdminId] = v
+		}
+
+		for _, v := range askUserList {
+			if admin, ok := adminMap[v.AdminId]; ok {
+				item := &roadshow.ResearcherGroup{
+					AdminId:      v.AdminId,
+					RealName:     v.Name,
+					GroupId:      mapPermissionId[v.ChartPermissionName], //行业ID作为组别,进行关系映射
+					GroupName:    admin.GroupName,
+					RoleTypeCode: admin.RoleTypeCode,
+				}
+				mapPermissionUser[v.ChartPermissionName] = append(mapPermissionUser[v.ChartPermissionName], item)
+				researcherList = append(researcherList, item)
+			}
+		}
+		for k, v := range mapPermissionUser {
+			respItem := new(roadshow.ResearcherGroup)
+			respItem.GroupName = k + "组"
+			respItem.GroupId = mapPermissionId[k]
+			respItem.ResearcherList = v
+			group = append(group, respItem)
+		}
 	}
 	groupMap := make(map[int][]*roadshow.ResearcherGroup)
 	for _, v := range researcherList {
@@ -120,24 +177,30 @@ func (this *CalendarController) ResearcherReportList() {
 	tmpAllTryOutNumMap := make(map[int]int)
 	tmpAllFormalNumMap := make(map[int]int)
 	tmpAllMeetingNumMap := make(map[int]int)
+	tmpAllRoadShowNumMap := make(map[int]int)
+	tmpAllSalonNumMap := make(map[int]int)
 	for _, v := range group {
 		v.ResearcherList = groupMap[v.GroupId]
 		tmpGroupAdminReportRecord := make([]roadshow.AdminReportRecord, 0)
 		tmpGroupRsReportRecordNumList := make([]roadshow.RsReportRecordNum, 0)
 
+		//roadShowMap := make(map[int]int) // 路演总次数
+		//salonMap := make(map[int]int)    //沙龙路演次数
+
 		tmpGroupTryOutNumMap := make(map[int]int)
 		tmpGroupFormalNumMap := make(map[int]int)
 		tmpGroupMeetingNumMap := make(map[int]int)
+		tmpGroupRoadShowNumMap := make(map[int]int)
+		tmpGroupSalonMapNumMap := make(map[int]int)
 		for _, researcher := range groupMap[v.GroupId] {
 			//组内研究员数据
-
 			//每个区间的数据
 			tmpAdminRsReportRecordNumList := make([]roadshow.RsReportRecordNum, 0)
 			for index, adminData := range adminDataList {
 				startDateIndexList[index] = adminData.StartDate
 				endDateIndexList[index] = adminData.EndDate
 
-				var tmpTryOutNum, tmpFormalNum, tmpMeetingNum int
+				var tmpTryOutNum, tmpFormalNum, tmpMeetingNum, tmpRoadShowNum, tmpSalonNum int
 				if num, ok := adminData.TryOutMap[researcher.AdminId]; ok {
 					tmpTryOutNum = num
 				}
@@ -147,12 +210,21 @@ func (this *CalendarController) ResearcherReportList() {
 				if num, ok := adminData.MeetingMap[researcher.AdminId]; ok {
 					tmpMeetingNum = num
 				}
+				if num, ok := adminData.RoadShowMap[researcher.AdminId]; ok { //路演总次数
+					tmpRoadShowNum = num
+				}
+				if num, ok := adminData.SalonMap[researcher.AdminId]; ok { //路演总次数
+					tmpSalonNum = num
+				}
+
 				tmpAdminRsReportRecordNum := roadshow.RsReportRecordNum{
-					TryOutNum:  tmpTryOutNum,
-					FormalNum:  tmpFormalNum,
-					MeetingNum: tmpMeetingNum,
-					StartDate:  adminData.StartDate,
-					EndDate:    adminData.EndDate,
+					TryOutNum:   tmpTryOutNum,
+					FormalNum:   tmpFormalNum,
+					MeetingNum:  tmpMeetingNum,
+					RoadShowNum: tmpRoadShowNum,
+					SalonNum:    tmpSalonNum,
+					StartDate:   adminData.StartDate,
+					EndDate:     adminData.EndDate,
 				}
 				tmpAdminRsReportRecordNumList = append(tmpAdminRsReportRecordNumList, tmpAdminRsReportRecordNum)
 
@@ -166,9 +238,17 @@ func (this *CalendarController) ResearcherReportList() {
 				if _, ok := tmpGroupMeetingNumMap[index]; !ok {
 					tmpGroupMeetingNumMap[index] = 0
 				}
+				if _, ok := tmpGroupRoadShowNumMap[index]; !ok {
+					tmpGroupRoadShowNumMap[index] = 0
+				}
+				if _, ok := tmpGroupSalonMapNumMap[index]; !ok {
+					tmpGroupSalonMapNumMap[index] = 0
+				}
 				tmpGroupTryOutNumMap[index] += tmpTryOutNum
 				tmpGroupFormalNumMap[index] += tmpFormalNum
 				tmpGroupMeetingNumMap[index] += tmpMeetingNum
+				tmpGroupRoadShowNumMap[index] += tmpRoadShowNum
+				tmpGroupSalonMapNumMap[index] += tmpSalonNum
 
 				//总数据汇总
 				if _, ok := tmpAllTryOutNumMap[index]; !ok {
@@ -180,9 +260,17 @@ func (this *CalendarController) ResearcherReportList() {
 				if _, ok := tmpAllMeetingNumMap[index]; !ok {
 					tmpAllMeetingNumMap[index] = 0
 				}
+				if _, ok := tmpGroupRoadShowNumMap[index]; !ok {
+					tmpGroupRoadShowNumMap[index] = 0
+				}
+				if _, ok := tmpGroupSalonMapNumMap[index]; !ok {
+					tmpGroupSalonMapNumMap[index] = 0
+				}
 				tmpAllTryOutNumMap[index] += tmpTryOutNum
 				tmpAllFormalNumMap[index] += tmpFormalNum
 				tmpAllMeetingNumMap[index] += tmpMeetingNum
+				tmpAllRoadShowNumMap[index] += tmpRoadShowNum
+				tmpAllSalonNumMap[index] += tmpSalonNum
 			}
 			tmpAdminReportRecord := roadshow.AdminReportRecord{
 				Name:                  researcher.RealName,
@@ -194,11 +282,13 @@ func (this *CalendarController) ResearcherReportList() {
 
 		for i := 0; i < len(tmpGroupMeetingNumMap); i++ {
 			tmpGroupRsReportRecordNum := roadshow.RsReportRecordNum{
-				TryOutNum:  tmpGroupTryOutNumMap[i],
-				FormalNum:  tmpGroupFormalNumMap[i],
-				MeetingNum: tmpGroupMeetingNumMap[i],
-				StartDate:  startDateIndexList[i],
-				EndDate:    endDateIndexList[i],
+				TryOutNum:   tmpGroupTryOutNumMap[i],
+				FormalNum:   tmpGroupFormalNumMap[i],
+				MeetingNum:  tmpGroupMeetingNumMap[i],
+				RoadShowNum: tmpGroupRoadShowNumMap[i],
+				SalonNum:    tmpGroupSalonMapNumMap[i],
+				StartDate:   startDateIndexList[i],
+				EndDate:     endDateIndexList[i],
 			}
 			tmpGroupRsReportRecordNumList = append(tmpGroupRsReportRecordNumList, tmpGroupRsReportRecordNum)
 		}
@@ -213,11 +303,13 @@ func (this *CalendarController) ResearcherReportList() {
 	//总体汇总数据
 	for i := 0; i < len(tmpAllFormalNumMap); i++ {
 		tmpGroupRsReportRecordNum := roadshow.RsReportRecordNum{
-			TryOutNum:  tmpAllTryOutNumMap[i],
-			FormalNum:  tmpAllFormalNumMap[i],
-			MeetingNum: tmpAllMeetingNumMap[i],
-			StartDate:  startDateIndexList[i],
-			EndDate:    endDateIndexList[i],
+			TryOutNum:   tmpAllTryOutNumMap[i],
+			FormalNum:   tmpAllFormalNumMap[i],
+			MeetingNum:  tmpAllMeetingNumMap[i],
+			RoadShowNum: tmpAllRoadShowNumMap[i],
+			SalonNum:    tmpAllSalonNumMap[i],
+			StartDate:   startDateIndexList[i],
+			EndDate:     endDateIndexList[i],
 		}
 		rsAllReportRecordNumList = append(rsAllReportRecordNumList, tmpGroupRsReportRecordNum)
 	}
@@ -237,6 +329,7 @@ func (this *CalendarController) ResearcherReportList() {
 // @Param   DimensionType   query   string  true       "维度枚举值:company_status、roadshow_type"
 // @Param   StartDate   query   string  true       "开始日期,格式:2022-04-06"
 // @Param   EndDate   query   string  true       "结束日期,格式:2022-04-06"
+// @Param   CompanyType   query   string  true       "客户类型:'ficc','权益',传空默认为ficc,"
 // @Success 200 {object} roadshow.RsReportRecordResp
 // @router /report/seller/list [get]
 func (this *CalendarController) SellerReportList() {
@@ -256,10 +349,13 @@ func (this *CalendarController) SellerReportList() {
 	dimensionType := this.GetString("DimensionType")
 	startDate := this.GetString("StartDate")
 	endDate := this.GetString("EndDate")
-
+	companyType := this.GetString("CompanyType", "ficc")
 	if dimensionType == "" {
 		dimensionType = "company_status"
 	}
+	if companyType == utils.COMPANY_CLASSIFY_RAI {
+		dimensionType = "roadshow_rai" // 类型传了权益,就强制查询权益的路演
+	}
 
 	var adminDataList []roadshowService.AdminDataMap
 	var err error
@@ -294,13 +390,34 @@ func (this *CalendarController) SellerReportList() {
 		}
 
 	}
-	group, groupIdRelationMap, err := services.GetFiccSystemGroup()
-	if err != nil {
-		br.Msg = "获取信息失败!"
-		br.ErrMsg = "获取分组信息失败!Err:" + err.Error()
-		return
+
+	var group []services.AdminGroup
+	var groupIdRelationMap map[int]int
+	var researcherList []*roadshow.Researcher
+	switch companyType {
+	case utils.COMPANY_CLASSIFY_FICC:
+		group, groupIdRelationMap, err = services.GetFiccSystemGroup()
+		if err != nil {
+			br.Msg = "获取信息失败!"
+			br.ErrMsg = "获取FICC销售信息失败!Err:" + err.Error()
+			return
+		}
+		researcherList, err = services.GetFiccSeller(firstDate, groupIdRelationMap)
+	case utils.COMPANY_CLASSIFY_RAI:
+		group, groupIdRelationMap, err = services.GetRaiSystemGroup()
+		if err != nil {
+			br.Msg = "获取信息失败!"
+			br.ErrMsg = "获取分组信息失败!Err:" + err.Error()
+			return
+		}
+		researcherList, err = services.GetRaiSeller(groupIdRelationMap)
+		if err != nil {
+			br.Msg = "获取信息失败!"
+			br.ErrMsg = "获取权益销售信息失败!Err:" + err.Error()
+			return
+		}
 	}
-	researcherList, err := services.GetFiccSeller(firstDate, groupIdRelationMap)
+
 	groupMap := make(map[int][]*roadshow.Researcher)
 	for _, v := range researcherList {
 		if v.RoleTypeCode == "ficc_admin" {
@@ -333,6 +450,8 @@ func (this *CalendarController) SellerReportList() {
 	tmpAllMeetingNumMap := make(map[int]int)
 	tmpAllOnlineNumMap := make(map[int]int)
 	tmpAllOfflineNumMap := make(map[int]int)
+	tmpAllRoadShowNumMap := make(map[int]int)
+	tmpAllSalonNumMap := make(map[int]int)
 	for _, v := range group {
 		v.ResearcherList = groupMap[v.GroupId]
 		tmpGroupAdminReportRecord := make([]roadshow.AdminReportRecord, 0)
@@ -343,16 +462,17 @@ func (this *CalendarController) SellerReportList() {
 		tmpGroupMeetingNumMap := make(map[int]int)
 		tmpGroupOnlineNumMap := make(map[int]int)
 		tmpGroupOfflineNumMap := make(map[int]int)
+		tmpGroupRoadShowNumMap := make(map[int]int)
+		tmpGroupSalonNumMap := make(map[int]int)
 		for _, researcher := range groupMap[v.GroupId] {
 			//组内研究员数据
-
 			//每个区间的数据
 			tmpAdminRsReportRecordNumList := make([]roadshow.RsReportRecordNum, 0)
 			for index, adminData := range adminDataList {
 				startDateIndexList[index] = adminData.StartDate
 				endDateIndexList[index] = adminData.EndDate
 
-				var tmpTryOutNum, tmpFormalNum, tmpMeetingNum, tmpOnlineNum, tmpOfflineNum int
+				var tmpTryOutNum, tmpFormalNum, tmpMeetingNum, tmpOnlineNum, tmpOfflineNum, tmpRoadShowNum, tmpSalonNum int
 				if num, ok := adminData.TryOutMap[researcher.AdminId]; ok {
 					tmpTryOutNum = num
 				}
@@ -368,14 +488,22 @@ func (this *CalendarController) SellerReportList() {
 				if num, ok := adminData.OfflineMap[researcher.AdminId]; ok {
 					tmpOfflineNum = num
 				}
+				if num, ok := adminData.RoadShowMap[researcher.AdminId]; ok {
+					tmpRoadShowNum = num
+				}
+				if num, ok := adminData.SalonMap[researcher.AdminId]; ok {
+					tmpSalonNum = num
+				}
 				tmpAdminRsReportRecordNum := roadshow.RsReportRecordNum{
-					TryOutNum:  tmpTryOutNum,
-					FormalNum:  tmpFormalNum,
-					MeetingNum: tmpMeetingNum,
-					OnlineNum:  tmpOnlineNum,
-					OfflineNum: tmpOfflineNum,
-					StartDate:  adminData.StartDate,
-					EndDate:    adminData.EndDate,
+					TryOutNum:   tmpTryOutNum,
+					FormalNum:   tmpFormalNum,
+					MeetingNum:  tmpMeetingNum,
+					OnlineNum:   tmpOnlineNum,
+					OfflineNum:  tmpOfflineNum,
+					RoadShowNum: tmpRoadShowNum,
+					SalonNum:    tmpSalonNum,
+					StartDate:   adminData.StartDate,
+					EndDate:     adminData.EndDate,
 				}
 				tmpAdminRsReportRecordNumList = append(tmpAdminRsReportRecordNumList, tmpAdminRsReportRecordNum)
 
@@ -395,11 +523,19 @@ func (this *CalendarController) SellerReportList() {
 				if _, ok := tmpGroupOfflineNumMap[index]; !ok {
 					tmpGroupOfflineNumMap[index] = 0
 				}
+				if _, ok := tmpGroupRoadShowNumMap[index]; !ok {
+					tmpGroupRoadShowNumMap[index] = 0
+				}
+				if _, ok := tmpGroupSalonNumMap[index]; !ok {
+					tmpGroupSalonNumMap[index] = 0
+				}
 				tmpGroupTryOutNumMap[index] += tmpTryOutNum
 				tmpGroupFormalNumMap[index] += tmpFormalNum
 				tmpGroupMeetingNumMap[index] += tmpMeetingNum
 				tmpGroupOnlineNumMap[index] += tmpOnlineNum
 				tmpGroupOfflineNumMap[index] += tmpOfflineNum
+				tmpGroupRoadShowNumMap[index] += tmpRoadShowNum
+				tmpGroupSalonNumMap[index] += tmpSalonNum
 
 				//总数据汇总
 				if _, ok := tmpAllTryOutNumMap[index]; !ok {
@@ -417,11 +553,19 @@ func (this *CalendarController) SellerReportList() {
 				if _, ok := tmpAllOfflineNumMap[index]; !ok {
 					tmpAllOfflineNumMap[index] = 0
 				}
+				if _, ok := tmpAllRoadShowNumMap[index]; !ok {
+					tmpAllRoadShowNumMap[index] = 0
+				}
+				if _, ok := tmpAllSalonNumMap[index]; !ok {
+					tmpAllSalonNumMap[index] = 0
+				}
 				tmpAllTryOutNumMap[index] += tmpTryOutNum
 				tmpAllFormalNumMap[index] += tmpFormalNum
 				tmpAllMeetingNumMap[index] += tmpMeetingNum
 				tmpAllOnlineNumMap[index] += tmpOnlineNum
 				tmpAllOfflineNumMap[index] += tmpOfflineNum
+				tmpAllRoadShowNumMap[index] += tmpRoadShowNum
+				tmpAllSalonNumMap[index] += tmpSalonNum
 			}
 			tmpAdminReportRecord := roadshow.AdminReportRecord{
 				Name:                  researcher.RealName,
@@ -433,13 +577,15 @@ func (this *CalendarController) SellerReportList() {
 
 		for i := 0; i < len(tmpGroupMeetingNumMap); i++ {
 			tmpGroupRsReportRecordNum := roadshow.RsReportRecordNum{
-				TryOutNum:  tmpGroupTryOutNumMap[i],
-				FormalNum:  tmpGroupFormalNumMap[i],
-				MeetingNum: tmpGroupMeetingNumMap[i],
-				OnlineNum:  tmpGroupOnlineNumMap[i],
-				OfflineNum: tmpGroupOfflineNumMap[i],
-				StartDate:  startDateIndexList[i],
-				EndDate:    endDateIndexList[i],
+				TryOutNum:   tmpGroupTryOutNumMap[i],
+				FormalNum:   tmpGroupFormalNumMap[i],
+				MeetingNum:  tmpGroupMeetingNumMap[i],
+				OnlineNum:   tmpGroupOnlineNumMap[i],
+				OfflineNum:  tmpGroupOfflineNumMap[i],
+				RoadShowNum: tmpGroupRoadShowNumMap[i],
+				SalonNum:    tmpGroupSalonNumMap[i],
+				StartDate:   startDateIndexList[i],
+				EndDate:     endDateIndexList[i],
 			}
 			tmpGroupRsReportRecordNumList = append(tmpGroupRsReportRecordNumList, tmpGroupRsReportRecordNum)
 		}
@@ -455,13 +601,15 @@ func (this *CalendarController) SellerReportList() {
 	//总体汇总数据
 	for i := 0; i < len(tmpAllFormalNumMap); i++ {
 		tmpGroupRsReportRecordNum := roadshow.RsReportRecordNum{
-			TryOutNum:  tmpAllTryOutNumMap[i],
-			FormalNum:  tmpAllFormalNumMap[i],
-			MeetingNum: tmpAllMeetingNumMap[i],
-			OnlineNum:  tmpAllOnlineNumMap[i],
-			OfflineNum: tmpAllOfflineNumMap[i],
-			StartDate:  startDateIndexList[i],
-			EndDate:    endDateIndexList[i],
+			TryOutNum:   tmpAllTryOutNumMap[i],
+			FormalNum:   tmpAllFormalNumMap[i],
+			MeetingNum:  tmpAllMeetingNumMap[i],
+			OnlineNum:   tmpAllOnlineNumMap[i],
+			OfflineNum:  tmpAllOfflineNumMap[i],
+			RoadShowNum: tmpAllRoadShowNumMap[i],
+			SalonNum:    tmpAllSalonNumMap[i],
+			StartDate:   startDateIndexList[i],
+			EndDate:     endDateIndexList[i],
 		}
 		rsAllReportRecordNumList = append(rsAllReportRecordNumList, tmpGroupRsReportRecordNum)
 	}
@@ -571,6 +719,12 @@ func (this *CalendarController) ReportCalendarList() {
 	case "offline":
 		condition += ` and a.roadshow_type = ? `
 		pars = append(pars, "线下")
+	case "road_show":
+		condition += ` and a.activity_type = ? `
+		pars = append(pars, "路演")
+	case "salon":
+		condition += ` and a.activity_type = ? `
+		pars = append(pars, "沙龙")
 	default:
 		br.Msg = "请传入类型"
 		br.ErrMsg = "请传入类型DataType"
@@ -1715,4 +1869,4 @@ func (this *CalendarController) OverseasCalendarList() {
 	br.Msg = "获取成功"
 	br.Data = list
 	return
-}
+}

+ 15 - 16
controllers/sys_admin.go

@@ -1177,27 +1177,26 @@ func (this *SysAdminController) Move() {
 
 	// 修改客户关联的分组
 	{
+		// 有小组时GroupId取小组ID
 		if req.TeamId > 0 {
-			if req.TeamId != adminInfo.GroupId {
-				err = company.ModifyCompanyGroupId(req.AdminId, req.TeamId)
-				if err != nil {
-					br.Msg = "编辑失败"
-					br.ErrMsg = "ModifyCompanyGroupId,Err:" + err.Error()
-					return
-				}
+			err = company.ModifyCompanyGroupId(req.AdminId, req.TeamId)
+			if err != nil {
+				br.Msg = "编辑失败"
+				br.ErrMsg = "ModifyCompanyGroupId,Err:" + err.Error()
+				return
 			}
-		} else {
-			if req.GroupId != adminInfo.GroupId {
-				err = company.ModifyCompanyGroupId(req.AdminId, req.GroupId)
-				if err != nil {
-					br.Msg = "编辑失败"
-					br.ErrMsg = "ModifyCompanyGroupId,Err:" + err.Error()
-					return
-				}
+		}
+		// 无TeamId时GroupId取大组ID
+		if req.TeamId <= 0 && req.GroupId > 0 {
+			err = company.ModifyCompanyGroupId(req.AdminId, req.GroupId)
+			if err != nil {
+				br.Msg = "编辑失败"
+				br.ErrMsg = "ModifyCompanyGroupId,Err:" + err.Error()
+				return
 			}
 		}
 
-		if req.DepartmentId != adminInfo.DepartmentId {
+		if req.DepartmentId > 0 {
 			err = company.ModifyCompanyDepartmentId(req.AdminId, req.DepartmentId)
 			if err != nil {
 				br.Msg = "编辑失败"

+ 124 - 105
models/company/company.go

@@ -60,40 +60,43 @@ func GetCompanyById(companyId int) (items *Company, err error) {
 }
 
 type CompanySearchItem 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:"流失原因"`
-	LossTime        string `description:"流失时间"`
-	Status          string `description:"客户状态:'试用','永续','冻结','流失','正式' "`
-	CompanyType     string `description:"客户类型:ficc/权益"`
-	ApproveStatus   string `description:"审批状态:'审批中','通过','驳回' 审批状态为空时,表示没有审批申请"`
-	SellerName      string `description:"销售:吉根龙/颖丹"`
-	SellerIds       string `description:"销售ID集合,包含ficc和权益的销售id" json:"-"`
-	Duration        string `description:"时长"`
-	FreezeTime      string `description:"冻结时间"`
-	GroupId         int    `description:"分组id"`
-	GroupIds        string `json:"-" description:"分组id集合,包含ficc和权益的小组id"`
-	DepartmentId    int    `description:"部门id"`
-	IsSuspend       int    `description:"是否暂停:1:暂停,0:启用 "`
-	ProductId       int    `description:"产品id"`
-	ProductIds      string `json:"-";description:"分组id集合,包含ficc和权益的小组id"`
-	IsMoveShow      int    `description:"按钮显示控制:1:显示,移动按钮,0:不显示移动按钮"`
-	SellerId        int    `description:"销售id"`
-	BtnItem         *ButtonPermission
-	FormalTime      string `description:"转正时间"`
-	FreezeStartDate string `description:"冻结开始日期"`
-	FreezeEndDate   string `description:"冻结结束日期"`
-	RegionType      string `description:"地区类型,国内,国外"`
-	ShareSeller     string `description:"共享销售员"`
-	ShareSellerId   int    `description:"共享销售员id"`
-	ShareSellerIds  string `description:"共享销售员id"`
-	IsShare         int    `description:"0:非共享用户,1:共享客户"`
-	IsScrounge      int    `description:"是否白嫖 0不是 1是"`
-	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:"流失原因"`
+	LossTime            string `description:"流失时间"`
+	Status              string `description:"客户状态:'试用','永续','冻结','流失','正式' "`
+	CompanyType         string `description:"客户类型:ficc/权益"`
+	ApproveStatus       string `description:"审批状态:'审批中','通过','驳回' 审批状态为空时,表示没有审批申请"`
+	SellerName          string `description:"销售:吉根龙/颖丹"`
+	SellerIds           string `description:"销售ID集合,包含ficc和权益的销售id" json:"-"`
+	Duration            string `description:"时长"`
+	FreezeTime          string `description:"冻结时间"`
+	GroupId             int    `description:"分组id"`
+	GroupIds            string `json:"-" description:"分组id集合,包含ficc和权益的小组id"`
+	DepartmentId        int    `description:"部门id"`
+	IsSuspend           int    `description:"是否暂停:1:暂停,0:启用 "`
+	ProductId           int    `description:"产品id"`
+	ProductIds          string `json:"-";description:"分组id集合,包含ficc和权益的小组id"`
+	IsMoveShow          int    `description:"按钮显示控制:1:显示,移动按钮,0:不显示移动按钮"`
+	SellerId            int    `description:"销售id"`
+	BtnItem             *ButtonPermission
+	FormalTime          string `description:"转正时间"`
+	FreezeStartDate     string `description:"冻结开始日期"`
+	FreezeEndDate       string `description:"冻结结束日期"`
+	RegionType          string `description:"地区类型,国内,国外"`
+	ShareSeller         string `description:"共享销售员"`
+	ShareSellerId       int    `description:"共享销售员id"`
+	ShareSellerIds      string `description:"共享销售员id"`
+	IsShare             int    `description:"0:非共享用户,1:共享客户"`
+	IsScrounge          int    `description:"是否白嫖 0不是 1是"`
+	IsSigning           int    `description:"是否签约过,1是,0否"`
+	SigningStatus       string `description:"签约状态,已签约过/未签约过"`
+	CompanyStatusButton *CompanyStatusButton
+	Nation              string `description:"所属国家"`
 }
 
 type CompanySearchListResp struct {
@@ -103,7 +106,7 @@ type CompanySearchListResp struct {
 
 func GetCompanySearchList(condition string, pars []interface{}, limitParam ...int) (items []*CompanySearchItem, err error) {
 	o := orm.NewOrm()
-	sql := `SELECT DISTINCT a.company_id,a.company_name,a.credit_code,a.company_code,a.region_type,b.share_seller_id,b.share_seller,b.is_share,
+	sql := `SELECT DISTINCT a.company_id,a.company_name,a.credit_code,a.company_code,a.region_type,b.share_seller_id,b.share_seller,b.is_share,b.is_signing,
             GROUP_CONCAT(b.status ORDER BY b.product_id ASC SEPARATOR '/') AS status,
 			GROUP_CONCAT(DISTINCT b.seller_name ORDER BY b.product_id ASC SEPARATOR '/' ) AS seller_name,
 			GROUP_CONCAT(DISTINCT b.seller_id ORDER BY b.product_id ASC SEPARATOR '/') AS seller_ids,
@@ -116,7 +119,8 @@ func GetCompanySearchList(condition string, pars []interface{}, limitParam ...in
             GROUP_CONCAT(DISTINCT b.approve_status ORDER BY b.product_id ASC SEPARATOR '/') AS approve_status,
             GROUP_CONCAT(DISTINCT b.freeze_start_date ORDER BY b.product_id ASC SEPARATOR '/') AS freeze_start_date,
             GROUP_CONCAT(DISTINCT b.freeze_end_date ORDER BY b.product_id ASC SEPARATOR '/') AS freeze_end_date,
-			GROUP_CONCAT(DISTINCT b.share_seller_id ORDER BY b.product_id ASC SEPARATOR ',') AS share_seller_ids
+            GROUP_CONCAT(DISTINCT b.share_seller_id ORDER BY b.product_id ASC SEPARATOR ',') AS share_seller_ids,
+			GROUP_CONCAT( DISTINCT b.is_signing ORDER BY b.product_id ASC SEPARATOR '/' ) AS signing_status
 			FROM company AS a
 			INNER JOIN company_product AS b ON a.company_id=b.company_id
 			WHERE a.enabled=1 `
@@ -212,77 +216,91 @@ type CompanyItem struct {
 	ServiceTimes        int                  `description:"服务次数"`
 	CloseReason         string               `description:"关闭原因"`
 	CloseTime           string               `description:"关闭时间"`
-	Nation              string               `description:"所属国家"`
-	IsUserMaker         int                  `description:"近四周之内是否包含决策人互动过 ,0否,1是"`
-	LatestServiceRecord time.Time            `description:"最近沟通时间"`
-	FirstDate           time.Time            `description:"首次服务时间"`
+	IsSigning           int                  `description:"是否签约过,1是,0否"`
+	SigningStatus       string               `description:"签约状态,已签约过/未签约过"`
+	CompanyStatusButton *CompanyStatusButton
+	Nation              string    `description:"所属国家"`
+	LatestServiceRecord time.Time `description:"最近沟通时间"`
+	FirstDate           time.Time `description:"首次服务时间"`
+	IsUserMaker         int       `description:"近四周之内是否包含决策人互动过 ,0否,1是"`
 }
 
 type CompanyListItem 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:"客户状态:'试用','永续','冻结','流失','正式' "`
-	CompanyType      string `description:"客户类型:ficc/权益"`
-	ApproveStatus    string `description:"审批状态:'待审批','已审批','驳回' 审批状态为空时,表示没有审批申请"`
-	SellerName       string `description:"销售:吉根龙/颖丹"`
-	SellerId         int    `description:"销售ID"`
-	SellerIds        string `description:"销售ID集合,包含ficc和权益的销售id"`
-	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:"-"`
-	FormalTime       string               `description:"转正时间"`
-	IsShared         bool                 `description:"是否共享客户"`
-	RegionType       string               `description:"区域:国内,海外"`
-	FiccView         int                  `description:"Ficc报告阅读次数"`
-	RaiView          int                  `description:"权益报告阅读次数"`
-	FiccLastViewTime string               `description:"ficc最近一次阅读时间"`
-	RaiLastViewTime  string               `description:"权益最近一次阅读时间"`
-	RoadShowTotal    int                  `description:"累计路演次数"`
-	TodoStatus       bool                 `description:"是否存在进行中任务,true:存在待处理的任务"`
-	CanConfirm       bool                 `description:"是否允许完成任务,true:允许完成任务"`
-	HiddenConfirm    bool                 `description:"是否隐藏完成任务按钮,true:隐藏完成任务按钮"`
-	HiddenCreate     bool                 `description:"是否隐藏新增/编辑按钮,true:隐藏新增/编辑按钮"`
-	TodoButtonColor  string               `description:"任务按钮颜色:red,green,gray"`
-	TryStageSlice    []*TryStageSliceItem `description:"试用状态相关"`
-	AllViewTotal     int                  `description:"总阅读数"`
-	Deadline         string               `description:"未完成的todo任务的截止日期,截止目前还剩余的天数"`
-	FiccTryOutDay    int                  `description:"Ficc总试用天数"`
-	RaiTryOutDay     int                  `description:"权益总试用天数"`
-	WeekViewActive   int                  `description:"周阅读活跃: 0-七日内无阅读; 1-活跃"`
-	IsShare          int                  `description:"0:非共享用户,1:共享客户"`
-	ShareSeller      string               `description:"共享销售员"`
-	ShareSellerId    int                  `description:"共享销售员id"`
-	ShareSellerIds   string               `description:"共享销售员ids"`
-	LastServiceTime  string               `description:"最后服务时间"`
-	ServiceTimes     int                  `description:"服务次数"`
-	CloseReason      string               `description:"关闭客户原因"`
-	CloseTime        string               `description:"关闭客户时间"`
-	IsScrounge       int                  `description:"是否白嫖 0不是 1是"`
-	IsUserMaker      int                  `description:"近四周之内是否包含决策人互动过 ,0否,1是"`
+	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:"客户状态:'试用','永续','冻结','流失','正式' "`
+	CompanyType         string `description:"客户类型:ficc/权益"`
+	ApproveStatus       string `description:"审批状态:'待审批','已审批','驳回' 审批状态为空时,表示没有审批申请"`
+	SellerName          string `description:"销售:吉根龙/颖丹"`
+	SellerId            int    `description:"销售ID"`
+	SellerIds           string `description:"销售ID集合,包含ficc和权益的销售id"`
+	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:"-"`
+	FormalTime          string               `description:"转正时间"`
+	IsShared            bool                 `description:"是否共享客户"`
+	RegionType          string               `description:"区域:国内,海外"`
+	FiccView            int                  `description:"Ficc报告阅读次数"`
+	RaiView             int                  `description:"权益报告阅读次数"`
+	FiccLastViewTime    string               `description:"ficc最近一次阅读时间"`
+	RaiLastViewTime     string               `description:"权益最近一次阅读时间"`
+	RoadShowTotal       int                  `description:"累计路演次数"`
+	TodoStatus          bool                 `description:"是否存在进行中任务,true:存在待处理的任务"`
+	CanConfirm          bool                 `description:"是否允许完成任务,true:允许完成任务"`
+	HiddenConfirm       bool                 `description:"是否隐藏完成任务按钮,true:隐藏完成任务按钮"`
+	HiddenCreate        bool                 `description:"是否隐藏新增/编辑按钮,true:隐藏新增/编辑按钮"`
+	TodoButtonColor     string               `description:"任务按钮颜色:red,green,gray"`
+	TryStageSlice       []*TryStageSliceItem `description:"试用状态相关"`
+	AllViewTotal        int                  `description:"总阅读数"`
+	Deadline            string               `description:"未完成的todo任务的截止日期,截止目前还剩余的天数"`
+	FiccTryOutDay       int                  `description:"Ficc总试用天数"`
+	RaiTryOutDay        int                  `description:"权益总试用天数"`
+	WeekViewActive      int                  `description:"周阅读活跃: 0-七日内无阅读; 1-活跃"`
+	IsShare             int                  `description:"0:非共享用户,1:共享客户"`
+	ShareSeller         string               `description:"共享销售员"`
+	ShareSellerId       int                  `description:"共享销售员id"`
+	ShareSellerIds      string               `description:"共享销售员ids"`
+	LastServiceTime     string               `description:"最后服务时间"`
+	ServiceTimes        int                  `description:"服务次数"`
+	CloseReason         string               `description:"关闭客户原因"`
+	CloseTime           string               `description:"关闭客户时间"`
+	IsScrounge          int                  `description:"是否白嫖 0不是 1是"`
+	IsSigning           int                  `description:"是否签约过 0不是 1是"`
+	SigningStatus       string               `description:"签约状态,已签约过/未签约过"`
+	CompanyStatusButton *CompanyStatusButton
+	IsUserMaker         int `description:"近四周之内是否包含决策人互动过 ,0否,1是"`
+}
+
+// 已签约未签约客户回显按钮
+type CompanyStatusButton struct {
+	FiccStatus        string `description:"Ficc客户状态"`
+	RaiStatus         string `description:"权益客户状态"`
+	FiccSigningStatus string `description:"Ficc客户签约状态,已签约过/未签约过"`
+	RaiSigningStatus  string `description:"权益客户签约状态,已签约过/未签约过"`
 }
 
 type TryStageSliceItem struct {
@@ -322,7 +340,7 @@ func GetCompanyList(condition, status, sortStr string, pars []interface{}, start
 	// 权益客户: 以权益最后一次阅读时间作为参考
 	t := time.Now().Local().AddDate(0, 0, -7).Format(utils.FormatDate)
 
-	sql := `SELECT a.company_id,a.company_name,a.credit_code,a.company_code,a.created_time,a.province,a.city,a.address,a.region_type,b.group_id,b.road_show_total,b.is_share,b.is_user_maker,
+	sql := `SELECT a.company_id,a.company_name,a.credit_code,a.company_code,a.created_time,a.province,a.city,a.address,a.region_type,b.group_id,b.road_show_total,b.is_share,b.is_signing,b.is_user_maker,
 			CASE 
      WHEN GROUP_CONCAT(b.status) LIKE "%永续%" THEN 1
 	 WHEN GROUP_CONCAT(b.status) LIKE "%正式%" THEN 2
@@ -369,6 +387,7 @@ as sort_todo_end_time,
 			GROUP_CONCAT(DISTINCT b.todo_status ORDER BY b.product_id ASC SEPARATOR '/') AS todo_statuss,
             GROUP_CONCAT(DISTINCT b.todo_end_time ORDER BY b.product_id ASC SEPARATOR '/') AS todo_end_time_str,
 			GROUP_CONCAT(DISTINCT b.try_out_day_total ORDER BY b.product_id ASC SEPARATOR '/') AS try_out_day_totals,
+			GROUP_CONCAT( DISTINCT b.is_signing ORDER BY b.product_id ASC SEPARATOR '/' ) AS signing_status,
 			b.is_suspend,
 			b.freeze_start_date,
 			b.freeze_end_date,

+ 8 - 0
models/company/company_product.go

@@ -602,6 +602,14 @@ func GetCompanyProductListBycondition(condition string, pars []interface{}) (ite
 	return
 }
 
+// 更新用户是否签约过
+func UpdateCompanyProductIsSigningById(companyId, productId int) (err error) {
+	o := orm.NewOrm()
+	sql := `UPDATE company_product SET is_signing=1 WHERE company_id=? AND product_id=? `
+	_, err = o.Raw(sql, companyId, productId).Exec()
+	return
+}
+
 // CompanyProductItem
 // @Description: 客户品种
 type CompanyProductItem struct {

+ 16 - 0
models/cygx/activity_ask_email.go

@@ -42,6 +42,22 @@ func GetAskEmailList() (item []*AskEmailRep, err error) {
 	return
 }
 
+// 权益自定义派点信息
+func GetAskEmailListPoint() (item []*AskEmailRep, err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	sql := `SELECT * FROM cygx_activity_ask_email WHERE  chart_permission_name != ''  AND enabled_point = 1 AND admin_id > 0    ORDER BY sort  DESC , id ASC  `
+	_, err = o.Raw(sql).QueryRows(&item)
+	return
+}
+
+// 权益自定义研究员信息
+func GetAskEmailListResearcher() (item []*AskEmailRep, err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	sql := `SELECT * FROM cygx_activity_ask_email WHERE  chart_permission_name != ''  AND enabled_researcher = 1 AND admin_id > 0    ORDER BY sort  DESC , id ASC  `
+	_, err = o.Raw(sql).QueryRows(&item)
+	return
+}
+
 func UpdateAskEmail(item *AskEmailRep) (err error) {
 	o := orm.NewOrmUsingDB("hz_cygx")
 	sql := `UPDATE cygx_activity_ask_email SET admin_id=? where mobile=?`

+ 3 - 2
models/overseas_custom/custom.go

@@ -23,6 +23,7 @@ type Custom struct {
 	Source         int    `description:"来源:1,英文客户,2:客户列表"`
 	OverseasLabel  int    `description:"海外客户试用子标签:1未分类、2  推进、3 跟踪、4 预备、"`
 	ResetBtn       int    `description:"转正式和重置按钮:同步过来默认为0:显示转正式为1:显示重置为2"`
+	Status         string `description:"客户状态"`
 }
 
 type CustomTotal struct {
@@ -168,7 +169,7 @@ func (obj *Custom) GetCustomList(condition string, pars []interface{}, sortField
 	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
+				2 AS source,b.overseas_label,a.reset_btn,b.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
@@ -177,7 +178,7 @@ func (obj *Custom) GetCustomList(condition string, pars []interface{}, sortField
 				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
+				1 AS source,t.overseas_label,t.reset_btn,CASE t.enabled WHEN 0 THEN '关闭' WHEN 1 THEN '试用' WHEN 2 THEN '试用' END status
 				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 `

+ 10 - 11
models/roadshow/report_record.go

@@ -57,14 +57,16 @@ type AdminReportRecord struct {
 
 // RsReportRecordNum 系统用户统计信息
 type RsReportRecordNum struct {
-	TryOutNum  int    `description:"试用路演次数"`
-	FormalNum  int    `description:"正式路演次数"`
-	MeetingNum int    `description:"会议次数"`
-	OnlineNum  int    `description:"线上路演次数"`
-	OfflineNum int    `description:"线上路演次数"`
-	StartDate  string `description:"开始日期"`
-	EndDate    string `description:"结束日期"`
-	IsLook     bool   `description:"是否可以查看详情"`
+	TryOutNum   int    `description:"试用路演次数"`
+	FormalNum   int    `description:"正式路演次数"`
+	MeetingNum  int    `description:"会议次数"`
+	OnlineNum   int    `description:"线上路演次数"`
+	OfflineNum  int    `description:"线上路演次数"`
+	RoadShowNum int    `description:"路演总次数"`
+	SalonNum    int    `description:"沙龙路演次数"`
+	StartDate   string `description:"开始日期"`
+	EndDate     string `description:"结束日期"`
+	IsLook      bool   `description:"是否可以查看详情"`
 }
 
 func DeleteRsReportRecord(rsCalendarId, rsCalendarResearcherId int) (err error) {
@@ -274,8 +276,6 @@ type RsOverseasReportRecordResp struct {
 	RsReportRecordNumList []RsOverseasReportRecordNum `description:"统计次数"`
 }
 
-
-
 func GetOverseasGroupResearcherRecordList(startDate, endDate, companyStatus string) (list []*RsReportRecordGroup, err error) {
 	var databaseName string
 	if utils.RunMode == "debug" {
@@ -404,7 +404,6 @@ func GetOverseasGroupSellerRecordList(startDate, endDate, companyStatus string)
 	sql := `SELECT m.*,SUM(m.num) AS num  FROM (` + sql1 + ` UNION ALL ` + sql2
 	sql += ` ) AS m  WHERE 1=1 `
 
-
 	sql += ` Group by admin_id `
 	_, err = o.Raw(sql, pars).QueryRows(&list)
 

+ 17 - 12
models/wx_user.go

@@ -39,6 +39,11 @@ type WxUser struct {
 	RaiLastViewTime     string    `description:"权益报告的最近一次阅读时间"`
 }
 
+// 用户详情出参
+type WxUserResp struct {
+	Detail *WxUser
+}
+
 func AddWxUser(item *WxUser) (lastId int64, err error) {
 	o := orm.NewOrm()
 	lastId, err = o.Insert(item)
@@ -529,6 +534,18 @@ func GetWxUserListCompanyId(companyId int) (list []*WxUserItem, err error) {
 	return
 }
 
+// GetWxUserByCompanyIds 根据客户ID集合获取用户列表
+func GetWxUserByCompanyIds(companyIds []int) (items []*WxUser, err error) {
+	num := len(companyIds)
+	if num == 0 {
+		return
+	}
+	sql := `SELECT * FROM wx_user  WHERE company_id in (` + utils.GetOrmInReplace(num) + `)  `
+	o := orm.NewOrm()
+	_, err = o.Raw(sql, companyIds).QueryRows(&items)
+	return
+}
+
 type WxUserSller struct {
 	UserId      int    `description:"用户id"`
 	RealName    string `description:"姓名"`
@@ -589,18 +606,6 @@ func GetWxUserRaiSllerListByUserMobile(mobiles []string) (list []*WxUserSller, e
 	return
 }
 
-// GetWxUserByCompanyIds 根据客户ID集合获取用户列表
-func GetWxUserByCompanyIds(companyIds []int) (items []*WxUser, err error) {
-	num := len(companyIds)
-	if num == 0 {
-		return
-	}
-	sql := `SELECT * FROM wx_user  WHERE company_id in (` + utils.GetOrmInReplace(num) + `)  `
-	o := orm.NewOrm()
-	_, err = o.Raw(sql, companyIds).QueryRows(&items)
-	return
-}
-
 // GetWxUserList 用户列表查询
 func GetWxUserList(condition string, pars []interface{}) (items []*WxUser, err error) {
 	o := orm.NewOrm()

+ 9 - 0
routers/commentsRouter.go

@@ -10294,6 +10294,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: "DetailUser",
+            Router: `/user/detail`,
+            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: "EditUser",

+ 59 - 0
services/company.go

@@ -2518,3 +2518,62 @@ func GetShareCompanyPermissionButton(roleTypeCode, statuses string, productId in
 	}
 	return
 }
+
+// 处理客户列表签约未签约状态回显
+func GetLsitCompanyStatusButton(companyType, status, signingStatus string) (button *company.CompanyStatusButton) {
+	var ficcStatus string
+	var raiStatus string
+	var ficcSigningStatus string
+	var raiSigningStatus string
+	if strings.Contains(status, "/") {
+		//signingStatus 1;已签约,0:未签约 ,如果是 0的时候,表示两个都是未签约,手动改为 0/0 ,如果两个都是1 的时候展示 1 手动改为 1/1
+		tmpStatusArr := strings.Split(status, "/")
+		ficcStatus = tmpStatusArr[0]
+		raiStatus = tmpStatusArr[1]
+		if signingStatus == "0" {
+			signingStatus = "0/0"
+		} else if signingStatus == "1" {
+			signingStatus = "1/1"
+		}
+		if strings.Contains(status, "/") {
+			tmpSigningStatusArr := strings.Split(signingStatus, "/")
+			ficcSigningStatus = tmpSigningStatusArr[0]
+			raiSigningStatus = tmpSigningStatusArr[1]
+		}
+	} else {
+		if strings.Contains(companyType, "ficc") {
+			ficcStatus = status
+			ficcSigningStatus = signingStatus
+		} else {
+			raiStatus = status
+			raiSigningStatus = signingStatus
+		}
+	}
+
+	if ficcStatus == utils.COMPANY_STATUS_LOSE {
+		if ficcSigningStatus == "0" {
+			ficcSigningStatus = "未签约过"
+		} else if ficcSigningStatus == "1" {
+			ficcSigningStatus = "已签约过"
+		}
+	} else {
+		ficcSigningStatus = ""
+	}
+
+	if raiStatus == utils.COMPANY_STATUS_LOSE {
+		if raiSigningStatus == "0" {
+			raiSigningStatus = "未签约过"
+		} else if raiSigningStatus == "1" {
+			raiSigningStatus = "已签约过"
+		}
+	} else {
+		raiSigningStatus = ""
+	}
+
+	button = new(company.CompanyStatusButton)
+	button.FiccStatus = ficcStatus
+	button.RaiStatus = raiStatus
+	button.FiccSigningStatus = ficcSigningStatus
+	button.RaiSigningStatus = raiSigningStatus
+	return
+}

+ 15 - 0
services/company_product.go

@@ -36,6 +36,21 @@ func GetSellNameMapByCompanyIds(companyIds []int) (respMap map[int]string) {
 	return
 }
 
+// 更新客户是否签约状态
+func init12323() {
+	list, err := company.GetTryOutCompanyOperationRecordList()
+	if err != nil {
+		fmt.Println(err)
+		return
+	}
+
+	for _, v := range list {
+		fmt.Println(v.CompanyId)
+		err = company.UpdateCompanyProductIsSigningById(v.CompanyId, v.ProductId)
+	}
+	return
+}
+
 //	func init() {
 //		Need960init()
 //	}

+ 2 - 1
services/cygx/activity_ocr.go

@@ -175,6 +175,7 @@ func UpdateActivityVideoAndVoice(activityInfo *cygx.ActivityDetail, itemVoice *c
 			err = errors.New("GetCygxActivityVoiceCount" + e.Error())
 			return
 		}
+
 		//activityId := itemVoice.ActivityId
 		////获取活动详情
 		//activityInfo, e := cygx.GetAddActivityInfoById(activityId)
@@ -182,6 +183,7 @@ func UpdateActivityVideoAndVoice(activityInfo *cygx.ActivityDetail, itemVoice *c
 		//	err = errors.New("GetAddActivityInfoById, Err: " + e.Error())
 		//	return
 		//}
+
 		//易董办会的分析师电话会,为路演回放
 		if (activityInfo.ActivityTypeId == 2 || activityInfo.ActivityTypeId == 7) && activityInfo.IsYidongConduct == 1 {
 			itemVoice.FileType = 1
@@ -192,7 +194,6 @@ func UpdateActivityVideoAndVoice(activityInfo *cygx.ActivityDetail, itemVoice *c
 		shareImg, _ := MakeCygxMp3HtmlImg(itemVoice.VoicePlaySeconds, activityInfo.ChartPermissionId) //生成分享图片
 		itemVoice.ShareImg = shareImg
 		itemVoice.VoiceName = utils.RemoveFileSuffixName(itemVoice.VoiceName) //去掉后缀名称
-
 		//如果等于0就新增,反之就修改
 		if total == 0 {
 			newId, e := cygx.AddCygxActivityVoice(itemVoice)

+ 2 - 2
services/cygx/contract_allocation.go

@@ -139,9 +139,9 @@ func GetCompanyContractPermissionNameMapById(companyContractIds []int) (mapContr
 			}
 			if v.ChartPermissionId == utils.CHART_PERMISSION_ID_YANXUAN {
 				if v.ExpensiveYx == 1 {
-					mapContractIdPerssion[(v.CompanyContractId)] += utils.CHART_PERMISSION_NAME_MF_YANXUAN + "(5w),"
+					mapContractIdPerssion[(v.CompanyContractId)] += "," + utils.CHART_PERMISSION_NAME_MF_YANXUAN + "(5w),"
 				} else if v.ExpensiveYx == 2 {
-					mapContractIdPerssion[(v.CompanyContractId)] += utils.CHART_PERMISSION_NAME_MF_YANXUAN + "(10w),"
+					mapContractIdPerssion[(v.CompanyContractId)] += "," + utils.CHART_PERMISSION_NAME_MF_YANXUAN + "(10w),"
 				} else {
 					mapContractIdPerssion[(v.CompanyContractId)] += utils.CHART_PERMISSION_NAME_MF_YANXUAN + ","
 				}

+ 1 - 1
services/cygx/resource_data.go

@@ -75,7 +75,7 @@ func UpdateActivityResourceData(sourceId int) {
 			return
 		}
 		var resourceDataId int
-		publishDate := detail.CreateTime // 活动创建时间作为排序时间
+		publishDate := detail.LastUpdatedTime // 活动最后更新时间作为排序时间
 
 		item := new(cygx.CygxResourceData)
 

+ 102 - 19
services/roadshow/report.go

@@ -190,13 +190,15 @@ func GetTimeIntervalData(startDate, endDate, adminType, dimensionType string) (a
 }
 
 type AdminDataMap struct {
-	TryOutMap  map[int]int `description:"试用路演次数"`
-	FormalMap  map[int]int `description:"正式路演次数"`
-	MeetingMap map[int]int `description:"会议次数"`
-	OnlineMap  map[int]int `description:"线上路演次数"`
-	OfflineMap map[int]int `description:"线上路演次数"`
-	StartDate  string      `description:"开始日期"`
-	EndDate    string      `description:"开始日期"`
+	TryOutMap   map[int]int `description:"试用路演次数"`
+	FormalMap   map[int]int `description:"正式路演次数"`
+	MeetingMap  map[int]int `description:"会议次数"`
+	OnlineMap   map[int]int `description:"线上路演次数"`
+	OfflineMap  map[int]int `description:"线上路演次数"`
+	RoadShowMap map[int]int `description:"路演总次数"`
+	SalonMap    map[int]int `description:"沙龙路演次数"`
+	StartDate   string      `description:"开始日期"`
+	EndDate     string      `description:"开始日期"`
 }
 
 // getSectionData 获取周期数据
@@ -219,6 +221,8 @@ func getResearcherSectionData(startDate, endDate time.Time) (adminDataMap AdminD
 	tryOutMap := make(map[int]int)
 	formalMap := make(map[int]int)
 	meetingMap := make(map[int]int)
+	roadShowMap := make(map[int]int) // 路演总次数
+	salonMap := make(map[int]int)    //沙龙路演次数
 	//正式客户
 	{
 		var condition string
@@ -269,12 +273,49 @@ func getResearcherSectionData(startDate, endDate time.Time) (adminDataMap AdminD
 			meetingMap[v.AdminId] = v.Num
 		}
 	}
+
+	//路演总次数
+	{
+		var condition string
+		var pars []interface{}
+		condition = ` and start_date >= ? and end_date <= ? and activity_type = ? `
+		pars = append(pars, startDate, endDate, "路演")
+		data, tmpErr := roadshow.GetGroupResearcherRecordList(condition, pars)
+		if tmpErr != nil {
+			err = tmpErr
+			return
+		}
+		for _, v := range data {
+			//fmt.Println(v)
+			roadShowMap[v.AdminId] = v.Num
+		}
+	}
+
+	//沙龙路演次数
+	{
+		var condition string
+		var pars []interface{}
+		condition = ` and start_date >= ? and end_date <= ? and activity_type = ? `
+		pars = append(pars, startDate, endDate, "沙龙")
+		data, tmpErr := roadshow.GetGroupResearcherRecordList(condition, pars)
+		if tmpErr != nil {
+			err = tmpErr
+			return
+		}
+		for _, v := range data {
+			//fmt.Println(v)
+			salonMap[v.AdminId] = v.Num
+		}
+	}
+
 	adminDataMap = AdminDataMap{
-		TryOutMap:  tryOutMap,
-		FormalMap:  formalMap,
-		MeetingMap: meetingMap,
-		StartDate:  startDate.Format(utils.FormatDate),
-		EndDate:    endDate.Format(utils.FormatDate),
+		TryOutMap:   tryOutMap,
+		FormalMap:   formalMap,
+		MeetingMap:  meetingMap,
+		RoadShowMap: roadShowMap,
+		SalonMap:    salonMap,
+		StartDate:   startDate.Format(utils.FormatDate),
+		EndDate:     endDate.Format(utils.FormatDate),
 	}
 	return
 }
@@ -286,6 +327,9 @@ func getSellerSectionData(startDate, endDate time.Time, dimensionType string) (a
 	meetingMap := make(map[int]int)
 	onlineMap := make(map[int]int)
 	offlineMap := make(map[int]int)
+	roadShowMap := make(map[int]int) // 路演总次数
+	salonMap := make(map[int]int)    //沙龙路演次数
+
 	//fmt.Println()
 	//客户状态维度
 	if dimensionType == "company_status" {
@@ -438,14 +482,53 @@ func getSellerSectionData(startDate, endDate time.Time, dimensionType string) (a
 		}
 	}
 
+	//权益路演
+	if dimensionType == "roadshow_rai" {
+		//路演总次数
+		{
+			var condition string
+			var pars []interface{}
+			condition = ` and start_date >= ? and end_date <= ? and activity_type = ? `
+			pars = append(pars, startDate, endDate, "路演")
+			data, tmpErr := roadshow.GetGroupSellerRecordList(condition, pars)
+			if tmpErr != nil {
+				err = tmpErr
+				return
+			}
+			for _, v := range data {
+				//fmt.Println(v)
+				roadShowMap[v.AdminId] = v.Num
+			}
+		}
+
+		//沙龙路演次数
+		{
+			var condition string
+			var pars []interface{}
+			condition = ` and start_date >= ? and end_date <= ? and activity_type = ? `
+			pars = append(pars, startDate, endDate, "沙龙")
+			data, tmpErr := roadshow.GetGroupSellerRecordList(condition, pars)
+			if tmpErr != nil {
+				err = tmpErr
+				return
+			}
+			for _, v := range data {
+				//fmt.Println(v)
+				salonMap[v.AdminId] = v.Num
+			}
+		}
+	}
+
 	adminDataMap = AdminDataMap{
-		TryOutMap:  tryOutMap,
-		FormalMap:  formalMap,
-		MeetingMap: meetingMap,
-		OfflineMap: offlineMap,
-		OnlineMap:  onlineMap,
-		StartDate:  startDate.Format(utils.FormatDate),
-		EndDate:    endDate.Format(utils.FormatDate),
+		TryOutMap:   tryOutMap,
+		FormalMap:   formalMap,
+		MeetingMap:  meetingMap,
+		OfflineMap:  offlineMap,
+		OnlineMap:   onlineMap,
+		RoadShowMap: roadShowMap,
+		SalonMap:    salonMap,
+		StartDate:   startDate.Format(utils.FormatDate),
+		EndDate:     endDate.Format(utils.FormatDate),
 	}
 	return
 }

+ 1 - 1
services/statistic_report/company.go

@@ -112,7 +112,7 @@ func CompanyList(sysUser *system.Admin, req statisticModels.IncrementalCompanyLi
 		} else if sortParam == "shareSellerName" {
 			sortStr = " ORDER BY CONVERT( b.share_seller USING gbk ) COLLATE gbk_chinese_ci "
 		} else if sortParam == "status" {
-			sortStr = " ORDER BY b.status "
+			sortStr = " ORDER BY sort_status "
 		}  else if sortParam == "serviceYears" {
 			sortStr = " ORDER BY d.first_date"
 		} else if sortParam == "latestServiceRecord" {

+ 33 - 33
utils/common.go

@@ -2203,6 +2203,39 @@ func GetLikeKeywordPars(pars []interface{}, keyword string, num int) (newPars []
 	return
 }
 
+// 处理活动名称
+func TruncateActivityNameString(s string) string {
+	// 计算字符串总字数(按汉字、数字、字母和特殊符号计算)
+	totalCharCount := utf8.RuneCountInString(s)
+	// 如果总字数不超过18,则直接返回整个字符串
+	if totalCharCount <= 18 {
+		return s
+	}
+	// 计算前15个汉字所需的字节位置
+	hanziCount := 0
+	byteIndex := 0
+	for byteIndex < len(s) && hanziCount < 15 {
+		r, size := utf8.DecodeRuneInString(s[byteIndex:])
+		if r != utf8.RuneError {
+			hanziCount++
+		}
+		byteIndex += size
+	}
+	// 截取前15个汉字,并添加省略号
+	return s[:byteIndex] + "…"
+}
+
+// GetLikeKeyword
+//
+//	@Description: 获取sql查询中的like查询字段
+//	@author: Roc
+//	@datetime2023-10-23 14:46:32
+//	@param keyword string
+//	@return string
+func GetLikeKeyword(keyword string) string {
+	return `%` + keyword + `%`
+}
+
 // 通过开始时间,结束时间,获取对应季度的第一天数组
 func GetQuarterStartDatesInRange(startTimeStr, endTimeStr string) ([]string, error) {
 	startTime, err := time.Parse("2006-01-02", startTimeStr)
@@ -2320,36 +2353,3 @@ func GetLastDayOfQuarter(t time.Time) time.Time {
 	lastDay := time.Date(year, time.Month(nextQuarter), 1, 0, 0, 0, 0, time.UTC).AddDate(0, 1, 0).Add(-time.Second)
 	return lastDay
 }
-
-// 处理活动名称
-func TruncateActivityNameString(s string) string {
-	// 计算字符串总字数(按汉字、数字、字母和特殊符号计算)
-	totalCharCount := utf8.RuneCountInString(s)
-	// 如果总字数不超过18,则直接返回整个字符串
-	if totalCharCount <= 18 {
-		return s
-	}
-	// 计算前15个汉字所需的字节位置
-	hanziCount := 0
-	byteIndex := 0
-	for byteIndex < len(s) && hanziCount < 15 {
-		r, size := utf8.DecodeRuneInString(s[byteIndex:])
-		if r != utf8.RuneError {
-			hanziCount++
-		}
-		byteIndex += size
-	}
-	// 截取前15个汉字,并添加省略号
-	return s[:byteIndex] + "…"
-}
-
-// GetLikeKeyword
-//
-//	@Description: 获取sql查询中的like查询字段
-//	@author: Roc
-//	@datetime2023-10-23 14:46:32
-//	@param keyword string
-//	@return string
-func GetLikeKeyword(keyword string) string {
-	return `%` + keyword + `%`
-}

+ 19 - 20
utils/constants.go

@@ -484,21 +484,21 @@ const (
 
 // 查研观向小程序 模板消息地址路由
 const (
-	WX_MSG_PATH_ARTICLE_DETAIL                  = "pageMy/reportDetail/reportDetail?id="                          //文章详情模板消息地址
-	WX_MSG_PATH_ACTIVITY_SPECIAL_DETAIL         = "activityPages/specialDetail/specialDetail?id="                 //专项调研活动模板消息地址
-	WX_MSG_PATH_ROAD_ESSENCE                    = "reportPages/roadEssence/roadEssence?id="                       //路演精华模板消息地址
-	WX_MSG_PATH_ACTIVITY_DETAIL                 = "activityPages/activityDetail/activityDetail?id="               //活动模板消息地址
-	WX_MSG_PATH_PRODUCTINTERIOR_DETAIL          = "reportPages/internalDetials/internalDetials?id="               //产品内测模版消息地址
-	WX_MSG_PATH_ACTIVITY_SIGNIN                 = "pages-signIn/isSignIn/isSignIn"                                //扫s码签到地址
-	WX_MSG_PATH_THIS_WEEK_DETAIL                = "/reportPages/reportSecretDetail/reportSecretDetail?type=2&id=" //本周研究汇总详情模板消息地址
-	WX_MSG_PATH_LAST_WEEK_DETAIL                = "/reportPages/reportSecretDetail/reportSecretDetail?type=3&id=" //上周纪要汇总详情模板消息地址
-	WX_MSG_PATH_KEY_COMPANY_DETAIL              = "/reportPages/keyCompany/keyCompany?id="                        //重点公司详情模板消息地址
-	WX_MSG_PATH_INDUSTRY_DETAIL                 = "/reportPages/IndustryReport/IndustryReport?id="                //产业详情模板消息地址
-	CYGX_YANXUAN_POINTS_KEY              string = "CYGX_YANXUAN_POINTS_KEY"                                       //查研观向研选活动扣点KEY(冲突,先放这里)
-	WX_MSG_PATH_YX_SPECIAL_DETAIL               = "pages-purchaser/noteAndViewpoint/noteAndViewpoint?id="         //研选专栏详情
-	WX_MSG_PATH_YX_SPECIAL_ENABLE_DETAIL        = "pages-purchaser/toExamine/toExamine?id="                       //研选专栏审核详情页面
-	WX_MSG_PATH_YX_SPECIAL_CENTER               = "pages-purchaser/contentAllPage/contentAllPage?Status=4"        //研选专栏内容中心
-	WX_MSG_PATH_QUESTIONNAIRE_DETAIL            = "pages-purchaser/themeVote/themeVote?id="                       //问卷调查详情页
+	WX_MSG_PATH_ARTICLE_DETAIL                  = "pageMy/reportDetail/reportDetail?IsSendWx=1&id="                          //文章详情模板消息地址
+	WX_MSG_PATH_ACTIVITY_SPECIAL_DETAIL         = "activityPages/specialDetail/specialDetail?IsSendWx=1&id="                 //专项调研活动模板消息地址
+	WX_MSG_PATH_ROAD_ESSENCE                    = "reportPages/roadEssence/roadEssence?IsSendWx=1&id="                       //路演精华模板消息地址
+	WX_MSG_PATH_ACTIVITY_DETAIL                 = "activityPages/activityDetail/activityDetail?IsSendWx=1&id="               //活动模板消息地址
+	WX_MSG_PATH_PRODUCTINTERIOR_DETAIL          = "reportPages/internalDetials/internalDetials?IsSendWx=1&id="               //产品内测模版消息地址
+	WX_MSG_PATH_ACTIVITY_SIGNIN                 = "pages-signIn/isSignIn/isSignIn"                                           //扫s码签到地址
+	WX_MSG_PATH_THIS_WEEK_DETAIL                = "/reportPages/reportSecretDetail/reportSecretDetail?type=2&IsSendWx=1&id=" //本周研究汇总详情模板消息地址
+	WX_MSG_PATH_LAST_WEEK_DETAIL                = "/reportPages/reportSecretDetail/reportSecretDetail?type=3&IsSendWx=1&id=" //上周纪要汇总详情模板消息地址
+	WX_MSG_PATH_KEY_COMPANY_DETAIL              = "/reportPages/keyCompany/keyCompany?IsSendWx=1&id="                        //重点公司详情模板消息地址
+	WX_MSG_PATH_INDUSTRY_DETAIL                 = "/reportPages/IndustryReport/IndustryReport?IsSendWx=1&id="                //产业详情模板消息地址
+	CYGX_YANXUAN_POINTS_KEY              string = "CYGX_YANXUAN_POINTS_KEY"                                                  //查研观向研选活动扣点KEY(冲突,先放这里)
+	WX_MSG_PATH_YX_SPECIAL_DETAIL               = "pages-purchaser/noteAndViewpoint/noteAndViewpoint?IsSendWx=1&id="         //研选专栏详情
+	WX_MSG_PATH_YX_SPECIAL_ENABLE_DETAIL        = "pages-purchaser/toExamine/toExamine?IsSendWx=1&id="                       //研选专栏审核详情页面
+	WX_MSG_PATH_YX_SPECIAL_CENTER               = "pages-purchaser/contentAllPage/contentAllPage?Status=4"                   //研选专栏内容中心
+	WX_MSG_PATH_QUESTIONNAIRE_DETAIL            = "pages-purchaser/themeVote/themeVote?IsSendWx=1&id="                       //问卷调查详情页
 )
 
 // 图表类型
@@ -596,10 +596,6 @@ const (
 	EnCompanyIdStep = 10000000
 )
 
-const (
-	TelAreaCodeHome = "86" // 大陆区号
-)
-
 const (
 	MobileShenTao       = "18767183922" //沈涛手机号18767183922
 	MobileZhangChuanXin = "15557270714" // 张传星手机号
@@ -607,9 +603,12 @@ const (
 	MobileWuAngDi       = "18701809782" // 吴昂迪手机号
 )
 
+const (
+	TelAreaCodeHome = "86" // 大陆区号
+)
+
 // 买方研选小程序 模版消息路由
 const (
 	WX_MSG_PATH_YX_ACTIVITY_DETAIL = "pages-activity/activityDetail/activityDetail?id=" //研选活动详情
 	WX_MSG_PATH_YX_ARTICLE_DETAIL  = "pages-user/reportDetail/reportDetail?id="         //研选纪要详情
-
 )