From 1fc5652567b9668bde0c4f174bc9b2458de751eb Mon Sep 17 00:00:00 2001
From: zhangqian <zhangqian@123.com>
Date: 星期五, 18 八月 2023 16:36:09 +0800
Subject: [PATCH] 销售明细修改产品

---
 constvar/serviceContractStatus.go      |   12 +
 service/salesDetails.go                |   25 ++
 constvar/salesDetailsProduct.go        |   12 +
 model/request/serviceContractStatus.go |   19 +
 model/serviceContractStatus.go         |   87 +++++--
 service/dataServer.go                  |    5 
 model/salesDetailsProduct.go           |  133 ++++++++++++
 model/request/salesDetailsProduct.go   |   22 ++
 service/serviceContractStatus.go       |   98 ++++----
 model/product.go                       |  121 ++++++++++
 model/salesDetails.go                  |    5 
 router/serviceContractStatus.go        |    3 
 api/v1/serviceContractStatus.go        |   79 +++---
 13 files changed, 489 insertions(+), 132 deletions(-)

diff --git a/api/v1/serviceContractStatus.go b/api/v1/serviceContractStatus.go
index ffbf8bd..c3786b7 100644
--- a/api/v1/serviceContractStatus.go
+++ b/api/v1/serviceContractStatus.go
@@ -1,12 +1,11 @@
-
 package v1
 
 import (
-	"aps_crm/model"
 	"aps_crm/model/request"
 	"aps_crm/model/response"
 	"aps_crm/pkg/contextx"
 	"aps_crm/pkg/ecode"
+	"aps_crm/service"
 	"github.com/gin-gonic/gin"
 	"strconv"
 )
@@ -14,13 +13,12 @@
 type ServiceContractStatusApi struct{}
 
 // Add
-//
-//	@Tags		ServiceContractStatus
-//	@Summary	娣诲姞鏈嶅姟鍚堝悓鐘舵��
-//	@Produce	application/json
-//	@Param		object	body		request.AddServiceContractStatus	true	"鏌ヨ鍙傛暟"
-//	@Success	200		{object}	contextx.Response{}
-//	@Router		/api/serviceContractStatus/add [post]
+// @Tags    鍚堝悓鐘舵��
+// @Summary	娣诲姞鍚堝悓鐘舵��
+// @Produce	application/json
+// @Param		object	body		request.AddServiceContractStatus	true	"鏌ヨ鍙傛暟"
+// @Success	200		{object}	contextx.Response{}
+// @Router		/api/serviceContractStatus/add [post]
 func (s *ServiceContractStatusApi) Add(c *gin.Context) {
 	var params request.AddServiceContractStatus
 	ctx, ok := contextx.NewContext(c, &params)
@@ -28,10 +26,7 @@
 		return
 	}
 
-	serviceContractStatus := new(model.ServiceContractStatus)
-	serviceContractStatus.Name = params.Name
-
-	errCode := serviceContractStatusService.AddServiceContractStatus(serviceContractStatus)
+	errCode := service.NewServiceContractStatusService().AddServiceContractStatus(&params.ServiceContractStatus)
 	if errCode != ecode.OK {
 		ctx.Fail(errCode)
 		return
@@ -41,13 +36,12 @@
 }
 
 // Delete
