浏览代码

Merge branch 'master' of http://8.136.199.33:3000/hongze/hz_crm_api into cygx/cygx_12.8

xingzai 1 年之前
父节点
当前提交
2a3b765333

+ 4 - 0
controllers/ai/ai.go

@@ -101,6 +101,10 @@ func (this *AiController) List() {
 			model = 1
 		} else if req.Model == "gpt-3.5-turbo-16k" {
 			model = 3
+		} else if req.Model == "GPT4" {
+			model = 4
+		} else if req.Model == "GPT-4 Turbo" {
+			model = 5
 		} else {
 			model = 2
 		}

+ 845 - 1
controllers/company_seller.go

@@ -170,7 +170,6 @@ func (this *CompanySellerController) CheckListV2() {
 		br.Ret = 408
 		return
 	}
-
 	roleCodeTypeStr := ``
 	productId := services.GetProductId(sysUser.RoleTypeCode)
 	switch productId {
@@ -2500,3 +2499,848 @@ func (this *CompanySellerController) RoadshowFiccList() {
 	br.Msg = "获取成功"
 	br.Data = resp
 }
+
+// CheckListV2
+// @Title 获取组长/组员下销售(根据部门、分组)
+// @Description 获取组长/组员下销售(根据部门、分组)接口
+// @Param   AllSeller   query   bool  true       "是否获取部门所有的销售信息"
+// @Param   Status   query   int  true       "客户状态 1:流失 0:非流失"
+// @Param   AllEnabled   query   bool  true       "是否获取包含禁用的用户"
+// @Success 200 {object} company.DepartmentGroupSellersResp
+// @router /seller/check/list_rai [get]
+func (this *CompanySellerController) CheckListRai() {
+	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
+	}
+	roleCodeTypeStr := ``
+	productId := utils.COMPANY_PRODUCT_RAI_ID
+	roleCodeTypeStr = `"` + utils.ROLE_TYPE_CODE_RAI_SELLER + `","` + utils.ROLE_TYPE_CODE_RAI_GROUP + `"`
+
+	if sysUser.RoleTypeCode == utils.ROLE_TYPE_CODE_RAI_ADMIN {
+		// 权益管理员,查看所有权益的账号
+		roleCodeTypeStr = `"` + utils.ROLE_TYPE_CODE_RAI_SELLER + `","` + utils.ROLE_TYPE_CODE_RAI_GROUP + `","` + utils.ROLE_TYPE_CODE_RAI_RESEARCHR + `","` + utils.ROLE_TYPE_CODE_RAI_ADMIN + `"`
+	}
+
+	getAllSeller, _ := this.GetBool("AllSeller", false)
+	status, _ := this.GetInt("Status", 0)
+	getAllEnabled, _ := this.GetBool("AllEnabled", false)
+	enabled := 1       //默认只获取正常状态的用户
+	if getAllEnabled { //获取所有状态的用户
+		enabled = -1
+	}
+	list := make([]company.DepartmentGroupSellers, 0)
+	if getAllSeller == false {
+		if sysUser.RoleTypeCode == utils.ROLE_TYPE_CODE_RAI_ADMIN || sysUser.Authority == 1 || sysUser.RoleTypeCode == utils.ROLE_TYPE_CODE_ADMIN {
+			//部门管理员看小组、销售
+			departmentId := sysUser.DepartmentId
+			switch sysUser.RoleTypeCode {
+			case utils.ROLE_TYPE_CODE_ADMIN: //管理员
+				departmentId = 5
+			case utils.ROLE_TYPE_CODE_RAI_ADMIN: //权益管理员
+				departmentId = 5
+			case utils.ROLE_TYPE_CODE_FICC_ADMIN: //ficc管理员
+				departmentId = 2
+			}
+
+			groupList, err := system.GetSysGroupByDepartmentId(departmentId)
+			if err != nil {
+				br.Msg = "获取失败"
+				br.ErrMsg = "获取分组失败,Err:" + err.Error()
+				return
+			}
+			for _, group := range groupList {
+				groupSellerList := make([]company.DepartmentGroupSellers, 0)
+				groupItem := company.DepartmentGroupSellers{
+					AdminId: fmt.Sprint("group_", group.DepartmentId),
+					//AdminName string `description:"系统用户名称"`
+					RealName:     group.GroupName,
+					ChildrenList: groupSellerList,
+				}
+				teamList, err := system.GetSysTeamByDepartmentId(group.GroupId)
+				if err != nil {
+					br.Msg = "获取小组失败"
+					br.ErrMsg = "获取小组失败,Err:" + err.Error()
+					return
+				}
+				for _, team := range teamList {
+					teamSellerList := make([]company.DepartmentGroupSellers, 0)
+					teamItem := company.DepartmentGroupSellers{
+						AdminId: fmt.Sprint("team_", team.GroupId),
+						//AdminName string `description:"系统用户名称"`
+						RealName:     team.GroupName,
+						ChildrenList: teamSellerList,
+					}
+					sellerList, err := system.GetTeamSysUserList(team.GroupId, enabled)
+					if err != nil {
+						br.Msg = "获取销售失败"
+						br.ErrMsg = "获取销售失败,Err:" + err.Error()
+						return
+					}
+					for _, seller := range sellerList {
+						sellerItem := company.DepartmentGroupSellers{
+							AdminId: fmt.Sprint(seller.AdminId),
+							//AdminName string `description:"系统用户名称"`
+							RealName:     seller.RealName,
+							Authority:    seller.Authority,
+							RoleTypeCode: seller.RoleTypeCode,
+						}
+						//fmt.Println("seller.RealName:", seller.RealName)
+						teamSellerList = append(teamSellerList, sellerItem)
+					}
+					teamSellerList = sortDepartmentGroupSellers(teamSellerList)
+					teamItem.ChildrenList = teamSellerList
+					if len(teamSellerList) > 0 {
+						groupSellerList = append(groupSellerList, teamItem)
+					}
+				}
+				//分组为0的销售(直属分组)
+				groupTeamSellerList, err := system.GetGrooupsysUserList(group.GroupId, roleCodeTypeStr, enabled)
+				if err != nil {
+					br.Msg = "获取销售失败"
+					br.ErrMsg = "获取销售失败,Err:" + err.Error()
+					return
+				}
+				if len(groupTeamSellerList) > 0 {
+					tmpDepartmentGroupSellersList := make([]company.DepartmentGroupSellers, 0)
+					for _, seller := range groupTeamSellerList {
+						sellerItem := company.DepartmentGroupSellers{
+							AdminId: fmt.Sprint(seller.AdminId),
+							//AdminName string `description:"系统用户名称"`
+							RealName:     seller.RealName,
+							Authority:    seller.Authority,
+							RoleTypeCode: seller.RoleTypeCode,
+						}
+						tmpDepartmentGroupSellersList = append(tmpDepartmentGroupSellersList, sellerItem)
+					}
+					//排个序
+					tmpDepartmentGroupSellersList = sortDepartmentGroupSellers(tmpDepartmentGroupSellersList)
+					groupSellerList = append(groupSellerList, tmpDepartmentGroupSellersList...)
+				}
+
+				groupItem.ChildrenList = groupSellerList
+				if len(groupSellerList) > 0 {
+					list = append(list, groupItem)
+				}
+			}
+
+			//分组为0的销售(直属部门)
+			departmentSellerList, err := system.GetDepartmentGroupSysUserList(departmentId, 0, roleCodeTypeStr)
+			if err != nil {
+				br.Msg = "获取销售失败"
+				br.ErrMsg = "获取销售失败,Err:" + err.Error()
+				return
+			}
+			if len(departmentSellerList) > 0 {
+				tmpDepartmentGroupSeller := make([]company.DepartmentGroupSellers, 0)
+				for _, seller := range departmentSellerList {
+					sellerItem := company.DepartmentGroupSellers{
+						AdminId: fmt.Sprint(seller.AdminId),
+						//AdminName string `description:"系统用户名称"`
+						RealName:     seller.RealName,
+						Authority:    seller.Authority,
+						RoleTypeCode: seller.RoleTypeCode,
+					}
+					tmpDepartmentGroupSeller = append(tmpDepartmentGroupSeller, sellerItem)
+				}
+				tmpDepartmentGroupSeller = sortDepartmentGroupSellers(tmpDepartmentGroupSeller)
+				list = append(list, tmpDepartmentGroupSeller...)
+			}
+		} else if sysUser.RoleTypeCode == utils.ROLE_TYPE_CODE_RAI_GROUP || (sysUser.Authority == 2 && sysUser.RoleTypeCode != utils.ROLE_TYPE_CODE_FICC_GROUP) {
+			// 权益组长看小组
+			if status == 0 {
+				sellerList, err := system.GetTeamSysUserList(sysUser.GroupId, enabled)
+				if err != nil {
+					br.Msg = "获取销售失败"
+					br.ErrMsg = "获取销售失败,Err:" + err.Error()
+					return
+				}
+				for _, seller := range sellerList {
+					sellerItem := company.DepartmentGroupSellers{
+						AdminId: fmt.Sprint(seller.AdminId),
+						//AdminName string `description:"系统用户名称"`
+						RealName:     seller.RealName,
+						Authority:    seller.Authority,
+						RoleTypeCode: seller.RoleTypeCode,
+					}
+					//fmt.Println("seller.RealName:", seller.RealName)
+					list = append(list, sellerItem)
+				}
+				list = sortDepartmentGroupSellers(list)
+
+				//正常来说没有所有人都应该在某个小组下,要不就是小组名为 无 的小组
+				//分组为0的销售(直属分组)
+				//groupTeamSellerList, err := system.GetGrooupsysUserList(sysUser.GroupId, 0, roleCodeTypeStr)
+				//if err != nil {
+				//	br.Msg = "获取销售失败"
+				//	br.ErrMsg = "获取销售失败,Err:" + err.Error()
+				//	return
+				//}
+				//if len(groupTeamSellerList) > 0 {
+				//	tmpDepartmentGroupSellersList := make([]company.DepartmentGroupSellers, 0)
+				//	for _, seller := range groupTeamSellerList {
+				//		sellerItem := company.DepartmentGroupSellers{
+				//			AdminId: fmt.Sprint(seller.AdminId),
+				//			//AdminName string `description:"系统用户名称"`
+				//			RealName:     seller.RealName,
+				//			Authority:    seller.Authority,
+				//			RoleTypeCode: seller.RoleTypeCode,
+				//		}
+				//		tmpDepartmentGroupSellersList = append(tmpDepartmentGroupSellersList, sellerItem)
+				//	}
+				//	//排个序
+				//	tmpDepartmentGroupSellersList = sortDepartmentGroupSellers(tmpDepartmentGroupSellersList)
+				//	list = append(list, tmpDepartmentGroupSellersList...)
+				//}
+				//sellerList, err := system.GetDepartmentGroupSysUserList(sysUser.DepartmentId, sysUser.GroupId, roleCodeTypeStr)
+				//if err != nil {
+				//	br.Msg = "获取销售失败"
+				//	br.ErrMsg = "获取销售失败,Err:" + err.Error()
+				//	return
+				//}
+				//for _, seller := range sellerList {
+				//	sellerItem := company.DepartmentGroupSellers{
+				//		AdminId: fmt.Sprint(seller.AdminId),
+				//		//AdminName string `description:"系统用户名称"`
+				//		RealName:     seller.RealName,
+				//		Authority:    seller.Authority,
+				//		RoleTypeCode: seller.RoleTypeCode,
+				//	}
+				//	list = append(list, sellerItem)
+				//	list = sortDepartmentGroupSellers(list)
+				//}
+			} else {
+				departmentId := 5
+				groupList, err := system.GetSysGroupByDepartmentId(departmentId)
+				if err != nil {
+					br.Msg = "获取失败"
+					br.ErrMsg = "获取分组失败,Err:" + err.Error()
+					return
+				}
+				for _, group := range groupList {
+					groupSellerList := make([]company.DepartmentGroupSellers, 0)
+					groupItem := company.DepartmentGroupSellers{
+						AdminId: fmt.Sprint("group_", group.DepartmentId),
+						//AdminName string `description:"系统用户名称"`
+						RealName:     group.GroupName,
+						ChildrenList: groupSellerList,
+					}
+					teamList, err := system.GetSysTeamByDepartmentId(group.GroupId)
+					if err != nil {
+						br.Msg = "获取小组失败"
+						br.ErrMsg = "获取小组失败,Err:" + err.Error()
+						return
+					}
+					for _, team := range teamList {
+						teamSellerList := make([]company.DepartmentGroupSellers, 0)
+						teamItem := company.DepartmentGroupSellers{
+							AdminId: fmt.Sprint("team_", team.GroupId),
+							//AdminName string `description:"系统用户名称"`
+							RealName:     team.GroupName,
+							ChildrenList: teamSellerList,
+						}
+						sellerList, err := system.GetTeamSysUserList(team.GroupId, enabled)
+						if err != nil {
+							br.Msg = "获取销售失败"
+							br.ErrMsg = "获取销售失败,Err:" + err.Error()
+							return
+						}
+						for _, seller := range sellerList {
+							sellerItem := company.DepartmentGroupSellers{
+								AdminId: fmt.Sprint(seller.AdminId),
+								//AdminName string `description:"系统用户名称"`
+								RealName:     seller.RealName,
+								Authority:    seller.Authority,
+								RoleTypeCode: seller.RoleTypeCode,
+							}
+							//fmt.Println("seller.RealName:", seller.RealName)
+							teamSellerList = append(teamSellerList, sellerItem)
+						}
+						teamSellerList = sortDepartmentGroupSellers(teamSellerList)
+						teamItem.ChildrenList = teamSellerList
+						if len(teamSellerList) > 0 {
+							groupSellerList = append(groupSellerList, teamItem)
+						}
+					}
+					//分组为0的销售(直属分组)
+					groupTeamSellerList, err := system.GetGrooupsysUserList(group.GroupId, roleCodeTypeStr, enabled)
+					if err != nil {
+						br.Msg = "获取销售失败"
+						br.ErrMsg = "获取销售失败,Err:" + err.Error()
+						return
+					}
+					if len(groupTeamSellerList) > 0 {
+						tmpDepartmentGroupSellersList := make([]company.DepartmentGroupSellers, 0)
+						for _, seller := range groupTeamSellerList {
+							sellerItem := company.DepartmentGroupSellers{
+								AdminId: fmt.Sprint(seller.AdminId),
+								//AdminName string `description:"系统用户名称"`
+								RealName:     seller.RealName,
+								Authority:    seller.Authority,
+								RoleTypeCode: seller.RoleTypeCode,
+							}
+							tmpDepartmentGroupSellersList = append(tmpDepartmentGroupSellersList, sellerItem)
+						}
+						//排个序
+						tmpDepartmentGroupSellersList = sortDepartmentGroupSellers(tmpDepartmentGroupSellersList)
+						groupSellerList = append(groupSellerList, tmpDepartmentGroupSellersList...)
+					}
+
+					//groupItem.ChildrenList = groupSellerList
+					//if len(groupSellerList) > 0 {
+					//	list = append(list, item)
+					//}
+
+					//sellerList, err := system.GetGroupSysUserList(group.DepartmentId)
+					//if err != nil {
+					//	br.Msg = "获取销售失败"
+					//	br.ErrMsg = "获取销售失败,Err:" + err.Error()
+					//	return
+					//}
+					//for _, seller := range sellerList {
+					//	sellerItem := company.DepartmentGroupSellers{
+					//		AdminId: fmt.Sprint(seller.AdminId),
+					//		//AdminName string `description:"系统用户名称"`
+					//		RealName:     seller.RealName,
+					//		Authority:    seller.Authority,
+					//		RoleTypeCode: seller.RoleTypeCode,
+					//	}
+					//	groupSellerList = append(groupSellerList, sellerItem)
+					//}
+					//groupSellerList = sortDepartmentGroupSellers(groupSellerList)
+					groupItem.ChildrenList = groupSellerList
+					if len(groupSellerList) > 0 {
+						list = append(list, groupItem)
+					}
+				}
+
+				//分组为0的销售(直属部门)
+				departmentSellerList, err := system.GetDepartmentGroupSysUserList(departmentId, 0, roleCodeTypeStr)
+				if err != nil {
+					br.Msg = "获取销售失败"
+					br.ErrMsg = "获取销售失败,Err:" + err.Error()
+					return
+				}
+				if len(departmentSellerList) > 0 {
+					tmpDepartmentGroupSeller := make([]company.DepartmentGroupSellers, 0)
+					for _, seller := range departmentSellerList {
+						sellerItem := company.DepartmentGroupSellers{
+							AdminId: fmt.Sprint(seller.AdminId),
+							//AdminName string `description:"系统用户名称"`
+							RealName:     seller.RealName,
+							Authority:    seller.Authority,
+							RoleTypeCode: seller.RoleTypeCode,
+						}
+						tmpDepartmentGroupSeller = append(tmpDepartmentGroupSeller, sellerItem)
+					}
+					tmpDepartmentGroupSeller = sortDepartmentGroupSellers(tmpDepartmentGroupSeller)
+					list = append(list, tmpDepartmentGroupSeller...)
+				}
+			}
+
+		} else if sysUser.RoleTypeCode == utils.ROLE_TYPE_CODE_FICC_GROUP || sysUser.Authority == 2 {
+
+		} else if sysUser.RoleTypeCode == utils.ROLE_TYPE_CODE_FICC_SELLER && status == 1 {
+			//var departmentStr string
+			//if utils.RunMode == "release" {
+			//	departmentStr = `1,2`
+			//} else {
+			//	departmentStr = `1,2`
+			//}
+			departmentStr := `1,2`
+			departmentList, err := system.GetDepartmentListByIds(departmentStr)
+			if err != nil {
+				br.Msg = "获取失败"
+				br.ErrMsg = "获取部门失败,Err:" + err.Error()
+				return
+			}
+			for _, department := range departmentList {
+				departmentGroupSellerList := make([]company.DepartmentGroupSellers, 0)
+				item := company.DepartmentGroupSellers{
+					AdminId: fmt.Sprint("department_", department.DepartmentId),
+					//AdminName string `description:"系统用户名称"`
+					RealName:     department.DepartmentName,
+					ChildrenList: departmentGroupSellerList,
+				}
+
+				groupList, err := system.GetSysGroupByDepartmentId(department.DepartmentId)
+				if err != nil {
+					br.Msg = "获取失败"
+					br.ErrMsg = "获取分组失败,Err:" + err.Error()
+					return
+				}
+				for _, group := range groupList {
+					groupSellerList := make([]company.DepartmentGroupSellers, 0)
+					groupItem := company.DepartmentGroupSellers{
+						AdminId: fmt.Sprint("group_", group.DepartmentId),
+						//AdminName string `description:"系统用户名称"`
+						RealName:     group.GroupName,
+						ChildrenList: groupSellerList,
+					}
+					teamList, err := system.GetSysTeamByDepartmentId(group.GroupId)
+					if err != nil {
+						br.Msg = "获取小组失败"
+						br.ErrMsg = "获取小组失败,Err:" + err.Error()
+						return
+					}
+					for _, team := range teamList {
+						teamSellerList := make([]company.DepartmentGroupSellers, 0)
+						teamItem := company.DepartmentGroupSellers{
+							AdminId: fmt.Sprint("team_", team.GroupId),
+							//AdminName string `description:"系统用户名称"`
+							RealName:     team.GroupName,
+							ChildrenList: teamSellerList,
+						}
+						sellerList, err := system.GetTeamSysUserList(team.GroupId, enabled)
+						if err != nil {
+							br.Msg = "获取销售失败"
+							br.ErrMsg = "获取销售失败,Err:" + err.Error()
+							return
+						}
+						for _, seller := range sellerList {
+							sellerItem := company.DepartmentGroupSellers{
+								AdminId: fmt.Sprint(seller.AdminId),
+								//AdminName string `description:"系统用户名称"`
+								RealName:     seller.RealName,
+								Authority:    seller.Authority,
+								RoleTypeCode: seller.RoleTypeCode,
+							}
+							//fmt.Println("seller.RealName:", seller.RealName)
+							teamSellerList = append(teamSellerList, sellerItem)
+						}
+						teamSellerList = sortDepartmentGroupSellers(teamSellerList)
+						teamItem.ChildrenList = teamSellerList
+						if len(teamSellerList) > 0 {
+							groupSellerList = append(groupSellerList, teamItem)
+						}
+					}
+					//分组为0的人,不光是销售(直属分组)
+					groupTeamSellerList, err := system.GetGroupSysUserList(group.GroupId)
+					if err != nil {
+						br.Msg = "获取销售失败"
+						br.ErrMsg = "获取销售失败,Err:" + err.Error()
+						return
+					}
+					if len(groupTeamSellerList) > 0 {
+						tmpDepartmentGroupSellersList := make([]company.DepartmentGroupSellers, 0)
+						for _, seller := range groupTeamSellerList {
+							sellerItem := company.DepartmentGroupSellers{
+								AdminId: fmt.Sprint(seller.AdminId),
+								//AdminName string `description:"系统用户名称"`
+								RealName:     seller.RealName,
+								Authority:    seller.Authority,
+								RoleTypeCode: seller.RoleTypeCode,
+							}
+							tmpDepartmentGroupSellersList = append(tmpDepartmentGroupSellersList, sellerItem)
+						}
+						//排个序
+						tmpDepartmentGroupSellersList = sortDepartmentGroupSellers(tmpDepartmentGroupSellersList)
+						groupSellerList = append(groupSellerList, tmpDepartmentGroupSellersList...)
+					}
+
+					//groupItem.ChildrenList = groupSellerList
+					//if len(groupSellerList) > 0 {
+					//	list = append(list, item)
+					//}
+
+					//sellerList, err := system.GetGroupSysUserList(group.DepartmentId)
+					//if err != nil {
+					//	br.Msg = "获取销售失败"
+					//	br.ErrMsg = "获取销售失败,Err:" + err.Error()
+					//	return
+					//}
+					//for _, seller := range sellerList {
+					//	sellerItem := company.DepartmentGroupSellers{
+					//		AdminId: fmt.Sprint(seller.AdminId),
+					//		//AdminName string `description:"系统用户名称"`
+					//		RealName:     seller.RealName,
+					//		Authority:    seller.Authority,
+					//		RoleTypeCode: seller.RoleTypeCode,
+					//	}
+					//	groupSellerList = append(groupSellerList, sellerItem)
+					//}
+					//groupSellerList = sortDepartmentGroupSellers(groupSellerList)
+					groupItem.ChildrenList = groupSellerList
+					if len(groupSellerList) > 0 {
+						departmentGroupSellerList = append(departmentGroupSellerList, groupItem)
+					}
+				}
+
+				//分组为0的人,不光是销售(直属部门)
+				departmentSellerList, err := system.GetDepartmentGroupSysUserList(department.DepartmentId, 0, "")
+				if err != nil {
+					br.Msg = "获取销售失败"
+					br.ErrMsg = "获取销售失败,Err:" + err.Error()
+					return
+				}
+				if len(departmentSellerList) > 0 {
+					tmpDepartmentGroupSellersList := make([]company.DepartmentGroupSellers, 0)
+					for _, seller := range departmentSellerList {
+						sellerItem := company.DepartmentGroupSellers{
+							AdminId: fmt.Sprint(seller.AdminId),
+							//AdminName string `description:"系统用户名称"`
+							RealName:     seller.RealName,
+							Authority:    seller.Authority,
+							RoleTypeCode: seller.RoleTypeCode,
+						}
+						tmpDepartmentGroupSellersList = append(tmpDepartmentGroupSellersList, sellerItem)
+					}
+					//排个序
+					tmpDepartmentGroupSellersList = sortDepartmentGroupSellers(tmpDepartmentGroupSellersList)
+					departmentGroupSellerList = append(departmentGroupSellerList, tmpDepartmentGroupSellersList...)
+				}
+
+				item.ChildrenList = departmentGroupSellerList
+				if len(departmentGroupSellerList) > 0 {
+					list = append(list, item)
+				}
+			}
+		} else if sysUser.RoleTypeCode == utils.ROLE_TYPE_CODE_RAI_SELLER && status == 1 {
+			// 权益销售可以看到权益销售部的所有人
+			departmentId := 5
+			groupList, err := system.GetSysGroupByDepartmentId(departmentId)
+			if err != nil {
+				br.Msg = "获取失败"
+				br.ErrMsg = "获取分组失败,Err:" + err.Error()
+				return
+			}
+			for _, group := range groupList {
+				groupSellerList := make([]company.DepartmentGroupSellers, 0)
+				groupItem := company.DepartmentGroupSellers{
+					AdminId: fmt.Sprint("group_", group.DepartmentId),
+					//AdminName string `description:"系统用户名称"`
+					RealName:     group.GroupName,
+					ChildrenList: groupSellerList,
+				}
+				teamList, err := system.GetSysTeamByDepartmentId(group.GroupId)
+				if err != nil {
+					br.Msg = "获取小组失败"
+					br.ErrMsg = "获取小组失败,Err:" + err.Error()
+					return
+				}
+				for _, team := range teamList {
+					teamSellerList := make([]company.DepartmentGroupSellers, 0)
+					teamItem := company.DepartmentGroupSellers{
+						AdminId: fmt.Sprint("team_", team.GroupId),
+						//AdminName string `description:"系统用户名称"`
+						RealName:     team.GroupName,
+						ChildrenList: teamSellerList,
+					}
+					sellerList, err := system.GetTeamSysUserList(team.GroupId, enabled)
+					if err != nil {
+						br.Msg = "获取销售失败"
+						br.ErrMsg = "获取销售失败,Err:" + err.Error()
+						return
+					}
+					for _, seller := range sellerList {
+						sellerItem := company.DepartmentGroupSellers{
+							AdminId: fmt.Sprint(seller.AdminId),
+							//AdminName string `description:"系统用户名称"`
+							RealName:     seller.RealName,
+							Authority:    seller.Authority,
+							RoleTypeCode: seller.RoleTypeCode,
+						}
+						//fmt.Println("seller.RealName:", seller.RealName)
+						teamSellerList = append(teamSellerList, sellerItem)
+					}
+					teamSellerList = sortDepartmentGroupSellers(teamSellerList)
+					teamItem.ChildrenList = teamSellerList
+					if len(teamSellerList) > 0 {
+						groupSellerList = append(groupSellerList, teamItem)
+					}
+				}
+				//分组为0的销售(直属分组)
+				groupTeamSellerList, err := system.GetGrooupsysUserList(group.GroupId, roleCodeTypeStr, enabled)
+				if err != nil {
+					br.Msg = "获取销售失败"
+					br.ErrMsg = "获取销售失败,Err:" + err.Error()
+					return
+				}
+				if len(groupTeamSellerList) > 0 {
+					tmpDepartmentGroupSellersList := make([]company.DepartmentGroupSellers, 0)
+					for _, seller := range groupTeamSellerList {
+						sellerItem := company.DepartmentGroupSellers{
+							AdminId: fmt.Sprint(seller.AdminId),
+							//AdminName string `description:"系统用户名称"`
+							RealName:     seller.RealName,
+							Authority:    seller.Authority,
+							RoleTypeCode: seller.RoleTypeCode,
+						}
+						tmpDepartmentGroupSellersList = append(tmpDepartmentGroupSellersList, sellerItem)
+					}
+					//排个序
+					tmpDepartmentGroupSellersList = sortDepartmentGroupSellers(tmpDepartmentGroupSellersList)
+					groupSellerList = append(groupSellerList, tmpDepartmentGroupSellersList...)
+				}
+
+				//groupItem.ChildrenList = groupSellerList
+				//if len(groupSellerList) > 0 {
+				//	list = append(list, item)
+				//}
+
+				//sellerList, err := system.GetGroupSysUserList(group.DepartmentId)
+				//if err != nil {
+				//	br.Msg = "获取销售失败"
+				//	br.ErrMsg = "获取销售失败,Err:" + err.Error()
+				//	return
+				//}
+				//for _, seller := range sellerList {
+				//	sellerItem := company.DepartmentGroupSellers{
+				//		AdminId: fmt.Sprint(seller.AdminId),
+				//		//AdminName string `description:"系统用户名称"`
+				//		RealName:     seller.RealName,
+				//		Authority:    seller.Authority,
+				//		RoleTypeCode: seller.RoleTypeCode,
+				//	}
+				//	groupSellerList = append(groupSellerList, sellerItem)
+				//}
+				//groupSellerList = sortDepartmentGroupSellers(groupSellerList)
+				groupItem.ChildrenList = groupSellerList
+				if len(groupSellerList) > 0 {
+					list = append(list, groupItem)
+				}
+			}
+
+			//分组为0的销售(直属部门)
+			departmentSellerList, err := system.GetDepartmentGroupSysUserList(departmentId, 0, roleCodeTypeStr)
+			if err != nil {
+				br.Msg = "获取销售失败"
+				br.ErrMsg = "获取销售失败,Err:" + err.Error()
+				return
+			}
+			if len(departmentSellerList) > 0 {
+				tmpDepartmentGroupSeller := make([]company.DepartmentGroupSellers, 0)
+				for _, seller := range departmentSellerList {
+					sellerItem := company.DepartmentGroupSellers{
+						AdminId: fmt.Sprint(seller.AdminId),
+						//AdminName string `description:"系统用户名称"`
+						RealName:     seller.RealName,
+						Authority:    seller.Authority,
+						RoleTypeCode: seller.RoleTypeCode,
+					}
+					tmpDepartmentGroupSeller = append(tmpDepartmentGroupSeller, sellerItem)
+				}
+				tmpDepartmentGroupSeller = sortDepartmentGroupSellers(tmpDepartmentGroupSeller)
+				list = append(list, tmpDepartmentGroupSeller...)
+			}
+		} else {
+			//看自己
+			sellerItem := company.DepartmentGroupSellers{
+				AdminId: fmt.Sprint(sysUser.AdminId),
+				//AdminName string `description:"系统用户名称"`
+				RealName: sysUser.RealName,
+			}
+			list = append(list, sellerItem)
+		}
+	} else {
+		departmentId := sysUser.DepartmentId
+		switch productId {
+		case 1:
+			departmentId = 2
+		case 5:
+			departmentId = 5
+		}
+		//查询整个部门的小组、销售
+		groupList, err := system.GetSysGroupByDepartmentId(departmentId)
+		if err != nil {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取分组失败,Err:" + err.Error()
+			return
+		}
+		for _, group := range groupList {
+			groupSellerList := make([]company.DepartmentGroupSellers, 0)
+			groupItem := company.DepartmentGroupSellers{
+				AdminId: fmt.Sprint("group_", group.DepartmentId),
+				//AdminName string `description:"系统用户名称"`
+				RealName:     group.GroupName,
+				ChildrenList: groupSellerList,
+			}
+			teamList, err := system.GetSysTeamByDepartmentId(group.GroupId)
+			if err != nil {
+				br.Msg = "获取小组失败"
+				br.ErrMsg = "获取小组失败,Err:" + err.Error()
+				return
+			}
+			for _, team := range teamList {
+				teamSellerList := make([]company.DepartmentGroupSellers, 0)
+				teamItem := company.DepartmentGroupSellers{
+					AdminId: fmt.Sprint("team_", team.GroupId),
+					//AdminName string `description:"系统用户名称"`
+					RealName:     team.GroupName,
+					ChildrenList: teamSellerList,
+				}
+				sellerList, err := system.GetTeamSysUserList(team.GroupId, enabled)
+				if err != nil {
+					br.Msg = "获取销售失败"
+					br.ErrMsg = "获取销售失败,Err:" + err.Error()
+					return
+				}
+				for _, seller := range sellerList {
+					sellerItem := company.DepartmentGroupSellers{
+						AdminId: fmt.Sprint(seller.AdminId),
+						//AdminName string `description:"系统用户名称"`
+						RealName:     seller.RealName,
+						Authority:    seller.Authority,
+						RoleTypeCode: seller.RoleTypeCode,
+					}
+					//fmt.Println("seller.RealName:", seller.RealName)
+					teamSellerList = append(teamSellerList, sellerItem)
+				}
+				teamSellerList = sortDepartmentGroupSellers(teamSellerList)
+				teamItem.ChildrenList = teamSellerList
+				if len(teamSellerList) > 0 {
+					groupSellerList = append(groupSellerList, teamItem)
+				}
+			}
+			//分组为0的销售(直属分组)
+			groupTeamSellerList, err := system.GetGrooupsysUserList(group.GroupId, roleCodeTypeStr, enabled)
+			if err != nil {
+				br.Msg = "获取销售失败"
+				br.ErrMsg = "获取销售失败,Err:" + err.Error()
+				return
+			}
+			if len(groupTeamSellerList) > 0 {
+				tmpDepartmentGroupSellersList := make([]company.DepartmentGroupSellers, 0)
+				for _, seller := range groupTeamSellerList {
+					sellerItem := company.DepartmentGroupSellers{
+						AdminId: fmt.Sprint(seller.AdminId),
+						//AdminName string `description:"系统用户名称"`
+						RealName:     seller.RealName,
+						Authority:    seller.Authority,
+						RoleTypeCode: seller.RoleTypeCode,
+					}
+					tmpDepartmentGroupSellersList = append(tmpDepartmentGroupSellersList, sellerItem)
+				}
+				//排个序
+				tmpDepartmentGroupSellersList = sortDepartmentGroupSellers(tmpDepartmentGroupSellersList)
+				groupSellerList = append(groupSellerList, tmpDepartmentGroupSellersList...)
+			}
+
+			groupItem.ChildrenList = groupSellerList
+			if len(groupSellerList) > 0 {
+				list = append(list, groupItem)
+			}
+		}
+
+		//分组为0的销售(直属部门)
+		departmentSellerList, err := system.GetDepartmentGroupSysUserList(departmentId, 0, roleCodeTypeStr)
+		if err != nil {
+			br.Msg = "获取销售失败"
+			br.ErrMsg = "获取销售失败,Err:" + err.Error()
+			return
+		}
+		if len(departmentSellerList) > 0 {
+			tmpDepartmentGroupSeller := make([]company.DepartmentGroupSellers, 0)
+			for _, seller := range departmentSellerList {
+				sellerItem := company.DepartmentGroupSellers{
+					AdminId: fmt.Sprint(seller.AdminId),
+					//AdminName string `description:"系统用户名称"`
+					RealName:     seller.RealName,
+					Authority:    seller.Authority,
+					RoleTypeCode: seller.RoleTypeCode,
+				}
+				tmpDepartmentGroupSeller = append(tmpDepartmentGroupSeller, sellerItem)
+			}
+			//排个序
+			tmpDepartmentGroupSeller = sortDepartmentGroupSellers(tmpDepartmentGroupSeller)
+			list = append(list, tmpDepartmentGroupSeller...)
+		}
+	}
+
+	// 海外销售部-目前无权限, 均可见
+	seaDepartment, e := system.GetSysDepartmentByName("海外销售部")
+	if e != nil && e.Error() != utils.ErrNoRow() {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取海外销售部失败, Err: " + e.Error()
+		return
+	}
+	if e == nil {
+		// 获取部门下的销售人员
+		seaSellers, e := system.GetDepartmentGroupSysUserList(seaDepartment.DepartmentId, 0, "")
+		if e != nil {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取海外销售失败, Err: " + e.Error()
+			return
+		}
+		// 获取分组
+		seaGroups, e := system.GetSysGroupListByDepartmentId(seaDepartment.DepartmentId)
+		if e != nil {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取海外销售部分组失败, Err: " + e.Error()
+			return
+		}
+
+		var d company.DepartmentGroupSellers
+		d.AdminId = fmt.Sprintf("department_%d", seaDepartment.DepartmentId)
+		d.RealName = seaDepartment.DepartmentName
+		children := make([]company.DepartmentGroupSellers, 0)
+		// 无分组
+		if len(seaGroups) == 0 {
+			for _, s := range seaSellers {
+				children = append(children, company.DepartmentGroupSellers{
+					AdminId:      strconv.Itoa(s.AdminId),
+					RealName:     s.RealName,
+					RoleTypeCode: s.RoleTypeCode,
+					Authority:    s.Authority,
+				})
+			}
+		}
+		// 有分组
+		if len(seaGroups) > 0 {
+			// 销售map
+			sellerMap := make(map[int][]company.DepartmentGroupSellers)
+			for _, s := range seaSellers {
+				sellerMap[s.GroupId] = append(sellerMap[s.GroupId], company.DepartmentGroupSellers{
+					AdminId:      strconv.Itoa(s.AdminId),
+					RealName:     s.RealName,
+					RoleTypeCode: s.RoleTypeCode,
+					Authority:    s.Authority,
+				})
+			}
+			// 小组map
+			childrenMap := make(map[int][]company.DepartmentGroupSellers)
+			for _, g := range seaGroups {
+				if g.ParentId == 0 {
+					continue
+				}
+				childrenMap[g.ParentId] = append(childrenMap[g.ParentId], company.DepartmentGroupSellers{
+					AdminId:      fmt.Sprintf("team_%d", g.GroupId),
+					RealName:     g.GroupName,
+					ChildrenList: sellerMap[g.GroupId],
+				})
+			}
+			// 大组
+			for _, g := range seaGroups {
+				if g.ParentId > 0 {
+					continue
+				}
+				c := childrenMap[g.GroupId]
+				if len(sellerMap[g.GroupId]) > 0 {
+					c = append(c, sellerMap[g.GroupId]...)
+				}
+				children = append(children, company.DepartmentGroupSellers{
+					AdminId:      fmt.Sprintf("group_%d", g.GroupId),
+					RealName:     g.GroupName,
+					ChildrenList: c,
+				})
+			}
+		}
+		d.ChildrenList = children
+		list = append(list, d)
+	}
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = company.DepartmentGroupSellersResp{
+		List: list,
+	}
+}

