123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563 |
- package service
- import (
- "context"
- "sort"
- "strconv"
- "strings"
- "go-common/app/admin/main/manager/model"
- "go-common/library/ecode"
- "go-common/library/log"
- )
- // AddBusiness .
- func (s *Service) AddBusiness(c context.Context, b *model.Business) (err error) {
- if err = s.dao.AddBusiness(c, b); err != nil {
- log.Error("s.dao.AddBusiness error(%v)", err)
- }
- return
- }
- // UpdateBusiness .
- func (s *Service) UpdateBusiness(c context.Context, b *model.Business) (err error) {
- flowState := []int64{}
- binStr := strconv.FormatInt(b.Flow, 2)
- for k, v := range []byte(binStr) {
- if string(v) == "1" {
- flowState = append(flowState, int64(len(binStr)-k))
- }
- }
- if err = s.dao.BatchUpdateChildState(c, b.ID, flowState); err != nil {
- log.Error("s.dao.BatchUpdateChildState error(%v)", err)
- return
- }
- if err = s.dao.UpdateBusiness(c, b); err != nil {
- log.Error("s.dao.UpdateBusiness error(%v)", err)
- }
- return
- }
- // AddRole .
- func (s *Service) AddRole(c context.Context, br *model.BusinessRole) (err error) {
- var (
- maxRid interface{}
- maxRidInt int64
- )
- if maxRid, err = s.dao.MaxRidByBid(c, br.BID); err != nil {
- return
- }
- if maxRid != nil {
- maxRidInt = maxRid.(int64)
- }
- maxRidInt++
- br.RID = maxRidInt
- if err = s.dao.AddRole(c, br); err != nil {
- log.Error("s.dao.AddRole error(%v)", err)
- }
- return
- }
- // UpdateRole .
- func (s *Service) UpdateRole(c context.Context, br *model.BusinessRole) (err error) {
- if err = s.dao.UpdateRole(c, br); err != nil {
- log.Error("s.dao.UpdateRole error(%v)", err)
- }
- return
- }
- // AddUser .
- func (s *Service) AddUser(c context.Context, bur *model.BusinessUserRole) (err error) {
- for _, uid := range bur.UIDs {
- if _, ok := s.userNames[uid]; !ok {
- err = ecode.ManagerUIDNOTExist
- return
- }
- }
- if err = s.dao.AddUser(c, bur); err != nil {
- log.Error("s.dao.AddUser error(%v)", err)
- }
- return
- }
- // UpdateUser .
- func (s *Service) UpdateUser(c context.Context, bur *model.BusinessUserRole) (err error) {
- if err = s.dao.UpdateUser(c, bur); err != nil {
- log.Error("s.dao.Update error(%v)", err)
- }
- return
- }
- // UpdateState .
- func (s *Service) UpdateState(c context.Context, su *model.StateUpdate) (err error) {
- var (
- childInfo *model.BusinessList
- parentInfo *model.BusinessList
- )
- if su.Type == model.BusinessOpenType { // business
- if su.State == model.BusinessOpenState {
- if childInfo, err = s.dao.BusinessByID(c, su.ID); err != nil {
- log.Error("s.dao.BusinessByID param id (%d) error(%v)", su.ID, err)
- return
- }
- if childInfo.PID != 0 {
- if parentInfo, err = s.dao.BusinessByID(c, childInfo.PID); err != nil {
- log.Error("s.dao.BusinessByID param id (%d) error(%v)", childInfo, err)
- return
- }
- flowState := map[int64]int64{}
- binStr := strconv.FormatInt(parentInfo.Flow, 2)
- for k, v := range []byte(binStr) {
- if string(v) == "1" {
- flowState[int64(len(binStr)-k)] = int64(len(binStr) - k)
- }
- }
- if _, ok := flowState[childInfo.FlowState]; !ok {
- err = ecode.ManagerFlowForbidden
- return
- }
- }
- }
- if err = s.dao.UpdateBusinessState(c, su); err != nil {
- log.Error("s.dao.UpdateBusinessState error(%v)", err)
- }
- return
- }
- // role
- if err = s.dao.UpdateBusinessRoleState(c, su); err != nil {
- log.Error("s.dao.UpdateBusinessRoleState error(%v)", err)
- }
- return
- }
- // BusinessList .
- func (s *Service) BusinessList(c context.Context, bp *model.BusinessListParams) (res []*model.BusinessList, err error) {
- var (
- pids []int64
- sKeys []int
- cKeys []int
- pidChildRes map[int64][]*model.BusinessList
- fKeys = make(map[int64][]int)
- pidsMap = make(map[int64]int64)
- tempRes = make(map[int64]*model.BusinessList)
- childRes = make(map[int64]*model.BusinessList)
- )
- flowBusinessMap := make(map[int64]map[int64][]*model.BusinessList)
- if tempRes, err = s.dao.ParentBusiness(c, bp.State); err != nil {
- log.Error("s.dao.ParentBusiness error(%v)", err)
- return
- }
- if len(tempRes) <= 0 {
- res = []*model.BusinessList{}
- return
- }
- if childRes, err = s.dao.ChildBusiness(c, bp); err != nil {
- log.Error("s.dao.ChildBusiness error(%v)", err)
- return
- }
- for _, cr := range childRes {
- cKeys = append(cKeys, int(cr.ID))
- }
- // auth verify
- if bp.Auth > 0 {
- up := &model.UserListParams{
- UID: bp.UID,
- Role: model.UserRoleDefaultVal,
- }
- var userBusiness []*model.BusinessUserRoleList
- if userBusiness, err = s.dao.UserList(c, up); err != nil {
- log.Error("s.dao.UserList error(%v)", err)
- return
- }
- if len(userBusiness) <= 0 {
- res = []*model.BusinessList{}
- return
- }
- bidsMap := make(map[int64]struct{})
- for _, u := range userBusiness {
- bidsMap[u.BID] = struct{}{}
- }
- cKeys = []int{}
- for _, cr := range childRes {
- if _, ok := bidsMap[cr.BID]; ok {
- cKeys = append(cKeys, int(cr.ID))
- }
- }
- }
- sort.Ints(cKeys)
- for _, c := range cKeys {
- cidR := childRes[int64(c)]
- if _, ok := pidsMap[cidR.PID]; !ok {
- pidsMap[cidR.PID] = cidR.PID
- pids = append(pids, cidR.PID)
- }
- cidR.FlowChild = []*model.FlowBusiness{}
- if _, ok := flowBusinessMap[cidR.PID]; !ok {
- flowBusinessMap[cidR.PID] = make(map[int64][]*model.BusinessList)
- }
- fKeys[cidR.PID] = append(fKeys[cidR.PID], int(cidR.FlowState))
- flowBusinessMap[cidR.PID][cidR.FlowState] = append(flowBusinessMap[cidR.PID][cidR.FlowState], cidR)
- }
- if bp.Check != 0 {
- if pidChildRes, err = s.dao.ChildBusinessByPIDs(c, pids); err != nil {
- log.Error("s.dao.ChildBusinessByPIDs error(%v)", err)
- return
- }
- }
- for k, r := range tempRes {
- r.FlowChild = []*model.FlowBusiness{}
- if _, ok := pidChildRes[k]; !ok && bp.Check != 0 {
- delete(tempRes, k)
- continue
- }
- if _, ok := flowBusinessMap[k]; !ok && bp.Check != 0 {
- continue
- }
- flowsMap := make(map[int]int)
- flowsSlice := []int{}
- if flows, ok := fKeys[r.ID]; ok {
- for _, f := range flows {
- if _, ok := flowsMap[f]; ok {
- continue
- }
- flowsMap[f] = f
- flowsSlice = append(flowsSlice, f)
- }
- sort.Ints(flowsSlice)
- for _, f := range flowsSlice {
- r.FlowChild = append(r.FlowChild, &model.FlowBusiness{
- FlowState: int64(f),
- Child: flowBusinessMap[r.ID][int64(f)],
- })
- }
- }
- sKeys = append(sKeys, int(k))
- }
- sort.Ints(sKeys)
- for _, k := range sKeys {
- if _, ok := tempRes[int64(k)]; !ok {
- continue
- }
- res = append(res, tempRes[int64(k)])
- }
- return
- }
- // FlowList .
- func (s *Service) FlowList(c context.Context, bp *model.BusinessListParams) (res []*model.BusinessList, err error) {
- var (
- tempRes = []*model.BusinessList{}
- userRes = []*model.BusinessUserRoleList{}
- )
- res = []*model.BusinessList{}
- if tempRes, err = s.dao.FlowList(c, bp); err != nil {
- log.Error("s.dao.FlowList error(%v)", err)
- return
- }
- if bp.Auth <= 0 {
- res = tempRes
- return
- }
- up := &model.UserListParams{
- UID: bp.UID,
- Role: model.UserRoleDefaultVal,
- }
- if userRes, err = s.dao.UserList(c, up); err != nil {
- log.Error("s.dao.UserList error(%v)", err)
- return
- }
- if len(userRes) <= 0 {
- return
- }
- tMap := make(map[int64]*model.BusinessList)
- for _, t := range tempRes {
- tMap[t.BID] = t
- }
- for _, u := range userRes {
- if u.Role == "" {
- continue
- }
- if t, ok := tMap[u.BID]; ok {
- res = append(res, t)
- }
- }
- return
- }
- // RoleList .
- func (s *Service) RoleList(c context.Context, br *model.BusinessRole) (res []*model.BusinessRole, err error) {
- var (
- rids = []int{}
- tempRes = []*model.BusinessRole{}
- userRes = []*model.BusinessUserRoleList{}
- tempResMap = make(map[int64]*model.BusinessRole)
- )
- res = []*model.BusinessRole{}
- if tempRes, err = s.dao.RoleListByBID(c, br); err != nil {
- log.Error("s.dao.RoleList error(%v)", err)
- return
- }
- for _, tr := range tempRes {
- rids = append(rids, int(tr.RID))
- tempResMap[tr.RID] = tr
- }
- if br.Auth <= 0 {
- res = tempRes
- return
- }
- up := &model.UserListParams{
- BID: br.BID,
- UID: br.UID,
- Role: model.UserRoleDefaultVal,
- }
- if userRes, err = s.dao.UserList(c, up); err != nil {
- log.Error("s.dao.UserList error(%v)", err)
- return
- }
- if len(userRes) <= 0 {
- return
- }
- roleStr := userRes[0].Role
- roleSlice := strings.Split(roleStr, ",")
- sort.Ints(rids)
- for _, r := range rids {
- for _, rs := range roleSlice {
- rsInt64, _ := strconv.ParseInt(rs, 10, 64)
- if int64(r) == rsInt64 {
- res = append(res, tempResMap[int64(r)])
- }
- }
- }
- return
- }
- // UserList .
- func (s *Service) UserList(c context.Context, u *model.UserListParams) (res []*model.BusinessUserRoleList, total int64, err error) {
- if u.UName != "" {
- if uid, ok := s.userIds[u.UName]; ok {
- u.UID = uid
- }
- }
- if res, err = s.dao.UserList(c, u); err != nil {
- log.Error("s.dao.UserList error(%v)", err)
- return
- }
- rids := []int64{}
- for _, r := range res {
- if uname, ok := s.userNames[r.UID]; ok {
- r.UName = uname
- }
- if unickname, ok := s.userNicknames[r.UID]; ok {
- r.UNickname = unickname
- }
- if cuname, ok := s.userNames[r.CUID]; ok {
- r.CUName = cuname
- }
- roleSlice := strings.Split(r.Role, ",")
- for _, ridStr := range roleSlice {
- ridInt64, _ := strconv.ParseInt(ridStr, 10, 64)
- rids = append(rids, ridInt64)
- }
- }
- var roleRes []*model.BusinessRole
- if roleRes, err = s.dao.RoleListByRIDs(c, u.BID, rids); err != nil {
- log.Error("s.dao.RoleListByIDs error(%v)", err)
- return
- }
- for _, r := range res {
- r.RoleName = []string{}
- rids := strings.Split(r.Role, ",")
- for _, rid := range rids {
- ridInt64, _ := strconv.ParseInt(rid, 10, 64)
- for _, rr := range roleRes {
- if ridInt64 == rr.RID && r.BID == rr.BID {
- r.RoleName = append(r.RoleName, rr.Name)
- }
- }
- }
- }
- total = int64(len(res))
- start := (u.PN - 1) * u.PS
- if start >= total {
- res = []*model.BusinessUserRoleList{}
- return
- }
- end := start + u.PS
- if end > total {
- end = total
- }
- res = res[start:end]
- return
- }
- // DeleteUser .
- func (s *Service) DeleteUser(c context.Context, bur *model.BusinessUserRole) (err error) {
- if err = s.dao.DeleteUser(c, bur); err != nil {
- log.Error("s.dao.DeleteUser error(%v)", err)
- }
- return
- }
- // UserRole .
- func (s *Service) UserRole(c context.Context, brl *model.BusinessUserRoleList) (res []*model.UserRole, err error) {
- var (
- ridsInt64 []int64
- userRole []*model.BusinessUserRoleList
- roleList []*model.BusinessRole
- u = &model.UserListParams{
- BID: brl.BID,
- UID: brl.UID,
- Role: -1,
- }
- )
- if userRole, err = s.dao.UserList(c, u); err != nil {
- log.Error("s.dao.UserList error(%v)", err)
- return
- }
- if len(userRole) <= 0 {
- res = []*model.UserRole{}
- return
- }
- rids := strings.Split(userRole[0].Role, ",")
- for _, rid := range rids {
- ridInt64, _ := strconv.ParseInt(rid, 10, 64)
- ridsInt64 = append(ridsInt64, ridInt64)
- }
- if roleList, err = s.dao.RoleListByRIDs(c, brl.BID, ridsInt64); err != nil {
- log.Error("s.dao.RoleListByRIDs error(%v)", err)
- return
- }
- for _, rid := range ridsInt64 {
- for _, rl := range roleList {
- if rid == rl.RID {
- r := &model.UserRole{
- ID: rl.ID,
- BID: rl.BID,
- RID: rl.RID,
- Type: rl.Type,
- Name: rl.Name,
- }
- res = append(res, r)
- }
- }
- }
- return
- }
- // StateUp .
- func (s *Service) StateUp(c context.Context, p *model.UserStateUp) (err error) {
- err = s.dao.DB().Table("manager_business_user_role").Where("bid = ? AND uid = ?", p.BID, p.AdminID).Update("state = ?", p.State).Error
- return
- }
- // UserRoles .
- func (s *Service) UserRoles(c context.Context, uid int64) (res []*model.UserRole, err error) {
- var roleRes []*model.BusinessUserRoleList
- if roleRes, err = s.dao.UserRoles(c, uid); err != nil {
- log.Error("s.dao.UserRoles error(%v)", err)
- return
- }
- if len(roleRes) <= 0 {
- res = []*model.UserRole{}
- return
- }
- var roleList []*model.BusinessRole
- for _, r := range roleRes {
- bid := r.BID
- rids := []int64{}
- ridsStr := strings.Split(r.Role, ",")
- for _, r := range ridsStr {
- rid, _ := strconv.ParseInt(r, 10, 64)
- rids = append(rids, rid)
- }
- var tmpRoleList []*model.BusinessRole
- if tmpRoleList, err = s.dao.RoleListByRIDs(c, bid, rids); err != nil {
- log.Error("s.dao.RoleListByRIDs error(%v)", err)
- return
- }
- roleList = append(roleList, tmpRoleList...)
- }
- for _, rl := range roleList {
- r := &model.UserRole{
- ID: rl.ID,
- BID: rl.BID,
- RID: rl.RID,
- Type: rl.Type,
- Name: rl.Name,
- }
- res = append(res, r)
- }
- return
- }
- // AllRoles .
- func (s *Service) AllRoles(c context.Context, pid, uid int64) (res []*model.UserRole, err error) {
- var childs []*model.Business
- if childs, err = s.dao.BusinessChilds(c, pid); err != nil {
- log.Error("s.dao.BusinessChilds error(%v)", err)
- return
- }
- var childIDs []int64
- for _, c := range childs {
- childIDs = append(childIDs, c.BID)
- }
- var roleRes []*model.BusinessUserRoleList
- if roleRes, err = s.dao.UserRoleByBIDs(c, uid, childIDs); err != nil {
- log.Error("s.dao.UserRoleByBIDs error(%v)", err)
- return
- }
- if len(roleRes) <= 0 {
- res = []*model.UserRole{}
- return
- }
- var roleList []*model.BusinessRole
- for _, r := range roleRes {
- bid := r.BID
- rids := []int64{}
- ridsStr := strings.Split(r.Role, ",")
- for _, r := range ridsStr {
- rid, _ := strconv.ParseInt(r, 10, 64)
- rids = append(rids, rid)
- }
- var tmpRoleList []*model.BusinessRole
- if tmpRoleList, err = s.dao.RoleListByRIDs(c, bid, rids); err != nil {
- log.Error("s.dao.RoleListByRIDs error(%v)", err)
- return
- }
- roleList = append(roleList, tmpRoleList...)
- }
- for _, rl := range roleList {
- r := &model.UserRole{
- ID: rl.ID,
- BID: rl.BID,
- RID: rl.RID,
- Type: rl.Type,
- Name: rl.Name,
- }
- res = append(res, r)
- }
- return
- }
- // IsAdmin .
- func (s *Service) IsAdmin(c context.Context, bid, uid int64) bool {
- var (
- err error
- res []*model.UserRole
- )
- p := &model.BusinessUserRoleList{
- BID: bid,
- UID: uid,
- }
- if res, err = s.UserRole(c, p); err != nil {
- log.Error("s.UserRole error(%v)", err)
- return false
- }
- for _, r := range res {
- if r.Type == 1 {
- return true
- }
- }
- return false
- }
|