zhangqian
2023-11-01 530fed8ec225453572d57b15c200ab062c335457
model/serviceCollectionPlan.go
@@ -5,27 +5,33 @@
   "aps_crm/pkg/mysqlx"
   "errors"
   "fmt"
   "github.com/shopspring/decimal"
   "gorm.io/gorm"
)
type (
   // ServiceCollectionPlan 服务合同收款计划
   // ServiceCollectionPlan 收款计划
   ServiceCollectionPlan struct {
      Id                int     `json:"id" gorm:"column:id;primary_key;AUTO_INCREMENT"`
      CollectionType    int     `gorm:"collection_type" json:"collectionType"`        // 类型(1 计划收款日期 2 项目状态)
      ServiceContractId int     `gorm:"service_contract_id" json:"serviceContractId"` // 服务合同id
      PrincipalId       int     `gorm:"principal_id" json:"principalId"`              // 收款负责人ID
      Term              int     `gorm:"term" json:"term"`                             // 期次
      Percent           float64 `gorm:"percent" json:"percent"`                       // 比例
      Amount            float64 `gorm:"amount" json:"amount"`                         // 金额
      MoneyType         string  `gorm:"money_type" json:"moneyType"`                  // 币种
      CollectionDate    string  `gorm:"collection_date" json:"collectionDate"`        // 计划收款日期
      Remark            string  `gorm:"remark" json:"remark"`                         // 备注
      Status            int     `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:"column:collection_type;type:tinyint;not null;default 0;comment:类型(1 计划收款日期 2 项目状态)" json:"collectionType"` // 类型(1 计划收款日期 2 项目状态)
      SourceType       constvar.CollectionSourceType `gorm:"column:source_type;type:tinyint;not null;default 0;comment:源单类型(1销售明细2服务合同3销售发票)" json:"sourceType"`       // 源单类型(1销售明细2服务合同3销售发票)
      SourceId         int                           `gorm:"column:source_id;type:int;not null;default 0;comment:源单id" json:"sourceId"`                                // 源单id
      PrincipalId      int                           `gorm:"column:principal_id;type:int;not null;default 0;comment:收款负责人ID" json:"principalId"`                       // 收款负责人ID
      Principal        User                          `gorm:"foreignKey:PrincipalId" json:"principal"`                                                                  // 收款负责人ID
      Term             int                           `gorm:"column:term;type:tinyint;not null;default 0;comment:期次" json:"term"`                                       // 期次
      Percent          decimal.Decimal               `gorm:"column:percent;type:decimal(5,2);not null;default 0.00;comment:收款比例" gorm:"" json:"percent"`               // 比例
      Amount           decimal.Decimal               `gorm:"column:amount;type:decimal(12,2);not null;default '0.00';comment:金额" gorm:"" json:"amount"`                // 金额
      MoneyType        string                        `gorm:"column:money_type;type:varchar(255);not null;default '';comment:币种" json:"moneyType"`                      // 币种
      CollectionDate   string                        `gorm:"column:collection_date;type:varchar(255);not null;default '';comment:计划收款日期" json:"collectionDate"`        // 计划收款日期
      Remark           string                        `gorm:"column:remark;type:varchar(512);not null;default '';comment:备注" json:"remark"`                             // 备注
      Status           constvar.CollectionStatus     `gorm:"column:status;type:tinyint;not null;default '';comment:状态(1未收2部分已收3已收)" 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:"column:file_id;type:int;comment:附件id" json:"fileId"`                                                       // 附件id
   }
   // ServiceCollectionPlanSearch 服务合同收款计划搜索条件
   // ServiceCollectionPlanSearch 收款计划搜索条件
   ServiceCollectionPlanSearch struct {
      ServiceCollectionPlan
      Orm         *gorm.DB
@@ -38,7 +44,7 @@
)
func (ServiceCollectionPlan) TableName() string {
   return "service_collection_plan"
   return "collection_plan"
}
func NewServiceCollectionPlanSearch() *ServiceCollectionPlanSearch {
@@ -53,10 +59,15 @@
      db = db.Where("id = ?", slf.Id)
   }
   if slf.ServiceContractId != 0 {
      db = db.Where("service_contract_id = ?", slf.ServiceContractId)
   if slf.SourceId != 0 {
      db = db.Where("source_id = ?", slf.SourceId)
   }
   if slf.SourceType != 0 {
      db = db.Where("source_type = ?", slf.SourceType)
   }
   db = db.Preload("Principal")
   return db
}
@@ -97,8 +108,13 @@
   return slf
}
func (slf *ServiceCollectionPlanSearch) SetServiceContractId(id int) *ServiceCollectionPlanSearch {
   slf.ServiceContractId = id
func (slf *ServiceCollectionPlanSearch) SetSourceId(id int) *ServiceCollectionPlanSearch {
   slf.SourceId = id
   return slf
}
func (slf *ServiceCollectionPlanSearch) SetSourceType(sourceType constvar.CollectionSourceType) *ServiceCollectionPlanSearch {
   slf.SourceType = sourceType
   return slf
}
@@ -142,6 +158,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 (