更新后端

This commit is contained in:
2026-08-26 18:37:02 +08:00
parent 20bc65b1f3
commit e297a4871f
8 changed files with 2292 additions and 0 deletions
+350
View File
@@ -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)
}
}