Selaa lähdekoodia

feature(结算): 账单生成与取消时,计算账户可用金额

likai 4 vuotta sitten
vanhempi
commit
c7aadbb318

+ 2 - 0
go.mod

@@ -32,6 +32,7 @@ require (
 	github.com/gogf/mysql v1.6.1-0.20210603073548-16164ae25579 // indirect
 	github.com/gogo/protobuf v1.3.1 // indirect
 	github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 // indirect
+	github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b
 	github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e // indirect
 	github.com/golang/snappy v0.0.2 // indirect
 	github.com/gomodule/redigo v2.0.0+incompatible // indirect
@@ -69,6 +70,7 @@ require (
 	github.com/opentracing/opentracing-go v1.1.1-0.20190913142402-a7454ce5950e // indirect
 	github.com/pkg/errors v0.9.1 // indirect
 	github.com/rivo/uniseg v0.1.0 // indirect
+	github.com/robfig/cron v1.2.0
 	github.com/rpcxio/libkv v0.5.1-0.20210420120011-1fceaedca8a5 // indirect
 	github.com/rs/cors v1.7.0 // indirect
 	github.com/rubyist/circuitbreaker v2.2.1+incompatible // indirect

+ 3 - 0
go.sum

@@ -103,6 +103,7 @@ github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXP
 github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0=
 github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 h1:DACJavvAHhabrF08vX0COfcOBJRhZ8lUbR+ZWIs0Y5g=
 github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k=
+github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b h1:VKtxabqXZkF25pY9ekfRL6a582T4P37/31XEstQ5p58=
 github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
 github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
 github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e h1:1r7pUrabqp18hOBcwBwiTsbnFeTZHV9eER/QT5JVZxY=
@@ -327,6 +328,8 @@ github.com/rcrowley/go-metrics v0.0.0-20200313005456-10cdbea86bc0 h1:MkV+77GLUNo
 github.com/rcrowley/go-metrics v0.0.0-20200313005456-10cdbea86bc0/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4=
 github.com/rivo/uniseg v0.1.0 h1:+2KBaVoUmb9XzDsrx/Ct0W/EYOSFf/nWTauy++DprtY=
 github.com/rivo/uniseg v0.1.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc=
+github.com/robfig/cron v1.2.0 h1:ZjScXvvxeQ63Dbyxy76Fj3AT3Ut0aKsyd2/tl3DTMuQ=
+github.com/robfig/cron v1.2.0/go.mod h1:JGuDeoQd7Z6yL4zQhZ3OPEVHB7fL6Ka6skscFHfmt2k=
 github.com/rpcxio/libkv v0.5.1-0.20210420120011-1fceaedca8a5 h1:oGficf/KJp1y22zTpjjCRtjtNM9QRjww3fqyQPLgypg=
 github.com/rpcxio/libkv v0.5.1-0.20210420120011-1fceaedca8a5/go.mod h1:zHGgtLr3cFhGtbalum0BrMPOjhFZFJXCKiws/25ewls=
 github.com/rs/cors v1.7.0 h1:+88SsELBHx5r+hZ8TCkggzSstaWNbDvThkVK8H6f9ik=

+ 13 - 0
main.go

@@ -2,16 +2,29 @@ package main
 
 import (
 	"context"
+	"github.com/golang/glog"
 	"lims_adapter/handler"
+	"lims_adapter/service/timers"
 
 	_ "lims_adapter/boot"
 
 	"dashoo.cn/micro_libary/micro_srv"
 	"github.com/gogf/gf/frame/g"
+	"github.com/robfig/cron"
 	"github.com/smallnest/rpcx/protocol"
 )
 
 func main() {
+	// 定时任务
+	c := cron.New()
+	spec := "0 0 1 * * ?"					// 每日1点执行
+
+	if err := c.AddJob(spec, timers.Timer{}); err != nil {
+		glog.Error(err.Error())
+	}
+	c.Start()
+
+
 	srvAddr := g.Config().GetString("setting.bind-addr")
 	basePath := g.Config().GetString("setting.srv-name")
 	// 创建总服务包

+ 8 - 2
service/account/account.go

@@ -115,6 +115,12 @@ func (s AccountService) Calculate(req *account.CalculateAmountReq) error {
 	}
 
 	// 计算费用
+	discount := float64(1) // 计算折扣
+	if detail.Data5 != "" {
+		d, _ := strconv.ParseFloat(detail.Data5, 64)
+		discount = 1 - d / 100
+	}
+
 	oldAmount := detail.PaymentAccount
 	main.ActualStartDate = req.SignInTime
 	main.ActualEndDate = req.SignOutTime
@@ -125,11 +131,11 @@ func (s AccountService) Calculate(req *account.CalculateAmountReq) error {
 	detail.ActualMinutes = strconv.Itoa(main.FeeTime)
 	detail.Minutes = strconv.Itoa(main.FeeTime)
 
-	detail.PaymentAccount = float64(main.ActualMachineHour) * detail.UnitPrice / 60 // 计算实际费用
+	detail.PaymentAccount = float64(main.ActualMachineHour) * detail.UnitPrice * discount / 60 // 计算实际费用
 	diffValue := oldAmount - detail.PaymentAccount
 	main.TotalPrice -= diffValue // 计算实际费用
 
-	baseAccount.Available -= diffValue // 账户可用金额计算
+	baseAccount.Available += diffValue // 账户可用金额返还
 
 	tx, err := s.Dao.DB.Begin()
 	if err != nil {

+ 7 - 0
service/settle_account_bill/settle_account_bill.go

@@ -90,4 +90,11 @@ func (s Service) Settle(req accountModel.AccountBillSettleReq, user request.User
 	}
 
 	return tx.Commit()
+}
+
+// 结算
+func (s Service) GenerateBill() error {
+
+
+	return nil
 }

+ 39 - 0
service/settle_account_main/settle_account_main.go

@@ -97,6 +97,7 @@ func (s Service) List(req model.ListReq) ([]accountModel.SettleAccountMain, int,
 // 新增
 func (s Service) Add(req accountModel.AccountMainAddReq, user request.UserInfo) error {
 	now := gtime.Now() // 获取当前时间
+	var baseAccount accountModel.BaseAccount
 
 	// 更新必要信息
 	req.Main.CreateUserId = int(user.Id)
@@ -106,6 +107,17 @@ func (s Service) Add(req accountModel.AccountMainAddReq, user request.UserInfo)
 	req.Main.UpdateBy = user.RealName
 	req.Main.UpdateOn = now
 
+	// 获取账户
+	result1, err := s.Dao.DB.Model("base_account").Where(fmt.Sprintf("MainUserId='%v'", req.Main.MainUserId)).Order("Advance ASC").FindOne()
+	if err != nil {
+		return err
+	}
+	err = result1.Struct(&baseAccount)
+	if err != nil {
+		return err
+	}
+	baseAccount.Available -= req.Main.TotalPrice // 账户可用金额计算
+
 	tx, err := s.Dao.DB.Begin()
 	if err != nil {
 		return err
@@ -133,6 +145,12 @@ func (s Service) Add(req accountModel.AccountMainAddReq, user request.UserInfo)
 		return err
 	}
 
+	_, err = tx.Save("base_account", baseAccount)
+	if err != nil {
+		tx.Rollback()
+		return err
+	}
+
 	return tx.Commit()
 }
 
@@ -153,6 +171,7 @@ func (s Service) Cancel(req accountModel.AccountMainCancelReq, user request.User
 	}
 	var main accountModel.SettleAccountMain
 	var details []accountModel.SettleAccountDetail
+	var baseAccount accountModel.BaseAccount
 	var rules []Param
 	now := gtime.Now()
 	per := float64(0)
@@ -194,6 +213,16 @@ func (s Service) Cancel(req accountModel.AccountMainCancelReq, user request.User
 		return err
 	}
 
+	// 获取账户
+	result1, err := s.Dao.DB.Model("base_account").Where(fmt.Sprintf("MainUserId='%v'", main.MainUserId)).Order("Advance ASC").FindOne()
+	if err != nil {
+		return err
+	}
+	err = result1.Struct(&baseAccount)
+	if err != nil {
+		return err
+	}
+
 	var detail accountModel.SettleAccountDetail
 	detail.PaymentType = "1"
 	detail.PaymentAccount = 0
@@ -229,7 +258,11 @@ func (s Service) Cancel(req accountModel.AccountMainCancelReq, user request.User
 		detail.PaymentAccount += item.PaymentAccount * per
 	}
 
+	oldAmount := main.TotalPrice
 	main.TotalPrice = detail.PaymentAccount
+	diffValue := oldAmount - detail.PaymentAccount
+
+	baseAccount.Available += diffValue // 账户可用金额返还
 
 	tx, err := s.Dao.DB.Begin()
 	if err != nil {
@@ -254,6 +287,12 @@ func (s Service) Cancel(req accountModel.AccountMainCancelReq, user request.User
 		return err
 	}
 
+	_, err = tx.Save("base_account", baseAccount)
+	if err != nil {
+		tx.Rollback()
+		return err
+	}
+
 	return  tx.Commit()
 }
 

+ 21 - 0
service/timers/timers.go

@@ -0,0 +1,21 @@
+package timers
+
+import (
+	"github.com/gogf/gf/frame/g"
+	"github.com/golang/glog"
+	service "lims_adapter/service/settle_account_bill"
+)
+
+// 修改订单状态
+type Timer struct {
+}
+
+func (t Timer) Run() {
+	//fmt.Println(g.Config().GetMap("database"))
+	for tenant := range g.Config().GetMap("database") {
+		localService := service.NewService(tenant)
+		if err := localService.GenerateBill(); err != nil {
+			glog.Error(err.Error())
+		}
+	}
+}