goods.go 7.7KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335
  1. package goods
  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/yl10/kit/guid"
  11. "github.com/go-xorm/xorm"
  12. )
  13. // GoodsDAO 当前数据库操作对象
  14. type GoodsDAO struct {
  15. ctx *utils.Context
  16. db *xorm.Session
  17. }
  18. // NewGoodsDAO New Inst
  19. func NewGoodsDAO(ctx *utils.Context) *GoodsDAO {
  20. return &GoodsDAO{
  21. ctx: ctx,
  22. db: ctx.DB,
  23. }
  24. }
  25. // GetGoodsListPageNavi 获取商品列表
  26. // 管理端接口
  27. func (m *GoodsDAO) GetGoodsListPageNavi(name, typeID, caseID string, limit []int) ([]GoodsWithSpec, int64, error) {
  28. sql := `
  29. SELECT *
  30. FROM
  31. ta_goods
  32. WHERE
  33. case_id in ('` + strings.Replace(caseID, ",", "','", -1) + `')
  34. `
  35. if name != "" {
  36. sql += `
  37. AND goods_name LIKE '%` + name + `%'
  38. `
  39. }
  40. if typeID != "" {
  41. sql += `
  42. AND type_id = '` + typeID + `'
  43. `
  44. }
  45. sql += `
  46. AND status > ` + strconv.Itoa(models.STATUS_DEL) + `
  47. ORDER BY
  48. create_date desc
  49. `
  50. // sql += ` limit ` + strconv.Itoa(limit[0]) + ` OFFSET ` + strconv.Itoa(limit[1])
  51. var goodsList []GoodsWithSpec
  52. cnt, err := utils.NewPageNaviEngine(m.ctx).GetPageList(&goodsList, sql, limit)
  53. if err != nil {
  54. return nil, 0, err
  55. }
  56. for inx, goods := range goodsList {
  57. specs, err := m.GetSpecWithPrice(goods.GoodsId)
  58. if err != nil {
  59. return nil, 0, err
  60. }
  61. goodsList[inx].Specs = specs
  62. imgs, err := m.GetGoodsImgByGoodsID(goods.GoodsId)
  63. if err != nil {
  64. return nil, 0, err
  65. }
  66. goodsList[inx].Images = imgs
  67. }
  68. return goodsList, cnt, nil
  69. }
  70. // GetGoodsListOfCase 获取案场商品列表
  71. // 微信端 暂时没涉及分页
  72. func (m *GoodsDAO) GetGoodsListOfCase(caseID string) ([]GoodsWithSpec, error) {
  73. var goodsList []GoodsWithSpec
  74. sql := "select * from ta_goods where case_id = ? and status = ? order by type_id, create_date"
  75. if err := m.db.SQL(sql, caseID, models.STATUS_NORMAL).Find(&goodsList); err != nil {
  76. return nil, err
  77. }
  78. for inx, goods := range goodsList {
  79. imgs, err := m.GetGoodsImgByGoodsID(goods.GoodsId)
  80. if err != nil {
  81. return nil, err
  82. }
  83. goodsList[inx].Images = imgs
  84. specs, err := m.GetSpecWithPrice(goods.GoodsId)
  85. if err != nil {
  86. return nil, err
  87. }
  88. goodsList[inx].Specs = specs
  89. }
  90. return goodsList, nil
  91. }
  92. // GetSpecWithPrice 获取商品规格 含 金额
  93. func (m *GoodsDAO) GetSpecWithPrice(goodsID string) ([]SpecWithPrice, error) {
  94. sql := `SELECT t.*,s.goods_price FROM td_spec t
  95. JOIN ta_goods_spec s ON t.spec_id = s.spec_id
  96. WHERE t.status > ? AND s.goods_id = ?
  97. `
  98. var specs []SpecWithPrice
  99. err := m.db.SQL(sql, models.STATUS_DEL, goodsID).Find(&specs)
  100. return specs, err
  101. }
  102. // GetGoodsByID 依据ID 获取商品
  103. func (m *GoodsDAO) GetGoodsByID(id string) (*model.TaGoods, error) {
  104. goods := new(model.TaGoods)
  105. if _, err := m.db.Where("goods_id=?", id).Get(goods); err != nil {
  106. return nil, err
  107. }
  108. return goods, nil
  109. }
  110. // GetGoodsWithPriceByID 依据ID 获取商品
  111. func (m *GoodsDAO) GetGoodsWithPriceByID(id, spec, caseID string) (*GoodsWithPrice, error) {
  112. goods := new(GoodsWithPrice)
  113. query := `
  114. SELECT *
  115. FROM
  116. ta_goods t
  117. JOIN ta_goods_spec s ON t.goods_id = s.goods_id
  118. WHERE
  119. t.goods_id = ?
  120. AND t.case_id = ?
  121. AND s.spec_id = ?
  122. AND t.status = ?
  123. `
  124. if _, err := m.db.SQL(query, id, caseID, spec, models.STATUS_NORMAL).Get(goods); err != nil {
  125. return nil, err
  126. }
  127. return goods, nil
  128. }
  129. // GetGoodsWithSpecByID 依据ID 获取商品(含规格)
  130. func (m *GoodsDAO) GetGoodsWithSpecByID(id string) (*GoodsWithSpec, error) {
  131. goods := new(model.TaGoods)
  132. if _, err := m.db.Where("goods_id=?", id).Get(goods); err != nil {
  133. return nil, err
  134. }
  135. var specs []SpecWithPrice
  136. query := `
  137. SELECT
  138. t.*, s.goods_price
  139. FROM
  140. td_spec t
  141. JOIN ta_goods_spec s ON t.spec_id = s.spec_id
  142. WHERE
  143. s.goods_id = ?
  144. `
  145. if err := m.db.SQL(query, id).Find(&specs); err != nil {
  146. return nil, err
  147. }
  148. imgs, err := m.GetGoodsImgByGoodsID(id)
  149. if err != nil {
  150. return nil, err
  151. }
  152. return &GoodsWithSpec{
  153. TaGoods: *goods,
  154. Specs: specs,
  155. Images: imgs,
  156. }, nil
  157. }
  158. // SaveGoods 保存商品
  159. func (m *GoodsDAO) SaveGoods(goods *model.TaGoods, images []string, specs []SpecWithPrice) error {
  160. userRaw := m.ctx.Get("user")
  161. if userRaw == nil {
  162. return errors.New("登录异常, 请登出重试")
  163. }
  164. user := userRaw.(model.SysUser)
  165. goods.GoodsId = guid.NewGUIDString()
  166. goods.Status = models.STATUS_NORMAL
  167. goods.CreateDate = time.Now().Local()
  168. goods.CreateUser = user.UserId
  169. goods.OrgId = user.OrgId
  170. // 商品图片
  171. if images != nil && len(images) > 0 {
  172. goodsImages := make([]model.TaGoodsImg, 0)
  173. for _, img := range images {
  174. goodsImages = append(goodsImages, model.TaGoodsImg{
  175. ImgId: guid.NewGUIDString(),
  176. GoodsId: goods.GoodsId,
  177. ImgUrl: img,
  178. Status: models.STATUS_NORMAL,
  179. })
  180. }
  181. if _, err := m.db.Insert(&goodsImages); err != nil {
  182. return err
  183. }
  184. }
  185. // 规格
  186. if specs != nil && len(specs) > 0 {
  187. goodsSpecs := make([]model.TaGoodsSpec, 0)
  188. for _, spec := range specs {
  189. goodsSpecs = append(goodsSpecs, model.TaGoodsSpec{
  190. SpecId: spec.SpecId,
  191. GoodsId: goods.GoodsId,
  192. GoodsPrice: spec.GoodsPrice,
  193. })
  194. }
  195. if _, err := m.db.Insert(&goodsSpecs); err != nil {
  196. return err
  197. }
  198. }
  199. if _, err := m.db.Insert(goods); err != nil {
  200. return err
  201. }
  202. return nil
  203. }
  204. // UpdateGoods 更新商品
  205. func (m *GoodsDAO) UpdateGoods(goods *model.TaGoods, images []string, specs []SpecWithPrice) error {
  206. cols := []string{
  207. "goods_name",
  208. "type_id",
  209. "status",
  210. "price",
  211. "case_id",
  212. }
  213. // 先清除旧数据
  214. if _, err := m.db.Delete(&model.TaGoodsImg{GoodsId: goods.GoodsId}); err != nil {
  215. return err
  216. }
  217. // 商品图片
  218. if images != nil && len(images) > 0 {
  219. goodsImages := make([]model.TaGoodsImg, 0)
  220. for _, img := range images {
  221. goodsImages = append(goodsImages, model.TaGoodsImg{
  222. ImgId: guid.NewGUIDString(),
  223. GoodsId: goods.GoodsId,
  224. ImgUrl: img,
  225. Status: models.STATUS_NORMAL,
  226. })
  227. }
  228. if _, err := m.db.Insert(&goodsImages); err != nil {
  229. return err
  230. }
  231. }
  232. // 先清除旧数据
  233. if _, err := m.db.Delete(&model.TaGoodsSpec{GoodsId: goods.GoodsId}); err != nil {
  234. return err
  235. }
  236. // 规格
  237. if specs != nil && len(specs) > 0 {
  238. goodsSpecs := make([]model.TaGoodsSpec, 0)
  239. for _, spec := range specs {
  240. goodsSpecs = append(goodsSpecs, model.TaGoodsSpec{
  241. SpecId: spec.SpecId,
  242. GoodsId: goods.GoodsId,
  243. GoodsPrice: spec.GoodsPrice,
  244. })
  245. }
  246. if _, err := m.db.Insert(&goodsSpecs); err != nil {
  247. return err
  248. }
  249. }
  250. if _, err := m.db.Where("goods_id=?", goods.GoodsId).Cols(cols...).Update(goods); err != nil {
  251. return err
  252. }
  253. return nil
  254. }
  255. // DeleteGoods 删除商品
  256. func (m *GoodsDAO) DeleteGoods(id string) error {
  257. goods := new(model.TaGoods)
  258. goods.Status = models.STATUS_DEL
  259. if _, err := m.db.Where("goods_id=?", id).Cols("status").Update(goods); err != nil {
  260. return err
  261. }
  262. return nil
  263. }
  264. // GetGoodsImgByGoodsID 根据商品ID获取商品图片信息
  265. func (m *GoodsDAO) GetGoodsImgByGoodsID(goodsid string) ([]model.TaGoodsImg, error) {
  266. var goodsimg []model.TaGoodsImg
  267. err := m.db.Where("goods_id=?", goodsid).Find(&goodsimg)
  268. return goodsimg, err
  269. }
  270. // GetGoodsBySpec 根据商品规格获取商品信息
  271. func (m *GoodsDAO) GetGoodsBySpec(specid string) ([]model.TaGoods, error) {
  272. var goods []model.TaGoods
  273. sql := `select a.* from ta_goods a inner join ta_goods_spec b on a.goods_id=b.goods_id where a.status>` + strconv.Itoa(models.STATUS_DEL) + ` and b.spec_id='` + specid + `'`
  274. err := m.db.Sql(sql).Find(&goods)
  275. return goods, err
  276. }
  277. // GetGoodsByType 根据商品类型获取商品信息
  278. func (m *GoodsDAO) GetGoodsByType(typeid string) ([]model.TaGoods, error) {
  279. var goods []model.TaGoods
  280. err := m.db.Where("status>"+strconv.Itoa(models.STATUS_DEL)).And("type_id=?", typeid).Find(&goods)
  281. return goods, err
  282. }