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