123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545
  1. package card
  2. import (
  3. "errors"
  4. "fmt"
  5. "spaceofcheng/services/models"
  6. "spaceofcheng/services/models/model"
  7. "spaceofcheng/services/utils"
  8. "strconv"
  9. "strings"
  10. "time"
  11. "github.com/go-xorm/xorm"
  12. "github.com/yl10/kit/guid"
  13. )
  14. // CardDAO 当前数据库操作对象
  15. type CardDAO struct {
  16. ctx *utils.Context
  17. db *xorm.Session
  18. }
  19. // NewCardDAO New Inst
  20. func NewCardDAO(ctx *utils.Context) *CardDAO {
  21. return &CardDAO{
  22. ctx: ctx,
  23. db: ctx.DB,
  24. }
  25. }
  26. // CardInfo 卡
  27. type CardInfo struct {
  28. model.TaCouponCard `xorm:"extends"`
  29. Images []model.TaExperienceCardImage
  30. Targets []model.TaCouponCardTarget
  31. Share *model.TaExperienceCardShare
  32. ChannelId string
  33. }
  34. // GetCardList 获取卡列表
  35. func (m *CardDAO) GetCardList(filters []string, limit []int) ([]model.TaCouponCard, int64, error) {
  36. var cds []model.TaCouponCard
  37. filterString := ""
  38. if len(filters) > 0 {
  39. filterString = strings.Join(filters, " and ")
  40. filterString += " and "
  41. }
  42. sql := `select * from ta_coupon_card where %s status > ` + strconv.Itoa(models.STATUS_DEL) + ` order by create_date desc`
  43. total, err := utils.NewPageNaviEngine(m.ctx).GetPageList(&cds, fmt.Sprintf(sql, filterString), limit)
  44. if err != nil {
  45. return nil, 0, err
  46. }
  47. return cds, total, nil
  48. }
  49. // GetCardByID 获取卡明细
  50. func (m *CardDAO) GetCardByID(cardid string) (*CardInfo, error) {
  51. var card []CardInfo
  52. sql := `select * from ta_coupon_card where card_id=? and status>` + strconv.Itoa(models.STATUS_DEL)
  53. err := m.db.Sql(sql, cardid).Find(&card)
  54. if err != nil {
  55. return nil, err
  56. }
  57. if len(card) == 0 {
  58. return nil, nil
  59. }
  60. imgs, err := m.GetCardImgsByCardID(cardid)
  61. if err != nil {
  62. return nil, err
  63. }
  64. card[0].Images = imgs
  65. targets, err := m.GetCardTargetByCardID(cardid)
  66. if err != nil {
  67. return nil, err
  68. }
  69. card[0].Targets = targets
  70. share, err := m.GetCardShareByCardID(cardid)
  71. if err != nil {
  72. return nil, err
  73. }
  74. card[0].Share = share
  75. channel, err := m.GetCardChannel(cardid)
  76. if err != nil {
  77. return nil, err
  78. }
  79. if channel != nil {
  80. card[0].ChannelId = channel.ChannelId
  81. }
  82. return &card[0], err
  83. }
  84. // AddCard 新增卡信息
  85. func (m *CardDAO) AddCard(card *model.TaCouponCard) error {
  86. if card.CardId == "" {
  87. card.CardId = guid.NewGUIDString()
  88. }
  89. userRaw := m.ctx.Get("user")
  90. if userRaw != nil {
  91. user := userRaw.(model.SysUser)
  92. card.CreateUser = user.UserId
  93. }
  94. card.Status = models.STATUS_NORMAL
  95. card.CreateDate = time.Now().Local()
  96. if _, err := m.db.Insert(card); err != nil {
  97. return err
  98. }
  99. return nil
  100. }
  101. // GetCardInfoByID 获取卡信息
  102. func (m *CardDAO) GetCardInfoByID(cardid string) (*model.TaCouponCard, error) {
  103. var card = model.TaCouponCard{}
  104. _, err := m.db.Where("card_id=?", cardid).Get(&card)
  105. return &card, err
  106. }
  107. // UpdateCard 更新体验卡
  108. func (m *CardDAO) UpdateCard(card *model.TaCouponCard, cols []string) error {
  109. if card.CardId == "" {
  110. return errors.New("无卡信息")
  111. }
  112. if _, err := m.db.Cols(cols...).Where("card_id=?", card.CardId).Update(card); err != nil {
  113. return err
  114. }
  115. return nil
  116. }
  117. // DeleteCard 删除卡
  118. func (m *CardDAO) DeleteCard(id string) error {
  119. if id == "" {
  120. return errors.New("无卡信息")
  121. }
  122. card := model.TaCouponCard{
  123. CardId: id,
  124. Status: models.STATUS_DEL,
  125. }
  126. if err := m.UpdateCard(&card, []string{"status"}); err != nil {
  127. return err
  128. }
  129. return nil
  130. }
  131. // SaveCustomerCard 保存用户卡
  132. func (m *CardDAO) SaveCustomerCard(card *model.TaCustomerCard) error {
  133. if card.CustomerCardId == "" {
  134. card.CustomerCardId = guid.NewGUIDString()
  135. }
  136. card.Status = models.STATUS_NORMAL
  137. card.ReceiveDate = time.Now().Local()
  138. card.VerifyStatus = models.VERIFY_USEABLE
  139. if _, err := m.db.Insert(card); err != nil {
  140. return err
  141. }
  142. return nil
  143. }
  144. // SaveCustomerCards 保存用户卡
  145. func (m *CardDAO) SaveCustomerCards(cards []model.TaCustomerCard) error {
  146. for i := range cards {
  147. if cards[i].CustomerCardId == "" {
  148. cards[i].CustomerCardId = guid.NewGUIDString()
  149. }
  150. cards[i].Status = models.STATUS_USED
  151. cards[i].ReceiveDate = time.Now()
  152. cards[i].VerifyStatus = models.VERIFY_USEABLE
  153. }
  154. if _, err := m.db.Insert(cards); err != nil {
  155. return err
  156. }
  157. return nil
  158. }
  159. // CheckCustCard 检查客户是否已经有了该卡券
  160. // 如果用户有了卡券, 但是用过了,或者卡券过期了,仍然可以再次拥有
  161. func (m *CardDAO) CheckCustCard(custID, CardID string, startDate, endDate time.Time) ([]model.TaCustomerCard, error) {
  162. var cps []model.TaCustomerCard
  163. query := `
  164. SELECT
  165. *
  166. FROM
  167. ta_customer_card t
  168. WHERE
  169. t.card_id = ?
  170. AND t.customer_id = ?
  171. AND t.status = ?
  172. AND (
  173. (t.start_date BETWEEN ? AND ?)
  174. OR (t.end_date BETWEEN ? AND ?)
  175. OR (
  176. t.start_date <= ?
  177. AND t.end_date >= ?
  178. )
  179. )
  180. `
  181. if err := m.db.SQL(
  182. query,
  183. CardID,
  184. models.STATUS_NORMAL,
  185. custID,
  186. startDate,
  187. endDate,
  188. startDate,
  189. endDate,
  190. startDate,
  191. endDate,
  192. ).Find(&cps); err != nil {
  193. return nil, err
  194. }
  195. return cps, nil
  196. }
  197. // 案场可用卡信息
  198. type CaseUsableCard struct {
  199. model.TaCouponCard `xorm:"extends"`
  200. CustomerCard []model.TaCustomerCard
  201. Share *model.TaExperienceCardShare
  202. }
  203. // GetCaseUsableCard 获取案场可用卡信息
  204. func (m *CardDAO) GetCaseUsableCard(caseid, userid string, page, pageSize int) ([]CaseUsableCard, error) {
  205. var cards []CaseUsableCard
  206. sql := `select * from ta_coupon_card where case_id=? and status=? and DATE_FORMAT(end_date, '%Y-%m-%d')>=DATE_FORMAT(NOW(), '%Y-%m-%d') and send_type=? order by create_date desc limit ` + strconv.Itoa((page-1)*pageSize) + `, ` + strconv.Itoa(pageSize)
  207. err := m.db.Sql(sql, caseid, models.STATUS_NORMAL, models.GIVE_TYPE_CASE).Find(&cards)
  208. for inx, card := range cards {
  209. if userid != "" {
  210. cCards, err := m.GetCustomerCardByCardAndUser(card.CardId, userid)
  211. if err != nil {
  212. return nil, err
  213. }
  214. cards[inx].CustomerCard = cCards
  215. } else {
  216. // 主管
  217. num, err := m.GetCustomerCardVerifyNum(card.CardId)
  218. if err != nil {
  219. return nil, err
  220. }
  221. cards[inx].UsedCount = num
  222. }
  223. share, err := m.GetCardShareByCardID(card.CardId)
  224. if err != nil {
  225. return nil, err
  226. }
  227. cards[inx].Share = share
  228. }
  229. return cards, err
  230. }
  231. // GetCustomerCardVerifyNum 获取卡核销数量
  232. func (m *CardDAO) GetCustomerCardVerifyNum(cardid string) (int, error) {
  233. var customerCards []model.TaCustomerCard
  234. err := m.db.Where("card_id=?", cardid).And("verify_status<>?", models.VERIFY_USEABLE).Find(&customerCards)
  235. return len(customerCards), err
  236. }
  237. // GetCaseUsableCardCount 获取案场可用卡数量
  238. func (m *CardDAO) GetCaseUsableCardCount(caseid, userid string) (int, error) {
  239. var Coupons []CaseUsableCard
  240. sql := `select * from ta_coupon_card where case_id=? and status=? and DATE_FORMAT(end_date, '%Y-%m-%d')>=DATE_FORMAT(NOW(), '%Y-%m-%d') and send_type=?`
  241. err := m.db.Sql(sql, caseid, models.STATUS_NORMAL, models.GIVE_TYPE_CASE).Find(&Coupons)
  242. return len(Coupons), err
  243. }
  244. // GetCustomerCardByCardAndUser 根据卡与用户获取领取的用户信息
  245. func (m *CardDAO) GetCustomerCardByCardAndUser(cardid, userid string) ([]model.TaCustomerCard, error) {
  246. var customerCards []model.TaCustomerCard
  247. err := m.db.Where("card_id=?", cardid).And("sales_id=?", userid).And("status>?", models.STATUS_DEL).Find(&customerCards)
  248. return customerCards, err
  249. }
  250. // 案场可用卡信息
  251. type CardDetailWithSales struct {
  252. model.TaCouponCard `xorm:"extends"`
  253. CustomerCard []SalesWithCustomerCardNum
  254. }
  255. // SalesWithCustomerCardNum
  256. type SalesWithCustomerCardNum struct {
  257. RealName string
  258. SalesId string
  259. ReceiveNum int
  260. UsedNum int
  261. }
  262. // GetCardDetail 获取卡详情
  263. func (m *CardDAO) GetCardDetail(cardid string) (*CardDetailWithSales, error) {
  264. var card = new(CardDetailWithSales)
  265. sql := `select * from ta_coupon_card where card_id=? and status>?`
  266. _, err := m.db.Sql(sql, cardid, models.STATUS_DEL).Get(card)
  267. if err != nil {
  268. return nil, err
  269. }
  270. if card == nil || card.CardId == "" {
  271. return nil, errors.New("无卡信息")
  272. }
  273. num, err := m.GetCustomerCardVerifyNum(card.CardId)
  274. if err != nil {
  275. return nil, err
  276. }
  277. card.UsedCount = num
  278. ccards, err := m.GetCustomerCardByCardWithRealName(cardid)
  279. if err != nil {
  280. return nil, err
  281. }
  282. card.CustomerCard = ccards
  283. return card, nil
  284. }
  285. // GetSalesCardByCard 根据卡获取领取的用户信息
  286. func (m *CardDAO) GetSalesCardByCard(cardid string) ([]model.TaCustomerCard, error) {
  287. var customerCards []model.TaCustomerCard
  288. err := m.db.Where("card_id=?", cardid).And("status>?", models.STATUS_DEL).Find(&customerCards)
  289. return customerCards, err
  290. }
  291. // GetCustomerCardByCardWithRealName 根据卡获取领取的用户信息
  292. func (m *CardDAO) GetCustomerCardByCardWithRealName(cardid string) ([]SalesWithCustomerCardNum, error) {
  293. var customerCards []SalesWithCustomerCardNum
  294. sql := `SELECT
  295. b.real_name,
  296. a.sales_id,
  297. count(1) AS receive_num,
  298. sum(
  299. CASE
  300. WHEN a.verify_status = 'useable' THEN
  301. 0
  302. ELSE
  303. 1
  304. END
  305. ) AS used_num
  306. FROM
  307. ta_customer_card a
  308. INNER JOIN sys_user b ON a.sales_id = b.user_id
  309. WHERE
  310. a.card_id = ?
  311. AND a. STATUS > ?
  312. GROUP BY
  313. b.real_name,
  314. a.sales_id`
  315. err := m.db.Sql(sql, cardid, models.STATUS_DEL).Find(&customerCards)
  316. return customerCards, err
  317. }
  318. // GetCustomerCardByCard 根据卡获取领取的用户信息
  319. func (m *CardDAO) GetCustomerCardByCard(cardid string) ([]model.TaCustomerCard, error) {
  320. var customerCards []model.TaCustomerCard
  321. err := m.db.Where("card_id=?", cardid).And("status>?", models.STATUS_DEL).Find(&customerCards)
  322. return customerCards, err
  323. }
  324. // GetCustomerCardByUser 根据用户获取发送的卡信息
  325. func (m *CardDAO) GetCustomerCardByUser(caseid, userid string) ([]model.TaCustomerCard, error) {
  326. var customerCards []model.TaCustomerCard
  327. err := m.db.Where("case_id=?", caseid).And("sales_id=?", userid).And("status>?", models.STATUS_DEL).Find(&customerCards)
  328. return customerCards, err
  329. }
  330. // GetCardWithCustomer 获取体验卡明细
  331. func (m *CardDAO) GetCardWithCustomer(cardid string) (*CaseUsableCard, error) {
  332. var card = new(CaseUsableCard)
  333. sql := `select * from ta_card where coupin_id=?`
  334. _, err := m.db.Sql(sql, cardid).Get(&card)
  335. if err != nil {
  336. return nil, err
  337. }
  338. if card == nil || card.CardId == "" {
  339. return nil, errors.New("无体验卡信息")
  340. }
  341. var customerCopons []model.TaCustomerCard
  342. sql = `select * from ta_customer_card where card_id = ? and status>?`
  343. err = m.db.Sql(sql, card, models.STATUS_DEL).Find(&customerCopons)
  344. if err != nil {
  345. return nil, err
  346. }
  347. card.CustomerCard = customerCopons
  348. return card, nil
  349. }
  350. // CustomerCardWithShare 我的卡券关联分享信息
  351. type CustomerCardWithShare struct {
  352. model.TaCustomerCard `xorm:"extends"`
  353. CustomerCourseId string
  354. CourseId string
  355. CourseNum int
  356. JoinNum int
  357. CourseName string
  358. Share *model.TaExperienceCardShare
  359. }
  360. // GetCardByCustomer 获取我的体验卡
  361. func (m *CardDAO) GetCardByCustomer(orgid, customerid string) ([]CustomerCardWithShare, error) {
  362. var cards []CustomerCardWithShare
  363. sql := `select a.*,b.customer_course_id,b.course_id,b.course_num,b.join_num,b.course_name from ta_customer_card a left join ta_customer_course b on a.customer_card_id = b.source_id where a.status>? and a.customer_id=? and a.org_id=?`
  364. err := m.db.Sql(sql, models.STATUS_DEL, customerid, orgid).Find(&cards)
  365. if err != nil {
  366. return nil, err
  367. }
  368. for inx, card := range cards {
  369. share, err := m.GetCardShareByCardID(card.CardId)
  370. if err != nil {
  371. utils.LogError("获取体验卡失败: " + err.Error())
  372. return nil, errors.New("获取体验卡失败")
  373. }
  374. cards[inx].Share = share
  375. }
  376. return cards, err
  377. }
  378. // GetCustomerCardByID 获取我的体验卡详情
  379. func (m *CardDAO) GetCustomerCardByID(id string) (*CustomerCardWithShare, error) {
  380. if id == "" {
  381. return nil, errors.New("无体验卡信息")
  382. }
  383. var customerCard = new(CustomerCardWithShare)
  384. sql := `select * from ta_customer_card where status>? and customer_card_id=?`
  385. _, err := m.db.Sql(sql, models.STATUS_DEL, id).Get(customerCard)
  386. share, err := m.GetCardShareByCardID(customerCard.CardId)
  387. if err != nil {
  388. utils.LogError("获取体验卡失败: " + err.Error())
  389. return nil, errors.New("获取体验卡失败")
  390. }
  391. customerCard.Share = share
  392. return customerCard, err
  393. }
  394. // CheckBySerialCode 根据批次码判断
  395. func (m *CardDAO) CheckBySerialCode(cardid, code string) (bool, error) {
  396. var customerCards []model.TaCustomerCard
  397. err := m.db.Where("card_id=?", cardid).And("serial_code=?", code).Find(&customerCards)
  398. if err != nil {
  399. return false, err
  400. }
  401. if len(customerCards) == 0 {
  402. return true, nil
  403. }
  404. return false, nil
  405. }
  406. // CheckByCustomer 判断用户是否已领取
  407. func (m *CardDAO) CheckByCustomer(cardid, customerid string) (bool, error) {
  408. var customerCards []model.TaCustomerCard
  409. err := m.db.Where("card_id=?", cardid).And("customer_id=?", customerid).Find(&customerCards)
  410. if err != nil {
  411. return false, err
  412. }
  413. if len(customerCards) == 0 {
  414. return true, nil
  415. }
  416. return false, nil
  417. }
  418. // GetCustomerCardByCustomerAndSaleCount 获取用户的领取记录
  419. func (m *CardDAO) GetCustomerCardByCustomerAndSaleCount(customerid, saleid string) (int, error) {
  420. var customerCard []model.TaCustomerCard
  421. err := m.db.Where("customer_id=?", customerid).And("sales_id=?", saleid).Find(&customerCard)
  422. return len(customerCard), err
  423. }
  424. // GetCustomerCardByCustomerAndSale 获取用户的领取记录
  425. func (m *CardDAO) GetCustomerCardByCustomerAndSale(customerid, saleid string, page, pageSize int) ([]model.TaCustomerCard, error) {
  426. var customerCard []model.TaCustomerCard
  427. err := m.db.Where("customer_id=?", customerid).And("sales_id=?", saleid).OrderBy("status asc,receive_date desc").Limit(pageSize, (page-1)*pageSize).Find(&customerCard)
  428. return customerCard, err
  429. }
  430. // GetCustomerNoCardByCustomer 获取我的卡
  431. func (m *CardDAO) GetCustomerNoCardByCustomer(customerid, orgid string) ([]model.TaCustomerCard, error) {
  432. var cards []model.TaCustomerCard
  433. sql := `select * from ta_customer_card where status>? and verify_date is null and customer_id=? and org_id=?`
  434. err := m.db.Sql(sql, models.STATUS_DEL, customerid, orgid).Find(&cards)
  435. if err != nil {
  436. return nil, err
  437. }
  438. return cards, nil
  439. }
  440. // GetCardChannel 获取卡对应渠道
  441. func (m *CardDAO) GetCardChannel(cardid string) (*model.TaCardCouponChannel, error) {
  442. var channels []model.TaCardCouponChannel
  443. err := m.db.Where("card_coupon_type=?", models.COURSE_COUPON_CARD).And("card_coupon_id=?", cardid).And("status=?", models.STATUS_NORMAL).Find(&channels)
  444. if err != nil {
  445. return nil, err
  446. }
  447. if len(channels) > 0 {
  448. return &channels[0], nil
  449. }
  450. return nil, nil
  451. }
  452. // DelCardChannel 删除卡对应渠道
  453. func (m *CardDAO) DelCardChannel(cardid string) error {
  454. sql := `delete from ta_card_coupon_channel where card_coupon_id=? and card_coupon_type=?`
  455. _, err := m.db.Exec(sql, cardid, models.COURSE_COUPON_CARD)
  456. return err
  457. }
  458. // SaveCardChannel 保存卡对应渠道
  459. func (m *CardDAO) SaveCardChannel(channelid, cardid string) error {
  460. var cardChannel = model.TaCardCouponChannel{
  461. CardCouponChannelId: utils.GetGUID(),
  462. CardCouponId: cardid,
  463. ChannelId: channelid,
  464. CardCouponType: models.COURSE_COUPON_CARD,
  465. Status: models.STATUS_NORMAL,
  466. }
  467. _, err := m.db.Insert(&cardChannel)
  468. return err
  469. }
  470. func (m *CardDAO) GetSysCardList(caseid string) ([]model.TaCouponCard, error) {
  471. var card []model.TaCouponCard
  472. sql := `SELECT
  473. *
  474. FROM
  475. ta_coupon_card
  476. WHERE
  477. send_type = '` + models.GIVE_TYPE_SYSTEM + `'
  478. and case_id = '` + caseid + `'
  479. and status > ` + strconv.Itoa(models.STATUS_DEL)
  480. err := m.db.Sql(sql).Find(&card)
  481. return card, err
  482. }