6
0

account.go 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223
  1. package account
  2. import (
  3. "dashoo.cn/micro_libary/request"
  4. "database/sql"
  5. "errors"
  6. "fmt"
  7. "github.com/gogf/gf/os/gtime"
  8. dao "lims_adapter/dao/account"
  9. account "lims_adapter/model/account"
  10. "math"
  11. "strconv"
  12. )
  13. // Service 账号相关
  14. type Service struct {
  15. Dao *dao.SettleAccountMainDao
  16. Tenant string
  17. }
  18. type AccountService struct {
  19. Dao *dao.BaseAccountDao
  20. Tenant string
  21. }
  22. func NewAccountSrv(tenant string) AccountService {
  23. return AccountService{Dao: dao.NewBaseAccountDao(tenant), Tenant: tenant}
  24. }
  25. // AddAccount 添加财务账号
  26. func (s AccountService) Save(req *account.BaseAccount, user request.UserInfo) error {
  27. now := gtime.Now()
  28. if req.Id == 0 {
  29. req.CreateUserId = int(user.Id)
  30. req.CreateBy = user.RealName
  31. req.CreateOn = now
  32. } else {
  33. var original account.BaseAccount
  34. err := s.Dao.Where("Id=?", req.Id).Scan(&original)
  35. if err != nil {
  36. return err
  37. }
  38. if req.MainUserId != original.MainUserId { // 更换了主用户,需要进行校验
  39. count, err := s.Dao.DB.Model("settle_account_bill").Where(fmt.Sprintf("(Status='0' OR Status='1') AND AccountId='%v'", original.Id)).Count()
  40. if err != nil {
  41. return err
  42. }
  43. if count > 0 {
  44. return errors.New("该主用户存在未结算的已出账单,不可更改")
  45. }
  46. // 该主用户存在未结算的未出账单(判断的是该主用户所有的账号)
  47. count, err = s.Dao.DB.Model("settle_account_main").Where(fmt.Sprintf("AccountStatus<>'1' AND MainUserId='%v'", original.MainUserId)).Count()
  48. if err != nil {
  49. return err
  50. }
  51. if count > 0 {
  52. return errors.New("该主用户存在未结算的未出账单,不可更改")
  53. }
  54. }
  55. }
  56. req.UpdateUserId = int(user.Id)
  57. req.UpdateBy = user.RealName
  58. req.UpdateOn = now
  59. _, err := s.Dao.Save(req)
  60. return err
  61. }
  62. // AccountList 财务账号分页查询
  63. func (s AccountService) AccountList(req *account.AccountReq, user request.UserInfo) (infos account.BaseAccountRsp, err error) {
  64. current := req.PageNun
  65. size := req.PageSize
  66. model := s.Dao.DB.Model("base_account a")
  67. if req.Account != "" {
  68. model = model.WhereLike("Account", "%"+req.Account+"%")
  69. }
  70. if req.RealName != "" {
  71. model = model.WhereLike("MainUser", "%"+req.RealName+"%")
  72. }
  73. if req.AccountName != "" {
  74. model = model.WhereLike("AccountName", "%"+req.AccountName+"%")
  75. }
  76. if req.IsSelf != "1" { // 1 查看全部;其他 查看自己
  77. model = model.Where("MainUserId", user.Id)
  78. }
  79. infos.Total, err = model.Count()
  80. if err != nil {
  81. return infos, err
  82. }
  83. err = model.Fields("a.*").Page(current, size).Order("CreateOn DESC").Scan(&infos.Records)
  84. return infos, nil
  85. }
  86. // DepositAccount 充值账户
  87. func (s AccountService) DepositAccount(req *account.BaseAccountResp) error {
  88. _, err := s.Dao.M.Update(fmt.Sprintf("Surplus='%v',Available='%v'", req.Surplus, req.Available), "Id = "+strconv.Itoa(req.Id))
  89. return err
  90. }
  91. // 计算费用
  92. func (s AccountService) Calculate(req *account.CalculateAmountReq) error {
  93. var main account.SettleAccountMain
  94. var detail account.SettleAccountDetail
  95. var baseAccount account.BaseAccount
  96. // 获取结算明细记录
  97. result, err := s.Dao.DB.Model("settle_account_main").Where(fmt.Sprintf("AppointId='%v'", req.AppointId)).FindOne()
  98. if err != nil {
  99. if err != sql.ErrNoRows {
  100. return err
  101. } else {
  102. // 预约没有对应的结算明细记录,返回
  103. return nil
  104. }
  105. }
  106. err = result.Struct(&main)
  107. if err != nil && err != sql.ErrNoRows {
  108. return err
  109. }
  110. if main.Id == 0 { // 预约没有对应的结算明细记录,返回
  111. return nil
  112. }
  113. // 获取费用明细记录
  114. result, err = s.Dao.DB.Model("settle_account_detail").Where(fmt.Sprintf("pid='%v' AND PaymentType='0'", main.Id)).FindOne()
  115. if err != nil {
  116. return err
  117. }
  118. err = result.Struct(&detail)
  119. if err != nil {
  120. return err
  121. }
  122. // 获取账号信息
  123. result, err = s.Dao.DB.Model("base_account").Where(fmt.Sprintf("MainUserId='%v'", main.MainUserId)).Order("Advance ASC, Id ASC").FindOne()
  124. if err != nil {
  125. return err
  126. }
  127. err = result.Struct(&baseAccount)
  128. if err != nil {
  129. return err
  130. }
  131. // 计算费用
  132. discount := float64(1) // 计算折扣
  133. if detail.Data5 != "" {
  134. d, _ := strconv.ParseFloat(detail.Data5, 64)
  135. discount = 1 - d/100
  136. }
  137. oldAmount := detail.PaymentAccount
  138. main.ActualStartDate = req.SignInTime
  139. main.ActualEndDate = req.SignOutTime
  140. span := req.SignOutTime.Sub(req.SignInTime)
  141. main.FeeTime = int(math.Ceil(span.Minutes()))
  142. main.ActualMachineHour = main.FeeTime
  143. detail.ActualMinutes = strconv.Itoa(main.FeeTime)
  144. detail.Minutes = strconv.Itoa(main.FeeTime)
  145. detail.PaymentAccount = float64(main.ActualMachineHour) * detail.UnitPrice * discount / 60 // 计算实际费用
  146. diffValue := oldAmount - detail.PaymentAccount
  147. main.TotalPrice -= diffValue // 计算实际费用
  148. baseAccount.Available += diffValue // 账户可用金额返还
  149. tx, err := s.Dao.DB.Begin()
  150. if err != nil {
  151. return err
  152. }
  153. _, err = tx.Save("settle_account_main", main)
  154. if err != nil {
  155. tx.Rollback()
  156. return err
  157. }
  158. _, err = tx.Save("settle_account_detail", detail)
  159. if err != nil {
  160. tx.Rollback()
  161. return err
  162. }
  163. _, err = tx.Save("base_account", baseAccount)
  164. if err != nil {
  165. tx.Rollback()
  166. return err
  167. }
  168. return tx.Commit()
  169. }
  170. // 通过从账户,查询主账户 财务账号信息
  171. func (s AccountService) GetBaseAccountById(req *account.SubAccountReq) (infos account.BaseAccountRsp, err error) {
  172. // 先判断是主用户还是从用户
  173. infos.Total, err = s.Dao.DB.Model("master_user").Where(fmt.Sprintf("UserId='%v'", req.SubId)).Count()
  174. if err != nil {
  175. return infos, err
  176. }
  177. if infos.Total == 0 {
  178. // 主用户表没有 所以是从用户 进行连表查询
  179. model := s.Dao.DB.Model("base_account a").LeftJoin("base_user_relation b", "a.MainUserId=b.Pid")
  180. if req.SubId != "" {
  181. model = model.Where(fmt.Sprintf("b.UserId='%v'", req.SubId))
  182. }
  183. err = model.Fields("a.*").Order("Advance ASC, a.Id ASC").Scan(&infos.Records)
  184. if err != nil {
  185. return infos, err
  186. }
  187. return infos, nil
  188. } else if infos.Total > 0 {
  189. // 是主用户
  190. model := s.Dao.DB.Model("base_account a")
  191. if req.SubId != "" {
  192. model = model.Where(fmt.Sprintf("a.MainUserId='%v'", req.SubId))
  193. }
  194. err = model.Fields("a.*").Order("Advance ASC, a.Id ASC").Scan(&infos.Records)
  195. if err != nil {
  196. return infos, err
  197. }
  198. return infos, nil
  199. }
  200. return infos, nil
  201. }