package base import ( "context" "fmt" "github.com/gogf/gf/frame/g" "github.com/gogf/gf/os/gtime" "github.com/gogf/gf/util/gconv" "strconv" "dashoo.cn/micro/app/dao/base" model "dashoo.cn/micro/app/model/base" "dashoo.cn/micro/app/service" ) type salesRegionService struct { *service.ContextService Dao *base.BaseSalesRegionDao Detail *base.BaseSalesRegionDetailDao } func NewSalesRegionService(ctx context.Context) (svc *salesRegionService, err error) { svc = new(salesRegionService) if svc.ContextService, err = svc.Init(ctx); err != nil { return nil, err } svc.Dao = base.NewBaseSalesRegionDao(svc.Tenant) svc.Detail = base.NewBaseSalesRegionDetailDao(svc.Tenant) return svc, nil } // Create 创建区域 func (s *salesRegionService) Create(req *model.AddRegionReq) (err error) { regionData := new(model.BaseSalesRegion) if err = gconv.Struct(req, regionData); err != nil { return } service.SetCreatedInfo(regionData, s.GetCxtUserId(), s.GetCxtUserName()) regionData.RegionCode = strconv.Itoa(int(gtime.Timestamp())) _, err = s.Dao.Insert(regionData) if err != nil { g.Log().Error(err) return } return nil } // GetRegionList 获取区域 func (s *salesRegionService) GetRegionList() (RegionList []*model.Region, err error) { err = s.Dao.Order("id asc").Scan(&RegionList) if err != nil { g.Log().Error(err) return } return } // GetRegionTree 获取大区及下属地区 func (s *salesRegionService) GetRegionTree(req *model.RegionTreeReq) (regionList []*model.Region, err error) { where1 := "" where2 := "" if req.IsPermission == "1" { // 系统管理员、总经理、销售总监、销售助理看到所有区域 if service.StringsContains(s.CxtUser.Roles, "GeneralManager") || service.StringsContains(s.CxtUser.Roles, "SalesDirector") || service.StringsContains(s.CxtUser.Roles, "SaleAssociate") || service.StringsContains(s.CxtUser.Roles, "SysAdmin") { // 无条件,查询全部 } else { // 大区经理:看到大区及所负责的其他区域;销售工程师:看到所负责的区域 if data, ok := s.CxtUser.DataScope["cust_city_id"]; ok { if data != nil { idArr := data.([]interface{}) ids := "-1" for _, id := range idArr { ids += "," + gconv.String(id) } where2 = fmt.Sprintf("cust_city_id IN (%v)", ids) } } } } detailDao := base.NewBaseSalesRegionDetailDao(s.Tenant) regionDetailsList := ([]*model.District)(nil) err = detailDao.Where(where2).Fields("region_id, cust_province_id as regionCode, cust_province as regionDesc").Group("cust_province_id"). OrderAsc(detailDao.C.RegionId).Scan(®ionDetailsList) if err != nil { return } regionMap := make(map[int]int, 0) regionIds := "-1" for _, detail := range regionDetailsList { if _, ok := regionMap[detail.RegionId]; !ok { regionMap[detail.RegionId] = 1 regionIds += "," + gconv.String(detail.RegionId) } } where1 += fmt.Sprintf("id IN (%v)", regionIds) err = s.Dao.Order("created_time asc").Where(where1).Scan(®ionList) if err != nil { return } for _, item := range regionList { item.Children = make([]*model.District, 0) for _, v := range regionDetailsList { if item.Id == v.RegionId { item.Children = append(item.Children, v) } } } return }