From dac214fa72dc2974954a4d8ee934695f548ad155 Mon Sep 17 00:00:00 2001
From: wangpengfei <274878379@qq.com>
Date: 星期三, 02 八月 2023 14:14:30 +0800
Subject: [PATCH] fix

---
 service/client.go             |  156 ++--
 api/v1/salesLeads.go          |    6 
 service/followRecord.go       |  128 +-
 model/client.go               |  298 +++---
 pkg/ecode/code.go             |  782 ++++++++++----------
 api/v1/followRecord.go        |  446 +++++-----
 model/request/followRecord.go |   64 
 model/followRecord.go         |  370 ++++----
 8 files changed, 1,125 insertions(+), 1,125 deletions(-)

diff --git a/api/v1/followRecord.go b/api/v1/followRecord.go
index e6c2f4c..ca3ef2f 100644
--- a/api/v1/followRecord.go
+++ b/api/v1/followRecord.go
@@ -1,224 +1,224 @@
-package v1
-
-import (
-	"aps_crm/model"
-	"aps_crm/model/request"
-	"aps_crm/model/response"
-	"aps_crm/pkg/contextx"
-	"aps_crm/pkg/ecode"
-	"github.com/gin-gonic/gin"
-	"strconv"
-	"time"
-)
-
-type FollowRecordApi struct{}
-
-// Add
-//
-//	@Tags		FollowRecord
-//	@Summary	娣诲姞璺熻繘璁板綍
-//	@Produce	application/json
-//	@Param		object	body		request.AddFollowRecord	true	"鏌ヨ鍙傛暟"
-//	@Success	200		{object}	contextx.Response{}
-//	@Router		/api/followRecord/add [post]
-func (fr *FollowRecordApi) Add(c *gin.Context) {
-	var params request.AddFollowRecord
-	ctx, ok := contextx.NewContext(c, &params)
-	if !ok {
-		return
-	}
-
-	errCode, followRecord := checkFollowRecordParams(params.FollowRecord)
-	if errCode != ecode.OK {
-		ctx.Fail(errCode)
-		return
-	}
-
-	errCode = followRecordService.AddFollowRecord(followRecord)
-	if errCode != ecode.OK {
-		ctx.Fail(errCode)
-		return
-	}
-
-	ctx.Ok()
-}
-
-// Delete
-//
-//	@Tags		FollowRecord
-//	@Summary	鍒犻櫎璺熻繘璁板綍
-//	@Produce	application/json
-//	@Param		id	path		string	true	"璺熻繘璁板綍id"
-//	@Success	200	{object}	contextx.Response{}
-//	@Router		/api/followRecord/delete/{id} [delete]
-func (fr *FollowRecordApi) Delete(c *gin.Context) {
-	ctx, ok := contextx.NewContext(c, nil)
-	if !ok {
-		return
-	}
-
-	id, _ := strconv.Atoi(c.Param("id"))
-	errCode := followRecordService.DeleteFollowRecord(id)
-	if errCode != ecode.OK {
-		ctx.Fail(errCode)
-		return
-	}
-
-	ctx.Ok()
-}
-
-// Update
-//
-//	@Tags		FollowRecord
-//	@Summary	鏇存柊璺熻繘璁板綍
-//	@Produce	application/json
-//	@Param		object	body		request.UpdateFollowRecord	true	"鏌ヨ鍙傛暟"
-//	@Success	200		{object}	contextx.Response{}
-//	@Router		/api/followRecord/update [put]
-func (fr *FollowRecordApi) Update(c *gin.Context) {
-	var params request.UpdateFollowRecord
-	ctx, ok := contextx.NewContext(c, &params)
-	if !ok {
-		return
-	}
-
-	errCode, followRecord := checkFollowRecordParams(params.FollowRecord)
-	if errCode != ecode.OK {
-		ctx.Fail(errCode)
-		return
-	}
-
-	followRecord.Id = params.Id
-	errCode = followRecordService.UpdateFollowRecord(followRecord)
-	if errCode != ecode.OK {
-		ctx.Fail(errCode)
-		return
-	}
-
-	ctx.Ok()
-}
-
-// checkFollowRecordParams
-// 妫�鏌ヨ窡杩涜褰曞弬鏁�
-func checkFollowRecordParams(followRecord request.FollowRecord) (int, *model.FollowRecord) {
-	var followRecordModel model.FollowRecord
-
-	//if followRecord.ClientId != 0 {
-	//	// check client exist
-	//	if service.CheckClientExist(followRecord.ClientId) != ecode.OK {
-	//		return ecode.ClientNotExist, &followRecordModel
-	//	}
-	//}
-	//
-	//if followRecord.ContactId != 0 {
-	//	// check contact exist
-	//	if service.CheckContactExist(followRecord.ContactId) != ecode.OK {
-	//		return ecode.ContactNotExist, &followRecordModel
-	//	}
-	//}
-	//
-	//if followRecord.SalesLeadsId != 0 {
-	//	// check sales leads exist
-	//	if service.CheckSalesLeadsExist(followRecord.SalesLeadsId) != ecode.OK {
-	//		return ecode.SalesLeadsNotExist, &followRecordModel
-	//	}
-	//}
-	//
-	//// check member id
-	//if followRecord.MemberId == 0 {
-	//	// todo check member exist
-	//	return ecode.InvalidParams, &followRecordModel
-	//}
-	//
-	//// check number
-	//if followRecord.Number == "" {
-	//	return ecode.InvalidParams, &followRecordModel
-	//}
-	//
-	//// check follow content
-	//if followRecord.Content == "" {
-	//	return ecode.InvalidParams, &followRecordModel
-	//}
-
-	// check follow time
-	t, err := checkTimeFormat(followRecord.FollowTime)
-	if err != nil {
-		return ecode.InvalidParams, &followRecordModel
-	}
-
-	followRecordModel.FollowTime = t
-
-	t, err = checkTimeFormat(followRecord.NextFollowTime)
-	if err != nil {
-		return ecode.InvalidParams, &followRecordModel
-	}
-	followRecordModel.NextFollowTime = t
-
-	followRecordModel.ClientId = followRecord.ClientId
-	followRecordModel.Content = followRecord.Content
-	followRecordModel.MemberId = followRecord.MemberId
-	followRecordModel.Number = followRecord.Number
-	followRecordModel.ClientStatusId = followRecord.ClientStatusId
-	followRecordModel.ContactId = followRecord.ContactId
-	followRecordModel.Topic = followRecord.Topic
-	followRecordModel.SalesLeadsId = followRecord.SalesLeadsId
-	followRecordModel.SaleChanceId = followRecord.SaleChanceId
-	followRecordModel.ContactInformationId = followRecord.ContactInformationId
-	followRecordModel.Purpose = followRecord.Purpose
-	followRecordModel.Content = followRecord.Content
-	followRecordModel.Record = followRecord.Record
-
-	return ecode.OK, &followRecordModel
-}
-
-// checkTimeFormat
-// 妫�鏌ユ椂闂存牸寮�
-func checkTimeFormat(t string) (time.Time, error) {
-	if t == "" {
-		t = "1900-01-01T00:00:00+08:00"
-	}
-
-	location, err := time.LoadLocation("Asia/Shanghai")
-	if err != nil {
-		return time.Time{}, err
-	}
-
-	tt, err := time.Parse("2006-01-02T15:04:05.000Z", t)
-	if err == nil {
-		return tt.In(location), nil
-	}
-
-	tt, err = time.Parse("2006-01-02T15:04:05-07:00", t)
-	if err == nil {
-		return tt.In(location), nil
-	}
-
-	return time.Time{}, err
-}
-
-// List
-//
-//	@Tags		FollowRecord
-//	@Summary	鍥炶璁板綍鍒楄〃
-//	@Produce	application/json
-//	@Param		object	body		request.GetFollowRecordList	true	"鍙傛暟"
-//	@Success	200		{object}	contextx.Response{data=response.FollowRecordResponse}
-//	@Router		/api/followRecord/list [post]
-func (fr *FollowRecordApi) List(c *gin.Context) {
-	var params request.GetFollowRecordList
-	ctx, ok := contextx.NewContext(c, &params)
-	if !ok {
-		return
-	}
-
-	followRecords, total, errCode := followRecordService.GetFollowRecordList(params.Page, params.PageSize, params.Keyword)
-	if errCode != ecode.OK {
-		ctx.Fail(errCode)
-		return
-	}
-
-	ctx.OkWithDetailed(response.FollowRecordResponse{
-		List:  followRecords,
-		Count: int(total),
-	})
+package v1
+
+import (
+	"aps_crm/model"
+	"aps_crm/model/request"
+	"aps_crm/model/response"
+	"aps_crm/pkg/contextx"
+	"aps_crm/pkg/ecode"
+	"github.com/gin-gonic/gin"
+	"strconv"
+	"time"
+)
+
+type FollowRecordApi struct{}
+
+// Add
+//
+//	@Tags		FollowRecord
+//	@Summary	娣诲姞璺熻繘璁板綍
+//	@Produce	application/json
+//	@Param		object	body		request.AddFollowRecord	true	"鏌ヨ鍙傛暟"
+//	@Success	200		{object}	contextx.Response{}
+//	@Router		/api/followRecord/add [post]
+func (fr *FollowRecordApi) Add(c *gin.Context) {
+	var params request.AddFollowRecord
+	ctx, ok := contextx.NewContext(c, &params)
+	if !ok {
+		return
+	}
+
+	errCode, followRecord := checkFollowRecordParams(params.FollowRecord)
+	if errCode != ecode.OK {
+		ctx.Fail(errCode)
+		return
+	}
+
+	errCode = followRecordService.AddFollowRecord(followRecord)
+	if errCode != ecode.OK {
+		ctx.Fail(errCode)
+		return
+	}
+
+	ctx.Ok()
+}
+
+// Delete
+//
+//	@Tags		FollowRecord
+//	@Summary	鍒犻櫎璺熻繘璁板綍
+//	@Produce	application/json
+//	@Param		id	path		string	true	"璺熻繘璁板綍id"
+//	@Success	200	{object}	contextx.Response{}
+//	@Router		/api/followRecord/delete/{id} [delete]
+func (fr *FollowRecordApi) Delete(c *gin.Context) {
+	ctx, ok := contextx.NewContext(c, nil)
+	if !ok {
+		return
+	}
+
+	id, _ := strconv.Atoi(c.Param("id"))
+	errCode := followRecordService.DeleteFollowRecord(id)
+	if errCode != ecode.OK {
+		ctx.Fail(errCode)
+		return
+	}
+
+	ctx.Ok()
+}
+
+// Update
+//
+//	@Tags		FollowRecord
+//	@Summary	鏇存柊璺熻繘璁板綍
+//	@Produce	application/json
+//	@Param		object	body		request.UpdateFollowRecord	true	"鏌ヨ鍙傛暟"
+//	@Success	200		{object}	contextx.Response{}
+//	@Router		/api/followRecord/update [put]
+func (fr *FollowRecordApi) Update(c *gin.Context) {
+	var params request.UpdateFollowRecord
+	ctx, ok := contextx.NewContext(c, &params)
+	if !ok {
+		return
+	}
+
+	errCode, followRecord := checkFollowRecordParams(params.FollowRecord)
+	if errCode != ecode.OK {
+		ctx.Fail(errCode)
+		return
+	}
+
+	followRecord.Id = params.Id
+	errCode = followRecordService.UpdateFollowRecord(followRecord)
+	if errCode != ecode.OK {
+		ctx.Fail(errCode)
+		return
+	}
+
+	ctx.Ok()
+}
+
+// checkFollowRecordParams
+// 妫�鏌ヨ窡杩涜褰曞弬鏁�
+func checkFollowRecordParams(followRecord request.FollowRecord) (int, *model.FollowRecord) {
+	var followRecordModel model.FollowRecord
+
+	//if followRecord.ClientId != 0 {
+	//	// check client exist
+	//	if service.CheckClientExist(followRecord.ClientId) != ecode.OK {
+	//		return ecode.ClientNotExist, &followRecordModel
+	//	}
+	//}
+	//
+	//if followRecord.ContactId != 0 {
+	//	// check contact exist
+	//	if service.CheckContactExist(followRecord.ContactId) != ecode.OK {
+	//		return ecode.ContactNotExist, &followRecordModel
+	//	}
+	//}
+	//
+	//if followRecord.SalesLeadsId != 0 {
+	//	// check sales leads exist
+	//	if service.CheckSalesLeadsExist(followRecord.SalesLeadsId) != ecode.OK {
+	//		return ecode.SalesLeadsNotExist, &followRecordModel
+	//	}
+	//}
+	//
+	//// check member id
+	//if followRecord.MemberId == 0 {
+	//	// todo check member exist
+	//	return ecode.InvalidParams, &followRecordModel
+	//}
+	//
+	//// check number
+	//if followRecord.Number == "" {
+	//	return ecode.InvalidParams, &followRecordModel
+	//}
+	//
+	//// check follow content
+	//if followRecord.Content == "" {
+	//	return ecode.InvalidParams, &followRecordModel
+	//}
+
+	// check follow time
+	t, err := checkTimeFormat(followRecord.FollowTime)
+	if err != nil {
+		return ecode.InvalidParams, &followRecordModel
+	}
+
+	followRecordModel.FollowTime = t
+
+	t, err = checkTimeFormat(followRecord.NextFollowTime)
+	if err != nil {
+		return ecode.InvalidParams, &followRecordModel
+	}
+	followRecordModel.NextFollowTime = t
+
+	followRecordModel.ClientId = followRecord.ClientId
+	followRecordModel.Content = followRecord.Content
+	followRecordModel.MemberId = followRecord.MemberId
+	followRecordModel.Number = followRecord.Number
+	followRecordModel.ClientStatusId = followRecord.ClientStatusId
+	followRecordModel.ContactId = followRecord.ContactId
+	followRecordModel.Topic = followRecord.Topic
+	followRecordModel.SalesLeadsId = followRecord.SalesLeadsId
+	followRecordModel.SaleChanceId = followRecord.SaleChanceId
+	followRecordModel.ContactInformationId = followRecord.ContactInformationId
+	followRecordModel.Purpose = followRecord.Purpose
+	followRecordModel.Content = followRecord.Content
+	followRecordModel.Record = followRecord.Record
+
+	return ecode.OK, &followRecordModel
+}
+
+// checkTimeFormat
+// 妫�鏌ユ椂闂存牸寮�
+func checkTimeFormat(t string) (time.Time, error) {
+	if t == "" {
+		t = "1900-01-01T00:00:00+08:00"
+	}
+
+	location, err := time.LoadLocation("Asia/Shanghai")
+	if err != nil {
+		return time.Time{}, err
+	}
+
+	tt, err := time.Parse("2006-01-02T15:04:05.000Z", t)
+	if err == nil {
+		return tt.In(location), nil
+	}
+
+	tt, err = time.Parse("2006-01-02T15:04:05-07:00", t)
+	if err == nil {
+		return tt.In(location), nil
+	}
+
+	return time.Time{}, err
+}
+
+// List
+//
+//	@Tags		FollowRecord
+//	@Summary	鍥炶璁板綍鍒楄〃
+//	@Produce	application/json
+//	@Param		object	body		request.GetFollowRecordList	true	"鍙傛暟"
+//	@Success	200		{object}	contextx.Response{data=response.FollowRecordResponse}
+//	@Router		/api/followRecord/list [post]
+func (fr *FollowRecordApi) List(c *gin.Context) {
+	var params request.GetFollowRecordList
+	ctx, ok := contextx.NewContext(c, &params)
+	if !ok {
+		return
+	}
+
+	followRecords, total, errCode := followRecordService.GetFollowRecordList(params.Page, params.PageSize, params.Keyword)
+	if errCode != ecode.OK {
+		ctx.Fail(errCode)
+		return
+	}
+
+	ctx.OkWithDetailed(response.FollowRecordResponse{
+		List:  followRecords,
+		Count: int(total),
+	})
 }
\ No newline at end of file
diff --git a/api/v1/salesLeads.go b/api/v1/salesLeads.go
index 0a48ac5..c0b3215 100644
--- a/api/v1/salesLeads.go
+++ b/api/v1/salesLeads.go
@@ -145,7 +145,7 @@
 //	@Param		object	body		request.GetSalesLeadsList	true	"鍙傛暟"
 //	@Success	200		{object}	contextx.Response{data=response.SalesLeadsResponse}
 //	@Router		/api/salesLeads/list [post]
-func (con *SalesLeadsApi) List(c *gin.Context) {
+func (s *SalesLeadsApi) List(c *gin.Context) {
 	var params request.GetSalesLeadsList
 	ctx, ok := contextx.NewContext(c, &params)
 	if !ok {
@@ -159,7 +159,7 @@
 	}
 
 	ctx.OkWithDetailed(response.SalesLeadsResponse{
-		List: salesLeadss,
+		List:  salesLeadss,
 		Count: int(total),
 	})
-}
\ No newline at end of file
+}
diff --git a/model/client.go b/model/client.go
index d58a5c8..a1c5cf2 100644
--- a/model/client.go
+++ b/model/client.go
@@ -1,149 +1,149 @@
-package model
-
-import (
-	"aps_crm/pkg/mysqlx"
-	"gorm.io/gorm"
-	"time"
-)
-
-type (
-	Client struct {
-		Id                int            `json:"id" gorm:"column:id;primaryKey;autoIncrement;not null"`
-		Name              string         `json:"name" gorm:"column:name;unique;type:varchar(255);comment:瀹㈡埛鍚嶇О"`
-		Number            string         `json:"number" gorm:"column:number;type:varchar(255);comment:瀹㈡埛缂栧彿"`
-		ClientStatusId    int            `json:"client_status_id" gorm:"column:client_status_id;type:int(11);comment:瀹㈡埛鐘舵�両D"`
-		ClientStatus      ClientStatus   `json:"client_status" gorm:"foreignKey:ClientStatusId"`
-		ClientTypeId      int            `json:"client_type_id" gorm:"column:client_type_id;type:int(11);comment:瀹㈡埛绫诲瀷ID"`
-		ClientType        ClientType     `json:"client_type" gorm:"foreignKey:ClientTypeId"`
-		ClientOriginId    int            `json:"client_origin_id" gorm:"column:client_origin_id;type:int(11);comment:瀹㈡埛鏉ユ簮ID"`
-		ClientOrigin      ClientOrigin   `json:"client_origin" gorm:"foreignKey:ClientOriginId"`
-		ClientLevelId     int            `json:"client_level_id" gorm:"column:client_level_id;type:int(11);comment:瀹㈡埛绛夌骇ID"`
-		ClientLevel       ClientLevel    `json:"client_level" gorm:"foreignKey:ClientLevelId"`
-		Contacts          []Contact      `json:"contacts" gorm:"foreignKey:ClientId"`
-		MemberId          int            `json:"member_id" gorm:"column:member_id;type:int(11);comment:閿�鍞礋璐d汉ID"`
-		ServiceMemberId   int            `json:"service_member_id" gorm:"column:service_member_id;type:int(11);comment:鏈嶅姟璐熻矗浜篒D"`
-		DetailAddress     string         `json:"detail_address" gorm:"column:detail_address;type:varchar(255);comment:璇︾粏鍦板潃"`
-		Remark            string         `json:"remark" gorm:"column:remark;type:varchar(255);comment:澶囨敞"`
-		NextVisitTime     time.Time      `json:"next_visit_time" gorm:"column:next_visit_time;type:datetime;comment:涓嬫鍥炶鏃堕棿"`
-		LatestServiceTime time.Time      `json:"latest_service_time" gorm:"column:latest_service_time;type:datetime;comment:鏈�鏅氭湇鍔℃椂闂�"`
-		FollowRecord      []FollowRecord `json:"follow_record" gorm:"foreignKey:ClientId"`
-		Address
-		Business
-		gorm.Model `json:"-"`
-	}
-
-	ClientSearch struct {
-		Client
-
-		Orm      *gorm.DB
-		Keyword  string
-		OrderBy  string
-		PageNum  int
-		PageSize int
-	}
-)
-
-func (Client) TableName() string {
-	return "clients"
-}
-
-func NewClientSearch(db *gorm.DB) *ClientSearch {
-	if db == nil {
-		db = mysqlx.GetDB()
-	}
-
-	return &ClientSearch{
-		Orm: db,
-	}
-}
-
-func (slf *ClientSearch) build() *gorm.DB {
-	var db = slf.Orm.Model(&Client{})
-	if slf.Keyword != "" {
-		db = db.Where("name LIKE ?", "%"+slf.Keyword+"%")
-	}
-	if slf.Id != 0 {
-		db.Where("id = ?", slf.Id)
-	}
-	if slf.Name != "" {
-		db.Where("name = ?", slf.Name)
-	}
-
-	return db
-}
-
-func (slf *ClientSearch) Create(record *Client) error {
-	var db = slf.build()
-	return db.Create(record).Error
-}
-
-func (slf *ClientSearch) Update(record *Client) error {
-	var db = slf.build()
-	return db.Updates(record).Error
-}
-
-func (slf *ClientSearch) Delete() error {
-	var db = slf.build()
-	return db.Delete(&Client{}).Error
-}
-
-func (slf *ClientSearch) SetId(id int) *ClientSearch {
-	slf.Id = id
-	return slf
-}
-
-func (slf *ClientSearch) SetName(name string) *ClientSearch {
-	slf.Name = name
-	return slf
-}
-
-func (slf *ClientSearch) SetNumber(number string) *ClientSearch {
-	slf.Number = number
-	return slf
-}
-
-func (slf *ClientSearch) First() (*Client, error) {
-	var db = slf.build()
-	var record = &Client{}
-	err := db.First(record).Error
-	return record, err
-}
-
-func (slf *ClientSearch) Find() ([]*Client, int64, error) {
-	var db = slf.build()
-	var records = make([]*Client, 0)
-	var total int64
-	if err := db.Count(&total).Error; err != nil {
-		return records, total, err
-	}
-	if slf.PageNum > 0 && slf.PageSize > 0 {
-		db = db.Limit(slf.PageSize).Offset((slf.PageNum - 1) * slf.PageSize)
-	}
-
-	err := db.Preload("ClientStatus").Preload("ClientType").Preload("ClientOrigin").Preload("ClientLevel").Preload("FollowRecord").Preload("EnterpriseNature").Preload("RegisteredCapital").Preload("Industry").Preload("EnterpriseScale").Preload("Contacts").Preload("Country").Preload("Province").Preload("City").Preload("Region").Find(&records).Error
-	return records, total, err
-}
-
-func (slf *ClientSearch) UpdateByMap(data map[string]interface{}) error {
-	var db = slf.build()
-	return db.Updates(data).Error
-}
-
-func (slf *ClientSearch) SetKeyword(keyword string) *ClientSearch {
-	slf.Keyword = keyword
-	return slf
-}
-
-func (slf *ClientSearch) SetPage(page, size int) *ClientSearch {
-	slf.PageNum, slf.PageSize = page, size
-	return slf
-}
-
-func (slf *ClientSearch) SetOrder(order string) *ClientSearch {
-	slf.OrderBy = order
-	return slf
-}
-func (slf *ClientSearch) SetIds(ids []int) *ClientSearch {
-	slf.Orm = slf.Orm.Where("id in (?)", ids)
-	return slf
-}
+package model
+
+import (
+	"aps_crm/pkg/mysqlx"
+	"gorm.io/gorm"
+	"time"
+)
+
+type (
+	Client struct {
+		Id                int            `json:"id" gorm:"column:id;primaryKey;autoIncrement;not null"`
+		Name              string         `json:"name" gorm:"column:name;unique;type:varchar(255);comment:瀹㈡埛鍚嶇О"`
+		Number            string         `json:"number" gorm:"column:number;type:varchar(255);comment:瀹㈡埛缂栧彿"`
+		ClientStatusId    int            `json:"client_status_id" gorm:"column:client_status_id;type:int(11);comment:瀹㈡埛鐘舵�両D"`
+		ClientStatus      ClientStatus   `json:"client_status" gorm:"foreignKey:ClientStatusId"`
+		ClientTypeId      int            `json:"client_type_id" gorm:"column:client_type_id;type:int(11);comment:瀹㈡埛绫诲瀷ID"`
+		ClientType        ClientType     `json:"client_type" gorm:"foreignKey:ClientTypeId"`
+		ClientOriginId    int            `json:"client_origin_id" gorm:"column:client_origin_id;type:int(11);comment:瀹㈡埛鏉ユ簮ID"`
+		ClientOrigin      ClientOrigin   `json:"client_origin" gorm:"foreignKey:ClientOriginId"`
+		ClientLevelId     int            `json:"client_level_id" gorm:"column:client_level_id;type:int(11);comment:瀹㈡埛绛夌骇ID"`
+		ClientLevel       ClientLevel    `json:"client_level" gorm:"foreignKey:ClientLevelId"`
+		Contacts          []Contact      `json:"contacts" gorm:"foreignKey:ClientId"`
+		MemberId          int            `json:"member_id" gorm:"column:member_id;type:int(11);comment:閿�鍞礋璐d汉ID"`
+		ServiceMemberId   int            `json:"service_member_id" gorm:"column:service_member_id;type:int(11);comment:鏈嶅姟璐熻矗浜篒D"`
+		DetailAddress     string         `json:"detail_address" gorm:"column:detail_address;type:varchar(255);comment:璇︾粏鍦板潃"`
+		Remark            string         `json:"remark" gorm:"column:remark;type:varchar(255);comment:澶囨敞"`
+		NextVisitTime     time.Time      `json:"next_visit_time" gorm:"column:next_visit_time;type:datetime;comment:涓嬫鍥炶鏃堕棿"`
+		LatestServiceTime time.Time      `json:"latest_service_time" gorm:"column:latest_service_time;type:datetime;comment:鏈�鏅氭湇鍔℃椂闂�"`
+		FollowRecord      []FollowRecord `json:"follow_record" gorm:"foreignKey:ClientId"`
+		Address
+		Business
+		gorm.Model `json:"-"`
+	}
+
+	ClientSearch struct {
+		Client
+
+		Orm      *gorm.DB
+		Keyword  string
+		OrderBy  string
+		PageNum  int
+		PageSize int
+	}
+)
+
+func (Client) TableName() string {
+	return "clients"
+}
+
+func NewClientSearch(db *gorm.DB) *ClientSearch {
+	if db == nil {
+		db = mysqlx.GetDB()
+	}
+
+	return &ClientSearch{
+		Orm: db,
+	}
+}
+
+func (slf *ClientSearch) build() *gorm.DB {
+	var db = slf.Orm.Model(&Client{})
+	if slf.Keyword != "" {
+		db = db.Where("name LIKE ?", "%"+slf.Keyword+"%")
+	}
+	if slf.Id != 0 {
+		db.Where("id = ?", slf.Id)
+	}
+	if slf.Name != "" {
+		db.Where("name = ?", slf.Name)
+	}
+
+	return db
+}
+
+func (slf *ClientSearch) Create(record *Client) error {
+	var db = slf.build()
+	return db.Create(record).Error
+}
+
+func (slf *ClientSearch) Update(record *Client) error {
+	var db = slf.build()
+	return db.Updates(record).Error
+}
+
+func (slf *ClientSearch) Delete() error {
+	var db = slf.build()
+	return db.Delete(&Client{}).Error
+}
+
+func (slf *ClientSearch) SetId(id int) *ClientSearch {
+	slf.Id = id
+	return slf
+}
+
+func (slf *ClientSearch) SetName(name string) *ClientSearch {
+	slf.Name = name
+	return slf
+}
+
+func (slf *ClientSearch) SetNumber(number string) *ClientSearch {
+	slf.Number = number
+	return slf
+}
+
+func (slf *ClientSearch) First() (*Client, error) {
+	var db = slf.build()
+	var record = &Client{}
+	err := db.First(record).Error
+	return record, err
+}
+
+func (slf *ClientSearch) Find() ([]*Client, int64, error) {
+	var db = slf.build()
+	var records = make([]*Client, 0)
+	var total int64
+	if err := db.Count(&total).Error; err != nil {
+		return records, total, err
+	}
+	if slf.PageNum > 0 && slf.PageSize > 0 {
+		db = db.Limit(slf.PageSize).Offset((slf.PageNum - 1) * slf.PageSize)
+	}
+
+	err := db.Preload("ClientStatus").Preload("ClientType").Preload("ClientOrigin").Preload("ClientLevel").Preload("FollowRecord").Preload("EnterpriseNature").Preload("RegisteredCapital").Preload("Industry").Preload("EnterpriseScale").Preload("Contacts").Preload("Country").Preload("Province").Preload("City").Preload("Region").Find(&records).Error
+	return records, total, err
+}
+
+func (slf *ClientSearch) UpdateByMap(data map[string]interface{}) error {
+	var db = slf.build()
+	return db.Updates(data).Error
+}
+
+func (slf *ClientSearch) SetKeyword(keyword string) *ClientSearch {
+	slf.Keyword = keyword
+	return slf
+}
+
+func (slf *ClientSearch) SetPage(page, size int) *ClientSearch {
+	slf.PageNum, slf.PageSize = page, size
+	return slf
+}
+
+func (slf *ClientSearch) SetOrder(order string) *ClientSearch {
+	slf.OrderBy = order
+	return slf
+}
+func (slf *ClientSearch) SetIds(ids []int) *ClientSearch {
+	slf.Orm = slf.Orm.Where("id in (?)", ids)
+	return slf
+}
diff --git a/model/followRecord.go b/model/followRecord.go
index 5a2ab82..7107b14 100644
--- a/model/followRecord.go
+++ b/model/followRecord.go
@@ -1,185 +1,185 @@
-package model
-
-import (
-	"aps_crm/pkg/mysqlx"
-	"gorm.io/gorm"
-	"time"
-)
-
-type (
-	FollowRecord struct {
-		Id                   int       `json:"id" gorm:"column:id;primary_key;AUTO_INCREMENT"`
-		ClientId             int       `json:"client_id" gorm:"column:client_id;type:int(11);comment:瀹㈡埛id"`
-		ClientStatusId       int       `json:"client_status_id" gorm:"column:client_status_id;type:int(11);comment:瀹㈡埛鐘舵�乮d"`
-		MemberId             int       `json:"member_id" gorm:"column:member_id;type:int(11);comment:璺熻繘浜篿d"`
-		Number               string    `json:"number" gorm:"column:number;type:varchar(255);comment:璺熻繘缂栧彿"`
-		ContactId            int       `json:"contact_id" gorm:"column:contact_id;type:int(11);comment:鑱旂郴浜篿d"`
-		Topic                string    `json:"topic" gorm:"column:topic;type:varchar(255);comment:璺熻繘涓婚"`
-		Record               string    `json:"record" gorm:"column:record;type:MEDIUMTEXT;comment:璺熻繘璁板綍"`
-		SaleChanceId         int       `json:"sale_chance_id" gorm:"column:sale_chance_id;type:int(11);comment:閿�鍞満浼歩d"`
-		SalesLeadsId         int       `json:"sales_leads_id" gorm:"column:sales_leads_id;type:int(11);comment:閿�鍞嚎绱d"`
-		ContactInformationId int       `json:"contact_information_id" gorm:"column:contact_information_id;type:int(11);comment:鑱旂郴鏂瑰紡id"`
-		FollowTime           time.Time `json:"follow_time" gorm:"column:follow_time;type:datetime;comment:璺熻繘鏃堕棿"`
-		NextFollowTime       time.Time `json:"next_follow_time" gorm:"column:next_follow_time;type:datetime;comment:涓嬫璺熻繘鏃堕棿"`
-		Purpose              string    `json:"purpose" gorm:"column:purpose;type:varchar(255);comment:璺熻繘鐩殑"`
-		Content              string    `json:"content" gorm:"column:content;type:MEDIUMTEXT;comment:璺熻繘鍐呭"`
-		Client               Client    `json:"client" gorm:"foreignKey:ClientId"`
-		Contact              Contact   `json:"contact" gorm:"foreignKey:ContactId"`
-		gorm.Model           `json:"-"`
-	}
-
-	FollowRecordSearch struct {
-		FollowRecord
-
-		Orm      *gorm.DB
-		Keyword  string
-		OrderBy  string
-		PageNum  int
-		PageSize int
-	}
-)
-
-func (FollowRecord) TableName() string {
-	return "follow_records"
-}
-
-func NewFollowRecordSearch() *FollowRecordSearch {
-	return &FollowRecordSearch{
-		Orm: mysqlx.GetDB(),
-	}
-}
-
-func (slf *FollowRecordSearch) build() *gorm.DB {
-	var db = slf.Orm.Model(&FollowRecord{})
-	if slf.Keyword != "" {
-		db = db.Where("name LIKE ?", "%"+slf.Keyword+"%")
-	}
-	if slf.Keyword != "" {
-		db = db.Where("topic LIKE ?", "%"+slf.Keyword+"%")
-	}
-	if slf.Id != 0 {
-		db = db.Where("id = ?", slf.Id)
-	}
-	if slf.ClientId != 0 {
-		db = db.Where("client_id = ?", slf.ClientId)
-	}
-	if slf.ClientStatusId != 0 {
-		db = db.Where("client_status_id = ?", slf.ClientStatusId)
-	}
-	if slf.MemberId != 0 {
-		db = db.Where("member_id = ?", slf.MemberId)
-	}
-	if slf.Number != "" {
-		db = db.Where("number = ?", slf.Number)
-	}
-	if slf.ContactId != 0 {
-		db = db.Where("contact_id = ?", slf.ContactId)
-	}
-	if slf.Topic != "" {
-		db = db.Where("topic = ?", slf.Topic)
-	}
-	if slf.Record != "" {
-		db = db.Where("record = ?", slf.Record)
-	}
-	if slf.SaleChanceId != 0 {
-		db = db.Where("sale_chance_id = ?", slf.SaleChanceId)
-	}
-	if slf.SalesLeadsId != 0 {
-		db = db.Where("sales_leads_id = ?", slf.SalesLeadsId)
-	}
-	if slf.ContactInformationId != 0 {
-		db = db.Where("contact_information_id = ?", slf.ContactInformationId)
-	}
-	if !slf.FollowTime.IsZero() {
-		db = db.Where("follow_time = ?", slf.FollowTime)
-	}
-	if !slf.NextFollowTime.IsZero() {
-		db = db.Where("next_follow_time = ?", slf.NextFollowTime)
-	}
-	if slf.Purpose != "" {
-		db = db.Where("purpose = ?", slf.Purpose)
-	}
-	if slf.Content != "" {
-		db = db.Where("content = ?", slf.Content)
-	}
-
-	return db
-}
-
-func (slf *FollowRecordSearch) First() (*FollowRecord, error) {
-	var record = new(FollowRecord)
-	err := slf.build().First(record).Error
-	return record, err
-}
-
-func (slf *FollowRecordSearch) FindAll() ([]*FollowRecord, int64, error) {
-	var db = slf.build()
-	var records = make([]*FollowRecord, 0)
-	var total int64
-	if err := db.Count(&total).Error; err != nil {
-		return records, total, err
-	}
-	if slf.PageNum > 0 && slf.PageSize > 0 {
-		db = db.Limit(slf.PageSize).Offset((slf.PageNum - 1) * slf.PageSize)
-	}
-
-	err := db.Preload("Client").Preload("Contact").Find(&records).Error
-	return records, total, err
-}
-
-func (slf *FollowRecordSearch) Count() (int64, error) {
-	var count int64
-	err := slf.build().Count(&count).Error
-	return count, err
-}
-
-func (slf *FollowRecordSearch) Page(page, pageSize int) ([]*FollowRecord, int64, error) {
-	var records = make([]*FollowRecord, 0)
-	var count int64
-	err := slf.build().Count(&count).Error
-	if err != nil {
-		return records, count, err
-	}
-	err = slf.build().Offset((page - 1) * pageSize).Limit(pageSize).Find(&records).Error
-	return records, count, err
-}
-
-func (slf *FollowRecordSearch) Create(record *FollowRecord) error {
-	var db = slf.build()
-	return db.Create(record).Error
-}
-
-func (slf *FollowRecordSearch) Update(record *FollowRecord) error {
-	var db = slf.build()
-	return db.Updates(record).Error
-}
-
-func (slf *FollowRecordSearch) Delete() error {
-	var db = slf.build()
-	return db.Delete(&slf.FollowRecord).Error
-}
-
-func (slf *FollowRecordSearch) SetId(id int) *FollowRecordSearch {
-	slf.Id = id
-	return slf
-}
-
-func (slf *FollowRecordSearch) SetClientId(clientId int) *FollowRecordSearch {
-	slf.ClientId = clientId
-	return slf
-}
-
-func (slf *FollowRecordSearch) SetKeyword(keyword string) *FollowRecordSearch {
-	slf.Keyword = keyword
-	return slf
-}
-
-func (slf *FollowRecordSearch) SetPage(page, size int) *FollowRecordSearch {
-	slf.PageNum, slf.PageSize = page, size
-	return slf
-}
-
-func (slf *FollowRecordSearch) SetOrder(order string) *FollowRecordSearch {
-	slf.OrderBy = order
-	return slf
-}
+package model
+
+import (
+	"aps_crm/pkg/mysqlx"
+	"gorm.io/gorm"
+	"time"
+)
+
+type (
+	FollowRecord struct {
+		Id                   int       `json:"id" gorm:"column:id;primary_key;AUTO_INCREMENT"`
+		ClientId             int       `json:"client_id" gorm:"column:client_id;type:int(11);comment:瀹㈡埛id"`
+		ClientStatusId       int       `json:"client_status_id" gorm:"column:client_status_id;type:int(11);comment:瀹㈡埛鐘舵�乮d"`
+		MemberId             int       `json:"member_id" gorm:"column:member_id;type:int(11);comment:璺熻繘浜篿d"`
+		Number               string    `json:"number" gorm:"column:number;type:varchar(255);comment:璺熻繘缂栧彿"`
+		ContactId            int       `json:"contact_id" gorm:"column:contact_id;type:int(11);comment:鑱旂郴浜篿d"`
+		Topic                string    `json:"topic" gorm:"column:topic;type:varchar(255);comment:璺熻繘涓婚"`
+		Record               string    `json:"record" gorm:"column:record;type:MEDIUMTEXT;comment:璺熻繘璁板綍"`
+		SaleChanceId         int       `json:"sale_chance_id" gorm:"column:sale_chance_id;type:int(11);comment:閿�鍞満浼歩d"`
+		SalesLeadsId         int       `json:"sales_leads_id" gorm:"column:sales_leads_id;type:int(11);comment:閿�鍞嚎绱d"`
+		ContactInformationId int       `json:"contact_information_id" gorm:"column:contact_information_id;type:int(11);comment:鑱旂郴鏂瑰紡id"`
+		FollowTime           time.Time `json:"follow_time" gorm:"column:follow_time;type:datetime;comment:璺熻繘鏃堕棿"`
+		NextFollowTime       time.Time `json:"next_follow_time" gorm:"column:next_follow_time;type:datetime;comment:涓嬫璺熻繘鏃堕棿"`
+		Purpose              string    `json:"purpose" gorm:"column:purpose;type:varchar(255);comment:璺熻繘鐩殑"`
+		Content              string    `json:"content" gorm:"column:content;type:MEDIUMTEXT;comment:璺熻繘鍐呭"`
+		Client               Client    `json:"client" gorm:"foreignKey:ClientId"`
+		Contact              Contact   `json:"contact" gorm:"foreignKey:ContactId"`
+		gorm.Model           `json:"-"`
+	}
+
+	FollowRecordSearch struct {
+		FollowRecord
+
+		Orm      *gorm.DB
+		Keyword  string
+		OrderBy  string
+		PageNum  int
+		PageSize int
+	}
+)
+
+func (FollowRecord) TableName() string {
+	return "follow_records"
+}
+
+func NewFollowRecordSearch() *FollowRecordSearch {
+	return &FollowRecordSearch{
+		Orm: mysqlx.GetDB(),
+	}
+}
+
+func (slf *FollowRecordSearch) build() *gorm.DB {
+	var db = slf.Orm.Model(&FollowRecord{})
+	if slf.Keyword != "" {
+		db = db.Where("name LIKE ?", "%"+slf.Keyword+"%")
+	}
+	if slf.Keyword != "" {
+		db = db.Where("topic LIKE ?", "%"+slf.Keyword+"%")
+	}
+	if slf.Id != 0 {
+		db = db.Where("id = ?", slf.Id)
+	}
+	if slf.ClientId != 0 {
+		db = db.Where("client_id = ?", slf.ClientId)
+	}
+	if slf.ClientStatusId != 0 {
+		db = db.Where("client_status_id = ?", slf.ClientStatusId)
+	}
+	if slf.MemberId != 0 {
+		db = db.Where("member_id = ?", slf.MemberId)
+	}
+	if slf.Number != "" {
+		db = db.Where("number = ?", slf.Number)
+	}
+	if slf.ContactId != 0 {
+		db = db.Where("contact_id = ?", slf.ContactId)
+	}
+	if slf.Topic != "" {
+		db = db.Where("topic = ?", slf.Topic)
+	}
+	if slf.Record != "" {
+		db = db.Where("record = ?", slf.Record)
+	}
+	if slf.SaleChanceId != 0 {
+		db = db.Where("sale_chance_id = ?", slf.SaleChanceId)
+	}
+	if slf.SalesLeadsId != 0 {
+		db = db.Where("sales_leads_id = ?", slf.SalesLeadsId)
+	}
+	if slf.ContactInformationId != 0 {
+		db = db.Where("contact_information_id = ?", slf.ContactInformationId)
+	}
+	if !slf.FollowTime.IsZero() {
+		db = db.Where("follow_time = ?", slf.FollowTime)
+	}
+	if !slf.NextFollowTime.IsZero() {
+		db = db.Where("next_follow_time = ?", slf.NextFollowTime)
+	}
+	if slf.Purpose != "" {
+		db = db.Where("purpose = ?", slf.Purpose)
+	}
+	if slf.Content != "" {
+		db = db.Where("content = ?", slf.Content)
+	}
+
+	return db
+}
+
+func (slf *FollowRecordSearch) First() (*FollowRecord, error) {
+	var record = new(FollowRecord)
+	err := slf.build().First(record).Error
+	return record, err
+}
+
+func (slf *FollowRecordSearch) FindAll() ([]*FollowRecord, int64, error) {
+	var db = slf.build()
+	var records = make([]*FollowRecord, 0)
+	var total int64
+	if err := db.Count(&total).Error; err != nil {
+		return records, total, err
+	}
+	if slf.PageNum > 0 && slf.PageSize > 0 {
+		db = db.Limit(slf.PageSize).Offset((slf.PageNum - 1) * slf.PageSize)
+	}
+
+	err := db.Preload("Client").Preload("Contact").Find(&records).Error
+	return records, total, err
+}
+
+func (slf *FollowRecordSearch) Count() (int64, error) {
+	var count int64
+	err := slf.build().Count(&count).Error
+	return count, err
+}
+
+func (slf *FollowRecordSearch) Page(page, pageSize int) ([]*FollowRecord, int64, error) {
+	var records = make([]*FollowRecord, 0)
+	var count int64
+	err := slf.build().Count(&count).Error
+	if err != nil {
+		return records, count, err
+	}
+	err = slf.build().Offset((page - 1) * pageSize).Limit(pageSize).Find(&records).Error
+	return records, count, err
+}
+
+func (slf *FollowRecordSearch) Create(record *FollowRecord) error {
+	var db = slf.build()
+	return db.Create(record).Error
+}
+
+func (slf *FollowRecordSearch) Update(record *FollowRecord) error {
+	var db = slf.build()
+	return db.Updates(record).Error
+}
+
+func (slf *FollowRecordSearch) Delete() error {
+	var db = slf.build()
+	return db.Delete(&slf.FollowRecord).Error
+}
+
+func (slf *FollowRecordSearch) SetId(id int) *FollowRecordSearch {
+	slf.Id = id
+	return slf
+}
+
+func (slf *FollowRecordSearch) SetClientId(clientId int) *FollowRecordSearch {
+	slf.ClientId = clientId
+	return slf
+}
+
+func (slf *FollowRecordSearch) SetKeyword(keyword string) *FollowRecordSearch {
+	slf.Keyword = keyword
+	return slf
+}
+
+func (slf *FollowRecordSearch) SetPage(page, size int) *FollowRecordSearch {
+	slf.PageNum, slf.PageSize = page, size
+	return slf
+}
+
+func (slf *FollowRecordSearch) SetOrder(order string) *FollowRecordSearch {
+	slf.OrderBy = order
+	return slf
+}
diff --git a/model/request/followRecord.go b/model/request/followRecord.go
index fb0d790..b24bda9 100644
--- a/model/request/followRecord.go
+++ b/model/request/followRecord.go
@@ -1,32 +1,32 @@
-package request
-
-type AddFollowRecord struct {
-	FollowRecord FollowRecord `json:"follow_record" binding:"required"`
-}
-
-type FollowRecord struct {
-	ClientId             int    `json:"client_id" gorm:"column:client_id;type:int(11);comment:瀹㈡埛id"`
-	ClientStatusId       int    `json:"client_status_id" gorm:"column:client_status_id;type:int(11);comment:瀹㈡埛鐘舵�乮d"`
-	MemberId             int    `json:"member_id" gorm:"column:member_id;type:int(11);comment:璺熻繘浜篿d"`
-	Number               string `json:"number" gorm:"column:number;type:varchar(255);comment:璺熻繘缂栧彿"`
-	ContactId            int    `json:"contact_id" gorm:"column:contact_id;type:int(11);comment:鑱旂郴浜篿d"`
-	Topic                string `json:"topic" gorm:"column:topic;type:varchar(255);comment:璺熻繘涓婚"`
-	Record               string `json:"record" gorm:"column:record;type:MEDIUMTEXT;comment:璺熻繘璁板綍"`
-	SaleChanceId         int    `json:"sale_chance_id" gorm:"column:sale_chance_id;type:int(11);comment:閿�鍞満浼歩d"`
-	SalesLeadsId         int    `json:"sales_leads_id" gorm:"column:sales_leads_id;type:int(11);comment:閿�鍞嚎绱d"`
-	ContactInformationId int    `json:"contact_information_id" gorm:"column:contact_information_id;type:int(11);comment:鑱旂郴鏂瑰紡id"`
-	FollowTime           string `json:"follow_time" gorm:"column:follow_time;type:datetime;comment:璺熻繘鏃堕棿"`
-	NextFollowTime       string `json:"next_follow_time" gorm:"column:next_follow_time;type:datetime;comment:涓嬫璺熻繘鏃堕棿"`
-	Purpose              string `json:"purpose" gorm:"column:purpose;type:varchar(255);comment:璺熻繘鐩殑"`
-	Content              string `json:"content" gorm:"column:content;type:varchar(255);comment:璺熻繘鍐呭"`
-}
-
-type UpdateFollowRecord struct {
-	Id           int          `json:"id" gorm:"column:id;primary_key;AUTO_INCREMENT"`
-	FollowRecord FollowRecord `json:"follow_record" binding:"required"`
-}
-
-type GetFollowRecordList struct {
-	PageInfo
-	Keyword string `json:"keyword"`
-}
+package request
+
+type AddFollowRecord struct {
+	FollowRecord FollowRecord `json:"follow_record" binding:"required"`
+}
+
+type FollowRecord struct {
+	ClientId             int    `json:"client_id" gorm:"column:client_id;type:int(11);comment:瀹㈡埛id"`
+	ClientStatusId       int    `json:"client_status_id" gorm:"column:client_status_id;type:int(11);comment:瀹㈡埛鐘舵�乮d"`
+	MemberId             int    `json:"member_id" gorm:"column:member_id;type:int(11);comment:璺熻繘浜篿d"`
+	Number               string `json:"number" gorm:"column:number;type:varchar(255);comment:璺熻繘缂栧彿"`
+	ContactId            int    `json:"contact_id" gorm:"column:contact_id;type:int(11);comment:鑱旂郴浜篿d"`
+	Topic                string `json:"topic" gorm:"column:topic;type:varchar(255);comment:璺熻繘涓婚"`
+	Record               string `json:"record" gorm:"column:record;type:MEDIUMTEXT;comment:璺熻繘璁板綍"`
+	SaleChanceId         int    `json:"sale_chance_id" gorm:"column:sale_chance_id;type:int(11);comment:閿�鍞満浼歩d"`
+	SalesLeadsId         int    `json:"sales_leads_id" gorm:"column:sales_leads_id;type:int(11);comment:閿�鍞嚎绱d"`
+	ContactInformationId int    `json:"contact_information_id" gorm:"column:contact_information_id;type:int(11);comment:鑱旂郴鏂瑰紡id"`
+	FollowTime           string `json:"follow_time" gorm:"column:follow_time;type:datetime;comment:璺熻繘鏃堕棿"`
+	NextFollowTime       string `json:"next_follow_time" gorm:"column:next_follow_time;type:datetime;comment:涓嬫璺熻繘鏃堕棿"`
+	Purpose              string `json:"purpose" gorm:"column:purpose;type:varchar(255);comment:璺熻繘鐩殑"`
+	Content              string `json:"content" gorm:"column:content;type:varchar(255);comment:璺熻繘鍐呭"`
+}
+
+type UpdateFollowRecord struct {
+	Id           int          `json:"id" gorm:"column:id;primary_key;AUTO_INCREMENT"`
+	FollowRecord FollowRecord `json:"follow_record" binding:"required"`
+}
+
+type GetFollowRecordList struct {
+	PageInfo
+	Keyword string `json:"keyword"`
+}
diff --git a/pkg/ecode/code.go b/pkg/ecode/code.go
index 0837cb4..277052b 100644
--- a/pkg/ecode/code.go
+++ b/pkg/ecode/code.go
@@ -1,391 +1,391 @@
-package ecode
-
-const (
-	OK = 200
-
-	UnknownErr                      = 2001 // 鏈煡閿欒
-	DBErr                           = 2002 // db閿欒
-	RedisErr                        = 2003 // redis閿欒
-	ParamsErr                       = 2004 // 璇锋眰鍙傛暟閿欒
-	UserNotExist                    = 2005 // 鐢ㄦ埛涓嶅瓨鍦�
-	PasswordErr                     = 2006 // 瀵嗙爜閿欒
-	UserForbidden                   = 2007 // 鐢ㄦ埛琚鐢�
-	CaptchaGenerateFailed           = 2008 // 楠岃瘉鐮佺敓鎴愬け璐�
-	CaptchaErr                      = 2009 // 楠岃瘉鐮侀敊璇�
-	CreateTokenErr                  = 2010 // 鍒涘缓token澶辫触
-	JWTInBlackList                  = 2011 // JWT鍦ㄧ櫧鍚嶅崟
-	JWTDisabled                     = 2012 // JWT澶辨晥
-	JWTEmpty                        = 2013 // JWT涓虹┖
-	JWTExpire                       = 2014 // JWT杩囨湡
-	JWTParseErr                     = 2015 // JWT瑙f瀽澶辫触
-	UserNameExistErr                = 2016 // 鐢ㄦ埛鍚嶅凡瀛樺湪
-	ChildrenExistErr                = 2017 // 瀛樺湪瀛愯彍鍗�
-	MenuNotExist                    = 2018 // 鑿滃崟涓嶅瓨鍦�
-	MenuNameExistErr                = 2019 // 鑿滃崟鍚嶅凡瀛樺湪
-	DeviceIPExistErr                = 2020 // 璇ヨ澶嘔P宸插瓨鍦�
-	DeviceInstallRancherErr         = 2021 // 瀹夎rancher澶辫触
-	ClusterNameExistErr             = 2022 // 瑭查泦缇ゅ凡缍撳瓨鍦�
-	CreateDatabaseErr               = 2023 // 鍒涘缓鏁版嵁搴撻敊璇�
-	CreateDatabaseUserErr           = 2024 // 鍒涘缓鏁版嵁搴撶敤鎴烽敊璇�
-	CreateClusterErr                = 2025 // 鍒涘缓闆嗙兢澶辫触
-	GetClusterErr                   = 2026 // 鑾峰彇闆嗙兢澶辫触
-	GetClusterKubeConfigErr         = 2027 // 鑾峰彇kube config澶辫触
-	ClusterInstallDockerErr         = 2028 // 瀹夎docker澶辫触
-	ClusterInstallKubectlErr        = 2029 // 瀹夎kubectl澶辫触
-	ClusterDeployKubernetesRolesErr = 2030 // 閮ㄧ讲kubernetes瑙掕壊澶辫触
-	ClusterGetNodeCommandErr        = 2031 // 鑾峰彇node command澶辫触
-	UserHasCluster                  = 2032 // 鍒犻櫎鐢ㄦ埛澶辫触锛岃鐢ㄦ埛涓嬪瓨鍦ㄩ泦缇�
-	NoPowerErr                      = 2033 //銆�娌℃湁鏉冮檺
-	UploadImageErr                  = 2034 //銆�涓婁紶鍥惧儚澶辫触
-
-	InvalidParams = 100001 // 璇锋眰鍙傛暟閿欒
-
-	CountryExist      = 200001 // 鍥藉宸插瓨鍦�
-	CountryNotExist   = 200002 // 鍥藉涓嶅瓨鍦�
-	CountryGetListErr = 200003 // 鑾峰彇鍥藉鍒楄〃澶辫触
-
-	ProvinceExist      = 300001 // 鐪佷唤宸插瓨鍦�
-	ProvinceNotExist   = 300002 // 鐪佷唤涓嶅瓨鍦�
-	ProvinceGetListErr = 300003 // 鑾峰彇鐪佷唤鍒楄〃澶辫触
-	ProvinceSetErr     = 300004 // 璁剧疆鐪佷唤澶辫触
-
-	CityExist     = 400001 // 鍩庡競宸插瓨鍦�
-	CityNotExist  = 400002 // 鍩庡競涓嶅瓨鍦�
-	CityListErr   = 400003 // 鑾峰彇鍩庡競鍒楄〃澶辫触
-	CitySetErr    = 400004 // 璁剧疆鍩庡競澶辫触
-	CityDeleteErr = 400005 // 鍒犻櫎鍩庡競澶辫触
-
-	RegionExist    = 500001 // 鍖哄幙宸插瓨鍦�
-	RegionNotExist = 500002 // 鍖哄幙涓嶅瓨鍦�
-	RegionListErr  = 500003 // 鑾峰彇鍖哄幙鍒楄〃澶辫触
-	RegionSetErr   = 500004 // 璁剧疆鍖哄幙澶辫触
-
-	ContactExist     = 600001 // 鑱旂郴浜哄凡瀛樺湪
-	ContactNotExist  = 600002 // 鑱旂郴浜轰笉瀛樺湪
-	ContactListErr   = 600003 // 鑾峰彇鑱旂郴浜哄垪琛ㄥけ璐�
-	ContactDeleteErr = 600004 // 鍒犻櫎鑱旂郴浜哄け璐�
-	ContactUpdateErr = 600005 // 鏇存柊鑱旂郴浜哄け璐�
-
-	ClientExist     = 700001 // 瀹㈡埛宸插瓨鍦�
-	ClientNotExist  = 700002 // 瀹㈡埛涓嶅瓨鍦�
-	ClientListErr   = 700003 // 鑾峰彇瀹㈡埛鍒楄〃澶辫触
-	ClientDeleteErr = 700004 // 鍒犻櫎瀹㈡埛澶辫触
-	ClientUpdateErr = 700005 // 鏇存柊瀹㈡埛澶辫触
-
-	ClientStatusExist    = 800001 // 瀹㈡埛鐘舵�佸凡瀛樺湪
-	ClientStatusNotExist = 800002 // 瀹㈡埛鐘舵�佷笉瀛樺湪
-	ClientStatusListErr  = 800003 // 鑾峰彇瀹㈡埛鐘舵�佸垪琛ㄥけ璐�
-	ClientStatusSetErr   = 800004 // 璁剧疆瀹㈡埛鐘舵�佸け璐�
-
-	ClientTypeExist    = 900001 // 瀹㈡埛绫诲瀷宸插瓨鍦�
-	ClientTypeNotExist = 900002 // 瀹㈡埛绫诲瀷涓嶅瓨鍦�
-	ClientTypeListErr  = 900003 // 鑾峰彇瀹㈡埛绫诲瀷鍒楄〃澶辫触
-	ClientTypeSetErr   = 900004 // 璁剧疆瀹㈡埛绫诲瀷澶辫触
-
-	ClientOriginExist    = 1000001 // 瀹㈡埛鏉ユ簮宸插瓨鍦�
-	ClientOriginNotExist = 1000002 // 瀹㈡埛鏉ユ簮涓嶅瓨鍦�
-	ClientOriginListErr  = 1000003 // 鑾峰彇瀹㈡埛鏉ユ簮鍒楄〃澶辫触
-	ClientOriginSetErr   = 1000004 // 璁剧疆瀹㈡埛鏉ユ簮澶辫触
-
-	ClientLevelExist     = 1100001 // 瀹㈡埛绾у埆宸插瓨鍦�
-	ClientLevelNotExist  = 1100002 // 瀹㈡埛绾у埆涓嶅瓨鍦�
-	ClientLevelListErr   = 1100003 // 鑾峰彇瀹㈡埛绾у埆鍒楄〃澶辫触
-	ClientLevelSetErr    = 1100004 // 璁剧疆瀹㈡埛绾у埆澶辫触
-	ClientLevelUpdateErr = 1100005 // 鏇存柊瀹㈡埛绾у埆澶辫触
-
-	IndustryExist     = 1200001 // 琛屼笟宸插瓨鍦�
-	IndustryNotExist  = 1200002 // 琛屼笟涓嶅瓨鍦�
-	IndustryListErr   = 1200003 // 鑾峰彇琛屼笟鍒楄〃澶辫触
-	IndustrySetErr    = 1200004 // 璁剧疆琛屼笟澶辫触
-	IndustryUpdateErr = 1200005 // 鏇存柊琛屼笟澶辫触
-
-	EnterpriseNatureExist     = 1300001 // 浼佷笟鎬ц川宸插瓨鍦�
-	EnterpriseNatureNotExist  = 1300002 // 浼佷笟鎬ц川涓嶅瓨鍦�
-	EnterpriseNatureListErr   = 1300003 // 鑾峰彇浼佷笟鎬ц川鍒楄〃澶辫触
-	EnterpriseNatureSetErr    = 1300004 // 璁剧疆浼佷笟鎬ц川澶辫触
-	EnterpriseNatureUpdateErr = 1300005 // 鏇存柊浼佷笟鎬ц川澶辫触
-
-	RegisteredCapitalExist     = 1400001 // 娉ㄥ唽璧勬湰宸插瓨鍦�
-	RegisteredCapitalNotExist  = 1400002 // 娉ㄥ唽璧勬湰涓嶅瓨鍦�
-	RegisteredCapitalListErr   = 1400003 // 鑾峰彇娉ㄥ唽璧勬湰鍒楄〃澶辫触
-	RegisteredCapitalSetErr    = 1400004 // 璁剧疆娉ㄥ唽璧勬湰澶辫触
-	RegisteredCapitalUpdateErr = 1400005 // 鏇存柊娉ㄥ唽璧勬湰澶辫触
-
-	EnterpriseScaleExist     = 1500001 // 浼佷笟瑙勬ā宸插瓨鍦�
-	EnterpriseScaleNotExist  = 1500002 // 浼佷笟瑙勬ā涓嶅瓨鍦�
-	EnterpriseScaleListErr   = 1500003 // 鑾峰彇浼佷笟瑙勬ā鍒楄〃澶辫触
-	EnterpriseScaleSetErr    = 1500004 // 璁剧疆浼佷笟瑙勬ā澶辫触
-	EnterpriseScaleUpdateErr = 1500005 // 鏇存柊浼佷笟瑙勬ā澶辫触
-
-	SalesLeadsExist     = 1600001 // 閿�鍞嚎绱㈠凡瀛樺湪
-	SalesLeadsNotExist  = 1600002 // 閿�鍞嚎绱笉瀛樺湪
-	SalesLeadsListErr   = 1600003 // 鑾峰彇閿�鍞嚎绱㈠垪琛ㄥけ璐�
-	SalesLeadsSetErr    = 1600004 // 璁剧疆閿�鍞嚎绱㈠け璐�
-	SalesLeadsUpdateErr = 1600005 // 鏇存柊閿�鍞嚎绱㈠け璐�
-	SalesLeadsDeleteErr = 1600006 // 鍒犻櫎閿�鍞嚎绱㈠け璐�
-
-	SalesSourceExist     = 1700001 // 閿�鍞嚎绱㈡潵婧愬凡瀛樺湪
-	SalesSourceNotExist  = 1700002 // 閿�鍞嚎绱㈡潵婧愪笉瀛樺湪
-	SalesSourceListErr   = 1700003 // 鑾峰彇閿�鍞嚎绱㈡潵婧愬垪琛ㄥけ璐�
-	SalesSourceSetErr    = 1700004 // 璁剧疆閿�鍞嚎绱㈡潵婧愬け璐�
-	SalesSourceUpdateErr = 1700005 // 鏇存柊閿�鍞嚎绱㈡潵婧愬け璐�
-
-	FollowRecordExist     = 1800001 // 璺熻繘璁板綍宸插瓨鍦�
-	FollowRecordNotExist  = 1800002 // 璺熻繘璁板綍涓嶅瓨鍦�
-	FollowRecordListErr   = 1800003 // 鑾峰彇璺熻繘璁板綍鍒楄〃澶辫触
-	FollowRecordSetErr    = 1800004 // 璁剧疆璺熻繘璁板綍澶辫触
-	FollowRecordUpdateErr = 1800005 // 鏇存柊璺熻繘璁板綍澶辫触
-	FollowRecordDeleteErr = 1800006 // 鍒犻櫎璺熻繘璁板綍澶辫触
-
-	SaleChanceExist     = 1900001 // 閿�鍞満浼氬凡瀛樺湪
-	SaleChanceNotExist  = 1900002 // 閿�鍞満浼氫笉瀛樺湪
-	SaleChanceListErr   = 1900003 // 鑾峰彇閿�鍞満浼氬垪琛ㄥけ璐�
-	SaleChanceSetErr    = 1900004 // 璁剧疆閿�鍞満浼氬け璐�
-	SaleChanceUpdateErr = 1900005 // 鏇存柊閿�鍞満浼氬け璐�
-	SaleChanceDeleteErr = 1900006 // 鍒犻櫎閿�鍞満浼氬け璐�
-
-	SaleStageExist    = 2000001 // 閿�鍞樁娈靛凡瀛樺湪
-	SaleStageNotExist = 2000002 // 閿�鍞樁娈典笉瀛樺湪
-	SaleStageListErr  = 2000003 // 鑾峰彇閿�鍞樁娈靛垪琛ㄥけ璐�
-	SaleStageSetErr   = 2000004 // 璁剧疆閿�鍞樁娈靛け璐�
-
-	SaleTypeExist     = 2100001 // 閿�鍞被鍨嬪凡瀛樺湪
-	SaleTypeNotExist  = 2100002 // 閿�鍞被鍨嬩笉瀛樺湪
-	SaleTypeListErr   = 2100003 // 鑾峰彇閿�鍞被鍨嬪垪琛ㄥけ璐�
-	SaleTypeSetErr    = 2100004 // 璁剧疆閿�鍞被鍨嬪け璐�
-	SaleTypeUpdateErr = 2100005 // 鏇存柊閿�鍞被鍨嬪け璐�
-	SaleTypeDeleteErr = 2100006 // 鍒犻櫎閿�鍞被鍨嬪け璐�
-
-	RegularCustomersExist     = 2200001 // 鍥哄畾瀹㈡埛宸插瓨鍦�
-	RegularCustomersNotExist  = 2200002 // 鍥哄畾瀹㈡埛涓嶅瓨鍦�
-	RegularCustomersListErr   = 2200003 // 鑾峰彇鍥哄畾瀹㈡埛鍒楄〃澶辫触
-	RegularCustomersSetErr    = 2200004 // 璁剧疆鍥哄畾瀹㈡埛澶辫触
-	RegularCustomersUpdateErr = 2200005 // 鏇存柊鍥哄畾瀹㈡埛澶辫触
-	RegularCustomersDeleteErr = 2200006 // 鍒犻櫎鍥哄畾瀹㈡埛澶辫触
-
-	PossibilityExist     = 2300001 // 閿�鍞満浼氬彲鑳芥�у凡瀛樺湪
-	PossibilityNotExist  = 2300002 // 閿�鍞満浼氬彲鑳芥�т笉瀛樺湪
-	PossibilityListErr   = 2300003 // 鑾峰彇閿�鍞満浼氬彲鑳芥�у垪琛ㄥけ璐�
-	PossibilitySetErr    = 2300004 // 璁剧疆閿�鍞満浼氬彲鑳芥�уけ璐�
-	PossibilityUpdateErr = 2300005 // 鏇存柊閿�鍞満浼氬彲鑳芥�уけ璐�
-	PossibilityDeleteErr = 2300006 // 鍒犻櫎閿�鍞満浼氬彲鑳芥�уけ璐�
-
-	StatusExist     = 2400001 // 閿�鍞満浼氱姸鎬佸凡瀛樺湪
-	StatusNotExist  = 2400002 // 閿�鍞満浼氱姸鎬佷笉瀛樺湪
-	StatusListErr   = 2400003 // 鑾峰彇閿�鍞満浼氱姸鎬佸垪琛ㄥけ璐�
-	StatusSetErr    = 2400004 // 璁剧疆閿�鍞満浼氱姸鎬佸け璐�
-	StatusUpdateErr = 2400005 // 鏇存柊閿�鍞満浼氱姸鎬佸け璐�
-	StatusDeleteErr = 2400006 // 鍒犻櫎閿�鍞満浼氱姸鎬佸け璐�
-
-	QuotationExist     = 2500001 // 鎶ヤ环鍗曞凡瀛樺湪
-	QuotationNotExist  = 2500002 // 鎶ヤ环鍗曚笉瀛樺湪
-	QuotationListErr   = 2500003 // 鑾峰彇鎶ヤ环鍗曞垪琛ㄥけ璐�
-	QuotationSetErr    = 2500004 // 璁剧疆鎶ヤ环鍗曞け璐�
-	QuotationUpdateErr = 2500005 // 鏇存柊鎶ヤ环鍗曞け璐�
-	QuotationDeleteErr = 2500006 // 鍒犻櫎鎶ヤ环鍗曞け璐�
-
-	MasterOrderExist     = 2600001 // 涓昏鍗曞凡瀛樺湪
-	MasterOrderNotExist  = 2600002 // 涓昏鍗曚笉瀛樺湪
-	MasterOrderListErr   = 2600003 // 鑾峰彇涓昏鍗曞垪琛ㄥけ璐�
-	MasterOrderSetErr    = 2600004 // 璁剧疆涓昏鍗曞け璐�
-	MasterOrderUpdateErr = 2600005 // 鏇存柊涓昏鍗曞け璐�
-	MasterOrderDeleteErr = 2600006 // 鍒犻櫎涓昏鍗曞け璐�
-
-	SubOrderExist     = 2700001 // 瀛愯鍗曞凡瀛樺湪
-	SubOrderNotExist  = 2700002 // 瀛愯鍗曚笉瀛樺湪
-	SubOrderListErr   = 2700003 // 鑾峰彇瀛愯鍗曞垪琛ㄥけ璐�
-	SubOrderSetErr    = 2700004 // 璁剧疆瀛愯鍗曞け璐�
-	SubOrderUpdateErr = 2700005 // 鏇存柊瀛愯鍗曞け璐�
-	SubOrderDeleteErr = 2700006 // 鍒犻櫎瀛愯鍗曞け璐�
-
-	SalesDetailsExist     = 2800001 // 閿�鍞槑缁嗗凡瀛樺湪
-	SalesDetailsNotExist  = 2800002 // 閿�鍞槑缁嗕笉瀛樺湪
-	SalesDetailsListErr   = 2800003 // 鑾峰彇閿�鍞槑缁嗗垪琛ㄥけ璐�
-	SalesDetailsSetErr    = 2800004 // 璁剧疆閿�鍞槑缁嗗け璐�
-	SalesDetailsUpdateErr = 2800005 // 鏇存柊閿�鍞槑缁嗗け璐�
-	SalesDetailsDeleteErr = 2800006 // 鍒犻櫎閿�鍞槑缁嗗け璐�
-
-	SalesReturnExist     = 2900001 // 閿�鍞��璐у崟宸插瓨鍦�
-	SalesReturnNotExist  = 2900002 // 閿�鍞��璐у崟涓嶅瓨鍦�
-	SalesReturnListErr   = 2900003 // 鑾峰彇閿�鍞��璐у崟鍒楄〃澶辫触
-	SalesReturnSetErr    = 2900004 // 璁剧疆閿�鍞��璐у崟澶辫触
-	SalesReturnUpdateErr = 2900005 // 鏇存柊閿�鍞��璐у崟澶辫触
-	SalesReturnDeleteErr = 2900006 // 鍒犻櫎閿�鍞��璐у崟澶辫触
-
-	SalesRefundExist     = 3000001 // 閿�鍞��娆惧崟宸插瓨鍦�
-	SalesRefundNotExist  = 3000002 // 閿�鍞��娆惧崟涓嶅瓨鍦�
-	SalesRefundListErr   = 3000003 // 鑾峰彇閿�鍞��娆惧崟鍒楄〃澶辫触
-	SalesRefundSetErr    = 3000004 // 璁剧疆閿�鍞��娆惧崟澶辫触
-	SalesRefundUpdateErr = 3000005 // 鏇存柊閿�鍞��娆惧崟澶辫触
-	SalesRefundDeleteErr = 3000006 // 鍒犻櫎閿�鍞��娆惧崟澶辫触
-
-	ContractExist     = 3100001 // 鍚堝悓宸插瓨鍦�
-	ContractNotExist  = 3100002 // 鍚堝悓涓嶅瓨鍦�
-	ContractListErr   = 3100003 // 鑾峰彇鍚堝悓鍒楄〃澶辫触
-	ContractSetErr    = 3100004 // 璁剧疆鍚堝悓澶辫触
-	ContractUpdateErr = 3100005 // 鏇存柊鍚堝悓澶辫触
-	ContractDeleteErr = 3100006 // 鍒犻櫎鍚堝悓澶辫触
-
-	PlanExist     = 3200001 // 璁″垝宸插瓨鍦�
-	PlanNotExist  = 3200002 // 璁″垝涓嶅瓨鍦�
-	PlanListErr   = 3200003 // 鑾峰彇璁″垝鍒楄〃澶辫触
-	PlanSetErr    = 3200004 // 璁剧疆璁″垝澶辫触
-	PlanUpdateErr = 3200005 // 鏇存柊璁″垝澶辫触
-	PlanDeleteErr = 3200006 // 鍒犻櫎璁″垝澶辫触
-
-	SContractExist     = 3300001 // 鏈嶅姟鍚堝悓宸插瓨鍦�
-	SContractNotExist  = 3300002 // 鏈嶅姟鍚堝悓涓嶅瓨鍦�
-	SContractListErr   = 3300003 // 鑾峰彇鏈嶅姟鍚堝悓鍒楄〃澶辫触
-	SContractSetErr    = 3300004 // 璁剧疆鏈嶅姟鍚堝悓澶辫触
-	SContractUpdateErr = 3300005 // 鏇存柊鏈嶅姟鍚堝悓澶辫触
-	SContractDeleteErr = 3300006 // 鍒犻櫎鏈嶅姟鍚堝悓澶辫触
-
-	OrderManageExist     = 3400001 // 璁㈠崟绠$悊宸插瓨鍦�
-	OrderManageNotExist  = 3400002 // 璁㈠崟绠$悊涓嶅瓨鍦�
-	OrderManageListErr   = 3400003 // 鑾峰彇璁㈠崟绠$悊鍒楄〃澶辫触
-	OrderManageSetErr    = 3400004 // 璁剧疆璁㈠崟绠$悊澶辫触
-	OrderManageUpdateErr = 3400005 // 鏇存柊璁㈠崟绠$悊澶辫触
-	OrderManageDeleteErr = 3400006 // 鍒犻櫎璁㈠崟绠$悊澶辫触
-
-	ServiceFollowupExist     = 3500001 // 鏈嶅姟璺熻繘宸插瓨鍦�
-	ServiceFollowupNotExist  = 3500002 // 鏈嶅姟璺熻繘涓嶅瓨鍦�
-	ServiceFollowupListErr   = 3500003 // 鑾峰彇鏈嶅姟璺熻繘鍒楄〃澶辫触
-	ServiceFollowupSetErr    = 3500004 // 璁剧疆鏈嶅姟璺熻繘澶辫触
-	ServiceFollowupUpdateErr = 3500005 // 鏇存柊鏈嶅姟璺熻繘澶辫触
-	ServiceFollowupDeleteErr = 3500006 // 鍒犻櫎鏈嶅姟璺熻繘澶辫触
-
-	CustomerServiceSheetExist     = 3600001 // 瀹㈡湇鍗曞凡瀛樺湪
-	CustomerServiceSheetNotExist  = 3600002 // 瀹㈡湇鍗曚笉瀛樺湪
-	CustomerServiceSheetListErr   = 3600003 // 鑾峰彇瀹㈡湇鍗曞垪琛ㄥけ璐�
-	CustomerServiceSheetSetErr    = 3600004 // 璁剧疆瀹㈡湇鍗曞け璐�
-	CustomerServiceSheetUpdateErr = 3600005 // 鏇存柊瀹㈡湇鍗曞け璐�
-	CustomerServiceSheetDeleteErr = 3600006 // 鍒犻櫎瀹㈡湇鍗曞け璐�
-
-	ServiceFeeManageExist     = 3700001 // 鏈嶅姟璐圭鐞嗗凡瀛樺湪
-	ServiceFeeManageNotExist  = 3700002 // 鏈嶅姟璐圭鐞嗕笉瀛樺湪
-	ServiceFeeManageListErr   = 3700003 // 鑾峰彇鏈嶅姟璐圭鐞嗗垪琛ㄥけ璐�
-	ServiceFeeManageSetErr    = 3700004 // 璁剧疆鏈嶅姟璐圭鐞嗗け璐�
-	ServiceFeeManageUpdateErr = 3700005 // 鏇存柊鏈嶅姟璐圭鐞嗗け璐�
-	ServiceFeeManageDeleteErr = 3700006 // 鍒犻櫎鏈嶅姟璐圭鐞嗗け璐�
-
-	RoleExist      = 3800001 // 瑙掕壊宸插瓨鍦�
-	RoleNotExist   = 3800002 // 瑙掕壊涓嶅瓨鍦�
-	RoleListErr    = 3800003 // 鑾峰彇瑙掕壊鍒楄〃澶辫触
-	RoleSetErr     = 3800004 // 璁剧疆瑙掕壊澶辫触
-	RoleUpdateErr  = 3800005 // 鏇存柊瑙掕壊澶辫触
-	RoleDeleteErr  = 3800006 // 鍒犻櫎瑙掕壊澶辫触
-	RoleDeleteErr1 = 3800007 // 璇ヨ鑹蹭笅瀛樺湪鐢ㄦ埛锛屾棤娉曞垹闄�
-
-	MenuListErr         = 3900001 // 鑾峰彇鑿滃崟鍒楄〃澶辫触
-	SetMenuAuthorityErr = 3900002 // 璁剧疆鑿滃崟鏉冮檺澶辫触
-
-	DepartmentExist      = 4000001 // 閮ㄩ棬宸插瓨鍦�
-	DepartmentNotExist   = 4000002 // 閮ㄩ棬涓嶅瓨鍦�
-	DepartmentListErr    = 4000003 // 鑾峰彇閮ㄩ棬鍒楄〃澶辫触
-	DepartmentSetErr     = 4000004 // 璁剧疆閮ㄩ棬澶辫触
-	DepartmentUpdateErr  = 4000005 // 鏇存柊閮ㄩ棬澶辫触
-	DepartmentDeleteErr  = 4000006 // 鍒犻櫎閮ㄩ棬澶辫触
-	DepartmentDeleteErr1 = 4000007 // 璇ラ儴闂ㄤ笅瀛樺湪鐢ㄦ埛锛屾棤娉曞垹闄�
-
-	VettingExist           = 4100001 // 瀹℃壒宸插瓨鍦�
-	VettingNotExist        = 4100002 // 瀹℃壒涓嶅瓨鍦�
-	VettingListErr         = 4100003 // 鑾峰彇瀹℃壒鍒楄〃澶辫触
-	VettingSetErr          = 4100004 // 璁剧疆瀹℃壒澶辫触
-	VettingNotBelongToUser = 4100005 // 瀹℃壒涓嶅睘浜庡綋鍓嶇敤鎴�
-
-	SatisfactionExist     = 4200001 // 婊℃剰搴﹀凡瀛樺湪
-	SatisfactionNotExist  = 4200002 // 婊℃剰搴︿笉瀛樺湪
-	SatisfactionListErr   = 4200003 // 鑾峰彇婊℃剰搴﹀垪琛ㄥけ璐�
-	SatisfactionSetErr    = 4200004 // 璁剧疆婊℃剰搴﹀け璐�
-	SatisfactionUpdateErr = 4200005 // 鏇存柊婊℃剰搴﹀け璐�
-
-	TimelyRateExist     = 4300001 // 鍙婃椂鐜囧凡瀛樺湪
-	TimelyRateNotExist  = 4300002 // 鍙婃椂鐜囦笉瀛樺湪
-	TimelyRateListErr   = 4300003 // 鑾峰彇鍙婃椂鐜囧垪琛ㄥけ璐�
-	TimelyRateSetErr    = 4300004 // 璁剧疆鍙婃椂鐜囧け璐�
-	TimelyRateUpdateErr = 4300005 // 鏇存柊鍙婃椂鐜囧け璐�
-
-	SolveRateExist     = 4400001 // 瑙e喅鐜囧凡瀛樺湪
-	SolveRateNotExist  = 4400002 // 瑙e喅鐜囦笉瀛樺湪
-	SolveRateListErr   = 4400003 // 鑾峰彇瑙e喅鐜囧垪琛ㄥけ璐�
-	SolveRateSetErr    = 4400004 // 璁剧疆瑙e喅鐜囧け璐�
-	SolveRateUpdateErr = 4400005 // 鏇存柊瑙e喅鐜囧け璐�
-
-	IsVisitExist     = 4500001 // 鏈嶅姟浜哄憳鏄惁鏉ヨ繃宸插瓨鍦�
-	IsVisitNotExist  = 4500002 // 鏈嶅姟浜哄憳鏄惁鏉ヨ繃涓嶅瓨鍦�
-	IsVisitListErr   = 4500003 // 鑾峰彇鏈嶅姟浜哄憳鏄惁鏉ヨ繃鍒楄〃澶辫触
-	IsVisitSetErr    = 4500004 // 璁剧疆鏈嶅姟浜哄憳鏄惁鏉ヨ繃澶辫触
-	IsVisitUpdateErr = 4500005 // 鏇存柊鏈嶅姟浜哄憳鏄惁鏉ヨ繃澶辫触
-
-	ReportSourceExist     = 4600001 // 鎶ヨ〃鏉ユ簮宸插瓨鍦�
-	ReportSourceNotExist  = 4600002 // 鎶ヨ〃鏉ユ簮涓嶅瓨鍦�
-	ReportSourceListErr   = 4600003 // 鑾峰彇鎶ヨ〃鏉ユ簮鍒楄〃澶辫触
-	ReportSourceSetErr    = 4600004 // 璁剧疆鎶ヨ〃鏉ユ簮澶辫触
-	ReportSourceUpdateErr = 4600005 // 鏇存柊鎶ヨ〃鏉ユ簮澶辫触
-
-	OrderTypeExist     = 4700001 // 宸ュ崟绫诲瀷宸插瓨鍦�
-	OrderTypeNotExist  = 4700002 // 宸ュ崟绫诲瀷涓嶅瓨鍦�
-	OrderTypeListErr   = 4700003 // 鑾峰彇宸ュ崟绫诲瀷鍒楄〃澶辫触
-	OrderTypeSetErr    = 4700004 // 璁剧疆宸ュ崟绫诲瀷澶辫触
-	OrderTypeUpdateErr = 4700005 // 鏇存柊宸ュ崟绫诲瀷澶辫触
-
-	ServiceContractStatusExist     = 4800001 // 鏈嶅姟鍚堝悓鐘舵�佸凡瀛樺湪
-	ServiceContractStatusNotExist  = 4400002 // 鏈嶅姟鍚堝悓鐘舵�佷笉瀛樺湪
-	ServiceContractStatusListErr   = 4800003 // 鑾峰彇鏈嶅姟鍚堝悓鐘舵�佸垪琛ㄥけ璐�
-	ServiceContractStatusSetErr    = 4800004 // 璁剧疆鏈嶅姟鍚堝悓鐘舵�佸け璐�
-	ServiceContractStatusUpdateErr = 4800005 // 鏇存柊鏈嶅姟鍚堝悓鐘舵�佸け璐�
-
-	ServiceContractTypeExist     = 4900001 // 鏈嶅姟鍚堝悓绫诲瀷宸插瓨鍦�
-	ServiceContractTypeNotExist  = 4900002 // 鏈嶅姟鍚堝悓绫诲瀷涓嶅瓨鍦�
-	ServiceContractTypeListErr   = 4900003 // 鑾峰彇鏈嶅姟鍚堝悓绫诲瀷鍒楄〃澶辫触
-	ServiceContractTypeSetErr    = 4900004 // 璁剧疆鏈嶅姟鍚堝悓绫诲瀷澶辫触
-	ServiceContractTypeUpdateErr = 4900005 // 鏇存柊鏈嶅姟鍚堝悓绫诲瀷澶辫触
-
-	RefundMethodExist     = 5000001 // 閫�娆炬柟寮忓凡瀛樺湪
-	RefundMethodNotExist  = 5000002 // 閫�娆炬柟寮忎笉瀛樺湪
-	RefundMethodListErr   = 5000003 // 鑾峰彇閫�娆炬柟寮忓垪琛ㄥけ璐�
-	RefundMethodSetErr    = 5000004 // 璁剧疆閫�娆炬柟寮忓け璐�
-	RefundMethodUpdateErr = 5000005 // 鏇存柊閫�娆炬柟寮忓け璐�
-
-	IsInvoiceExist     = 5100001 // 鏄惁寮�绁ㄥ凡瀛樺湪
-	IsInvoiceNotExist  = 5100002 // 鏄惁寮�绁ㄤ笉瀛樺湪
-	IsInvoiceListErr   = 5100003 // 鑾峰彇鏄惁寮�绁ㄥ垪琛ㄥけ璐�
-	IsInvoiceSetErr    = 5100004 // 璁剧疆鏄惁寮�绁ㄥけ璐�
-	IsInvoiceUpdateErr = 5100005 // 鏇存柊鏄惁寮�绁ㄥけ璐�
-
-	AccountIdExist     = 5200001 // 璐︽埛宸插瓨鍦�
-	AccountIdNotExist  = 5200002 // 璐︽埛涓嶅瓨鍦�
-	AccountIdListErr   = 5200003 // 鑾峰彇璐︽埛鍒楄〃澶辫触
-	AccountIdSetErr    = 5200004 // 璁剧疆璐︽埛澶辫触
-	AccountIdUpdateErr = 5200005 // 鏇存柊璐︽埛澶辫触
-
-	SalesReturnStatusExist     = 5300001 // 閫�璐у崟鐘舵�佸凡瀛樺湪
-	SalesReturnStatusNotExist  = 5300002 // 閫�璐у崟鐘舵�佷笉瀛樺湪
-	SalesReturnStatusListErr   = 5300003 // 鑾峰彇閫�璐у崟鐘舵�佸垪琛ㄥけ璐�
-	SalesReturnStatusSetErr    = 5300004 // 璁剧疆閫�璐у崟鐘舵�佸け璐�
-	SalesReturnStatusUpdateErr = 5300005 // 鏇存柊閫�璐у崟鐘舵�佸け璐�
-
-	RepositoryExist     = 5400001 // 閫�璐т粨搴撳凡瀛樺湪
-	RepositoryNotExist  = 5400002 // 閫�璐т粨搴撲笉瀛樺湪
-	RepositoryListErr   = 5400003 // 鑾峰彇閫�璐т粨搴撳垪琛ㄥけ璐�
-	RepositorySetErr    = 5400004 // 璁剧疆閫�璐т粨搴撳け璐�
-	RepositoryUpdateErr = 5400005 // 鏇存柊閫�璐т粨搴撳け璐�
-
-	QuotationStatusExist     = 5500001 // 鎶ヤ环鍗曠姸鎬佸凡瀛樺湪
-	QuotationStatusNotExist  = 5500002 // 鎶ヤ环鍗曠姸鎬佷笉瀛樺湪
-	QuotationStatusListErr   = 5500003 // 鑾峰彇鎶ヤ环鍗曠姸鎬佸垪琛ㄥけ璐�
-	QuotationStatusSetErr    = 5500004 // 璁剧疆鎶ヤ环鍗曠姸鎬佸け璐�
-	QuotationStatusUpdateErr = 5500005 // 鏇存柊鎶ヤ环鍗曠姸鎬佸け璐�
-
-	CurrencyExist     = 5600001 // 甯佺宸插瓨鍦�
-	CurrencyNotExist  = 5600002 // 甯佺涓嶅瓨鍦�
-	CurrencyListErr   = 5600003 // 鑾峰彇甯佺鍒楄〃澶辫触
-	CurrencySetErr    = 5600004 // 璁剧疆甯佺澶辫触
-	CurrencyUpdateErr = 5600005 // 鏇存柊甯佺澶辫触
-
-	AssignErr            = 5700001 // 鍒嗛厤澶辫触
-	AssignWrongMemberId  = 5700002 // 鍒嗛厤澶辫触锛屽垎閰嶄汉涓虹┖
-	AssignWrongId        = 5700003 // 鍒嗛厤澶辫触锛屽垎閰嶅璞′负绌�
-	AssignWrongModelType = 5700004 // 鍒嗛厤澶辫触锛屽垎閰嶅璞$被鍨嬩负绌�
-
-)
+package ecode
+
+const (
+	OK = 200
+
+	UnknownErr                      = 2001 // 鏈煡閿欒
+	DBErr                           = 2002 // db閿欒
+	RedisErr                        = 2003 // redis閿欒
+	ParamsErr                       = 2004 // 璇锋眰鍙傛暟閿欒
+	UserNotExist                    = 2005 // 鐢ㄦ埛涓嶅瓨鍦�
+	PasswordErr                     = 2006 // 瀵嗙爜閿欒
+	UserForbidden                   = 2007 // 鐢ㄦ埛琚鐢�
+	CaptchaGenerateFailed           = 2008 // 楠岃瘉鐮佺敓鎴愬け璐�
+	CaptchaErr                      = 2009 // 楠岃瘉鐮侀敊璇�
+	CreateTokenErr                  = 2010 // 鍒涘缓token澶辫触
+	JWTInBlackList                  = 2011 // JWT鍦ㄧ櫧鍚嶅崟
+	JWTDisabled                     = 2012 // JWT澶辨晥
+	JWTEmpty                        = 2013 // JWT涓虹┖
+	JWTExpire                       = 2014 // JWT杩囨湡
+	JWTParseErr                     = 2015 // JWT瑙f瀽澶辫触
+	UserNameExistErr                = 2016 // 鐢ㄦ埛鍚嶅凡瀛樺湪
+	ChildrenExistErr                = 2017 // 瀛樺湪瀛愯彍鍗�
+	MenuNotExist                    = 2018 // 鑿滃崟涓嶅瓨鍦�
+	MenuNameExistErr                = 2019 // 鑿滃崟鍚嶅凡瀛樺湪
+	DeviceIPExistErr                = 2020 // 璇ヨ澶嘔P宸插瓨鍦�
+	DeviceInstallRancherErr         = 2021 // 瀹夎rancher澶辫触
+	ClusterNameExistErr             = 2022 // 瑭查泦缇ゅ凡缍撳瓨鍦�
+	CreateDatabaseErr               = 2023 // 鍒涘缓鏁版嵁搴撻敊璇�
+	CreateDatabaseUserErr           = 2024 // 鍒涘缓鏁版嵁搴撶敤鎴烽敊璇�
+	CreateClusterErr                = 2025 // 鍒涘缓闆嗙兢澶辫触
+	GetClusterErr                   = 2026 // 鑾峰彇闆嗙兢澶辫触
+	GetClusterKubeConfigErr         = 2027 // 鑾峰彇kube config澶辫触
+	ClusterInstallDockerErr         = 2028 // 瀹夎docker澶辫触
+	ClusterInstallKubectlErr        = 2029 // 瀹夎kubectl澶辫触
+	ClusterDeployKubernetesRolesErr = 2030 // 閮ㄧ讲kubernetes瑙掕壊澶辫触
+	ClusterGetNodeCommandErr        = 2031 // 鑾峰彇node command澶辫触
+	UserHasCluster                  = 2032 // 鍒犻櫎鐢ㄦ埛澶辫触锛岃鐢ㄦ埛涓嬪瓨鍦ㄩ泦缇�
+	NoPowerErr                      = 2033 //銆�娌℃湁鏉冮檺
+	UploadImageErr                  = 2034 //銆�涓婁紶鍥惧儚澶辫触
+
+	InvalidParams = 100001 // 璇锋眰鍙傛暟閿欒
+
+	CountryExist      = 200001 // 鍥藉宸插瓨鍦�
+	CountryNotExist   = 200002 // 鍥藉涓嶅瓨鍦�
+	CountryGetListErr = 200003 // 鑾峰彇鍥藉鍒楄〃澶辫触
+
+	ProvinceExist      = 300001 // 鐪佷唤宸插瓨鍦�
+	ProvinceNotExist   = 300002 // 鐪佷唤涓嶅瓨鍦�
+	ProvinceGetListErr = 300003 // 鑾峰彇鐪佷唤鍒楄〃澶辫触
+	ProvinceSetErr     = 300004 // 璁剧疆鐪佷唤澶辫触
+
+	CityExist     = 400001 // 鍩庡競宸插瓨鍦�
+	CityNotExist  = 400002 // 鍩庡競涓嶅瓨鍦�
+	CityListErr   = 400003 // 鑾峰彇鍩庡競鍒楄〃澶辫触
+	CitySetErr    = 400004 // 璁剧疆鍩庡競澶辫触
+	CityDeleteErr = 400005 // 鍒犻櫎鍩庡競澶辫触
+
+	RegionExist    = 500001 // 鍖哄幙宸插瓨鍦�
+	RegionNotExist = 500002 // 鍖哄幙涓嶅瓨鍦�
+	RegionListErr  = 500003 // 鑾峰彇鍖哄幙鍒楄〃澶辫触
+	RegionSetErr   = 500004 // 璁剧疆鍖哄幙澶辫触
+
+	ContactExist     = 600001 // 鑱旂郴浜哄凡瀛樺湪
+	ContactNotExist  = 600002 // 鑱旂郴浜轰笉瀛樺湪
+	ContactListErr   = 600003 // 鑾峰彇鑱旂郴浜哄垪琛ㄥけ璐�
+	ContactDeleteErr = 600004 // 鍒犻櫎鑱旂郴浜哄け璐�
+	ContactUpdateErr = 600005 // 鏇存柊鑱旂郴浜哄け璐�
+
+	ClientExist     = 700001 // 瀹㈡埛宸插瓨鍦�
+	ClientNotExist  = 700002 // 瀹㈡埛涓嶅瓨鍦�
+	ClientListErr   = 700003 // 鑾峰彇瀹㈡埛鍒楄〃澶辫触
+	ClientDeleteErr = 700004 // 鍒犻櫎瀹㈡埛澶辫触
+	ClientUpdateErr = 700005 // 鏇存柊瀹㈡埛澶辫触
+
+	ClientStatusExist    = 800001 // 瀹㈡埛鐘舵�佸凡瀛樺湪
+	ClientStatusNotExist = 800002 // 瀹㈡埛鐘舵�佷笉瀛樺湪
+	ClientStatusListErr  = 800003 // 鑾峰彇瀹㈡埛鐘舵�佸垪琛ㄥけ璐�
+	ClientStatusSetErr   = 800004 // 璁剧疆瀹㈡埛鐘舵�佸け璐�
+
+	ClientTypeExist    = 900001 // 瀹㈡埛绫诲瀷宸插瓨鍦�
+	ClientTypeNotExist = 900002 // 瀹㈡埛绫诲瀷涓嶅瓨鍦�
+	ClientTypeListErr  = 900003 // 鑾峰彇瀹㈡埛绫诲瀷鍒楄〃澶辫触
+	ClientTypeSetErr   = 900004 // 璁剧疆瀹㈡埛绫诲瀷澶辫触
+
+	ClientOriginExist    = 1000001 // 瀹㈡埛鏉ユ簮宸插瓨鍦�
+	ClientOriginNotExist = 1000002 // 瀹㈡埛鏉ユ簮涓嶅瓨鍦�
+	ClientOriginListErr  = 1000003 // 鑾峰彇瀹㈡埛鏉ユ簮鍒楄〃澶辫触
+	ClientOriginSetErr   = 1000004 // 璁剧疆瀹㈡埛鏉ユ簮澶辫触
+
+	ClientLevelExist     = 1100001 // 瀹㈡埛绾у埆宸插瓨鍦�
+	ClientLevelNotExist  = 1100002 // 瀹㈡埛绾у埆涓嶅瓨鍦�
+	ClientLevelListErr   = 1100003 // 鑾峰彇瀹㈡埛绾у埆鍒楄〃澶辫触
+	ClientLevelSetErr    = 1100004 // 璁剧疆瀹㈡埛绾у埆澶辫触
+	ClientLevelUpdateErr = 1100005 // 鏇存柊瀹㈡埛绾у埆澶辫触
+
+	IndustryExist     = 1200001 // 琛屼笟宸插瓨鍦�
+	IndustryNotExist  = 1200002 // 琛屼笟涓嶅瓨鍦�
+	IndustryListErr   = 1200003 // 鑾峰彇琛屼笟鍒楄〃澶辫触
+	IndustrySetErr    = 1200004 // 璁剧疆琛屼笟澶辫触
+	IndustryUpdateErr = 1200005 // 鏇存柊琛屼笟澶辫触
+
+	EnterpriseNatureExist     = 1300001 // 浼佷笟鎬ц川宸插瓨鍦�
+	EnterpriseNatureNotExist  = 1300002 // 浼佷笟鎬ц川涓嶅瓨鍦�
+	EnterpriseNatureListErr   = 1300003 // 鑾峰彇浼佷笟鎬ц川鍒楄〃澶辫触
+	EnterpriseNatureSetErr    = 1300004 // 璁剧疆浼佷笟鎬ц川澶辫触
+	EnterpriseNatureUpdateErr = 1300005 // 鏇存柊浼佷笟鎬ц川澶辫触
+
+	RegisteredCapitalExist     = 1400001 // 娉ㄥ唽璧勬湰宸插瓨鍦�
+	RegisteredCapitalNotExist  = 1400002 // 娉ㄥ唽璧勬湰涓嶅瓨鍦�
+	RegisteredCapitalListErr   = 1400003 // 鑾峰彇娉ㄥ唽璧勬湰鍒楄〃澶辫触
+	RegisteredCapitalSetErr    = 1400004 // 璁剧疆娉ㄥ唽璧勬湰澶辫触
+	RegisteredCapitalUpdateErr = 1400005 // 鏇存柊娉ㄥ唽璧勬湰澶辫触
+
+	EnterpriseScaleExist     = 1500001 // 浼佷笟瑙勬ā宸插瓨鍦�
+	EnterpriseScaleNotExist  = 1500002 // 浼佷笟瑙勬ā涓嶅瓨鍦�
+	EnterpriseScaleListErr   = 1500003 // 鑾峰彇浼佷笟瑙勬ā鍒楄〃澶辫触
+	EnterpriseScaleSetErr    = 1500004 // 璁剧疆浼佷笟瑙勬ā澶辫触
+	EnterpriseScaleUpdateErr = 1500005 // 鏇存柊浼佷笟瑙勬ā澶辫触
+
+	SalesLeadsExist     = 1600001 // 閿�鍞嚎绱㈠凡瀛樺湪
+	SalesLeadsNotExist  = 1600002 // 閿�鍞嚎绱笉瀛樺湪
+	SalesLeadsListErr   = 1600003 // 鑾峰彇閿�鍞嚎绱㈠垪琛ㄥけ璐�
+	SalesLeadsSetErr    = 1600004 // 璁剧疆閿�鍞嚎绱㈠け璐�
+	SalesLeadsUpdateErr = 1600005 // 鏇存柊閿�鍞嚎绱㈠け璐�
+	SalesLeadsDeleteErr = 1600006 // 鍒犻櫎閿�鍞嚎绱㈠け璐�
+
+	SalesSourceExist     = 1700001 // 閿�鍞嚎绱㈡潵婧愬凡瀛樺湪
+	SalesSourceNotExist  = 1700002 // 閿�鍞嚎绱㈡潵婧愪笉瀛樺湪
+	SalesSourceListErr   = 1700003 // 鑾峰彇閿�鍞嚎绱㈡潵婧愬垪琛ㄥけ璐�
+	SalesSourceSetErr    = 1700004 // 璁剧疆閿�鍞嚎绱㈡潵婧愬け璐�
+	SalesSourceUpdateErr = 1700005 // 鏇存柊閿�鍞嚎绱㈡潵婧愬け璐�
+
+	FollowRecordExist     = 1800001 // 璺熻繘璁板綍宸插瓨鍦�
+	FollowRecordNotExist  = 1800002 // 璺熻繘璁板綍涓嶅瓨鍦�
+	FollowRecordListErr   = 1800003 // 鑾峰彇璺熻繘璁板綍鍒楄〃澶辫触
+	FollowRecordSetErr    = 1800004 // 璁剧疆璺熻繘璁板綍澶辫触
+	FollowRecordUpdateErr = 1800005 // 鏇存柊璺熻繘璁板綍澶辫触
+	FollowRecordDeleteErr = 1800006 // 鍒犻櫎璺熻繘璁板綍澶辫触
+
+	SaleChanceExist     = 1900001 // 閿�鍞満浼氬凡瀛樺湪
+	SaleChanceNotExist  = 1900002 // 閿�鍞満浼氫笉瀛樺湪
+	SaleChanceListErr   = 1900003 // 鑾峰彇閿�鍞満浼氬垪琛ㄥけ璐�
+	SaleChanceSetErr    = 1900004 // 璁剧疆閿�鍞満浼氬け璐�
+	SaleChanceUpdateErr = 1900005 // 鏇存柊閿�鍞満浼氬け璐�
+	SaleChanceDeleteErr = 1900006 // 鍒犻櫎閿�鍞満浼氬け璐�
+
+	SaleStageExist    = 2000001 // 閿�鍞樁娈靛凡瀛樺湪
+	SaleStageNotExist = 2000002 // 閿�鍞樁娈典笉瀛樺湪
+	SaleStageListErr  = 2000003 // 鑾峰彇閿�鍞樁娈靛垪琛ㄥけ璐�
+	SaleStageSetErr   = 2000004 // 璁剧疆閿�鍞樁娈靛け璐�
+
+	SaleTypeExist     = 2100001 // 閿�鍞被鍨嬪凡瀛樺湪
+	SaleTypeNotExist  = 2100002 // 閿�鍞被鍨嬩笉瀛樺湪
+	SaleTypeListErr   = 2100003 // 鑾峰彇閿�鍞被鍨嬪垪琛ㄥけ璐�
+	SaleTypeSetErr    = 2100004 // 璁剧疆閿�鍞被鍨嬪け璐�
+	SaleTypeUpdateErr = 2100005 // 鏇存柊閿�鍞被鍨嬪け璐�
+	SaleTypeDeleteErr = 2100006 // 鍒犻櫎閿�鍞被鍨嬪け璐�
+
+	RegularCustomersExist     = 2200001 // 鍥哄畾瀹㈡埛宸插瓨鍦�
+	RegularCustomersNotExist  = 2200002 // 鍥哄畾瀹㈡埛涓嶅瓨鍦�
+	RegularCustomersListErr   = 2200003 // 鑾峰彇鍥哄畾瀹㈡埛鍒楄〃澶辫触
+	RegularCustomersSetErr    = 2200004 // 璁剧疆鍥哄畾瀹㈡埛澶辫触
+	RegularCustomersUpdateErr = 2200005 // 鏇存柊鍥哄畾瀹㈡埛澶辫触
+	RegularCustomersDeleteErr = 2200006 // 鍒犻櫎鍥哄畾瀹㈡埛澶辫触
+
+	PossibilityExist     = 2300001 // 閿�鍞満浼氬彲鑳芥�у凡瀛樺湪
+	PossibilityNotExist  = 2300002 // 閿�鍞満浼氬彲鑳芥�т笉瀛樺湪
+	PossibilityListErr   = 2300003 // 鑾峰彇閿�鍞満浼氬彲鑳芥�у垪琛ㄥけ璐�
+	PossibilitySetErr    = 2300004 // 璁剧疆閿�鍞満浼氬彲鑳芥�уけ璐�
+	PossibilityUpdateErr = 2300005 // 鏇存柊閿�鍞満浼氬彲鑳芥�уけ璐�
+	PossibilityDeleteErr = 2300006 // 鍒犻櫎閿�鍞満浼氬彲鑳芥�уけ璐�
+
+	StatusExist     = 2400001 // 閿�鍞満浼氱姸鎬佸凡瀛樺湪
+	StatusNotExist  = 2400002 // 閿�鍞満浼氱姸鎬佷笉瀛樺湪
+	StatusListErr   = 2400003 // 鑾峰彇閿�鍞満浼氱姸鎬佸垪琛ㄥけ璐�
+	StatusSetErr    = 2400004 // 璁剧疆閿�鍞満浼氱姸鎬佸け璐�
+	StatusUpdateErr = 2400005 // 鏇存柊閿�鍞満浼氱姸鎬佸け璐�
+	StatusDeleteErr = 2400006 // 鍒犻櫎閿�鍞満浼氱姸鎬佸け璐�
+
+	QuotationExist     = 2500001 // 鎶ヤ环鍗曞凡瀛樺湪
+	QuotationNotExist  = 2500002 // 鎶ヤ环鍗曚笉瀛樺湪
+	QuotationListErr   = 2500003 // 鑾峰彇鎶ヤ环鍗曞垪琛ㄥけ璐�
+	QuotationSetErr    = 2500004 // 璁剧疆鎶ヤ环鍗曞け璐�
+	QuotationUpdateErr = 2500005 // 鏇存柊鎶ヤ环鍗曞け璐�
+	QuotationDeleteErr = 2500006 // 鍒犻櫎鎶ヤ环鍗曞け璐�
+
+	MasterOrderExist     = 2600001 // 涓昏鍗曞凡瀛樺湪
+	MasterOrderNotExist  = 2600002 // 涓昏鍗曚笉瀛樺湪
+	MasterOrderListErr   = 2600003 // 鑾峰彇涓昏鍗曞垪琛ㄥけ璐�
+	MasterOrderSetErr    = 2600004 // 璁剧疆涓昏鍗曞け璐�
+	MasterOrderUpdateErr = 2600005 // 鏇存柊涓昏鍗曞け璐�
+	MasterOrderDeleteErr = 2600006 // 鍒犻櫎涓昏鍗曞け璐�
+
+	SubOrderExist     = 2700001 // 瀛愯鍗曞凡瀛樺湪
+	SubOrderNotExist  = 2700002 // 瀛愯鍗曚笉瀛樺湪
+	SubOrderListErr   = 2700003 // 鑾峰彇瀛愯鍗曞垪琛ㄥけ璐�
+	SubOrderSetErr    = 2700004 // 璁剧疆瀛愯鍗曞け璐�
+	SubOrderUpdateErr = 2700005 // 鏇存柊瀛愯鍗曞け璐�
+	SubOrderDeleteErr = 2700006 // 鍒犻櫎瀛愯鍗曞け璐�
+
+	SalesDetailsExist     = 2800001 // 閿�鍞槑缁嗗凡瀛樺湪
+	SalesDetailsNotExist  = 2800002 // 閿�鍞槑缁嗕笉瀛樺湪
+	SalesDetailsListErr   = 2800003 // 鑾峰彇閿�鍞槑缁嗗垪琛ㄥけ璐�
+	SalesDetailsSetErr    = 2800004 // 璁剧疆閿�鍞槑缁嗗け璐�
+	SalesDetailsUpdateErr = 2800005 // 鏇存柊閿�鍞槑缁嗗け璐�
+	SalesDetailsDeleteErr = 2800006 // 鍒犻櫎閿�鍞槑缁嗗け璐�
+
+	SalesReturnExist     = 2900001 // 閿�鍞��璐у崟宸插瓨鍦�
+	SalesReturnNotExist  = 2900002 // 閿�鍞��璐у崟涓嶅瓨鍦�
+	SalesReturnListErr   = 2900003 // 鑾峰彇閿�鍞��璐у崟鍒楄〃澶辫触
+	SalesReturnSetErr    = 2900004 // 璁剧疆閿�鍞��璐у崟澶辫触
+	SalesReturnUpdateErr = 2900005 // 鏇存柊閿�鍞��璐у崟澶辫触
+	SalesReturnDeleteErr = 2900006 // 鍒犻櫎閿�鍞��璐у崟澶辫触
+
+	SalesRefundExist     = 3000001 // 閿�鍞��娆惧崟宸插瓨鍦�
+	SalesRefundNotExist  = 3000002 // 閿�鍞��娆惧崟涓嶅瓨鍦�
+	SalesRefundListErr   = 3000003 // 鑾峰彇閿�鍞��娆惧崟鍒楄〃澶辫触
+	SalesRefundSetErr    = 3000004 // 璁剧疆閿�鍞��娆惧崟澶辫触
+	SalesRefundUpdateErr = 3000005 // 鏇存柊閿�鍞��娆惧崟澶辫触
+	SalesRefundDeleteErr = 3000006 // 鍒犻櫎閿�鍞��娆惧崟澶辫触
+
+	ContractExist     = 3100001 // 鍚堝悓宸插瓨鍦�
+	ContractNotExist  = 3100002 // 鍚堝悓涓嶅瓨鍦�
+	ContractListErr   = 3100003 // 鑾峰彇鍚堝悓鍒楄〃澶辫触
+	ContractSetErr    = 3100004 // 璁剧疆鍚堝悓澶辫触
+	ContractUpdateErr = 3100005 // 鏇存柊鍚堝悓澶辫触
+	ContractDeleteErr = 3100006 // 鍒犻櫎鍚堝悓澶辫触
+
+	PlanExist     = 3200001 // 璁″垝宸插瓨鍦�
+	PlanNotExist  = 3200002 // 璁″垝涓嶅瓨鍦�
+	PlanListErr   = 3200003 // 鑾峰彇璁″垝鍒楄〃澶辫触
+	PlanSetErr    = 3200004 // 璁剧疆璁″垝澶辫触
+	PlanUpdateErr = 3200005 // 鏇存柊璁″垝澶辫触
+	PlanDeleteErr = 3200006 // 鍒犻櫎璁″垝澶辫触
+
+	SContractExist     = 3300001 // 鏈嶅姟鍚堝悓宸插瓨鍦�
+	SContractNotExist  = 3300002 // 鏈嶅姟鍚堝悓涓嶅瓨鍦�
+	SContractListErr   = 3300003 // 鑾峰彇鏈嶅姟鍚堝悓鍒楄〃澶辫触
+	SContractSetErr    = 3300004 // 璁剧疆鏈嶅姟鍚堝悓澶辫触
+	SContractUpdateErr = 3300005 // 鏇存柊鏈嶅姟鍚堝悓澶辫触
+	SContractDeleteErr = 3300006 // 鍒犻櫎鏈嶅姟鍚堝悓澶辫触
+
+	OrderManageExist     = 3400001 // 璁㈠崟绠$悊宸插瓨鍦�
+	OrderManageNotExist  = 3400002 // 璁㈠崟绠$悊涓嶅瓨鍦�
+	OrderManageListErr   = 3400003 // 鑾峰彇璁㈠崟绠$悊鍒楄〃澶辫触
+	OrderManageSetErr    = 3400004 // 璁剧疆璁㈠崟绠$悊澶辫触
+	OrderManageUpdateErr = 3400005 // 鏇存柊璁㈠崟绠$悊澶辫触
+	OrderManageDeleteErr = 3400006 // 鍒犻櫎璁㈠崟绠$悊澶辫触
+
+	ServiceFollowupExist     = 3500001 // 鏈嶅姟璺熻繘宸插瓨鍦�
+	ServiceFollowupNotExist  = 3500002 // 鏈嶅姟璺熻繘涓嶅瓨鍦�
+	ServiceFollowupListErr   = 3500003 // 鑾峰彇鏈嶅姟璺熻繘鍒楄〃澶辫触
+	ServiceFollowupSetErr    = 3500004 // 璁剧疆鏈嶅姟璺熻繘澶辫触
+	ServiceFollowupUpdateErr = 3500005 // 鏇存柊鏈嶅姟璺熻繘澶辫触
+	ServiceFollowupDeleteErr = 3500006 // 鍒犻櫎鏈嶅姟璺熻繘澶辫触
+
+	CustomerServiceSheetExist     = 3600001 // 瀹㈡湇鍗曞凡瀛樺湪
+	CustomerServiceSheetNotExist  = 3600002 // 瀹㈡湇鍗曚笉瀛樺湪
+	CustomerServiceSheetListErr   = 3600003 // 鑾峰彇瀹㈡湇鍗曞垪琛ㄥけ璐�
+	CustomerServiceSheetSetErr    = 3600004 // 璁剧疆瀹㈡湇鍗曞け璐�
+	CustomerServiceSheetUpdateErr = 3600005 // 鏇存柊瀹㈡湇鍗曞け璐�
+	CustomerServiceSheetDeleteErr = 3600006 // 鍒犻櫎瀹㈡湇鍗曞け璐�
+
+	ServiceFeeManageExist     = 3700001 // 鏈嶅姟璐圭鐞嗗凡瀛樺湪
+	ServiceFeeManageNotExist  = 3700002 // 鏈嶅姟璐圭鐞嗕笉瀛樺湪
+	ServiceFeeManageListErr   = 3700003 // 鑾峰彇鏈嶅姟璐圭鐞嗗垪琛ㄥけ璐�
+	ServiceFeeManageSetErr    = 3700004 // 璁剧疆鏈嶅姟璐圭鐞嗗け璐�
+	ServiceFeeManageUpdateErr = 3700005 // 鏇存柊鏈嶅姟璐圭鐞嗗け璐�
+	ServiceFeeManageDeleteErr = 3700006 // 鍒犻櫎鏈嶅姟璐圭鐞嗗け璐�
+
+	RoleExist      = 3800001 // 瑙掕壊宸插瓨鍦�
+	RoleNotExist   = 3800002 // 瑙掕壊涓嶅瓨鍦�
+	RoleListErr    = 3800003 // 鑾峰彇瑙掕壊鍒楄〃澶辫触
+	RoleSetErr     = 3800004 // 璁剧疆瑙掕壊澶辫触
+	RoleUpdateErr  = 3800005 // 鏇存柊瑙掕壊澶辫触
+	RoleDeleteErr  = 3800006 // 鍒犻櫎瑙掕壊澶辫触
+	RoleDeleteErr1 = 3800007 // 璇ヨ鑹蹭笅瀛樺湪鐢ㄦ埛锛屾棤娉曞垹闄�
+
+	MenuListErr         = 3900001 // 鑾峰彇鑿滃崟鍒楄〃澶辫触
+	SetMenuAuthorityErr = 3900002 // 璁剧疆鑿滃崟鏉冮檺澶辫触
+
+	DepartmentExist      = 4000001 // 閮ㄩ棬宸插瓨鍦�
+	DepartmentNotExist   = 4000002 // 閮ㄩ棬涓嶅瓨鍦�
+	DepartmentListErr    = 4000003 // 鑾峰彇閮ㄩ棬鍒楄〃澶辫触
+	DepartmentSetErr     = 4000004 // 璁剧疆閮ㄩ棬澶辫触
+	DepartmentUpdateErr  = 4000005 // 鏇存柊閮ㄩ棬澶辫触
+	DepartmentDeleteErr  = 4000006 // 鍒犻櫎閮ㄩ棬澶辫触
+	DepartmentDeleteErr1 = 4000007 // 璇ラ儴闂ㄤ笅瀛樺湪鐢ㄦ埛锛屾棤娉曞垹闄�
+
+	VettingExist           = 4100001 // 瀹℃壒宸插瓨鍦�
+	VettingNotExist        = 4100002 // 瀹℃壒涓嶅瓨鍦�
+	VettingListErr         = 4100003 // 鑾峰彇瀹℃壒鍒楄〃澶辫触
+	VettingSetErr          = 4100004 // 璁剧疆瀹℃壒澶辫触
+	VettingNotBelongToUser = 4100005 // 瀹℃壒涓嶅睘浜庡綋鍓嶇敤鎴�
+
+	SatisfactionExist     = 4200001 // 婊℃剰搴﹀凡瀛樺湪
+	SatisfactionNotExist  = 4200002 // 婊℃剰搴︿笉瀛樺湪
+	SatisfactionListErr   = 4200003 // 鑾峰彇婊℃剰搴﹀垪琛ㄥけ璐�
+	SatisfactionSetErr    = 4200004 // 璁剧疆婊℃剰搴﹀け璐�
+	SatisfactionUpdateErr = 4200005 // 鏇存柊婊℃剰搴﹀け璐�
+
+	TimelyRateExist     = 4300001 // 鍙婃椂鐜囧凡瀛樺湪
+	TimelyRateNotExist  = 4300002 // 鍙婃椂鐜囦笉瀛樺湪
+	TimelyRateListErr   = 4300003 // 鑾峰彇鍙婃椂鐜囧垪琛ㄥけ璐�
+	TimelyRateSetErr    = 4300004 // 璁剧疆鍙婃椂鐜囧け璐�
+	TimelyRateUpdateErr = 4300005 // 鏇存柊鍙婃椂鐜囧け璐�
+
+	SolveRateExist     = 4400001 // 瑙e喅鐜囧凡瀛樺湪
+	SolveRateNotExist  = 4400002 // 瑙e喅鐜囦笉瀛樺湪
+	SolveRateListErr   = 4400003 // 鑾峰彇瑙e喅鐜囧垪琛ㄥけ璐�
+	SolveRateSetErr    = 4400004 // 璁剧疆瑙e喅鐜囧け璐�
+	SolveRateUpdateErr = 4400005 // 鏇存柊瑙e喅鐜囧け璐�
+
+	IsVisitExist     = 4500001 // 鏈嶅姟浜哄憳鏄惁鏉ヨ繃宸插瓨鍦�
+	IsVisitNotExist  = 4500002 // 鏈嶅姟浜哄憳鏄惁鏉ヨ繃涓嶅瓨鍦�
+	IsVisitListErr   = 4500003 // 鑾峰彇鏈嶅姟浜哄憳鏄惁鏉ヨ繃鍒楄〃澶辫触
+	IsVisitSetErr    = 4500004 // 璁剧疆鏈嶅姟浜哄憳鏄惁鏉ヨ繃澶辫触
+	IsVisitUpdateErr = 4500005 // 鏇存柊鏈嶅姟浜哄憳鏄惁鏉ヨ繃澶辫触
+
+	ReportSourceExist     = 4600001 // 鎶ヨ〃鏉ユ簮宸插瓨鍦�
+	ReportSourceNotExist  = 4600002 // 鎶ヨ〃鏉ユ簮涓嶅瓨鍦�
+	ReportSourceListErr   = 4600003 // 鑾峰彇鎶ヨ〃鏉ユ簮鍒楄〃澶辫触
+	ReportSourceSetErr    = 4600004 // 璁剧疆鎶ヨ〃鏉ユ簮澶辫触
+	ReportSourceUpdateErr = 4600005 // 鏇存柊鎶ヨ〃鏉ユ簮澶辫触
+
+	OrderTypeExist     = 4700001 // 宸ュ崟绫诲瀷宸插瓨鍦�
+	OrderTypeNotExist  = 4700002 // 宸ュ崟绫诲瀷涓嶅瓨鍦�
+	OrderTypeListErr   = 4700003 // 鑾峰彇宸ュ崟绫诲瀷鍒楄〃澶辫触
+	OrderTypeSetErr    = 4700004 // 璁剧疆宸ュ崟绫诲瀷澶辫触
+	OrderTypeUpdateErr = 4700005 // 鏇存柊宸ュ崟绫诲瀷澶辫触
+
+	ServiceContractStatusExist     = 4800001 // 鏈嶅姟鍚堝悓鐘舵�佸凡瀛樺湪
+	ServiceContractStatusNotExist  = 4400002 // 鏈嶅姟鍚堝悓鐘舵�佷笉瀛樺湪
+	ServiceContractStatusListErr   = 4800003 // 鑾峰彇鏈嶅姟鍚堝悓鐘舵�佸垪琛ㄥけ璐�
+	ServiceContractStatusSetErr    = 4800004 // 璁剧疆鏈嶅姟鍚堝悓鐘舵�佸け璐�
+	ServiceContractStatusUpdateErr = 4800005 // 鏇存柊鏈嶅姟鍚堝悓鐘舵�佸け璐�
+
+	ServiceContractTypeExist     = 4900001 // 鏈嶅姟鍚堝悓绫诲瀷宸插瓨鍦�
+	ServiceContractTypeNotExist  = 4900002 // 鏈嶅姟鍚堝悓绫诲瀷涓嶅瓨鍦�
+	ServiceContractTypeListErr   = 4900003 // 鑾峰彇鏈嶅姟鍚堝悓绫诲瀷鍒楄〃澶辫触
+	ServiceContractTypeSetErr    = 4900004 // 璁剧疆鏈嶅姟鍚堝悓绫诲瀷澶辫触
+	ServiceContractTypeUpdateErr = 4900005 // 鏇存柊鏈嶅姟鍚堝悓绫诲瀷澶辫触
+
+	RefundMethodExist     = 5000001 // 閫�娆炬柟寮忓凡瀛樺湪
+	RefundMethodNotExist  = 5000002 // 閫�娆炬柟寮忎笉瀛樺湪
+	RefundMethodListErr   = 5000003 // 鑾峰彇閫�娆炬柟寮忓垪琛ㄥけ璐�
+	RefundMethodSetErr    = 5000004 // 璁剧疆閫�娆炬柟寮忓け璐�
+	RefundMethodUpdateErr = 5000005 // 鏇存柊閫�娆炬柟寮忓け璐�
+
+	IsInvoiceExist     = 5100001 // 鏄惁寮�绁ㄥ凡瀛樺湪
+	IsInvoiceNotExist  = 5100002 // 鏄惁寮�绁ㄤ笉瀛樺湪
+	IsInvoiceListErr   = 5100003 // 鑾峰彇鏄惁寮�绁ㄥ垪琛ㄥけ璐�
+	IsInvoiceSetErr    = 5100004 // 璁剧疆鏄惁寮�绁ㄥけ璐�
+	IsInvoiceUpdateErr = 5100005 // 鏇存柊鏄惁寮�绁ㄥけ璐�
+
+	AccountIdExist     = 5200001 // 璐︽埛宸插瓨鍦�
+	AccountIdNotExist  = 5200002 // 璐︽埛涓嶅瓨鍦�
+	AccountIdListErr   = 5200003 // 鑾峰彇璐︽埛鍒楄〃澶辫触
+	AccountIdSetErr    = 5200004 // 璁剧疆璐︽埛澶辫触
+	AccountIdUpdateErr = 5200005 // 鏇存柊璐︽埛澶辫触
+
+	SalesReturnStatusExist     = 5300001 // 閫�璐у崟鐘舵�佸凡瀛樺湪
+	SalesReturnStatusNotExist  = 5300002 // 閫�璐у崟鐘舵�佷笉瀛樺湪
+	SalesReturnStatusListErr   = 5300003 // 鑾峰彇閫�璐у崟鐘舵�佸垪琛ㄥけ璐�
+	SalesReturnStatusSetErr    = 5300004 // 璁剧疆閫�璐у崟鐘舵�佸け璐�
+	SalesReturnStatusUpdateErr = 5300005 // 鏇存柊閫�璐у崟鐘舵�佸け璐�
+
+	RepositoryExist     = 5400001 // 閫�璐т粨搴撳凡瀛樺湪
+	RepositoryNotExist  = 5400002 // 閫�璐т粨搴撲笉瀛樺湪
+	RepositoryListErr   = 5400003 // 鑾峰彇閫�璐т粨搴撳垪琛ㄥけ璐�
+	RepositorySetErr    = 5400004 // 璁剧疆閫�璐т粨搴撳け璐�
+	RepositoryUpdateErr = 5400005 // 鏇存柊閫�璐т粨搴撳け璐�
+
+	QuotationStatusExist     = 5500001 // 鎶ヤ环鍗曠姸鎬佸凡瀛樺湪
+	QuotationStatusNotExist  = 5500002 // 鎶ヤ环鍗曠姸鎬佷笉瀛樺湪
+	QuotationStatusListErr   = 5500003 // 鑾峰彇鎶ヤ环鍗曠姸鎬佸垪琛ㄥけ璐�
+	QuotationStatusSetErr    = 5500004 // 璁剧疆鎶ヤ环鍗曠姸鎬佸け璐�
+	QuotationStatusUpdateErr = 5500005 // 鏇存柊鎶ヤ环鍗曠姸鎬佸け璐�
+
+	CurrencyExist     = 5600001 // 甯佺宸插瓨鍦�
+	CurrencyNotExist  = 5600002 // 甯佺涓嶅瓨鍦�
+	CurrencyListErr   = 5600003 // 鑾峰彇甯佺鍒楄〃澶辫触
+	CurrencySetErr    = 5600004 // 璁剧疆甯佺澶辫触
+	CurrencyUpdateErr = 5600005 // 鏇存柊甯佺澶辫触
+
+	AssignErr            = 5700001 // 鍒嗛厤澶辫触
+	AssignWrongMemberId  = 5700002 // 鍒嗛厤澶辫触锛屽垎閰嶄汉涓虹┖
+	AssignWrongId        = 5700003 // 鍒嗛厤澶辫触锛屽垎閰嶅璞′负绌�
+	AssignWrongModelType = 5700004 // 鍒嗛厤澶辫触锛屽垎閰嶅璞$被鍨嬩负绌�
+
+)
diff --git a/service/client.go b/service/client.go
index 49c8bb7..ada1710 100644
--- a/service/client.go
+++ b/service/client.go
@@ -1,79 +1,79 @@
-package service
-
-import (
-	"aps_crm/model"
-	"aps_crm/pkg/ecode"
-)
-
-type ClientService struct{}
-
-func (ClientService) AddClient(client *model.Client) int {
-	err := model.NewClientSearch(nil).Create(client)
-	if err != nil {
-		return ecode.ClientExist
-	}
-	return ecode.OK
-}
-
-
-// CheckClientExist check client exist
-func CheckClientExist(id int) int {
-	_, err := model.NewClientSearch(nil).SetId(id).First()
-	if err != nil {
-		return ecode.ClientNotExist
-	}
-
-	return ecode.OK
-}
-
-func (ClientService) UpdateClient(client *model.Client) int {
-	// check client exist
-	errCode := CheckClientExist(client.Id)
-	if errCode != ecode.OK {
-		return errCode
-	}
-
-	// update client
-	err := model.NewClientSearch(nil).SetId(client.Id).Update(client)
-	if err != nil {
-		return ecode.ClientUpdateErr
-	}
-
-	return ecode.OK
-}
-
-func (ClientService) GetClientList(page, pageSize int, keyword string) ([]*model.Client, int64, int) {
-	// get contact list
-	contacts, total, err := model.NewClientSearch(nil).SetKeyword(keyword).SetPage(page, pageSize).Find()
-	if err != nil {
-		return nil, 0, ecode.ClientListErr
-	}
-	return contacts, total, ecode.OK
-}
-
-func (ClientService) Assign(id, memberId int) int {
-	// check client exist
-	errCode := CheckClientExist(id)
-	if errCode != ecode.OK {
-		return errCode
-	}
-
-	// assign client
-	err := model.NewClientSearch(nil).SetId(id).UpdateByMap(map[string]interface{}{
-		"member_id": memberId,
-	})
-	if err != nil {
-		return ecode.AssignErr
-	}
-
-	return ecode.OK
-}
-
-func (ClientService) DeleteClient (ids []int) int {
-	// delete client
-	err := model.NewClientSearch(nil).SetIds(ids).Delete()
-	if err != nil {
-		return ecode.ClientDeleteErr
-	}
-	return ecode.OK
+package service
+
+import (
+	"aps_crm/model"
+	"aps_crm/pkg/ecode"
+)
+
+type ClientService struct{}
+
+func (ClientService) AddClient(client *model.Client) int {
+	err := model.NewClientSearch(nil).Create(client)
+	if err != nil {
+		return ecode.ClientExist
+	}
+	return ecode.OK
+}
+
+
+// CheckClientExist check client exist
+func CheckClientExist(id int) int {
+	_, err := model.NewClientSearch(nil).SetId(id).First()
+	if err != nil {
+		return ecode.ClientNotExist
+	}
+
+	return ecode.OK
+}
+
+func (ClientService) UpdateClient(client *model.Client) int {
+	// check client exist
+	errCode := CheckClientExist(client.Id)
+	if errCode != ecode.OK {
+		return errCode
+	}
+
+	// update client
+	err := model.NewClientSearch(nil).SetId(client.Id).Update(client)
+	if err != nil {
+		return ecode.ClientUpdateErr
+	}
+
+	return ecode.OK
+}
+
+func (ClientService) GetClientList(page, pageSize int, keyword string) ([]*model.Client, int64, int) {
+	// get contact list
+	contacts, total, err := model.NewClientSearch(nil).SetKeyword(keyword).SetPage(page, pageSize).Find()
+	if err != nil {
+		return nil, 0, ecode.ClientListErr
+	}
+	return contacts, total, ecode.OK
+}
+
+func (ClientService) Assign(id, memberId int) int {
+	// check client exist
+	errCode := CheckClientExist(id)
+	if errCode != ecode.OK {
+		return errCode
+	}
+
+	// assign client
+	err := model.NewClientSearch(nil).SetId(id).UpdateByMap(map[string]interface{}{
+		"member_id": memberId,
+	})
+	if err != nil {
+		return ecode.AssignErr
+	}
+
+	return ecode.OK
+}
+
+func (ClientService) DeleteClient (ids []int) int {
+	// delete client
+	err := model.NewClientSearch(nil).SetIds(ids).Delete()
+	if err != nil {
+		return ecode.ClientDeleteErr
+	}
+	return ecode.OK
 }
\ No newline at end of file
diff --git a/service/followRecord.go b/service/followRecord.go
index 0fcc278..e765804 100644
--- a/service/followRecord.go
+++ b/service/followRecord.go
@@ -1,65 +1,65 @@
-package service
-
-import (
-	"aps_crm/model"
-	"aps_crm/pkg/ecode"
-)
-
-type FollowRecordService struct{}
-
-func (FollowRecordService) AddFollowRecord(followRecord *model.FollowRecord) int {
-	err := model.NewFollowRecordSearch().Create(followRecord)
-	if err != nil {
-		return ecode.FollowRecordExist
-	}
-	return ecode.OK
-}
-
-func (FollowRecordService) DeleteFollowRecord(id int) int {
-	// check followRecord exist
-	_, err := model.NewFollowRecordSearch().SetId(id).First()
-	if err != nil {
-		return ecode.FollowRecordNotExist
-	}
-
-	// delete followRecord
-	err = model.NewFollowRecordSearch().SetId(id).Delete()
-	if err != nil {
-		return ecode.FollowRecordDeleteErr
-	}
-	return ecode.OK
-}
-
-// check followRecord exist
-func checkFollowRecordExist(id int) int {
-	_, err := model.NewFollowRecordSearch().SetId(id).First()
-	if err != nil {
-		return ecode.FollowRecordNotExist
-	}
-
-	return ecode.OK
-}
-
-func (FollowRecordService) UpdateFollowRecord(followRecord *model.FollowRecord) int {
-	// check followRecord exist
-	errCode := checkFollowRecordExist(followRecord.Id)
-	if errCode != ecode.OK {
-		return errCode
-	}
-
-	// update followRecord
-	err := model.NewFollowRecordSearch().SetId(followRecord.Id).Update(followRecord)
-	if err != nil {
-		return ecode.FollowRecordUpdateErr
-	}
-	return ecode.OK
-}
-
-func (FollowRecordService) GetFollowRecordList(page, pageSize int, keyword string) ([]*model.FollowRecord, int64, int) {
-	// get contact list
-	contacts, total, err := model.NewFollowRecordSearch().SetKeyword(keyword).SetPage(page, pageSize).FindAll()
-	if err != nil {
-	return nil, 0, ecode.FollowRecordListErr
-	}
-	return contacts, total, ecode.OK
+package service
+
+import (
+	"aps_crm/model"
+	"aps_crm/pkg/ecode"
+)
+
+type FollowRecordService struct{}
+
+func (FollowRecordService) AddFollowRecord(followRecord *model.FollowRecord) int {
+	err := model.NewFollowRecordSearch().Create(followRecord)
+	if err != nil {
+		return ecode.FollowRecordExist
+	}
+	return ecode.OK
+}
+
+func (FollowRecordService) DeleteFollowRecord(id int) int {
+	// check followRecord exist
+	_, err := model.NewFollowRecordSearch().SetId(id).First()
+	if err != nil {
+		return ecode.FollowRecordNotExist
+	}
+
+	// delete followRecord
+	err = model.NewFollowRecordSearch().SetId(id).Delete()
+	if err != nil {
+		return ecode.FollowRecordDeleteErr
+	}
+	return ecode.OK
+}
+
+// check followRecord exist
+func checkFollowRecordExist(id int) int {
+	_, err := model.NewFollowRecordSearch().SetId(id).First()
+	if err != nil {
+		return ecode.FollowRecordNotExist
+	}
+
+	return ecode.OK
+}
+
+func (FollowRecordService) UpdateFollowRecord(followRecord *model.FollowRecord) int {
+	// check followRecord exist
+	errCode := checkFollowRecordExist(followRecord.Id)
+	if errCode != ecode.OK {
+		return errCode
+	}
+
+	// update followRecord
+	err := model.NewFollowRecordSearch().SetId(followRecord.Id).Update(followRecord)
+	if err != nil {
+		return ecode.FollowRecordUpdateErr
+	}
+	return ecode.OK
+}
+
+func (FollowRecordService) GetFollowRecordList(page, pageSize int, keyword string) ([]*model.FollowRecord, int64, int) {
+	// get contact list
+	contacts, total, err := model.NewFollowRecordSearch().SetKeyword(keyword).SetPage(page, pageSize).FindAll()
+	if err != nil {
+	return nil, 0, ecode.FollowRecordListErr
+	}
+	return contacts, total, ecode.OK
 }
\ No newline at end of file

--
Gitblit v1.8.0