增加CRM模块

This commit is contained in:
2025-11-13 17:24:59 +08:00
parent 117e2b3440
commit 695bf2194f
32 changed files with 5340 additions and 44 deletions
+64
View File
@@ -0,0 +1,64 @@
package services
import (
"errors"
"github.com/beego/beego/v2/client/orm"
"server/models"
)
func ListContacts(tenantId string, relatedType int, relatedId string) ([]models.Contact, error) {
o := orm.NewOrm()
var list []models.Contact
qs := o.QueryTable(new(models.Contact)).Filter("tenant_id", tenantId).Filter("related_type", relatedType).Filter("related_id", relatedId).Filter("is_deleted", 0)
_, err := qs.All(&list)
return list, err
}
func CreateContact(m *models.Contact) error {
if m.TenantId == "" || m.RelatedType == 0 || m.RelatedId == "" || m.ContactName == "" {
return errors.New("缺少必填参数")
}
o := orm.NewOrm()
// 若设为主联系人,则先清理同归属其他主联系人
if m.IsPrimary == 1 {
_, _ = o.QueryTable(new(models.Contact)).Filter("tenant_id", m.TenantId).Filter("related_type", m.RelatedType).Filter("related_id", m.RelatedId).Filter("is_deleted", 0).Update(orm.Params{"is_primary": 0})
}
_, err := o.Insert(m)
return err
}
func UpdateContact(m *models.Contact) error {
if m.Id == 0 {
return errors.New("id不能为空")
}
o := orm.NewOrm()
// 若设为主联系人,则先清理同归属其他主联系人
if m.IsPrimary == 1 {
// 需要获取原始记录以得到 tenant/related
var origin models.Contact
origin.Id = m.Id
if err := o.Read(&origin); err == nil {
_, _ = o.QueryTable(new(models.Contact)).Filter("tenant_id", origin.TenantId).Filter("related_type", origin.RelatedType).Filter("related_id", origin.RelatedId).Filter("id__ne", m.Id).Filter("is_deleted", 0).Update(orm.Params{"is_primary": 0})
}
}
_, err := o.Update(m, "contact_name", "gender", "mobile", "phone", "email", "position", "department", "is_primary", "remark")
return err
}
func DeleteContact(id int64, tenantId string) error {
if id == 0 {
return errors.New("id不能为空")
}
o := orm.NewOrm()
m := models.Contact{Id: id}
if err := o.Read(&m); err != nil {
return err
}
if m.TenantId != tenantId {
return errors.New("租户不匹配")
}
m.IsDeleted = 1
_, err := o.Update(&m, "is_primary", "is_deleted")
return err
}
+79
View File
@@ -0,0 +1,79 @@
package services
import (
"time"
"server/models"
"github.com/beego/beego/v2/client/orm"
)
// ListCustomers 获取客户列表(可选租户过滤、关键词搜索、状态筛选、分页)
func ListCustomers(tenantId, keyword, status string, page, pageSize int) (list []*models.Customer, total int64, err error) {
o := orm.NewOrm()
qs := o.QueryTable(new(models.Customer)).Filter("delete_time__isnull", true)
if tenantId != "" {
qs = qs.Filter("tenant_id", tenantId)
}
if keyword != "" {
cond := orm.NewCondition()
cond1 := cond.Or("customer_name__icontains", keyword).
Or("contact_person__icontains", keyword).
Or("contact_phone__icontains", keyword)
qs = qs.SetCond(cond1)
}
if status != "" {
qs = qs.Filter("status", status)
}
total, err = qs.Count()
if err != nil {
return
}
if page <= 0 {
page = 1
}
if pageSize <= 0 {
pageSize = 10
}
offset := (page - 1) * pageSize
_, err = qs.OrderBy("-create_time").Limit(pageSize, offset).All(&list)
return
}
// GetCustomer 通过ID获取客户
func GetCustomer(id string) (*models.Customer, error) {
o := orm.NewOrm()
m := models.Customer{Id: id}
if err := o.Read(&m); err != nil {
return nil, err
}
return &m, nil
}
// CreateCustomer 新增客户
func CreateCustomer(m *models.Customer) error {
o := orm.NewOrm()
_, err := o.Insert(m)
return err
}
// UpdateCustomer 更新客户(全量更新)
func UpdateCustomer(m *models.Customer, cols ...string) error {
o := orm.NewOrm()
if len(cols) == 0 {
_, err := o.Update(m)
return err
}
_, err := o.Update(m, cols...)
return err
}
// SoftDeleteCustomer 软删除客户
func SoftDeleteCustomer(id string) error {
o := orm.NewOrm()
now := time.Now()
m := models.Customer{Id: id, DeleteTime: &now}
_, err := o.Update(&m, "delete_time")
return err
}
+79
View File
@@ -0,0 +1,79 @@
package services
import (
"time"
"server/models"
"github.com/beego/beego/v2/client/orm"
)
// ListSuppliers 获取供应商列表(可选租户过滤、关键词搜索、状态筛选、分页)
func ListSuppliers(tenantId, keyword, status string, page, pageSize int) (list []*models.Supplier, total int64, err error) {
o := orm.NewOrm()
qs := o.QueryTable(new(models.Supplier)).Filter("delete_time__isnull", true)
if tenantId != "" {
qs = qs.Filter("tenant_id", tenantId)
}
if keyword != "" {
cond := orm.NewCondition()
cond1 := cond.Or("supplier_name__icontains", keyword).
Or("contact_person__icontains", keyword).
Or("contact_phone__icontains", keyword)
qs = qs.SetCond(cond1)
}
if status != "" {
qs = qs.Filter("status", status)
}
total, err = qs.Count()
if err != nil {
return
}
if page <= 0 {
page = 1
}
if pageSize <= 0 {
pageSize = 10
}
offset := (page - 1) * pageSize
_, err = qs.OrderBy("-create_time").Limit(pageSize, offset).All(&list)
return
}
// GetSupplier 通过ID获取供应商
func GetSupplier(id string) (*models.Supplier, error) {
o := orm.NewOrm()
m := models.Supplier{Id: id}
if err := o.Read(&m); err != nil {
return nil, err
}
return &m, nil
}
// CreateSupplier 新增供应商
func CreateSupplier(m *models.Supplier) error {
o := orm.NewOrm()
_, err := o.Insert(m)
return err
}
// UpdateSupplier 更新供应商(全量更新)
func UpdateSupplier(m *models.Supplier, cols ...string) error {
o := orm.NewOrm()
if len(cols) == 0 {
_, err := o.Update(m)
return err
}
_, err := o.Update(m, cols...)
return err
}
// SoftDeleteSupplier 软删除供应商
func SoftDeleteSupplier(id string) error {
o := orm.NewOrm()
now := time.Now()
m := models.Supplier{Id: id, DeleteTime: &now}
_, err := o.Update(&m, "delete_time")
return err
}