From 6285cf3f366b0da28ba7bddbb3bb4c7ec4585d25 Mon Sep 17 00:00:00 2001 From: zhangqian <zhangqian@123.com> Date: 星期五, 11 八月 2023 16:48:05 +0800 Subject: [PATCH] 新增、删除、修改改收款单时若收款源单是收款计划,更新收款单状态和应收、已收金额 --- model/serviceOrder.go | 2 constvar/serviceCollectionPlan.go | 12 +++ service/receipt.go | 86 +++++++++++++++++++++++++--- model/serviceCollectionPlan.go | 61 ++++++++++++++++---- 4 files changed, 136 insertions(+), 25 deletions(-) diff --git a/constvar/serviceCollectionPlan.go b/constvar/serviceCollectionPlan.go index 6f32e72..c59acc5 100644 --- a/constvar/serviceCollectionPlan.go +++ b/constvar/serviceCollectionPlan.go @@ -15,6 +15,14 @@ type CollectionStatus int const ( - CollectionStatusUnCollected CollectionStatus = 1 //寰呮敹娆� - CollectionStatusCollected CollectionStatus = 2 //宸叉敹娆� + CollectionStatusUnCollected CollectionStatus = 1 //寰呮敹娆� + CollectionStatusSubCollected CollectionStatus = 2 //閮ㄥ垎鏀舵 + CollectionStatusCollected CollectionStatus = 3 //宸叉敹娆� +) + +type CollectionSourceType int + +const ( + CollectionSourceTypeSaleDetails CollectionSourceType = 1 //閿�鍞槑缁� + CollectionSourceTypeServiceContract CollectionSourceType = 2 //鏈嶅姟鍚堝悓 ) diff --git a/model/serviceCollectionPlan.go b/model/serviceCollectionPlan.go index cb15770..cfe065c 100644 --- a/model/serviceCollectionPlan.go +++ b/model/serviceCollectionPlan.go @@ -13,19 +13,22 @@ type ( // ServiceCollectionPlan 鏀舵璁″垝 ServiceCollectionPlan struct { - Id int `json:"id" gorm:"column:id;primary_key;AUTO_INCREMENT"` - CollectionType int `gorm:"collection_type" json:"collectionType"` // 绫诲瀷锛�1 璁″垝鏀舵鏃ユ湡 2 椤圭洰鐘舵�侊級 - SourceType int `gorm:"source_type" json:"sourceType"` // 婧愬崟绫诲瀷锛�1閿�鍞槑缁�2鏈嶅姟鍚堝悓3閿�鍞彂绁級 - SourceId int `gorm:"source_id" json:"sourceId"` // 婧愬崟id - PrincipalId int `gorm:"principal_id" json:"principalId"` // 鏀舵璐熻矗浜篒D - Term int `gorm:"term" json:"term"` // 鏈熸 - Percent decimal.Decimal `gorm:"percent" json:"percent"` // 姣斾緥 - Amount decimal.Decimal `gorm:"amount" json:"amount"` // 閲戦 - MoneyType string `gorm:"money_type" json:"moneyType"` // 甯佺 - CollectionDate time.Time `gorm:"collection_date" json:"collectionDate"` // 璁″垝鏀舵鏃ユ湡 - Remark string `gorm:"remark" json:"remark"` // 澶囨敞 - Status constvar.CollectionStatus `gorm:"status" json:"status"` // 鐘舵�侊紙1鏈敹2宸叉敹锛� - FileId int `gorm:"file_id" json:"fileId"` // 闄勪欢id + Id int `json:"id" gorm:"column:id;primary_key;AUTO_INCREMENT"` + CollectionType int `gorm:"collection_type" json:"collectionType"` // 绫诲瀷锛�1 璁″垝鏀舵鏃ユ湡 2 椤圭洰鐘舵�侊級 + SourceType constvar.CollectionSourceType `gorm:"source_type" json:"sourceType"` // 婧愬崟绫诲瀷锛�1閿�鍞槑缁�2鏈嶅姟鍚堝悓3閿�鍞彂绁級 + SourceId int `gorm:"source_id" json:"sourceId"` // 婧愬崟id + PrincipalId int `gorm:"principal_id" json:"principalId"` // 鏀舵璐熻矗浜篒D + Term int `gorm:"term" json:"term"` // 鏈熸 + Percent decimal.Decimal `gorm:"percent" json:"percent"` // 姣斾緥 + Amount decimal.Decimal `gorm:"amount" json:"amount"` // 閲戦 + MoneyType string `gorm:"money_type" json:"moneyType"` // 甯佺 + CollectionDate time.Time `gorm:"collection_date" json:"collectionDate"` // 璁″垝鏀舵鏃ユ湡 + Remark string `gorm:"remark" json:"remark"` // 澶囨敞 + Status constvar.CollectionStatus `gorm:"status" json:"status"` // 鐘舵�侊紙1鏈敹2閮ㄥ垎宸叉敹3宸叉敹锛� + AmountReceivable decimal.Decimal `gorm:"column:amount_receivable;type:decimal(12,2);comment:搴旀敹閲戦" json:"amountReceivable"` // 搴旀敹閲戦 + AmountReceived decimal.Decimal `gorm:"column:amount_received;type:decimal(12,2);comment:宸叉敹閲戦" json:"amountReceived"` // 宸叉敹閲戦 + AmountTotal decimal.Decimal `gorm:"column:amount_total;type:decimal(12,2);comment:鎬婚" json:"amountTotal"` // 鎬婚 + FileId int `gorm:"file_id" json:"fileId"` // 闄勪欢id } // ServiceCollectionPlanSearch 鏀舵璁″垝鎼滅储鏉′欢 @@ -145,6 +148,38 @@ return records, total, err } +func (slf *ServiceCollectionPlanSearch) UpdateByMap(upMap map[string]interface{}) error { + var ( + db = slf.build() + ) + + if err := db.Updates(upMap).Error; err != nil { + return fmt.Errorf("update by map err: %v, upMap: %+v", err, upMap) + } + + return nil +} + +func (slf *ServiceCollectionPlanSearch) UpdateStatusAndAmount(collection *ServiceCollectionPlan, receiveAmount decimal.Decimal) error { + receivedAmount := collection.AmountReceived.Add(receiveAmount) + var status constvar.CollectionStatus + if receiveAmount.GreaterThanOrEqual(collection.AmountTotal) { + status = constvar.CollectionStatusCollected + } else { + status = constvar.CollectionStatusSubCollected + } + receivableAmount := collection.AmountTotal.Add(receivedAmount) + err := slf.SetId(collection.Id).UpdateByMap(map[string]interface{}{ + "status": status, + "amount_received": receivedAmount, + "amount_receivable": receivableAmount}) + if err != nil { + return err + } + + return nil +} + // InitDefaultData 鍒濆鍖栨暟鎹� func (slf *ServiceCollectionPlanSearch) InitDefaultData() error { var ( diff --git a/model/serviceOrder.go b/model/serviceOrder.go index 528b730..f6ef036 100644 --- a/model/serviceOrder.go +++ b/model/serviceOrder.go @@ -39,7 +39,7 @@ FaultType FaultType `gorm:"foreignKey:FaultTypeId"` SeverityId int `gorm:"column:severity_id;type:int;not null;default:0;comment:涓ラ噸绋嬪害id" json:"severity"` // 涓ラ噸绋嬪害id Severity Severity `gorm:"foreignKey:SeverityId"` - ServiceOrderStatusId int `gorm:"column:service_order_status_id;type:int;not null;default:0;comment:鏈嶅姟鍗曠姸鎬乮d" json:"status"` // 澶勭悊鐘舵�� + ServiceOrderStatusId int `gorm:"column:service_order_status_id;type:int;not null;default:0;comment:鏈嶅姟鍗曠姸鎬乮d" json:"serviceOrderStatusId"` // 澶勭悊鐘舵�� ServiceOrderStatus ServiceOrderStatus `gorm:"foreignKey:ServiceOrderStatusId"` ExpectTime string `gorm:"column:expect_time;type:varchar(255);not null;default:'';comment:甯屾湜澶勭悊鏃堕棿" json:"expectTime"` // 甯屾湜澶勭悊鏃堕棿 RealTime string `gorm:"column:real_time;type:varchar(255);not null;default:'';comment:瀹為檯澶勭悊鏃堕棿" json:"realTime"` // 瀹為檯澶勭悊鏃堕棿 diff --git a/service/receipt.go b/service/receipt.go index 4c4d913..9c49878 100644 --- a/service/receipt.go +++ b/service/receipt.go @@ -17,22 +17,45 @@ func (ReceiptService) AddReceipt(receipt *model.Receipt) int { var moneyAdder model.MoneyAdder + var sourceId int + var collection *model.ServiceCollectionPlan + var err error switch receipt.SourceType { case constvar.ReceiptSourceTypeSalesDetails: moneyAdder = model.NewSalesDetailsSearch() + sourceId = receipt.SourceId case constvar.ReceiptSourceTypeServiceContract: moneyAdder = model.NewServiceContractSearch() + sourceId = receipt.SourceId + case constvar.ReceiptSourceTypeCollectionPlan: + collection, err = model.NewServiceCollectionPlanSearch().SetId(receipt.SourceId).First() + if err != nil { + return ecode.DBErr + } + sourceId = collection.SourceId + switch collection.SourceType { + case constvar.CollectionSourceTypeSaleDetails: + moneyAdder = model.NewSalesDetailsSearch() + case constvar.CollectionSourceTypeServiceContract: + moneyAdder = model.NewServiceContractSearch() + } } - err := model.WithTransaction(func(db *gorm.DB) error { + err = model.WithTransaction(func(db *gorm.DB) error { err := model.NewReceiptSearch().SetOrm(db).Create(receipt) if err != nil { return err } - err = moneyAdder.AmountReceivableAdd(db, receipt.SourceId, decimal.Zero.Sub(receipt.Amount).Round(2)) + if receipt.SourceType == constvar.ReceiptSourceTypeCollectionPlan { + err = model.NewServiceCollectionPlanSearch().SetOrm(db).UpdateStatusAndAmount(collection, receipt.Amount) + if err != nil { + return err + } + } + err = moneyAdder.AmountReceivableAdd(db, sourceId, decimal.Zero.Sub(receipt.Amount).Round(2)) if err != nil { return err } - err = moneyAdder.AmountReceivedAdd(db, receipt.SourceId, receipt.Amount.Round(2)) + err = moneyAdder.AmountReceivedAdd(db, sourceId, receipt.Amount.Round(2)) if err != nil { return err } @@ -50,23 +73,46 @@ return ecode.DBErr } var moneyAdder model.MoneyAdder + var sourceId int + var collection *model.ServiceCollectionPlan switch receipt.SourceType { case constvar.ReceiptSourceTypeSalesDetails: moneyAdder = model.NewSalesDetailsSearch() + sourceId = receipt.SourceId case constvar.ReceiptSourceTypeServiceContract: moneyAdder = model.NewServiceContractSearch() + sourceId = receipt.SourceId + case constvar.ReceiptSourceTypeCollectionPlan: + collection, err = model.NewServiceCollectionPlanSearch().SetId(receipt.SourceId).First() + if err != nil { + return ecode.DBErr + } + sourceId = collection.SourceId + switch collection.SourceType { + case constvar.CollectionSourceTypeSaleDetails: + moneyAdder = model.NewSalesDetailsSearch() + case constvar.CollectionSourceTypeServiceContract: + moneyAdder = model.NewServiceContractSearch() + } } err = model.WithTransaction(func(db *gorm.DB) error { - err := model.NewReceiptSearch().SetId(id).Delete() + err := model.NewReceiptSearch().SetOrm(db).SetId(id).Delete() if err != nil { return err } - err = moneyAdder.AmountReceivableAdd(db, receipt.SourceId, receipt.Amount.Round(2)) + if receipt.SourceType == constvar.ReceiptSourceTypeCollectionPlan { + err = model.NewServiceCollectionPlanSearch().SetOrm(db).UpdateStatusAndAmount(collection, decimal.Zero.Sub(receipt.Amount)) + if err != nil { + return err + } + } + + err = moneyAdder.AmountReceivableAdd(db, sourceId, receipt.Amount.Round(2)) if err != nil { return err } - err = moneyAdder.AmountReceivedAdd(db, receipt.SourceId, decimal.Zero.Sub(receipt.Amount).Round(2)) + err = moneyAdder.AmountReceivedAdd(db, sourceId, decimal.Zero.Sub(receipt.Amount).Round(2)) if err != nil { return err } @@ -110,23 +156,45 @@ return ecode.DBErr } var moneyAdder model.MoneyAdder + var sourceId int + var collection *model.ServiceCollectionPlan switch receipt.SourceType { case constvar.ReceiptSourceTypeSalesDetails: moneyAdder = model.NewSalesDetailsSearch() + sourceId = receipt.SourceId case constvar.ReceiptSourceTypeServiceContract: moneyAdder = model.NewServiceContractSearch() + sourceId = receipt.SourceId + case constvar.ReceiptSourceTypeCollectionPlan: + collection, err = model.NewServiceCollectionPlanSearch().SetId(receipt.SourceId).First() + if err != nil { + return ecode.DBErr + } + sourceId = collection.SourceId + switch collection.SourceType { + case constvar.CollectionSourceTypeSaleDetails: + moneyAdder = model.NewSalesDetailsSearch() + case constvar.CollectionSourceTypeServiceContract: + moneyAdder = model.NewServiceContractSearch() + } } err = model.WithTransaction(func(db *gorm.DB) error { - err := model.NewReceiptSearch().SetId(receipt.Id).Save(receipt) + err = model.NewReceiptSearch().SetId(receipt.Id).Save(receipt) if err != nil { return err } diffAmount := receipt.Amount.Sub(old.Amount) - err = moneyAdder.AmountReceivedAdd(db, receipt.SourceId, diffAmount.Round(2)) + if receipt.SourceType == constvar.ReceiptSourceTypeCollectionPlan { + err = model.NewServiceCollectionPlanSearch().SetOrm(db).UpdateStatusAndAmount(collection, diffAmount) + if err != nil { + return err + } + } + err = moneyAdder.AmountReceivedAdd(db, sourceId, diffAmount.Round(2)) if err != nil { return err } - err = moneyAdder.AmountReceivableAdd(db, receipt.SourceId, decimal.Zero.Sub(diffAmount).Round(2)) + err = moneyAdder.AmountReceivableAdd(db, sourceId, decimal.Zero.Sub(diffAmount).Round(2)) if err != nil { return err } -- Gitblit v1.8.0