Product.go 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275
  1. package Basic
  2. import (
  3. "ERP_storage/conf"
  4. "ERP_storage/logs"
  5. "encoding/json"
  6. "errors"
  7. "fmt"
  8. "git.baozhida.cn/ERP_libs/lib"
  9. "github.com/astaxie/beego/cache"
  10. _ "github.com/astaxie/beego/cache/redis"
  11. "github.com/beego/beego/v2/adapter/orm"
  12. orm2 "github.com/beego/beego/v2/client/orm"
  13. _ "github.com/go-sql-driver/mysql"
  14. "strconv"
  15. "time"
  16. )
  17. // 仓库
  18. type Product struct {
  19. Id int `orm:"column(ID);size(11);auto;pk"`
  20. T_name string `orm:"size(256);null"` // 名称
  21. T_img string `orm:"size(256);null"` // 图片
  22. T_class int `orm:"size(20);default(0)"` // 产品分类 T_class=0 冷链验证
  23. T_model string `orm:"size(20);default(0)"` // 产品型号
  24. T_spec string `orm:"size(20);default(0)"` // 产品规格
  25. T_relation_sn int `orm:"size(2);default(0)"` // 关联sn 0-否 1-是
  26. T_State int `orm:"size(2);default(1)"` // 0 删除(伪删除) 1 正常
  27. T_remark string `orm:"type(text);null"` // 备注
  28. T_price float32 `orm:"digits(12);decimals(2)"` // 单价
  29. CreateTime time.Time `orm:"column(create_time);type(timestamp);null;auto_now_add"` //auto_now_add 第一次保存时才设置时间
  30. UpdateTime time.Time `orm:"column(update_time);type(timestamp);null;auto_now"` //auto_now 每次 model 保存时都会对时间自动更新
  31. }
  32. func (t *Product) TableName() string {
  33. return "product" // 数据库名称 // ************** 替换 FormulaList **************
  34. }
  35. var redisCache_Product cache.Cache
  36. func init() {
  37. //注册模型
  38. orm.RegisterModel(new(Product))
  39. config := fmt.Sprintf(`{"key":"%s","conn":"%s","dbNum":"%s","password":"%s"}`,
  40. "redis_Product", conf.Redis_address, conf.Redis_dbNum, conf.Redis_password)
  41. fmt.Println(config)
  42. var err error
  43. redisCache_Product, err = cache.NewCache("redis", config)
  44. if err != nil || redisCache_Product == nil {
  45. errMsg := "failed to init redis"
  46. logs.Error(errMsg, err)
  47. panic(errMsg)
  48. }
  49. }
  50. // ---------------- Redis -------------------
  51. func Redis_Product_Set(r Product) (err error) {
  52. //json序列化
  53. str, err := json.Marshal(r)
  54. if err != nil {
  55. logs.Error(lib.FuncName(), err)
  56. return
  57. }
  58. err = redisCache_Product.Put(strconv.Itoa(r.Id), str, 24*time.Hour)
  59. if err != nil {
  60. logs.Error("set key:", r.Id, ",value:", str, err)
  61. }
  62. return
  63. }
  64. func Redis_Product_Get(Id int) (r Product, err error) {
  65. key := strconv.Itoa(Id)
  66. if redisCache_Product.IsExist(key) {
  67. //println("找到key:",key)
  68. v := redisCache_Product.Get(key)
  69. err = json.Unmarshal(v.([]byte), &r)
  70. if err != nil {
  71. logs.Error(lib.FuncName(), err)
  72. return Product{}, err
  73. }
  74. return r, nil
  75. }
  76. return Product{}, errors.New("未找到")
  77. }
  78. func Redis_Product_DelK(Id int) (err error) {
  79. key := strconv.Itoa(Id)
  80. err = redisCache_Product.Delete(key)
  81. if err != nil {
  82. logs.Error(lib.FuncName(), err)
  83. return
  84. }
  85. return
  86. }
  87. type Product_R struct {
  88. Id int
  89. T_name string // 名称
  90. T_class int // 产品分类
  91. T_class_name string // 产品分类名称
  92. T_model string // 产品型号
  93. T_spec string // 产品规格
  94. T_price float32 // 单价
  95. T_relation_sn int // 关联sn 0-否 1-是
  96. T_img string // 图片
  97. T_remark string // 备注
  98. }
  99. func ProductToProduct_R(t Product) (r Product_R) {
  100. r.Id = t.Id
  101. r.T_name = t.T_name
  102. r.T_name = t.T_name
  103. r.T_class = t.T_class
  104. r.T_class_name = Read_ProductClass_Get(t.T_class)
  105. r.T_model = t.T_model
  106. r.T_spec = t.T_spec
  107. r.T_price = t.T_price
  108. r.T_relation_sn = t.T_relation_sn
  109. r.T_img = t.T_img
  110. r.T_remark = t.T_remark
  111. return r
  112. }
  113. // 添加
  114. func Add_Product(r Product) (id int64, err error) {
  115. o := orm.NewOrm()
  116. id, err = o.Insert(&r)
  117. if err != nil {
  118. logs.Error(lib.FuncName(), err)
  119. return id, err
  120. }
  121. Redis_Product_Set(r)
  122. return id, err
  123. }
  124. // 获取 ById
  125. func Read_Product_ById(Id int) (r Product, err error) {
  126. if r, err = Redis_Product_Get(Id); err == nil {
  127. return
  128. }
  129. o := orm.NewOrm()
  130. qs := o.QueryTable(new(Product))
  131. err = qs.Filter("Id", Id).One(&r)
  132. if err != nil {
  133. logs.Error(lib.FuncName(), err)
  134. return
  135. }
  136. Redis_Product_Set(r)
  137. return
  138. }
  139. func Read_Product_ByT_name(T_name, T_model, T_spec string) (r Product, err error) {
  140. o := orm.NewOrm()
  141. qs := o.QueryTable(new(Product))
  142. err = qs.Filter("T_name", T_name).Filter("T_model", T_model).Filter("T_spec", T_spec).Filter("T_class__gt", 0).One(&r)
  143. if err != nil {
  144. logs.Error(lib.FuncName(), err)
  145. return
  146. }
  147. return
  148. }
  149. // 修改
  150. func Update_Product(m Product, cols ...string) error {
  151. o := orm.NewOrm()
  152. _, err := o.Update(&m, cols...)
  153. if err != nil {
  154. logs.Error(lib.FuncName(), err)
  155. return err
  156. }
  157. Redis_Product_Set(m)
  158. return nil
  159. }
  160. // 删除
  161. func Delete_Product(v Product) error {
  162. o := orm.NewOrm()
  163. v.T_State = 0
  164. _, err := o.Update(&v, "T_State")
  165. if err != nil {
  166. logs.Error(lib.FuncName(), err)
  167. }
  168. return err
  169. }
  170. // 获取列表
  171. func Read_Product_List(T_name, T_model string, T_class, T_VerifyContract, page, page_z int) (r_ []Product_R, cnt int64) {
  172. o := orm.NewOrm()
  173. // 也可以直接使用 Model 结构体作为表名
  174. qs := o.QueryTable(new(Product))
  175. var offset int64
  176. if page <= 1 {
  177. offset = 0
  178. } else {
  179. offset = int64((page - 1) * page_z)
  180. }
  181. // 过滤
  182. cond := orm.NewCondition()
  183. cond1 := cond.And("T_State", 1)
  184. if T_VerifyContract == 1 {
  185. cond1 = cond1.And("T_class__lte", 0)
  186. } else {
  187. cond1 = cond1.And("T_class__gt", 0)
  188. }
  189. if T_class > 0 {
  190. cond1 = cond1.And("T_class", T_class)
  191. }
  192. if len(T_model) > 0 {
  193. cond1 = cond1.And("T_model__icontains", T_model)
  194. }
  195. if len(T_name) > 0 {
  196. cond1 = cond1.AndCond(cond.Or("T_name__icontains", T_name).Or("T_model__icontains", T_name))
  197. }
  198. // 查询
  199. var r []Product
  200. _, err := qs.Limit(page_z, offset).SetCond((*orm2.Condition)(cond1)).OrderBy("T_class", "-Id").All(&r)
  201. if err != nil {
  202. logs.Error(lib.FuncName(), err)
  203. return
  204. }
  205. cnt, err = qs.SetCond((*orm2.Condition)(cond1)).Count()
  206. if err != nil {
  207. logs.Error(lib.FuncName(), err)
  208. return
  209. }
  210. for _, v := range r {
  211. r_ = append(r_, ProductToProduct_R(v))
  212. }
  213. return r_, cnt
  214. }
  215. // 获取产品型号
  216. func Read_ProductModel_List(T_name string) (lists orm2.ParamsList) {
  217. o := orm.NewOrm()
  218. var pl_lists orm2.ParamsList
  219. _, err := o.Raw("SELECT t_model FROM product WHERE t_class > 0 AND t_name = '" + T_name + "' LIMIT 0,1000").ValuesFlat(&pl_lists)
  220. if err != nil {
  221. logs.Error(lib.FuncName(), err)
  222. return
  223. }
  224. return pl_lists
  225. }
  226. // 获取产品名称
  227. func Read_ProductName_List(T_name string, T_class int) (lists orm2.ParamsList) {
  228. o := orm.NewOrm()
  229. var pl_lists orm2.ParamsList
  230. sql := "SELECT DISTINCT t_name FROM product WHERE t_class > 0 AND t_name like '%" + T_name + "%'"
  231. if T_class > 0 {
  232. sql += " AND T_class = " + strconv.Itoa(T_class)
  233. }
  234. sql += " LIMIT 0,1000"
  235. _, err := o.Raw(sql).ValuesFlat(&pl_lists)
  236. if err != nil {
  237. logs.Error(lib.FuncName(), err)
  238. return
  239. }
  240. return pl_lists
  241. }