+ 2 - 1
controllers/cygx/activity_meet.go

@@ -1788,7 +1788,8 @@ func (this *ActivityMeetCoAntroller) MatchingByHand() {
 			}
 			go cygxService.AddCygxActivityRestrictSignupByAdmin(activityId)
 			go cygx.AddCygxActivityMeetDetailLogOnline(needAddAttendanc, activityId)
-			go cygxService.ActivityUserLabelLogAdd(activityId, userIdArr)
+			go cygxService.ActivityUserLabelLogAdd(activityId, userIdArr)                 //添加用户活动到会标签到Redis
+			go cygxService.AddctivitySignupDetailListByHand(needAddAttendanc, activityId) //手动匹配进门财经信息
 		} else {
 			br.Msg = "手动归类失败"
 			br.ErrMsg = "暂未找到匹配数据!"

+ 2 - 0
controllers/cygx/activity_signup.go

@@ -2061,6 +2061,8 @@ func (this *ActivitySignupCoAntroller) AddSignuUser() {
 		for _, v := range items {
 			go cygxService.YanXuanActivityPointsBillSignupAdd(v.ActivityId, v.UserId, adminInfo.AdminId)
 		}
+
+		go cygxService.AddctivitySignupDetailListByAdminSignup(req.ActivityIds) //已结束的活动,管理员手动添加报名,把信息写入到联系人列表参会信息中
 	}
 	//添加操作日志记录
 	br.IsAddLog = true

+ 11 - 2
controllers/cygx/askserie_video.go

@@ -47,6 +47,7 @@ func (this *AskserieVideoController) PreserveAndPublish() {
 		br.ErrMsg = "参数解析失败,Err:" + err.Error()
 		return
 	}
+	req.VideoName = utils.RemoveFileSuffixName(req.VideoName) //去掉后缀名称
 	askserieVideoId := req.AskserieVideoId
 	videoName := req.VideoName
 	videoUrl := req.VideoUrl
@@ -78,13 +79,15 @@ func (this *AskserieVideoController) PreserveAndPublish() {
 	item.ChartPermissionName = chartPermissionName
 	item.PublishStatus = 1
 	item.BackgroundImg = backgroundImg
-	item.ShareImg = shareImg
+
 	item.AdminId = sysUser.AdminId
 	item.ModifyDate = time.Now()
 	item.PublishDate = time.Now()
 	item.CreateTime = time.Now()
 
 	if askserieVideoId == 0 {
+		shareImg, _ = cygxService.MakeCygxMp3HtmlImg(videoDuration) //生成分享图片
+		item.ShareImg = shareImg
 		//新增
 		newId, err := cygx.AddCygxAskserieVideo(item, industrialManagementIds)
 		if err != nil {
@@ -95,12 +98,18 @@ func (this *AskserieVideoController) PreserveAndPublish() {
 		askserieVideoId = int(newId)
 	} else {
 		//更新
-		_, err := cygx.GetCygxAskserieVideoDetail(askserieVideoId)
+		detail, err := cygx.GetCygxAskserieVideoDetail(askserieVideoId)
 		if err != nil {
 			br.Msg = "详情不存在"
 			br.ErrMsg = "获取失败,Err:" + err.Error()
 			return
 		}
+		//如果时长有变更就更新分享图片
+		if detail.VideoDuration != videoDuration {
+			shareImg, _ = cygxService.MakeCygxMp3HtmlImg(videoDuration) //生成分享图片
+			item.ShareImg = shareImg
+		}
+
 		err = cygx.UpdateCygxAskserieVideo(item, industrialManagementIds)
 		if err != nil {
 			br.Msg = "保存失败"

+ 3 - 1
controllers/cygx/micro_roadshow.go

@@ -254,7 +254,9 @@ func (this *MicroRoadshowController) Add() {
 			return
 		}
 	}
-
+	shareImg, _ := cygxService.MakeCygxMp4HtmlImg(req.VideoDuration) //生成分享图片
+	req.ShareImgUrl = shareImg
+	nameItem.IndustryName = utils.RemoveFileSuffixName(nameItem.IndustryName) //去掉后缀名称
 	if req.VideoId > 0 {
 		//更新
 		item := cygx.CygxMicroRoadshowVideo{

+ 736 - 0
controllers/statistic_company_merge.go

@@ -0,0 +1,736 @@
+package controllers
+
+import (
+	"fmt"
+	"github.com/rdlucklib/rdluck_tools/paging"
+	"github.com/tealeg/xlsx"
+	"hongze/hz_crm_api/models"
+	"hongze/hz_crm_api/models/company"
+	"hongze/hz_crm_api/models/response"
+	"hongze/hz_crm_api/services"
+	cygxService "hongze/hz_crm_api/services/cygx"
+	"os"
+	"path/filepath"
+	//"hongze/hz_crm_api/services"
+	"hongze/hz_crm_api/utils"
+	//"strings"
+	"time"
+)
+
+// 统计报表模块下权益合同合并
+// StatisticReportController 统计报告基类
+type StatisticCompanyMergerController struct {
+	BaseAuthController
+}
+
+// MergeCompanyList
+// @Title 权益客户统计列表(合同进行合并之后的)
+// @Description 权益客户统计列表接口
+// @Param   PageSize   query   int  true       "每页数据条数"
+// @Param   CurrentIndex   query   int  true       "当前页页码,从1开始"
+// @Param   Keyword   query   string  true       "客户名称"
+// @Param   CompanyType   query   string  true       "客户类型:传空字符串或者不传为全部,'ficc','权益'"
+// @Param   AdminId   query   string  true       "销售id,多个用英文逗号隔开,空字符串为全部"
+// @Param   RegionType   query   string  false       "所属区域:传空字符串或者不传为全部,'国内','海外'"
+// @Param   StartDate   query   string  false       "开始日期"
+// @Param   EndDate   query   string  false       "结束日期"
+// @Param   DataType   query   string  false       "报表类型,枚举值:`新增试用`,`新签客户`,`续约客户`,`未续约客户`"
+// @Param   TryOutType   query   string  false       " '试用', '非试用' 非试用即为冻结/流失"
+// @Param   IsExport   query   bool  false       "是否导出excel,默认是false"
+// @Param   IsConfirm   query   int  false       "是否确认续约: -1-默认全部; 0-待确认; 1-已确认"
+// @Param   CompanyAscribeId   query   int  false       "归因ID"
+// @Param   PackageDifference   query   string  false       "和上一份合同的区别,枚举值:`增加套餐`,`减少套餐`,`维持套餐`"
+// @Success 200 {object} response.IncrementalCompanyListResp
+// @router /merge_company_list [get]
+func (this *StatisticCompanyMergerController) MergeCompanyList() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+
+	sysUser := this.SysUser
+	if sysUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser Is Empty"
+		br.Ret = 408
+		return
+	}
+
+	pageSize, _ := this.GetInt("PageSize")
+	currentIndex, _ := this.GetInt("CurrentIndex")
+
+	adminId := this.GetString("AdminId")
+	regionType := this.GetString("RegionType")
+	//companyType := this.GetString("CompanyType")
+	dataType := this.GetString("DataType")
+	tryOutType := this.GetString("TryOutType")
+	keyword := this.GetString("Keyword")
+	packageDifference := this.GetString("PackageDifference")
+
+	startDate := this.GetString("StartDate")
+	endDate := this.GetString("EndDate")
+
+	isConfirm, _ := this.GetInt("IsConfirm", -1)
+	companyAscribeId, _ := this.GetInt("CompanyAscribeId", -1)
+
+	if dataType != "续约客户" {
+		packageDifference = "" // 只有续约客户才会有值,过滤前端传过来的脏数据
+	}
+	//if startDate == "" || endDate == "" {
+	//	br.Msg = "获取失败,开始日期或结束日期未传"
+	//	br.ErrMsg = "获取失败,开始日期或结束日期未传"
+	//	return
+	//}
+	if startDate == "" {
+		startDate = "2015-01-01"
+	}
+	if endDate == "" {
+		endDate = time.Now().Format(utils.FormatDate)
+	}
+
+	var startSize int
+	if pageSize <= 0 {
+		pageSize = utils.PageSize20
+	}
+	if currentIndex <= 0 {
+		currentIndex = 1
+	}
+	startSize = utils.StartIndex(currentIndex, pageSize)
+
+	//是否导出报表
+	isExport, _ := this.GetBool("IsExport")
+	if isExport {
+		pageSize = 10000
+		currentIndex = 1
+	}
+
+	var condition string
+	var pars []interface{}
+
+	//条件
+	if adminId != "" {
+		condition += ` AND c.seller_id in  (` + adminId + `) `
+		//pars = append(pars, adminId)
+	} else {
+
+		//根据当前角色来获取查询条件
+		condition, pars = getQueryParams(condition, pars, sysUser, "c.")
+
+	}
+	if regionType != "" {
+		condition += ` AND b.region_type = ? `
+		pars = append(pars, regionType)
+	}
+
+	//关键字搜索
+	if keyword != "" {
+		condition += ` and b.company_name like "%` + keyword + `%" `
+	}
+
+	var conditionAscribRai string          // 处理权益未续约客户检索列表SQL查询条件
+	var conditionAscribRaiTotal string     // 处理权益未续约客户总量查询条件
+	var conditionAscribRaiToBeTotal string // 处理权益未续约客户待确认总量查询条件
+	var parsAscribeRai []interface{}
+	var parsAscribeRaiTotal []interface{}     // 处理权益未续约客户总量查询条件
+	var parsAscribeRaiTobeTotal []interface{} // 处理权益未续约客户待确认总量查询条件
+	var conditionConfirm string
+	var parsConfirm []interface{}
+
+	companyConfirmList, err := company.GetCompanyNoRenewedAscribeList(conditionConfirm, parsConfirm, 0, 0)
+	if err != nil && err.Error() != utils.ErrNoRow() {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取失败,GetCompanyNoRenewedAscribeList Err:" + err.Error()
+		return
+	}
+	var noRenewedcompanyIds []int //已经确定未续约的公司ID
+	if len(companyConfirmList) == 0 {
+		noRenewedcompanyIds = append(noRenewedcompanyIds, 0) // 给一个不存在的ID
+	} else {
+		for _, v := range companyConfirmList {
+			noRenewedcompanyIds = append(noRenewedcompanyIds, v.CompanyId)
+		}
+	}
+	//是否确认续约 CRM 13.9
+	conditionAscribRaiTotal += ` AND  c.company_id IN (` + utils.GetOrmInReplace(len(noRenewedcompanyIds)) + `)  ` // 已确认
+	parsAscribeRaiTotal = append(parsAscribeRaiTotal, noRenewedcompanyIds)
+
+	conditionAscribRaiToBeTotal += ` AND c.company_id NOT IN (` + utils.GetOrmInReplace(len(noRenewedcompanyIds)) + `)   ` // 待确认
+	parsAscribeRaiTobeTotal = append(parsAscribeRaiTobeTotal, noRenewedcompanyIds)
+
+	if isConfirm != -1 {
+		if isConfirm == 0 {
+			conditionAscribRai += ` AND  c.company_id NOT IN (` + utils.GetOrmInReplace(len(noRenewedcompanyIds)) + `)  ` // 待确认
+		} else {
+			conditionAscribRai += ` AND  c.company_id IN (` + utils.GetOrmInReplace(len(noRenewedcompanyIds)) + `)    ` // 已确认
+		}
+		parsAscribeRai = append(parsAscribeRai, noRenewedcompanyIds)
+	}
+
+	//归因ID CRM 13.9
+	if companyAscribeId > 0 {
+		var conditionAscribe string
+		var parsAscribe []interface{}
+		conditionAscribe = "  AND  company_ascribe_id = ? "
+		parsAscribe = append(parsAscribe, companyAscribeId)
+		companyNoRenewedAscribeList, err := company.GetCompanyNoRenewedAscribeList(conditionAscribe, parsAscribe, 0, 0)
+		if err != nil && err.Error() != utils.ErrNoRow() {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取失败,GetCompanyNoRenewedAscribeList Err:" + err.Error()
+			return
+		}
+		var companyIds []int
+		if len(companyNoRenewedAscribeList) == 0 {
+			companyIds = append(companyIds, 0) // 给一个不存在的ID
+		} else {
+			for _, v := range companyNoRenewedAscribeList {
+				companyIds = append(companyIds, v.CompanyId)
+			}
+		}
+		conditionAscribRai += ` AND c.company_id IN (` + utils.GetOrmInReplace(len(companyIds)) + `)`
+		parsAscribeRai = append(parsAscribeRai, companyIds)
+	}
+
+	condition += ` AND c.product_id = ?   AND  a.status = 1 `
+	pars = append(pars, 2)
+
+	var list []*models.IncrementalList
+	//moreListMap := make(map[int][]*models.IncrementalList)
+
+	var newCompanyTotal int                   //新签合同数量
+	var notRenewalCompanyTotal int            //未续约客户数已确认
+	var notRenewalCompanyToBeConfirmTotal int //未续约客户数待确认
+	var dataTotal, trialTotal, renewalCompanyTotal int
+	var notRenewalTryOut, notRenewalNotTryOut int
+
+	//新签客户数
+	{
+		condition1 := condition
+		pars1 := pars
+		condition1 += ` AND a.start_date >= ? AND a.start_date <= ?  `
+		pars1 = append(pars1, startDate, endDate)
+		condition1 += ` AND a.contract_type = ? `
+		pars1 = append(pars1, "新签合同")
+		newCompanyTotal, err = company.GetIncrementalNewCompanyProductMergeCount(condition1, pars1)
+		if err != nil && err.Error() != utils.ErrNoRow() {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取失败,Err:" + err.Error()
+			return
+		}
+
+		if dataType == "新签客户" {
+			//列表数据数量
+			total, err := company.GetIncrementalNewCompanyProductMergeCount(condition1, pars1)
+			if err != nil && err.Error() != utils.ErrNoRow() {
+				br.Msg = "获取失败"
+				br.ErrMsg = "获取失败,Err:" + err.Error()
+				return
+			}
+
+			//列表页数据
+			tmpList, err := models.GetIncrementalCompanyMergeList(condition1, pars1, startSize, pageSize)
+			if err != nil {
+				br.Msg = "获取失败"
+				br.ErrMsg = "获取失败,Err:" + err.Error()
+				return
+			}
+			list = tmpList
+			dataTotal = total
+		}
+	}
+
+	//续约客户数
+	{
+		condition1 := condition
+		pars1 := pars
+		condition1 += ` AND a.start_date >= ? AND a.start_date <= ? `
+		pars1 = append(pars1, startDate, endDate)
+		condition1 += ` AND a.contract_type = ? `
+		pars1 = append(pars1, "续约合同")
+		////额外条件(续约合同的起始日期包含在所选时间段内且不包含在新签合同存续期内的客户)
+		//pars1 = append(pars1, endDate)
+
+		total, err := company.GetIncrementalNewCompanyProductMergeCount(condition1, pars1)
+		if err != nil && err.Error() != utils.ErrNoRow() {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取失败,Err:" + err.Error()
+			return
+		}
+		renewalCompanyTotal = total
+
+		if dataType == "续约客户" {
+			//续约的客户才会查询
+			if packageDifference != "" {
+				condition1 += ` AND a.package_difference = ? `
+				pars1 = append(pars1, packageDifference)
+			}
+			//列表数据数量
+			total, err := company.GetIncrementalRenewalCompanyProductMergeCount(condition1, pars1)
+			if err != nil && err.Error() != utils.ErrNoRow() {
+				br.Msg = "获取失败"
+				br.ErrMsg = "获取失败,Err:" + err.Error()
+				return
+			}
+			//列表页数据
+			tmpList, err := models.GetIncrementalCompanyMergeList(condition1, pars1, startSize, pageSize)
+			if err != nil {
+				br.Msg = "获取失败"
+				br.ErrMsg = "获取失败,Err:" + err.Error()
+				return
+			}
+
+			list = tmpList
+			dataTotal = total
+
+		}
+	}
+
+	//未续约客户数
+	{
+		condition1 := condition
+		pars1 := pars
+
+		//endDateTime, err := time.Parse(utils.FormatDate, endDate)
+		//if err != nil {
+		//	br.Msg = "结束时间异常"
+		//	br.ErrMsg = "获取失败,Err:" + err.Error()
+		//	return
+		//}
+		////选择的日期加一天的原因是因为:筛选条件是截止到时分秒的,如果要把选择的这一天也统计进去,那么需要在选择的结束日期基础上加上一天
+		//tryOutEndDate := endDateTime.AddDate(0, 0, 1).Format(utils.FormatDate)
+
+		condition1 += ` AND a.end_date >= ? AND a.end_date  <= ? `
+		pars1 = append(pars1, startDate, endDate)
+		//condition1 += ` AND a.operation = ? `
+		//pars1 = append(pars1, "try_out")
+		condition1 += ` AND c.status not in ("永续","正式","关闭")  `
+
+		//未续约已确认数量
+		notRenewalCondition := condition1
+		notRenewalPars := pars1
+		notRenewalCondition += conditionAscribRaiTotal
+		notRenewalPars = append(notRenewalPars, parsAscribeRaiTotal)
+		total, err := company.GetIncrementalRenewalCompanyProductMergeCount(notRenewalCondition, notRenewalPars)
+		if err != nil && err.Error() != utils.ErrNoRow() {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取失败,Err:" + err.Error()
+			return
+		}
+		notRenewalCompanyTotal = total
+
+		//未续约待确认数量
+		notRenewalToBeCondition := condition1
+		notRenewalToBePars := pars1
+		notRenewalToBeCondition += conditionAscribRaiToBeTotal
+		notRenewalToBePars = append(notRenewalToBePars, parsAscribeRaiTobeTotal)
+		notRenewalCompanyToBeConfirmTotal, err = company.GetIncrementalRenewalCompanyProductMergeCount(notRenewalToBeCondition, notRenewalToBePars)
+		if err != nil && err.Error() != utils.ErrNoRow() {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取失败,Err:" + err.Error()
+			return
+		}
+
+		condition1 += conditionAscribRai
+		pars1 = append(pars1, parsAscribeRai)
+		if dataType == "未续约客户" {
+			//统计数据
+			for _, v := range []string{"试用", "非试用"} {
+				totalCondition1 := condition1
+				totalPars1 := pars1
+				var tmpTotal int
+				if v == "试用" {
+					totalCondition1 += ` AND c.status = "试用" `
+					tmpTotal, err = company.GetIncrementalRenewalCompanyProductMergeCount(totalCondition1, totalPars1)
+					if err != nil && err.Error() != utils.ErrNoRow() {
+						br.Msg = "获取失败"
+						br.ErrMsg = "获取失败,Err:" + err.Error()
+						return
+					}
+					notRenewalTryOut = tmpTotal
+				} else if v == "非试用" {
+					totalCondition1 += ` AND c.status IN ("冻结","流失") `
+					tmpTotal, err = company.GetIncrementalRenewalCompanyProductMergeCount(totalCondition1, totalPars1)
+					if err != nil && err.Error() != utils.ErrNoRow() {
+						br.Msg = "获取失败"
+						br.ErrMsg = "获取失败,Err:" + err.Error()
+						return
+					}
+					notRenewalNotTryOut = tmpTotal
+				}
+
+			}
+			//列表数据数量
+			if tryOutType == "试用" {
+				condition1 += ` AND c.status = "试用" `
+				total = notRenewalTryOut
+			} else if tryOutType == "非试用" {
+				condition1 += ` AND c.status IN ("冻结","流失") `
+				total = notRenewalNotTryOut
+			}
+
+			//total, err := models.GetIncrementalCompanyProductCountByOperationRecord(condition1, pars1)
+			//if err != nil && err.Error() != utils.ErrNoRow() {
+			//	br.Msg = "获取失败"
+			//	br.ErrMsg = "获取失败,Err:" + err.Error()
+			//	return
+			//}
+
+			//分页total单独计算
+			total, err = company.GetIncrementalRenewalCompanyProductMergeCount(condition1, pars1)
+			if err != nil && err.Error() != utils.ErrNoRow() {
+				br.Msg = "获取失败"
+				br.ErrMsg = "获取失败,Err:" + err.Error()
+				return
+			}
+			//return
+			//列表页数据
+			tmpList, err := models.GetIncrementalCompanyListByOperationRecordMerge(condition1, pars1, startSize, pageSize)
+			if err != nil {
+				br.Msg = "获取失败"
+				br.ErrMsg = "获取失败,Err:" + err.Error()
+				return
+			}
+
+			var ascribecompanyIds []int
+			for _, item := range tmpList {
+				//endDateTime, _ := time.Parse(utils.FormatDateTime, item.CreateTime)
+				//item.EndDate = endDateTime.Format(utils.FormatDate)
+				ascribecompanyIds = append(ascribecompanyIds, item.CompanyId)
+			}
+			//归因标签
+			mapGetCompanyAscribeContent, mapContent := services.GetCompanyAscribeContentMap(ascribecompanyIds)
+			mapNoRenewedNote := services.GetCompanyNoRenewedNoteMap(ascribecompanyIds)
+
+			for _, item := range tmpList {
+				item.AscribeContent = mapGetCompanyAscribeContent[fmt.Sprint("CID_", item.CompanyId, "PID_", item.ProductId)]
+				item.Content = mapContent[fmt.Sprint("CID_", item.CompanyId, "PID_", item.ProductId)]
+				item.IsShowNoRenewedNote = mapNoRenewedNote[fmt.Sprint("CID_", item.CompanyId, "PID_", item.ProductId)]
+			}
+
+			list = tmpList
+			dataTotal = total
+
+		}
+	}
+
+	listLen := len(list)
+
+	if listLen == 0 {
+		list = make([]*models.IncrementalList, 0)
+	}
+	var companyContractIds []int
+	for i := 0; i < listLen; i++ {
+		item := list[i]
+		companyContractIds = append(companyContractIds, item.CompanyContractId)
+		//新增试用不需要计算剩余日期
+		if dataType != "新增试用" {
+			//剩余可用天数
+			endDateTime, _ := time.Parse(utils.FormatDate, item.EndDate)
+			endDateTime = endDateTime.AddDate(0, 0, 1)
+			sub := endDateTime.Sub(time.Now())
+			expireDay := fmt.Sprintf("%v", int(sub.Hours()/24))
+			list[i].ExpireDay = expireDay
+		}
+	}
+
+	//合并合同所对应的权限
+	mappermissionName, err := cygxService.GetCompanyContractPermissionNameMapById(companyContractIds)
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取失败,Err:" + err.Error()
+		return
+	}
+	for _, v := range list {
+		v.PermissionName = mappermissionName[v.CompanyContractId]
+	}
+
+	page := paging.GetPaging(currentIndex, pageSize, dataTotal)
+	resp := response.IncrementalCompanyListResp{
+		Paging:                            page,
+		List:                              list,
+		TrialTotal:                        trialTotal,
+		NewCompanyTotal:                   newCompanyTotal,
+		RenewalCompanyTotal:               renewalCompanyTotal,
+		NotRenewalCompanyTotal:            notRenewalCompanyTotal,
+		NotRenewalCompanyToBeConfirmTotal: notRenewalCompanyToBeConfirmTotal,
+		NotRenewalTryOut:                  notRenewalTryOut,
+		NotRenewalNotTryOut:               notRenewalNotTryOut,
+	}
+	//fmt.Println()
+	//导出excel
+	if isExport {
+		MergeCompanyListListExport(this, dataType, resp, br)
+		return
+	}
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = resp
+}
+
+// IncrementalCompanyListExport 导出增量客户数据报表excel
+func MergeCompanyListListExport(this *StatisticCompanyMergerController, dataType string, resp response.IncrementalCompanyListResp, br *models.BaseResponse) {
+	dir, err := os.Executable()
+	exPath := filepath.Dir(dir)
+	downLoadnFilePath := exPath + "/" + time.Now().Format(utils.FormatDateTimeUnSpace) + ".xlsx"
+	xlsxFile := xlsx.NewFile()
+	if err != nil {
+		br.Msg = "生成文件失败"
+		br.ErrMsg = "生成文件失败"
+		return
+	}
+	style := xlsx.NewStyle()
+	alignment := xlsx.Alignment{
+		Horizontal: "center",
+		Vertical:   "center",
+		WrapText:   true,
+	}
+
+	style.Alignment = alignment
+	style.ApplyAlignment = true
+
+	sheel, err := xlsxFile.AddSheet("增量客户数据")
+	if err != nil {
+		br.Msg = "新增Sheet失败"
+		br.ErrMsg = "新增Sheet失败,Err:" + err.Error()
+		return
+	}
+	sheel.SetColWidth(0, 0, 30)
+	sheel.SetColWidth(1, 1, 15)
+	sheel.SetColWidth(2, 2, 15)
+	sheel.SetColWidth(3, 3, 18)
+	sheel.SetColWidth(4, 4, 40)
+	sheel.SetColWidth(5, 5, 18)
+
+	//统计数据
+	statisticRow := sheel.AddRow()
+
+	cell1 := statisticRow.AddCell()
+	cell1.SetStyle(style)
+	cell1.SetValue(fmt.Sprint("新增试用客户数:", resp.TrialTotal))
+
+	cell2 := statisticRow.AddCell()
+	cell2.SetStyle(style)
+	cell2.SetValue(fmt.Sprint("新签客户数:", resp.NewCompanyTotal))
+
+	cell3 := statisticRow.AddCell()
+	cell3.SetStyle(style)
+	cell3.SetValue(fmt.Sprint("续约客户数:", resp.RenewalCompanyTotal))
+
+	cell4 := statisticRow.AddCell()
+	cell4.SetStyle(style)
+	cell4.SetValue(fmt.Sprint("未续约客户数:", resp.NotRenewalCompanyTotal))
+	//表头
+
+	titleRow := sheel.AddRow()
+
+	cellName := titleRow.AddCell()
+	cellName.SetStyle(style)
+	cellName.SetValue("客户名称")
+
+	cellProName := titleRow.AddCell()
+	cellProName.SetStyle(style)
+	cellProName.SetValue("客户类型")
+
+	cellSellerName := titleRow.AddCell()
+	cellSellerName.SetStyle(style)
+	cellSellerName.SetValue("所属销售")
+
+	//permissionMap := make(map[int][]string)
+	//tmpPermissionMap := make(map[int]map[string][]string)
+	//companyContractIdList := make([]string, 0)
+	//for _, v := range resp.List {
+	//	companyContractIdList = append(companyContractIdList, fmt.Sprint(v.CompanyContractId))
+	//}
+	//if dataType == "新签客户" || dataType == "续约客户" {
+	cellMoney := titleRow.AddCell()
+	cellMoney.SetStyle(style)
+	cellMoney.SetValue("合同金额")
+
+	//这么大费周章的目的是为了:权益的品种存在主观、客观的区分,如果一个品种既存在主观,又存在客观,那么就展示品种名称,否则就要列出品种名称+主、客观类型
+	//if len(companyContractIdList) > 0 {
+	//	list, tmpErr := company.GetCompanyContractPermissionListByContractIds(strings.Join(companyContractIdList, ","))
+	//	if tmpErr != nil {
+	//		err = tmpErr
+	//		return
+	//	}
+	//	for _, v := range list {
+	//		tmpPermissionNameMap, ok := tmpPermissionMap[v.CompanyContractId]
+	//		if ok {
+	//			tmpPermissionNameList, ok2 := tmpPermissionNameMap[v.ChartPermissionName]
+	//			if ok2 {
+	//				tmpPermissionNameList = append(tmpPermissionNameList, v.PermissionRemark)
+	//			} else {
+	//				tmpPermissionNameList = []string{v.PermissionRemark}
+	//			}
+	//			tmpPermissionNameMap[v.ChartPermissionName] = tmpPermissionNameList
+	//		} else {
+	//			tmpPermissionNameMap = make(map[string][]string)
+	//			tmpPermissionNameMap[v.ChartPermissionName] = []string{v.PermissionRemark}
+	//		}
+	//		tmpPermissionMap[v.CompanyContractId] = tmpPermissionNameMap
+	//	}
+	//}
+	//}
+
+	//for companyContractId, tmpPermissionNameMap := range tmpPermissionMap {
+	//	tmpPermissionName := ``
+	//	tmpPermissionList := []string{}
+	//	for tmpChartPermissionName, tmpChartPermissionNameList := range tmpPermissionNameMap {
+	//		if len(tmpChartPermissionNameList) > 1 {
+	//			tmpPermissionName = tmpChartPermissionName
+	//		} else {
+	//			tmpPermissionName = tmpChartPermissionNameList[0]
+	//		}
+	//		tmpPermissionList = append(tmpPermissionList, tmpPermissionName)
+	//	}
+	//
+	//	permissionMap[companyContractId] = tmpPermissionList
+	//}
+
+	cellTime := titleRow.AddCell()
+	cellTime.SetStyle(style)
+	switch dataType {
+	case "新增试用":
+		cellTime.SetValue("新增时间")
+	case "新签客户":
+		cellTime.SetValue("签约时间")
+	case "续约客户":
+		cellTime.SetValue("续约时间")
+	case "未续约客户":
+		cellTime.SetValue("最近合同到期时间")
+
+		cellAscribeContent := titleRow.AddCell()
+		cellAscribeContent.SetStyle(style)
+		cellAscribeContent.SetValue("不续约归因")
+
+		cellContent := titleRow.AddCell()
+		cellContent.SetStyle(style)
+		cellContent.SetValue("详细原因")
+	}
+	cellPermissionName := titleRow.AddCell()
+	cellPermissionName.SetStyle(style)
+	cellPermissionName.SetValue("签约套餐")
+	for _, v := range resp.List {
+		dataRow := sheel.AddRow()
+		dataRow.SetHeight(20)
+
+		cellDataName := dataRow.AddCell()
+		cellDataName.SetStyle(style)
+		cellDataName.SetValue(v.CompanyName)
+
+		cellDataProName := dataRow.AddCell()
+		cellDataProName.SetStyle(style)
+		cellDataProName.SetValue(v.ProductName)
+
+		cellDataSellerName := dataRow.AddCell()
+		cellDataSellerName.SetStyle(style)
+		cellDataSellerName.SetValue(v.SellerName)
+
+		//if dataType == "新签客户" || dataType == "续约客户" {
+		cellDataMoney := dataRow.AddCell()
+		cellDataMoney.SetStyle(style)
+		cellDataMoney.SetValue(v.Money)
+		//}
+
+		cellDataTime := dataRow.AddCell()
+		cellDataTime.SetStyle(style)
+		switch dataType {
+		case "新增试用":
+			cellDataTime.SetValue(v.CreateTime)
+		case "新签客户":
+			cellDataTime.SetValue(v.StartDate)
+		case "续约客户":
+			cellDataTime.SetValue(v.StartDate)
+		case "未续约客户":
+			cellDataTime.SetValue(v.EndDate)
+
+			cellAscribeContent := dataRow.AddCell()
+			cellAscribeContent.SetStyle(style)
+			cellAscribeContent.SetValue(v.AscribeContent)
+
+			cellContent := dataRow.AddCell()
+			cellContent.SetStyle(style)
+			cellContent.SetValue(v.Content)
+		}
+		cellDataPermissionName := dataRow.AddCell()
+		cellDataPermissionName.SetStyle(style)
+		cellDataPermissionName.SetValue(v.PermissionName)
+	}
+	err = xlsxFile.Save(downLoadnFilePath)
+	if err != nil {
+		br.Msg = "保存文件失败"
+		br.ErrMsg = "保存文件失败"
+		return
+	}
+	randStr := time.Now().Format(utils.FormatDateTimeUnSpace)
+	downloadFileName := dataType + "数据_" + randStr + ".xlsx"
+	this.Ctx.Output.Download(downLoadnFilePath, downloadFileName)
+	defer func() {
+		os.Remove(downLoadnFilePath)
+	}()
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "导出成功"
+}
+
+// @Title 上一份合同详情
+// @Description 上一份合同详情接口
+// @Param   CompanyContractId   query   int  true       "合同ID"
+// @Success Ret=200 {object} company.GetCompanyContractMergeDetailResp
+// @router /merge_company_previous/detail [get]
+func (this *StatisticCompanyMergerController) CompanyPreviousDetail() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	AdminUser := this.SysUser
+	if AdminUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,用户信息为空"
+		br.Ret = 408
+		return
+	}
+	resp := new(company.GetCompanyContractDetailResp)
+	companyContractId, _ := this.GetInt("CompanyContractId")
+	if companyContractId < 1 {
+		br.Msg = "请输入合同ID"
+		return
+	}
+	var condition string
+	var pars []interface{}
+	//获取最新的一条到期的合同信息
+
+	condition = " AND company_contract_id = ?  "
+	pars = append(pars, companyContractId)
+	detail, err := company.GetCompanyContracDetail(condition, pars)
+	if err != nil {
+		br.Msg = "详情不存在"
+		br.ErrMsg = "获取失败,Err:" + err.Error()
+		return
+	}
+	//获取前一份合同的信息
+	pars = make([]interface{}, 0)
+	condition = " AND company_id = ? AND company_contract_id < ?   AND status = 1    AND product_id = 2  ORDER BY company_contract_id DESC   LIMIT  1  "
+	pars = append(pars, detail.CompanyId, companyContractId)
+	detailPrevious, err := company.GetCompanyContracDetail(condition, pars)
+	if err != nil {
+		br.Msg = "详情不存在"
+		br.ErrMsg = "获取失败,Err:" + err.Error()
+		return
+	}
+	//合并合同所对应的权限
+	mappermissionName, err := cygxService.GetCompanyContractPermissionNameMapById([]int{detailPrevious.CompanyContractId})
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取失败,Err:" + err.Error()
+		return
+	}
+	detailPrevious.PermissionName = mappermissionName[detailPrevious.CompanyContractId]
+	resp.Detail = detailPrevious
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = resp
+}

+ 1 - 1
controllers/statistic_report.go

@@ -3719,7 +3719,7 @@ func (this *StatisticReportController) IncrementalCompanyList() {
 		notRenewalPars := pars1
 		notRenewalCondition += conditionAscribRaiTotal
 		notRenewalPars = append(notRenewalPars, parsAscribeRaiTotal)
-		total, err := models.GetIncrementalCompanyCountByOperationRecord(notRenewalCondition, notRenewalPars)
+		total, err := models.GetIncrementalCompanyProductCountByOperationRecord(notRenewalCondition, notRenewalPars)
 		if err != nil && err.Error() != utils.ErrNoRow() {
 			br.Msg = "获取失败"
 			br.ErrMsg = "获取失败,Err:" + err.Error()

+ 23 - 2
models/company/company_contract.go

@@ -204,8 +204,8 @@ type CompanyContractResp struct {
 	CompanyId         int       `description:"客户id"`
 	CompanyProductId  int       `description:"客户产品id"`
 	ContractCode      string    `description:"合同编码"`
-	StartDate         time.Time `description:"合同开始时间"`
-	EndDate           time.Time `description:"合同结束时间"`
+	StartDate         string    `description:"合同开始时间"`
+	EndDate           string    `description:"合同结束时间"`
 	Money             float64   `description:"合同金额"`
 	PayMethod         string    `description:"支付方式"`
 	PayChannel        string    `description:"支付渠道"`
@@ -216,6 +216,7 @@ type CompanyContractResp struct {
 	Source            string    `description:"合同来源,枚举值:上传附件、系统合同,默认上传附件"`
 	PackageType       int       `description:"套餐类型,0:无,1:大套餐,2:小套餐"`
 	RaiPackageType    int       `description:"权益套餐类型: 0-无; 1-70w大套餐; 2-45w大套餐"`
+	PermissionName    string    `description:"权限名"`
 }
 
 // 获取合同列表
@@ -241,3 +242,23 @@ func GetCompanyContractPermissionList(condition string, pars []interface{}) (ite
 	_, err = o.Raw(sql, pars).QueryRows(&items)
 	return
 }
+
+// 通过ID获取详情
+func GetCompanyContracDetail(condition string, pars []interface{}) (item *CompanyContractResp, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT * FROM company_contract  WHERE 1= 1 ` + condition
+	err = o.Raw(sql, pars).QueryRow(&item)
+	return
+}
+
+type GetCompanyContractDetailResp struct {
+	Detail *CompanyContractResp
+}
+
+// UpdateCompanyContractPackageDifference 更改合同与上一份合同金额对比信息
+func UpdateCompanyContractPackageDifference(packageDifference string, companyContractId int) (err error) {
+	o := orm.NewOrm()
+	sql := `UPDATE company_contract SET package_difference = ?  WHERE company_contract_id=? `
+	_, err = o.Raw(sql, packageDifference, companyContractId).Exec()
+	return
+}

+ 170 - 0
models/company/company_contract_merge.go

@@ -0,0 +1,170 @@
+package company
+
+import (
+	//"fmt"
+	"github.com/beego/beego/v2/client/orm"
+	"time"
+)
+
+type CompanyContractMerge struct {
+	CompanyContractMergeId int       `orm:"column(company_contract_merge_id);pk" description:"主键ID"`
+	ContractType           string    `description:"合同类型:枚举值:'新签合同','续约合同','补充协议'"`
+	ProductId              int       `description:"产品id"`
+	ProductName            string    `description:"产品名称"`
+	CompanyId              int       `description:"客户id"`
+	CompanyProductId       int       `description:"客户产品id"`
+	StartDate              string    `description:"合同开始时间"`
+	EndDate                string    `description:"合同结束时间"`
+	Money                  float64   `description:"合同金额"`
+	CreateTime             time.Time `description:"合同创建时间"`
+	ModifyTime             time.Time `description:"合同修改时间"`
+	CompanyContractIdGroup string    `description:"表company_contract合并的 company_contract_id"`
+	ChartPermissionName    string    `description:"权限类目名称"`
+	PackageDifference      string    `description:"和上一份合同的区别"`
+	IsBestNew              int       `description:"是否是最新的一条数据"`
+}
+
+type CompanyContractMergeResp struct {
+	CompanyContractMergeId int       `orm:"column(company_contract_merge_id);pk" description:"主键ID"`
+	ContractType           string    `description:"合同类型:枚举值:'新签合同','续约合同','补充协议'"`
+	ProductId              int       `description:"产品id"`
+	ProductName            string    `description:"产品名称"`
+	CompanyId              int       `description:"客户id"`
+	CompanyProductId       int       `description:"客户产品id"`
+	StartDate              time.Time `description:"合同开始时间"`
+	EndDate                time.Time `description:"合同结束时间"`
+	Money                  float64   `description:"合同金额"`
+	CreateTime             time.Time `description:"合同创建时间"`
+	ModifyTime             time.Time `description:"合同修改时间"`
+	CompanyContractIdGroup string    `description:"表company_contract合并的 company_contract_id"`
+	ChartPermissionName    string    `description:"权限类目名称"`
+	PackageDifference      string    `description:"和上一份合同的区别"`
+}
+
+type CompanyContractMergeDetailResp struct {
+	CompanyContractMergeId int       `orm:"column(company_contract_merge_id);pk" description:"主键ID"`
+	ContractType           string    `description:"合同类型:枚举值:'新签合同','续约合同','补充协议'"`
+	ProductId              int       `description:"产品id"`
+	ProductName            string    `description:"产品名称"`
+	CompanyId              int       `description:"客户id"`
+	CompanyProductId       int       `description:"客户产品id"`
+	StartDate              string    `description:"合同开始时间"`
+	EndDate                string    `description:"合同结束时间"`
+	Money                  float64   `description:"合同金额"`
+	CreateTime             time.Time `description:"合同创建时间"`
+	ModifyTime             time.Time `description:"合同修改时间"`
+	CompanyContractIdGroup string    `description:"表company_contract合并的 company_contract_id"`
+	ChartPermissionName    string    `description:"权限类目名称"`
+	PackageDifference      string    `description:"和上一份合同的区别"`
+	PermissionName         string    `description:"权限名"`
+}
+
+func AddCompanyContractMerge(item *CompanyContractMerge) (err error) {
+	o := orm.NewOrm()
+	_, err = o.Insert(item)
+	return
+}
+
+// MultiAddCompanyContractMerge 批量添加合同合并之后的数据
+func MultiAddCompanyContractMerge(items []*CompanyContractMerge) (err error) {
+	if len(items) == 0 {
+		return
+	}
+	o := orm.NewOrm()
+	_, err = o.InsertMulti(len(items), items)
+	return
+}
+
+// 修改
+func UpdateCompanyContractMerge(item *CompanyContractMerge) (err error) {
+	o := orm.NewOrm()
+	to, err := o.Begin()
+	if err != nil {
+		return
+	}
+	defer func() {
+		if err != nil {
+			_ = to.Rollback()
+		} else {
+			_ = to.Commit()
+		}
+	}()
+	updateParams := make(map[string]interface{})
+	updateParams["EndDate"] = item.EndDate
+	updateParams["Money"] = item.Money
+	updateParams["CompanyContractIdGroup"] = item.CompanyContractIdGroup
+	updateParams["PackageDifference"] = item.PackageDifference
+	updateParams["IsBestNew"] = item.IsBestNew
+	updateParams["ModifyTime"] = item.ModifyTime
+	ptrStructOrTableName := "company_contract_merge"
+	whereParam := map[string]interface{}{"company_contract_merge_id": item.CompanyContractMergeId}
+	qs := to.QueryTable(ptrStructOrTableName)
+	for expr, exprV := range whereParam {
+		qs = qs.Filter(expr, exprV)
+	}
+	_, err = qs.Update(updateParams)
+	if err != nil {
+		return
+	}
+	return
+}
+
+// GetIncrementalNewCompanyProductMergeCount 获取增量客户产品报表列表统计数据(根据合同来展示)
+func GetIncrementalNewCompanyProductMergeCount(condition string, pars []interface{}) (total int, err error) {
+	o := orm.NewOrm()
+
+	sql := `SELECT a.*,b.region_type,c.seller_id,c.seller_name,b.company_name FROM company_contract a
+		 JOIN company b ON a.company_id = b.company_id
+		 JOIN company_product c ON a.company_id = c.company_id and a.product_id=c.product_id WHERE 1 = 1 `
+
+	if condition != "" {
+		sql += condition
+	}
+	sql = `select count(1) count from (` + sql + `  ) f`
+	err = o.Raw(sql, pars).QueryRow(&total)
+	return
+}
+
+// GetIncrementalRenewalCompanyProductMergeCount 续约合同数量
+func GetIncrementalRenewalCompanyProductMergeCount(condition string, pars []interface{}) (total int, err error) {
+	o := orm.NewOrm()
+
+	sql := `SELECT a.*,b.region_type,c.seller_id,c.seller_name,b.company_name FROM company_contract a
+		 JOIN company b ON a.company_id = b.company_id
+		 JOIN company_product c ON a.company_id = c.company_id and a.product_id=c.product_id WHERE 1 = 1 `
+
+	if condition != "" {
+		sql += condition
+	}
+	sql = `select count(1) count from (` + sql + ` ) f`
+	err = o.Raw(sql, pars).QueryRow(&total)
+	return
+}
+
+type GetCompanyContractMergeDetailResp struct {
+	Detail *CompanyContractMergeDetailResp
+}
+
+// 通过ID获取详情
+//func GetCompanyContractMergeDetail(condition string, pars []interface{}) (item *CompanyContractMergeDetailResp, err error) {
+//	o := orm.NewOrm()
+//	sql := `SELECT * FROM company_contract_merge  WHERE 1= 1 ` + condition
+//	err = o.Raw(sql, pars).QueryRow(&item)
+//	return
+//}
+//
+//// UpdateCompanyContractMergeIsBestNew 更改 is_best_new 状态
+//func UpdateCompanyContractMergeIsBestNew(isBestNew, companyId int) (err error) {
+//	o := orm.NewOrm()
+//	sql := `UPDATE company_contract_merge SET is_best_new = ?  WHERE company_id=? `
+//	_, err = o.Raw(sql, isBestNew, companyId).Exec()
+//	return
+//}
+//
+//// UpdateCompanyContractMergeIsBestNew 更改 is_best_new 状态
+//func UpdateCompanyContractMergeIsBestNewto1(companyContractMergeId int) (err error) {
+//	o := orm.NewOrm()
+//	sql := `UPDATE company_contract_merge SET is_best_new = 1  WHERE company_contract_merge_id=? `
+//	_, err = o.Raw(sql, companyContractMergeId).Exec()
+//	return
+//}

+ 11 - 0
models/cygx/activity_video.go

@@ -172,6 +172,17 @@ func GetActivityVideoList(condition string, pars []interface{}) (items []*CygxAc
 	return
 }
 
+// 列表
+func GetCygxActivityVideoList(condition string, pars []interface{}) (items []*CygxActivityVideo, err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	sql := ` SELECT  * FROM  cygx_activity_video  WHERE  1=1  `
+	if condition != "" {
+		sql += condition
+	}
+	_, err = o.Raw(sql, pars).QueryRows(&items)
+	return
+}
+
 // MicroRoadShowDefaultImgList 微路演行业默认背景图列表
 type MicroRoadShowDefaultImgList struct {
 	Audio []*MicroRoadShowDefaultImg `description:"音频"`

+ 16 - 0
models/cygx/askserie_video.go

@@ -205,3 +205,19 @@ func EditCygxAskserieVideoStatus(status, askserieVideoId int) (err error) {
 	_, err = o.Raw(sql, status, askserieVideoId).Exec()
 	return
 }
+
+// 修改分享图片
+func EditCygxAskserieVideoShareImg(shareImg string, askserieVideoId int) (err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	sql := `UPDATE cygx_askserie_video SET share_img=?   WHERE askserie_video_id=? `
+	_, err = o.Raw(sql, shareImg, askserieVideoId).Exec()
+	return
+}
+
+// 修改文件名称
+func EditCygxAskserieVideoVideoName(videoName string, askserieVideoId int) (err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	sql := `UPDATE cygx_askserie_video SET video_name=?   WHERE askserie_video_id=? `
+	_, err = o.Raw(sql, videoName, askserieVideoId).Exec()
+	return
+}

+ 26 - 0
models/cygx/micro_roadshow.go

@@ -68,6 +68,17 @@ func GetMicroRoadshowVideoList(condition, sortStr string, pars []interface{}, st
 	return
 }
 
+func GetCygxMicroRoadshowVideoList(condition string, pars []interface{}, startSize, pageSize int) (items []*CygxMicroRoadshowVideo, err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	sql := ` SELECT * FROM cygx_micro_roadshow_video as v  WHERE 1=1 `
+	if condition != "" {
+		sql += condition
+	}
+	sql += ` LIMIT ?,? `
+	_, err = o.Raw(sql, pars, startSize, pageSize).QueryRows(&items)
+	return
+}
+
 func GetMicroRoadshowVideoListCount(condition string, pars []interface{}) (count int, err error) {
 	o := orm.NewOrmUsingDB("hz_cygx")
 	sql := `SELECT COUNT(1) AS count FROM cygx_micro_roadshow_video WHERE 1=1 `
@@ -131,6 +142,21 @@ func EditVideo(item *CygxMicroRoadshowVideo) (err error) {
 	return
 }
 
+// 修改
+func UpdateCygxMicroRoadshowVideo(item *CygxMicroRoadshowVideo) (err error) {
+	to := orm.NewOrmUsingDB("hz_cygx")
+	updateParams := make(map[string]interface{})
+	updateParams["ShareImgUrl"] = item.ShareImgUrl
+	ptrStructOrTableName := "cygx_micro_roadshow_video"
+	whereParam := map[string]interface{}{"video_id": item.VideoId}
+	qs := to.QueryTable(ptrStructOrTableName)
+	for expr, exprV := range whereParam {
+		qs = qs.Filter(expr, exprV)
+	}
+	_, err = qs.Update(updateParams)
+	return
+}
+
 func PublishVideoCancel(videoId, publishOrCancle int) (err error) {
 
 	if publishOrCancle == 0 {

+ 14 - 8
models/response/statistic_report.go

@@ -98,14 +98,15 @@ type StackCompanyListResp struct {
 
 // 增量客户统计报表返回类
 type IncrementalCompanyListResp struct {
-	List                   []*models.IncrementalList
-	Paging                 *paging.PagingItem `description:"分页数据"`
-	TrialTotal             int                `description:"新增试用客户数"`
-	NewCompanyTotal        int                `description:"新签客户数"`
-	RenewalCompanyTotal    int                `description:"续约客户数"`
-	NotRenewalCompanyTotal int                `description:"未续约客户数"`
-	NotRenewalTryOut       int                `description:"未续约客户(试用)数"`
-	NotRenewalNotTryOut    int                `description:"未续约客户(非试用)数"`
+	Paging                            *paging.PagingItem `description:"分页数据"`
+	List                              []*models.IncrementalList
+	TrialTotal                        int `description:"新增试用客户数"`
+	NewCompanyTotal                   int `description:"新签客户数"`
+	RenewalCompanyTotal               int `description:"续约客户数"`
+	NotRenewalCompanyTotal            int `description:"未续约客户数(已确认)"`
+	NotRenewalCompanyToBeConfirmTotal int `description:"未续约客户数(待确认)"`
+	NotRenewalTryOut                  int `description:"未续约客户(试用)数"`
+	NotRenewalNotTryOut               int `description:"未续约客户(非试用)数"`
 }
 
 // MoreRenewReasonResp 未续约说明列表返回类
@@ -122,3 +123,8 @@ type RenewReasonItemResp struct {
 	RenewalTodo   string `description:"待办事项说明"`
 	CreateTime    string `description:"添加时间"`
 }
+
+// 合并之后的合同详情
+type CompanyPreviousDetailResp struct {
+	Detail *models.IncrementalList
+}

+ 49 - 0
models/statistic_report.go

@@ -400,6 +400,8 @@ type IncrementalList struct {
 	AscribeContent      string                             `description:"归因标签说明"`
 	IsShowNoRenewedNote bool                               `description:"是否展示未续约备注按钮"`
 	Content             string                             `description:"归因内容说明"`
+	PermissionName      string                             `description:"权限名"`
+	//CompanyContractIdGroup string                             `description:"表company_contract合并的 company_contract_id"`
 }
 
 // GetIncrementalNewCompanyCount 获取增量客户报表列表统计数据(根据合同来展示)
@@ -844,3 +846,50 @@ func GetLastContractMoney(CompanyIds string) (items []*IncrementalList, err erro
 	_, err = o.Raw(sql).QueryRows(&items)
 	return
 }
+
+// GetIncrementalNewCompanyList 获取增量客户报表列表数据(根据合同来展示)
+func GetIncrementalCompanyMergeList(condition string, pars []interface{}, startSize, pageSize int) (items []*IncrementalList, err error) {
+	o := orm.NewOrm()
+
+	sql := `SELECT a.*,b.region_type,c.seller_id,c.seller_name,b.company_name,c.renewal_reason FROM company_contract a
+		 JOIN company b ON a.company_id = b.company_id
+		 JOIN company_product c ON a.company_id = c.company_id and a.product_id=c.product_id WHERE 1 = 1 `
+
+	if condition != "" {
+		sql += condition
+	}
+	sql += ` group by a.company_contract_id  order by start_date desc,company_id desc limit ?,?`
+	_, err = o.Raw(sql, pars, startSize, pageSize).QueryRows(&items)
+	return
+}
+
+// GetIncrementalCompanyListByOperationRecordMerge 未续约合同
+func GetIncrementalCompanyListByOperationRecordMerge(condition string, pars []interface{}, startSize, pageSize int) (items []*IncrementalList, err error) {
+	o := orm.NewOrm()
+
+	////查询出最大id
+	//sql1 := `SELECT max(id) id FROM company_operation_record a
+	//	RIGHT JOIN company b ON a.company_id = b.company_id
+	//	JOIN company_product c ON b.company_id = c.company_id
+	//	AND a.product_id = c.product_id
+	//WHERE 1 = 1 `
+	//if condition != "" {
+	//	sql1 += condition
+	//}
+	//sql1 += ` GROUP BY a.company_id, a.product_id `
+
+	//查询真正的数据
+	sql := `SELECT a.company_contract_id,a.contract_type ,a.company_product_id ,a.contract_code ,a.pay_method ,a.pay_channel ,a.package_difference ,a.company_id, a.start_date, a.end_date, a.money, b.company_name, c.seller_id, c.seller_name, a.product_id, a.product_name, a.create_time, b.region_type, c.renewal_reason, c.renewal_todo, c.status FROM company_contract a
+		RIGHT JOIN company b ON a.company_id = b.company_id
+		JOIN company_product c ON b.company_id = c.company_id 
+		AND a.product_id = c.product_id  where 1=1  `
+	//where a.id in (` + sql1 + `) order by  create_time DESC,company_id DESC limit ?,?`
+	//	_, err = o.Raw(sql, pars, startSize, pageSize).QueryRows(&items)
+
+	if condition != "" {
+		sql += condition
+	}
+	sql += ` group by a.company_contract_id  order by end_date desc,company_id desc limit ?,?`
+	_, err = o.Raw(sql, pars, startSize, pageSize).QueryRows(&items)
+	return
+}

+ 27 - 0
routers/commentsRouter.go

@@ -9511,6 +9511,15 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["hongze/hz_crm_api/controllers:CompanySellerController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers:CompanySellerController"],
+        beego.ControllerComments{
+            Method: "CheckListRai",
+            Router: `/seller/check/list_rai`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["hongze/hz_crm_api/controllers:CompanySellerController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers:CompanySellerController"],
         beego.ControllerComments{
             Method: "CheckListForLose",
@@ -10339,6 +10348,24 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["hongze/hz_crm_api/controllers:StatisticCompanyMergerController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers:StatisticCompanyMergerController"],
+        beego.ControllerComments{
+            Method: "MergeCompanyList",
+            Router: `/merge_company_list`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hz_crm_api/controllers:StatisticCompanyMergerController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers:StatisticCompanyMergerController"],
+        beego.ControllerComments{
+            Method: "CompanyPreviousDetail",
+            Router: `/merge_company_previous/detail`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["hongze/hz_crm_api/controllers:StatisticReportController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers:StatisticReportController"],
         beego.ControllerComments{
             Method: "InvoicePaymentList",

+ 1 - 0
routers/router.go

@@ -69,6 +69,7 @@ func init() {
 				&controllers.StatisticReportController{},
 				&controllers.StatisticYbLogController{},
 				&controllers.StatisticReportCommonController{},
+				&controllers.StatisticCompanyMergerController{},
 			),
 		),
 		web.NSNamespace("/voice",

+ 1 - 1
services/aiser/ai.go

@@ -7,7 +7,7 @@ import (
 )
 
 func ChatAutoMsg(prompt string, model int) (result string, err error) {
-	chatUrl := `http://8.210.169.38:8399/v1/chat/auto_msg`
+	chatUrl := `http://47.254.37.124:8399/v1/chat/auto_msg`
 	param := make(map[string]interface{})
 	param["Prompt"] = prompt
 	param["Model"] = model

+ 1 - 2
services/company_apply/company_approval.go

@@ -419,10 +419,9 @@ func Approved(approvalRecord *contract.ContractApprovalRecord, opUser *system.Ad
 
 				//客户研选行业转正时(王芳审批通过),模板消息提醒汪洋
 				services.AddCompanyApprovalMessageWangYang(recordInfo.CompanyId, recordInfo.CompanyContractId, recordInfo.ApplyRealName, companyInfo.CompanyName)
-
 				cygxService.YanXuanCompanyApproval(recordInfo.CompanyId)                           //研选审批通过的时候研选扣点更新
 				cygxService.HandleAllocationCompanyContractByYanXuan(recordInfo.CompanyContractId) //如果合同只有研选的时候,自动处理派点
-
+				cygxService.HandleCompanyContractPackageDifference(recordInfo.CompanyContractId)   // 更新与上一份合同的金额的对比 '增加套餐','减少套餐','维持套餐'
 			}
 		}()
 	} else {

+ 398 - 0
services/company_contract.go

@@ -0,0 +1,398 @@
+package services
+
+//func init() {
+//	InitCompanyContractMerge()
+//	//GetCompanyContractPermissionNameMapById(map[int]string{6513: "182,183", 6663: "435,542"})
+//}
+
+// 初始化合并合同之后的数据脚本
+//func InitCompanyContractMerge() {
+//
+//	var condition string
+//	var pars []interface{}
+//	condition = "  AND status = 1  AND  product_id = 2  ORDER BY  company_contract_id ASC  "
+//	companyContractList, err := company.GetCompanyContractList(condition, pars)
+//
+//	if err != nil {
+//		fmt.Println(err)
+//		return
+//	}
+//	mapCompanyContractItems := make(map[int][]*company.CompanyContractResp)
+//	for _, v := range companyContractList {
+//		//fmt.Println(v)
+//		mapCompanyContractItems[v.CompanyId] = append(mapCompanyContractItems[v.CompanyId], v)
+//	}
+//
+//	mapCompanyMoney := make(map[int]float64)
+//	var items []*company.CompanyContractMergeResp
+//	for _, ContractItems := range mapCompanyContractItems {
+//		item := new(company.CompanyContractMergeResp)
+//		for k, v := range ContractItems {
+//			item = new(company.CompanyContractMergeResp)
+//			item.ContractType = v.ContractType
+//			item.ProductId = v.ProductId
+//			item.ProductName = v.ProductName
+//			item.CompanyId = v.CompanyId
+//			item.CompanyProductId = v.CompanyProductId
+//			item.StartDate = v.StartDate
+//			item.EndDate = v.EndDate
+//			item.Money = v.Money
+//			item.CompanyContractIdGroup += strconv.Itoa(v.CompanyContractId) + ","
+//			if k == 0 {
+//				items = append(items, item)
+//				mapCompanyMoney[v.CompanyId] = item.Money
+//			} else {
+//				if v.CompanyId != items[len(items)-1].CompanyId {
+//					items = append(items, item)
+//				} else {
+//					//续约的合同开始时间是否<上一次合同记录的结束时间 且间隔>6个月(180)天,那么就对两个合同进行合并
+//					if item.StartDate.AddDate(0, 0, +180).Before(items[len(items)-1].EndDate) && item.StartDate.Before(items[len(items)-1].EndDate) {
+//						items[len(items)-1].Money += v.Money
+//						items[len(items)-1].EndDate = v.EndDate
+//						items[len(items)-1].CompanyContractIdGroup += strconv.Itoa(v.CompanyContractId) + ","
+//					} else {
+//						if item.ContractType == "续约合同" {
+//							if item.Money > mapCompanyMoney[v.CompanyId] {
+//								item.PackageDifference = "增加套餐"
+//							}
+//							if item.Money == mapCompanyMoney[v.CompanyId] {
+//								item.PackageDifference = "维持套餐"
+//							}
+//							if item.Money < mapCompanyMoney[v.CompanyId] {
+//								item.PackageDifference = "减少套餐"
+//							}
+//						}
+//						items = append(items, item)
+//						mapCompanyMoney[v.CompanyId] = item.Money
+//					}
+//				}
+//			}
+//		}
+//	}
+//
+//	var contractMergeitems []*company.CompanyContractMerge
+//
+//	var companyIds []int
+//	mapcompanyIds := make(map[int]bool)
+//	for _, v := range items {
+//		item := new(company.CompanyContractMerge)
+//		item.ContractType = v.ContractType
+//		item.ProductId = v.ProductId
+//		item.ProductName = v.ProductName
+//		item.CompanyId = v.CompanyId
+//		item.CompanyProductId = v.CompanyProductId
+//		item.StartDate = v.StartDate.Format(utils.FormatDate)
+//		item.EndDate = v.EndDate.Format(utils.FormatDate)
+//		item.Money = v.Money
+//		item.PackageDifference = v.PackageDifference
+//		item.CompanyContractIdGroup = strings.TrimRight(v.CompanyContractIdGroup, ",")
+//		item.CreateTime = time.Now()
+//		item.ModifyTime = time.Now()
+//		contractMergeitems = append(contractMergeitems, item)
+//
+//		if !mapcompanyIds[v.CompanyId] {
+//			companyIds = append(companyIds, v.CompanyId)
+//			mapcompanyIds[v.CompanyId] = true
+//		}
+//
+//	}
+//
+//	err = company.MultiAddCompanyContractMerge(contractMergeitems)
+//	if err != nil {
+//		fmt.Println(err)
+//		return
+//	}
+//
+//	for _, v := range companyIds {
+//		var condition string
+//		var pars []interface{}
+//
+//		fmt.Println(v)
+//		condition = " AND company_id = ?  ORDER BY start_date DESC   LIMIT  1  "
+//		pars = append(pars, v)
+//		contractMergeInfo, err := company.GetCompanyContractMergeDetail(condition, pars)
+//		if err != nil {
+//			fmt.Println(err)
+//			return
+//		}
+//		err = company.UpdateCompanyContractMergeIsBestNewto1(contractMergeInfo.CompanyContractMergeId)
+//		if err != nil {
+//			fmt.Println(err)
+//			return
+//		}
+//	}
+//}
+
+//// GetCompanyContractPermissionNameMapById 获取合并之后的合同所对应的权限种类名称
+//func GetCompanyContractPermissionNameMapBymapCompamy(mapCompamy map[int]string) (mapContractResp map[int]string, err error) {
+//	if len(mapCompamy) == 0 {
+//		return
+//	}
+//	//var condition string
+//	//var pars []interface{}
+//
+//	mapContracIdCompanyId := make(map[int]int) //建立合同ID与公司ID的map对应关系
+//	var companyContractIds []int
+//	var companyContractIdGroup string //多个合同ID
+//	for k, v := range mapCompamy {
+//		companyContractIdGroup += v + ","
+//		sliceContract := strings.Split(v, ",")
+//		for _, compamyContracId := range sliceContract {
+//			companyContractIdInt, _ := strconv.Atoi(compamyContracId)
+//			mapContracIdCompanyId[companyContractIdInt] = k
+//			companyContractIds = append(companyContractIds, companyContractIdInt)
+//		}
+//	}
+//
+//	contractPermissionNameMap, e := cygxService.GetCompanyContractPermissionNameMapById(companyContractIds)
+//	if e != nil {
+//		err = errors.New("GetCompanyContractPermissionNameMapById, Err: " + e.Error())
+//		return
+//	}
+//
+//	mapContractResp = make(map[int]string, 0)
+//
+//	for k, v := range mapCompamy {
+//
+//		sliceContract := strings.Split(v, ",")
+//		for _, compamyContracId := range sliceContract {
+//			companyContractIdInt, _ := strconv.Atoi(compamyContracId)
+//			for k2, v2 := range contractPermissionNameMap {
+//				if companyContractIdInt == k2 {
+//					mapContractResp[k] += v2 + ","
+//				}
+//			}
+//		}
+//	}
+//
+//	//companyContractIdGroup = strings.TrimRight(companyContractIdGroup, ",")
+//	//condition += " AND  company_contract_id IN (" + companyContractIdGroup + ")"
+//	//companyContractList, e := company.GetCompanyContractList(condition, pars)
+//	//if e != nil && e.Error() != utils.ErrNoRow() {
+//	//	err = errors.New("GetCompanyContractList, Err: " + e.Error())
+//	//	return
+//	//}
+//	//
+//	//permissionList, e := models.GetChartPermissionList()
+//	//if e != nil && e.Error() != utils.ErrNoRow() {
+//	//	err = errors.New("GetChartPermissionList, Err: " + e.Error())
+//	//	return
+//	//}
+//	//mappermissionName := make(map[int]string)
+//	//for _, v := range permissionList {
+//	//	mappermissionName[v.ChartPermissionId] = v.Remark
+//	//}
+//	//
+//	//mapContractIdPerssion := make(map[string]string) //单个合同ID所对应的套餐或者权限名称
+//	//for _, v := range companyContractList {
+//	//	if v.RaiPackageType == 1 {
+//	//		mapContractIdPerssion[strconv.Itoa(v.CompanyContractId)] = "70w套餐"
+//	//	}
+//	//	if v.RaiPackageType == 2 {
+//	//		mapContractIdPerssion[strconv.Itoa(v.CompanyContractId)] = "45w套餐"
+//	//	}
+//	//}
+//	//mapIsUpgrade := make(map[string]bool) //合同ID对应的行业是否有升级
+//	//companyContractPermissionList, e := company.GetCompanyContractPermissionList(condition, pars)
+//	//if e != nil && e.Error() != utils.ErrNoRow() {
+//	//	err = errors.New("GetCompanyContractPermissionList, Err: " + e.Error())
+//	//	return
+//	//}
+//	//for _, v := range companyContractPermissionList {
+//	//	//如果开通的不是整个套餐,那么就做单独的子权限处理
+//	//	if strings.Count(mapContractIdPerssion[strconv.Itoa(v.CompanyContractId)], "w套餐") == 0 {
+//	//		if v.ChartPermissionId == utils.CHART_PERMISSION_ID_YANXUAN {
+//	//			if v.ExpensiveYx == 1 {
+//	//				mapContractIdPerssion[strconv.Itoa(v.CompanyContractId)] += utils.CHART_PERMISSION_NAME_MF_YANXUAN + "(5w),"
+//	//			} else {
+//	//				mapContractIdPerssion[strconv.Itoa(v.CompanyContractId)] += utils.CHART_PERMISSION_NAME_MF_YANXUAN + "(3w),"
+//	//			}
+//	//		} else {
+//	//			mapContractIdPerssion[strconv.Itoa(v.CompanyContractId)] += mappermissionName[v.ChartPermissionId] + ","
+//	//			if v.IsUpgrade == 1 {
+//	//				//合同ID,权限名称形成唯一的主键索引
+//	//				perssionName := mappermissionName[v.ChartPermissionId]
+//	//				perssionName = strings.Replace(perssionName, "(客观)", "", -1)
+//	//				perssionName = strings.Replace(perssionName, "(主观)", "", -1)
+//	//				mapIsUpgrade[fmt.Sprint(v.CompanyContractId, "perssionName", perssionName)] = true
+//	//			}
+//	//		}
+//	//	}
+//	//}
+//	//
+//	////合并客观权限
+//	//for k, v := range mapContractIdPerssion {
+//	//	perssionName := v
+//	//	if strings.Count(v, utils.YI_YAO_NAME) == 2 {
+//	//		perssionName = strings.Replace(perssionName, "医药(主观)", "医药", -1)
+//	//		perssionName = strings.Replace(perssionName, "医药(客观)", "", -1)
+//	//	}
+//	//	if strings.Count(v, utils.XIAO_FEI_NAME) == 2 {
+//	//		perssionName = strings.Replace(perssionName, "消费(主观)", "消费", -1)
+//	//		perssionName = strings.Replace(perssionName, "消费(客观)", "", -1)
+//	//	}
+//	//	if strings.Count(v, utils.KE_JI_NAME) == 2 {
+//	//		perssionName = strings.Replace(perssionName, "科技(主观)", "科技", -1)
+//	//		perssionName = strings.Replace(perssionName, "科技(客观)", "", -1)
+//	//	}
+//	//	if strings.Count(v, utils.ZHI_ZAO_NAME) == 2 {
+//	//		perssionName = strings.Replace(perssionName, "智造(主观)", "智造", -1)
+//	//		perssionName = strings.Replace(perssionName, "智造(客观)", "", -1)
+//	//	}
+//	//	perssionName = strings.TrimRight(perssionName, ",")
+//	//	mapContractIdPerssion[k] = perssionName
+//	//}
+//	//mapContractResp = make(map[int]string, 0)
+//	//for k, v := range mapContractIdPerssion {
+//	//	mapContractResp[mapContracIdCompanyId[k]] += v + ","
+//	//}
+//	//
+//	////过滤多余的","
+//	//for k, v := range mapContractResp {
+//	//	sliceName := strings.Split(v, ",")
+//	//	var nameArr []string
+//	//	for _, vName := range sliceName {
+//	//		if vName == "" {
+//	//			continue
+//	//		}
+//	//		if mapIsUpgrade[fmt.Sprint(k, "perssionName", vName)] {
+//	//			vName += "(升级)"
+//	//		}
+//	//		nameArr = append(nameArr, vName)
+//	//	}
+//	//	mapContractResp[k] = strings.Join(nameArr, ",")
+//	//}
+//	return
+//}
+
+//func init() {
+//	AddCompanyContractMergeByCompanyContractId(1219)
+//}
+
+// AddCompanyContractMergeByCompanyContractId 通过合同ID对合同进行合并
+//func AddCompanyContractMergeByCompanyContractId(companyContractId int) {
+//	var err error
+//	defer func() {
+//		if err != nil {
+//			fmt.Println(err)
+//			go alarm_msg.SendAlarmMsg("通过合同ID对合同进行合并,失败"+err.Error()+fmt.Sprint("companyContractId", companyContractId), 2)
+//		}
+//	}()
+//	contractInfo, e := company.GetCompanyContractDetailByCompanyContractId(companyContractId)
+//	if e != nil {
+//		err = errors.New("GetCompanyContractDetailByCompanyContractId, Err: " + e.Error())
+//		return
+//	}
+//
+//	var condition string
+//	var pars []interface{}
+//
+//	condition = " AND company_id = ?  ORDER BY start_date DESC   LIMIT  1  "
+//	pars = append(pars, contractInfo.CompanyId)
+//	contractMergeInfo, e := company.GetCompanyContractMergeDetail(condition, pars)
+//	if e != nil && e.Error() != utils.ErrNoRow() {
+//		err = errors.New("GetCompanyContractMergeDetail, Err: " + e.Error())
+//		return
+//	}
+//	//fmt.Println(contractMergeInfo)
+//	e = company.UpdateCompanyContractMergeIsBestNew(0, contractInfo.CompanyId)
+//	if e != nil {
+//		err = errors.New("UpdateCompanyContractMergeIsBestNew, Err: " + e.Error())
+//		return
+//	}
+//	//fmt.Println(contractInfo)
+//	item := new(company.CompanyContractMerge)
+//	item.ContractType = contractInfo.ContractType
+//	item.ProductId = contractInfo.ProductId
+//	item.ProductName = contractInfo.ProductName
+//	item.CompanyId = contractInfo.CompanyId
+//	item.CompanyProductId = contractInfo.CompanyProductId
+//	item.IsBestNew = 1
+//	item.CreateTime = time.Now()
+//	item.ModifyTime = time.Now()
+//	//如果不存在就是新的数据
+//	if contractMergeInfo == nil {
+//		item.StartDate = contractInfo.StartDate
+//		item.EndDate = contractInfo.EndDate
+//		item.Money = contractInfo.Money
+//		item.CompanyContractIdGroup = strconv.Itoa(companyContractId)
+//		e = company.AddCompanyContractMerge(item)
+//		if e != nil {
+//			err = errors.New("AddCompanyContractMerge, Err: " + e.Error())
+//			return
+//		}
+//	} else {
+//		newStartDate := utils.StrDateToDate(contractInfo.StartDate)
+//		//newEndDate := utils.StrDateToDate(contractInfo.EndDate)
+//		oldEndDate := utils.StrDateToDate(contractMergeInfo.EndDate)
+//
+//		//续约的合同开始时间是否<上一次合同记录的结束时间 且间隔>6个月(180)天,那么就对两个合同进行合并
+//		if newStartDate.AddDate(0, 0, +180).Before(oldEndDate) && newStartDate.Before(oldEndDate) {
+//			item.Money = contractInfo.Money + contractMergeInfo.Money
+//			item.EndDate = contractInfo.EndDate
+//			item.CompanyContractIdGroup = contractMergeInfo.CompanyContractIdGroup + "," + strconv.Itoa(companyContractId)
+//			//如果是续约合同就对比跟上一份合并之后的合同的差距
+//			if item.ContractType == "续约合同" {
+//				pars = make([]interface{}, 0)
+//				condition = " AND company_id = ?  AND company_contract_merge_id != ?   ORDER BY start_date DESC   LIMIT  1  "
+//				pars = append(pars, contractMergeInfo.CompanyId, contractMergeInfo.CompanyContractMergeId)
+//				detailPrevious, e := company.GetCompanyContractMergeDetail(condition, pars)
+//				if e != nil && e.Error() != utils.ErrNoRow() {
+//					err = errors.New("GetCompanyContractMergeDetail-Update, Err: " + e.Error())
+//					return
+//				}
+//				if detailPrevious == nil {
+//					item.PackageDifference = ""
+//				} else {
+//					if item.Money > detailPrevious.Money {
+//						item.PackageDifference = "增加套餐"
+//					}
+//					if item.Money == detailPrevious.Money {
+//						item.PackageDifference = "维持套餐"
+//					}
+//					if item.Money < detailPrevious.Money {
+//						item.PackageDifference = "减少套餐"
+//					}
+//				}
+//			}
+//			item.CompanyContractMergeId = contractMergeInfo.CompanyContractMergeId
+//			e = company.UpdateCompanyContractMerge(item)
+//			if e != nil {
+//				err = errors.New("AddCompanyContractMerge, Err: " + e.Error())
+//				return
+//			}
+//		} else {
+//			item.StartDate = contractInfo.StartDate
+//			item.EndDate = contractInfo.EndDate
+//			item.Money = contractInfo.Money
+//			item.CompanyContractIdGroup = strconv.Itoa(companyContractId)
+//			//如果是续约合同就对比跟上一份合并之后的合同的差距
+//			if item.ContractType == "续约合同" {
+//				//pars = make([]interface{}, 0)
+//				//condition = " AND company_id = ?  AND company_contract_merge_id != ?   ORDER BY start_date DESC   LIMIT  1  "
+//				//pars = append(pars, contractMergeInfo.CompanyId, contractMergeInfo.CompanyContractMergeId)
+//				//detailPrevious, e := company.GetCompanyContractMergeDetail(condition, pars)
+//				//if e != nil {
+//				//	err = errors.New("GetCompanyContractMergeDetail——add, Err: " + e.Error())
+//				//	return
+//				//}
+//				if item.Money > contractMergeInfo.Money {
+//					item.PackageDifference = "增加套餐"
+//				}
+//				if item.Money == contractMergeInfo.Money {
+//					item.PackageDifference = "维持套餐"
+//				}
+//				if item.Money < contractMergeInfo.Money {
+//					item.PackageDifference = "减少套餐"
+//				}
+//			}
+//			e = company.AddCompanyContractMerge(item)
+//			if e != nil {
+//				err = errors.New("AddCompanyContractMerge, Err: " + e.Error())
+//				return
+//			}
+//		}
+//	}
+//
+//	return
+//}

+ 213 - 0
services/cygx/activity_meet.go

@@ -3,6 +3,7 @@ package cygx
 import (
 	"errors"
 	"fmt"
+	"hongze/hz_crm_api/models"
 	"hongze/hz_crm_api/models/cygx"
 	"hongze/hz_crm_api/services/alarm_msg"
 	"hongze/hz_crm_api/utils"
@@ -225,3 +226,215 @@ func AddctivitySignupDetailList(itemsDetail []*cygx.CygxActivitySignupDetail, ac
 
 	return err
 }
+
+// AddctivitySignupDetailListByHand 手动匹配进门财经信息
+func AddctivitySignupDetailListByHand(itemsDetail []*cygx.CygxActivityAttendanceDetail, activityId int) (err error) {
+	defer func() {
+		if err != nil {
+			fmt.Println(err)
+			go alarm_msg.SendAlarmMsg("通过进门财经添加用户参数信息失败 ErrMsg:"+err.Error(), 2)
+		}
+	}()
+
+	activityIds := make([]int, 0)
+	activityIds = append(activityIds, activityId)
+	actLen := len(activityIds)
+	var condition string
+	var pars []interface{}
+	if actLen > 0 {
+		condition += ` AND activity_id IN (` + utils.GetOrmInReplace(actLen) + `)`
+		pars = append(pars, activityIds)
+	}
+
+	signUpDetailList, err := cygx.GetSignupDetailList(condition, pars)
+	if err != nil && err.Error() != utils.ErrNoRow() {
+		return err
+	}
+
+	mapsignUpDetai := make(map[string]string)
+	if len(signUpDetailList) > 0 {
+		for _, v := range signUpDetailList {
+			mapsignUpDetai[fmt.Sprint("ActivityId", v.ActivityId, "Mobile", v.Mobile)] = v.Mobile
+		}
+	}
+
+	//获取当天已经结束了 活动的报名人数
+	signUpList, err := cygx.GetSignupDetailBySignup(condition, pars)
+	if err != nil && err.Error() != utils.ErrNoRow() {
+		return err
+	}
+	//建立外呼号与手机号的绑定
+	mapsignUp := make(map[string]string)
+	if len(signUpList) > 0 {
+		for _, v := range signUpList {
+			mapsignUp[fmt.Sprint(v.OutboundMobile)] = v.Mobile
+		}
+	}
+
+	var itemsAdd []*cygx.CygxActivitySignupDetail
+	var itemsUpdate []*cygx.CygxActivitySignupDetail
+
+	var mobiles []string
+	mobileMap := make(map[string]bool)
+	mobileUserMap := make(map[string]int)
+	for _, v := range itemsDetail {
+		if !mobileMap[v.Mobile] {
+			mobiles = append(mobiles, v.Mobile)
+		}
+		mobileMap[v.Mobile] = true
+	}
+
+	//根据手机号获取这些用户的信息
+	listUser, e := models.GetWxUserByOutboundMobiles(mobiles)
+	if e != nil {
+		err = errors.New("GetWxUserOutboundMobiles, Err: " + e.Error())
+		return
+	}
+
+	for _, v := range listUser {
+		mobileUserMap[v.Mobile] = int(v.UserId)
+	}
+
+	for _, v := range itemsDetail {
+		var item = new(cygx.CygxActivitySignupDetail)
+		item.ActivityId = v.ActivityId
+		//item.RealName = v.RealName
+		//如果手机号存在那么就是报名的,不存在就是直接参与的
+		if _, ok := mapsignUp[v.Mobile]; ok {
+			item.Mobile = mapsignUp[v.Mobile]
+		} else {
+			item.Mobile = v.Mobile
+		}
+		item.UserId = mobileUserMap[v.Mobile]
+		item.RealName = v.RealName
+		item.OutboundMobile = v.Mobile
+		item.CompanyName = v.CompanyName
+		item.CompanyId = v.CompanyId
+		item.SellerName = v.SellerName
+		item.FirstMeetingTime = v.FirstMeetingTime
+		item.LastMeetingTime = v.LastMeetingTime
+		item.Duration = v.Duration
+		item.MeetingTypeStr = v.MeetingTypeStr
+		item.MeetingAuthentication = v.MeetingAuthentication
+		item.MeetingStatusStr = v.MeetingStatusStr
+		item.CreateTime = v.CreateTime
+		item.Position = v.Position
+		item.IsMeeting = 1
+		item.UseridEntity = v.UseridEntity
+		item.ActivityTime = v.ActivityTime
+		item.CrmCompanyMapStatusId = v.CrmCompanyMapStatusId
+
+		if _, ok := mapsignUpDetai[fmt.Sprint("ActivityId", v.ActivityId, "Mobile", item.Mobile)]; !ok {
+			itemsAdd = append(itemsAdd, item)
+		} else {
+			itemsUpdate = append(itemsUpdate, item)
+		}
+	}
+	//return err
+	if len(itemsAdd) > 0 {
+		err = cygx.AddCygxActivitySignupDetail(itemsAdd)
+		if err != nil {
+			return
+		}
+	}
+
+	if len(itemsUpdate) > 0 {
+		err = cygx.UpdateActivitySignupDetailMulti(itemsUpdate)
+		if err != nil {
+			return
+		}
+	}
+
+	return err
+}
+
+// AddctivitySignupDetailListByAdminSignup 已结束的活动,管理员手动添加报名,把信息写入到联系人列表参会信息中
+func AddctivitySignupDetailListByAdminSignup(activityIdsStr string) (err error) {
+	defer func() {
+		if err != nil {
+			fmt.Println(err)
+			go alarm_msg.SendAlarmMsg(fmt.Sprint("已结束的活动,管理员手动添加报名,把信息写入到联系人列表参会信息中 ErrMsg:"+err.Error(), "activityIds:", activityIdsStr), 2)
+		}
+	}()
+
+	var condition string
+	var pars []interface{}
+	condition = ` AND active_state = 3 AND  activity_id IN (` + activityIdsStr + `)  `
+	list, e := cygx.GetActivityListAll(condition, pars, 0, 9999)
+	if e != nil && e.Error() != utils.ErrNoRow() {
+		err = errors.New("GetWxUserOutboundMobiles, Err: " + e.Error())
+		return
+	}
+	if len(list) == 0 {
+		return
+	}
+
+	var activityIds []int
+
+	for _, v := range list {
+		activityIds = append(activityIds, v.ActivityId)
+	}
+
+	actLen := len(activityIds)
+	condition = ` AND activity_id IN (` + utils.GetOrmInReplace(actLen) + `)`
+	pars = append(pars, activityIds)
+
+	//获取已经写入的信息,并建立map
+	signUpDetailList, err := cygx.GetSignupDetailList(condition, pars)
+	if err != nil && err.Error() != utils.ErrNoRow() {
+		return err
+	}
+	mapsignUpDetai := make(map[string]string)
+	if len(signUpDetailList) > 0 {
+		for _, v := range signUpDetailList {
+			mapsignUpDetai[fmt.Sprint("ActivityId", v.ActivityId, "Mobile", v.Mobile)] = v.Mobile
+		}
+	}
+
+	pars = make([]interface{}, 0)
+	condition = ` AND activity_id IN (` + utils.GetOrmInReplace(actLen) + `) AND do_fail_type = 0`
+	pars = append(pars, activityIds)
+	//获取成功报名的人员信息
+	signUpList, err := cygx.GetSignupDetailBySignup(condition, pars)
+	if err != nil && err.Error() != utils.ErrNoRow() {
+		return err
+	}
+	//建立外呼号与手机号的绑定
+	mapsignUp := make(map[string]string)
+	if len(signUpList) > 0 {
+		for _, v := range signUpList {
+			mapsignUp[fmt.Sprint(v.OutboundMobile)] = v.Mobile
+		}
+	}
+	var items []*cygx.CygxActivitySignupDetail
+	if len(signUpList) > 0 {
+		for _, v := range signUpList {
+			if _, ok := mapsignUpDetai[fmt.Sprint("ActivityId", v.ActivityId, "Mobile", v.Mobile)]; !ok {
+				item := new(cygx.CygxActivitySignupDetail)
+				item.UserId = v.UserId
+				item.RealName = v.RealName
+				item.SellerName = v.SellerName
+				item.ActivityId = v.ActivityId
+				item.CreateTime = v.CreateTime
+				item.Mobile = v.Mobile
+				item.OutboundMobile = v.OutboundMobile
+				item.Email = v.Email
+				item.CompanyId = v.CompanyId
+				item.CompanyName = v.CompanyName
+				item.SignupType = v.SignupType
+				item.FailType = v.FailType
+				item.DoFailType = v.DoFailType
+				items = append(items, item)
+			}
+		}
+	}
+	if len(items) > 0 {
+		e = cygx.AddCygxActivitySignupDetail(items)
+		if e != nil {
+			err = errors.New("AddCygxActivitySignupDetail, Err: " + e.Error())
+			return
+		}
+	}
+
+	return err
+}

+ 9 - 2
services/cygx/activity_ocr.go

@@ -175,7 +175,6 @@ func UpdateActivityVideoAndVoice(activityInfo *cygx.ActivityDetail, itemVoice *c
 			err = errors.New("GetCygxActivityVoiceCount" + e.Error())
 			return
 		}
-
 		activityId := itemVoice.ActivityId
 		//获取活动详情
 		activityInfo, e := cygx.GetAddActivityInfoById(activityId)
@@ -190,6 +189,10 @@ func UpdateActivityVideoAndVoice(activityInfo *cygx.ActivityDetail, itemVoice *c
 			itemVoice.FileType = 2
 		}
 
+		shareImg, _ := MakeCygxMp3HtmlImg(itemVoice.VoicePlaySeconds) //生成分享图片
+		itemVoice.ShareImg = shareImg
+		itemVoice.VoiceName = utils.RemoveFileSuffixName(itemVoice.VoiceName) //去掉后缀名称
+
 		//如果等于0就新增,反之就修改
 		if total == 0 {
 			newId, e := cygx.AddCygxActivityVoice(itemVoice)
@@ -229,7 +232,6 @@ func UpdateActivityVideoAndVoice(activityInfo *cygx.ActivityDetail, itemVoice *c
 				err = errors.New("DeleteCygxActivityVoice" + e.Error())
 				return
 			}
-
 			go UpdateActivityVoiceResourceData(voiceDetail.ActivityVoiceId) //写入首页最新  cygx_resource_data 表
 		}
 	}
@@ -256,6 +258,11 @@ func UpdateActivityVideoAndVoice(activityInfo *cygx.ActivityDetail, itemVoice *c
 		} else {
 			itemVideo.FileType = 2
 		}
+
+		shareImg, _ := MakeCygxMp4HtmlImg(itemVideo.VideoDuration) //生成分享图片
+		itemVideo.ShareImg = shareImg
+		itemVideo.VideoName = utils.RemoveFileSuffixName(itemVideo.VideoName) //去掉后缀名称
+
 		//视频文件更换阿里云oss地址 避免卡顿
 		var newOssUrl string
 		newOssUrl = strings.Replace(itemVideo.VideoUrl, "https://hzstatic.hzinsights.com", "https://hzchart.oss-accelerate.aliyuncs.com", -1)

+ 95 - 0
services/cygx/activity_poster.go

@@ -21,6 +21,8 @@ import (
 var (
 	ServerUrl                = "http://127.0.0.1:5008/"
 	Cygx_activity_sigin_html = "cygx_activity_sigin_html"
+	Cygx_mp3_html            = "cygx_mp3_html"
+	Cygx_mp4_html            = "cygx_mp4_html"
 )
 
 type Html2ImgResp struct {
@@ -233,3 +235,96 @@ func MakeActivitySigninImg(activityId int) (imgUrl string, err error) {
 	err = cygx.AddCygxActivityPoster(item)
 	return
 }
+
+// 生成音视频分享封面图
+func MakeCygxMp3HtmlImg(videoDuration string) (imgUrl string, err error) {
+	var msg string
+	defer func() {
+		if err != nil || msg != "" {
+			fmt.Println(err)
+			go alarm_msg.SendAlarmMsg("生成音视频分享封面图,失败 MakeCygxMp3HtmlImg:"+err.Error()+";msg:"+msg, 3)
+		}
+	}()
+	detailConfig, e := cygx.GetCygxConfigDetailByCode(Cygx_mp3_html)
+	if e != nil {
+		err = errors.New("GetCygxConfigDetailByCode 获取配置生成音视频分享封面图格式信息失败, Err: " + e.Error())
+		return
+	}
+	// 处理时长带有小数点的字符串
+	slice := strings.Split(videoDuration, ".")
+	for k, v := range slice {
+		if k != 0 {
+			continue
+		}
+		videoDuration = v
+	}
+	//先转换时长展示样式再替换
+	secondNum, _ := strconv.Atoi(videoDuration)
+	videoDuration = utils.HideSecondsToMs(secondNum)
+
+	configValue := detailConfig.ConfigValue
+	configValue = strings.Replace(configValue, "{{TIME}}", videoDuration, -1)
+	htm2ImgReq := make(map[string]interface{})
+	htm2ImgReq["html_content"] = configValue
+	htm2ImgReq["width"] = 1364
+	htm2ImgReq["height"] = 2060
+	res, err := postHtml2Img(htm2ImgReq)
+	if err != nil || res == nil {
+		msg = "html转图片请求失败"
+		return
+	}
+	if res.Code != 200 {
+		msg = "html转图片请求失败"
+		err = errors.New("html转图片失败: " + res.Msg)
+		return
+	}
+	imgUrl = res.Data
+	return
+}
+
+// 生成音视频分享封面图
+func MakeCygxMp4HtmlImg(videoDuration string) (imgUrl string, err error) {
+	var msg string
+	defer func() {
+		if err != nil || msg != "" {
+			fmt.Println(err)
+			go alarm_msg.SendAlarmMsg("生成音视频分享封面图,失败 MakeCygxMp4HtmlImg:"+err.Error()+";msg:"+msg, 3)
+		}
+	}()
+	detailConfig, e := cygx.GetCygxConfigDetailByCode(Cygx_mp4_html)
+	if e != nil {
+		err = errors.New("GetCygxConfigDetailByCode 获取配置生成音视频分享封面图格式信息失败, Err: " + e.Error())
+		return
+	}
+
+	// 处理时长带有小数点的字符串
+	slice := strings.Split(videoDuration, ".")
+	for k, v := range slice {
+		if k != 0 {
+			continue
+		}
+		videoDuration = v
+	}
+	//先转换时长展示样式再替换
+	secondNum, _ := strconv.Atoi(videoDuration)
+	videoDuration = utils.HideSecondsToMs(secondNum)
+
+	configValue := detailConfig.ConfigValue
+	configValue = strings.Replace(configValue, "{{TIME}}", videoDuration, -1)
+	htm2ImgReq := make(map[string]interface{})
+	htm2ImgReq["html_content"] = configValue
+	htm2ImgReq["width"] = 1364
+	htm2ImgReq["height"] = 2060
+	res, err := postHtml2Img(htm2ImgReq)
+	if err != nil || res == nil {
+		msg = "html转图片请求失败"
+		return
+	}
+	if res.Code != 200 {
+		msg = "html转图片请求失败"
+		err = errors.New("html转图片失败: " + res.Msg)
+		return
+	}
+	imgUrl = res.Data
+	return
+}

+ 148 - 0
services/cygx/askserie_video.go

@@ -135,3 +135,151 @@ func init12() {
 		}
 	}
 }
+
+// 修改分享图片脚本
+func initpy() {
+
+	//python3 main.py
+	var condition string
+	var pars []interface{}
+	listVoice, err := cygx.GetActivityVoiceList(condition, pars)
+	if err != nil && err.Error() != utils.ErrNoRow() {
+		fmt.Println(err)
+		return
+	}
+
+	for _, v := range listVoice {
+		shareImg, _ := MakeCygxMp3HtmlImg(v.VoicePlaySeconds) //生成分享图片
+		v.ShareImg = shareImg
+		err = cygx.UpdateCygxActivityVoice(v)
+		if err != nil {
+			err = errors.New("UpdateCygxActivityVoice" + err.Error())
+			return
+		}
+		fmt.Println(err)
+	}
+
+	listVideo, err := cygx.GetCygxActivityVideoList(condition, pars)
+	if err != nil && err.Error() != utils.ErrNoRow() {
+		fmt.Println(err)
+		return
+	}
+
+	for _, v := range listVideo {
+		shareImg, _ := MakeCygxMp4HtmlImg(v.VideoDuration) //生成分享图片
+		v.ShareImg = shareImg
+		err = cygx.UpdateCygxActivityVideo(v)
+		if err != nil {
+			err = errors.New("UpdateCygxActivityVideo" + err.Error())
+			return
+		}
+		fmt.Println(err)
+	}
+
+	listVideoRoadshow, err := cygx.GetCygxMicroRoadshowVideoList(condition, pars, 0, 1000)
+	if err != nil && err.Error() != utils.ErrNoRow() {
+		fmt.Println(err)
+		return
+	}
+
+	for _, v := range listVideoRoadshow {
+		shareImg, _ := MakeCygxMp4HtmlImg(v.VideoDuration) //生成分享图片
+		v.ShareImgUrl = shareImg
+		err = cygx.UpdateCygxMicroRoadshowVideo(v)
+		if err != nil {
+			err = errors.New("UpdateCygxMicroRoadshowVideo" + err.Error())
+			return
+		}
+		fmt.Println(err)
+	}
+
+	listAskserVoice, err := cygx.GetCygxAskserieVideoList(condition, pars, 0, 1000)
+	if err != nil && err.Error() != utils.ErrNoRow() {
+		fmt.Println(err)
+		return
+	}
+
+	for _, v := range listAskserVoice {
+		shareImg, _ := MakeCygxMp3HtmlImg(v.VideoDuration) //生成分享图片
+		v.ShareImg = shareImg
+		err = cygx.EditCygxAskserieVideoShareImg(shareImg, v.AskserieVideoId)
+		if err != nil {
+			err = errors.New("EditCygxAskserieVideoShareImg" + err.Error())
+			return
+		}
+		fmt.Println(err)
+	}
+
+	return
+}
+
+// 去掉后缀名脚本
+func initFileName() {
+	var condition string
+	var pars []interface{}
+	listVoice, err := cygx.GetActivityVoiceList(condition, pars)
+	if err != nil && err.Error() != utils.ErrNoRow() {
+		fmt.Println(err)
+		return
+	}
+
+	for _, v := range listVoice {
+		v.VoiceName = utils.RemoveFileSuffixName(v.VoiceName) //去掉后缀名称
+		err = cygx.UpdateCygxActivityVoice(v)
+		if err != nil {
+			err = errors.New("UpdateCygxActivityVoice" + err.Error())
+			return
+		}
+		fmt.Println(err)
+	}
+
+	listVideo, err := cygx.GetCygxActivityVideoList(condition, pars)
+	if err != nil && err.Error() != utils.ErrNoRow() {
+		fmt.Println(err)
+		return
+	}
+
+	for _, v := range listVideo {
+		v.VideoName = utils.RemoveFileSuffixName(v.VideoName) //去掉后缀名称
+		err = cygx.UpdateCygxActivityVideo(v)
+		if err != nil {
+			err = errors.New("UpdateCygxActivityVideo" + err.Error())
+			return
+		}
+		fmt.Println(err)
+	}
+
+	listVideoRoadshow, err := cygx.GetCygxMicroRoadshowVideoList(condition, pars, 0, 1000)
+	if err != nil && err.Error() != utils.ErrNoRow() {
+		fmt.Println(err)
+		return
+	}
+
+	for _, v := range listVideoRoadshow {
+		v.VideoName = utils.RemoveFileSuffixName(v.VideoName) //去掉后缀名称
+		err = cygx.UpdateCygxMicroRoadshowVideo(v)
+		if err != nil {
+			err = errors.New("UpdateCygxMicroRoadshowVideo" + err.Error())
+			return
+		}
+		fmt.Println(err)
+	}
+
+	listAskserVoice, err := cygx.GetCygxAskserieVideoList(condition, pars, 0, 1000)
+	if err != nil && err.Error() != utils.ErrNoRow() {
+		fmt.Println(err)
+		return
+	}
+
+	for _, v := range listAskserVoice {
+		v.VideoName = utils.RemoveFileSuffixName(v.VideoName) //去掉后缀名称
+		err = cygx.EditCygxAskserieVideoVideoName(v.VideoName, v.AskserieVideoId)
+		if err != nil {
+			err = errors.New("EditCygxAskserieVideoShareImg" + err.Error())
+			return
+		}
+		fmt.Println(err)
+	}
+
+	return
+}

+ 124 - 1
services/cygx/contract_allocation.go

@@ -8,10 +8,61 @@ import (
 	"hongze/hz_crm_api/models/cygx"
 	"hongze/hz_crm_api/services/alarm_msg"
 	"hongze/hz_crm_api/utils"
+	"strconv"
 	"strings"
 	"time"
 )
 
+//
+//func init() {
+//	fmt.Println(GetCompanyContractPermissionNameMapBymapCompamy(map[int]string{6991: "1138"}))
+//}
+
+// GetCompanyContractPermissionNameMapBymapCompamy 获取合并之后的合同所对应的权限种类名称
+func GetCompanyContractPermissionNameMapBymapCompamy(mapCompamy map[int]string) (mapContractResp map[int]string, err error) {
+	if len(mapCompamy) == 0 {
+		return
+	}
+
+	mapContracIdCompanyId := make(map[int]int) //建立合同ID与公司ID的map对应关系
+	var companyContractIds []int
+	//var companyContractIdGroup string //多个合同ID
+	for k, v := range mapCompamy {
+		//companyContractIdGroup += v + ","
+		sliceContract := strings.Split(v, ",")
+		for _, compamyContracId := range sliceContract {
+			companyContractIdInt, _ := strconv.Atoi(compamyContracId)
+			mapContracIdCompanyId[companyContractIdInt] = k
+			companyContractIds = append(companyContractIds, companyContractIdInt)
+		}
+	}
+
+	// 获取单个合同所对应的权限名称
+	contractPermissionNameMap, e := GetCompanyContractPermissionNameMapById(companyContractIds)
+	if e != nil {
+		err = errors.New("GetCompanyContractPermissionNameMapById, Err: " + e.Error())
+		return
+	}
+
+	mapContractResp = make(map[int]string, 0)
+	for k, v := range mapCompamy {
+		sliceContract := strings.Split(v, ",")
+		for _, compamyContracId := range sliceContract {
+			companyContractIdInt, _ := strconv.Atoi(compamyContracId)
+			for k2, v2 := range contractPermissionNameMap {
+				if companyContractIdInt == k2 {
+					mapContractResp[k] += v2 + ","
+				}
+			}
+		}
+	}
+
+	for k, v := range mapContractResp {
+		mapContractResp[k] = strings.TrimRight(v, ",")
+	}
+	return
+}
+
 // GetCompanyContractPermissionNameMapById 获取合并之后的合同所对应的权限种类名称
 func GetCompanyContractPermissionNameMapById(companyContractIds []int) (mapContractResp map[int]string, err error) {
 	//return
@@ -38,7 +89,9 @@ func GetCompanyContractPermissionNameMapById(companyContractIds []int) (mapContr
 	}
 	mappermissionName := make(map[int]string)
 	for _, v := range permissionList {
-		mappermissionName[v.ChartPermissionId] = v.Remark
+		if v.ProductId == 2 {
+			mappermissionName[v.ChartPermissionId] = v.Remark
+		}
 	}
 
 	mapContractIdPerssion := make(map[int]string) //单个合同ID所对应的套餐或者权限名称
@@ -254,7 +307,77 @@ func HandleAllocationCompanyContractByYanXuan(companyContractId int) (err error)
 		err = errors.New("AddAndUpdateCygxAllocationCompanyContract, Err: " + e.Error())
 		return
 	}
+	return
+}
 
+//func init() {
+//	var condition string
+//	var pars []interface{}
+//
+//	condition = " AND status = 1  "
+//
+//	list, err := company.GetCompanyContractList(condition, pars)
+//	if err != nil {
+//		fmt.Println(err)
+//		return
+//	}
+//	fmt.Println(len(list))
+//	//return
+//	for _, v := range list {
+//		fmt.Println(v.CompanyContractId)
+//		HandleCompanyContractPackageDifference(v.CompanyContractId)
+//	}
+//
+//}
+
+// HandleCompanyContractPackageDifference 更新与上一份合同的金额的对比 '增加套餐','减少套餐','维持套餐'
+func HandleCompanyContractPackageDifference(companyContractId int) (err error) {
+	defer func() {
+		if err != nil {
+			fmt.Println(err)
+			go alarm_msg.SendAlarmMsg(fmt.Sprint("如果合同只有研选的时候,自动处理派点失败,Err:", err.Error(), "companyContractId", companyContractId), 2)
+		}
+	}()
+	var condition string
+	var pars []interface{}
+
+	condition = " AND company_contract_id = ?  "
+	pars = append(pars, companyContractId)
+	detail, e := company.GetCompanyContracDetail(condition, pars)
+	if e != nil {
+		err = errors.New("GetCompanyContracDetail,detail Err: " + e.Error())
+		return
+	}
+
+	//如果不是续约合同就不做对比处理
+	if detail.ContractType != "续约合同" {
+		return
+	}
+	//获取前一份合同的信息
+	pars = make([]interface{}, 0)
+	condition = " AND company_id = ? AND company_contract_id < ?   AND status = 1    AND product_id = ?  ORDER BY company_contract_id DESC   LIMIT  1  "
+	pars = append(pars, detail.CompanyId, companyContractId, detail.ProductId)
+	detailPrevious, e := company.GetCompanyContracDetail(condition, pars)
+	if e != nil {
+		err = errors.New("GetCompanyContracDetail,detailPrevious Err: " + e.Error())
+		return
+	}
+	var packageDifference string
+
+	if detail.Money > detailPrevious.Money {
+		packageDifference = "增加套餐"
+	} else if detail.Money < detailPrevious.Money {
+		packageDifference = "减少套餐"
+	} else {
+		packageDifference = "维持套餐"
+	}
+
+	e = company.UpdateCompanyContractPackageDifference(packageDifference, companyContractId)
+	fmt.Println(packageDifference)
+	if e != nil {
+		err = errors.New("UpdateCompanyContractPackageDifference, Err: " + e.Error())
+		return
+	}
 	return
 
 }

+ 41 - 1
utils/common.go

@@ -1095,6 +1095,30 @@ func GetAttendanceDetailSeconds(secondNum int) string {
 	return timeStr
 }
 
+// 音视频时长秒转换成 分秒字符串样式
+func HideSecondsToMs(secondNum int) string {
+	var formatString string
+	m := secondNum / 60
+	s := secondNum % 60
+
+	if m == 0 {
+		formatString = fmt.Sprint("00:")
+	} else if m > 0 && m < 10 {
+		formatString = fmt.Sprint("0", m, ":")
+	} else {
+		formatString = fmt.Sprint(m, ":")
+	}
+
+	if s == 0 {
+		formatString += fmt.Sprint("00")
+	} else if s > 0 && s < 10 {
+		formatString += fmt.Sprint("0", s)
+	} else {
+		formatString += fmt.Sprint(s)
+	}
+	return formatString
+}
+
 // SubStr 截取字符串(中文)
 func SubStr(str string, subLen int) string {
 	strRune := []rune(str)
@@ -2110,4 +2134,20 @@ func ArticleHasImgUrl(body string) (hasImg bool, err error) {
 		hasImg = true
 	})
 	return
-}
+}
+
+// 移除文件后缀名称
+func RemoveFileSuffixName(fileName string) (removedName string) {
+	if strings.Contains(fileName, ".") {
+		slice := strings.Split(fileName, ".")
+		var suffixName string
+		for _, v := range slice {
+			suffixName = v
+		}
+		suffixName = "." + suffixName
+		removedName = strings.TrimRight(fileName, suffixName)
+	} else {
+		removedName = fileName
+	}
+	return
+}

+ 2 - 2
utils/constants.go

@@ -158,8 +158,8 @@ const (
 	COMPANY_PRODUCT_RAI_NAME  = "权益"
 )
 
-var PermissionFiccClassifyArr = [...]string{"宏观经济", "化工产业", "建材产业", "有色产业", "市场策略"}
-var PermissionAllClassifyArr = [...]string{"宏观经济", "化工产业", "建材产业", "有色产业", "市场策略", "权益"}
+var PermissionFiccClassifyArr = [...]string{"宏观经济", "化工产业", "建材产业", "有色产业", "新能源", "市场策略"}
+var PermissionAllClassifyArr = [...]string{"宏观经济", "化工产业", "建材产业", "有色产业", "新能源", "市场策略", "权益"}
 
 //apply_method:申请类型:1:试用->正式,2:冻结—>试用,3:流失—>正式,4:试用延期,5:原销售申请领取流失客户,6:正式客户申请服务更新