his_deposit_service.go 9.5KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305
  1. package service
  2. import (
  3. "XT_New/models"
  4. "XT_New/utils"
  5. "fmt"
  6. "github.com/shopspring/decimal"
  7. "math/rand"
  8. "strconv"
  9. "time"
  10. )
  11. //生成编号?+yymmdd+随机数(4位)
  12. //新增参数为CP
  13. //退款参数为AF
  14. func CreateCPCode(str string) string {
  15. s := fmt.Sprintf("%04v", rand.New(rand.NewSource(time.Now().UnixNano())).Int63n(10000))
  16. t := time.Now().Format("20060102")
  17. code := str + t + s
  18. return code
  19. }
  20. //获取his中的有效患者
  21. func GetHisUser(orgid int64) (hisname []models.GetHisName, err error) {
  22. err = XTReadDB().Model(&models.GetHisName{}).Where("status = 1 and user_org_id = ?", orgid).Find(&hisname).Error
  23. return
  24. }
  25. //获取his中的有效患者
  26. func GetHisUserName(orgid, id int64) (hisname models.GetHisName, err error) {
  27. err = XTReadDB().Model(&models.GetHisName{}).Where("status = 1 and user_org_id = ? and id = ?", orgid, id).Find(&hisname).Error
  28. return
  29. }
  30. //添加押金(开始)调用接口前记得判断审核状态,确认通过审核后在调用
  31. func UpDeposit(code, remarks string, his_patient_id, orgid, trial_status, createid int64, deposit decimal.Decimal) (err error) {
  32. //查押金表是否存在记录
  33. tmp, tmpdeposit := IsHisPatientId(his_patient_id, orgid)
  34. if tmp == 0 {
  35. //需要生成一条数据
  36. de := models.Deposit{
  37. UserOrgId: orgid,
  38. HisPatientId: his_patient_id,
  39. Ctime: time.Now().Unix(),
  40. Status: 1,
  41. }
  42. i, d, err := AddDeposit(de)
  43. if err != nil || i == 0 {
  44. utils.ErrorLog("添加用户押金记录失败: %v", err.Error())
  45. return err
  46. }
  47. tmp = i
  48. tmpdeposit = d
  49. }
  50. if trial_status == 1 {
  51. de := models.Deposit{
  52. ID: tmp,
  53. Mtime: time.Now().Unix(),
  54. Deposit: deposit.Add(tmpdeposit),
  55. }
  56. err = UpdateDeposit(de)
  57. if err != nil {
  58. utils.ErrorLog("添加用户押金失败: %v", err.Error())
  59. return
  60. }
  61. }
  62. dehistory := models.DepositHistory{
  63. UserOrgId: orgid,
  64. HisPatientId: his_patient_id,
  65. DepositCode: code,
  66. Deposit: deposit, //本次操作的押金
  67. SurplusDeposit: tmpdeposit.Add(deposit), //剩余金额
  68. DepositStatus: 1,
  69. Status: 1,
  70. CreateId: createid,
  71. Ctime: time.Now().Unix(),
  72. Mtime: time.Now().Unix(),
  73. TrialStatus: trial_status,
  74. Remarks: remarks,
  75. }
  76. err = AddDepositHistory(dehistory)
  77. if err != nil {
  78. utils.ErrorLog("添加用户押金历史记录失败: %v", err.Error())
  79. }
  80. return
  81. }
  82. //添加押金记录
  83. func AddDepositHistory(dh models.DepositHistory) error {
  84. err := XTWriteDB().Create(&dh).Error
  85. return err
  86. }
  87. //押金中添加一条记录,并返回该数据的id和押金余额(当没有该用户记录时调用)
  88. func AddDeposit(de models.Deposit) (int64, decimal.Decimal, error) {
  89. var tmp models.Deposit
  90. err := XTWriteDB().Create(&de).Find(&tmp).Error
  91. if err != nil {
  92. return 0, decimal.NewFromFloat(0.00), err
  93. }
  94. return tmp.ID, tmp.Deposit, err
  95. }
  96. //更改押金记录
  97. func UpdateDeposit(de models.Deposit) (err error) {
  98. err = XTWriteDB().Model(&models.Deposit{}).Where("id = ? and status = 1", de.ID).Updates(map[string]interface{}{
  99. "mtime": de.Mtime,
  100. "deposit": de.Deposit,
  101. }).Error
  102. return
  103. }
  104. //判断押金表是否存在当前的患者的一条有效数据,如果有返回id和押金余额,没有返回0
  105. func IsHisPatientId(his_patient_id, orgid int64) (int64, decimal.Decimal) {
  106. var tmp []models.Deposit
  107. XTReadDB().Model(&models.Deposit{}).Where("user_org_id = ? and his_patient_id = ? and status = 1", orgid, his_patient_id).Find(&tmp)
  108. if len(tmp) != 1 {
  109. return 0, decimal.NewFromFloat(0.00)
  110. }
  111. return tmp[0].ID, tmp[0].Deposit
  112. }
  113. //查询押金编号是否重复
  114. func FindDecimalCode(orgid int64, code string) bool {
  115. var total int
  116. XTReadDB().Model(&models.DepositHistory{}).Where("user_org_id = ? and deposit_code = ? and status = 1", orgid, code).Count(&total)
  117. if total > 0 {
  118. return true
  119. } else {
  120. return false
  121. }
  122. }
  123. //充值明细列表
  124. func DetailsList(orgid, stime, etime int64, keyword string, slicekey []int64) (deposithistory []models.DepositHistoryname, err error) {
  125. db := XTReadDB().Model(&models.DepositHistory{}).Where("status = 1 and user_org_id = ? and deposit_status = 1 ", orgid).Where("ctime >= ? and ctime <= ?", stime, etime)
  126. if len(keyword) > 0 {
  127. var tmp string = "deposit_code like ?"
  128. if len(slicekey) > 0 {
  129. for i := 0; i < len(slicekey); i++ {
  130. tmp = tmp + " or his_patient_id = " + strconv.FormatInt(slicekey[i], 10)
  131. }
  132. }
  133. keyword = "%" + keyword + "%"
  134. db = db.Where(tmp, keyword)
  135. }
  136. err = db.Order("ctime desc").Find(&deposithistory).Error
  137. return
  138. }
  139. //充值汇总列表
  140. func SummaryList(orgid, stime, etime int64, keyword string, slicekey []int64) (deposithistory []models.DepositHistory, err error) {
  141. db := XTReadDB().Model(&models.DepositHistory{}).Where("status = 1 and trial_status = 1 and user_org_id = ? and deposit_status = 1 ", orgid).Where("ctime >= ? and ctime <= ?", stime, etime)
  142. if len(slicekey) > 0 {
  143. tmp := ""
  144. for i := 0; i < len(slicekey); i++ {
  145. tmp = tmp + " his_patient_id = " + strconv.FormatInt(slicekey[i], 10)
  146. if i < len(slicekey)-1 {
  147. tmp = tmp + " or "
  148. }
  149. }
  150. db = db.Where(tmp)
  151. } else {
  152. if len(keyword) > 0 {
  153. return
  154. }
  155. }
  156. err = db.Order("ctime desc").Find(&deposithistory).Error
  157. return
  158. }
  159. //获取本周周一和周日的起止时间戳
  160. func GetMondayOfWeek() (int64, int64) {
  161. t := time.Now()
  162. dayObj := GetZeroTime(t)
  163. var dayStr string
  164. loc, _ := time.LoadLocation("Local")
  165. if t.Weekday() == time.Monday {
  166. dayStr = dayObj.Format("2006-01-02")
  167. } else {
  168. offset := int(time.Monday - t.Weekday())
  169. if offset > 0 {
  170. offset = -6
  171. }
  172. dayStr = dayObj.AddDate(0, 0, offset).Format("2006-01-02")
  173. }
  174. dayStr = dayStr + " 00:00:00"
  175. stime, _ := time.ParseInLocation("2006-01-02 15:04:05", dayStr, loc)
  176. return stime.Unix(), stime.Unix() + 604799
  177. }
  178. //获取本月的起止时间戳
  179. func GetMonth() (int64, int64) {
  180. timeNow := time.Now()
  181. timeToday := time.Date(timeNow.Year(), timeNow.Month(), timeNow.Day(), 0, 0, 0, 0, timeNow.Location()) // 获取当天0点时间 time类型
  182. timeMonthStartUnix1 := timeToday.AddDate(0, 0, -timeToday.Day()+1).Unix() // 获取本月第一天0点 时间戳类型
  183. timeMonthEndUnix1 := timeToday.AddDate(0, 1, -timeToday.Day()+1).Unix() - 1 // 获取下个月第一天/ 本月最后一天24点 时间戳类型
  184. return timeMonthStartUnix1, timeMonthEndUnix1
  185. }
  186. func GetCreateidName(id int64) string {
  187. var tmp models.CreateUser
  188. XTReadDB().Select("name").Where("id = ?", id).Find(&tmp)
  189. return tmp.Name
  190. }
  191. //审核通过
  192. func UpDecimalHistory(id int64) (err error) {
  193. //开事务
  194. tx := XTWriteDB().Begin()
  195. defer func() {
  196. if err != nil {
  197. utils.ErrorLog("事务失败,原因为", err)
  198. tx.Rollback()
  199. } else {
  200. tx.Commit()
  201. }
  202. }()
  203. //改状态
  204. err = tx.Model(models.DepositHistory{}).Where("id = ?", id).Updates(map[string]interface{}{
  205. "trial_status": 1,
  206. "mtime": time.Now().Unix(),
  207. }).Error
  208. if err != nil {
  209. return
  210. }
  211. //查记录x2
  212. var history models.DepositHistory
  213. var detmp models.Deposit
  214. err = tx.Model(&models.DepositHistory{}).Where("id = ?", id).Find(&history).Error
  215. if err != nil {
  216. return
  217. }
  218. err = tx.Model(&models.Deposit{}).Where("user_org_id = ? and his_patient_id = ? and status = 1 ", history.UserOrgId, history.HisPatientId).Find(&detmp).Error
  219. if err != nil {
  220. return
  221. }
  222. //相加
  223. err = tx.Model(&models.Deposit{}).Where("id = ? and status = 1", detmp.ID).Updates(map[string]interface{}{
  224. "mtime": time.Now().Unix(),
  225. "deposit": detmp.Deposit.Add(history.Deposit),
  226. }).Error
  227. return
  228. }
  229. //删除本次记录
  230. func DelDecimalHistory(id int64) (err error) {
  231. err = XTWriteDB().Model(models.DepositHistory{}).Where("id = ?", id).Updates(map[string]interface{}{
  232. "status": 0,
  233. "mtime": time.Now().Unix(),
  234. }).Error
  235. return
  236. }
  237. //根据id获取一条押金历史记录
  238. func GetDecimalHistoryOne(id int64) (history models.DepositHistory, err error) {
  239. err = XTReadDB().Model(&models.DepositHistory{}).Where("id = ?", id).Find(&history).Error
  240. return
  241. }
  242. //根据患者id获取该患者当前剩余的押金
  243. func GetUserMoney(id, orgid int64) decimal.Decimal {
  244. tmp := models.Deposit{}
  245. XTReadDB().Model(&models.Deposit{}).Where("his_patient_id = ? and user_org_id = ? and status = 1", id, orgid).Find(&tmp)
  246. return tmp.Deposit
  247. }
  248. //查询时间段内患者的余额
  249. func GetMoneyforTime(id, orgid, etime int64) decimal.Decimal {
  250. tmp := models.DepositHistory{}
  251. XTReadDB().Model(&models.DepositHistory{}).Where("his_patient_id = ? and user_org_id = ? and status = 1 and mtime <= ?", id, orgid, etime).Order("mtime").Find(&tmp)
  252. return tmp.SurplusDeposit
  253. }
  254. //押金流水
  255. func GetFlowList(id, orgid, stime, etime, deposit_status int64) (deposit []models.DepositHistory, err error) {
  256. s := "status = 1 and trial_status = 1 and user_org_id = ? and his_patient_id = ? and mtime >= ? and mtime <= ?"
  257. if deposit_status != 0 {
  258. s = s + " and deposit_status = " + string(deposit_status)
  259. }
  260. err = XTReadDB().Model(&models.DepositHistory{}).Where(s, orgid, id, stime, etime).Order("mtime desc").Find(&deposit).Error
  261. return
  262. }
  263. func GetUserList(page, limit, orgid int64, keyword string, slicekey []int64) (m []models.Deposit1, total int64, err error) {
  264. db := XTReadDB().Model(&models.Deposit{}).Where("status = 1 and user_org_id = ? ", orgid)
  265. offset := (page - 1) * limit
  266. if len(slicekey) > 0 {
  267. tmp := ""
  268. for i := 0; i < len(slicekey); i++ {
  269. tmp = tmp + " his_patient_id = " + strconv.FormatInt(slicekey[i], 10)
  270. if i < len(slicekey)-1 {
  271. tmp = tmp + " or "
  272. }
  273. }
  274. db = db.Where(tmp)
  275. } else {
  276. if len(keyword) > 0 {
  277. return
  278. }
  279. }
  280. err = db.Count(&total).Offset(offset).Order("mtime desc").Find(&m).Error
  281. return
  282. }