Browse Source

Merge branch 'feature/crm14.9_contract_change' of hongze/hz_crm_api into master

xyxie 1 year ago
parent
commit
0aec0fcd8a

+ 47 - 4
controllers/company_share.go

@@ -175,7 +175,39 @@ func (this *CompanyController) CompanyShareList() {
 				condition += ` AND b.product_id=? `
 				pars = append(pars, productId)
 			}
-			if sysUser.RoleTypeCode != utils.ROLE_TYPE_CODE_ADMIN && sysUser.AdminId != 66 && sysUser.AdminId != 15 {
+
+			if sysUser.Authority == 2 && roleTypeCode == utils.ROLE_TYPE_CODE_FICC_GROUP {
+				groupIdStr, sellerIdStr, err := services.GetFiccChildGroupIdsByGroupIds(sysUser.GroupId)
+				if err != nil {
+					br.Msg = "获取销售分组信息失败!"
+					br.ErrMsg = "获取销售分组信息失败!Err:" + err.Error()
+					return
+				}
+				if sysUser.GroupId == groupId {
+					if sellerIdStr != "" {
+						condition += ` AND a.share_seller_id IN (` + sellerIdStr + `) `
+					}
+				} else {
+					if groupIdStr != "" {
+						condition += ` AND b.group_id IN (` + groupIdStr + `) `
+					}
+				}
+			} else if sysUser.Authority == 4 || roleTypeCode == utils.ROLE_TYPE_CODE_RAI_GROUP {
+				if sysUser.GroupId == groupId {
+					sellerIdStr, err := services.GetFiccSellerIdsByGroupId(sysUser.GroupId)
+					if err != nil {
+						br.Msg = "获取销售分组信息失败!"
+						br.ErrMsg = "获取销售分组信息失败!Err:" + err.Error()
+						return
+					}
+					if sellerIdStr != "" {
+						condition += ` AND a.share_seller_id IN (` + sellerIdStr + `) `
+					}
+				} else {
+					condition += ` AND b.group_id=? `
+					pars = append(pars, sysUser.GroupId)
+				}
+			} else if sysUser.RoleTypeCode != utils.ROLE_TYPE_CODE_ADMIN && sysUser.AdminId != 66 && sysUser.AdminId != 15 && roleTypeCode != utils.ROLE_TYPE_CODE_FICC_ADMIN && roleTypeCode != utils.ROLE_TYPE_CODE_RAI_ADMIN {
 				if sysUser.GroupId == groupId {
 					condition += ` AND a.share_seller_id=? `
 					pars = append(pars, sysUser.AdminId)
@@ -192,8 +224,10 @@ func (this *CompanyController) CompanyShareList() {
 			//非咨询组销售,那么默认查看“未共享”的客户
 			if sysUser.GroupId != groupId {
 				listParam = 3
-				condition += ` AND b.seller_id = ? `
-				pars = append(pars, sysUser.AdminId)
+				if sysUser.RoleTypeCode == utils.ROLE_TYPE_CODE_FICC_SELLER {
+					condition += ` AND b.seller_id = ? `
+					pars = append(pars, sysUser.AdminId)
+				}
 			} else {
 				condition += ` AND a.is_share=1 `
 			}
@@ -471,7 +505,7 @@ func (this *CompanyController) CompanyShareList() {
 			//btnItem = services.GetCompanyPermissionButtonByReceiveEnabled(btnItem, receiveEnabled)
 
 			// 13.6正式客户共享按钮显示控制
-			btnItem = services.GetShareCompanyPermissionButton(roleTypeCode, itemStatus, item.ProductId)
+			btnItem = services.GetShareCompanyPermissionButton(roleTypeCode, itemStatus, item.ProductId, item, sysUser)
 		}
 		list[i].BtnItem = btnItem
 
@@ -528,6 +562,15 @@ func (this *CompanyController) CompanyShareList() {
 			tmpStatus := v.Status
 			if v.IsShare == 1 {
 				tmpStatus = v.Status + "(共享)"
+			} else {
+				if v.BtnItem.BtnModifySeller == true {
+					v.BtnItem.BtnModifySeller = false
+				}
+			}
+
+			if v.IsShare == 1 && v.BtnItem.BtnModifySeller == true {
+				//如果已经是共享客户了,取消共享按钮全都显示,和修改销售权限一样
+				v.BtnItem.BtnShare = true
 			}
 
 			companyList := &company.CompanyListItem{

+ 119 - 0
controllers/statistic_report.go

@@ -6357,3 +6357,122 @@ func (this *StatisticReportController) UnusualRenewCompanyStatistics() {
 	br.Msg = "获取成功"
 	br.Data = companyRenewRecordResp
 }
+
+// UnusualRenewCompanyList
+// @Title 获取未续约的公司合同列表
+// @Description 合同套餐列表
+// @Param   ProductId  query  int  false  "套餐类型: 1-FICC(默认); 2-权益"
+// @Param   StartDate   query   string  true       "开始日期,格式:2022-04"
+// @Param   EndDate   query   string  true       "结束日期,格式:2022-04"
+// @Success 200 {object} company.GetUnusualRenewListGroupMonthResp
+// @router /report/unusual_renew_company/chart [get]
+func (this *StatisticReportController) UnusualRenewCompanyList() {
+	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
+	}
+	// 起始日期
+	// 截止日期
+	productId, _ := this.GetInt("ProductId", 1)
+	startDate := this.GetString("StartDate")
+	endDate := this.GetString("EndDate")
+
+	if startDate == `` || endDate == `` {
+		br.Msg = "开始日期或结束日期不能为空"
+		return
+	}
+	allList := make([]*company.GetUnusualRenewListGroupMonth, 0)
+	resp := new(company.GetUnusualRenewListGroupMonthResp)
+	resp.List = allList
+	newStartDate := startDate + "-01"
+	newEndDate := endDate + "-01"
+
+	startDateTimer, _ := time.ParseInLocation(utils.FormatDate, newStartDate, time.Local)
+	endDateTimer, _ := time.ParseInLocation(utils.FormatDate, newEndDate, time.Local)
+	endDateTimer = endDateTimer.AddDate(0, 1, 0).Add(-1 * time.Second) //本月最后一天
+
+	// 按月分组
+	monthMap := make(map[string]int)
+	monthCompanyMap := make(map[string]struct{})
+	monthList := make([]string, 0)
+	tmpDate, _ := time.ParseInLocation(utils.FormatYearMonthDate, startDate, time.Local)
+	tmpEndDate, _ := time.ParseInLocation(utils.FormatYearMonthDate, endDate, time.Local)
+	for tmpDate.Before(tmpEndDate) || tmpDate == tmpEndDate {
+		monthMap[tmpDate.Format(utils.FormatYearMonthDate)] = 0
+		monthList = append(monthList, tmpDate.Format(utils.FormatYearMonthDate))
+		tmpDate = tmpDate.AddDate(0, 1, 0)
+
+	}
+	// 只查询咨询组销售下的客户
+	groupId := 0
+	if utils.RunMode == "release" {
+		groupId = 37
+	} else {
+		groupId = 61
+	}
+	subAdmins, err := system.GetAdminByGroupId(groupId)
+	if err != nil && err.Error() != utils.ErrNoRow() {
+		br.Msg = "获取销售失败"
+		br.ErrMsg = "获取销售失败,Err:" + err.Error()
+		return
+	}
+	if len(subAdmins) == 0 {
+		resp = &company.GetUnusualRenewListGroupMonthResp{
+			List: allList,
+		}
+		br.Ret = 200
+		br.Success = true
+		br.Msg = "获取成功"
+		br.Data = resp
+		return
+	}
+	subAdminIds := make([]string, 0)
+	for _, v := range subAdmins {
+		subAdminIds = append(subAdminIds, strconv.Itoa(v.AdminId))
+	}
+	shareSellerIds := strings.Join(subAdminIds, ",")
+
+	list, err := company.GetUnusualRenewList(startDateTimer, endDateTimer, productId, shareSellerIds)
+	if err != nil {
+		br.Msg = "数据异常"
+		br.ErrMsg = "数据异常,Err:" + err.Error()
+		return
+	}
+	if len(list) > 0 {
+		for _, v := range list {
+			t := v.ModifyTime.Format(utils.FormatYearMonthDate)
+			name := fmt.Sprintf("%s_%d", t, v.CompanyId)
+			if _, ok := monthCompanyMap[name]; !ok {
+				if num, ok1 := monthMap[t]; ok1 {
+					monthMap[t] = num + 1
+				}
+				monthCompanyMap[name] = struct{}{}
+			}
+		}
+	}
+
+	for _, v := range monthList {
+		n, _ := monthMap[v]
+		tmp := &company.GetUnusualRenewListGroupMonth{
+			Date:       v,
+			CompanyNum: n,
+		}
+		allList = append(allList, tmp)
+	}
+	resp = &company.GetUnusualRenewListGroupMonthResp{
+		List: allList,
+	}
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = resp
+}

+ 35 - 1
models/company/company_renewal_record.go

@@ -44,7 +44,7 @@ WHERE
     AND a.source = 1 
 	AND a.product_id = ?
 GROUP BY
-	a.seller_id;
+	a.share_seller_id;
 `
 	_, err = o.Raw(sql, startDate, endDate, productId).QueryRows(&list)
 
@@ -67,3 +67,37 @@ func (item *CompanyRenewalRecord) Add() (err error) {
 
 	return
 }
+
+type GetUnusualRenewListGroupMonth struct {
+	Date       string
+	CompanyNum int
+}
+
+type GetUnusualRenewListGroupMonthResp struct {
+	List []*GetUnusualRenewListGroupMonth
+}
+
+// GetUnusualRenewList 获取未续约公司列表
+func GetUnusualRenewList(startDate, endDate time.Time, productId int, shareSellerIds string) (list []*CompanyRenewalRecord, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT
+	* 
+FROM
+	company_renewal_record 
+WHERE
+	source = 1 
+	AND modify_time BETWEEN ? 
+	AND ? 
+	AND product_id = ?
+	AND share_seller_id in (` + shareSellerIds + `)
+`
+	_, err = o.Raw(sql, startDate, endDate, productId).QueryRows(&list)
+
+	return
+}
+
+func (item *CompanyRenewalRecord) InsertMulti(items []*CompanyRenewalRecord) (err error) {
+	o := orm.NewOrm()
+	_, err = o.InsertMulti(len(items), items)
+	return
+}

+ 9 - 0
routers/commentsRouter.go

@@ -10564,6 +10564,15 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["hongze/hz_crm_api/controllers:StatisticReportController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers:StatisticReportController"],
+        beego.ControllerComments{
+            Method: "UnusualRenewCompanyList",
+            Router: `/report/unusual_renew_company/chart`,
+            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: "StackCompanyList",

+ 26 - 1
services/company.go

@@ -8,6 +8,7 @@ import (
 	"hongze/hz_crm_api/models"
 	"hongze/hz_crm_api/models/company"
 	"hongze/hz_crm_api/models/company_user"
+	"hongze/hz_crm_api/models/system"
 	"hongze/hz_crm_api/services/alarm_msg"
 	"hongze/hz_crm_api/utils"
 	"strconv"
@@ -2349,7 +2350,7 @@ func FilterReadAndContractAuth(chartPermissions, contractPermissions, condition
 }
 
 // GetShareCompanyPermissionButton 正式客户共享-权限按钮(目前仅FICC有正式客户共享, 所以不管权益角色)
-func GetShareCompanyPermissionButton(roleTypeCode, statuses string, productId int) (button *company.ButtonPermission) {
+func GetShareCompanyPermissionButton(roleTypeCode, statuses string, productId int, item *company.CompanyItem, sysUser *system.Admin) (button *company.ButtonPermission) {
 	statusMap := make(map[int]string)
 	statusMap[productId] = statuses
 	if strings.Contains(statuses, "/") {
@@ -2357,6 +2358,26 @@ func GetShareCompanyPermissionButton(roleTypeCode, statuses string, productId in
 		statusMap[1] = statusArr[0]
 		statusMap[2] = statusArr[1]
 	}
+	//roleTypeCode, itemStatus, item.SellerIds, item.GroupIds, item.GroupId, sysUser.GroupId, item.SellerId, sysUser.AdminId, sysUser.Authority, item.ProductId, item.ShareSellerId
+
+	//所属销售map
+	sellerIdMap := make(map[int]string)
+	sellerIdMap[productId] = item.SellerIds
+	if strings.Contains(item.SellerIds, "/") {
+		sellerIdSlice := strings.Split(item.SellerIds, "/")
+		sellerIdMap[1] = sellerIdSlice[0]
+		sellerIdMap[2] = sellerIdSlice[1]
+	}
+
+	//分组map
+	groupIdMap := make(map[int]string)
+	groupIdMap[productId] = item.GroupIds
+
+	if strings.Contains(item.GroupIds, "/") {
+		groupIdSlice := strings.Split(item.GroupIds, "/")
+		groupIdMap[1] = groupIdSlice[0]
+		groupIdMap[2] = groupIdSlice[1]
+	}
 
 	// 查看权限均有
 	button = new(company.ButtonPermission)
@@ -2394,5 +2415,9 @@ func GetShareCompanyPermissionButton(roleTypeCode, statuses string, productId in
 		button.BtnRemarkView = true
 		button.BtnServiceRecord = true
 	}
+	companyButton := GetCompanyPermissionButton(roleTypeCode, statuses, item.SellerIds, item.GroupIds, item.GroupId, sysUser.GroupId, item.SellerId, sysUser.AdminId, sysUser.Authority, item.ProductId, item.ShareSellerId)
+	if companyButton.BtnShare == true {
+		button.BtnShare = true
+	}
 	return
 }

+ 3 - 2
services/statistic_report/unusual_renew_company.go

@@ -136,7 +136,8 @@ func getUnusualRenewSectionData(productId int, startDate, endDate time.Time, ch
 			if !ok {
 				tmp = 0
 			}
-			unusualRenewMap[v.ShareSellerId] = tmp + 1
+			companyIdSlice := strings.Split(v.CompanyIds, ",")
+			unusualRenewMap[v.ShareSellerId] = tmp + len(companyIdSlice)
 
 			// 客户id
 			tmpCompanyIdList2, ok := unusualRenewCompanyIdListMap[v.ShareSellerId]
@@ -145,7 +146,7 @@ func getUnusualRenewSectionData(productId int, startDate, endDate time.Time, ch
 			}
 			unusualRenewCompanyIdListMap[v.ShareSellerId] = append(tmpCompanyIdList2, fmt.Sprint(v.CompanyIds))
 
-			unusualRenewCompanyTotal++
+			unusualRenewCompanyTotal += len(companyIdSlice)
 		}
 
 		for sellerId, tmpCompanyIdList := range unusualRenewCompanyIdListMap {

+ 74 - 0
services/system.go

@@ -6,6 +6,8 @@ import (
 	"hongze/hz_crm_api/models/roadshow"
 	"hongze/hz_crm_api/models/system"
 	"hongze/hz_crm_api/utils"
+	"strconv"
+	"strings"
 	"time"
 )
 
@@ -290,3 +292,75 @@ func CheckRaiAdmin(adminId int) (isRai bool, err error) {
 	}
 	return
 }
+
+func GetFiccChildGroupIdsByGroupIds(groupId int) (sid string, sellerIds string, err error) {
+	pid, err := company.GetParentIdFromGroup(groupId)
+	if err != nil {
+		return
+	}
+	var ids []*string
+	if pid != nil {
+		if *pid != 0 {
+			//销售主管放在三级列表中
+			ids, err = company.GetGroupIdsByParentId(*pid)
+			if err != nil {
+				fmt.Println(err.Error())
+				return
+			}
+		} else {
+			//销售主管放在二级列表中
+			ids, err = company.GetGroupIdsByParentId(groupId)
+			if err != nil {
+				fmt.Println(err.Error())
+				return
+			}
+		}
+	}
+	var idSlice []string
+	for _, id := range ids {
+		idSlice = append(idSlice, *id)
+	}
+	//加入父级groupId
+	if *pid > 0 {
+		idSlice = append(idSlice, strconv.Itoa(*pid))
+	} else {
+		idSlice = append(idSlice, strconv.Itoa(groupId))
+	}
+	sid = strings.Join(idSlice, ",")
+
+	//查询这些组内的所有seller_ids
+	if len(idSlice) > 0 {
+		admins, tErr := system.GetTeamSysUserListByIds(sid)
+		if tErr != nil {
+			err = tErr
+			fmt.Println(tErr.Error())
+			return
+		}
+		var sellerIdSlice []string
+		for _, v := range admins {
+			sellerIdSlice = append(sellerIdSlice, strconv.Itoa(v.AdminId))
+		}
+		sellerIds = strings.Join(sellerIdSlice, ",")
+	}
+
+	return
+}
+
+func GetFiccSellerIdsByGroupId(groupId int) (sellerIds string, err error) {
+	//查询这些组内的所有seller_ids
+	if groupId > 0 {
+		admins, tErr := system.GetAdminByGroupId(groupId)
+		if tErr != nil {
+			err = tErr
+			fmt.Println(tErr.Error())
+			return
+		}
+		var sellerIdSlice []string
+		for _, v := range admins {
+			sellerIdSlice = append(sellerIdSlice, strconv.Itoa(v.AdminId))
+		}
+		sellerIds = strings.Join(sellerIdSlice, ",")
+	}
+
+	return
+}

+ 88 - 1
services/task.go

@@ -2,8 +2,10 @@ package services
 
 import (
 	"fmt"
+	"hongze/hz_crm_api/models/company"
 	"hongze/hz_crm_api/models/eta_business"
 	"hongze/hz_crm_api/utils"
+	"time"
 )
 
 func Task() {
@@ -14,7 +16,7 @@ func Task() {
 	go AutoInsertAdminOperateRecordToDB()
 
 	//go FixEtaBusinessCodeEncrypt()
-
+	//InitContractUnusual()
 	fmt.Println("task end")
 }
 
@@ -35,3 +37,88 @@ func FixEtaBusinessCodeEncrypt() {
 		}
 	}
 }
+
+// InitContractUnusual 补全续约统计异常的客户
+func InitContractUnusual() (err error) {
+	defer func() {
+		if err != nil {
+			fmt.Println("initYearContractUnusual 补全未续约合同记录,Err:" + err.Error())
+			utils.FileLog.Info("initYearContractUnusual 补全未续约合同记录,Err:" + err.Error())
+		}
+	}()
+
+	addList := make([]*company.CompanyRenewalRecord, 0)
+	// 整理时间表
+	startDate, _ := time.ParseInLocation(utils.FormatDate, "2023-01-01", time.Local)
+	endDate, _ := time.ParseInLocation(utils.FormatDate, "2023-12-07", time.Local)
+	for startDate.Before(endDate) || startDate == endDate {
+		tmpC := ` AND end_date = ? AND status = 1 AND contract_type IN ( "新签合同", "续约合同" )  AND product_id = 1`
+		var tmpP []interface{}
+		before61 := startDate.AddDate(0, 0, -61)
+		tmpP = append(tmpP, before61)
+		contractList, e := company.GetCompanyContractList(tmpC, tmpP)
+		if e != nil {
+			err = fmt.Errorf("查询合同列表失败, ERR:%s", e)
+			return
+		}
+		if len(contractList) > 0 {
+			contractMap := make(map[int]*company.CompanyContractResp)
+			for _, v := range contractList {
+				//查询这个合同是否存在续约合同,起始日大于今日,或者截止日
+				contractMap[v.CompanyId] = v
+			}
+			ficcNormalMap := make(map[int]struct{})
+
+			tmpC = ` AND start_date >= ? AND start_date <= ? AND status = 1 AND contract_type="续约合同" AND product_id = 1`
+			tmpP = make([]interface{}, 0)
+			tmpP = append(tmpP, before61, startDate)
+
+			contractNormalList, e := company.GetCompanyContractList(tmpC, tmpP)
+			if e != nil {
+				err = fmt.Errorf("查询合同列表失败, ERR:%s", e)
+				return
+			}
+			for _, v := range contractNormalList {
+				ficcNormalMap[v.CompanyId] = struct{}{}
+			}
+			for _, v := range contractList {
+				companyInfo, tErr := company.GetCompanyById(v.CompanyId)
+				if tErr != nil {
+					err = tErr
+					return
+				}
+				if companyInfo.IsShare == 0 {
+					companyInfo.ShareSellerId = 0
+					companyInfo.ShareSeller = ""
+				}
+				sellers, tErr := company.GetCompanyProductByCompanyIdAndProductId(v.CompanyId, v.ProductId)
+				if tErr != nil {
+					err = tErr
+					return
+				}
+				//查询这个合同是否存在续约合同,起始日大于今日,或者截止日
+				if _, ok := ficcNormalMap[v.CompanyId]; !ok {
+					tmp := &company.CompanyRenewalRecord{
+						CompanyId:       v.CompanyId,
+						ProductId:       v.ProductId,
+						Source:          1,
+						SellerId:        sellers.SellerId,
+						SellerName:      sellers.SellerName,
+						ShareSellerId:   companyInfo.ShareSellerId,
+						ShareSellerName: companyInfo.ShareSeller,
+						CreateTime:      startDate,
+						ModifyTime:      startDate,
+					}
+					addList = append(addList, tmp)
+				}
+			}
+		}
+		startDate = startDate.AddDate(0, 0, 1)
+	}
+	if len(addList) > 0 {
+		item := new(company.CompanyRenewalRecord)
+		err = item.InsertMulti(addList)
+
+	}
+	return
+}