package position import ( "dubbo.apache.org/dubbo-go/v3/common/logger" "encoding/json" "errors" "fmt" "github.com/fonchain_enterprise/fonchain-main/api/approval" "github.com/fonchain_enterprise/fonchain-main/api/department" api "github.com/fonchain_enterprise/fonchain-main/api/position" "github.com/fonchain_enterprise/fonchain-main/api/recruit" "github.com/fonchain_enterprise/fonchain-main/pkg/cache" "github.com/fonchain_enterprise/fonchain-main/pkg/e" "github.com/fonchain_enterprise/fonchain-main/pkg/model/login" "github.com/fonchain_enterprise/fonchain-main/pkg/model/query" v2 "github.com/fonchain_enterprise/fonchain-main/pkg/model/vo/v2" "github.com/fonchain_enterprise/fonchain-main/pkg/serializer" "github.com/fonchain_enterprise/fonchain-main/pkg/service" "github.com/gin-gonic/gin" "github.com/gin-gonic/gin/binding" "github.com/go-redis/redis" "github.com/google/uuid" "github.com/jinzhu/copier" ) func CreateV2(c *gin.Context) { var req api.CreateRequest if err := c.ShouldBindBodyWith(&req, binding.JSON); err != nil { service.Error(c, e.Error, err) return } userInfo, err := login.GetUserInfoFromCV2(c) if err != nil { service.Error(c, e.Error, err) return } if req.DepartmentID != 0 { departmentRes, err := service.DepartmentProvider.Detail(c, &department.DetailRequest{ID: int64(req.DepartmentID)}) if err != nil { service.Error(c, e.Error, err) return } req.DepartmentName = departmentRes.Name } req.Rules = serializer.GetPositionRulesFormTreeV2(req.PositionTreeRule) req.OperatorName = userInfo.NickName res, err := service.PositionProvider.Create(c, &req) if err != nil { service.Error(c, e.Error, err) return } req.ID = res.ID req.PositionTreeRule = nil req.Rules = nil newRecord := &api.LogRequest{ OperateType: "add", Info: "新增“" + req.Name + "”岗位", OperatorName: userInfo.NickName, OperatorTel: userInfo.TelNum, OperatorId: uint32(userInfo.ID), PositionId: uint32(req.ID), } _, _ = service.PositionProvider.CreatePositionLog(c, newRecord) service.Success(c, &req) return } func UpdateV2(c *gin.Context) { var req api.CreateRequest if err := c.ShouldBindBodyWith(&req, binding.JSON); err != nil { service.Error(c, e.Error, err) return } oldRes, oldErr := service.PositionProvider.DetailV2(c, &api.DetailRequest{ID: req.ID}) logger.Error("---------1请求更新 postion detail_v2 :", oldRes, oldRes) if oldErr != nil { service.Error(c, e.Error, oldErr) return } req.Rules = serializer.GetPositionRulesFormTreeV2(req.PositionTreeRule) logger.Error("---------2请求更新 postion detail_v2 :", req.Rules) userInfo, err := login.GetUserInfoFromCV2(c) logger.Error("---------3请求更新 postion detail_v2 :", userInfo, err) if err != nil { service.Error(c, e.Error, err) return } req.OperatorName = userInfo.NickName res, err := service.PositionProvider.Update(c, &req) logger.Error("---------4请求更新 postion detail_v2 :", res, err) if err != nil { service.Error(c, e.Error, err) return } newRecord := &api.LogRequest{ OperateType: "edit", Info: "修改“" + req.Name + "“岗位", OperatorName: userInfo.NickName, OperatorTel: userInfo.TelNum, OperatorId: uint32(userInfo.ID), PositionId: uint32(req.ID), } if oldRes.Name != req.Name { newRecord.Info = "原“" + oldRes.Name + "“改为“" + req.Name + "“" } s1, err := service.PositionProvider.CreatePositionLog(c, newRecord) logger.Error("---------5请求更新 postion detail_v2 :", s1, err) service.Success(c, res) return } //CreateModel 新增模版 func CreateModel(c *gin.Context) { uuidString := uuid.NewString() var req query.CreateModelQuery if err := c.ShouldBindBodyWith(&req, binding.JSON); err != nil { service.Error(c, e.Error, err) return } res, err := service.PositionProvider.DetailV2(c, &api.DetailRequest{ID: uint64(req.Id)}) if err != nil { service.Error(c, e.Error, err) return } newObj := new(v2.CreateRequest) err = copier.Copy(&newObj, res) if err != nil { service.Error(c, e.Error, err) return } if req.Name != "" { newObj.Name = req.Name } newObj.Uuid = uuidString b, err := json.Marshal(newObj) if err != nil { service.Error(c, e.Error, err) return } keyString := cache.GetPositionModelStringKey(uuidString) cache.RedisClient.Set(keyString, string(b), 0) cache.RedisClient.ZAdd(cache.GetPositionModelZsetKey(), redis.Z{ Score: cache.GetZSetMaxScore(cache.GetPositionModelZsetKey()), Member: keyString, }) service.Success(c, "") return } //DetailModel 删除模版 func DetailModel(c *gin.Context) { var req query.CommonUUid var temp *v2.CreateRequest if err := c.ShouldBindBodyWith(&req, binding.JSON); err != nil { service.Error(c, e.Error, err) return } listString, err := cache.RedisClient.Get(cache.GetPositionModelStringKey(req.Uuid)).Result() if err != nil { service.Error(c, e.Error, err) return } err = json.Unmarshal([]byte(listString), &temp) if err != nil { service.Error(c, e.Error, err) return } service.Success(c, temp) return } // LogList 删除模版 func LogList(c *gin.Context) { var req api.LogListRequest if err := c.ShouldBindBodyWith(&req, binding.JSON); err != nil { service.Error(c, e.Error, err) return } res, err := service.PositionProvider.PositionLogList(c, &req) if err != nil { service.Error(c, e.Error, err) return } service.Success(c, res) return } func BatchBindAuth(c *gin.Context) { var req api.BatchAddRulesRequest if err := c.ShouldBindBodyWith(&req, binding.JSON); err != nil { service.Error(c, e.Error, err) return } userInfo, err := login.GetUserInfoFromCV2(c) if err != nil { service.Error(c, e.Error, err) return } req.OperatorName = userInfo.NickName res, err := service.PositionProvider.BatchAddPositionRules(c, &req) if err != nil { service.Error(c, e.Error, err) return } service.Success(c, res) return } //ListModel 删除模版 func ListModel(c *gin.Context) { var req query.CommonUUid var res []v2.ModelInfo if err := c.ShouldBindBodyWith(&req, binding.JSON); err != nil { service.Error(c, e.Error, err) return } // 获取有序集合中的元素,按分数降序排列 keyList, err := cache.RedisClient.ZRevRange(cache.GetPositionModelZsetKey(), 0, -1).Result() if err != nil { service.Error(c, e.Error, err) return } if len(keyList) <= 0 { service.Success(c, nil) return } listString, err := cache.RedisClient.MGet(keyList...).Result() // 将[]interface{}转换为[]string for _, v := range listString { // 类型断言:将interface{}断言为string strVal, ok := v.(string) if !ok { continue } var temp v2.CreateRequest if err := json.Unmarshal([]byte(strVal), &temp); err == nil { res = append(res, v2.ModelInfo{Uuid: temp.Uuid, Name: temp.Name}) } } service.Success(c, res) return } //DeleteModel 删除模版 func DeleteModel(c *gin.Context) { var req query.CommonUUid if err := c.ShouldBindBodyWith(&req, binding.JSON); err != nil { service.Error(c, e.Error, err) return } keyString := cache.GetPositionModelStringKey(req.Uuid) cache.RedisClient.ZRem(cache.GetPositionModelZsetKey(), keyString) cache.RedisClient.Del(keyString) service.Success(c, nil) return } func DetailV2(c *gin.Context) { var req api.DetailRequest if err := c.ShouldBindBodyWith(&req, binding.JSON); err != nil { service.Error(c, e.Error, err) return } userInfo, err := login.GetUserInfoFromCV2(c) if err != nil { service.Error(c, e.Error, err) return } res, err := service.PositionProvider.DetailV2(c, &req) if err != nil { service.Error(c, e.Error, err) return } newObj := new(v2.CreateRequest) err = copier.Copy(&newObj, res) if err != nil { service.Error(c, e.Error, err) return } newRecord := &api.LogRequest{ OperateType: "detail", Info: "查看“" + res.Name + "“岗位", OperatorName: userInfo.NickName, OperatorTel: userInfo.TelNum, OperatorId: uint32(userInfo.ID), PositionId: uint32(req.ID), } _, _ = service.PositionProvider.CreatePositionLog(c, newRecord) service.Success(c, newObj) } func BatchRemove(c *gin.Context) { var req api.BatchRemoveRequest if err := c.ShouldBindBodyWith(&req, binding.JSON); err != nil { service.Error(c, e.Error, err) return } userInfo, err := login.GetUserInfoFromCV2(c) if err != nil { service.Error(c, e.Error, err) return } res1, err1 := service.PositionProvider.DetailV2(c, &api.DetailRequest{ID: uint64(req.IDs[0])}) if err1 != nil { service.Error(c, e.Error, err) return } //删除校验 for _, v := range req.IDs { //查申请 findRes, err := service.ApprovalProvider.FindByPosition(c, &approval.DepartmentAndPosition{PositionUID: fmt.Sprintf("%d", v)}) if err1 != nil { service.Error(c, e.Error, err) return } if findRes.IsExist == true { service.Error(c, e.Error, errors.New("正在审批流程中,岗位不可删除;")) return } //查申请 positionRes, err := service.GrpcRecruitClientImpl.PositionQuery(c, &recruit.PositionReq{PageSize: 10, CurPage: 1, Status: 4, PositionId: int64(v)}) if err1 != nil { service.Error(c, e.Error, err) return } if positionRes.Count >= 1 { service.Error(c, e.Error, errors.New("人未招满且未终止,岗位不可删除!")) return } //查申请 positionRes, err = service.GrpcRecruitClientImpl.PositionQuery(c, &recruit.PositionReq{PageSize: 10, CurPage: 1, Status: 2, PositionId: int64(v)}) if err1 != nil { service.Error(c, e.Error, err) return } if positionRes.Count >= 1 { service.Error(c, e.Error, errors.New("人未招满且未终止(审批通过),岗位不可删除!")) return } } res, err := service.PositionProvider.BatchRemove(c, &req) if err != nil { service.Error(c, e.Error, err) return } for _, v := range req.IDs { _, err = service.ApprovalProvider.DeleteByPosition(c, &approval.DepartmentAndPosition{PositionUID: fmt.Sprintf("%d", v)}) if err1 != nil { service.Error(c, e.Error, err) return } } newRecord := &api.LogRequest{ OperateType: "del", Info: "删除“" + res1.Name + "“岗位", OperatorName: userInfo.NickName, OperatorTel: userInfo.TelNum, OperatorId: uint32(userInfo.ID), PositionId: req.IDs[0], } _, _ = service.PositionProvider.CreatePositionLog(c, newRecord) service.Success(c, res) return } func ListV2(c *gin.Context) { var req api.ListRequest if err := c.ShouldBindBodyWith(&req, binding.JSON); err != nil { service.Error(c, e.Error, err) return } if req.UpdateEndAt != "" { req.UpdateEndAt += " 23:59:59" } res, err := service.PositionProvider.List(c, &req) if err != nil { service.Error(c, e.Error, err) return } newObj := new(v2.ListResponse) err = copier.Copy(&newObj, res) if err != nil { service.Error(c, e.Error, err) return } service.Success(c, newObj) } func RecordLog() { }