package handler import ( "net/http" "github.com/gin-gonic/gin" "kefu-sys/server/internal/middleware" "kefu-sys/server/internal/model" ) type CustomerHandler struct{} func NewCustomerHandler() *CustomerHandler { return &CustomerHandler{} } func (h *CustomerHandler) List(c *gin.Context) { tenantID := middleware.GetTenantID(c) page, pageSize := middleware.GetPageParams(c) search := c.Query("search") status := c.Query("status") source := c.Query("source") var customers []model.Customer var total int64 query := model.DB.Where("tenant_id = ?", tenantID) if search != "" { query = query.Where("name LIKE ? OR phone LIKE ? OR email LIKE ?", "%"+search+"%", "%"+search+"%", "%"+search+"%") } if status != "" { query = query.Where("status = ?", status) } if source != "" { query = query.Where("source = ?", source) } query.Model(&model.Customer{}).Count(&total) query.Order("updated_at desc").Offset((page - 1) * pageSize).Limit(pageSize).Find(&customers) middleware.JSONList(c, customers, total, page, pageSize) } func (h *CustomerHandler) Get(c *gin.Context) { tenantID := middleware.GetTenantID(c) id := c.Param("id") var customer model.Customer if err := model.DB.Where("id = ? AND tenant_id = ?", id, tenantID).First(&customer).Error; err != nil { c.JSON(http.StatusNotFound, gin.H{"code": 404, "message": "客户不存在"}) return } var sessions []model.Session model.DB.Where("customer_id = ? AND tenant_id = ?", customer.ID, tenantID). Order("created_at desc").Limit(20).Find(&sessions) middleware.JSON(c, gin.H{"customer": customer, "sessions": sessions}) } func (h *CustomerHandler) Create(c *gin.Context) { var customer model.Customer if err := c.ShouldBindJSON(&customer); err != nil { c.JSON(http.StatusBadRequest, gin.H{"code": 400, "message": "参数错误"}) return } customer.TenantID = middleware.GetTenantID(c) if err := model.DB.Create(&customer).Error; err != nil { c.JSON(http.StatusInternalServerError, gin.H{"code": 500, "message": "创建失败"}) return } middleware.JSON(c, customer) } func (h *CustomerHandler) Update(c *gin.Context) { tenantID := middleware.GetTenantID(c) id := c.Param("id") var customer model.Customer if err := model.DB.Where("id = ? AND tenant_id = ?", id, tenantID).First(&customer).Error; err != nil { c.JSON(http.StatusNotFound, gin.H{"code": 404, "message": "客户不存在"}) return } var updates map[string]interface{} if err := c.ShouldBindJSON(&updates); err != nil { c.JSON(http.StatusBadRequest, gin.H{"code": 400, "message": "参数错误"}) return } // 不允许修改 tenant_id delete(updates, "tenant_id") delete(updates, "id") model.DB.Model(&customer).Updates(updates) middleware.JSON(c, customer) } func (h *CustomerHandler) Delete(c *gin.Context) { tenantID := middleware.GetTenantID(c) id := c.Param("id") result := model.DB.Where("id = ? AND tenant_id = ?", id, tenantID).Delete(&model.Customer{}) if result.RowsAffected == 0 { c.JSON(http.StatusNotFound, gin.H{"code": 404, "message": "客户不存在"}) return } middleware.JSON(c, gin.H{"message": "已删除"}) }