123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558
  1. package book
  2. import (
  3. "errors"
  4. "spaceofcheng/services/models"
  5. "spaceofcheng/services/models/model"
  6. "spaceofcheng/services/utils"
  7. "strconv"
  8. "strings"
  9. "time"
  10. "github.com/astaxie/beego"
  11. "github.com/go-xorm/xorm"
  12. )
  13. // BookDAO 当前数据库操作对象
  14. type BookDAO struct {
  15. ctx *utils.Context
  16. db *xorm.Session
  17. }
  18. // NewBookDAO New Inst
  19. func NewBookDAO(ctx *utils.Context) *BookDAO {
  20. return &BookDAO{
  21. ctx: ctx,
  22. db: ctx.DB,
  23. }
  24. }
  25. func (m *BookDAO) GetBookList(bookType, name, barcode, showzero, caseid string, page, pageSize int) ([]model.TaBook, error) {
  26. var book []model.TaBook
  27. sql := `select * from ta_book where status = '` + strconv.Itoa(models.STATUS_NORMAL) + `'
  28. and case_id in('` + strings.Replace(caseid, ",", "','", -1) + `')`
  29. if bookType != "" {
  30. sql += ` and book_type_id = '` + bookType + `'`
  31. }
  32. if name != "" {
  33. sql += ` and (book_name like '%` + name + `%' or author like '%` + name + `%')`
  34. }
  35. if barcode != "" {
  36. sql += ` and book_barcode = '` + barcode + `'`
  37. }
  38. if showzero == "0" {
  39. sql += ` and left_num>0`
  40. }
  41. sql += ` order by create_date desc limit ` + strconv.Itoa((page-1)*pageSize) + `, ` + strconv.Itoa(pageSize)
  42. err := m.db.Sql(sql).Find(&book)
  43. return book, err
  44. }
  45. func (m *BookDAO) GetBookListCount(bookType, name, showzero, barcode, caseid string) (int, error) {
  46. var book []model.TaBook
  47. sql := `select * from ta_book where status = '` + strconv.Itoa(models.STATUS_NORMAL) + `'
  48. and case_id in('` + strings.Replace(caseid, ",", "','", -1) + `')`
  49. if bookType != "" {
  50. sql += ` and book_type_id = '` + bookType + `'`
  51. }
  52. if barcode != "" {
  53. sql += ` and book_barcode = '` + barcode + `'`
  54. }
  55. if name != "" {
  56. sql += ` and (book_name like '%` + name + `%' or author like '%` + name + `%')`
  57. }
  58. if showzero == "0" {
  59. sql += ` and left_num>0`
  60. }
  61. sql += ` order by create_date desc`
  62. err := m.db.Sql(sql).Find(&book)
  63. return len(book), err
  64. }
  65. func (m *BookDAO) GetBookById(bookId string) (*model.TaBook, error) {
  66. sql := `select * from ta_book where book_id = '` + bookId + `'`
  67. book := model.TaBook{}
  68. _, err := m.db.Sql(sql).Get(&book)
  69. return &book, err
  70. }
  71. func (m *BookDAO) AddBook(book model.TaBook) (*model.TaBook, error) {
  72. book.Status = models.STATUS_NORMAL
  73. book.BookId = utils.GetGUID()
  74. book.CreateDate = time.Now()
  75. _, err := m.db.Insert(book)
  76. return &book, err
  77. }
  78. func (m *BookDAO) EditBook(book model.TaBook) (*model.TaBook, error) {
  79. var cols = []string{
  80. "book_type_id",
  81. "book_name",
  82. "book_img",
  83. "author",
  84. "publisher",
  85. "price",
  86. "borrow_days",
  87. "book_description",
  88. "is_recommend",
  89. }
  90. _, err := m.db.Cols(cols...).Where("book_id = ?", book.BookId).Update(book)
  91. return &book, err
  92. }
  93. func (m *BookDAO) AddBookRecord(record model.TaBookBorrowRecord) (*model.TaBookBorrowRecord, error) {
  94. record.BookBorrowRecordId = utils.GetGUID()
  95. record.CreateDate = time.Now()
  96. _, err := m.db.Insert(record)
  97. return &record, err
  98. }
  99. func (m *BookDAO) GetRecordById(recordId string) (*model.TaBookBorrowRecord, error) {
  100. var record []model.TaBookBorrowRecord
  101. sql := `select * from ta_book_borrow_record where book_borrow_record_id = '` + recordId + `'`
  102. err := m.db.Sql(sql).Find(&record)
  103. if len(record) <= 0 {
  104. return nil, err
  105. }
  106. return &record[0], err
  107. }
  108. func (m *BookDAO) UpdateBookRecord(record *model.TaBookBorrowRecord) (*model.TaBookBorrowRecord, error) {
  109. var cols = []string{
  110. "borrow_date",
  111. "return_date",
  112. "borrow_status",
  113. "end_date",
  114. }
  115. _, err := m.db.Cols(cols...).Where("book_borrow_record_id = ?", record.BookBorrowRecordId).Update(record)
  116. return record, err
  117. }
  118. func (m *BookDAO) UpdateInStockBook(book *model.TaBook, cols []string) error {
  119. _, err := m.db.Cols(cols...).Where("book_id = ?", book.BookId).Update(book)
  120. return err
  121. }
  122. type BorrowRecord struct {
  123. model.TaBookBorrowRecord `xorm:"extends"`
  124. BookBarcode string
  125. BookName string
  126. BookImg string
  127. }
  128. func (m *BookDAO) GetRecordList(borrowStatus, caseid, customerName, customerPhone, bookName, barcode string, page, pageSize int) ([]BorrowRecord, error) {
  129. var record []BorrowRecord
  130. sql := `SELECT
  131. a.*,
  132. b.book_name,
  133. b.book_barcode,
  134. b.book_img
  135. FROM
  136. ta_book_borrow_record a
  137. INNER JOIN ta_book b ON a.book_id = b.book_id
  138. where a.case_id in('` + strings.Replace(caseid, ",", "','", -1) + `')`
  139. if borrowStatus != "" {
  140. sql += ` and a.borrow_status = '` + borrowStatus + `' `
  141. }
  142. if customerName != "" {
  143. sql += ` and a.customer_name like '%` + customerName + `%' `
  144. }
  145. if customerPhone != "" {
  146. sql += ` and a.customer_phone like'%` + customerPhone + `%' `
  147. }
  148. if bookName != "" {
  149. sql += ` and (b.book_name like '%` + bookName + `%')`
  150. }
  151. if barcode != "" {
  152. sql += ` and b.book_barcode = '` + barcode + `'`
  153. }
  154. if borrowStatus != models.BORROW_TYPE_RESERVE {
  155. sql += ` and a.borrow_status in(0,1,2,3) order by a.borrow_date desc`
  156. } else {
  157. sql += `order by a.create_date desc `
  158. }
  159. sql += ` limit ` + strconv.Itoa((page-1)*pageSize) + `, ` + strconv.Itoa(pageSize)
  160. beego.Error(sql)
  161. err := m.db.Sql(sql).Find(&record)
  162. return record, err
  163. }
  164. func (m *BookDAO) GetRecordListCount(borrowStatus, caseid, customerName, customerPhone, bookName, barcode string) (int, error) {
  165. var record []BorrowRecord
  166. sql := `SELECT
  167. a.*,
  168. b.book_name,
  169. b.book_barcode
  170. FROM
  171. ta_book_borrow_record a
  172. INNER JOIN ta_book b ON a.book_id = b.book_id
  173. where a.case_id in('` + strings.Replace(caseid, ",", "','", -1) + `')`
  174. if borrowStatus != "" {
  175. sql += ` and a.borrow_status = '` + borrowStatus + `' `
  176. }
  177. if customerName != "" {
  178. sql += ` and a.customer_name = '` + customerName + `' `
  179. }
  180. if customerPhone != "" {
  181. sql += ` and a.customer_phone ='` + customerPhone + `' `
  182. }
  183. if bookName != "" {
  184. sql += ` and b.book_name = '` + bookName + `' `
  185. }
  186. if barcode != "" {
  187. sql += ` and b.book_barcode = '` + barcode + `'`
  188. }
  189. if borrowStatus != models.BORROW_TYPE_RESERVE {
  190. sql += ` and a.borrow_status in(0,1,2,3)`
  191. }
  192. err := m.db.Sql(sql).Find(&record)
  193. return len(record), err
  194. }
  195. func (m *BookDAO) GetBookRecommendList(caseid string, page, pageSize int) ([]model.TaBook, error) {
  196. var book []model.TaBook
  197. sql := `select * from ta_book where status = '` + strconv.Itoa(models.STATUS_NORMAL) + `'
  198. and case_id in('` + strings.Replace(caseid, ",", "','", -1) + `')
  199. and is_recommend = '` + strconv.Itoa(models.RECOMMEND_YES) + `' and left_num>0`
  200. sql += ` order by create_date desc limit ` + strconv.Itoa((page-1)*pageSize) + `, ` + strconv.Itoa(pageSize)
  201. err := m.db.Sql(sql).Find(&book)
  202. return book, err
  203. }
  204. type InStockChange struct {
  205. model.TaInStockChange `xorm:"extends"`
  206. RealName string
  207. BookName string
  208. LeftNum int
  209. InStock int
  210. }
  211. func (m *BookDAO) GetInStockChangeByBookId(bookId string, page, pageSize int) ([]InStockChange, error) {
  212. var change []InStockChange
  213. sql := `SELECT
  214. a.*,
  215. b.book_name,
  216. b.left_num,
  217. b.in_stock,
  218. c.real_name
  219. FROM
  220. ta_in_stock_change a
  221. INNER JOIN ta_book b ON a.book_id = b.book_id
  222. INNER JOIN sys_user c on a.change_user = c.user_id
  223. WHERE a.book_id = '` + bookId + `'`
  224. sql += ` order by a.change_date desc limit ` + strconv.Itoa((page-1)*pageSize) + `, ` + strconv.Itoa(pageSize)
  225. err := m.db.Sql(sql).Find(&change)
  226. return change, err
  227. }
  228. func (m *BookDAO) GetInStockChangeByBookIdCount(bookId string) (int, error) {
  229. var change []InStockChange
  230. sql := `SELECT
  231. a.*,
  232. b.book_name,
  233. b.left_num,
  234. c.real_name
  235. FROM
  236. ta_in_stock_change a
  237. INNER JOIN ta_book b ON a.book_id = b.book_id
  238. INNER JOIN sys_user c on a.change_user = c.user_id
  239. WHERE a.book_id = '` + bookId + `'`
  240. err := m.db.Sql(sql).Find(&change)
  241. return len(change), err
  242. }
  243. func (m *BookDAO) AddChangeRecord(change model.TaInStockChange) error {
  244. change.ChangeDate = time.Now()
  245. change.RecordId = utils.GetGUID()
  246. _, err := m.db.Insert(change)
  247. return err
  248. }
  249. // BookBorrowRecord 图书借阅记录
  250. type BookBorrowRecord struct {
  251. model.TaBookBorrowRecord `xorm:"extends"`
  252. BookName string
  253. BookImg string
  254. CaseName string
  255. }
  256. // GetMineRecord 获取个人借阅记录
  257. func (m *BookDAO) GetMineRecord(customerid, status string, page, pagesize int) ([]BookBorrowRecord, error) {
  258. var records []BookBorrowRecord
  259. sql := `select a.*,b.book_name,b.book_img,c.case_name from ta_book_borrow_record a
  260. inner join sys_case c on a.case_id=c.case_id
  261. left join ta_book b on a.book_id=b.book_id
  262. where a.customer_id=? `
  263. if status != "" {
  264. sql += ` and a.borrow_status in ('` + strings.Replace(status, ",", "','", -1) + `')`
  265. }
  266. sql += ` order by a.borrow_status asc`
  267. if status == "4" {
  268. sql += `,a.reserve_date asc`
  269. } else {
  270. sql += `,a.end_date asc`
  271. }
  272. sql += ` limit ` + strconv.Itoa((page-1)*pagesize) + `, ` + strconv.Itoa(pagesize)
  273. err := m.db.Sql(sql, customerid).Find(&records)
  274. return records, err
  275. }
  276. // GetMineRecordCount 获取个人借阅记录count
  277. func (m *BookDAO) GetMineRecordCount(customerid, status string) (int, error) {
  278. var records []model.TaBookBorrowRecord
  279. var db = m.db.Where("customer_id=?", customerid)
  280. if status != "" {
  281. db.And("borrow_status in ('" + strings.Replace(status, ",", "','", -1) + "')")
  282. }
  283. err := db.Find(&records)
  284. return len(records), err
  285. }
  286. // ReserveBook 图书预约
  287. func (m *BookDAO) ReserveBook(record model.TaBookBorrowRecord) (model.TaBookBorrowRecord, error) {
  288. record.BookBorrowRecordId = utils.GetGUID()
  289. record.CreateDate = time.Now()
  290. record.ReserveDate = time.Now()
  291. dd, _ := time.ParseDuration("168h")
  292. record.ReserveEndDate = time.Now().Add(dd)
  293. record.BorrowStatus = models.BORROW_TYPE_RESERVE
  294. _, err := m.db.Insert(record)
  295. return record, err
  296. }
  297. // CheckUserReserveBook 判断用户书籍预约状态
  298. func (m *BookDAO) CheckUserReserveBook(customerid, bookid string) (bool, error) {
  299. var records []model.TaBookBorrowRecord
  300. err := m.db.Where("customer_id=?", customerid).And("book_id=?", bookid).And("borrow_status in ('" + models.BORROW_TYPE_RESERVE + "','" + models.BORROW_TYPE_BORROWED + "','" + models.BORROW_TYPE_LATE + "')").Find(&records)
  301. if err != nil {
  302. return false, err
  303. }
  304. return len(records) == 0, nil
  305. }
  306. // BookLeftNumDel 图书库存减少
  307. func (m *BookDAO) BookLeftNumDel(bookid string) error {
  308. sql := `update ta_book set left_num = left_num - 1 where book_id=? and left_num > 0`
  309. req, err := m.db.Exec(sql, bookid)
  310. if err != nil {
  311. return err
  312. }
  313. row, _ := req.RowsAffected()
  314. if row == 0 {
  315. return errors.New("预约失败,库存不足")
  316. }
  317. return nil
  318. }
  319. //
  320. func (m *BookDAO) CustomerReservedBook(bookId, customerId string) (*model.TaBookBorrowRecord, error) {
  321. var book []model.TaBookBorrowRecord
  322. sql := `SELECT
  323. a.*
  324. FROM
  325. ta_book_borrow_record a
  326. WHERE
  327. a.borrow_status = '` + models.BORROW_TYPE_RESERVE + `'
  328. AND a.customer_id = '` + customerId + `'
  329. AND a.book_id = '` + bookId + `'`
  330. err := m.db.Sql(sql).Find(&book)
  331. if len(book) <= 0 {
  332. return nil, err
  333. }
  334. return &book[0], err
  335. }
  336. func (m *BookDAO) GetBorrowById(borrowId string) (*model.TaBookBorrowRecord, error) {
  337. var book []model.TaBookBorrowRecord
  338. sql := `SELECT
  339. a.*
  340. FROM
  341. ta_book_borrow_record a
  342. WHERE
  343. a.book_borrow_record_id = '` + borrowId + `'`
  344. err := m.db.Sql(sql).Find(&book)
  345. if len(book) <= 0 {
  346. return nil, err
  347. }
  348. return &book[0], err
  349. }
  350. type ReturnList struct {
  351. model.TaBookBorrowRecord `xorm:"extends"`
  352. BookName string
  353. BookBarcode string
  354. BookTypeName string
  355. LateDays string
  356. }
  357. func (m *BookDAO) GetCustomerReturnList(customerInfo, caseId string, page, pageSize int) ([]ReturnList, error) {
  358. var record []ReturnList
  359. sql := `SELECT
  360. a.*,
  361. b.book_name,
  362. b.book_barcode,
  363. c.book_type_name
  364. FROM
  365. ta_book_borrow_record a
  366. INNER JOIN ta_book b ON a.book_id = b.book_id
  367. INNER JOIN ta_book_type c ON b.book_type_id = c.book_type_id
  368. INNER JOIN ta_customer d ON a.customer_id = d.customer_id
  369. WHERE
  370. a.borrow_status IN ( '` + models.BORROW_TYPE_BORROWED + `', '` + models.BORROW_TYPE_LATE + `' )
  371. AND ( a.customer_phone = '` + customerInfo + `' OR d.barcode = '` + customerInfo + `' )
  372. and a.case_id in('` + strings.Replace(caseId, ",", "','", -1) + `')`
  373. sql += ` order by a.borrow_date desc limit ` + strconv.Itoa((page-1)*pageSize) + `, ` + strconv.Itoa(pageSize)
  374. err := m.db.Sql(sql).Find(&record)
  375. return record, err
  376. }
  377. func (m *BookDAO) GetCustomerReturnListCount(customerInfo, caseId string) (int, error) {
  378. var record []ReturnList
  379. sql := `SELECT
  380. a.*,
  381. b.book_name,
  382. b.book_barcode,
  383. c.book_type_name
  384. FROM
  385. ta_book_borrow_record a
  386. INNER JOIN ta_book b ON a.book_id = b.book_id
  387. INNER JOIN ta_book_type c ON b.book_type_id = c.book_type_id
  388. INNER JOIN ta_customer d ON a.customer_id = d.customer_id
  389. WHERE
  390. a.borrow_status IN ( '` + models.BORROW_TYPE_BORROWED + `', '` + models.BORROW_TYPE_LATE + `' )
  391. AND ( a.customer_phone = '` + customerInfo + `' OR d.barcode = '` + customerInfo + `' )
  392. and a.case_id in('` + strings.Replace(caseId, ",", "','", -1) + `')`
  393. err := m.db.Sql(sql).Find(&record)
  394. return len(record), err
  395. }
  396. func (m *BookDAO) GetCustomerByCustomerInfo(customerInfo string) (*model.TaCustomer, error) {
  397. var customer []model.TaCustomer
  398. sql := `select * from ta_customer a
  399. where a.customer_phone = '` + customerInfo + `'
  400. OR d.barcode = '` + customerInfo + `' )`
  401. err := m.db.Sql(sql).Find(&customer)
  402. if len(customer) <= 0 {
  403. return nil, err
  404. }
  405. return &customer[0], err
  406. }
  407. type TimeList struct {
  408. model.TaBookBorrowRecord `xorm:"extends"`
  409. BookName string
  410. CaseName string
  411. }
  412. // GetAllOneWeekRecord 获取时间还剩一周过期的借阅记录
  413. func (m *BookDAO) GetAllOneWeekRecord() ([]TimeList, error) {
  414. var record []TimeList
  415. sql := `SELECT
  416. a.*,
  417. b.book_name,
  418. c.case_name
  419. FROM
  420. ta_book_borrow_record a
  421. inner join ta_book b on a.book_id = b.book_id
  422. inner join sys_case c on a.case_id = c.case_id
  423. WHERE
  424. DATE_FORMAT( a.end_date, "%Y-%m-%d" ) = DATE_FORMAT( ( SELECT date_add( now( ), INTERVAL 1 WEEK ) ), "%Y-%m-%d" )
  425. and a.borrow_status = '` + models.BORROW_TYPE_BORROWED + `'`
  426. err := m.db.Sql(sql).Find(&record)
  427. return record, err
  428. }
  429. // GetAllLateRecord 获取过期两天的借阅记录
  430. func (m *BookDAO) GetAllLateRecord() ([]TimeList, error) {
  431. var record []TimeList
  432. sql := `SELECT
  433. a.*,
  434. b.book_name,
  435. c.case_name
  436. FROM
  437. ta_book_borrow_record a
  438. inner join ta_book b on a.book_id = b.book_id
  439. inner join sys_case c on a.case_id = c.case_id
  440. WHERE
  441. DATE_FORMAT( now(), "%Y-%m-%d" ) = DATE_FORMAT( ( SELECT date_add( a.end_date, INTERVAL 2 DAY ) ), "%Y-%m-%d" )
  442. and a.borrow_status = '` + models.BORROW_TYPE_LATE + `'`
  443. err := m.db.Sql(sql).Find(&record)
  444. return record, err
  445. }
  446. func (m *BookDAO) DeleteBook(bookId string) error {
  447. var book = model.TaBook{
  448. BookId: bookId,
  449. Status: models.STATUS_DEL,
  450. }
  451. var cols = []string{
  452. "status",
  453. }
  454. _, err := m.db.Cols(cols...).Where("book_id = ?", book.BookId).Update(book)
  455. return err
  456. }
  457. func (m *BookDAO) GetUserMappingById(customerId string) (*model.TaUserMapping, error) {
  458. var userMap []model.TaUserMapping
  459. sql := `select * from ta_user_mapping where user_id = '` + customerId + `'`
  460. err := m.db.Sql(sql).Find(&userMap)
  461. if len(userMap) <= 0 {
  462. return nil, err
  463. }
  464. return &userMap[0], err
  465. }
  466. func (m *BookDAO) IsBarcodeExist(barcode, caseId string) (int, error) {
  467. var book []model.TaBook
  468. sql := `select * from ta_book where book_barcode = '` + barcode + `'
  469. and case_id = '` + caseId + `'
  470. and status ='` + strconv.Itoa(models.STATUS_NORMAL) + `'`
  471. err := m.db.Sql(sql).Find(&book)
  472. return len(book), err
  473. }
  474. type CustomerInfo struct {
  475. CustomerId string
  476. Name string
  477. Phone string
  478. BorrowNum int
  479. LateNum int
  480. IsLate string
  481. }
  482. func (m *BookDAO) GetCustomerBorrowInfo(customerInfo string) (*CustomerInfo, error) {
  483. var customer []CustomerInfo
  484. sql := `SELECT
  485. a.customer_id,
  486. a.name,
  487. a.phone ,
  488. (select count(1) from ta_book_borrow_record c WHERE borrow_status = '1' and c.customer_id = a.customer_id)as borrow_num,
  489. (select count(1) from ta_book_borrow_record c WHERE borrow_status = '0' and c.customer_id = a.customer_id)as late_num
  490. FROM
  491. ta_customer a LEFT JOIN ta_book_borrow_record b on a.customer_id = b.customer_id
  492. where a.phone = '` + customerInfo + `' OR a.barcode = '` + customerInfo + `'
  493. GROUP BY a.phone`
  494. err := m.db.SQL(sql).Find(&customer)
  495. if len(customer) <= 0 {
  496. return nil, err
  497. }
  498. if customer[0].LateNum > 0 {
  499. customer[0].IsLate = "yes"
  500. } else {
  501. customer[0].IsLate = "no"
  502. }
  503. return &customer[0], err
  504. }
  505. func (m *BookDAO) GetBookTypeByCaseId(caseId string) ([]model.TaBookType, error) {
  506. var bookType []model.TaBookType
  507. sql := `select * from ta_book_type where case_id = '` + caseId + `'`
  508. err := m.db.SQL(sql).Find(&bookType)
  509. return bookType, err
  510. }
  511. // func (m *BookDAO)UpdateBookRecordDays(bookId string,days int)error{
  512. // }