account.go 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193
  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. discount := float64(1) // 计算折扣
  106. if detail.Data5 != "" {
  107. d, _ := strconv.ParseFloat(detail.Data5, 64)
  108. discount = 1 - d / 100
  109. }
  110. oldAmount := detail.PaymentAccount
  111. main.ActualStartDate = req.SignInTime
  112. main.ActualEndDate = req.SignOutTime
  113. span := req.SignOutTime.Sub(req.SignInTime)
  114. main.FeeTime = int(math.Ceil(span.Minutes()))
  115. main.ActualMachineHour = main.FeeTime
  116. detail.ActualMinutes = strconv.Itoa(main.FeeTime)
  117. detail.Minutes = strconv.Itoa(main.FeeTime)
  118. detail.PaymentAccount = float64(main.ActualMachineHour) * detail.UnitPrice * discount / 60 // 计算实际费用
  119. diffValue := oldAmount - detail.PaymentAccount
  120. main.TotalPrice -= diffValue // 计算实际费用
  121. baseAccount.Available += diffValue // 账户可用金额返还
  122. tx, err := s.Dao.DB.Begin()
  123. if err != nil {
  124. return err
  125. }
  126. _, err = tx.Save("settle_account_main", main)
  127. if err != nil {
  128. tx.Rollback()
  129. return err
  130. }
  131. _, err = tx.Save("settle_account_detail", detail)
  132. if err != nil {
  133. tx.Rollback()
  134. return err
  135. }
  136. _, err = tx.Save("base_account", baseAccount)
  137. if err != nil {
  138. tx.Rollback()
  139. return err
  140. }
  141. return tx.Commit()
  142. }// 通过从账户,查询主账户 财务账号信息
  143. func (s AccountService) GetBaseAccountById(req *account.SubAccountReq) (infos account.BaseAccountRsp, err error) {
  144. // 先判断是主用户还是从用户
  145. infos.Total,err = s.Dao.DB.Model("master_user").Where(fmt.Sprintf("UserId='%v'", req.SubId)).Count()
  146. if err != nil {
  147. return infos, err
  148. }
  149. if infos.Total == 0 {
  150. // 主用户表没有 所以是从用户 进行连表查询
  151. model := s.Dao.DB.Model("base_account a").LeftJoin("base_user_relation b","a.MainUserId=b.Pid")
  152. if req.SubId != "" {
  153. model = model.Where(fmt.Sprintf("b.UserId='%v'",req.SubId))
  154. }
  155. err = model.Fields("a.*").Order("Advance ASC").Scan(&infos.Records)
  156. if err != nil {
  157. return infos, err
  158. }
  159. return infos, nil
  160. } else if infos.Total > 0 {
  161. // 是主用户
  162. model := s.Dao.DB.Model("base_account a")
  163. if req.SubId != "" {
  164. model = model.Where(fmt.Sprintf("a.MainUserId='%v'",req.SubId))
  165. }
  166. err = model.Fields("a.*").Order("Advance ASC").Scan(&infos.Records)
  167. if err != nil {
  168. return infos, err
  169. }
  170. return infos, nil
  171. }
  172. return infos, nil
  173. }