新增、删除、修改改收款单时若收款源单是收款计划,更新收款单状态和应收、已收金额
4个文件已修改
161 ■■■■ 已修改文件
constvar/serviceCollectionPlan.go 12 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
model/serviceCollectionPlan.go 61 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
model/serviceOrder.go 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
service/receipt.go 86 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
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 //服务合同
)
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"`       // 收款负责人ID
        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"`                                                  // 收款负责人ID
        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 (
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:服务单状态id" json:"status"` // 处理状态
        ServiceOrderStatusId int                `gorm:"column:service_order_status_id;type:int;not null;default:0;comment:服务单状态id" 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"`              // 实际处理时间
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
        }