package logic import ( "encoding/json" "errors" "ik3cloud/app/common" "ik3cloud/app/config" "ik3cloud/app/lib/ik3cloud" "ik3cloud/app/lib/logger" "strings" "time" ik3cloud2 "git.kumo.work/shama/service/ik3cloud" "go.uber.org/zap" ) var DepartmentLogic = &departmentLogic{} type departmentLogic struct { } type departmentItem struct { Id int64 `json:"FDEPTID"` Number *string `json:"FNumber"` Name *string `json:"FName"` ParentNumber *string `json:"FParentID.FNumber"` ParentName *string `json:"FParentID.FName"` } // All @TITLE 全部部门 func (d *departmentLogic) All() (result []ik3cloud2.DepartmentItem, err error) { raw, err := ik3cloud.Client.BillQuery(map[string]any{ "FormId": "BD_Department", "FieldKeys": "FNumber,FName,FParentID.FNumber,FParentID.FName,FDEPTID", "FilterString": []map[string]any{{ "FieldName": "FUseOrgId.FNumber", "Compare": "67", "Value": config.Config.Ik3cloud.OrganizationNumber, "Left": "", "Right": "", "Logic": "", }}, }) if err != nil { return } var data []departmentItem if err = json.Unmarshal(raw, &data); err != nil { return } for _, item := range data { result = append(result, ik3cloud2.DepartmentItem{ Number: item.Number, Name: item.Name, ParentNumber: item.ParentNumber, ParentName: item.ParentName, Id: item.Id, }) } return d.getTree(result), nil } // Add @TITLE 添加部门 func (d *departmentLogic) Add(data ik3cloud2.ArgsDepartmentAdd) (departmentId int64, err error) { raw, err := ik3cloud.Client.Save("BD_Department", map[string]any{ "Model": map[string]any{ "FCreateOrgId": map[string]any{ "FNumber": config.Config.Ik3cloud.OrganizationNumber, }, "FNumber": data.Number, "FName": data.Name, "FUseOrgId": map[string]any{ "FNumber": config.Config.Ik3cloud.OrganizationNumber, }, "FEffectDate": time.Now().Format("2006-01-02 15:04:05"), "FLapseDate": "9999-12-31 00:00:00", "FGroup": map[string]any{ "FNumber": data.GroupNumber, }, "FParentID": map[string]any{ "FNumber": data.ParentNumber, }, "FIsCopyFlush": false, "FIsDetailDpt": false, }, }) if err != nil { err = errors.New("添加部门失败") return } result, err := ik3cloud.Client.GetResult(raw) if err != nil { err = errors.New("添加部门失败") return } if !result.Result.ResponseStatus.IsSuccess { for _, item := range result.Result.ResponseStatus.Errors { return departmentId, errors.New(item.Message) } } departmentId = result.Result.Id if err1 := d.submit([]string{data.Number}); err1 != nil { logger.Logger.Error("部门提交失败", zap.Error(err1)) return } if err1 := d.audit([]string{data.Number}); err1 != nil { logger.Logger.Error("部门审核失败", zap.Error(err1)) return } return } // Edit @TITLE 编辑部门 func (d *departmentLogic) Edit(departmentId int64, data ik3cloud2.ArgsDepartmentAdd) error { if departmentId == 0 { return errors.New("部门错误") } raw, err := ik3cloud.Client.Save("BD_Department", map[string]any{ "NeedUpDateFields": []string{"FName", "FNumber", "FParentID.FNumber"}, "Model": map[string]any{ "FDEPTID": departmentId, "FNumber": data.Number, "FName": data.Name, "FParentID": map[string]any{ "FNumber": data.ParentNumber, }, }, }) if err != nil { return errors.New("编辑部门失败") } result, _ := ik3cloud.Client.GetResult(raw) if !result.Result.ResponseStatus.IsSuccess { for _, item := range result.Result.ResponseStatus.Errors { return errors.New(item.Message) } return errors.New("编辑部门失败") } return nil } // Delete @TITLE 删除部门 func (d *departmentLogic) Delete(numbers []string) error { if err := d.unAudit(numbers); err != nil { logger.Logger.Error("部门反审失败", zap.Error(err)) } raw, err := ik3cloud.Client.Delete("BD_Department", map[string]any{ "CreateOrgId": config.Config.Ik3cloud.OrganizationId, "Numbers": strings.Join(numbers, ","), }) if err != nil { return errors.New("删除部门失败") } result, err := ik3cloud.Client.GetResult(raw) if err != nil { return err } if !result.Result.ResponseStatus.IsSuccess { for _, item := range result.Result.ResponseStatus.Errors { return errors.New(item.Message) } } return nil } // @Title 获取菜单树 func (d *departmentLogic) getTree(datas []ik3cloud2.DepartmentItem) (result []ik3cloud2.DepartmentItem) { result = []ik3cloud2.DepartmentItem{} for i, item := range datas { if item.ParentNumber != nil { for index, value := range datas { if common.PtrCmp(item.ParentNumber, value.Number) { datas[index].Children = append(datas[index].Children, &datas[i]) break } } } } for _, item := range datas { if item.ParentNumber == nil { result = append(result, item) } } return } // @Title 提交 func (d *departmentLogic) submit(numbers []string) error { raw, err := ik3cloud.Client.Submit("BD_Department", map[string]any{ "CreateOrgId": config.Config.Ik3cloud.OrganizationId, "Numbers": strings.Join(numbers, ","), }) if err != nil { return errors.New("部门提交失败") } result, err := ik3cloud.Client.GetResult(raw) if err != nil { return err } if !result.Result.ResponseStatus.IsSuccess { for _, item := range result.Result.ResponseStatus.Errors { return errors.New(item.Message) } } return nil } // @Title 审核 func (d *departmentLogic) audit(numbers []string) error { raw, err := ik3cloud.Client.Audit("BD_Department", map[string]any{ "CreateOrgId": config.Config.Ik3cloud.OrganizationId, "Numbers": strings.Join(numbers, ","), }) if err != nil { return errors.New("部门审核失败") } result, err := ik3cloud.Client.GetResult(raw) if err != nil { return err } if !result.Result.ResponseStatus.IsSuccess { for _, item := range result.Result.ResponseStatus.Errors { return errors.New(item.Message) } } return nil } // @Title 反审 func (d *departmentLogic) unAudit(numbers []string) error { raw, err := ik3cloud.Client.UnAudit("BD_Department", map[string]any{ "CreateOrgId": config.Config.Ik3cloud.OrganizationId, "Numbers": strings.Join(numbers, ","), }) if err != nil { return errors.New("部门反审失败") } result, err := ik3cloud.Client.GetResult(raw) if err != nil { return err } if !result.Result.ResponseStatus.IsSuccess { for _, item := range result.Result.ResponseStatus.Errors { return errors.New(item.Message) } } return nil }