更新后端
This commit is contained in:
@@ -1076,3 +1076,353 @@ func hashEmployeePassword(plain string) string {
|
||||
sum := sha256.Sum256([]byte(plain))
|
||||
return hex.EncodeToString(sum[:])
|
||||
}
|
||||
|
||||
// GetOrgSettings 获取组织架构设置
|
||||
// GET /backend/erp/getOrgSettings
|
||||
func (c *BackendErpController) GetOrgSettings() {
|
||||
tid, _ := c.GetInt("tid")
|
||||
|
||||
settings := map[string]interface{}{
|
||||
"org_code_prefix": "ORG",
|
||||
"employee_code_prefix": "EMP",
|
||||
"position_code_prefix": "POS",
|
||||
"auto_generate_codes": true,
|
||||
"allow_duplicate_codes": false,
|
||||
"max_org_levels": 10,
|
||||
"max_org_children": 50,
|
||||
"tid": tid,
|
||||
}
|
||||
|
||||
c.jsonOK(settings)
|
||||
}
|
||||
|
||||
// SaveOrgSettings 保存组织架构设置
|
||||
// POST /backend/erp/saveOrgSettings
|
||||
func (c *BackendErpController) SaveOrgSettings() {
|
||||
_ = c.parseJSONBody()
|
||||
|
||||
settings := map[string]interface{}{
|
||||
"org_code_prefix": "ORG",
|
||||
"employee_code_prefix": "EMP",
|
||||
"position_code_prefix": "POS",
|
||||
"auto_generate_codes": true,
|
||||
"allow_duplicate_codes": false,
|
||||
"max_org_levels": 10,
|
||||
"max_org_children": 50,
|
||||
}
|
||||
|
||||
// 这里可以添加保存到数据库的逻辑
|
||||
// 目前只是返回成功响应
|
||||
|
||||
c.jsonOK(settings)
|
||||
}
|
||||
|
||||
// GetOrganizationTree 获取组织架构树形结构
|
||||
// GET /backend/erp/getOrganizationTree
|
||||
func (c *BackendErpController) GetOrganizationTree() {
|
||||
tid, _ := c.GetInt("tid")
|
||||
|
||||
qs := models.Orm.QueryTable(new(models.BackendErpOrganization)).
|
||||
Filter("delete_time__isnull", true).
|
||||
Exclude("status", 0)
|
||||
if tid > 0 {
|
||||
qs = qs.Filter("tid", tid)
|
||||
}
|
||||
|
||||
var rows []models.BackendErpOrganization
|
||||
_, err := qs.OrderBy("sort", "id").All(&rows)
|
||||
if err != nil {
|
||||
c.jsonError(500, "查询组织机构失败: "+err.Error())
|
||||
return
|
||||
}
|
||||
|
||||
// 构建树形结构
|
||||
tree := buildOrganizationTree(rows)
|
||||
c.jsonOK(tree)
|
||||
}
|
||||
|
||||
// SearchOrganizations 搜索组织机构
|
||||
// GET /backend/erp/searchOrganizations
|
||||
func (c *BackendErpController) SearchOrganizations() {
|
||||
tid, _ := c.GetInt("tid")
|
||||
keyword := c.GetString("keyword")
|
||||
|
||||
qs := models.Orm.QueryTable(new(models.BackendErpOrganization)).
|
||||
Filter("delete_time__isnull", true).
|
||||
Exclude("status", 0)
|
||||
if tid > 0 {
|
||||
qs = qs.Filter("tid", tid)
|
||||
}
|
||||
|
||||
if keyword != "" {
|
||||
qs = qs.Filter("org_name__icontains", keyword)
|
||||
}
|
||||
|
||||
var rows []models.BackendErpOrganization
|
||||
_, err := qs.OrderBy("sort", "id").All(&rows)
|
||||
if err != nil {
|
||||
c.jsonError(500, "查询组织机构失败: "+err.Error())
|
||||
return
|
||||
}
|
||||
|
||||
list := make([]erpOrganizationDTO, 0, len(rows))
|
||||
for _, row := range rows {
|
||||
list = append(list, c.organizationDTO(row))
|
||||
}
|
||||
|
||||
c.jsonOK(list)
|
||||
}
|
||||
|
||||
// GetOrganizationEmployees 获取指定组织下的员工列表
|
||||
// GET /backend/erp/getOrganizationEmployees/:org_id
|
||||
func (c *BackendErpController) GetOrganizationEmployees() {
|
||||
orgID, ok := c.pathUint64(":org_id")
|
||||
if !ok {
|
||||
c.jsonError(400, "无效组织ID")
|
||||
return
|
||||
}
|
||||
|
||||
tid, _ := c.GetInt("tid")
|
||||
|
||||
// 获取该组织及其所有子组织的ID
|
||||
var orgIDs []uint64
|
||||
orgIDs = append(orgIDs, orgID)
|
||||
|
||||
// 递归获取子组织ID
|
||||
getChildOrgIDs(orgID, &orgIDs)
|
||||
|
||||
qs := models.Orm.QueryTable(new(models.BackendErpEmployee)).
|
||||
Filter("delete_time__isnull", true)
|
||||
if tid > 0 {
|
||||
qs = qs.Filter("tid", tid)
|
||||
}
|
||||
|
||||
// 查询属于这些组织的员工
|
||||
if len(orgIDs) > 0 {
|
||||
qs = qs.Filter("department__in", orgIDs)
|
||||
}
|
||||
|
||||
var rows []models.BackendErpEmployee
|
||||
_, err := qs.OrderBy("-id").All(&rows)
|
||||
if err != nil {
|
||||
c.jsonError(500, "查询员工失败: "+err.Error())
|
||||
return
|
||||
}
|
||||
|
||||
list := make([]erpEmployeeDTO, 0, len(rows))
|
||||
for _, row := range rows {
|
||||
list = append(list, c.employeeDTO(row))
|
||||
}
|
||||
|
||||
c.jsonOK(list)
|
||||
}
|
||||
|
||||
// MoveEmployeeToOrg 移动员工到指定组织
|
||||
// POST /backend/erp/moveEmployeeToOrg
|
||||
func (c *BackendErpController) MoveEmployeeToOrg() {
|
||||
body := c.parseJSONBody()
|
||||
|
||||
employeeID, hasEmployee := c.getUintValue(body, "employee_id")
|
||||
orgID, hasOrg := c.getUint64Value(body, "org_id")
|
||||
|
||||
if !hasEmployee || !hasOrg {
|
||||
c.jsonError(400, "员工ID和组织ID不能为空")
|
||||
return
|
||||
}
|
||||
|
||||
// 更新员工的部门信息
|
||||
update := orm.Params{"department": orgID}
|
||||
num, err := models.Orm.QueryTable(new(models.BackendErpEmployee)).
|
||||
Filter("id", employeeID).
|
||||
Filter("delete_time__isnull", true).
|
||||
Update(update)
|
||||
if err != nil {
|
||||
c.jsonError(500, "移动员工失败: "+err.Error())
|
||||
return
|
||||
}
|
||||
if num == 0 {
|
||||
c.jsonError(404, "员工不存在")
|
||||
return
|
||||
}
|
||||
|
||||
c.jsonOK(nil)
|
||||
}
|
||||
|
||||
// GetOrganizationHierarchy 获取组织层级结构
|
||||
// GET /backend/erp/getOrganizationHierarchy/:org_id
|
||||
func (c *BackendErpController) GetOrganizationHierarchy() {
|
||||
orgID, ok := c.pathUint64(":org_id")
|
||||
if !ok {
|
||||
c.jsonError(400, "无效组织ID")
|
||||
return
|
||||
}
|
||||
|
||||
// 获取指定组织的信息
|
||||
var org models.BackendErpOrganization
|
||||
err := models.Orm.QueryTable(new(models.BackendErpOrganization)).
|
||||
Filter("id", orgID).
|
||||
Filter("delete_time__isnull", true).
|
||||
One(&org)
|
||||
if err != nil {
|
||||
c.jsonError(404, "组织不存在")
|
||||
return
|
||||
}
|
||||
|
||||
// 获取所有子组织
|
||||
var children []models.BackendErpOrganization
|
||||
_, err = models.Orm.QueryTable(new(models.BackendErpOrganization)).
|
||||
Filter("parent_id", orgID).
|
||||
Filter("delete_time__isnull", true).
|
||||
OrderBy("sort", "id").
|
||||
All(&children)
|
||||
if err != nil {
|
||||
c.jsonError(500, "查询子组织失败: "+err.Error())
|
||||
return
|
||||
}
|
||||
|
||||
hierarchy := map[string]interface{}{
|
||||
"current": c.organizationDTO(org),
|
||||
"children": make([]erpOrganizationDTO, 0, len(children)),
|
||||
}
|
||||
|
||||
childList := make([]erpOrganizationDTO, len(children))
|
||||
for i, child := range children {
|
||||
childList[i] = c.organizationDTO(child)
|
||||
}
|
||||
hierarchy["children"] = childList
|
||||
|
||||
c.jsonOK(hierarchy)
|
||||
}
|
||||
|
||||
// CheckOrgCodeUnique 检查组织编码唯一性
|
||||
// GET /backend/erp/checkOrgCodeUnique
|
||||
func (c *BackendErpController) CheckOrgCodeUnique() {
|
||||
tid, _ := c.GetInt("tid")
|
||||
orgCode := c.GetString("org_code")
|
||||
orgID, _ := c.GetUint64("org_id")
|
||||
|
||||
if orgCode == "" {
|
||||
c.jsonError(400, "组织编码不能为空")
|
||||
return
|
||||
}
|
||||
|
||||
qs := models.Orm.QueryTable(new(models.BackendErpOrganization)).
|
||||
Filter("org_code", orgCode).
|
||||
Filter("delete_time__isnull", true)
|
||||
if tid > 0 {
|
||||
qs = qs.Filter("tid", tid)
|
||||
}
|
||||
if orgID > 0 {
|
||||
qs = qs.Exclude("id", orgID)
|
||||
}
|
||||
|
||||
count, err := qs.Count()
|
||||
if err != nil {
|
||||
c.jsonError(500, "检查编码唯一性失败: "+err.Error())
|
||||
return
|
||||
}
|
||||
|
||||
c.jsonOK(map[string]interface{}{
|
||||
"unique": count == 0,
|
||||
"message": func() string {
|
||||
if count == 0 {
|
||||
return "编码可用"
|
||||
}
|
||||
return "编码已存在"
|
||||
}(),
|
||||
})
|
||||
}
|
||||
|
||||
// CheckEmployeeAccountUnique 检查员工账号唯一性
|
||||
// GET /backend/erp/checkEmployeeAccountUnique
|
||||
func (c *BackendErpController) CheckEmployeeAccountUnique() {
|
||||
tid, _ := c.GetInt("tid")
|
||||
account := c.GetString("account")
|
||||
employeeID, _ := c.GetInt("employee_id")
|
||||
|
||||
if account == "" {
|
||||
c.jsonError(400, "员工账号不能为空")
|
||||
return
|
||||
}
|
||||
|
||||
qs := models.Orm.QueryTable(new(models.BackendErpEmployee)).
|
||||
Filter("account", account).
|
||||
Filter("delete_time__isnull", true)
|
||||
if tid > 0 {
|
||||
qs = qs.Filter("tid", tid)
|
||||
}
|
||||
if employeeID > 0 {
|
||||
qs = qs.Exclude("id", employeeID)
|
||||
}
|
||||
|
||||
count, err := qs.Count()
|
||||
if err != nil {
|
||||
c.jsonError(500, "检查账号唯一性失败: "+err.Error())
|
||||
return
|
||||
}
|
||||
|
||||
c.jsonOK(map[string]interface{}{
|
||||
"unique": count == 0,
|
||||
"message": func() string {
|
||||
if count == 0 {
|
||||
return "账号可用"
|
||||
}
|
||||
return "账号已存在"
|
||||
}(),
|
||||
})
|
||||
}
|
||||
|
||||
// buildOrganizationTree 构建组织树形结构
|
||||
func buildOrganizationTree(rows []models.BackendErpOrganization) []map[string]interface{} {
|
||||
tree := make([]map[string]interface{}, 0)
|
||||
nodeMap := make(map[uint64]map[string]interface{})
|
||||
|
||||
// 创建节点映射
|
||||
for _, row := range rows {
|
||||
node := map[string]interface{}{
|
||||
"id": row.ID,
|
||||
"tid": row.Tid,
|
||||
"org_name": row.OrgName,
|
||||
"org_code": row.OrgCode,
|
||||
"parent_id": row.ParentID,
|
||||
"sort": row.Sort,
|
||||
"is_company": row.IsCompany,
|
||||
"status": row.Status,
|
||||
"leader_id": row.LeaderID,
|
||||
"remark": row.Remark,
|
||||
"children": make([]map[string]interface{}, 0),
|
||||
}
|
||||
nodeMap[row.ID] = node
|
||||
}
|
||||
|
||||
// 构建树形结构
|
||||
for _, row := range rows {
|
||||
node := nodeMap[row.ID]
|
||||
if row.ParentID == 0 {
|
||||
tree = append(tree, node)
|
||||
} else {
|
||||
if parent, exists := nodeMap[row.ParentID]; exists {
|
||||
parent["children"] = append(parent["children"].([]map[string]interface{}), node)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return tree
|
||||
}
|
||||
|
||||
// getChildOrgIDs 递归获取子组织ID
|
||||
func getChildOrgIDs(parentID uint64, orgIDs *[]uint64) {
|
||||
var children []models.BackendErpOrganization
|
||||
_, err := models.Orm.QueryTable(new(models.BackendErpOrganization)).
|
||||
Filter("parent_id", parentID).
|
||||
Filter("delete_time__isnull", true).
|
||||
All(&children)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
for _, child := range children {
|
||||
*orgIDs = append(*orgIDs, child.ID)
|
||||
getChildOrgIDs(child.ID, orgIDs)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -114,6 +114,17 @@ func RegisterAuthRoutes() {
|
||||
beego.Router("/backend/erp/createPosition", &controllers.BackendErpController{}, "post:CreatePosition")
|
||||
beego.Router("/backend/erp/editPosition/:id", &controllers.BackendErpController{}, "post:EditPosition")
|
||||
beego.Router("/backend/erp/deletePosition/:id", &controllers.BackendErpController{}, "delete:DeletePosition")
|
||||
|
||||
// 新增组织架构接口
|
||||
beego.Router("/backend/erp/getOrgSettings", &controllers.BackendErpController{}, "get:GetOrgSettings")
|
||||
beego.Router("/backend/erp/saveOrgSettings", &controllers.BackendErpController{}, "post:SaveOrgSettings")
|
||||
beego.Router("/backend/erp/getOrganizationTree", &controllers.BackendErpController{}, "get:GetOrganizationTree")
|
||||
beego.Router("/backend/erp/searchOrganizations", &controllers.BackendErpController{}, "get:SearchOrganizations")
|
||||
beego.Router("/backend/erp/getOrganizationEmployees/:org_id", &controllers.BackendErpController{}, "get:GetOrganizationEmployees")
|
||||
beego.Router("/backend/erp/moveEmployeeToOrg", &controllers.BackendErpController{}, "post:MoveEmployeeToOrg")
|
||||
beego.Router("/backend/erp/getOrganizationHierarchy/:org_id", &controllers.BackendErpController{}, "get:GetOrganizationHierarchy")
|
||||
beego.Router("/backend/erp/checkOrgCodeUnique", &controllers.BackendErpController{}, "get:CheckOrgCodeUnique")
|
||||
beego.Router("/backend/erp/checkEmployeeAccountUnique", &controllers.BackendErpController{}, "get:CheckEmployeeAccountUnique")
|
||||
|
||||
// 文章管理
|
||||
beego.Router("/backend/articlesList", &controllers.BackendArticleController{}, "get:List")
|
||||
|
||||
Reference in New Issue
Block a user