Files
yunzerwebsiteallinone/go/controllers/backend_erp_company_contact.go
T

264 lines
7.0 KiB
Go

package controllers
import (
"encoding/json"
"fmt"
"io"
"strconv"
"strings"
"time"
"server/models"
"server/pkg/jwtutil"
beego "github.com/beego/beego/v2/server/web"
)
// BackendErpCompanyContactController ERP客户/供应商联系人控制器
type BackendErpCompanyContactController struct {
beego.Controller
}
func (c *BackendErpCompanyContactController) contactClaims() (*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 *BackendErpCompanyContactController) contactJsonErr(httpStatus, bizCode int, msg string) {
c.Ctx.Output.SetStatus(httpStatus)
c.Data["json"] = map[string]interface{}{"code": bizCode, "msg": msg}
_ = c.ServeJSON()
}
func (c *BackendErpCompanyContactController) contactOk(data interface{}) {
c.Data["json"] = map[string]interface{}{"code": 200, "msg": "success", "data": data}
_ = c.ServeJSON()
}
type companyContactPayload struct {
CompanyType string `json:"company_type"`
CompanyID uint64 `json:"company_id"`
Name string `json:"name"`
Gender int8 `json:"gender"`
Phone string `json:"phone"`
Mobiles string `json:"mobiles"` // JSON数组字符串
Wechat string `json:"wechat"`
QQ string `json:"qq"`
Dingtalk string `json:"dingtalk"`
Email string `json:"email"`
Department string `json:"department"`
Position string `json:"position"`
HomeAddress string `json:"home_address"`
IsPrimary int8 `json:"is_primary"`
Status int8 `json:"status"`
Remark string `json:"remark"`
}
// List GET /backend/erp/company-contact/list?company_type=customer&company_id=1
func (c *BackendErpCompanyContactController) List() {
claims, err := c.contactClaims()
if err != nil {
c.contactJsonErr(401, 401, err.Error())
return
}
companyType := strings.TrimSpace(c.GetString("company_type"))
companyIDStr := strings.TrimSpace(c.GetString("company_id"))
if companyType == "" || companyIDStr == "" {
c.contactJsonErr(400, 400, "缺少公司参数")
return
}
companyID, err := strconv.ParseUint(companyIDStr, 10, 64)
if err != nil {
c.contactJsonErr(400, 400, "公司ID格式错误")
return
}
qs := models.Orm.QueryTable(new(models.ErpCompanyContact)).
Filter("tenant_id", fmt.Sprintf("%d", claims.TenantId)).
Filter("company_type", companyType).
Filter("company_id", companyID).
Filter("delete_time__isnull", true)
var list []models.ErpCompanyContact
_, err = qs.OrderBy("-is_primary", "id").All(&list)
if err != nil {
c.contactJsonErr(500, 500, "查询失败: "+err.Error())
return
}
c.contactOk(map[string]interface{}{"list": list})
}
// Create POST /backend/erp/company-contact
func (c *BackendErpCompanyContactController) Create() {
claims, err := c.contactClaims()
if err != nil {
c.contactJsonErr(401, 401, err.Error())
return
}
body, err := io.ReadAll(c.Ctx.Request.Body)
if err != nil {
c.contactJsonErr(400, 400, "读取请求体失败")
return
}
var p companyContactPayload
if err := json.Unmarshal(body, &p); err != nil {
c.contactJsonErr(400, 400, "参数格式错误")
return
}
if strings.TrimSpace(p.Name) == "" {
c.contactJsonErr(400, 400, "联系人姓名不能为空")
return
}
if p.CompanyType == "" || p.CompanyID == 0 {
c.contactJsonErr(400, 400, "缺少公司参数")
return
}
contact := models.ErpCompanyContact{
TenantID: fmt.Sprintf("%d", claims.TenantId),
CompanyType: p.CompanyType,
CompanyID: p.CompanyID,
Name: strings.TrimSpace(p.Name),
Gender: p.Gender,
Phone: strings.TrimSpace(p.Phone),
Mobiles: p.Mobiles,
Wechat: strings.TrimSpace(p.Wechat),
QQ: strings.TrimSpace(p.QQ),
Dingtalk: strings.TrimSpace(p.Dingtalk),
Email: strings.TrimSpace(p.Email),
Department: strings.TrimSpace(p.Department),
Position: strings.TrimSpace(p.Position),
HomeAddress: strings.TrimSpace(p.HomeAddress),
IsPrimary: p.IsPrimary,
Status: p.Status,
Remark: strings.TrimSpace(p.Remark),
CreateTime: time.Now(),
UpdateTime: time.Now(),
}
id, err := models.Orm.Insert(&contact)
if err != nil {
c.contactJsonErr(500, 500, "创建失败: "+err.Error())
return
}
c.contactOk(map[string]interface{}{"id": id})
}
// Update PUT /backend/erp/company-contact/:id
func (c *BackendErpCompanyContactController) Update() {
claims, err := c.contactClaims()
if err != nil {
c.contactJsonErr(401, 401, err.Error())
return
}
idStr := c.Ctx.Input.Param(":id")
id, err := strconv.ParseUint(idStr, 10, 64)
if err != nil {
c.contactJsonErr(400, 400, "ID格式错误")
return
}
body, err := io.ReadAll(c.Ctx.Request.Body)
if err != nil {
c.contactJsonErr(400, 400, "读取请求体失败")
return
}
var p companyContactPayload
if err := json.Unmarshal(body, &p); err != nil {
c.contactJsonErr(400, 400, "参数格式错误")
return
}
contact := models.ErpCompanyContact{ID: id}
if err := models.Orm.Read(&contact); err != nil {
c.contactJsonErr(404, 404, "联系人不存在")
return
}
if contact.TenantID != fmt.Sprintf("%d", claims.TenantId) {
c.contactJsonErr(403, 403, "无权操作")
return
}
contact.Name = strings.TrimSpace(p.Name)
contact.Gender = p.Gender
contact.Phone = strings.TrimSpace(p.Phone)
contact.Mobiles = p.Mobiles
contact.Wechat = strings.TrimSpace(p.Wechat)
contact.QQ = strings.TrimSpace(p.QQ)
contact.Dingtalk = strings.TrimSpace(p.Dingtalk)
contact.Email = strings.TrimSpace(p.Email)
contact.Department = strings.TrimSpace(p.Department)
contact.Position = strings.TrimSpace(p.Position)
contact.HomeAddress = strings.TrimSpace(p.HomeAddress)
contact.IsPrimary = p.IsPrimary
contact.Status = p.Status
contact.Remark = strings.TrimSpace(p.Remark)
contact.UpdateTime = time.Now()
_, err = models.Orm.Update(&contact)
if err != nil {
c.contactJsonErr(500, 500, "更新失败: "+err.Error())
return
}
c.contactOk(nil)
}
// Delete DELETE /backend/erp/company-contact/:id
func (c *BackendErpCompanyContactController) Delete() {
claims, err := c.contactClaims()
if err != nil {
c.contactJsonErr(401, 401, err.Error())
return
}
idStr := c.Ctx.Input.Param(":id")
id, err := strconv.ParseUint(idStr, 10, 64)
if err != nil {
c.contactJsonErr(400, 400, "ID格式错误")
return
}
contact := models.ErpCompanyContact{ID: id}
if err := models.Orm.Read(&contact); err != nil {
c.contactJsonErr(404, 404, "联系人不存在")
return
}
if contact.TenantID != fmt.Sprintf("%d", claims.TenantId) {
c.contactJsonErr(403, 403, "无权操作")
return
}
now := time.Now()
contact.DeleteTime = &now
_, err = models.Orm.Update(&contact, "delete_time")
if err != nil {
c.contactJsonErr(500, 500, "删除失败: "+err.Error())
return
}
c.contactOk(nil)
}