-//
-//	@Tags		ServiceContractStatus
-//	@Summary	鍒犻櫎鏈嶅姟鍚堝悓鐘舵��
-//	@Produce	application/json
-//	@Param		id	path		int	true	"鏌ヨ鍙傛暟"
-//	@Success	200	{object}	contextx.Response{}
-//	@Router		/api/serviceContractStatus/delete/{id} [delete]
+// @Tags		鍚堝悓鐘舵��
+// @Summary	鍒犻櫎鍚堝悓鐘舵��
+// @Produce	application/json
+// @Param		id	path		int	true	"鏌ヨ鍙傛暟"
+// @Success	200	{object}	contextx.Response{}
+// @Router		/api/serviceContractStatus/delete/{id} [delete]
 func (s *ServiceContractStatusApi) Delete(c *gin.Context) {
 	ctx, ok := contextx.NewContext(c, nil)
 	if !ok {
@@ -55,7 +49,7 @@
 	}
 
 	id, _ := strconv.Atoi(c.Param("id"))
-	errCode := serviceContractStatusService.DeleteServiceContractStatus(id)
+	errCode := service.NewServiceContractStatusService().DeleteServiceContractStatus(id)
 	if errCode != ecode.OK {
 		ctx.Fail(errCode)
 		return
@@ -65,21 +59,24 @@
 }
 
 // Update
-//
-//	@Tags		ServiceContractStatus
-//	@Summary	鏇存柊鏈嶅姟鍚堝悓鐘舵��
-//	@Produce	application/json
-//	@Param		object	body		request.UpdateServiceContractStatuss	true	"鏌ヨ鍙傛暟"
-//	@Success	200		{object}	contextx.Response{}
-//	@Router		/api/serviceContractStatus/update [put]
+// @Tags		鍚堝悓鐘舵��
+// @Summary	鏇存柊鍚堝悓鐘舵��
+// @Produce	application/json
+// @Param		object	body		request.UpdateServiceContractStatus	true	"鏌ヨ鍙傛暟"
+// @Success	200		{object}	contextx.Response{}
+// @Router		/api/serviceContractStatus/update [put]
 func (s *ServiceContractStatusApi) Update(c *gin.Context) {
-	var params request.UpdateServiceContractStatuss
+	var params request.UpdateServiceContractStatus
 	ctx, ok := contextx.NewContext(c, &params)
 	if !ok {
 		return
 	}
+    if params.Id == 0 {
+        ctx.Fail(ecode.ParamsErr)
+    }
+    params.ServiceContractStatus.Id = params.Id
 
-	errCode := serviceContractStatusService.UpdateServiceContractStatus(params.ServiceContractStatuss)
+	errCode := service.NewServiceContractStatusService().UpdateServiceContractStatus(&params.ServiceContractStatus)
 	if errCode != ecode.OK {
 		ctx.Fail(errCode)
 		return
@@ -89,25 +86,27 @@
 }
 
 // List
-//
-//	@Tags		ServiceContractStatus
-//	@Summary	鑾峰彇鏈嶅姟鍚堝悓鐘舵�佸垪琛�
-//	@Produce	application/json
-//	@Success	200	{object}	contextx.Response{data=response.ServiceContractStatusResponse}
-//	@Router		/api/serviceContractStatus/list [get]
+// @Tags		鍚堝悓鐘舵��
+// @Summary	鑾峰彇鍚堝悓鐘舵�佸垪琛�
+// @Produce	application/json
+// @Param		object	query		request.GetServiceContractStatusList	true	"鍙傛暟"
+// @Success	200	{object}	response.ListResponse{data=[]model.ServiceContractStatus}
+// @Router		/api/serviceContractStatus/list [get]
 func (s *ServiceContractStatusApi) List(c *gin.Context) {
-	ctx, ok := contextx.NewContext(c, nil)
+	var params request.GetServiceContractStatusList
+	ctx, ok := contextx.NewContext(c, &params)
 	if !ok {
 		return
 	}
 
-	serviceContractStatuss, errCode := serviceContractStatusService.GetServiceContractStatusList()
+	serviceContractStatus, total, errCode := service.NewServiceContractStatusService().GetServiceContractStatusList()
 	if errCode != ecode.OK {
 		ctx.Fail(errCode)
 		return
 	}
 
-	ctx.OkWithDetailed(response.ServiceContractStatusResponse{
-		List: serviceContractStatuss,
+	ctx.OkWithDetailed(response.ListResponse{
+		Data: serviceContractStatus,
+		Count: total,
 	})
 }
diff --git a/constvar/salesDetailsProduct.go b/constvar/salesDetailsProduct.go
new file mode 100644
index 0000000..6803cbb
--- /dev/null
+++ b/constvar/salesDetailsProduct.go
@@ -0,0 +1,12 @@
+package constvar
+type SalesDetailsProductQueryClass string
+
+const (
+	SalesDetailsProductQueryClassExpireLessThen60Days SalesDetailsProductQueryClass = ""
+)
+
+type SalesDetailsProductKeywordType string
+
+const (
+	SalesDetailsProductKeywordCustomerName   SalesDetailsProductKeywordType = ""
+)
diff --git a/constvar/serviceContractStatus.go b/constvar/serviceContractStatus.go
new file mode 100644
index 0000000..232e49a
--- /dev/null
+++ b/constvar/serviceContractStatus.go
@@ -0,0 +1,12 @@
+package constvar
+type ServiceContractStatusQueryClass string
+
+const (
+	ServiceContractStatusQueryClassExpireLessThen60Days ServiceContractStatusQueryClass = ""
+)
+
+type ServiceContractStatusKeywordType string
+
+const (
+	ServiceContractStatusKeywordCustomerName   ServiceContractStatusKeywordType = ""
+)
diff --git a/model/product.go b/model/product.go
index a61ee23..7ec7b6b 100644
--- a/model/product.go
+++ b/model/product.go
@@ -1,21 +1,122 @@
 package model
 
 import (
+	"aps_crm/pkg/mysqlx"
 	"github.com/shopspring/decimal"
 	"gorm.io/gorm"
 )
 
-type Product struct {
-	Id         uint            `json:"id" gorm:"column:id;primary_key;AUTO_INCREMENT"`
-	Name       string          `json:"name" gorm:"column:name;type:varchar(255);comment:浜у搧鍚嶇О"`
-	Price      decimal.Decimal `json:"price" gorm:"column:price;type:decimal(10,2);comment:浜у搧浠锋牸"`
-	Number     string          `json:"number" gorm:"column:number;type:varchar(255);comment:浜у搧缂栧彿"`
-	Amount     decimal.Decimal `json:"amount" gorm:"column:amount;type:int;comment:浜у搧鏁伴噺"`
-	Total      decimal.Decimal `json:"total" gorm:"column:total;type:decimal(10,2);comment:浜у搧鎬讳环"`
-	Desc       string          `json:"desc" gorm:"column:desc;type:varchar(255);comment:浜у搧鎻忚堪"`
-	gorm.Model `json:"-"`
-}
+type (
+	Product struct {
+		Id         uint            `json:"id" gorm:"column:id;primary_key;AUTO_INCREMENT"`
+		Name       string          `json:"name" gorm:"column:name;type:varchar(255);comment:浜у搧鍚嶇О"`
+		Price      decimal.Decimal `json:"price" gorm:"column:price;type:decimal(10,2);comment:浜у搧浠锋牸"`
+		Number     string          `json:"number" gorm:"column:number;type:varchar(255);comment:浜у搧缂栧彿"`
+		Amount     decimal.Decimal `json:"amount" gorm:"column:amount;type:int;comment:浜у搧鏁伴噺"`
+		Total      decimal.Decimal `json:"total" gorm:"column:total;type:decimal(10,2);comment:浜у搧鎬讳环"`
+		Desc       string          `json:"desc" gorm:"column:desc;type:varchar(255);comment:浜у搧鎻忚堪"`
+		gorm.Model `json:"-"`
+	}
+
+	ProductSearch struct {
+		Product
+		Ids []uint
+		Orm *gorm.DB
+	}
+)
 
 func (Product) TableName() string {
 	return "products"
 }
+
+func NewProductSearch(db *gorm.DB) *ProductSearch {
+	if db == nil {
+		db = mysqlx.GetDB()
+	}
+
+	return &ProductSearch{
+		Orm: db,
+	}
+}
+
+func (slf *ProductSearch) build() *gorm.DB {
+	var db = slf.Orm.Model(&Product{})
+	if slf.Id != 0 {
+		db = db.Where("id = ?", slf.Id)
+	}
+	if slf.Name != "" {
+		db = db.Where("name = ?", slf.Name)
+	}
+
+	return db
+}
+
+// Create 鍒涘缓
+func (slf *ProductSearch) Create(record *Product) error {
+	var db = slf.build()
+	return db.Create(record).Error
+}
+
+func (slf *ProductSearch) CreateBatch(records []*Product) error {
+	var db = slf.build()
+	return db.Create(records).Error
+}
+
+func (slf *ProductSearch) Delete() error {
+	var db = slf.build()
+	return db.Delete(&Product{}).Error
+}
+
+func (slf *ProductSearch) Update(record *Product) error {
+	var db = slf.build()
+	return db.Updates(record).Error
+}
+
+func (slf *ProductSearch) GetListByIds(ids []int) (result []Product, err error) {
+	var db = slf.build()
+	err = db.Where("id in (?)", ids).Find(&result).Error
+	return
+}
+
+func (slf *ProductSearch) Find() (result []Product, err error) {
+	var db = slf.build()
+	err = db.Preload("country").Find(&result).Error
+	return
+}
+
+func (slf *ProductSearch) SetId(id uint) *ProductSearch {
+	slf.Id = id
+	return slf
+}
+
+func (slf *ProductSearch) SetIds(ids []uint) *ProductSearch {
+	slf.Ids = ids
+	return slf
+}
+
+func (slf *ProductSearch) SetName(name string) *ProductSearch {
+	slf.Name = name
+	return slf
+}
+
+func (slf *ProductSearch) UpdateList(m map[string]interface{}, ids []int) error {
+	var db = slf.build()
+	return db.Where("id in (?)", ids).Updates(m).Error
+}
+
+func (slf *ProductSearch) First() (result Product, err error) {
+	var db = slf.build()
+	err = db.First(&result).Error
+	return
+}
+
+func (slf *ProductSearch) FindAll() (result []*Product, err error) {
+	var db = slf.build()
+	err = db.Find(&result).Error
+	return
+}
+
+func (slf *ProductSearch) Updates(m map[string]interface{}) error {
+	var db = slf.build()
+	return db.Updates(m).Error
+}
diff --git a/model/request/salesDetailsProduct.go b/model/request/salesDetailsProduct.go
new file mode 100644
index 0000000..b494989
--- /dev/null
+++ b/model/request/salesDetailsProduct.go
@@ -0,0 +1,22 @@
+package request
+
+import (
+    "aps_crm/constvar"
+    "aps_crm/model"
+)
+
+type AddSalesDetailsProduct struct {
+	model.SalesDetailsProduct
+}
+
+type UpdateSalesDetailsProduct struct {
+	Id int `json:"id"`
+	model.SalesDetailsProduct
+}
+
+type GetSalesDetailsProductList struct {
+	PageInfo
+	QueryClass  constvar.SalesDetailsProductQueryClass  `json:"queryClass" form:"queryClass"`
+	KeywordType constvar.SalesDetailsProductKeywordType `json:"keywordType"  form:"keywordType"`
+	Keyword     string                       `json:"keyword" form:"keyword"`
+}
diff --git a/model/request/serviceContractStatus.go b/model/request/serviceContractStatus.go
index 98ec257..8c3d71d 100644
--- a/model/request/serviceContractStatus.go
+++ b/model/request/serviceContractStatus.go
@@ -1,15 +1,22 @@
-
 package request
 
+import (
+    "aps_crm/constvar"
+    "aps_crm/model"
+)
+
 type AddServiceContractStatus struct {
-	Name string `  json:"name" binding:"required"`
+	model.ServiceContractStatus
 }
 
 type UpdateServiceContractStatus struct {
-	Id   int    `json:"id" binding:"required"`
-	Name string `json:"name" binding:"required"`
+	Id int `json:"id"`
+	model.ServiceContractStatus
 }
 
-type UpdateServiceContractStatuss struct {
-	ServiceContractStatuss []*UpdateServiceContractStatus `json:"service_contract_status" binding:"required"`
+type GetServiceContractStatusList struct {
+	PageInfo
+	QueryClass  constvar.ServiceContractStatusQueryClass  `json:"queryClass" form:"queryClass"`
+	KeywordType constvar.ServiceContractStatusKeywordType `json:"keywordType"  form:"keywordType"`
+	Keyword     string                       `json:"keyword" form:"keyword"`
 }
diff --git a/model/salesDetails.go b/model/salesDetails.go
index 55a6912..a2659d8 100644
--- a/model/salesDetails.go
+++ b/model/salesDetails.go
@@ -224,3 +224,8 @@
 	amount = record.AmountUnInvoiced.Add(amount)
 	return slf.UpdateByMap(map[string]interface{}{"amount_not_invoiced": amount})
 }
+
+func (slf *SalesDetailsSearch) UpdateProducts(record *SalesDetails, newProducts, removedProducts []*Product) error {
+	var db = slf.build()
+	return db.Updates(record).Error
+}
diff --git a/model/salesDetailsProduct.go b/model/salesDetailsProduct.go
new file mode 100644
index 0000000..467b869
--- /dev/null
+++ b/model/salesDetailsProduct.go
@@ -0,0 +1,133 @@
+package model
+
+import (
+	"aps_crm/constvar"
+	"aps_crm/pkg/mysqlx"
+	"fmt"
+	"gorm.io/gorm"
+)
+
+type (
+	// SalesDetailsProduct 閿�鍞槑缁嗗拰浜у搧鍏宠仈
+	SalesDetailsProduct struct {
+		SalesDetailsId int  `json:"id" gorm:"column:id;type:int;primary_key;AUTO_INCREMENT"`
+		ProductId      uint `json:"name" gorm:"primary_key;column:name;type:varchar(255);not null;default:'';comment:鍚嶇О"`
+	}
+
+	// SalesDetailsProductSearch 閿�鍞槑缁嗗拰浜у搧鍏宠仈鎼滅储鏉′欢
+	SalesDetailsProductSearch struct {
+		SalesDetailsProduct
+		Orm         *gorm.DB
+		QueryClass  constvar.SalesDetailsProductQueryClass
+		KeywordType constvar.SalesDetailsProductKeywordType
+		Keyword     string
+		PageNum     int
+		PageSize    int
+	}
+)
+
+func (SalesDetailsProduct) TableName() string {
+	return "sales_details_product"
+}
+
+func NewSalesDetailsProductSearch() *SalesDetailsProductSearch {
+	return &SalesDetailsProductSearch{
+		Orm: mysqlx.GetDB(),
+	}
+}
+
+func (slf *SalesDetailsProductSearch) build() *gorm.DB {
+	var db = slf.Orm.Model(&SalesDetailsProduct{})
+
+	return db
+}
+
+func (slf *SalesDetailsProductSearch) Create(record *SalesDetailsProduct) error {
+	var db = slf.build()
+	return db.Create(record).Error
+}
+
+func (slf *SalesDetailsProductSearch) CreateBatch(records []*SalesDetailsProduct) error {
+	var db = slf.build()
+	return db.Create(records).Error
+}
+
+func (slf *SalesDetailsProductSearch) Delete() error {
+	var db = slf.build()
+	return db.Delete(&SalesDetailsProduct{}).Error
+}
+
+func (slf *SalesDetailsProductSearch) Update(record *SalesDetailsProduct) error {
+	var db = slf.build()
+	return db.Updates(record).Error
+}
+
+func (slf *SalesDetailsProductSearch) FindAll() ([]*SalesDetailsProduct, error) {
+	var db = slf.build()
+	var record = make([]*SalesDetailsProduct, 0)
+	err := db.Find(&record).Error
+	return record, err
+}
+
+func (slf *SalesDetailsProductSearch) SetPage(page, size int) *SalesDetailsProductSearch {
+	slf.PageNum, slf.PageSize = page, size
+	return slf
+}
+
+func (slf *SalesDetailsProductSearch) SetOrm(tx *gorm.DB) *SalesDetailsProductSearch {
+	slf.Orm = tx
+	return slf
+}
+
+func (slf *SalesDetailsProductSearch) First() (*SalesDetailsProduct, error) {
+	var db = slf.build()
+	var record = new(SalesDetailsProduct)
+	err := db.First(record).Error
+	return record, err
+}
+
+func (slf *SalesDetailsProductSearch) Updates(values interface{}) error {
+	var db = slf.build()
+	return db.Updates(values).Error
+}
+
+func (slf *SalesDetailsProductSearch) Save(record *SalesDetailsProduct) 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 *SalesDetailsProductSearch) Find() ([]*SalesDetailsProduct, int64, error) {
+	var db = slf.build()
+	var records = make([]*SalesDetailsProduct, 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
+}
+
+// InitDefaultData 鍒濆鍖栨暟鎹�
+func (slf *SalesDetailsProductSearch) InitDefaultData() error {
+	var (
+		db          = slf.Orm.Table(slf.TableName())
+		total int64 = 0
+	)
+	if err := db.Count(&total).Error; err != nil {
+		return err
+	}
+	if total != 0 {
+		return nil
+	}
+	records := []*SalesDetailsProduct{}
+	return slf.CreateBatch(records)
+}
diff --git a/model/serviceContractStatus.go b/model/serviceContractStatus.go
index f7e271b..881b69d 100644
--- a/model/serviceContractStatus.go
+++ b/model/serviceContractStatus.go
@@ -1,21 +1,30 @@
 package model
 
 import (
+	"aps_crm/constvar"
 	"aps_crm/pkg/mysqlx"
+	"errors"
+	"fmt"
 	"gorm.io/gorm"
 	"sync"
 )
 
 type (
-	// ServiceContractStatus 鍟嗘満闃舵
+	// ServiceContractStatus 鍚堝悓鐘舵��
 	ServiceContractStatus struct {
-		Id   int    `json:"id" gorm:"column:id;primary_key;AUTO_INCREMENT"`
-		Name string `json:"name" gorm:"column:name;type:varchar(255);comment:鍟嗘満闃舵鍚嶇О"`
+		Id   int    `json:"id" gorm:"column:id;type:int;primary_key;AUTO_INCREMENT"`
+		Name string `json:"name" gorm:"column:name;type:varchar(255);not null;default:'';comment:鍚嶇О"`
 	}
 
+	// ServiceContractStatusSearch 鍚堝悓鐘舵�佹悳绱㈡潯浠�
 	ServiceContractStatusSearch struct {
 		ServiceContractStatus
-		Orm *gorm.DB
+		Orm         *gorm.DB
+		QueryClass  constvar.ServiceContractStatusQueryClass
+		KeywordType constvar.ServiceContractStatusKeywordType
+		Keyword     string
+		PageNum     int
+		PageSize    int
 	}
 )
 
@@ -34,9 +43,6 @@
 	if slf.Id != 0 {
 		db = db.Where("id = ?", slf.Id)
 	}
-	if slf.Name != "" {
-		db = db.Where("name = ?", slf.Name)
-	}
 
 	return db
 }
@@ -44,6 +50,11 @@
 func (slf *ServiceContractStatusSearch) Create(record *ServiceContractStatus) error {
 	var db = slf.build()
 	return db.Create(record).Error
+}
+
+func (slf *ServiceContractStatusSearch) CreateBatch(records []*ServiceContractStatus) error {
+	var db = slf.build()
+	return db.Create(records).Error
 }
 
 func (slf *ServiceContractStatusSearch) Delete() error {
@@ -56,18 +67,11 @@
 	return db.Updates(record).Error
 }
 
-func (slf *ServiceContractStatusSearch) Find() (*ServiceContractStatus, error) {
-	var db = slf.build()
-	var record = new(ServiceContractStatus)
-	err := db.First(record).Error
-	return record, err
-}
-
 func (slf *ServiceContractStatusSearch) FindAll() ([]*ServiceContractStatus, error) {
 	var db = slf.build()
-	var records = make([]*ServiceContractStatus, 0)
-	err := db.Find(&records).Error
-	return records, err
+	var record = make([]*ServiceContractStatus, 0)
+	err := db.Find(&record).Error
+	return record, err
 }
 
 func (slf *ServiceContractStatusSearch) SetId(id int) *ServiceContractStatusSearch {
@@ -75,19 +79,54 @@
 	return slf
 }
 
-func (slf *ServiceContractStatusSearch) SetName(name string) *ServiceContractStatusSearch {
-	slf.Name = name
+func (slf *ServiceContractStatusSearch) SetPage(page, size int) *ServiceContractStatusSearch {
+	slf.PageNum, slf.PageSize = page, size
 	return slf
 }
 
-func (slf *ServiceContractStatusSearch) Updates(data map[string]interface{}) error {
-	var db = slf.build()
-	return db.Updates(data).Error
+func (slf *ServiceContractStatusSearch) SetOrm(tx *gorm.DB) *ServiceContractStatusSearch {
+	slf.Orm = tx
+	return slf
 }
 
-func (slf *ServiceContractStatusSearch) CreateBatch(records []*ServiceContractStatus) error {
+func (slf *ServiceContractStatusSearch) First() (*ServiceContractStatus, error) {
 	var db = slf.build()
-	return db.Create(records).Error
+	var record = new(ServiceContractStatus)
+	err := db.First(record).Error
+	return record, err
+}
+
+func (slf *ServiceContractStatusSearch) Updates(values interface{}) error {
+	var db = slf.build()
+	return db.Updates(values).Error
+}
+
+func (slf *ServiceContractStatusSearch) Save(record *ServiceContractStatus) error {
+	if record.Id == 0 {
+		return errors.New("id涓虹┖")
+	}
+	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 *ServiceContractStatusSearch) Find() ([]*ServiceContractStatus, int64, error) {
+	var db = slf.build()
+	var records = make([]*ServiceContractStatus, 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
 }
 
 // InitDefaultData 鍒濆鍖栨暟鎹�
diff --git a/router/serviceContractStatus.go b/router/serviceContractStatus.go
index 0f0d48e..53438ff 100644
--- a/router/serviceContractStatus.go
+++ b/router/serviceContractStatus.go
@@ -1,4 +1,3 @@
-
 package router
 
 import (
@@ -17,4 +16,4 @@
 		serviceContractStatusRouter.PUT("update", serviceContractStatusApi.Update)        // 鏇存柊$CName$
 		serviceContractStatusRouter.GET("list", serviceContractStatusApi.List)            // 鑾峰彇$CName$鍒楄〃
 	}
-}
\ No newline at end of file
+}
diff --git a/service/dataServer.go b/service/dataServer.go
index ab15917..4ea3990 100644
--- a/service/dataServer.go
+++ b/service/dataServer.go
@@ -105,7 +105,7 @@
 	data.OrderType = orderTypeList
 
 	// get ServiceContractStatus list
-	serviceContractStatusList, _ := ServiceGroup.GetServiceContractStatusList()
+	serviceContractStatusList, _, _ := ServiceGroup.GetServiceContractStatusList()
 	data.ServiceContractStatus = serviceContractStatusList
 
 	// get ServiceContractType list
@@ -148,8 +148,7 @@
 	currencyList, _ := ServiceGroup.GetCurrencyList()
 	data.Currency = currencyList
 
-
 	errCode = ecode.OK
 
 	return
-}
\ No newline at end of file
+}
diff --git a/service/salesDetails.go b/service/salesDetails.go
index fb9b9dd..a2e5ad8 100644
--- a/service/salesDetails.go
+++ b/service/salesDetails.go
@@ -5,6 +5,7 @@
 	"aps_crm/model"
 	"aps_crm/pkg/ecode"
 	"github.com/shopspring/decimal"
+	"gorm.io/gorm"
 )
 
 type SalesDetailsService struct{}
@@ -71,7 +72,29 @@
 	salesDetails.AmountReceivable = salesDetails.AmountTotal.Sub(salesDetails.AmountReceived)
 	salesDetails.AmountUnInvoiced = salesDetails.AmountTotal.Sub(salesDetails.AmountInvoiced)
 
-	err = model.NewSalesDetailsSearch().SetId(salesDetails.Id).Update(salesDetails)
+	err = model.WithTransaction(func(db *gorm.DB) error {
+		err = model.NewSalesDetailsSearch().SetId(salesDetails.Id).Update(salesDetails)
+		if err != nil {
+			return err
+		}
+		err = model.NewProductSearch(db).SetIds(removedProductIds).Delete()
+		if err != nil {
+			return err
+		}
+		err = model.NewProductSearch(db).CreateBatch(newProducts)
+		if err != nil {
+			return err
+		}
+		var rel []*model.SalesDetailsProduct
+		for _, p := range newProducts {
+			rel = append(rel, &model.SalesDetailsProduct{
+				SalesDetailsId: salesDetails.Id,
+				ProductId:      p.Id,
+			})
+		}
+		return model.NewSalesDetailsProductSearch().CreateBatch(rel)
+	})
+
 	if err != nil {
 		return ecode.SalesDetailsSetErr
 	}
diff --git a/service/serviceContractStatus.go b/service/serviceContractStatus.go
index 93cced0..ac5a82a 100644
--- a/service/serviceContractStatus.go
+++ b/service/serviceContractStatus.go
@@ -1,4 +1,3 @@
-
 package service
 
 import (
@@ -9,61 +8,68 @@
 
 type ServiceContractStatusService struct{}
 
+func NewServiceContractStatusService() ServiceContractStatusService {
+	return ServiceContractStatusService{}
+}
+
 func (ServiceContractStatusService) AddServiceContractStatus(serviceContractStatus *model.ServiceContractStatus) int {
 	err := model.NewServiceContractStatusSearch().Create(serviceContractStatus)
 	if err != nil {
-		return ecode.ServiceContractStatusExist
+		return ecode.DBErr
 	}
 
 	return ecode.OK
 }
 
-func (ServiceContractStatusService) DeleteServiceContractStatus(id int) int {
-	_, err := model.NewServiceContractStatusSearch().SetId(id).Find()
+func (ServiceContractStatusService) GetServiceContractStatus(id int) (*model.ServiceContractStatus, int) {
+	serviceContractStatus, err := model.NewServiceContractStatusSearch().SetId(id).First()
 	if err != nil {
-		return ecode.ServiceContractStatusNotExist
-	}
-
-	err = model.NewServiceContractStatusSearch().SetId(id).Delete()
-	if err != nil {
-		return ecode.ServiceContractStatusNotExist
-	}
-	return ecode.OK
-}
-
-func (ServiceContractStatusService) GetServiceContractStatusList() ([]*model.ServiceContractStatus, int) {
-	list, err := model.NewServiceContractStatusSearch().FindAll()
-	if err != nil {
-		return nil, ecode.ServiceContractStatusListErr
-	}
-
-	return list, ecode.OK
-}
-
-func (ServiceContractStatusService) UpdateServiceContractStatus(serviceContractStatuss []*request.UpdateServiceContractStatus) int {
-	for _, v := range serviceContractStatuss {
-		// check serviceContractStatus exist
-		_, err := model.NewServiceContractStatusSearch().SetId(v.Id).Find()
-		if err != nil {
-			return ecode.ServiceContractStatusNotExist
-		}
-
-		err = model.NewServiceContractStatusSearch().SetId(v.Id).Updates(map[string]interface{}{
-			"name": v.Name,
-		})
-		if err != nil {
-			return ecode.ServiceContractStatusSetErr
-		}
-	}
-
-	return ecode.OK
-}
-
-func (ServiceContractStatusService) GetServiceContractStatusDetail(id int) (*model.ServiceContractStatus, int) {
-	serviceContractStatus, err := model.NewServiceContractStatusSearch().SetId(id).Find()
-	if err != nil {
-		return nil, ecode.ServiceContractStatusNotExist
+		return nil, ecode.DBErr
 	}
 
 	return serviceContractStatus, ecode.OK
 }
+
+func (ServiceContractStatusService) DeleteServiceContractStatus(id int) int {
+	err := model.NewServiceContractStatusSearch().SetId(id).Delete()
+	if err != nil {
+		return ecode.DBErr
+	}
+	return ecode.OK
+}
+
+func (ServiceContractStatusService) GetServiceContractStatusList() ([]*model.ServiceContractStatus, int64, int) {
+	list, total, err := model.NewServiceContractStatusSearch().Find()
+	if err != nil {
+		return nil, 0, ecode.DBErr
+	}
+
+	return list, total, ecode.OK
+}
+
+func (ServiceContractStatusService) UpdateServiceContractStatuss(ServiceContractStatuss []*request.UpdateServiceContractStatus) int {
+	for _, v := range ServiceContractStatuss {
+		// check ServiceContractStatus exist
+		_, err := model.NewServiceContractStatusSearch().SetId(v.Id).First()
+		if err != nil {
+			return ecode.DBErr
+		}
+
+		err = model.NewServiceContractStatusSearch().SetId(v.Id).Updates(map[string]interface{}{
+
+		})
+		if err != nil {
+			return ecode.DBErr
+		}
+	}
+
+	return ecode.OK
+}
+
+func (ServiceContractStatusService) UpdateServiceContractStatus(serviceContractStatus *model.ServiceContractStatus) int {
+		err := model.NewServiceContractStatusSearch().SetId(serviceContractStatus.Id).Save(serviceContractStatus)
+		if err != nil {
+			return ecode.DBErr
+		}
+	return ecode.OK
+}

--
Gitblit v1.8.0