6
0

account.go 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198
  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, user request.UserInfo) (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. if req.IsSelf != "1" { // 1 查看全部;其他 查看自己
  53. model = model.Where("MainUserId", user.Id)
  54. }
  55. infos.Total, err = model.Count()
  56. if err != nil {
  57. return infos, err
  58. }
  59. err = model.Fields("a.*").Page(current, size).Order("CreateOn DESC").Scan(&infos.Records)
  60. return infos, nil
  61. }
  62. // DepositAccount 充值账户
  63. func (s AccountService) DepositAccount(req *account.BaseAccountResp) error {
  64. _, err := s.Dao.M.Update(fmt.Sprintf("Surplus='%v',Available='%v'", req.Surplus, req.Available), "Id = "+strconv.Itoa(req.Id))
  65. return err
  66. }
  67. // 计算费用
  68. func (s AccountService) Calculate(req *account.CalculateAmountReq) error {
  69. var main account.SettleAccountMain
  70. var detail account.SettleAccountDetail
  71. var baseAccount account.BaseAccount
  72. // 获取结算明细记录
  73. result, err := s.Dao.DB.Model("settle_account_main").Where(fmt.Sprintf("AppointId='%v'", req.AppointId)).FindOne()
  74. if err != nil {
  75. if err != sql.ErrNoRows {
  76. return err
  77. } else {
  78. // 预约没有对应的结算明细记录,返回
  79. return nil
  80. }
  81. }
  82. err = result.Struct(&main)
  83. if err != nil && err != sql.ErrNoRows {
  84. return err
  85. }
  86. if main.Id == 0 { // 预约没有对应的结算明细记录,返回
  87. return nil
  88. }
  89. // 获取费用明细记录
  90. result, err = s.Dao.DB.Model("settle_account_detail").Where(fmt.Sprintf("pid='%v' AND PaymentType='0'", main.Id)).FindOne()
  91. if err != nil {
  92. return err
  93. }
  94. err = result.Struct(&detail)
  95. if err != nil {
  96. return err
  97. }
  98. // 获取账号信息
  99. result, err = s.Dao.DB.Model("base_account").Where(fmt.Sprintf("MainUserId='%v'", main.MainUserId)).Order("Advance ASC, Id ASC").FindOne()
  100. if err != nil {
  101. return err
  102. }
  103. err = result.Struct(&baseAccount)
  104. if err != nil {
  105. return err
  106. }
  107. // 计算费用
  108. discount := float64(1) // 计算折扣
  109. if detail.Data5 != "" {
  110. d, _ := strconv.ParseFloat(detail.Data5, 64)
  111. discount = 1 - d / 100
  112. }
  113. oldAmount := detail.PaymentAccount
  114. main.ActualStartDate = req.SignInTime
  115. main.ActualEndDate = req.SignOutTime
  116. span := req.SignOutTime.Sub(req.SignInTime)
  117. main.FeeTime = int(math.Ceil(span.Minutes()))
  118. main.ActualMachineHour = main.FeeTime
  119. detail.ActualMinutes = strconv.Itoa(main.FeeTime)
  120. detail.Minutes = strconv.Itoa(main.FeeTime)
  121. detail.PaymentAccount = float64(main.ActualMachineHour) * detail.UnitPrice * discount / 60 // 计算实际费用
  122. diffValue := oldAmount - detail.PaymentAccount
  123. main.TotalPrice -= diffValue // 计算实际费用
  124. baseAccount.Available += diffValue // 账户可用金额返还
  125. tx, err := s.Dao.DB.Begin()
  126. if err != nil {
  127. return err
  128. }
  129. _, err = tx.Save("settle_account_main", main)
  130. if err != nil {
  131. tx.Rollback()
  132. return err
  133. }
  134. _, err = tx.Save("settle_account_detail", detail)
  135. if err != nil {
  136. tx.Rollback()
  137. return err
  138. }
  139. _, err = tx.Save("base_account", baseAccount)
  140. if err != nil {
  141. tx.Rollback()
  142. return err
  143. }
  144. return tx.Commit()
  145. }
  146. // 通过从账户,查询主账户 财务账号信息
  147. func (s AccountService) GetBaseAccountById(req *account.SubAccountReq) (infos account.BaseAccountRsp, err error) {
  148. // 先判断是主用户还是从用户
  149. infos.Total,err = s.Dao.DB.Model("master_user").Where(fmt.Sprintf("UserId='%v'", req.SubId)).Count()
  150. if err != nil {
  151. return infos, err
  152. }
  153. if infos.Total == 0 {
  154. // 主用户表没有 所以是从用户 进行连表查询
  155. model := s.Dao.DB.Model("base_account a").LeftJoin("base_user_relation b","a.MainUserId=b.Pid")
  156. if req.SubId != "" {
  157. model = model.Where(fmt.Sprintf("b.UserId='%v'",req.SubId))
  158. }
  159. err = model.Fields("a.*").Order("Advance ASC, a.Id ASC").Scan(&infos.Records)
  160. if err != nil {
  161. return infos, err
  162. }
  163. return infos, nil
  164. } else if infos.Total > 0 {
  165. // 是主用户
  166. model := s.Dao.DB.Model("base_account a")
  167. if req.SubId != "" {
  168. model = model.Where(fmt.Sprintf("a.MainUserId='%v'",req.SubId))
  169. }
  170. err = model.Fields("a.*").Order("Advance ASC, a.Id ASC").Scan(&infos.Records)
  171. if err != nil {
  172. return infos, err
  173. }
  174. return infos, nil
  175. }
  176. return infos, nil
  177. }