package cygx import ( "fmt" "github.com/rdlucklib/rdluck_tools/paging" "hongze/hz_crm_api/controllers" "hongze/hz_crm_api/models" "hongze/hz_crm_api/models/company" "hongze/hz_crm_api/models/contract" "hongze/hz_crm_api/models/cygx" "hongze/hz_crm_api/models/system" contractService "hongze/hz_crm_api/services/contract" "hongze/hz_crm_api/utils" "strconv" "strings" "time" ) // ContractAllocationController 权益合同派单 type ContractAllocationController struct { controllers.BaseAuthController } // getQueryParams 获取基础查询信息 func getQueryParams(condition string, pars []interface{}, sysUser *system.Admin, tableAlias string) (newCondition string, newPars []interface{}) { if sysUser.RoleTypeCode == utils.ROLE_TYPE_CODE_FICC_ADMIN { condition += " AND " + tableAlias + "product_id=?" pars = append(pars, 1) } else if sysUser.RoleTypeCode == utils.ROLE_TYPE_CODE_RAI_ADMIN { condition += " AND " + tableAlias + "product_id=?" pars = append(pars, 2) } else if sysUser.RoleTypeCode == utils.ROLE_TYPE_CODE_ADMIN || sysUser.RoleTypeCode == utils.ROLE_TYPE_CODE_FINANCE { //超级管理员账户,不做条件限制 } else { //如果不是研究员,那么去找对应的 部门、小组、销售 if sysUser.Authority == 0 { //普通用户 condition += " AND " + tableAlias + "seller_id=?" pars = append(pars, sysUser.AdminId) } else if sysUser.Authority == 1 { //部门主管 condition += " AND " + tableAlias + "department_id=?" pars = append(pars, sysUser.DepartmentId) } else if sysUser.Authority == 2 && sysUser.RoleTypeCode == utils.ROLE_TYPE_CODE_RAI_GROUP { //权益小组负责人 condition += " AND " + tableAlias + "group_id=?" pars = append(pars, sysUser.GroupId) } else if sysUser.Authority == 2 && sysUser.RoleTypeCode == utils.ROLE_TYPE_CODE_FICC_GROUP { //ficc销售主管 pid, err := company.GetParentIdFromGroup(sysUser.GroupId) if err != nil { fmt.Println(err.Error()) return } var ids []*string if pid != nil && *pid != 0 { ids, err = company.GetGroupIdsByParentId(*pid) if err != nil { fmt.Println(err.Error()) } } else { ids, err = company.GetGroupIdsByParentId(sysUser.GroupId) if err != nil { fmt.Println(err.Error()) } } var idSlice []string var sid 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(sysUser.GroupId)) } sid = strings.Join(idSlice, ",") condition += " AND " + tableAlias + `group_id IN (` + sid + `) ` fmt.Println("condition:", condition) //pars = append(pars, sysUser.GroupId) } else if sysUser.Authority == 4 { //ficc小组负责人 condition += " AND " + tableAlias + "group_id=?" pars = append(pars, sysUser.GroupId) } else { //不知道什么类型的用户(后面新增的位置类型客户) condition += " AND " + tableAlias + "seller_id=?" pars = append(pars, sysUser.AdminId) } } newCondition = condition newPars = pars return } // @Title 合同列表 // @Description 合同列表接口 // @Param PageSize query int true "每页数据条数" // @Param CurrentIndex query int true "当前页页码,从1开始" // @Param Keyword query string true "客户名称" // @Param AdminId query string true "销售id,多个用英文逗号隔开,空字符串为全部" // @Param StartDate query string false "开始日期" // @Param EndDate query string false "结束日期" // @Param ContractType query string false "合同类型,枚举值:“,`新签合同`,`续约合同`,`补充协议`" // @Param FormalType query string false "转正类型,枚举值:“,`标准`,`非标`" // @Param IsExport query bool false "是否导出excel,默认是false" // @Param IsAllocation query int false "派点状态: -1-默认全部; 0-未派点; 1-已派点" // @Success 200 {object} cygx.CompanyContractListResp // @router /allocation/company_contract_list [get] func (this *ContractAllocationController) CompanyContractList() { 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") formalType := this.GetString("FormalType") contractType := this.GetString("ContractType") keyword := this.GetString("Keyword") startDate := this.GetString("StartDate") endDate := this.GetString("EndDate") isAllocation, _ := this.GetInt("IsAllocation", -1) // CRM 13.9 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 keyword != "" { condition += ` and b.company_name like "%` + keyword + `%" ` } //是否派点 if isAllocation != -1 { condition += ` AND a.product_id = ? ` pars = append(pars, isAllocation) } // 标准非标查询 switch formalType { case "标准": condition += ` AND a.source = ? ` pars = append(pars, "系统合同") case "非标": condition += ` AND a.source = ? ` pars = append(pars, "上传附件") } if contractType != "" { condition += ` AND a.contract_type = ? ` pars = append(pars, contractType) } //默认只查询权益 2023-06-01 之后的合同 condition += ` AND c.product_id = ? AND a.start_date > ? ` pars = append(pars, 2, "2023-06-01") var list []*cygx.CompanyContractResp total, err := cygx.GetCompanyContractCountJoinCompany(condition, pars) if err != nil && err.Error() != utils.ErrNoRow() { br.Msg = "获取失败" br.ErrMsg = "获取失败,Err:" + err.Error() return } //列表页数据 list, err = cygx.GetCompanyContractListJoinCompany(condition, pars, startSize, pageSize) if err != nil { br.Msg = "获取失败" br.ErrMsg = "获取失败,Err:" + err.Error() return } listLen := len(list) if listLen == 0 { list = make([]*cygx.CompanyContractResp, 0) } else { var contractCodes []string for _, v := range list { switch v.Source { case "系统合同": v.FormalType = "标准" case "上传附件": v.FormalType = "非标" } contractCodes = append(contractCodes, v.ContractCode) } lencontractCodes := len(contractCodes) if lencontractCodes > 0 { //获取标准合同的ID,这里上面的查询已经关联了三张表,拆分吧。。。 condition = "" joinStr := "" pars = make([]interface{}, 0) condition = " AND a.contract_code IN (" + utils.GetOrmInReplace(lencontractCodes) + ") " pars = append(pars, contractCodes) listContract, err := contract.GetContractList(condition, joinStr, pars, 0, lencontractCodes) if err != nil { br.Msg = "获取合同列表失败!" br.ErrMsg = "获取合同列表失败,Err:" + err.Error() return } mapContractCode := make(map[string]int) for _, v := range listContract { mapContractCode[v.ContractCode] = v.ContractId } for _, v := range list { v.ContractId = mapContractCode[v.ContractCode] } } } page := paging.GetPaging(currentIndex, pageSize, total) resp := cygx.CompanyContractListResp{ Paging: page, List: list, } //导出excel if isExport { //IncrementalCompanyListExport(this, dataType, resp, br) return } br.Ret = 200 br.Success = true br.Msg = "获取成功" br.Data = resp } // @Title 详情 // @Description 获取详情接口 // @Param CompanyContractId query int true "ID" // @Success Ret=200 {object} cygx.CygxAllocationCompanyContractDetailResp // @router /allocation/detail [get] func (this *ContractAllocationController) Detail() { 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(cygx.CygxAllocationCompanyContractDetailResp) companyContractId, _ := this.GetInt("CompanyContractId") if companyContractId < 1 { br.Msg = "请输入详情ID" return } contractItem, err := company.GetCompanyContractById(companyContractId) if err != nil { br.Msg = "获取信息失败" br.ErrMsg = "获取合同信息失败,Err:" + err.Error() return } total, err := cygx.GetCygxAllocationCompanyContractCountByCompanyContractId(companyContractId) if err != nil { br.Msg = "获取信息失败" br.ErrMsg = "获取合同信息失败,GetCygxAllocationCompanyContractCountByCompanyContractId Err:" + err.Error() return } if total == 0 { } var contractPermissionList []*company.ContractPermissionList expMap := map[int]string{0: "(3w)", 1: "(5w)"} // 买方研选价格 //classifyName := "权益" checkList := make([]int, 0) plist := new(company.ContractPermissionList) hasPermissions, e := company.GetCompanyContractPermissionByCompanyContractId(companyContractId) if e != nil { br.Msg = "获取失败" br.ErrMsg = "获取合同权限信息失败,Err:" + e.Error() return } hasMap := make(map[int]*company.CompanyContractPermission) for _, p := range hasPermissions { hasMap[p.ChartPermissionId] = p } checkItems := make([]*company.PermissionLookItem, 0) // PS:本来想把这个移到循环外面去优化一下...但是发现有指针引用变量被改掉的问题, BUG太多了改不完了先这样吧=_=! raiPermissions, e := company.GetPermissionLookItemsExt("2", utils.COMPANY_PRODUCT_RAI_NAME) if e != nil { br.Msg = "获取失败" br.ErrMsg = "获取权益权限列表失败, Err: " + e.Error() return } for _, n := range raiPermissions { match := hasMap[n.ChartPermissionId] if match == nil { continue } // 升级 if match.IsUpgrade == 1 { n.IsUpgrade = 1 checkList = append(checkList, n.ChartPermissionId) checkItems = append(checkItems, n) continue } // 买方研选(3w/5w) if n.PermissionName == utils.CHART_PERMISSION_NAME_MF_YANXUAN { n.PermissionName += expMap[match.ExpensiveYx] checkList = append(checkList, n.ChartPermissionId) checkItems = append(checkItems, n) continue } checkList = append(checkList, n.ChartPermissionId) checkItems = append(checkItems, n) } plist.Items = checkItems plist.ClassifyName = utils.COMPANY_PRODUCT_RAI_NAME plist.CheckList = checkList contractPermissionList = append(contractPermissionList, plist) // CRM8.8-权限主客观合并 newPermissionLookList := contractService.HandleEquityContractPermissionList(contractPermissionList) for _, v := range newPermissionLookList { for _, v2 := range v.Items { fmt.Println(v2.PermissionName) } } resp.Money = contractItem.Money / 10000 resp.TotalPointsContent = fmt.Sprint(resp.Money, "W") br.Ret = 200 br.Success = true br.Msg = "获取成功" br.Data = resp }