浏览代码

feature(结算): 签到退出时更新费用、返还账号可用费用

likai 4 年之前
父节点
当前提交
d0640e2efc

+ 18 - 0
handler/account.go

@@ -71,3 +71,21 @@ func (a *Account) DepositAccount(ctx context.Context, req *account.BaseAccountRe
 	rsp.Msg = ""
 	return nil
 }
+
+// 计算费用
+func (a *Account) CalculateAmount(ctx context.Context, req *account.CalculateAmountReq, rsp *comm_def.CommonMsg) error {
+	tenant, err := micro_srv.GetTenant(ctx)
+	if err != nil {
+		return err
+	}
+	g.Log().Info("Received Account.CalculateAmount request @ " + tenant)
+	err = service.NewAccountSrv(tenant).Calculate(req)
+	_, err, code, _ := myerrors.CheckError(err)
+	if err != nil {
+		rsp.Code = code
+		return err
+	}
+	rsp.Code = code
+	rsp.Msg = ""
+	return nil
+}

+ 7 - 0
model/account/base_account.go

@@ -5,6 +5,7 @@
 package model
 
 import (
+	"github.com/gogf/gf/os/gtime"
 	"lims_adapter/model/account/internal"
 )
 
@@ -36,3 +37,9 @@ type BaseAccountRsp struct {
 	Records []BaseAccount `json:"records"`
 	Total   int               `json:"total"`
 }
+
+type CalculateAmountReq struct {
+	AppointId  int `json:"appointId"`
+	SignInTime         *gtime.Time `json:"sign_in_time"`         // 签到时间
+	SignOutTime        *gtime.Time `json:"sign_out_time"`        // 签退时间
+}

+ 1 - 1
model/account/internal/settle_account_main.go

@@ -39,7 +39,7 @@ type SettleAccountMain struct {
 	SettleUserId      int         `orm:"SettleUserId"      json:"settle_user_id"`      // 确认人Id
 	SettleUser        int         `orm:"SettleUser"        json:"settle_user"`         // 确认人
 	SettleDate        *gtime.Time `orm:"SettleDate"        json:"settle_date"`         // 确认时间
-	FeeTime           *gtime.Time `orm:"FeeTime"           json:"fee_time"`            // 计费时间
+	FeeTime           int         `orm:"FeeTime"           json:"fee_time"`            // 计费时间
 	Remark            string      `orm:"Remark"            json:"remark"`              // 备注
 	UpdateUserId      int         `orm:"UpdateUserId"      json:"update_user_id"`      // 更新者ID
 	UpdateBy          string      `orm:"UpdateBy"          json:"update_by"`           // 更新者

+ 87 - 0
service/account/account.go

@@ -2,10 +2,12 @@ package account
 
 import (
 	"dashoo.cn/micro_libary/request"
+	"database/sql"
 	"fmt"
 	"github.com/gogf/gf/os/gtime"
 	dao "lims_adapter/dao/account"
 	account "lims_adapter/model/account"
+	"math"
 	"strconv"
 )
 
@@ -67,3 +69,88 @@ func (s AccountService) DepositAccount(req *account.BaseAccountResp) error {
 	_, err := s.Dao.M.Update(fmt.Sprintf("Surplus='%v',Available='%v'", req.Surplus, req.Available), "Id = "+strconv.Itoa(req.Id))
 	return err
 }
+
+// 计算费用
+func (s AccountService) Calculate(req *account.CalculateAmountReq) error {
+	var main account.SettleAccountMain
+	var detail account.SettleAccountDetail
+	var baseAccount account.BaseAccount
+
+	// 获取结算明细记录
+	result, err := s.Dao.DB.Model("settle_account_main").Where(fmt.Sprintf("AppointId='%v'", req.AppointId)).FindOne()
+	if err != nil {
+		if err != sql.ErrNoRows {
+			return err
+		} else {
+			// 预约没有对应的结算明细记录,返回
+			return nil
+		}
+	}
+	err = result.Struct(&main)
+	if err != nil && err != sql.ErrNoRows {
+		return err
+	}
+	if main.Id == 0 { // 预约没有对应的结算明细记录,返回
+		return nil
+	}
+
+	// 获取费用明细记录
+	result, err = s.Dao.DB.Model("settle_account_detail").Where(fmt.Sprintf("pid='%v' AND PaymentType='0'", main.Id)).FindOne()
+	if err != nil {
+		return err
+	}
+	err = result.Struct(&detail)
+	if err != nil {
+		return err
+	}
+
+	// 获取账号信息
+	result, err = s.Dao.DB.Model("base_account").Where(fmt.Sprintf("MainUserId='%v'", main.MainUserId)).Order("Advance ASC").FindOne()
+	if err != nil {
+		return err
+	}
+	err = result.Struct(&baseAccount)
+	if err != nil {
+		return err
+	}
+
+	// 计算费用
+	oldAmount := detail.PaymentAccount
+	main.ActualStartDate = req.SignInTime
+	main.ActualEndDate = req.SignOutTime
+
+	span := req.SignOutTime.Sub(req.SignInTime)
+	main.FeeTime = int(math.Ceil(span.Minutes()))
+	main.ActualMachineHour = main.FeeTime
+	detail.ActualMinutes = strconv.Itoa(main.FeeTime)
+	detail.Minutes = strconv.Itoa(main.FeeTime)
+
+	detail.PaymentAccount = float64(main.ActualMachineHour) * detail.UnitPrice / 60 // 计算实际费用
+	diffValue := oldAmount - detail.PaymentAccount
+	main.TotalPrice -= diffValue // 计算实际费用
+
+	baseAccount.Available -= diffValue // 账户可用金额计算
+
+	tx, err := s.Dao.DB.Begin()
+	if err != nil {
+		return err
+	}
+
+	_, err = tx.Save("settle_account_main", main)
+	if err != nil {
+		tx.Rollback()
+		return err
+	}
+	_, err = tx.Save("settle_account_detail", detail)
+	if err != nil {
+		tx.Rollback()
+		return err
+	}
+	_, err = tx.Save("base_account", baseAccount)
+	if err != nil {
+		tx.Rollback()
+		return err
+	}
+
+	return tx.Commit()
+}

+ 1 - 1
service/settle_account_main/settle_account_main.go

@@ -23,7 +23,7 @@ func NewService(tenant string) Service {
 	return Service{Dao: account.NewSettleAccountMainDao(tenant), Tenant: tenant}
 }
 
-// List 会议室列表
+// List 结算明细
 func (s Service) List(req model.ListReq) ([]accountModel.SettleAccountMain, int, error) {
 	entityModel := s.Dao.M
 	where := "1=1"