沈阳玫苑物业管理后端
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

154 lines
4.6 KiB

package models
import (
"fmt"
"github.com/go-xorm/xorm"
"lapp_-wy/utils"
"strings"
"time"
)
type Chargeallocationtab struct {
Cid int `json:"cid" xorm:"not null pk INT(4)"`
Chargeallocationnr int `json:"chargeallocationnr" xorm:"not null pk INT(4)"`
Chargenr int `json:"chargenr" xorm:"INT(4)"`
Allocateyear int `json:"allocateyear" xorm:"INT(4)"`
Allocatemonth int `json:"allocatemonth" xorm:"INT(2)"`
Allocateexpense float64 `json:"allocateexpense" xorm:"DECIMAL(10,2)"`
Createtime string `json:"createtime" xorm:"VARCHAR(14)"`
Lastmodifytime string `json:"lastmodifytime" xorm:"VARCHAR(20)"`
Lastmodifyby string `json:"lastmodifyby" xorm:"VARCHAR(20)"`
}
func (t *Chargeallocationtab) TableName() string {
return "chargeallocationtab"
}
/***
*分摊算法:递归
*逻辑:把跨年的费用分摊到每年,
*@param:begdate 开始时间
*@param:enddate 结束时间
*@param:money 分摊金额
*@param:chargenr 费用单号
***********/
func ChargeDiGui(session *xorm.Session, cid int, chargenr int, begdate string, enddate string, money float64) bool {
//计算当前开始时间的最后一天
begtime, _ := utils.TimeParseyyyyMMdd(begdate)
lastYearDay := utils.TimeReturnLastYear(begtime)
//比较日期,退出条件
t1, _ := utils.TimeParseyyyyMMdd(lastYearDay)
t2, _ := utils.TimeParseyyyyMMdd(enddate)
ok := t1.After(t2)
if ok {
//生成流水号
Cnr := new(Snrtab)
Cnr.Cid = cid
orderId, err := Cnr.GetNextSnr("Yearnr")
if err != nil {
return false
}
//直接添加费用记录
info := new(Chargeallocationtab)
info.Cid = cid
info.Chargenr = chargenr
info.Createtime = utils.TimeFormat(time.Now(), "yyyyMMddHHmmss")
info.Lastmodifytime = utils.TimeFormat(time.Now(), "yyyyMMddHHmmss")
info.Allocateexpense = money
info.Allocateyear = t1.Year()
info.Chargeallocationnr = utils.ValueToInt(orderId, 0)
_, err = session.Table("chargeallocationtab").Insert(info)
if err != nil {
return false
}
return true
}
//计算分摊比例金额,添加记录,并进入下一次递归循环
allday := utils.TimeSub(begtime, t2) //总天数
nowday := utils.TimeSub(begtime, t1) //当前年份总天数
rate := utils.ValueToFloat(nowday, 0.0) / utils.ValueToFloat(allday, 0.0)
temMoney := money * rate //当前金额
tem := fmt.Sprintf("%0.0f", temMoney)
nowMoney := utils.ValueToFloat(tem, 0.0)
remainMoney := money - nowMoney //剩余金额
//生成流水号
Cnr := new(Snrtab)
Cnr.Cid = cid
orderId, err := Cnr.GetNextSnr("Yearnr")
if err != nil {
return false
}
info := new(Chargeallocationtab)
info.Cid = cid
info.Chargenr = chargenr
info.Createtime = utils.TimeFormat(time.Now(), "yyyyMMddHHmmss")
info.Lastmodifytime = utils.TimeFormat(time.Now(), "yyyyMMddHHmmss")
info.Allocateexpense = nowMoney
info.Allocateyear = t1.Year()
info.Chargeallocationnr = utils.ValueToInt(orderId, 0)
_, err = session.Table("chargeallocationtab").Insert(info)
if err != nil {
return false
}
//递归循环
begYear := t1.AddDate(0, 0, 1)
begYearDay := utils.TimeFormat(begYear, "yyyy-MM-dd")
res := ChargeDiGui(session, cid, chargenr, begYearDay, enddate, remainMoney)
if !res {
return false
}
return true
}
/***
*逻辑:把跨年的费用分摊到每年每月,
*@param:begdate 开始时间
*@param:enddate 结束时间
*@param:money 分摊金额,保留四位小数
*@param:chargenr 费用单号
***********/
func ChargeShareTheMonth(session *xorm.Session, cid int, chargenr int, begdate string, enddate string, money float64) bool {
//计算出一共有多少个年月的数组
fmt.Println("begdate:", begdate, "enddate:", enddate)
months := utils.SelectMonth(begdate, enddate)
//计算出总数
lenth := len(months)
if lenth == 0 {
fmt.Println("month here error:")
return false
}
monthAmt := money / float64(lenth)
for _, v := range months {
//分割年月
yam := strings.Split(v, "/")
year := yam[0]
month := yam[1]
//生成流水号
Cnr := new(Snrtab)
Cnr.Cid = cid
orderId, err := Cnr.GetNextSnr("Yearnr")
if err != nil {
fmt.Println("here error:", err)
return false
}
//直接添加费用记录
info := new(Chargeallocationtab)
info.Cid = cid
info.Chargenr = chargenr
info.Createtime = utils.TimeFormat(time.Now(), "yyyyMMddHHmmss")
info.Lastmodifytime = utils.TimeFormat(time.Now(), "yyyyMMddHHmmss")
info.Allocateexpense = monthAmt
info.Allocateyear = utils.ValueToInt(year, 0)
info.Allocatemonth = utils.ValueToInt(month, 0)
info.Chargeallocationnr = utils.ValueToInt(orderId, 0)
_, err = session.Table("chargeallocationtab").Insert(info)
if err != nil {
continue
}
}
return true
}