123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572
  1. package book
  2. import (
  3. "errors"
  4. "spaceofcheng/services/models"
  5. "spaceofcheng/services/models/book"
  6. "spaceofcheng/services/models/customer"
  7. "spaceofcheng/services/models/model"
  8. "spaceofcheng/services/service"
  9. "spaceofcheng/services/utils"
  10. "strconv"
  11. "time"
  12. )
  13. // BookServ 系统处理
  14. type BookServ struct {
  15. ctx *utils.Context
  16. dao *book.BookDAO
  17. cdao *customer.CustomerDAO
  18. }
  19. // NewBookServ 初始化
  20. func NewBookServ(ctx *utils.Context) *BookServ {
  21. return &BookServ{
  22. ctx: ctx,
  23. dao: book.NewBookDAO(ctx),
  24. cdao: customer.NewCustomerDAO(ctx),
  25. }
  26. }
  27. // GetBookRecommendList 获取推荐图书信息
  28. func (s *BookServ) GetBookRecommendList(caseid string, page, pageSize int) (map[string]interface{}, error) {
  29. if pageSize == 0 {
  30. pageSize = service.PAGENUM
  31. }
  32. if page <= 0 {
  33. page = 1
  34. }
  35. list, err := s.dao.GetBookRecommendList(caseid, page, pageSize)
  36. if err != nil {
  37. utils.LogError("获取图书列表失败: " + err.Error())
  38. return nil, errors.New("获取图书列表失败")
  39. }
  40. return map[string]interface{}{
  41. "list": list,
  42. "pageSize": pageSize,
  43. "page": page,
  44. }, nil
  45. }
  46. func (s *BookServ) GetBookList(bookType, name, barcode, showzero, caseid string, page, pageSize int) (map[string]interface{}, error) {
  47. if pageSize == 0 {
  48. pageSize = service.PAGENUM
  49. }
  50. if page <= 0 {
  51. page = 1
  52. }
  53. list, err := s.dao.GetBookList(bookType, name, barcode, showzero, caseid, page, pageSize)
  54. if err != nil {
  55. utils.LogError("获取图书列表失败: " + err.Error())
  56. return nil, errors.New("获取图书列表失败")
  57. }
  58. total, err := s.dao.GetBookListCount(bookType, name, showzero, barcode, caseid)
  59. if err != nil {
  60. utils.LogError("获取图书列表失败: " + err.Error())
  61. return nil, errors.New("获取图书列表失败")
  62. }
  63. return map[string]interface{}{
  64. "list": list,
  65. "pageSize": pageSize,
  66. "pagenum": total,
  67. "page": page,
  68. }, nil
  69. }
  70. func (s *BookServ) GetBookById(bookId string) (*model.TaBook, error) {
  71. book, err := s.dao.GetBookById(bookId)
  72. if err != nil {
  73. utils.LogError("获取图书详情失败: " + err.Error())
  74. return nil, errors.New("获取图书详情失败")
  75. }
  76. return book, nil
  77. }
  78. func (s *BookServ) AuthBook(book model.TaBook) error {
  79. if book.CaseId == "" {
  80. return errors.New("案场不能为空")
  81. }
  82. if book.BookBarcode == "" {
  83. return errors.New("条形码不能为空")
  84. }
  85. num, err := s.dao.IsBarcodeExist(book.BookBarcode, book.CaseId)
  86. if err != nil {
  87. utils.LogError("新增图书失败: " + err.Error())
  88. return errors.New("新增图书失败")
  89. }
  90. if num > 0 {
  91. return errors.New("条形码" + book.BookBarcode + "已存在")
  92. }
  93. if book.BookName == "" {
  94. return errors.New("图书名不能为空")
  95. }
  96. if book.InStock == 0 {
  97. return errors.New("总库存不能为0")
  98. }
  99. if book.BorrowDays == 0 {
  100. return errors.New("借阅天数不能为0")
  101. }
  102. return nil
  103. }
  104. func (s *BookServ) AuthBookEdit(book model.TaBook) error {
  105. if book.CaseId == "" {
  106. return errors.New("案场不能为空")
  107. }
  108. if book.BookName == "" {
  109. return errors.New("图书名不能为空")
  110. }
  111. if book.InStock == 0 {
  112. return errors.New("总库存不能为0")
  113. }
  114. if book.BorrowDays == 0 {
  115. return errors.New("借阅天数不能为0")
  116. }
  117. return nil
  118. }
  119. func (s *BookServ) AddBook(book model.TaBook) (*model.TaBook, error) {
  120. newBook, err := s.dao.AddBook(book)
  121. if err != nil {
  122. utils.LogError("新增图书失败: " + err.Error())
  123. return nil, errors.New("新增图书失败")
  124. }
  125. return newBook, err
  126. }
  127. func (s *BookServ) EditBook(book model.TaBook) (*model.TaBook, error) {
  128. editbook, err := s.dao.EditBook(book)
  129. if err != nil {
  130. utils.LogError("修改图书失败: " + err.Error())
  131. return nil, errors.New("修改图书失败")
  132. }
  133. return editbook, nil
  134. }
  135. // GetMineRecord 获取个人借阅记录
  136. func (s *BookServ) GetMineRecord(status string, page, pageSize int) (map[string]interface{}, error) {
  137. if pageSize == 0 {
  138. pageSize = service.PAGENUM
  139. }
  140. if page <= 0 {
  141. page = 1
  142. }
  143. customer := s.ctx.Get("customer").(model.TaCustomer)
  144. list, err := s.dao.GetMineRecord(customer.CustomerId, status, page, pageSize)
  145. if err != nil {
  146. utils.LogError("获取图书列表失败: " + err.Error())
  147. return nil, errors.New("获取图书列表失败")
  148. }
  149. total, err := s.dao.GetMineRecordCount(customer.CustomerId, status)
  150. if err != nil {
  151. utils.LogError("获取图书列表失败: " + err.Error())
  152. return nil, errors.New("获取图书列表失败")
  153. }
  154. return map[string]interface{}{
  155. "list": list,
  156. "pageSize": pageSize,
  157. "pagenum": total,
  158. "page": page,
  159. }, nil
  160. }
  161. func (s *BookServ) GetInStockChangeByBookId(bookId string, page, pageSize int) (map[string]interface{}, error) {
  162. if pageSize == 0 {
  163. pageSize = service.PAGENUM
  164. }
  165. if page <= 0 {
  166. page = 1
  167. }
  168. list, err := s.dao.GetInStockChangeByBookId(bookId, page, pageSize)
  169. if err != nil {
  170. utils.LogError("获取库存盘点列表失败: " + err.Error())
  171. return nil, errors.New("获取库存盘点列表失败")
  172. }
  173. total, err := s.dao.GetInStockChangeByBookIdCount(bookId)
  174. if err != nil {
  175. utils.LogError("获取库存盘点列表失败: " + err.Error())
  176. return nil, errors.New("获取库存盘点列表失败")
  177. }
  178. return map[string]interface{}{
  179. "list": list,
  180. "pageSize": pageSize,
  181. "pagenum": total,
  182. "page": page,
  183. }, nil
  184. }
  185. func (s *BookServ) AddChangeRecord(change model.TaInStockChange) error {
  186. book, err := s.dao.GetBookById(change.BookId)
  187. if err != nil {
  188. utils.LogError("库存盘点失败: " + err.Error())
  189. return errors.New("库存盘点失败")
  190. }
  191. bookAdd := change.InStockAfter - change.InStockBefore
  192. book.InStock = book.InStock + bookAdd
  193. book.LeftNum = change.InStockAfter
  194. change.InStockTotal = book.InStock
  195. err = s.dao.AddChangeRecord(change)
  196. if err != nil {
  197. utils.LogError("库存盘点失败: " + err.Error())
  198. return errors.New("库存盘点失败")
  199. }
  200. var cols = []string{
  201. "in_stock",
  202. "left_num",
  203. }
  204. err = s.dao.UpdateInStockBook(book, cols)
  205. if err != nil {
  206. utils.LogError("库存盘点失败: " + err.Error())
  207. return errors.New("库存盘点失败")
  208. }
  209. return nil
  210. }
  211. func (s *BookServ) BorrowBook(bookId, customerId, orgId string) (*model.TaBookBorrowRecord, error) {
  212. reserveRecord, err := s.dao.CustomerReservedBook(bookId, customerId)
  213. if err != nil {
  214. utils.LogError("借阅失败: " + err.Error())
  215. return nil, errors.New("借阅失败")
  216. }
  217. book, err := s.dao.GetBookById(bookId)
  218. if err != nil {
  219. utils.LogError("借阅失败: " + err.Error())
  220. return nil, errors.New("借阅失败")
  221. }
  222. returnTime := book.BorrowDays * 24
  223. returnStr := strconv.Itoa(returnTime) + "h"
  224. dd, _ := time.ParseDuration(returnStr)
  225. if reserveRecord == nil {
  226. customer, err := s.cdao.GetCustomerByID(customerId)
  227. if err != nil {
  228. utils.LogError("借阅失败: " + err.Error())
  229. return nil, errors.New("借阅失败")
  230. }
  231. if book.LeftNum <= 0 {
  232. return nil, errors.New("该图书已无库存")
  233. }
  234. var borrowRecord = model.TaBookBorrowRecord{
  235. BookId: bookId,
  236. BorrowStatus: models.BORROW_TYPE_BORROWED,
  237. CustomerId: customerId,
  238. CustomerName: customer.Name,
  239. CustomerPhone: customer.Phone,
  240. BorrowDate: time.Now(),
  241. EndDate: time.Now().Add(dd),
  242. CaseId: book.CaseId,
  243. OrgId: orgId,
  244. }
  245. newBorrow, err := s.dao.AddBookRecord(borrowRecord)
  246. if err != nil {
  247. utils.LogError("借阅失败: " + err.Error())
  248. return nil, errors.New("借阅失败")
  249. }
  250. book.BorrowNum = book.BorrowNum + 1
  251. book.LeftNum = book.LeftNum - 1
  252. var cols = []string{
  253. "left_num",
  254. "borrow_num",
  255. }
  256. err = s.dao.UpdateInStockBook(book, cols)
  257. if err != nil {
  258. utils.LogError("借阅失败: " + err.Error())
  259. return nil, errors.New("借阅失败")
  260. }
  261. return newBorrow, nil
  262. }
  263. reserveRecord.BorrowDate = time.Now()
  264. reserveRecord.BorrowStatus = models.BORROW_TYPE_BORROWED
  265. reserveRecord.EndDate = time.Now().Add(dd)
  266. newBorrow, err := s.dao.UpdateBookRecord(reserveRecord)
  267. if err != nil {
  268. utils.LogError("借阅失败: " + err.Error())
  269. return nil, errors.New("借阅失败")
  270. }
  271. book.BorrowNum = book.BorrowNum + 1
  272. var cols = []string{
  273. "borrow_num",
  274. }
  275. err = s.dao.UpdateInStockBook(book, cols)
  276. if err != nil {
  277. utils.LogError("借阅失败: " + err.Error())
  278. return nil, errors.New("借阅失败")
  279. }
  280. return newBorrow, nil
  281. }
  282. func (s *BookServ) ReturnBook(borrowId string) error {
  283. record, err := s.dao.GetBorrowById(borrowId)
  284. if err != nil {
  285. utils.LogError("归还失败: " + err.Error())
  286. return errors.New("归还失败")
  287. }
  288. book, err := s.dao.GetBookById(record.BookId)
  289. if err != nil {
  290. utils.LogError("归还失败: " + err.Error())
  291. return errors.New("归还失败")
  292. }
  293. if record == nil {
  294. return errors.New("不存在的借阅信息")
  295. }
  296. if record.BorrowStatus == models.BORROW_TYPE_LATE {
  297. record.BorrowStatus = models.BORROW_TYPE_LATERETURN
  298. } else {
  299. record.BorrowStatus = models.BORROW_TYPE_RETURN
  300. }
  301. record.ReturnDate = time.Now()
  302. _, err = s.dao.UpdateBookRecord(record)
  303. if err != nil {
  304. utils.LogError("归还失败: " + err.Error())
  305. return errors.New("归还失败")
  306. }
  307. book.BorrowNum = book.BorrowNum - 1
  308. book.LeftNum = book.LeftNum + 1
  309. var cols = []string{
  310. "left_num",
  311. "borrow_num",
  312. }
  313. err = s.dao.UpdateInStockBook(book, cols)
  314. if err != nil {
  315. utils.LogError("归还失败: " + err.Error())
  316. return errors.New("归还失败")
  317. }
  318. return nil
  319. }
  320. func (s *BookServ) CancelReserve(recordId string) error {
  321. record, err := s.dao.GetRecordById(recordId)
  322. if err != nil {
  323. utils.LogError("取消失败: " + err.Error())
  324. return errors.New("取消失败")
  325. }
  326. book, err := s.dao.GetBookById(record.BookId)
  327. if err != nil {
  328. utils.LogError("取消失败: " + err.Error())
  329. return errors.New("取消失败")
  330. }
  331. book.LeftNum = book.LeftNum + 1
  332. var cols = []string{
  333. "left_num",
  334. }
  335. err = s.dao.UpdateInStockBook(book, cols)
  336. if err != nil {
  337. utils.LogError("归还失败: " + err.Error())
  338. return errors.New("归还失败")
  339. }
  340. record.BorrowStatus = models.BORROW_TYPE_CANCEL
  341. _, err = s.dao.UpdateBookRecord(record)
  342. if err != nil {
  343. utils.LogError("取消失败: " + err.Error())
  344. return errors.New("取消失败")
  345. }
  346. return nil
  347. }
  348. func (s *BookServ) GetCustomerReturnList(customerInfo, caseId string, page, pageSize int) (map[string]interface{}, error) {
  349. if pageSize == 0 {
  350. pageSize = service.PAGENUM
  351. }
  352. if page <= 0 {
  353. page = 1
  354. }
  355. list, err := s.dao.GetCustomerReturnList(customerInfo, caseId, page, pageSize)
  356. if err != nil {
  357. utils.LogError("获取库存盘点列表失败: " + err.Error())
  358. return nil, errors.New("获取库存盘点列表失败")
  359. }
  360. total, err := s.dao.GetCustomerReturnListCount(customerInfo, caseId)
  361. if err != nil {
  362. utils.LogError("获取库存盘点列表失败: " + err.Error())
  363. return nil, errors.New("获取库存盘点列表失败")
  364. }
  365. return map[string]interface{}{
  366. "list": list,
  367. "pageSize": pageSize,
  368. "pagenum": total,
  369. "page": page,
  370. }, nil
  371. }
  372. // ReserveBook 图书预约
  373. func (s *BookServ) ReserveBook(bookid string) (*model.TaBookBorrowRecord, error) {
  374. book, err := s.dao.GetBookById(bookid)
  375. if err != nil {
  376. utils.LogError("获取图书信息失败:", err.Error())
  377. return nil, errors.New("获取图书信息失败")
  378. }
  379. if book == nil || book.BookId == "" {
  380. return nil, errors.New("没有对应的图书信息")
  381. }
  382. if book.LeftNum < 1 {
  383. return nil, errors.New("预约失败,库存不足")
  384. }
  385. customer := s.ctx.Get("customer").(model.TaCustomer)
  386. if customer.Phone == "" {
  387. return nil, errors.New("请先绑定您的手机号,再进行预约!")
  388. }
  389. isok, err := s.dao.CheckUserReserveBook(customer.CustomerId, bookid)
  390. if err != nil {
  391. utils.LogError("判断用户是否已借阅此图书失败:", err.Error())
  392. return nil, errors.New("判断失败,请刷新后重试!")
  393. }
  394. if !isok {
  395. return nil, errors.New("您已预约或借阅此图书!")
  396. }
  397. var record = model.TaBookBorrowRecord{
  398. BookId: book.BookId,
  399. CustomerId: customer.CustomerId,
  400. CustomerName: customer.Name,
  401. CustomerPhone: customer.Phone,
  402. OrgId: book.OrgId,
  403. CaseId: book.CaseId,
  404. }
  405. info, err := s.dao.ReserveBook(record)
  406. if err != nil {
  407. utils.LogError("预约失败:", err.Error())
  408. return nil, errors.New("预约失败")
  409. }
  410. // 减库存
  411. err = s.dao.BookLeftNumDel(book.BookId)
  412. if err != nil {
  413. utils.LogError("减库存失败:", err.Error())
  414. return nil, err
  415. }
  416. return &info, err
  417. }
  418. func (s *BookServ) GetCustomerByCustomerInfo(customerInfo string) (*model.TaCustomer, error) {
  419. list, err := s.dao.GetCustomerByCustomerInfo(customerInfo)
  420. if err != nil {
  421. utils.LogError("获取用户信息失败:", err.Error())
  422. return nil, errors.New("获取用户信息失败")
  423. }
  424. return list, nil
  425. }
  426. func (s *BookServ) GetRecordList(borrowStatus, caseid, customerName, customerPhone, bookName, barcode string, page, pageSize int) (map[string]interface{}, error) {
  427. if pageSize == 0 {
  428. pageSize = service.PAGENUM
  429. }
  430. if page <= 0 {
  431. page = 1
  432. }
  433. list, err := s.dao.GetRecordList(borrowStatus, caseid, customerName, customerPhone, bookName, barcode, page, pageSize)
  434. if err != nil {
  435. utils.LogError("获取借书记录列表失败: " + err.Error())
  436. return nil, errors.New("获取借书记录列表失败")
  437. }
  438. total, err := s.dao.GetRecordListCount(borrowStatus, caseid, customerName, customerPhone, bookName, barcode)
  439. if err != nil {
  440. utils.LogError("获取借书记录列表失败: " + err.Error())
  441. return nil, errors.New("获取借书记录列表失败")
  442. }
  443. return map[string]interface{}{
  444. "list": list,
  445. "pageSize": pageSize,
  446. "pagenum": total,
  447. "page": page,
  448. }, nil
  449. }
  450. func (s *BookServ) DeleteBook(bookId string) error {
  451. book, err := s.dao.GetBookById(bookId)
  452. if err != nil {
  453. utils.LogError("删除失败: " + err.Error())
  454. return errors.New("删除失败")
  455. }
  456. if book.LeftNum != book.InStock {
  457. return errors.New("当前图书已有借出/预约,不能删除")
  458. }
  459. err = s.dao.DeleteBook(bookId)
  460. if err != nil {
  461. utils.LogError("删除失败: " + err.Error())
  462. return errors.New("删除失败")
  463. }
  464. return nil
  465. }
  466. // func (s *BookServ) SendMessageToCustomer() error {
  467. // weekList, err := s.dao.GetAllOneWeekRecord()
  468. // if err != nil {
  469. // utils.LogError("发送消息失败失败: " + err.Error())
  470. // return errors.New("发送消息失败失败")
  471. // }
  472. // lateList, err := s.dao.GetAllLateRecord()
  473. // if err != nil {
  474. // utils.LogError("发送消息失败失败: " + err.Error())
  475. // return errors.New("发送消息失败失败")
  476. // }
  477. // if len(weekList) > 0 {
  478. // for i := 0; i < len(weekList); i++ {
  479. // userMap, err := s.dao.GetUserMappingById(weekList[i].CustomerId)
  480. // if err != nil {
  481. // utils.LogError("发送消息失败失败: " + err.Error())
  482. // return errors.New("发送消息失败失败")
  483. // }
  484. // message := utils.Message{
  485. // To: utils.ClientID{ID: userMap.Openid},
  486. // Data: map[string]interface{}{
  487. // "orgid": weekList[i].OrgId,
  488. // "tplid": "6WoxRkdXrRyF0T7Kc4PU5CjkpzAPWKKsA6wBLAGSQQg",
  489. // "data": map[string]string{
  490. // "first": "您好,您借阅图书即将逾期,请及时归还。",
  491. // "keyword1": weekList[i].BookName,
  492. // "keyword2": weekList[i].BorrowDate.Format("2006-01-02"),
  493. // "keyword3": weekList[i].EndDate.Format("2006-01-02"),
  494. // "remark": fmt.Sprintf("避免影响您下次借阅,请及时归还至", weekList[i].CaseName),
  495. // },
  496. // },
  497. // }
  498. // go utils.SendWechat(message)
  499. // }
  500. // }
  501. // if len(lateList) > 0 {
  502. // for i := 0; i < len(lateList); i++ {
  503. // userMap, err := s.dao.GetUserMappingById(lateList[i].CustomerId)
  504. // if err != nil {
  505. // utils.LogError("发送消息失败失败: " + err.Error())
  506. // return errors.New("发送消息失败失败")
  507. // }
  508. // message := utils.Message{
  509. // To: utils.ClientID{ID: userMap.Openid},
  510. // Data: map[string]interface{}{
  511. // "orgid": lateList[i].OrgId,
  512. // "tplid": "ID:Be0a25NMb3fzLtNaaQn_YOuECQDnlCs1es5aVvfwRhs",
  513. // "data": map[string]string{
  514. // "first": "您好,您借阅图书的时间已经逾期2天",
  515. // "keyword1": lateList[i].BookName,
  516. // "keyword2": weekList[i].BorrowDate.Format("2006-01-02"),
  517. // "keyword3": weekList[i].EndDate.Format("2006-01-02"),
  518. // "remark": fmt.Sprintf("避免影响您下次借阅,请及时归还至", lateList[i].CaseName),
  519. // },
  520. // },
  521. // }
  522. // go utils.SendWechat(message)
  523. // }
  524. // }
  525. // return nil
  526. // }
  527. func (s *BookServ) GetCustomerBorrowInfo(customerInfo string) (*book.CustomerInfo, error) {
  528. customer, err := s.dao.GetCustomerBorrowInfo(customerInfo)
  529. if err != nil {
  530. utils.LogError("获取用户信息失败: " + err.Error())
  531. return nil, errors.New("获取用户信息失败")
  532. }
  533. return customer, nil
  534. }
  535. func (s *BookServ) GetBookTypeByCaseId(caseId string) (map[string]string, error) {
  536. list, err := s.dao.GetBookTypeByCaseId(caseId)
  537. if err != nil {
  538. utils.LogError("查询图书类型失败: " + err.Error())
  539. return nil, errors.New("查询图书类型失败")
  540. }
  541. data := make(map[string]string)
  542. for i := 0; i < len(list); i++ {
  543. data[list[i].BookTypeName] = list[i].BookTypeId
  544. }
  545. return data, nil
  546. }