package service import ( "encoding/json" "errors" "fmt" "gas-cylinder-api/common/actions" cDto "gas-cylinder-api/common/dto" "gas-cylinder-api/common/global" model2 "gas-cylinder-api/common/model" "gogs.baozhida.cn/zoie/OAuth-core/service" "time" "gas-cylinder-api/app/admin/model" "gas-cylinder-api/app/admin/service/dto" "gogs.baozhida.cn/zoie/OAuth-core/pkg" "gorm.io/gorm" ) type TruckEnterprise struct { service.Service } // Get 获取SysDept对象 func (e TruckEnterprise) Get(d *dto.TruckEnterpriseGetReq, deptModel *model.SysDept) error { err := e.Orm. First(deptModel, d.GetId()).Error if err != nil { e.Log.Errorf("db error: %s", err) if errors.Is(err, gorm.ErrRecordNotFound) { return global.GetNotFoundOrNoPermissionErr } return global.GetFailedErr } return nil } // Insert 创建SysDept对象 func (e TruckEnterprise) Insert(c *dto.TruckEnterpriseInsertReq, deptId int) error { var err error var data model.SysDept tx := e.Orm.Debug().Begin() defer func() { if err != nil { tx.Rollback() } else { tx.Commit() } }() // TODO 上传省平台-1.1.1.1新增运输企业信息 addTruckEnterprise // data.CmpCode = res.CmpCode c.Generate(&data) data.UploadTime = model2.Time(time.Now()) if deptId != 0 && c.ParentId == 0 { data.ParentId = deptId } err = tx.Create(&data).Error if err != nil { e.Log.Errorf("db error: %s", err) return global.CreateFailedErr } c.Id = data.Id deptPath := pkg.IntToString(data.Id) + "/" if data.ParentId != 0 { var deptP model.SysDept tx.First(&deptP, data.ParentId) deptPath = deptP.Path + deptPath } else { deptPath = "/0/" + deptPath } var mp = map[string]string{} mp["path"] = deptPath err = tx.Model(&data).Update("path", deptPath).Error if err != nil { e.Log.Errorf("db error: %s", err) return global.CreateFailedErr } return nil } // Update 修改SysDept对象 func (e TruckEnterprise) Update(c *dto.TruckEnterpriseUpdateReq) error { var err error var deptModel = model.SysDept{} tx := e.Orm.Debug().Begin() defer func() { if err != nil { tx.Rollback() } else { tx.Commit() } }() err = tx.First(&deptModel, c.GetId()).Error if err != nil { e.Log.Errorf("db error: %s", err) if errors.Is(err, gorm.ErrRecordNotFound) { return global.UpdateNotFoundOrNoPermissionErr } return global.UpdateFailedErr } // TODO 上传省平台-1.1.1.2更新运输企业信息 updateTruckEnterprise //deptModel.CmpCode c.Generate(&deptModel) deptModel.UploadTime = model2.Time(time.Now()) DeptPath := pkg.IntToString(deptModel.Id) + "/" if deptModel.ParentId != 0 { var DeptP model.SysDept tx.First(&DeptP, deptModel.ParentId) DeptPath = DeptP.Path + DeptPath } else { DeptPath = "/0/" + DeptPath } deptModel.Path = DeptPath db := tx.Save(&deptModel) if err = db.Error; err != nil { e.Log.Errorf("UpdateSysDept error: %s", err) return err } return nil } // Remove 删除SysDept // 删除部门 同时删除其子部门、部门下的用户 func (e TruckEnterprise) Remove(d *dto.TruckEnterpriseDeleteReq, p *actions.DataPermission) error { var err error tx := e.Orm.Begin() defer func() { if err != nil { tx.Rollback() } else { tx.Commit() } }() // TODO 上传省平台-1.1.1.2删除运输企业信息 closeTruckEnterprise // fixme 删除所有子企业信息,更新省平台上传时间 // deptModel.CmpCode var dept model.SysDept err = e.Orm. First(&dept, d.GetId()).Error if err != nil { e.Log.Errorf("db error: %s", err) if errors.Is(err, gorm.ErrRecordNotFound) { return global.GetNotFoundOrNoPermissionErr } return global.DeleteFailedErr } var deptList = make([]model.SysDept, 0) var subDeptIds = make([]int, 0) err = tx.Where("path like ?", dept.Path+"%").Find(&deptList).Error if err != nil { e.Log.Errorf("Delete User error: %s", err) return errors.New("查询子门店失败!") } // 获取部门及其子部门下ID for _, v := range deptList { if v.Id != dept.Id { subDeptIds = append(subDeptIds, v.Id) } } if len(subDeptIds) > 0 { return errors.New("请先删除子门店!") } db := tx.Delete(&dept) if err = db.Error; err != nil { e.Log.Errorf("Delete error: %s", err) return global.DeleteFailedErr } return nil } // getList 获取组织数据 func (e TruckEnterprise) getList(c *dto.TruckEnterpriseGetPageReq, list *[]model.SysDept, p *actions.DataPermission) error { var err error var data model.SysDept if len(c.Name) == 0 && c.DeptId == 0 { err = e.Orm.Model(&data). Scopes( cDto.MakeCondition(c.GetNeedSearch()), ). Find(list).Error if err != nil { e.Log.Errorf("db error:%s", err) return err } return nil } var tempList []model.SysDept err = e.Orm.Model(&data).Where("id in (select id from sys_dept where path like ? )", "%/"+pkg.IntToString(p.DeptId)+"/%"). Scopes( cDto.MakeCondition(c.GetNeedSearch()), ). Find(&tempList).Error if err != nil { e.Log.Errorf("db error: %s", err) return global.GetFailedErr } // 获取部门及其子部门下ID for _, dept := range tempList { var deptList = make([]model.SysDept, 0) err = e.Orm.Where("path like ?", dept.Path+"%").Order(fmt.Sprintf("sort %s", c.SortOrder)).Find(&deptList).Error *list = append(*list, deptList...) } if err != nil { e.Log.Errorf("db error: %s", err) return global.GetFailedErr } *list = DeduplicateTruckEnterprise(*list) return nil } // DeptTreeCall 递归构造组织数据 //func DeptTreeCall(DeptList *[]model.SysDept, Dept dto.DeptLabel) dto.DeptLabel { // list := *DeptList // min := make([]dto.DeptLabel, 0) // for j := 0; j < len(list); j++ { // if Dept.Id != list[j].ParentId { // continue // } // mi := dto.DeptLabel{Id: list[j].Id, Label: list[j].Title, Children: []dto.DeptLabel{}} // ms := DeptTreeCall(DeptList, mi) // min = append(min, ms) // } // Dept.Children = min // return Dept //} // SetStorePage 设置dept页面数据 //func (e ProvTruckEnterprise) SetStorePage(c *dto.TruckEnterpriseGetPageReq, p *actions.DataPermission) (m []model.SysDept, err error) { // var list []model.SysDept // err = e.getList(c, &list, p) // for i := 0; i < len(list); i++ { // if list[i].ParentId != 0 { // continue // } // info := e.deptPageCall(&list, list[i]) // m = append(m, info) // } // return //} // //func (e ProvTruckEnterprise) deptPageCall(deptlist *[]model.SysDept, dept model.SysDept) model.SysDept { // list := *deptlist // min := make([]model.SysDept, 0) // for j := 0; j < len(list); j++ { // if dept.Id != list[j].ParentId { // continue // } // mi := model.SysDept{} // mi.Id = list[j].Id // mi.ParentId = list[j].ParentId // mi.Path = list[j].Path // mi.Title = list[j].Title // mi.Sort = list[j].Sort // mi.Status = list[j].Status // mi.CreatedAt = list[j].CreatedAt // mi.Children = []model.SysDept{} // ms := e.deptPageCall(deptlist, mi) // min = append(min, ms) // } // dept.Children = min // return dept //} // SetStorePage 设置Dept页面数据 func (e TruckEnterprise) SetTruckEnterprisePage(c *dto.TruckEnterpriseGetPageReq, p *actions.DataPermission) (m []model.SysDept, err error) { var list []model.SysDept err = e.getList(c, &list, p) for i := 0; i < len(list); i++ { if list[i].ParentId != 0 { continue } info := e.TruckEnterpriseCall(&list, list[i]) m = append(m, info) } if len(m) == 0 { parentMap, flag := getStoreParent(list) if flag { for i := 0; i < len(list); i++ { if parentMap[list[i].ParentId] { continue } info := e.TruckEnterpriseCall(&list, list[i]) m = append(m, info) } } else { for i := 0; i < len(list); i++ { info := e.TruckEnterpriseCall(&list, list[i]) m = append(m, info) } } } return } //func getStoreParent(deptList []model.SysDept) (map[int]bool, bool) { // list := deptList // var flag = false // var parentMap = map[int]bool{} // for j := 0; j < len(list); j++ { // parentMap[list[j].ParentId] = false // } // // for j := 0; j < len(list); j++ { // if _, ok := parentMap[list[j].Id]; !ok { // continue // } // parentMap[list[j].Id] = true // flag = true // } // return parentMap, flag //} func (e TruckEnterprise) TruckEnterpriseCall(deptList *[]model.SysDept, menu model.SysDept) model.SysDept { list := *deptList min := make([]model.SysDept, 0) for j := 0; j < len(list); j++ { if menu.Id != list[j].ParentId { continue } mi := model.SysDept{} mi.Id = list[j].Id mi.ParentId = list[j].ParentId mi.Path = list[j].Path mi.Name = list[j].Name mi.Sort = list[j].Sort mi.Status = list[j].Status mi.ProvTruckEnterprise = list[j].ProvTruckEnterprise mi.CreatedAt = list[j].CreatedAt mi.Children = []model.SysDept{} ms := e.TruckEnterpriseCall(deptList, mi) min = append(min, ms) } menu.Children = min return menu } func DeduplicateTruckEnterprise(list []model.SysDept) []model.SysDept { seen := make(map[string]bool) deduplicated := []model.SysDept{} for _, v := range list { // 将结构体编码为 JSON 字符串 key, err := json.Marshal(v) if err != nil { // 处理错误 continue } // 将 JSON 字符串作为键插入到 map 中 if _, ok := seen[string(key)]; !ok { seen[string(key)] = true deduplicated = append(deduplicated, v) } } return deduplicated }