| | |
| | | sc.Address.CountryId = saleChance.Address.CountryId |
| | | sc.Address.ProvinceId = saleChance.Address.ProvinceId |
| | | sc.CodeStandID = saleChance.CodeStandID |
| | | sc.Products = saleChance.Products |
| | | |
| | | return ecode.OK, sc |
| | | } |
| | |
| | | "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" |
| | | } |
| | | } |
| | | |
| | |
| | | "process": { |
| | | "type": "string" |
| | | }, |
| | | "products": { |
| | | "type": "array", |
| | | "items": { |
| | | "$ref": "#/definitions/model.Product" |
| | | } |
| | | }, |
| | | "projected_amount": { |
| | | "type": "number" |
| | | }, |
| | |
| | | "description": "所属公司ID", |
| | | "type": "integer" |
| | | }, |
| | | "codeRule": { |
| | | "$ref": "#/definitions/code.CodeStandard" |
| | | }, |
| | | "codeStandID": { |
| | | "description": "编码id", |
| | | "type": "string" |
| | | }, |
| | | "country_id": { |
| | | "description": "国家ID", |
| | | "type": "integer" |
| | |
| | | }, |
| | | "process": { |
| | | "type": "string" |
| | | }, |
| | | "products": { |
| | | "type": "array", |
| | | "items": { |
| | | "$ref": "#/definitions/model.Product" |
| | | } |
| | | }, |
| | | "projected_amount": { |
| | | "type": "number" |
| | |
| | | "description": "所属公司ID", |
| | | "type": "integer" |
| | | }, |
| | | "codeRule": { |
| | | "$ref": "#/definitions/code.CodeStandard" |
| | | }, |
| | | "codeStandID": { |
| | | "description": "编码id", |
| | | "type": "string" |
| | | }, |
| | | "country_id": { |
| | | "description": "国家ID", |
| | | "type": "integer" |
| | |
| | | }, |
| | | "keywordType": { |
| | | "$ref": "#/definitions/constvar.SalesDetailsKeywordType" |
| | | }, |
| | | "number": { |
| | | "description": "销售子单号", |
| | | "type": "string" |
| | | }, |
| | | "page": { |
| | | "description": "页码", |
| | |
| | | "client_id": { |
| | | "description": "所属公司ID", |
| | | "type": "integer" |
| | | }, |
| | | "codeRule": { |
| | | "$ref": "#/definitions/code.CodeStandard" |
| | | }, |
| | | "codeStandID": { |
| | | "description": "编码id", |
| | | "type": "string" |
| | | }, |
| | | "country_id": { |
| | | "description": "国家ID", |
| | |
| | | "process": { |
| | | "type": "string" |
| | | }, |
| | | "products": { |
| | | "type": "array", |
| | | "items": { |
| | | "$ref": "#/definitions/model.Product" |
| | | } |
| | | }, |
| | | "projected_amount": { |
| | | "type": "number" |
| | | }, |
| | |
| | | "process": { |
| | | "type": "string" |
| | | }, |
| | | "products": { |
| | | "type": "array", |
| | | "items": { |
| | | "$ref": "#/definitions/model.Product" |
| | | } |
| | | }, |
| | | "projected_amount": { |
| | | "type": "number" |
| | | }, |
| | |
| | | "description": "所属公司ID", |
| | | "type": "integer" |
| | | }, |
| | | "codeRule": { |
| | | "$ref": "#/definitions/code.CodeStandard" |
| | | }, |
| | | "codeStandID": { |
| | | "description": "编码id", |
| | | "type": "string" |
| | | }, |
| | | "country_id": { |
| | | "description": "国家ID", |
| | | "type": "integer" |
| | |
| | | }, |
| | | "process": { |
| | | "type": "string" |
| | | }, |
| | | "products": { |
| | | "type": "array", |
| | | "items": { |
| | | "$ref": "#/definitions/model.Product" |
| | | } |
| | | }, |
| | | "projected_amount": { |
| | | "type": "number" |
| | |
| | | "description": "所属公司ID", |
| | | "type": "integer" |
| | | }, |
| | | "codeRule": { |
| | | "$ref": "#/definitions/code.CodeStandard" |
| | | }, |
| | | "codeStandID": { |
| | | "description": "编码id", |
| | | "type": "string" |
| | | }, |
| | | "country_id": { |
| | | "description": "国家ID", |
| | | "type": "integer" |
| | |
| | | }, |
| | | "keywordType": { |
| | | "$ref": "#/definitions/constvar.SalesDetailsKeywordType" |
| | | }, |
| | | "number": { |
| | | "description": "销售子单号", |
| | | "type": "string" |
| | | }, |
| | | "page": { |
| | | "description": "页码", |
| | |
| | | "client_id": { |
| | | "description": "所属公司ID", |
| | | "type": "integer" |
| | | }, |
| | | "codeRule": { |
| | | "$ref": "#/definitions/code.CodeStandard" |
| | | }, |
| | | "codeStandID": { |
| | | "description": "编码id", |
| | | "type": "string" |
| | | }, |
| | | "country_id": { |
| | | "description": "国家ID", |
| | |
| | | "process": { |
| | | "type": "string" |
| | | }, |
| | | "products": { |
| | | "type": "array", |
| | | "items": { |
| | | "$ref": "#/definitions/model.Product" |
| | | } |
| | | }, |
| | | "projected_amount": { |
| | | "type": "number" |
| | | }, |
| | |
| | | $ref: '#/definitions/model.Possibility' |
| | | process: |
| | | type: string |
| | | products: |
| | | items: |
| | | $ref: '#/definitions/model.Product' |
| | | type: array |
| | | projected_amount: |
| | | type: number |
| | | province: |
| | |
| | | client_id: |
| | | description: 所属公司ID |
| | | type: integer |
| | | codeRule: |
| | | $ref: '#/definitions/code.CodeStandard' |
| | | codeStandID: |
| | | description: 编码id |
| | | type: string |
| | | country_id: |
| | | description: 国家ID |
| | | type: integer |
| | |
| | | type: integer |
| | | process: |
| | | type: string |
| | | products: |
| | | items: |
| | | $ref: '#/definitions/model.Product' |
| | | type: array |
| | | projected_amount: |
| | | type: number |
| | | province_id: |
| | |
| | | client_id: |
| | | description: 所属公司ID |
| | | type: integer |
| | | codeRule: |
| | | $ref: '#/definitions/code.CodeStandard' |
| | | codeStandID: |
| | | description: 编码id |
| | | type: string |
| | | country_id: |
| | | description: 国家ID |
| | | type: integer |
| | |
| | | type: string |
| | | keywordType: |
| | | $ref: '#/definitions/constvar.SalesDetailsKeywordType' |
| | | number: |
| | | description: 销售子单号 |
| | | type: string |
| | | page: |
| | | description: 页码 |
| | | type: integer |
| | |
| | | client_id: |
| | | description: 所属公司ID |
| | | type: integer |
| | | codeRule: |
| | | $ref: '#/definitions/code.CodeStandard' |
| | | codeStandID: |
| | | description: 编码id |
| | | type: string |
| | | country_id: |
| | | description: 国家ID |
| | | type: integer |
| | |
| | | type: integer |
| | | process: |
| | | type: string |
| | | products: |
| | | items: |
| | | $ref: '#/definitions/model.Product' |
| | | type: array |
| | | projected_amount: |
| | | type: number |
| | | province_id: |
| | |
| | | package request |
| | | |
| | | import "aps_crm/proto/code" |
| | | import ( |
| | | "aps_crm/model" |
| | | "aps_crm/proto/code" |
| | | ) |
| | | |
| | | type AddSaleChance struct { |
| | | SaleChance |
| | |
| | | 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 |
| | | } |
| | | |
| | |
| | | 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:"-"` |
| | | } |
| | |
| | | |
| | | 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 |
| | | } |
| | | |
| | |
| | | |
| | | 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 |
| | | } |
| | | |
| | |
| | | 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 |
New file |
| | |
| | | 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 |
| | | } |
| | |
| | | import ( |
| | | "aps_crm/model" |
| | | "aps_crm/pkg/ecode" |
| | | "gorm.io/gorm" |
| | | ) |
| | | |
| | | type SaleChanceService struct{} |
| | |
| | | |
| | | 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 |
| | | } |