From 174932f4f44157958f4112d37cd7df714ebfc223 Mon Sep 17 00:00:00 2001 From: liujiandao <274878379@qq.com> Date: 星期六, 21 十月 2023 17:47:25 +0800 Subject: [PATCH] 销售机会添加产品选择功能 --- conf/aps-crm.json | 4 api/v1/saleChance.go | 1 model/saleChanceProduct.go | 114 ++++++++++++++++++++++ service/saleChance.go | 45 ++++++++ model/request/saleChance.go | 6 + model/saleChance.go | 7 docs/swagger.yaml | 30 +++--- docs/docs.go | 43 ++++---- docs/swagger.json | 43 ++++---- 9 files changed, 229 insertions(+), 64 deletions(-) diff --git a/api/v1/saleChance.go b/api/v1/saleChance.go index 791ce98..445b3c7 100644 --- a/api/v1/saleChance.go +++ b/api/v1/saleChance.go @@ -208,6 +208,7 @@ sc.Address.CountryId = saleChance.Address.CountryId sc.Address.ProvinceId = saleChance.Address.ProvinceId sc.CodeStandID = saleChance.CodeStandID + sc.Products = saleChance.Products return ecode.OK, sc } diff --git a/conf/aps-crm.json b/conf/aps-crm.json index 9774105..eeb4146 100644 --- a/conf/aps-crm.json +++ b/conf/aps-crm.json @@ -48,8 +48,8 @@ "Issuer": "qmPlus" }, "GrpcServiceAddr": { - "Aps": "192.168.20.120:9091", - "Admin": "192.168.20.120:50051" + "Aps": "192.168.20.119:9091", + "Admin": "192.168.20.119:50051" } } diff --git a/docs/docs.go b/docs/docs.go index ab2884d..e8e2612 100644 --- a/docs/docs.go +++ b/docs/docs.go @@ -11850,6 +11850,12 @@ "process": { "type": "string" }, + "products": { + "type": "array", + "items": { + "$ref": "#/definitions/model.Product" + } + }, "projected_amount": { "type": "number" }, @@ -13282,13 +13288,6 @@ "description": "鎵�灞炲叕鍙窱D", "type": "integer" }, - "codeRule": { - "$ref": "#/definitions/code.CodeStandard" - }, - "codeStandID": { - "description": "缂栫爜id", - "type": "string" - }, "country_id": { "description": "鍥藉ID", "type": "integer" @@ -14018,6 +14017,12 @@ }, "process": { "type": "string" + }, + "products": { + "type": "array", + "items": { + "$ref": "#/definitions/model.Product" + } }, "projected_amount": { "type": "number" @@ -14864,13 +14869,6 @@ "description": "鎵�灞炲叕鍙窱D", "type": "integer" }, - "codeRule": { - "$ref": "#/definitions/code.CodeStandard" - }, - "codeStandID": { - "description": "缂栫爜id", - "type": "string" - }, "country_id": { "description": "鍥藉ID", "type": "integer" @@ -15362,6 +15360,10 @@ }, "keywordType": { "$ref": "#/definitions/constvar.SalesDetailsKeywordType" + }, + "number": { + "description": "閿�鍞瓙鍗曞彿", + "type": "string" }, "page": { "description": "椤电爜", @@ -16228,13 +16230,6 @@ "client_id": { "description": "鎵�灞炲叕鍙窱D", "type": "integer" - }, - "codeRule": { - "$ref": "#/definitions/code.CodeStandard" - }, - "codeStandID": { - "description": "缂栫爜id", - "type": "string" }, "country_id": { "description": "鍥藉ID", @@ -17295,6 +17290,12 @@ "process": { "type": "string" }, + "products": { + "type": "array", + "items": { + "$ref": "#/definitions/model.Product" + } + }, "projected_amount": { "type": "number" }, diff --git a/docs/swagger.json b/docs/swagger.json index 8016219..b6ef544 100644 --- a/docs/swagger.json +++ b/docs/swagger.json @@ -11838,6 +11838,12 @@ "process": { "type": "string" }, + "products": { + "type": "array", + "items": { + "$ref": "#/definitions/model.Product" + } + }, "projected_amount": { "type": "number" }, @@ -13270,13 +13276,6 @@ "description": "鎵�灞炲叕鍙窱D", "type": "integer" }, - "codeRule": { - "$ref": "#/definitions/code.CodeStandard" - }, - "codeStandID": { - "description": "缂栫爜id", - "type": "string" - }, "country_id": { "description": "鍥藉ID", "type": "integer" @@ -14006,6 +14005,12 @@ }, "process": { "type": "string" + }, + "products": { + "type": "array", + "items": { + "$ref": "#/definitions/model.Product" + } }, "projected_amount": { "type": "number" @@ -14852,13 +14857,6 @@ "description": "鎵�灞炲叕鍙窱D", "type": "integer" }, - "codeRule": { - "$ref": "#/definitions/code.CodeStandard" - }, - "codeStandID": { - "description": "缂栫爜id", - "type": "string" - }, "country_id": { "description": "鍥藉ID", "type": "integer" @@ -15350,6 +15348,10 @@ }, "keywordType": { "$ref": "#/definitions/constvar.SalesDetailsKeywordType" + }, + "number": { + "description": "閿�鍞瓙鍗曞彿", + "type": "string" }, "page": { "description": "椤电爜", @@ -16216,13 +16218,6 @@ "client_id": { "description": "鎵�灞炲叕鍙窱D", "type": "integer" - }, - "codeRule": { - "$ref": "#/definitions/code.CodeStandard" - }, - "codeStandID": { - "description": "缂栫爜id", - "type": "string" }, "country_id": { "description": "鍥藉ID", @@ -17283,6 +17278,12 @@ "process": { "type": "string" }, + "products": { + "type": "array", + "items": { + "$ref": "#/definitions/model.Product" + } + }, "projected_amount": { "type": "number" }, diff --git a/docs/swagger.yaml b/docs/swagger.yaml index 6b262fd..da4a29b 100644 --- a/docs/swagger.yaml +++ b/docs/swagger.yaml @@ -1332,6 +1332,10 @@ $ref: '#/definitions/model.Possibility' process: type: string + products: + items: + $ref: '#/definitions/model.Product' + type: array projected_amount: type: number province: @@ -2301,11 +2305,6 @@ client_id: description: 鎵�灞炲叕鍙窱D type: integer - codeRule: - $ref: '#/definitions/code.CodeStandard' - codeStandID: - description: 缂栫爜id - type: string country_id: description: 鍥藉ID type: integer @@ -2790,6 +2789,10 @@ type: integer process: type: string + products: + items: + $ref: '#/definitions/model.Product' + type: array projected_amount: type: number province_id: @@ -3369,11 +3372,6 @@ client_id: description: 鎵�灞炲叕鍙窱D type: integer - codeRule: - $ref: '#/definitions/code.CodeStandard' - codeStandID: - description: 缂栫爜id - type: string country_id: description: 鍥藉ID type: integer @@ -3729,6 +3727,9 @@ type: string keywordType: $ref: '#/definitions/constvar.SalesDetailsKeywordType' + number: + description: 閿�鍞瓙鍗曞彿 + type: string page: description: 椤电爜 type: integer @@ -4322,11 +4323,6 @@ client_id: description: 鎵�灞炲叕鍙窱D type: integer - codeRule: - $ref: '#/definitions/code.CodeStandard' - codeStandID: - description: 缂栫爜id - type: string country_id: description: 鍥藉ID type: integer @@ -5031,6 +5027,10 @@ type: integer process: type: string + products: + items: + $ref: '#/definitions/model.Product' + type: array projected_amount: type: number province_id: diff --git a/model/request/saleChance.go b/model/request/saleChance.go index 20d4619..34085de 100644 --- a/model/request/saleChance.go +++ b/model/request/saleChance.go @@ -1,6 +1,9 @@ package request -import "aps_crm/proto/code" +import ( + "aps_crm/model" + "aps_crm/proto/code" +) type AddSaleChance struct { SaleChance @@ -38,6 +41,7 @@ DetailAddress string `json:"detail_address"` CodeStandID string `json:"codeStandID"` //缂栫爜id CodeRule code.CodeStandard `json:"codeRule"` + Products []*model.Product `json:"products" gorm:"many2many:SaleChance_Product;"` Address } diff --git a/model/saleChance.go b/model/saleChance.go index 86fcb5f..751863b 100644 --- a/model/saleChance.go +++ b/model/saleChance.go @@ -47,6 +47,7 @@ CollectionProjections []CollectionProjection `json:"collection_projections" gorm:"foreignKey:SaleChanceId"` SalesSources SalesSources `json:"sales_sources"` CodeStandID string `json:"codeStandID" gorm:"column:code_stand_id;type:varchar(255);comment:缂栫爜id"` + Products []*Product `json:"products" gorm:"many2many:SaleChanceProduct;"` Address gorm.Model `json:"-"` } @@ -133,7 +134,7 @@ func (slf *SaleChanceSearch) Update(record *SaleChance) (err error) { var db = slf.build() - err = db.Updates(record).Error + err = db.Preload("Products").Updates(record).Error return } @@ -145,7 +146,7 @@ func (slf *SaleChanceSearch) Find() (record SaleChance, err error) { var db = slf.build() - err = db.First(&record).Error + err = db.Preload("Products").First(&record).Error return } @@ -160,7 +161,7 @@ db = db.Limit(slf.PageSize).Offset((slf.PageNum - 1) * slf.PageSize) } - err := db.Preload("SaleType").Preload("RegularCustomers").Preload("SalesSources"). + err := db.Preload("SaleType").Preload("RegularCustomers").Preload("SalesSources").Preload("Products"). Preload("Member").Preload("SaleStage").Preload("Possibility"). Preload("CollectionProjections").Preload("Client"). Preload("Province").Preload("City").Preload("Contact").Order("id desc").Find(&records).Error diff --git a/model/saleChanceProduct.go b/model/saleChanceProduct.go new file mode 100644 index 0000000..0236b44 --- /dev/null +++ b/model/saleChanceProduct.go @@ -0,0 +1,114 @@ +package model + +import ( + "aps_crm/pkg/mysqlx" + "fmt" + "gorm.io/gorm" +) + +type ( + // SaleChanceProduct 閿�鍞満浼氬拰浜у搧鍏宠仈 + SaleChanceProduct struct { + SaleChanceId int `json:"saleChanceId" gorm:"column:sale_chance_id;type:int;primary_key;not null;default:0"` + ProductId uint `json:"productId" gorm:"primary_key;column:product_id;type:int;not null;default:0;comment:浜у搧id"` + } + + // SaleChanceProductSearch 閿�鍞満浼氬拰浜у搧鍏宠仈鎼滅储鏉′欢 + SaleChanceProductSearch struct { + SaleChanceProduct + Orm *gorm.DB + Keyword string + PageNum int + PageSize int + } +) + +func (SaleChanceProduct) TableName() string { + return "sale_chance_product" +} + +func NewSaleChanceProductSearch() *SaleChanceProductSearch { + return &SaleChanceProductSearch{ + Orm: mysqlx.GetDB(), + } +} + +func (slf *SaleChanceProductSearch) build() *gorm.DB { + var db = slf.Orm.Model(&SaleChanceProduct{}) + + return db +} + +func (slf *SaleChanceProductSearch) Create(record *SaleChanceProduct) error { + var db = slf.build() + return db.Create(record).Error +} + +func (slf *SaleChanceProductSearch) CreateBatch(records []*SaleChanceProduct) error { + var db = slf.build() + return db.Create(records).Error +} + +func (slf *SaleChanceProductSearch) Delete() error { + var db = slf.build() + return db.Delete(&SaleChanceProduct{}).Error +} + +func (slf *SaleChanceProductSearch) Update(record *SaleChanceProduct) error { + var db = slf.build() + return db.Updates(record).Error +} + +func (slf *SaleChanceProductSearch) FindAll() ([]*SaleChanceProduct, error) { + var db = slf.build() + var record = make([]*SaleChanceProduct, 0) + err := db.Find(&record).Error + return record, err +} + +func (slf *SaleChanceProductSearch) SetPage(page, size int) *SaleChanceProductSearch { + slf.PageNum, slf.PageSize = page, size + return slf +} + +func (slf *SaleChanceProductSearch) SetOrm(tx *gorm.DB) *SaleChanceProductSearch { + slf.Orm = tx + return slf +} + +func (slf *SaleChanceProductSearch) First() (*SaleChanceProduct, error) { + var db = slf.build() + var record = new(SaleChanceProduct) + err := db.First(record).Error + return record, err +} + +func (slf *SaleChanceProductSearch) Updates(values interface{}) error { + var db = slf.build() + return db.Updates(values).Error +} + +func (slf *SaleChanceProductSearch) Save(record *SaleChanceProduct) error { + var db = slf.build() + + if err := db.Save(record).Error; err != nil { + return fmt.Errorf("save err: %v, record: %+v", err, record) + } + + return nil +} + +func (slf *SaleChanceProductSearch) Find() ([]*SaleChanceProduct, int64, error) { + var db = slf.build() + var records = make([]*SaleChanceProduct, 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.Find(&records).Error + return records, total, err +} diff --git a/service/saleChance.go b/service/saleChance.go index 1610c07..a8f419b 100644 --- a/service/saleChance.go +++ b/service/saleChance.go @@ -3,6 +3,7 @@ import ( "aps_crm/model" "aps_crm/pkg/ecode" + "gorm.io/gorm" ) type SaleChanceService struct{} @@ -17,7 +18,49 @@ func (SaleChanceService) UpdateSaleChance(saleChange *model.SaleChance) int { // update saleChange - err := model.NewSaleChanceSearch().SetId(saleChange.Id).Update(saleChange) + old, err := model.NewSaleChanceSearch().SetId(saleChange.Id).Find() + if err != nil { + return ecode.SaleChanceNotExist + } + newProducts, removedProducts := NewProductsService().PickDiffProducts(saleChange.Products, old.Products) + err = model.WithTransaction(func(db *gorm.DB) error { + err = model.NewSaleChanceSearch().SetId(saleChange.Id).Update(saleChange) + if err != nil { + return err + } + if len(removedProducts) > 0 { + removedProductIds := make([]uint, 0, len(removedProducts)) + for _, product := range removedProducts { + removedProductIds = append(removedProductIds, product.Id) + } + err = model.NewProductSearch(db).SetIds(removedProductIds).Delete() + if err != nil { + return err + } + } + if len(newProducts) > 0 { + for _, p := range newProducts { + p.Id = 0 + } + err = model.NewProductSearch(db).CreateBatch(newProducts) + if err != nil { + return err + } + var rel []*model.SaleChanceProduct + for _, p := range newProducts { + rel = append(rel, &model.SaleChanceProduct{ + SaleChanceId: saleChange.Id, + ProductId: p.Id, + }) + } + err = model.NewSaleChanceProductSearch().CreateBatch(rel) + if err != nil { + return err + } + } + return nil + }) + if err != nil { return ecode.SaleChanceUpdateErr } -- Gitblit v1.8.0