account.go 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  1. package account
  2. import (
  3. "dashoo.cn/micro_libary/request"
  4. "database/sql"
  5. "fmt"
  6. "github.com/gogf/gf/os/gtime"
  7. dao "lims_adapter/dao/account"
  8. account "lims_adapter/model/account"
  9. "math"
  10. "strconv"
  11. )
  12. // Service 账号相关
  13. type Service struct {
  14. Dao *dao.SettleAccountMainDao
  15. Tenant string
  16. }
  17. type AccountService struct {
  18. Dao *dao.BaseAccountDao
  19. Tenant string
  20. }
  21. func NewAccountSrv(tenant string) AccountService {
  22. return AccountService{Dao: dao.NewBaseAccountDao(tenant), Tenant: tenant}
  23. }
  24. // AddAccount 添加财务账号
  25. func (s AccountService) Save(req *account.BaseAccount, user request.UserInfo) error {
  26. now := gtime.Now()
  27. if req.Id == 0 {
  28. req.CreateUserId = int(user.Id)
  29. req.CreateBy = user.RealName
  30. req.CreateOn = now
  31. }
  32. req.UpdateUserId = int(user.Id)
  33. req.UpdateBy = user.RealName
  34. req.UpdateOn = now
  35. _, err := s.Dao.Save(req)
  36. return err
  37. }
  38. // AccountList 财务账号分页查询
  39. func (s AccountService) AccountList(req *account.AccountReq) (infos account.BaseAccountRsp, err error) {
  40. current := req.PageNun
  41. size := req.PageSize
  42. model := s.Dao.DB.Model("base_account a")
  43. if req.Account != "" {
  44. model = model.WhereLike("Account", "%" + req.Account + "%")
  45. }
  46. if req.RealName != "" {
  47. model = model.WhereLike("MainUser", "%" + req.RealName + "%")
  48. }
  49. if req.AccountName != "" {
  50. model = model.WhereLike("AccountName", "%" + req.AccountName + "%")
  51. }
  52. infos.Total, err = model.Count()
  53. if err != nil {
  54. return infos, err
  55. }
  56. err = model.Fields("a.*").Page(current, size).Scan(&infos.Records)
  57. return infos, nil
  58. }
  59. // DepositAccount 充值账户
  60. func (s AccountService) DepositAccount(req *account.BaseAccountResp) error {
  61. _, err := s.Dao.M.Update(fmt.Sprintf("Surplus='%v',Available='%v'", req.Surplus, req.Available), "Id = "+strconv.Itoa(req.Id))
  62. return err
  63. }
  64. // 计算费用
  65. func (s AccountService) Calculate(req *account.CalculateAmountReq) error {
  66. var main account.SettleAccountMain
  67. var detail account.SettleAccountDetail
  68. var baseAccount account.BaseAccount
  69. // 获取结算明细记录
  70. result, err := s.Dao.DB.Model("settle_account_main").Where(fmt.Sprintf("AppointId='%v'", req.AppointId)).FindOne()
  71. if err != nil {
  72. if err != sql.ErrNoRows {
  73. return err
  74. } else {
  75. // 预约没有对应的结算明细记录,返回
  76. return nil
  77. }
  78. }
  79. err = result.Struct(&main)
  80. if err != nil && err != sql.ErrNoRows {
  81. return err
  82. }
  83. if main.Id == 0 { // 预约没有对应的结算明细记录,返回
  84. return nil
  85. }
  86. // 获取费用明细记录
  87. result, err = s.Dao.DB.Model("settle_account_detail").Where(fmt.Sprintf("pid='%v' AND PaymentType='0'", main.Id)).FindOne()
  88. if err != nil {
  89. return err
  90. }
  91. err = result.Struct(&detail)
  92. if err != nil {
  93. return err
  94. }
  95. // 获取账号信息
  96. result, err = s.Dao.DB.Model("base_account").Where(fmt.Sprintf("MainUserId='%v'", main.MainUserId)).Order("Advance ASC").FindOne()
  97. if err != nil {
  98. return err
  99. }
  100. err = result.Struct(&baseAccount)
  101. if err != nil {
  102. return err
  103. }
  104. // 计算费用
  105. oldAmount := detail.PaymentAccount
  106. main.ActualStartDate = req.SignInTime
  107. main.ActualEndDate = req.SignOutTime
  108. span := req.SignOutTime.Sub(req.SignInTime)
  109. main.FeeTime = int(math.Ceil(span.Minutes()))
  110. main.ActualMachineHour = main.FeeTime
  111. detail.ActualMinutes = strconv.Itoa(main.FeeTime)
  112. detail.Minutes = strconv.Itoa(main.FeeTime)
  113. detail.PaymentAccount = float64(main.ActualMachineHour) * detail.UnitPrice / 60 // 计算实际费用
  114. diffValue := oldAmount - detail.PaymentAccount
  115. main.TotalPrice -= diffValue // 计算实际费用
  116. baseAccount.Available -= diffValue // 账户可用金额计算
  117. tx, err := s.Dao.DB.Begin()
  118. if err != nil {
  119. return err
  120. }
  121. _, err = tx.Save("settle_account_main", main)
  122. if err != nil {
  123. tx.Rollback()
  124. return err
  125. }
  126. _, err = tx.Save("settle_account_detail", detail)
  127. if err != nil {
  128. tx.Rollback()
  129. return err
  130. }
  131. _, err = tx.Save("base_account", baseAccount)
  132. if err != nil {
  133. tx.Rollback()
  134. return err
  135. }
  136. return tx.Commit()
  137. }