package yb import ( "encoding/json" "fmt" "github.com/rdlucklib/rdluck_tools/paging" "github.com/tealeg/xlsx" "hongze/hz_crm_api/controllers" "hongze/hz_crm_api/models" "hongze/hz_crm_api/models/company" "hongze/hz_crm_api/models/system" "hongze/hz_crm_api/models/yb" "hongze/hz_crm_api/models/yb/request" ybResp "hongze/hz_crm_api/models/yb/response" "hongze/hz_crm_api/services" ybService "hongze/hz_crm_api/services/yb" "hongze/hz_crm_api/utils" "os" "path/filepath" "strconv" "strings" "sync" "time" ) type ApplyRecordController struct { controllers.BaseAuthController } // List // @Title 获取申请列表 // @Description 获取申请列表 // @Param Keyword query string false "搜索关键字 string" // @Param State query string false "用户状态 string 潜在用户/权益用户/冻结/流失" // @Success 200 {object} []yb.ApplyRecordListResp // @router /apply_record/list [get] func (this *ApplyRecordController) List() { 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") var startSize int if pageSize <= 0 { pageSize = utils.PageSize20 } if currentIndex <= 0 { currentIndex = 1 } startSize = paging.StartIndex(currentIndex, pageSize) condition := "" pars := make([]interface{}, 0) // 数据权限 condition, pars = getDataAuthWhere(condition, pars, this.SysUser) reqState := this.GetString("State", "") if reqState != "" { condition += " AND a.status = ?" pars = append(pars, reqState) } reqKeyword := this.GetString("Keyword") if reqKeyword != "" { reqKeyword = "%" + reqKeyword + "%" condition += " AND (a.real_name LIKE ? OR a.mobile LIKE ? OR a.email LIKE ?)" pars = append(pars, reqKeyword, reqKeyword, reqKeyword) } // 获取列表 total, list, err := yb.GetApplyRecordList(condition, pars, startSize, pageSize) if err != nil { br.Msg = "获取申请列表失败!" br.ErrMsg = "获取申请列表失败,Err:" + err.Error() return } page := paging.GetPaging(currentIndex, pageSize, total) resp := ybResp.ApplyRecordListResp{ List: list, Paging: page, } br.Ret = 200 br.Success = true br.Msg = "获取成功" br.Data = resp } // getDataAuth 过滤数据权限 func getDataAuthWhere(condition string, pars []interface{}, sysUser *system.Admin) (newCondition string, newPars []interface{}) { roleCode := sysUser.RoleTypeCode // 超管账户不做限制 if roleCode == utils.ROLE_TYPE_CODE_ADMIN { return } // 是否为FICC角色 allowRole := []string{ utils.ROLE_TYPE_CODE_FICC_ADMIN, utils.ROLE_TYPE_CODE_FICC_SELLER, utils.ROLE_TYPE_CODE_FICC_GROUP, utils.ROLE_TYPE_CODE_FICC_DEPARTMENT, utils.ROLE_TYPE_CODE_FICC_RESEARCHR, utils.ROLE_TYPE_CODE_RESEARCHR, } isAllow := false for _, role := range allowRole { if roleCode == role { isAllow = true } } if isAllow { // 销售ID为当前用户且客户状态为冻结 condition += " AND b.seller_id = ?" pars = append(pars, sysUser.AdminId) condition += " AND b.status = ?" pars = append(pars, "冻结") } else { condition += " AND 1=2" } newCondition = condition newPars = pars return } func getDataAuthWhereV2(condition string, pars []interface{}, sysUser *system.Admin) (newCondition string, newPars []interface{}, err error) { roleCode := sysUser.RoleTypeCode // 超管账户不做限制 if roleCode == utils.ROLE_TYPE_CODE_ADMIN || roleCode == utils.ROLE_TYPE_CODE_FICC_ADMIN { return } // 是否为FICC角色 allowRole := []string{ utils.ROLE_TYPE_CODE_FICC_ADMIN, utils.ROLE_TYPE_CODE_FICC_SELLER, utils.ROLE_TYPE_CODE_FICC_GROUP, utils.ROLE_TYPE_CODE_FICC_TEAM, utils.ROLE_TYPE_CODE_FICC_DEPARTMENT, utils.ROLE_TYPE_CODE_FICC_RESEARCHR, utils.ROLE_TYPE_CODE_RESEARCHR, } isAllow := false for _, role := range allowRole { if roleCode == role { isAllow = true } } if isAllow { // 超管和ficc 管理员,才允许看潜在用户和流失用户, condition += ` and y.status != "潜在用户" and y.status is not null and y.status != "权益用户" and y.status != "流失"` // 如果是ficc销售主管,查询对应的小组 if roleCode == utils.ROLE_TYPE_CODE_FICC_GROUP && sysUser.GroupId > 0 { subAdmins, tErr := system.GetSysUserByParentIdGroupId(sysUser.GroupId) if tErr != nil && tErr.Error() != utils.ErrNoRow() { err = tErr return } var sellerIdsStr string for _, v := range subAdmins { // 只能看比主管权限低的角色 if v.RoleTypeCode == utils.ROLE_TYPE_CODE_FICC_SELLER || v.RoleTypeCode == utils.ROLE_TYPE_CODE_FICC_TEAM || v.RoleTypeCode == utils.ROLE_TYPE_CODE_FICC_RESEARCHR || v.RoleTypeCode == utils.ROLE_TYPE_CODE_RESEARCHR { sellerIdsStr += strconv.Itoa(v.AdminId) + "," } } if sellerIdsStr != "" { sellerIdsStr += strconv.Itoa(sysUser.AdminId) // 销售ID为当前用户且客户状态为冻结 condition += " AND bp.seller_id in (" + sellerIdsStr + ")" } else { condition += " AND bp.seller_id = ?" pars = append(pars, sysUser.AdminId) } } else if roleCode == utils.ROLE_TYPE_CODE_FICC_TEAM && sysUser.GroupId > 0 { // 如果是ficc 销售组长 subAdmins, tErr := system.GetAdminByGroupId(sysUser.GroupId) if tErr != nil && tErr.Error() != utils.ErrNoRow() { err = tErr return } var sellerIdsStr string for _, v := range subAdmins { // 只能看比主管权限低的角色 if v.RoleTypeCode == utils.ROLE_TYPE_CODE_FICC_SELLER || v.RoleTypeCode == utils.ROLE_TYPE_CODE_FICC_RESEARCHR || v.RoleTypeCode == utils.ROLE_TYPE_CODE_RESEARCHR { sellerIdsStr += strconv.Itoa(v.AdminId) + "," } } if sellerIdsStr != "" { sellerIdsStr += strconv.Itoa(sysUser.AdminId) // 销售ID为当前用户且客户状态为冻结 condition += " AND bp.seller_id in (" + sellerIdsStr + ")" } else { condition += " AND bp.seller_id = ?" pars = append(pars, sysUser.AdminId) } } else { // 如果是ficc 销售 condition += " AND bp.seller_id = ?" pars = append(pars, sysUser.AdminId) } } else { condition += " AND 1=2" } newCondition = condition newPars = pars return } // MarkHandle // @Title 处理申请记录 // @Description 处理申请记录 // @Param request body request.ApplyMarkReq true "type json string" // @Success 200 {object} 标记处理成功 // @router /apply_record/mark_handle [post] func (this *ApplyRecordController) MarkHandle() { 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 } var req request.ApplyMarkReq err := json.Unmarshal(this.Ctx.Input.RequestBody, &req) if err != nil { br.Msg = "参数解析异常" br.ErrMsg = "参数解析失败,Err:" + err.Error() return } if req.ApplyRecordId <= 0 && req.UserId <= 0 { br.Msg = "申请记录ID或者用户ID异常" br.ErrMsg = "申请记录ID或者用户ID异常" return } // 标记处理 err = ybService.MarkApplyRecord(req.ApplyRecordId, this.SysUser.AdminId, req.UserId) if err != nil { br.Msg = "标记处理失败! " br.ErrMsg = "标记处理失败,Err:" + err.Error() return } br.Ret = 200 br.Success = true br.Msg = "标记处理成功" } // ListV2 // @Title 获取用户申请列表 // @Description 获取用户申请列表 // @Param KeyWord query string false "搜索关键字 string" // @Param States query string false "用户状态 string 潜在用户/权益用户/冻结/流失" // @Success 200 {object} []yb.ApplyRecordListRespV2 // @router /apply_record/listV2 [get] func (this *ApplyRecordController) UserApplyList() { 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") markGroup := this.GetString("MarkGroup") startDate := this.GetString("StartDate") endDate := this.GetString("EndDate") var startSize int if pageSize <= 0 { pageSize = utils.PageSize20 } if currentIndex <= 0 { currentIndex = 1 } startSize = paging.StartIndex(currentIndex, pageSize) condition := "" pars := make([]interface{}, 0) // 数据权限 condition, pars, err := getDataAuthWhereV2(condition, pars, this.SysUser) if err != nil { br.Msg = "权限查询出错" br.ErrMsg = "权限查询出错:" + err.Error() return } reqState := this.GetString("States", "") if reqState != "" { statusSlice := strings.Split(reqState, ",") conditionSub := "" if len(statusSlice) == 0 { br.Msg = "入参:状态格式出错" return } for _, v := range statusSlice { if v == "潜在用户" { conditionSub += ` or y.status = "潜在用户" or y.status is null or y.status = "权益用户"` } else { conditionSub += ` or y.status = "` + v + `"` } } conditionSubByte := []byte(conditionSub) conditionSub = string(conditionSubByte[4:]) condition += ` AND (` + conditionSub + `)` } reqKeyword := this.GetString("KeyWord") if reqKeyword != "" { reqKeyword = "%" + reqKeyword + "%" condition += " AND (a.real_name LIKE ? OR a.mobile LIKE ? OR a.email LIKE ? OR (a.company_id > 1 AND b.company_name LIKE ?) OR (a.company_id = 1 AND a.note LIKE ?))" pars = append(pars, reqKeyword, reqKeyword, reqKeyword, reqKeyword, reqKeyword) } if markGroup != "" { condition += `AND (y.mark_group = `+"'"+markGroup+"'"+ ` OR a.mark_group = `+"'"+markGroup+"')" } if startDate != "" { startDate += " 00:00:00" condition += ` AND IF(y.apply_record_id > 0,y.create_time, a.created_time) >= '` + startDate + `' ` } if endDate != "" { endDate += " 23:59:59" condition += ` AND IF(y.apply_record_id > 0,y.create_time, a.created_time) <= '` + endDate + `' ` } reqApplyStatus := this.GetString("ApplyStatus") if reqApplyStatus != "" { if reqApplyStatus == "已申请" { condition += " AND y.apply_record_id > 0" } else if reqApplyStatus == "未申请" { condition += " AND ISNULL(y.apply_record_id) = 1" } } // 获取列表 w := sync.WaitGroup{} var list []*yb.ApplyListV2 var total int startTime := "2022-01-01" w.Add(1) go func() { defer w.Done() list, err = yb.GetApplyRecordListV2(condition, pars, startTime, startSize, pageSize) }() if err != nil { br.Msg = "获取申请列表失败!" br.ErrMsg = "获取申请列表失败,Err:" + err.Error() return } w.Add(1) go func() { defer w.Done() total, err = yb.GetApplyRecordTotal(condition, pars, startTime) }() w.Wait() if err != nil { br.Msg = "获取申请列表总数失败!" br.ErrMsg = "获取申请列表总数失败,Err:" + err.Error() return } mobilesSlice := make([]string, 0) emailsSlice := make([]string, 0) userIdsStr := "" for _, v := range list { userIdsStr += "," + strconv.Itoa(v.UserId) if v.Mobile != "" { mobilesSlice = append(mobilesSlice, v.Mobile) } else if v.Email != "" { emailsSlice = append(emailsSlice, v.Email) } } //统计申请数 userApplyTotalMap := make(map[int]int) if userIdsStr != "" { userIdsStr = strings.Trim(userIdsStr, ",") userApplyTotal, tErr := yb.GetTotalByUserIds(userIdsStr) if tErr != nil { br.Msg = "获取申请数失败!" br.ErrMsg = "获取申请数失败,Err:" + tErr.Error() return } for _, v := range userApplyTotal { userApplyTotalMap[v.UserId] = v.Total } } w2 := sync.WaitGroup{} mobileTotalMap := make(map[string]int) lastTimeMobileMap := make(map[string]time.Time) w2.Add(1) //统计阅读数 go func() { defer w2.Done() mobileTotalMap, lastTimeMobileMap = ybService.GetUserViewTotalByMobiles(mobilesSlice) }() emailTotalMap := make(map[string]int) lastTimeEmailMap := make(map[string]time.Time) w2.Add(1) go func() { defer w2.Done() emailTotalMap, lastTimeEmailMap = ybService.GetUserViewTotalByEmails(emailsSlice) }() w2.Wait() for k, v := range list { if v.OpStatus == 1 && v.MarkGroup == "" { list[k].OpStatus = 0 } sourceStr := "" if v.ApplyRecordId > 0 { if v.SourceAgent == 3 { sourceStr = "弘则研究" } else if v.SourceAgent == 1 { switch v.Source { case 1: sourceStr = "我的(小程序)" case 2: sourceStr = "活动(小程序)" case 3: sourceStr = "图库(小程序)" case 4: sourceStr = "研报(小程序)" case 5: sourceStr = "问答社区(小程序)" default: if v.FromPage != "" { sourceStr = v.FromPage + "(小程序)" } else { sourceStr = "研报(小程序)" } } } else if v.SourceAgent == 2 || v.SourceAgent == 4 { switch v.Source { case 1: sourceStr = "我的(PC端)" case 2: sourceStr = "活动(PC端)" case 3: sourceStr = "图库(PC端)" case 4: sourceStr = "研报(PC端)" case 5: sourceStr = "问答社区(PC端)" default: if v.FromPage != "" { sourceStr = v.FromPage + "(PC端)" } else { sourceStr = "研报(PC端)" } } } } else if v.RegisterSource != 0 { switch v.RegisterSource { case 1: sourceStr = "弘则研究" case 2: sourceStr = "研报(PC端)" case 5: sourceStr = "活动(小程序)" case 6: sourceStr = "研报(小程序)" default: sourceStr = "" } } list[k].SourceStr = sourceStr // 统计申请数 if applyTotal, ok := userApplyTotalMap[v.UserId]; ok { list[k].ApplyTotal = applyTotal } //统计阅读数 if num, ok := mobileTotalMap[v.Mobile]; ok { list[k].ViewTotal += num } if num, ok := emailTotalMap[v.Email]; ok { list[k].ViewTotal += num } //最新阅读时间 if t, ok := lastTimeMobileMap[v.Mobile]; ok { if list[k].LastViewTime.Before(t) { list[k].LastViewTime = t } } if t, ok := lastTimeEmailMap[v.Email]; ok { if list[k].LastViewTime.Before(t) { list[k].LastViewTime = t } } list[k].LastViewTimeStr = list[k].LastViewTime.Format(utils.FormatDateTime) if list[k].LastViewTimeStr == "0001-01-01 00:00:00" { list[k].LastViewTimeStr = "" } list[k].LastTimeStr = list[k].LastTime.Format(utils.FormatDateTime) if v.Status == "权益用户" { list[k].Status = "潜在用户" } //查询是否展示潜在用户删除按钮权限 if v.CompanyId == 1 && list[k].Status == "潜在用户" { list[k].DelBtn = true } } page := paging.GetPaging(currentIndex, pageSize, total) resp := ybResp.ApplyRecordListV2Resp{ List: list, Paging: page, } br.Ret = 200 br.Success = true br.Msg = "获取成功" br.Data = resp } // ApplyExport // @Title 导出用户申请列表 // @Description 导出用户申请列表 // @Param KeyWord query string false "搜索关键字 string" // @Param State query string false "用户状态 string 潜在用户/权益用户/冻结/流失" // @Success Ret=200 导出成功 // @router /apply_record/listV2/export [get] func (this *ApplyRecordController) ApplyExport() { br := new(models.BaseResponse).Init() defer func() { this.Data["json"] = br this.ServeJSON() }() reqKeyword := this.GetString("KeyWord") reqState := this.GetString("States") markGroup := this.GetString("MarkGroup") sysUser := this.SysUser if sysUser == nil { br.Msg = "请登录" br.ErrMsg = "请登录,SysUser Is Empty" br.Ret = 408 return } //管理员才让导出数据 if sysUser.RoleTypeCode != utils.ROLE_TYPE_CODE_ADMIN && sysUser.RoleTypeCode != utils.ROLE_TYPE_CODE_FICC_ADMIN { br.Msg = "没有权限" br.ErrMsg = "没有权限" return } var condition string var pars []interface{} if reqState != "" { statusSlice := strings.Split(reqState, ",") conditionSub := "" if len(statusSlice) == 0 { br.Msg = "入参:状态格式出错" return } for _, v := range statusSlice { if v == "潜在用户" { conditionSub += ` or y.status = "潜在用户" or y.status is null or y.status = "权益用户"` } else { conditionSub += ` or y.status = "` + v + `"` } } conditionSubByte := []byte(conditionSub) conditionSub = string(conditionSubByte[4:]) condition += ` AND (` + conditionSub + `)` } if reqKeyword != "" { reqKeyword = "%" + reqKeyword + "%" condition += " AND (a.real_name LIKE ? OR a.mobile LIKE ? OR a.email LIKE ? OR (a.company_id > 1 AND b.company_name LIKE ?) OR (a.company_id = 1 AND a.note LIKE ?))" pars = append(pars, reqKeyword, reqKeyword, reqKeyword, reqKeyword, reqKeyword) } reqApplyStatus := this.GetString("ApplyStatus") if reqApplyStatus != "" { if reqApplyStatus == "已申请" { condition += " AND y.apply_record_id > 0" } else if reqApplyStatus == "未申请" { condition += " AND y.apply_record_id is null" } } if markGroup != "" { condition += `AND (y.mark_group = `+"'"+markGroup+"'"+ ` OR a.mark_group = `+"'"+markGroup+"')" } startTime := "2022-01-01" list, err := yb.GetApplyRecordListV2Export(condition, pars, startTime) if err != nil { br.Msg = "获取失败" br.ErrMsg = "获取失败,Err:" + err.Error() return } mobilesSlice := make([]string, 0) emailsSlice := make([]string, 0) userIdsStr := "" for _, v := range list { userIdsStr += "," + strconv.Itoa(v.UserId) if v.Mobile != "" { mobilesSlice = append(mobilesSlice, v.Mobile) } else if v.Email != "" { emailsSlice = append(emailsSlice, v.Email) } } userIdsStr = strings.Trim(userIdsStr, ",") //统计申请数 userApplyTotalMap := make(map[int]int) if userIdsStr != "" { userApplyTotal, err := yb.GetTotalByUserIds(userIdsStr) if err != nil { br.Msg = "获取申请数失败!" br.ErrMsg = "获取申请数失败,Err:" + err.Error() return } for _, v := range userApplyTotal { userApplyTotalMap[v.UserId] = v.Total } } w := sync.WaitGroup{} mobileTotalMap := make(map[string]int) lastTimeMobileMap := make(map[string]time.Time) w.Add(1) //统计阅读数 go func() { defer w.Done() mobileTotalMap, lastTimeMobileMap = ybService.GetUserViewTotalByMobiles(mobilesSlice) }() emailTotalMap := make(map[string]int) lastTimeEmailMap := make(map[string]time.Time) w.Add(1) go func() { defer w.Done() emailTotalMap, lastTimeEmailMap = ybService.GetUserViewTotalByEmails(emailsSlice) }() w.Wait() for k, v := range list { sourceStr := "" if v.ApplyRecordId > 0 { if v.SourceAgent == 3 { sourceStr = "弘则研究" } else if v.SourceAgent == 1 { switch v.Source { case 1: sourceStr = "我的(小程序)" case 2: sourceStr = "活动(小程序)" case 3: sourceStr = "图库(小程序)" case 4: sourceStr = "研报(小程序)" case 5: sourceStr = "问答社区(小程序)" default: if v.FromPage != "" { sourceStr = v.FromPage + "(小程序)" } else { sourceStr = "研报(小程序)" } } } else if v.SourceAgent == 2 { switch v.Source { case 1: sourceStr = "我的(PC端)" case 2: sourceStr = "活动(PC端)" case 3: sourceStr = "图库(PC端)" case 4: sourceStr = "研报(PC端)" case 5: sourceStr = "问答社区(PC端)" default: if v.FromPage != "" { sourceStr = v.FromPage + "(PC端)" } else { sourceStr = "研报(PC端)" } } } } else if v.RegisterSource != 0 { switch v.RegisterSource { case 1: sourceStr = "弘则研究" case 2: sourceStr = "研报(PC端)" case 5: sourceStr = "活动(小程序)" case 6: sourceStr = "研报(小程序)" default: sourceStr = "" } } list[k].SourceStr = sourceStr // 统计申请数 if applyTotal, ok := userApplyTotalMap[v.UserId]; ok { list[k].ApplyTotal = applyTotal } //统计阅读数 if num, ok := mobileTotalMap[v.Mobile]; ok { list[k].ViewTotal += num } if num, ok := emailTotalMap[v.Email]; ok { list[k].ViewTotal += num } //最新阅读时间 if t, ok := lastTimeMobileMap[v.Mobile]; ok { if list[k].LastViewTime.Before(t) { list[k].LastViewTime = t } } if t, ok := lastTimeEmailMap[v.Email]; ok { if list[k].LastViewTime.Before(t) { list[k].LastViewTime = t } } list[k].LastViewTimeStr = list[k].LastViewTime.Format(utils.FormatDateTime) if list[k].LastViewTimeStr == "0001-01-01 00:00:00" { list[k].LastViewTimeStr = "" } list[k].LastTimeStr = list[k].LastTime.Format(utils.FormatDateTime) if v.Status == "权益用户" { list[k].Status = "潜在用户" } } 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 } titleRow := sheel.AddRow() titleRow.AddCell().SetValue("姓名") titleRow.AddCell().SetValue("手机号") titleRow.AddCell().SetValue("邮箱") titleRow.AddCell().SetValue("最新提交时间") titleRow.AddCell().SetValue("累计提交次数") titleRow.AddCell().SetValue("最近一次阅读时间") titleRow.AddCell().SetValue("累计阅读次数") titleRow.AddCell().SetValue("公司") titleRow.AddCell().SetValue("原销售") titleRow.AddCell().SetValue("来源") titleRow.AddCell().SetValue("申请类型") titleRow.AddCell().SetValue("用户状态") for _, v := range list { dataRow := sheel.AddRow() dataRow.SetHeight(20) dataRow.AddCell().SetString(v.RealName) dataRow.AddCell().SetString(v.Mobile) dataRow.AddCell().SetString(v.Email) dataRow.AddCell().SetString(v.LastTimeStr) dataRow.AddCell().SetString(strconv.Itoa(v.ApplyTotal)) dataRow.AddCell().SetString(v.LastViewTimeStr) dataRow.AddCell().SetString(strconv.Itoa(v.ViewTotal)) dataRow.AddCell().SetString(v.CompanyName) dataRow.AddCell().SetString(v.OriginSellerName) dataRow.AddCell().SetString(v.SourceStr) dataRow.AddCell().SetString(v.ApplyStatus) dataRow.AddCell().SetString(v.Status) } err = xlsxFile.Save(downLoadnFilePath) if err != nil { br.Msg = "保存文件失败" br.ErrMsg = "保存文件失败" return } randStr := time.Now().Format(utils.FormatDateTimeUnSpace) downloadFileName := "用户申请列表_" + randStr + ".xlsx" this.Ctx.Output.Download(downLoadnFilePath, downloadFileName) defer func() { _ = os.Remove(downLoadnFilePath) }() br.Ret = 200 br.Success = true br.Msg = "导出成功" } // DelPotentialUser // @Title 删除潜在用户账号和申请记录 // @Description 删除潜在用户账号和申请记录 // @Param request body company.DeleteUserReq true "type json string" // @Success 200 {object} 删除成功 // @router /potential/user/del [post] func (this *ApplyRecordController) DelPotentialUser() { 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 } var req company.DeleteUserReq err := json.Unmarshal(this.Ctx.Input.RequestBody, &req) if err != nil { br.Msg = "参数解析异常!" br.ErrMsg = "参数解析失败,Err:" + err.Error() return } if req.UserId <= 0 { br.Msg = "请输入正确的用户ID" return } //获取联系人详情 userInfo, err := models.GetWxUserByUserId(req.UserId) if err != nil { br.Msg = "获取联系人异常!" br.ErrMsg = "获取联系人异常,Err:" + err.Error() return } if userInfo.CompanyId != 1 { br.Msg = "该联系人已绑定客户,不允许删除!" return } //操作权限校验, 超管和ficc管理员有删除权限 if sysUser.RoleTypeCode != utils.ROLE_TYPE_CODE_FICC_ADMIN && sysUser.RoleTypeCode != utils.ROLE_TYPE_CODE_ADMIN { br.Msg = "没有操作权限" return } //如果不是超管权限,那么删除的时候,需要获取下联系人归属销售信息 //产品权限 productId := services.GetProductId(sysUser.RoleTypeCode) //联系人与销售的关系 userSellerRelationList, err := models.GetUserSellerRelationList(int(userInfo.UserId)) if err != nil { br.Msg = "获取联系人关系失败" br.ErrMsg = "获取联系人关系失败,Err:" + err.Error() return } userSellerRelationInfo, _ := json.Marshal(userSellerRelationList) //删除所有的标识,并真正删除数据 _ = models.DeleteUserSellerRelationByUserId(req.UserId) //真正删除用户 err = services.DeleteWxUser(req.UserId) if err != nil { br.Msg = "删除失败!" br.ErrMsg = "删除失败,Err:" + err.Error() return } if len(userSellerRelationList) > 0 && productId != 0 { content := fmt.Sprint("联系人:", userInfo.RealName, "被删除") if userSellerRelationList[0].CompanyId != 1 { companyInfo, tErr := company.GetCompanyById(userSellerRelationList[0].CompanyId) if tErr != nil { if tErr.Error() != utils.ErrNoRow() { br.Msg = "获取客户信息失败" br.ErrMsg = "获取客户信息失败,Err:" + tErr.Error() return } } else { content = fmt.Sprint(companyInfo.CompanyName, ":", content) for _, userRelation := range userSellerRelationList { if userRelation.ProductId != productId { go services.AddCompanyMessage(sysUser.AdminId, userRelation.SellerId, userRelation.CompanyId, 0, 1, companyInfo.CompanyName, content, content) } } } } } //联系人信息 originalUserInfo, _ := json.Marshal(userInfo) go services.AddWxUserOpLog(company.WxUserOpLog{ LogType: "delete", UserId: int(userInfo.UserId), CompanyId: userInfo.CompanyId, Mobile: userInfo.Mobile, Email: userInfo.Email, OriginalUserInfo: string(originalUserInfo), UserInfo: "", OriginalUserSellerInfo: string(userSellerRelationInfo), UserSellerInfo: "", OpUserId: sysUser.AdminId, OpUserName: sysUser.RealName, CreateTime: time.Now(), }) // 若该联系人为弘则研究公司下的,则同步禁用手机号关联的系统管理员 if userInfo.CompanyId == 16 { go services.ForbiddenSysUserByMobile(userInfo.Mobile) } // 删除用户的申请记录 go ybService.DeleteApplyUser(userInfo.UserId) br.Ret = 200 br.Success = true br.Msg = "删除成功" br.IsAddLog = true return } // MarkGroup // @Title 标记分组 // @Description 标记分组 // @Param request body request.ApplyMarkReq true "type json string" // @Success 200 {object} 标记处理成功 // @router /apply_record/mark_group [post] func (this *ApplyRecordController) MarkGroup() { 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 } var req request.ApplyMarkGroupReq err := json.Unmarshal(this.Ctx.Input.RequestBody, &req) if err != nil { br.Msg = "参数解析异常" br.ErrMsg = "参数解析失败,Err:" + err.Error() return } if req.GroupName == "" || req.UserId == 0 { br.Msg = "申请记录ID或者分组名异常" br.ErrMsg = "申请记录ID或者分组名异常" return } // 标记处理 err = ybService.MarkGroupApplyRecord(req.ApplyRecordId, this.SysUser.AdminId, req.UserId, req.GroupName) if err != nil { br.Msg = "标记处理失败! " br.ErrMsg = "标记处理失败,Err:" + err.Error() return } br.Ret = 200 br.Success = true br.Msg = "标记处理成功" }