package controllers import ( "encoding/json" "fmt" "io" "strconv" "strings" "time" "server/models" "server/pkg/jwtutil" beego "github.com/beego/beego/v2/server/web" ) // BackendErpAccountSetController ERP账套管理控制器 type BackendErpAccountSetController struct { beego.Controller } func (c *BackendErpAccountSetController) asClaims() (*jwtutil.Claims, error) { auth := c.Ctx.Request.Header.Get("Authorization") if auth == "" { return nil, fmt.Errorf("未登录") } parts := strings.SplitN(auth, " ", 2) if len(parts) != 2 || parts[0] != "Bearer" { return nil, fmt.Errorf("认证信息格式错误") } claims, err := jwtutil.ParseToken(parts[1]) if err != nil { return nil, fmt.Errorf("无效的token") } if claims.UserType != "backend" { return nil, fmt.Errorf("无权访问") } return claims, nil } func (c *BackendErpAccountSetController) asJsonErr(httpStatus, bizCode int, msg string) { c.Ctx.Output.SetStatus(httpStatus) c.Data["json"] = map[string]interface{}{"code": bizCode, "msg": msg} _ = c.ServeJSON() } func (c *BackendErpAccountSetController) asOk(data interface{}) { c.Data["json"] = map[string]interface{}{"code": 200, "msg": "success", "data": data} _ = c.ServeJSON() } type accountSetFormPayload struct { SetCode string `json:"set_code"` SetName string `json:"set_name"` CompanyName string `json:"company_name"` CompanyTaxNo string `json:"company_tax_no"` StartYear int `json:"start_year"` StartMonth int `json:"start_month"` AccountingStandard string `json:"accounting_standard"` Currency string `json:"currency"` TaxRate float64 `json:"tax_rate"` Status string `json:"status"` Remark string `json:"remark"` } // List GET /backend/erp/account-set/list func (c *BackendErpAccountSetController) List() { claims, err := c.asClaims() if err != nil { c.asJsonErr(401, 401, err.Error()) return } page, _ := c.GetInt("page", 1) pageSize, _ := c.GetInt("pageSize", 20) keyword := strings.TrimSpace(c.GetString("keyword")) status := strings.TrimSpace(c.GetString("status")) if page < 1 { page = 1 } if pageSize < 1 || pageSize > 100 { pageSize = 20 } qs := models.Orm.QueryTable(new(models.ErpAccountSet)). Filter("tenant_id", fmt.Sprintf("%d", claims.TenantId)). Filter("delete_time__isnull", true) if keyword != "" { qs = qs.Filter("set_name__contains", keyword) } if status != "" { qs = qs.Filter("status", status) } total, _ := qs.Count() var list []models.ErpAccountSet _, err = qs.OrderBy("-id").Limit(pageSize, (page-1)*pageSize).All(&list) if err != nil { c.asJsonErr(500, 500, "查询失败: "+err.Error()) return } c.asOk(map[string]interface{}{ "list": list, "total": total, "page": page, "pageSize": pageSize, }) } // Detail GET /backend/erp/account-set/:id func (c *BackendErpAccountSetController) Detail() { claims, err := c.asClaims() if err != nil { c.asJsonErr(401, 401, err.Error()) return } idStr := c.Ctx.Input.Param(":id") id, _ := strconv.ParseUint(idStr, 10, 64) if id == 0 { c.asJsonErr(400, 400, "无效的ID") return } var set models.ErpAccountSet err = models.Orm.QueryTable(new(models.ErpAccountSet)). Filter("id", id). Filter("tenant_id", fmt.Sprintf("%d", claims.TenantId)). One(&set) if err != nil { c.asJsonErr(404, 404, "账套未找到") return } c.asOk(set) } // Create POST /backend/erp/account-set func (c *BackendErpAccountSetController) Create() { claims, err := c.asClaims() if err != nil { c.asJsonErr(401, 401, err.Error()) return } raw, err := io.ReadAll(c.Ctx.Request.Body) if err != nil { c.asJsonErr(400, 400, "参数错误") return } var p accountSetFormPayload if err := json.Unmarshal(raw, &p); err != nil { c.asJsonErr(400, 400, "参数错误") return } if strings.TrimSpace(p.SetName) == "" { c.asJsonErr(400, 400, "账套名称不能为空") return } if strings.TrimSpace(p.SetCode) == "" { c.asJsonErr(400, 400, "账套编码不能为空") return } set := models.ErpAccountSet{ TenantID: fmt.Sprintf("%d", claims.TenantId), SetCode: strings.TrimSpace(p.SetCode), SetName: strings.TrimSpace(p.SetName), CompanyName: strings.TrimSpace(p.CompanyName), CompanyTaxNo: strings.TrimSpace(p.CompanyTaxNo), StartYear: p.StartYear, StartMonth: p.StartMonth, AccountingStandard: p.AccountingStandard, Currency: strings.TrimSpace(p.Currency), TaxRate: p.TaxRate, Status: p.Status, Remark: p.Remark, CreateTime: time.Now(), UpdateTime: time.Now(), } if set.StartYear == 0 { set.StartYear = time.Now().Year() } if set.StartMonth == 0 { set.StartMonth = 1 } if set.AccountingStandard == "" { set.AccountingStandard = "1" } if set.Currency == "" { set.Currency = "CNY" } if set.TaxRate == 0 { set.TaxRate = 13.00 } if set.Status == "" { set.Status = "1" } id, err := models.Orm.Insert(&set) if err != nil { c.asJsonErr(500, 500, "创建失败: "+err.Error()) return } c.asOk(map[string]interface{}{"id": id}) } // Update PUT /backend/erp/account-set/:id func (c *BackendErpAccountSetController) Update() { claims, err := c.asClaims() if err != nil { c.asJsonErr(401, 401, err.Error()) return } idStr := c.Ctx.Input.Param(":id") id, _ := strconv.ParseUint(idStr, 10, 64) if id == 0 { c.asJsonErr(400, 400, "无效的ID") return } raw, err := io.ReadAll(c.Ctx.Request.Body) if err != nil { c.asJsonErr(400, 400, "参数错误") return } var p accountSetFormPayload if err := json.Unmarshal(raw, &p); err != nil { c.asJsonErr(400, 400, "参数错误") return } var set models.ErpAccountSet err = models.Orm.QueryTable(new(models.ErpAccountSet)). Filter("id", id). Filter("tenant_id", fmt.Sprintf("%d", claims.TenantId)). One(&set) if err != nil { c.asJsonErr(404, 404, "账套未找到") return } set.SetCode = strings.TrimSpace(p.SetCode) set.SetName = strings.TrimSpace(p.SetName) set.CompanyName = strings.TrimSpace(p.CompanyName) set.CompanyTaxNo = strings.TrimSpace(p.CompanyTaxNo) set.StartYear = p.StartYear set.StartMonth = p.StartMonth set.AccountingStandard = p.AccountingStandard set.Currency = strings.TrimSpace(p.Currency) set.TaxRate = p.TaxRate set.Status = p.Status set.Remark = p.Remark set.UpdateTime = time.Now() _, err = models.Orm.Update(&set) if err != nil { c.asJsonErr(500, 500, "更新失败: "+err.Error()) return } c.asOk(nil) } // Delete DELETE /backend/erp/account-set/:id func (c *BackendErpAccountSetController) Delete() { claims, err := c.asClaims() if err != nil { c.asJsonErr(401, 401, err.Error()) return } idStr := c.Ctx.Input.Param(":id") id, _ := strconv.ParseUint(idStr, 10, 64) if id == 0 { c.asJsonErr(400, 400, "无效的ID") return } now := time.Now() _, err = models.Orm.QueryTable(new(models.ErpAccountSet)). Filter("id", id). Filter("tenant_id", fmt.Sprintf("%d", claims.TenantId)). Update(map[string]interface{}{ "delete_time": now, "update_time": now, }) if err != nil { c.asJsonErr(500, 500, "删除失败: "+err.Error()) return } c.asOk(nil) } // ToggleStatus POST /backend/erp/account-set/:id/status func (c *BackendErpAccountSetController) ToggleStatus() { claims, err := c.asClaims() if err != nil { c.asJsonErr(401, 401, err.Error()) return } idStr := c.Ctx.Input.Param(":id") id, _ := strconv.ParseUint(idStr, 10, 64) if id == 0 { c.asJsonErr(400, 400, "无效的ID") return } raw, _ := io.ReadAll(c.Ctx.Request.Body) var p struct { Status string `json:"status"` } _ = json.Unmarshal(raw, &p) _, err = models.Orm.QueryTable(new(models.ErpAccountSet)). Filter("id", id). Filter("tenant_id", fmt.Sprintf("%d", claims.TenantId)). Update(map[string]interface{}{ "status": p.Status, "update_time": time.Now(), }) if err != nil { c.asJsonErr(500, 500, "操作失败: "+err.Error()) return } c.asOk(nil) }