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