Commit b02d98af by wang

暂存一下

parent bfdb8c21
......@@ -16,3 +16,9 @@ SEARCH_API_MONITOR = 6d0fa85e01a02c39347d011ae973fd21b76c6c7ce582d3ea470c6b65a31
[spu_server]
;api_domain = http://192.168.2.72:8005
api_domain = http://localhost:8005
[save_zy_config]
supplier_rule = {"10000_2":{"price":{"is_ladder":true,"ratio":1.13},"supplier_stock":{"ratio":0.78},"fill_field":{"encoded":"10142"}},"10000_3":{"price":{"is_ladder":false,"ratio":1.13,"ladder_ratio":1.13},"supplier_stock":{"ratio":1},"fill_field":{"encoded":"10011"}},"10000_4":{"price":{"is_ladder":true,"ratio":1.15,"ladder_ratio":1},"supplier_stock":{"ratio":1},"fill_field":{"encoded":"10142"}}}
pack_rule = {"编带":{"packing":5,"pick_type":1},"袋装":{"packing":6,"pick_type":3},"包":{"packing":6,"pick_type":3},"管装":{"packing":8,"pick_type":3},"管":{"packing":8,"pick_type":3},"盒装":{"packing":7,"pick_type":3},"盒":{"packing":7,"pick_type":3},"托盘":{"packing":9,"pick_type":3},"盘":{"packing":5,"pick_type":1},"大盘":{"packing":5,"pick_type":1}}
goods_unit = {"个":1,"米":2}
sku_name = {"class_id2":["custom1",-1,"分类名称",2],"brand_id":["custom2",252,"制造商",1],"encap":["custom3",253,"封装",1],"goods_name":["custom4",255,"商品型号",2],"packing":["custom5",254,"包装/方式",2]}
;存放数据库连接信息
[xorm]
ShowSQL = false
ShowSQL = true
[spu]
user_name = spu
......
; 比如 sku_save,5000 路径 sku_save 即文件夹是 sku 文件名类似 是save_2020-12-10.log,5000代表队列的容量为5000
[log_config]
1=lysku_save,5000
2=sku_query,5000
3=default_sku,5000
2=zysku_save,5000
3=sku_query,5000
4=default_sku,5000
......@@ -6,6 +6,7 @@ import (
"go_sku_server/framework/gin_"
"go_sku_server/pkg/common"
"go_sku_server/pkg/config"
"go_sku_server/pkg/e"
"net/http"
)
......@@ -52,8 +53,13 @@ func Error_Middleware() gin.HandlerFunc {
return func(ctx *gin.Context) {
defer func() {
if err:=recover(); err!=nil{
errMsg:=fmt.Sprintf("%s",err)
common.NResponse(errMsg).SetLogHandel(saveLogHandle).OutPut(ctx)
if apiError,ok:=err.(*e.ApiError);ok{
fmt.Println(apiError.ErrMsg)
common.NResponse(apiError.ErrMsg,apiError.Code).SetLogHandel(saveLogHandle).OutPut(ctx)
}else{
errMsg:=fmt.Sprintf("%s",err)
common.NResponse(errMsg,500).SetLogHandel(saveLogHandle).OutPut(ctx)
}
}
}()
ctx.Next()
......
......@@ -75,7 +75,6 @@ func SaveZySku(ctx *gin.Context) {
common.NResponse(err.Error()).SetLogHandel(saveLogHandle).OutPut(ctx)
return
}
zySave:=service.ZySaveService{}
serviceErr:=zySave.SaveZySku(zySaveRequest,ctx)
//错误处理
......
#### 说明
此dao层目前只有 新增自营sku的接口在使用
\ No newline at end of file
package dao
import (
"encoding/json"
"fmt"
"github.com/gogf/gf/util/gconv"
"github.com/gomodule/redigo/redis"
"github.com/tidwall/gjson"
"go_sku_server/model"
"go_sku_server/pkg/gredis"
"go_sku_server/pkg/mysql"
)
/*
@author wangsong
@desc 封装单纯的自营品牌 增删改查
*/
/**
查询BrandId,查询自营品牌映射(根据 supplier_id self_supplier_type self_supplier_id)
@param supplier_id 供应商ID
@param self_supplier_type 自采标记
@param self_supplier_id 自采供应商唯一商品ID(采集那边的id)
*/
func GetBrandMappingId(supplierId int, selfSupplierType int, supplierBrandId int) (err error,brandId int64) {
redisReadConn := gredis.Conn("search_r")
defer redisReadConn.Close()
gconv.String(supplierId)
brandKey:=gconv.String(supplierId)+"_"+gconv.String(selfSupplierType)+"_"+gconv.String(supplierBrandId)
fmt.Print(brandKey)
brandJsonStr,err:=redis.String(redisReadConn.Do("Hget","Self_supplier_brand_mapping",brandKey))
if(err!=nil ){
if(err==redis.ErrNil){
return nil,0
}
return fmt.Errorf("method:GetBrandMapping"+err.Error()),0
}
return nil,gjson.Get(brandJsonStr,"brand_id").Int()
}
func GetRedisBrand(brandId int) (string,error){
redisReadConn := gredis.Conn("search_r")
defer redisReadConn.Close()
brandJsonStr,err:=redis.String(redisReadConn.Do("Hget","Self_Brand",brandId))
if(err!=nil ){
if(err==redis.ErrNil){
return "",nil
}
return "",fmt.Errorf("method:GetBrandMapping"+err.Error())
}
return brandJsonStr,nil
}
//获取品牌mysq
func GetDbBrand(brandId int) (brandModel *model.ZyBrand,err error){
dbSpu:= mysql.Conn("liexin_data") //spu实例化链接
brandModel.BrandId=brandId
_,err=dbSpu.Table("lie_brand").Get(brandModel)
if(err!=nil){
return brandModel,fmt.Errorf("method:GetDbBrand,"+err.Error())
}
return
}
//插入品牌到redis
func InSertRedisBrand(brandModel model.ZyBrand ) error{
redisWriteConn := gredis.Conn("search_w")
defer redisWriteConn.Close()
byte,err:=json.Marshal(brandModel)
if(err!=nil){
return fmt.Errorf("method:InSertRedisBrand,"+err.Error())
}
_,err=redisWriteConn.Do("HSET","Self_Brand",brandModel.BrandId,string(byte))
return err
}
\ No newline at end of file
package dao
import (
"fmt"
"github.com/gogf/gf/util/gconv"
"github.com/gomodule/redigo/redis"
"go_sku_server/model"
"go_sku_server/pkg/gredis"
"go_sku_server/pkg/mysql"
)
/**
获取分类映射
*/
func GetClassMapping(supplierId int, selfSupplierType int, supplierClassId int) (classJsonStr string) {
redisReadConn := gredis.Conn("search_r")
defer redisReadConn.Close()
gconv.String(supplierId)
classKey:=gconv.String(supplierId)+"_"+gconv.String(selfSupplierType)+"_"+gconv.String(supplierClassId)
fmt.Print(classKey)
classJsonStr,err:=redis.String(redisReadConn.Do("Hget","Self_supplier_class_mapping",classKey))
if(err!=nil ){
if(err==redis.ErrNil){
return ""
}
panic("method:GetClassMapping"+err.Error())
}
return
}
/**
获取分类税务详情(获取根据 税务分类编码获取税务分类详情)
*/
func GetFinancialClassInfo(classifySn string) (zyFinancialClassify model.ZyFinancialClassify,err error){
dbSpu:= mysql.Conn("liexin_data") //spu实例化链接
whereStr:="classify_sn =?"
_,err= dbSpu.Table("lie_self_financial_classify").Where(whereStr,classifySn).Get(&zyFinancialClassify)
if(err!=nil){
return zyFinancialClassify,fmt.Errorf("method:GetFinancialClassInfo,"+err.Error())
}
return
}
/**
获取分类信息
*/
func GetClassInfo(classId int) (zyClassify *model.ZyClassify,err error) {
dbSpu:= mysql.Conn("liexin_data") //spu实例化链接
zyClassify=&model.ZyClassify{}
zyClassify.ClassId=classId
_,err= dbSpu.Table("lie_self_classify").Get(zyClassify)
if(err!=nil){
return zyClassify,fmt.Errorf("method:GetClassInfo,"+err.Error())
}
return
}
package dao
import (
"encoding/json"
"fmt"
"go_sku_server/model"
"go_sku_server/pkg/gredis"
"go_sku_server/pkg/mysql"
)
/*
@author wangsong
@desc 封装单纯的自营商品 增删改查
*/
/**
获取商品ID查询自营商品信息
@param goodsId int 商品id
*/
func GetZyGoodSInfoById(goodsId int) {
}
/**
查询自营商品信息(根据 supplier_id self_supplier_type self_supplier_id)
@param supplier_id 供应商ID
@param self_supplier_type 自采标记
@param self_supplier_id 自采供应商唯一商品ID(采集那边的id)
*/
func GetZyGoodSInfoByCollect(supplierId int ,selfSupplierType int,selfSupplierId string) (zySkuEntity model.ZySkuEntity,err error) {
dbSpu:= mysql.Conn("liexin_data") //spu实例化链接
zySkuEntity.SupplierId=supplierId
zySkuEntity.SelfSupplierType=selfSupplierType
zySkuEntity.SelfSupplierId=selfSupplierId
_,err= dbSpu.Table("lie_goods").Get(&zySkuEntity)
if(err!=nil){
return zySkuEntity,fmt.Errorf("method:GetZyGoodSInfoByCollect,"+err.Error())
}
return
}
/**
获取相似商品
@param self_supplier_type 自采标记
@param brandId 品牌Id
*/
func GetSimilarGoods(selfSupplierType int,brandId int64) (zySkuEntity []model.ZySkuEntity,err error) {
dbSpu:= mysql.Conn("liexin_data") //spu实例化链接
zySkuEntityS := make([]model.ZySkuEntity, 0)
whereStr:="self_supplier_type =? and self_supplier_id ='' and brand_id=?"
err= dbSpu.Table("lie_goods").Where(whereStr,selfSupplierType,brandId).Find(&zySkuEntityS)
if(err!=nil){
return zySkuEntity,fmt.Errorf("method:GetSimilarGoods,"+err.Error())
}
return
}
//插入自营sku到redis
func InsertDbGoods(zySkuEntity model.ZySkuEntity) (affected int64, err error) {
db:= mysql.Conn("liexin_data") //spu实例化链接
return db.Table("lie_goods").Where("goods_id=?",zySkuEntity.GoodsId).Update(zySkuEntity)
}
//插入自营sku到mysql
func InsertRedisGoods(zySkuEntity model.ZySkuEntity) error {
redisWriteConn := gredis.Conn("search_w")
defer redisWriteConn.Close()
byte,err:=json.Marshal(zySkuEntity)
if(err!=nil){
return fmt.Errorf("method:InsertDbGoods,"+err.Error())
}
_,err=redisWriteConn.Do("HSET","Self_SelfGoods",zySkuEntity.GoodsId,string(byte))
return err
}
package dao
import (
"fmt"
"github.com/gomodule/redigo/redis"
"go_sku_server/pkg/gredis"
)
func GetRedisUnit(key int) (err error,packingCn string){
redisReadConn := gredis.Conn("search_r")
defer redisReadConn.Close()
packingCn,err=redis.String(redisReadConn.Do("HGET","Self_Unit",key))
if(err!=nil ){
if(err==redis.ErrNil){
return nil,packingCn
}
return fmt.Errorf("method:GetRedisUnit"+err.Error()),packingCn
}
return
}
\ No newline at end of file
### redis Self_supplier_brand_mapping
```json
"supplier_id":"10000","self_supplier_type":"4","supplier_brand_name":"\u4e1c\u9ad8\u5fd7(TOCOS)","supplier_brand_id":"98","brand_id":"4707","brand_name":"TOCOS(\u4e1c\u9ad8\u5fd7)","add_time":1592202603,"update_time":1592209621,"id":61}"
2) "{"supplier_id":"10000","self_supplier_type":"2","supplier_brand_name":"YAGEO","supplier_brand_id":"442","brand_id":"5148","brand_name":"YAGEO(\u56fd\u5de8)","add_time":1585037042,"update_time":1585037042,"id":12}"
3) "{"supplier_id":"10000","self_supplier_type":"4","supplier_brand_name":"\u661f\u6d77\u7535\u5b50","supplier_brand_id":"61","brand_id":"5291","brand_name":"STARSEA(\u661f\u6d77)","add_time":1592202603,"update_time":1592209621,"id":24}"
4) "{"supplier_id":"10000","self_supplier_type":"4","supplier_brand_name":"\u77fd\u529b\u6770(Silicon)","supplier_brand_id":"83","brand_id":"4248","brand_name":"Silergy(\u77fd\u529b\u6770)","add_time":1592202603,"update_time":1592209621,"id":46}"
5) "{"supplier_id":"10000","self_supplier_type":"4","supplier_brand_name":"\u987a\u7edc(Sunlord)","supplier_brand_id":"54","brand_id":"4208","brand_name":"Sunlord(\u987a\u7edc)","add_time":1592202603,"update_time":1592209620,"id":17}"
6) "{"supplier_id":"10000","self_supplier_type":"4","supplier_brand_name":"\u56fd\u661f\u5149\u7535","supplier_brand_id":"69","brand_id":"17","brand_name":"Nationstar(\u56fd\u661f\u5149\u7535)","add_time":1592202603,"update_time":1592209621,"id":32}"
7) "{"supplier_id":"10000","self_supplier_type":"3","supplier_brand_name":"3M","supplier_brand_id":"2","brand_id":"30","brand_name":"3M","add_time":1585031844,"update_time":1585117120,"id":3}"
8) "{"supplier_id":"10000","self_supplier_type":"4","supplier_brand_name":"\u610f\u6cd5\u534a\u5bfc\u4f53(ST)","supplier_brand_id":"76","brand_id":"21","brand_name":"ST(\u610f\u6cd5)","add_time":1592202603,"update_time":1592209621,"id":39}"
9) "{"supplier_id":"10000","self_supplier_type":"4","supplier_brand_name":"\u57fa\u7f8e(KEMET)","supplier_brand_id":"122","brand_id":"5347","brand_name":"KEMET(\u57fa\u7f8e)","add_time":1592202604,"update_time":1592209622,"id":85}"
10) "{"supplier_id":"10000","self_supplier_type":"3","supplier_brand_name":"0N","supplier_brand_id":"1","brand_id":"27","brand_name":"ON","add_time":1585031844,"update_time":1585117120,"id":2}"
11) "{"supplier_id":"10000","self_supplier_type":"4","supplier_brand_name":"\u5b89\u68ee\u7f8e(ON)","supplier_brand_id":"89","brand_id":"266","brand_name":"ON(\u5b89\u68ee\u7f8e)","add_time":1592202603,"update_time":1592209621,"id":52}"
12) "{"supplier_id":"10000","self_supplier_type":"4","supplier_brand_name":"\u957f\u7535(JCET)","supplier_brand_id":"62","brand_id":"985","brand_name":"CJ(\u957f\u7535)","add_time":1592202603,"update_time":1592209621,"id":25}"
13) "{"supplier_id":"10000","self_supplier_type":"4","supplier_brand_name":"\u7acb\u9686(Lelon)","supplier_brand_id":"85","brand_id":"2724","brand_name":"LELON(\u7acb\u9686)","add_time":1592202603,"update_time":1592209621,"id":48}"
14) "{"supplier_id":"10000","self_supplier_type":"4","supplier_brand_name":"\u539a\u58f0(ROYALOHM)","supplier_brand_id":"118","brand_id":"4857","brand_name":"UniOhm(\u539a\u58f0)","add_time":1592202604,"update_time":1592209621,"id":81}"
15) "{"supplier_id":"10000","self_supplier_type":"4","supplier_brand_name":"\u4e2d\u535a(ZHONGB)","supplier_brand_id":"100","brand_id":"5893","brand_name":"ZHONGB(\u4e2d\u535a)","add_time":1592202603,"update_time":1592209621,"id":63}"
16) "{"supplier_id":"10000","self_supplier_type":"4","supplier_brand_name":"\u65f6\u6052(SHIHENG)","supplier_brand_id":"92","brand_id":"5337","brand_name":"SHIHENG(\u65f6\u6052)","add_time":1592202603,"update_time":1592209621,"id":55}"
17) "{"supplier_id":"10000","self_supplier_type":"4","supplier_brand_name":"\u4e09\u661f(Samsung)","supplier_brand_id":"59","brand_id":"4076","brand_name":"SAMSUNG(\u4e09\u661f)","add_time":1592202603,"update_time":1592209620,"id":22}"
18) "{"supplier_id":"10000","self_supplier_type":"4","supplier_brand_name":"\u5b87\u9633(EYANG)","supplier_brand_id":"134","brand_id":"1753","brand_name":"EYANG(\u5b87\u9633)","add_time":1592202604,"update_time":1592209622,"id":97}"
{"supplier_id":"10000","self_supplier_type":"4","supplier_brand_name":"\u7cbe\u62d3\u91d1(JTJ)","supplier_brand_id":"119","brand_id":"5573","brand_name":"JTJ(\u7cbe\u62d3\u91d1)","add_time":1592202604,"update_time":1592209621,"id":82}"
{"supplier_id":"10000","self_supplier_type":"4","supplier_brand_name":"\u67cf\u6069\u65af(BOURNS)","supplier_brand_id":"97","brand_id":"703","brand_name":"BOURNS(\u4f2f\u6069\u65af)","add_time":1592202603,"update_time":1592209621,"id":60}"
{"supplier_id":"10000","self_supplier_type":"3","supplier_brand_name":"MURATA","supplier_brand_id":"264","brand_id":"3249","brand_name":"muRata(\u6751\u7530)","add_time":1585117120,"update_time":1585117120,"id":13}"
1) "60"
2) 1) "10000_4_113"
2) "{"supplier_id":"10000","self_supplier_type":"4","supplier_brand_name":"KEC","supplier_brand_id":"113","brand_id":"2636","brand_name":"KEC(\u5f00\u76ca\u79a7)","add_time":1592202604,"update_time":1592209621,"id":76}"
3) "10000_4_94"
4) "{"supplier_id":"10000","self_supplier_type":"4","supplier_brand_name":"\u5b8f\u53d1(HONGFA)","supplier_brand_id":"94","brand_id":"2119","brand_name":"HF(\u5b8f\u53d1)","add_time":1592202603,"update_time":1592209621,"id":57}"
5) "10000_2_264"
6) "{"supplier_id":"10000","self_supplier_type":"2","supplier_brand_name":"MURATA","supplier_brand_id":"264","brand_id":"3249","brand_name":"muRata(\u6751\u7530)","add_time":1585037042,"update_time":1585037042,"id":11}"
7) "10000_4_132"
8) "{"supplier_id":"10000","self_supplier_type":"4","supplier_brand_name":"\u6842\u5fae(GSME)","supplier_brand_id":"132","brand_id":"5899","brand_name":"GSME(\u6842\u5fae)","add_time":1592202604,"update_time":1592209622,"id":95}"
9) "10000_2_1"
10) "{"supplier_id":"10000","self_supplier_type":"2","supplier_brand_name":"0N","supplier_brand_id":"1","brand_id":"27","brand_name":"ON","add_time":1585037042,"update_time":1585037042,"id":7}"
11) "10000_3_1"
12) "{"supplier_id":"10000","self_supplier_type":"3","supplier_brand_name":"0N","supplier_brand_id":"1","brand_id":"27","brand_name":"ON","add_time":1585031844,"update_time":1585117120,"id":2}"
13) "10000_4_89"
14) "{"supplier_id":"10000","self_supplier_type":"4","supplier_brand_name":"\u5b89\u68ee\u7f8e(ON)","supplier_brand_id":"89","brand_id":"266","brand_name":"ON(\u5b89\u68ee\u7f8e)","add_time":1592202603,"update_time":1592209621,"id":52}"
15) "10000_4_95"
16) "{"supplier_id":"10000","self_supplier_type":"4","supplier_brand_name":"\u5317\u9646\u7535\u6c14(HDK)","supplier_brand_id":"95","brand_id":"5329","brand_name":"HDK(\u5317\u9646\u7535\u6c14)","add_time":1592202603,"update_time":1592209621,"id":58}"
17) "10000_4_79"
18) "{"supplier_id":"10000","self_supplier_type":"4","supplier_brand_name":"\u6676\u4e30\u660e\u6e90(BPS)","supplier_brand_id":"79","brand_id":"5297","brand_name":"BPS(\u6676\u4e30\u660e\u6e90)","add_time":1592202603,"update_time":1592209621,"id":42}"
19) "10000_4_110"
20) "{"supplier_id":"10000","self_supplier_type":"4","supplier_brand_name":"\u4e2d\u7acb(zlfy)","supplier_brand_id":"110","brand_id":"5541","brand_name":"zlfy(\u4e2d\u7acb)","add_time":1592202603,"update_time":1592209621,"id":73}"
```
redis Self_supplier_class_mapping
```json
1) "70"
2) 1) "10000_4_1027"
2) "{"supplier_id":"10000","self_supplier_type":"4","supplier_class_name":"\u5171\u6a21\u7535\u611f","supplier_class_id":"1027","class_id":"10243","class_name":"\u5171\u6a21\u627c\u6d41\u5708","parent_id":10242,"financial_classify_id":"","add_time":1592199826,"update_time":1592214605,"id":75}"
3) "10000_4_993"
4) "{"supplier_id":"10000","self_supplier_type":"4","supplier_class_name":"DC-DC\u82af\u7247","supplier_class_id":"993","class_id":"10056","class_name":"74\u7cfb\u5217\u903b\u8f91\u82af\u7247","parent_id":10051,"financial_classify_id":"","add_time":1592209319,"update_time":1592214605,"id":162}"
5) "10000_4_985"
6) "{"supplier_id":"10000","self_supplier_type":"4","supplier_class_name":"\u76f4\u63d2\u5149\u7535\u5f00\u5173","supplier_class_id":"985","class_id":"10216","class_name":"\u5149\u7535\u5f00\u5173","parent_id":10212,"financial_classify_id":"","add_time":1592199826,"update_time":1592214605,"id":40}"
7) "10000_4_1116"
8) "{"supplier_id":"10000","self_supplier_type":"4","supplier_class_name":"1.25\u8fde\u63a5\u5668","supplier_class_id":"1116","class_id":"10321","class_name":"\u8fde\u63a5\u5668","parent_id":10045,"financial_classify_id":"","add_time":1592199828,"update_time":1592214607,"id":144}"
9) "10000_4_977"
10) "{"supplier_id":"10000","self_supplier_type":"4","supplier_class_name":"\u8d34\u7247\u6709\u6e90\u6676\u632f","supplier_class_id":"977","class_id":"10226","class_name":"\u8d34\u7247\u6709\u6e90\u6676\u632f","parent_id":10222,"financial_classify_id":"","add_time":1592199826,"update_time":1592214605,"id":35}"
11) "10000_4_961"
12) "{"supplier_id":"10000","self_supplier_type":"4","supplier_class_name":"\u4e09\u6781\u7ba1(\u6676\u4f53\u7ba1)","supplier_class_id":"961","class_id":"10233","class_name":"\u6676\u4f53\u7ba1","parent_id":10229,"financial_classify_id":"","add_time":1592199825,"update_time":1592214605,"id":24}"
13) "10000_4_1063"
14) "{"supplier_id":"10000","self_supplier_type":"4","supplier_class_name":"\u8096\u7279\u57fa\u6865","supplier_class_id":"1063","class_id":"10149","class_name":"\u6574\u6d41\u6865","parent_id":10142,"financial_classify_id":"","add_time":1592199827,"update_time":1592214606,"id":99}"
15) "10000_4_1082"
16) "{"supplier_id":"10000","self_supplier_type":"4","supplier_class_name":"\u5e26\u706f\u5f00\u5173","supplier_class_id":"1082","class_id":"10263","class_name":"\u5e26\u706f\u5f00\u5173","parent_id":10262,"financial_classify_id":"","add_time":1592199827,"update_time":1592214606,"id":114}"
17) "10000_4_1095"
18) "{"supplier_id":"10000","self_supplier_type":"4","supplier_class_name":"HDMI_USB\u8fde\u63a5\u5668","supplier_class_id":"1095","class_id":"10307","class_name":"USB Type-C\u8fde\u63a5\u5668","parent_id":10276,"financial_classify_id":"","add_time":1592209320,"update_time":1592214606,"id":172}"
19) "10000_4_1118"
20) "{"supplier_id":"10000","self_supplier_type":"4","supplier_class_name":"\u5f00\u5173\u6676\u4f53\u7ba1","supplier_class_id":"1118","class_id":"10238","class_name":"\u901a\u7528\u4e09\u6781\u7ba1","parent_id":10229,"financial_classify_id":"","add_time":1592199828,"update_time":1592214607,"id":146}"
```
自营分类表 custom 字段
```json
[
{
"attr_name": "商品型号",
"attr_id": "custom4",
"is_name": 2,
"name_sort": "255"
},
{
"attr_name": "包装/方式",
"attr_id": "custom5",
"is_name": 2,
"name_sort": "254"
},
{
"attr_name": "封装",
"attr_id": "custom3",
"is_name": 2,
"name_sort": "253"
},
{
"attr_name": "制造商",
"attr_id": "custom2",
"is_name": 2,
"name_sort": "252"
},
{
"attr_name": "分类名称",
"attr_id": "custom1",
"is_name": 2,
"name_sort": "-1"
}
]
```
Self_SelfGoods
```json
1) "222266"
2) "{"other_attrs":"","goods_id":222266,"goods_type":0,"supplier_id":10000,"brand_id":5287,"class_id1":10125,"class_id2":10141,"goods_name":"1SMA4750A","status":1,"encoded":"","encap":"SMA(DO-214AC)","packing":5,"goods_unit":1,"goods_images":"","pdf":"","goods_brief":"","moq":10,"mpq":2000,"ladder_price":[{"purchases":10,"price_cn":0.0722},{"purchases":100,"price_cn":0.0722},{"purchases":2000,"price_cn":0.0722}],"update_time":1592218801,"sku_name":"1SMA4750A \u7f16\u5e26 \u653e\u7535\u7ba1 ","mpl":1,"stock":0,"attrs":"","cost":"0.000000","new_cost":"0.000000","supplier_stock":10000,"self_supplier_type":4}"
3) "168560"
4) "{"other_attrs":{"gross_wegiht":"0.00003300"},"goods_id":168560,"goods_type":0,"supplier_id":10000,"brand_id":23,"class_id1":10096,"class_id2":10102,"goods_name":"OPA137N\/250","status":1,"encoded":"","encap":"SOT-23-5","packing":5,"goods_unit":1,"goods_images":"","pdf":"2584","goods_brief":"","moq":1,"mpq":250,"ladder_price":[{"purchases":1,"price_cn":"24.3495"},{"purchases":10,"price_cn":"23.73"},{"purchases":30,"price_cn":"23.31"},{"purchases":100,"price_cn":"22.89"}],"update_time":1577698767,"sku_name":"OPA137N\/250 \u7f16\u5e26 FET\u8f93\u5165\u8fd0\u653e ","mpl":1,"stock":0,"attrs":"","cost":"0.000000","new_cost":"0.000000","supplier_stock":5,"self_supplier_type":2}"
```
\ No newline at end of file
package saveModel
import (
"go_sku_server/model/saveZyRule"
)
type SaveZyRule interface {
Configs() string
Init(configs ...string)
}
type RuleConfig struct {
SkuNameRule *saveZyRule.SkuNameRule
PackRule *saveZyRule.PackRule
GoodsUnitRule *saveZyRule.GoodsUnitRule
SupplierRule *saveZyRule.SupplierRule
}
func RuleInitObj() (*RuleConfig){
ruleConfig:= &RuleConfig{}
ruleConfig.instance(&saveZyRule.SupplierRule{})
ruleConfig.instance(&saveZyRule.GoodsUnitRule{})
ruleConfig.instance(&saveZyRule.PackRule{})
ruleConfig.instance(&saveZyRule.SkuNameRule{})
return ruleConfig
}
func (R *RuleConfig) instance(rule SaveZyRule) {
rule.Init()
switch rule.(type) {
case *saveZyRule.SkuNameRule:
obj,_:=rule.(*saveZyRule.SkuNameRule)
R.SkuNameRule=obj
case *saveZyRule.SupplierRule:
obj,_:=rule.(*saveZyRule.SupplierRule)
R.SupplierRule=obj
case *saveZyRule.PackRule:
obj,_:=rule.(*saveZyRule.PackRule)
R.PackRule=obj
case *saveZyRule.GoodsUnitRule:
obj,_:=rule.(*saveZyRule.GoodsUnitRule)
R.GoodsUnitRule=obj
}
}
package saveModel
import (
"fmt"
"github.com/go-playground/validator/v10"
"math"
)
import "go_sku_server/model"
/**
return [
'cn'=>[
......@@ -75,12 +72,13 @@ var ZyCodes =ZySaveErrcodeCn{}
type ZySaveRequest struct {
SupplierId int `json:"supplier_id" form:"supplier_id" binding:"required"`//供应商ID
Status int `json:"status" form:"status" `//供应商ID
SelfSupplierType int `json:"self_supplier_type" form:"self_supplier_type" binding:"required"`//自采标记:寄售填1,京北3,立创2,油柑4(商品类别是猎芯自采)
SelfSupplierId string `json:"self_supplier_id" form:"self_supplier_id" binding:"required"`
GoodsId int `json:"goods_id" form:"goods_id"`
IsAdd bool //是否新增,默认为false
SupplierBrandId int `json:"supplier_brand_id" form:"supplier_brand_id" binding:"required_with=IsAdd"`// 新增时必填,必须要是建立了映射关系的品牌ID
SupplierBrandId int `json:"supplier_brand_id" form:"supplier_brand_id" validate:"required_with=IsAdd"`// 新增时必填,必须要是建立了映射关系的品牌ID
GoodsName string `json:"goods_name" form:"goods_name" validate:"required_with=IsAdd"`//新增时必填
Encap string `json:"encap" form:"encap" validate:"required_with=IsAdd"`//新增时必填
Packing string `json:"packing" form:"packing" validate:"required_with=IsAdd"`//新增时必填
......@@ -91,12 +89,12 @@ type ZySaveRequest struct {
Cost float64 `json:"cost" form:"cost" `//成本(用于生成阶梯价的价钱),新增时,与ladder_price必填一个,取决于商品价格生成规则
LadderPrice []LadderPrice `json:"ladder_price" form:"ladder_price" `
LadderPrice []model.LadderPrice `json:"ladder_price" form:"ladder_price" `
Mpl int `json:"mpl" form:"mpl" `//倍数
Barcode string `json:"barcode" form:"barcode" `//原厂条码,新增时默认goods_name
SupplierStock string `json:"supplier_stock" form:"supplier_stock" `//供应商库存
OtherAttrs interface{} `json:"other_attrs" form:"other_attrs" `//其他参数,长度(cm暂时未用到)和重量(kg)
SupplierStock int `json:"supplier_stock" form:"supplier_stock" `//供应商库存
OtherAttrs map[string]interface{} `json:"other_attrs" form:"other_attrs" `//其他参数,长度(cm暂时未用到)和重量(kg)
}
type ZySaveErrcodeCn map[int]string
......@@ -126,45 +124,4 @@ type LadderPrice struct {
PriceCn float64 `json:"price_cn"` //数量对应的中文价格
}
//新增sku数据验证,ladder_price 和 cost必填一个,有些字段必填
func (Z *ZySaveRequest)AddDataAlidator() error{
validate:= validator.New()
if(Z.LadderPrice==nil && math.Float64bits(Z.Cost) == 0){
return fmt.Errorf("新增sku时,LadderPrice 和 Cost必填一个")
}
err:= validate.Struct(Z)
if(err!=nil){
if fieldError,ok:=err.(validator.ValidationErrors);ok{
if(fieldError[0].Tag()=="required_with"){
return fmt.Errorf("新增sku缺少必填字段:"+fieldError[0].Field())
}
}
}
return nil
}
/*func (L * LySaveRequest)GetAttrsJson() map[string]interface{} {
if AttrsMap,ok:=L.Attrs.(map[string]interface{});ok{
if(len(AttrsMap)>0){
return AttrsMap
}
}
return nil
}
func (L * LySaveRequest)GetLadderPrice() string {
json_str:="";
if AttrsMap,ok:=L.LadderPrice.([]interface{});ok{
if(len(AttrsMap)>0){
s, _ :=json.Marshal(L.LadderPrice)
json_str=fmt.Sprintf("%s",s)
}
}
return json_str
}*/
package saveZyRule
import (
"encoding/json"
"go_sku_server/pkg/config"
)
//新增自营单位规则
type GoodsUnitRule struct {
Data map[string]int
}
func (GU *GoodsUnitRule) Configs() string{
return config.Get("save_zy_config.goods_unit").String()
}
func (GU *GoodsUnitRule) Get(packCnName string) int{
return GU.Data[packCnName]
}
func (GU *GoodsUnitRule) Init(configs ...string) {
config:=GU.Configs()
err:=json.Unmarshal([]byte(config),&GU.Data)
if(err!=nil){
panic("SkuNameRule init "+err.Error())
}
}
\ No newline at end of file
package saveZyRule
import (
"encoding/json"
"go_sku_server/pkg/config"
)
//新增自营包装规则
type PackRule struct {
data map[string]packData
}
type packData struct {
PickType int `json:"pick_type"`
Packing int `json:"packing" `
}
func (P *PackRule) Configs() string{
return config.Get("save_zy_config.pack_rule").String()
}
func (P *PackRule) Get(packCnName string) packData{
return P.data[packCnName]
}
func (P *PackRule) Init(configs ...string){
config:=P.Configs()
err:=json.Unmarshal([]byte(config),&P.data)
if(err!=nil){
panic("SkuNameRule init "+err.Error())
}
}
\ No newline at end of file
php 对于新增sku 有很多,有很多数组配置,此文件夹里的go文件就是那些配置
* 封装规则
* 供应商规则
* sku_name生成规则
* 商品单位配置规则
\ No newline at end of file
package saveZyRule
import (
"encoding/json"
"github.com/gogf/gf/util/gconv"
"go_sku_server/pkg/config"
"sort"
)
/**
新增自营sku sku_name生成规则
以下为sku_name json 配置格式
{
"class_id2": [
"custom1",
-1,
"分类名称",
2
],
"brand_id": [
"custom2",
252,
"制造商",
1
],
"encap": [
"custom3",
253,
"封装",
1
],
"goods_name": [
"custom4",
255,
"商品型号",
2
],
"packing": [
"custom5",
254,
"包装/方式",
2
]
}
*/
type SkuNameRule struct {
data []skuNameRuleConfig
}
type skuNameRuleConfig struct {
AttrId string `json:"attr_id"` //参与自定义的元素 custom1 分类名称 custom2 制造商品牌ID custom3 封装 custom4 商品型号 custom5 包装方式
NameSort int `json:"name_sort"` //排序,组成sku_name 字符串的位置
AttrName string `json:"attr_name"`//查看了php代码,此字段在组成sku_name没有一点用
IsName int `json:"is_name"` //是否参与自定义sku_name 1:否 2:是'
}
func (SR *SkuNameRule) Configs() string{
return config.Get("save_zy_config.sku_name").String()
}
//根据json配置转换成 SkuNameRule
func (SR *SkuNameRule) Init(configs ...string) {
config:=""
if(len(configs)>0){
config=configs[0]
}else{
config=SR.Configs()
}
var mapNew=make(map[string][]interface{})
err:=json.Unmarshal([]byte(config),&mapNew)
skuNameRuleConfigObj:=skuNameRuleConfig{}
for _,v:=range mapNew {
IsName:=gconv.Int(v[3])
if(IsName==2){
skuNameRuleConfigObj.AttrName=gconv.String(v[2])
skuNameRuleConfigObj.NameSort=gconv.Int(v[1])
skuNameRuleConfigObj.IsName=gconv.Int(v[3])
skuNameRuleConfigObj.AttrId=gconv.String(v[0])
SR.data=append(SR.data,skuNameRuleConfigObj)
}
}
if(err!=nil){
panic("SkuNameRule init "+err.Error())
}
}
func (SR *SkuNameRule) ResetRule(config string) {
SR.Init(config)
}
func (SR *SkuNameRule) ConfigList() []skuNameRuleConfig {
return SR.data
}
//排序 按照NameSort 从小到大
func (SR *SkuNameRule) Sort() {
sort.Sort(skuNameRuleSorter(SR.data))
}
type skuNameRuleSorter []skuNameRuleConfig
func (a skuNameRuleSorter) Len() int {
return len(a)
}
func (a skuNameRuleSorter) Swap(i, j int) {
a[i], a[j] = a[j], a[i]
}
func (a skuNameRuleSorter) Less(i, j int) bool {
return a[j].NameSort < a[i].NameSort
}
package saveZyRule
import (
"encoding/json"
"go_sku_server/pkg/config"
)
/**
新增自营sku 供应商规则
配置格式json如下
{
"10000_2": {
"price": {
"is_ladder": true,
"ratio": 1.13
},
"supplier_stock": {
"ratio": 0.78
},
"fill_field": {
"encoded": "10142"
}
}
}
*/
type SupplierRule struct {
data map[string]SupplierData
}
type SupplierData struct {
Price zyPriceData `json:"price"`//阶梯价格
SupplierStock SupplierStock `json:"supplier_stock"`//供应商库存
FillField FillField `json:"fill_field"`//填充字段
}
//阶梯价格
type zyPriceData struct {
IsLadder bool `json:"is_ladder"`
Ratio float64 `json:"ratio"` //ratio 价格比率
LadderRatio float64 `json:"ladder_ratio"` //ladder_ratio 购买数量比率
}
func (ZP *zyPriceData)IsEmpty() bool {
return *ZP==zyPriceData{}
}
//供应商库存
type SupplierStock struct {
Ratio float64 `json:"ratio"`
}
//填充字段
type FillField struct {
Encoded string `json:"encoded"`
}
func (ZP *SupplierRule) Configs() string{
return config.Get("save_zy_config.supplier_rule").String()
}
func (ZP *SupplierRule) Get(supplierId_Type string) SupplierData {
return ZP.data[supplierId_Type]
}
func (ZP *SupplierRule) Init(configs ...string){
config:=ZP.Configs()
err:=json.Unmarshal([]byte(config),&ZP.data)
if(err!=nil){
panic("SupplierRule init "+err.Error())
}
}
package model
type ZyBrand struct {
BrandLogo string `json:"brand_logo" form:"brand_logo" `
BrandId int `json:"brand_id" form:"brand_id" `
BrandName string `json:"brand_name" form:"brand_name" `
BrandArea int `json:"brand_area" form:"brand_area" `
Status int `json:"brand_area" form:"brand_area" `
}
package model
type ZyClassify struct {
ClassName string `json:"class_name" form:"class_name" `
Custom string `json:"custom" form:"custom" `
ClassId int `json:"class_id" form:"class_id" `
}
package model
//财务分类
type ZyFinancialClassify struct {
ClassifySn string `json:"classify_sn" form:"classify_sn" `
ClassifyParentSn string `json:"classify_parent_sn" form:"classify_parent_sn" `
Level int `json:"level" form:"level" `
ClassifyName string `json:"classify_name" form:"classify_name" `
}
type SelfClassify struct {
Custom string `json:"custom" form:"custom" `
}
package model
package model
//php
/**
$fieldArr=['other_attrs', 'pick_type', 'barcode', 'goods_id','goods_type','supplier_id','brand_id','class_id1','class_id2','goods_name','status',
'encoded','encap','packing','goods_unit','goods_images','pdf','goods_brief','moq','mpq',
'ladder_price','update_time','sku_name','mpl','stock','attrs','cost','new_cost','supplier_stock','self_supplier_type'];
$info=$this->where('goods_id', '=', $goods_id)->select($fieldArr)->first();
*/
//@author wangsong
/**
LadderPrice 说明
查看 自营商品表的 LadderPrice字段,里面的 price_cn 有时候是字符串(带引号),有时候不带引号……无语
[{"purchases":1,"price_cn":1.1},{"purchases":2,"price_cn":2.1},{"purchases":3,"price_cn":3.1},{"purchases":4,"price_cn":4.1},{"purchases":5,"price_cn":5.1},{"purchases":6,"price_cn":6.1},{"purchases":7,"price_cn":7.1},{"purchases":8,"price_cn":8.1}]
[{"purchases":"1","price_cn":"6.1","price_us":""},{"purchases":"50","price_cn":"5.6","price_us":""},{"purchases":"100","price_cn":"5.2","price_us":""}]
*/
type ZyHistoryPrice struct {
GoodsId int ` json:"goods_id" form:"goods_id"`//自营classID2
Price float64 `json:"price" form:"price" `//成本(用于生成阶梯价的价钱),新增时,与ladder_price必填一个,取决于商品价格生成规则
AddTime int `json:"add_time" xorm:"created"`
UpdateTime int `json:"update_time" xorm:"updated"`
}
package model
//php
/**
$fieldArr=['other_attrs', 'pick_type', 'barcode', 'goods_id','goods_type','supplier_id','brand_id','class_id1','class_id2','goods_name','status',
'encoded','encap','packing','goods_unit','goods_images','pdf','goods_brief','moq','mpq',
'ladder_price','update_time','sku_name','mpl','stock','attrs','cost','new_cost','supplier_stock','self_supplier_type'];
$info=$this->where('goods_id', '=', $goods_id)->select($fieldArr)->first();
*/
//@author wangsong
/**
LadderPrice 说明
查看 自营商品表的 LadderPrice字段,里面的 price_cn 有时候是字符串(带引号),有时候不带引号……无语
[{"purchases":1,"price_cn":1.1},{"purchases":2,"price_cn":2.1},{"purchases":3,"price_cn":3.1},{"purchases":4,"price_cn":4.1},{"purchases":5,"price_cn":5.1},{"purchases":6,"price_cn":6.1},{"purchases":7,"price_cn":7.1},{"purchases":8,"price_cn":8.1}]
[{"purchases":"1","price_cn":"6.1","price_us":""},{"purchases":"50","price_cn":"5.6","price_us":""},{"purchases":"100","price_cn":"5.2","price_us":""}]
*/
type ZySkuEntity struct {
//tod……
SupplierId int `json:"supplier_id"`
SupplierBrandId int `json:"supplier_brand_id" form:"supplier_brand_id" binding:"required_with=IsAdd"`// 新增时必填,必须要是建立了映射关系的品牌ID
SelfSupplierId string `json:"self_supplier_id" form:"self_supplier_id" binding:"required"`
SelfSupplierType int `json:"self_supplier_type" form:"self_supplier_type" binding:"required"`//自采标记:寄售填1,京北3,立创2,油柑4(商品类别是猎芯自采)
SupplierStock int `json:"supplier_stock" form:"supplier_stock" `//供应商库存
NewCost float64 `json:"new_cost" form:"new_cost" `//成本(用于生成阶梯价的价钱),新增时,与ladder_price必填一个,取决于商品价格生成规则
Cost float64 `json:"cost" form:"cost" `//成本(用于生成阶梯价的价钱),新增时,与ladder_price必填一个,取决于商品价格生成规则
Stock int `json:"stock" form:"stock" `//倍数
Mpl int `json:"mpl" form:"mpl" `//倍数
SkuName string `json:"sku_name" form:"sku_name" ` //skuName
LadderPrice string `json:"ladder_price" form:"ladder_price" `
Moq int `json:"moq" form:"moq" validate:"required_with=IsAdd"`//新增时必填
Mpq int `json:"mpq" form:"mpq" validate:"required_with=IsAdd"`//新增时必填
GoodsBrief string `json:"goods_brief" form:"goods_brief" ` //简短描述
Pdf string `json:"pdf" form:"pdf" ` //PDF地址
GoodsImages string `json:"goods_images" form:"goods_images" `
GoodsUnit int `json:"goods_unit" form:"goods_unit" validate:"required_with=IsAdd"`//SKU单位名称
Packing int `json:"packing" form:"packing" validate:"required_with=IsAdd"`//包装/方式
Encap string `json:"encap" form:"encap" `//封装/规格
Status int `json:"status" `
Encoded string `json:"encoded" `//内部编码
GoodsName string `json:"goods_name" form:"goods_name" `
BrandId int `json:"brand_id" form:"brand_id" `// 品牌ID
SupplierId int `json:"supplier_id" form:"supplier_id" `//供应商ID
GoodsId int `json:"goods_id" form:"goods_id"`
GoodsType int `json:"goods_type" form:"goods_type" `//原厂条码,新增时默认goods_name
Barcode string `json:"barcode" form:"barcode" `//原厂条码,新增时默认goods_name
PickType int `json:"pick_type" form:"pick_type"`//供应商ID
OtherAttrs string `json:"other_attrs" form:"other_attrs" `//其他参数,长度(cm暂时未用到)和重量(kg)
Attrs []Attrs `json:"attrs" form:"attrs" `//参数
FinancialClassifyId string `json:"financial_classify_id" form:"financial_classify_id" `//税务分类ID
TaxClassifyName string `json:"tax_classify_name" form:"tax_classify_name" `//税务分类全称
UniqueMd5 string `json:"unique_md5" form:"unique_md5" `//识别标识(由型号、供应商、品牌、包装、封装拼接MD5加密生成)
ClassId1 int `json:"class_id1" form:"class_id1"`//自营classID
ClassId2 int ` json:"class_id2" form:"class_id2"`//自营classID2
IsPerfect int ` json:"is_perfect" form:"is_perfect"`//自营classID2
IsSelfName int ` json:"is_self_name" form:"is_self_name"`//自营classID2
AddTime int `json:"add_time" xorm:"created"`
SaleTime int `json:"sale_time"`
UpdateTime int `json:"update_time" xorm:"updated"`
}
......@@ -129,6 +129,12 @@ func CopyStruct(struct1 interface{}, struct2 interface{}, Status ...int) {
}
}
if(name=="LadderPrice"){
if dvalue.Kind() != sval.Field(i).Kind() { //类型不一样不复制
continue
}
}
if dvalue.Kind() != sval.Field(i).Kind() { //类型不一样不复制
continue
}
......@@ -600,4 +606,20 @@ func MyRound(x float64, wei int) float64 {
return a
}
/*
@author wangsong
保留小数点几位(四舍五入)
@param float64 val 目标分析字符串
@param int precision 取小数多少位
*/
func Round(val float64, precision int) (valueFloat64 float64) {
//strconv.ParseFloat(fmt.Sprintf("%.2f", 12.0), 64) //两位
format:="%."+strconv.Itoa(precision)+"f"
valueFloat64,err:= strconv.ParseFloat(fmt.Sprintf(format, val), 64)
if(err!=nil){
panic("round err"+err.Error())
}
return
}
////////////类型转换/////////////////////
......@@ -12,6 +12,7 @@ var (
func SetUp(path string) (err error) {
//引入多个文件
Cfg, err = ini.LooseLoad(path+"/config.ini", path+"/database.ini", path+"/redis.ini", path+"/rabmq.ini", path+"/mongo.ini",path+"/log.ini")
//Cfg, err = ini.LooseLoad(path+"/config.ini", path+"/database.ini", path+"/redis.ini", path+"/rabmq.ini", path+"/mongo.ini",path+"/log.ini")
return
}
......
package e
import "fmt"
type ApiError struct {
ErrMsg string
......@@ -34,4 +35,16 @@ func NewApiError(opts ...interface{}) * ApiError{
return &ApiError{ ErrMsg: ErrMsg,Code:Code}
}
/**
检测异常,并抛出异常
*/
func CheckError(err error) {
if err != nil {
fmt.Print(err.Error());
if apiError,ok:=err.(*ApiError);ok{
panic(apiError)
}else{
panic(NewApiError(err.Error()))
}
}
}
package service
import (
"github.com/tidwall/gjson"
"go_sku_server/dao"
)
type ZyBrandService struct {
}
/**
获取自营品牌名称
@ brandId 品牌ID
redis 读不到到mysql读,mysql有数据再入redis缓存
*/
func (ZB *ZyBrandService) GetBrandName (brandId int) (error,string){
redisBrandStr,err:=dao.GetRedisBrand(brandId)
if(err!=nil){
return err,""
}
if(redisBrandStr!=""){
return nil,gjson.Get(redisBrandStr,"brand_name").String()
}else{
res,err:=dao.GetDbBrand(brandId)
if(err!=nil){
return err,""
}
if(res.BrandName!=""){
//todo 设置品牌缓存 ,其实可以用异步
err=dao.InSertRedisBrand(*res)
if(err!=nil){
return err,""
}
return err,res.BrandName
}
}
return nil,""
}
package service
import (
"go_sku_server/dao"
)
type FinancialClassService struct {
TaxClassifyName string
}
/**
获取税务分类名字
@ classifySn 税务分类编码
*/
func (F *FinancialClassService) GetFinancialClassInfoName(classifySn string) (string,error){
if(F.TaxClassifyName!=""){
F.TaxClassifyName=F.TaxClassifyName+"/"
}
zyFinancialClassify,err:=dao.GetFinancialClassInfo(classifySn)
if(err!=nil){
return "",err
}
F.TaxClassifyName=F.TaxClassifyName+zyFinancialClassify.ClassifyName
if(zyFinancialClassify.Level>3){
F.GetFinancialClassInfoName(zyFinancialClassify.ClassifyParentSn)
}
return F.TaxClassifyName,nil
}
func NewFinancialService() *FinancialClassService{
return &FinancialClassService{}
}
\ No newline at end of file
package service
import (
"encoding/json"
"fmt"
"github.com/gin-gonic/gin"
"github.com/go-playground/validator/v10"
"github.com/gogf/gf/util/gconv"
"github.com/tidwall/gjson"
"go_sku_server/dao"
"go_sku_server/model"
"go_sku_server/model/saveModel"
"go_sku_server/pkg/common"
"go_sku_server/pkg/e"
"go_sku_server/pkg/logger"
"math"
"sort"
"strings"
"time"
)
var Rule *saveModel.RuleConfig
type ZySaveService struct {
}
func (S *ZySaveService)SaveZySku(zySaveRequest saveModel.ZySaveRequest,ctx *gin.Context) (error) {
//获取商品信息
zySkuEntity,err:=dao.GetZyGoodSInfoByCollect(zySaveRequest.SupplierId,zySaveRequest.SelfSupplierType,zySaveRequest.SelfSupplierId)
e.CheckError(err)
if(zySkuEntity.GoodsId==0){
//参数验证(新增)
e.CheckError(S.addDataAlidator(zySaveRequest))
//相似商品
e.CheckError(S.brandHandle(&zySkuEntity,zySaveRequest))//查找相似商品必须要先获取到brandID
SimilarGoods,err:=dao.GetSimilarGoods(zySaveRequest.SelfSupplierType,gconv.Int64(zySkuEntity.BrandId))
e.CheckError(err)
if len(SimilarGoods)>0{//
S.updateSimilarGoods(SimilarGoods,zySaveRequest)//修改相似商品
}
S.addGoods(zySkuEntity,zySaveRequest)//新增商品
}else{//修改
S.updateGoods(zySkuEntity,zySaveRequest)//修改此商品
fmt.Print("123123")
}
return nil
}
/**
修改相似商品
*/
func (S *ZySaveService) updateSimilarGoods(SimilarGoods []model.ZySkuEntity,zySaveRequest saveModel.ZySaveRequest) error{
for _,zySkuEntity:= range SimilarGoods{
fmt.Printf("修改相似商品:%d",zySkuEntity.GoodsId)
err:=S.updateGoods(zySkuEntity,zySaveRequest)
if(err!=nil){
return err
}
}
return nil
}
/**
新增商品
*/
func (S *ZySaveService)addGoods(zySkuEntity model.ZySkuEntity,zySaveRequest saveModel.ZySaveRequest) {
fmt.Printf("新增商品:%d",777)
//todo……
}
/**
修改商品
*/
func (S *ZySaveService)updateGoods(zySkuEntity model.ZySkuEntity,zySaveRequest saveModel.ZySaveRequest) error {
fmt.Printf("修改商品:%d",zySkuEntity.GoodsId)
S.GoodsDataHandle(&zySkuEntity,&zySaveRequest)
affected, err:=dao.InsertDbGoods(zySkuEntity)
if (err != nil) {
return e.NewApiError("修改sku mysql数据失败 msg:"+err.Error(),508001)
}
if(affected<=0){//没有什么可以修改的,直接完成就好了
fmt.Println("没什么可以修改的")
logger.Select("zysku_save").Info("不需要修改")
return nil
}else{
//存redis
err:=dao.InsertRedisGoods(zySkuEntity)
if(err!=nil){
return e.NewApiError("修改sku redis数据失败 msg:"+err.Error(),508001)
}
//存历史价格
}
S.historyPriceHandle(zySkuEntity.GoodsId,zySaveRequest.LadderPrice)
return nil
zySaveRequest.IsAdd=true
err:=zySaveRequest.AddDataAlidator()
if err != nil {
return e.NewApiError("缺少参数:"+err.Error(),108001)
//todo……
//获取映射品牌
}
/**
商品信息处理,将需要修改的数据赋值到 zySkuEntity
*/
func (S *ZySaveService) GoodsDataHandle(zySkuEntity *model.ZySkuEntity,zySaveRequest *saveModel.ZySaveRequest) {
Rule=saveModel.RuleInitObj()
zySkuEntity.IsSelfName=1
zySkuEntity.IsPerfect=2
common.CopyStruct(&zySaveRequest,zySkuEntity)
//品牌处理
e.CheckError(S.brandHandle(zySkuEntity,zySaveRequest))
//分类处理
e.CheckError(S.classHandle(zySkuEntity,zySaveRequest))
//包装处理
e.CheckError(S.packHandle(zySkuEntity,zySaveRequest))
//单位处理
e.CheckError(S.goodsUnitHandle(zySkuEntity,zySaveRequest))
//商品型号处理
e.CheckError(S.goodsNameHandle(zySkuEntity,zySaveRequest))
//status 处理
e.CheckError(S.statusHandle(zySkuEntity,zySaveRequest))
//价格库存处理
e.CheckError(S.priceStockHandle(zySkuEntity,zySaveRequest))
//其他属性处理
e.CheckError(S.otherAttrHandle(zySkuEntity,zySaveRequest))
//生成 md5Goods 唯一标志
e.CheckError(S.md5GoodsUnique(zySkuEntity,zySaveRequest))
//生成sku_name
e.CheckError(S.generateSkuName(zySkuEntity,zySaveRequest))
}
/**
品牌处理
*/
func (S *ZySaveService) brandHandle(zySkuEntity *model.ZySkuEntity, zySaveRequest *saveModel.ZySaveRequest) error {
if(zySaveRequest.SupplierBrandId!=0){
err,brandId:=dao.GetBrandMappingId(zySaveRequest.SupplierId,zySaveRequest.SelfSupplierType,zySaveRequest.SupplierBrandId)
e.CheckError(err)
if(brandId==0){
return e.NewApiError("品牌映射不存在", 108002)
}
zySkuEntity.BrandId=int(brandId)
}
return nil
}
/**
先读redis,读不到就读数据库
@param isUpdate 如果redis没有,是否直接更新redis
分类处理
*/
func (S *ZySaveService)GetSelfGoodsInfo(isUpdate bool)(model.ZySkuEntity){
func (S *ZySaveService) classHandle(zySkuEntity *model.ZySkuEntity, zySaveRequest *saveModel.ZySaveRequest) error {
if(zySaveRequest.SupplierClassId!=0){
classJsonStr:=dao.GetClassMapping(zySkuEntity.SupplierId,zySkuEntity.SelfSupplierType,zySaveRequest.SupplierClassId)
if(classJsonStr==""){
return e.NewApiError("未建立分类的映射关系", 508001)
}
ClassId1:=int(gjson.Get(classJsonStr,"parent_id").Int())
ClassId2:=int(gjson.Get(classJsonStr,"class_id").Int())
if(ClassId1==0 || ClassId2==0){
return e.NewApiError("未建立分类的映射关系", 508001)
}
zySkuEntity.ClassId1=ClassId1
zySkuEntity.ClassId2=ClassId2
financialClassifyId:=gjson.Get(classJsonStr,"financial_classify_id").String()
//financialClassifyId="1090504030000000000"//测试数据
if(financialClassifyId!=""){
zySkuEntity.FinancialClassifyId=financialClassifyId
taxClassifyName,err:=NewFinancialService().GetFinancialClassInfoName(financialClassifyId)
if(err!=nil){
return err
}
zySkuEntity.TaxClassifyName=taxClassifyName
}
}
return nil
}
zySkuEntity:=model.ZySkuEntity{}
//经过redis 或者数据库查询
getRedisGoodsIinfo:=false
if(getRedisGoodsIinfo==false){//redis没查到
if(zySkuEntity!=model.ZySkuEntity{}){//查数据库
//TOD……
//更新redis
//包装处理
func (S *ZySaveService) packHandle(zySkuEntity *model.ZySkuEntity, zySaveRequest *saveModel.ZySaveRequest) error {
packRule:=Rule.PackRule
packName:=zySaveRequest.Packing
if(packName!=""){
packing:=packRule.Get(packName).Packing
pickType:=packRule.Get(packName).PickType
if(packing==0 || pickType==0){
return e.NewApiError("包装方式不存在#packing", 508001)
}
zySkuEntity.Packing=packing
zySkuEntity.PickType=pickType
}
return zySkuEntity
}
\ No newline at end of file
return nil
}
//商品型号处理
func (S *ZySaveService) goodsNameHandle(zySkuEntity *model.ZySkuEntity, zySaveRequest *saveModel.ZySaveRequest) error {
if(zySaveRequest.GoodsName!=""){
zySkuEntity.GoodsName=zySaveRequest.GoodsName
if(zySaveRequest.Barcode==""){
zySkuEntity.Barcode=zySaveRequest.GoodsName
}else{
zySkuEntity.Barcode=zySaveRequest.Barcode
}
}
return nil
}
//单位处理
func (S *ZySaveService) goodsUnitHandle(zySkuEntity *model.ZySkuEntity, zySaveRequest *saveModel.ZySaveRequest) error {
goodsUnitRule:=Rule.GoodsUnitRule
goodsUnit:=zySaveRequest.GoodsUnit
if(goodsUnit!=""){
goodsUnit:=goodsUnitRule.Get(goodsUnit)
if(goodsUnit==0 ){
return e.NewApiError("商品单位不存在#goods_unit", 508001)
}
zySkuEntity.GoodsUnit=goodsUnit
}
return nil
}
//status处理
func (S *ZySaveService) statusHandle(zySkuEntity *model.ZySkuEntity, zySaveRequest *saveModel.ZySaveRequest) error {
//新增和修改 status处理不同
if(zySkuEntity.GoodsId>0) { //修改
if (zySaveRequest.Status != 0) {
zySkuEntity.Status = zySaveRequest.Status
if (zySaveRequest.Status == 1 && zySaveRequest.Status!=zySkuEntity.Status) {
zySkuEntity.SaleTime = int(time.Now().Unix())
}
} else {
zySkuEntity.Status = 1
zySkuEntity.SaleTime = int(time.Now().Unix())
}
}
return nil
}
/**
价格库存处理
1 阶梯价处理
2.库存处理
*/
func (S *ZySaveService) priceStockHandle (zySkuEntity *model.ZySkuEntity,zySaveRequest *saveModel.ZySaveRequest)error{
//阶梯价处理
zySaveRequest.SelfSupplierType=2
pre:=fmt.Sprintf("%d_%d",zySaveRequest.SupplierId,zySaveRequest.SelfSupplierType)
supplierRule:=Rule.SupplierRule.Get(pre)
priceRule:=supplierRule.Price
if(priceRule.IsEmpty()){
if(len(zySaveRequest.LadderPrice)>0){//阶梯价配置
priceRule.IsLadder=true
priceRule.Ratio=1
}else if(zySaveRequest.Cost > 0){//成本价配置
priceRule.IsLadder=false
priceRule.Ratio=1
priceRule.LadderRatio=1
}
}
if(len(zySaveRequest.LadderPrice)>0 || zySaveRequest.Cost>0){
if(len(zySaveRequest.LadderPrice)>0 && priceRule.IsLadder==true){//有阶梯价,并且有阶梯价配置
sort.Sort(LadderPriceSorter(zySaveRequest.LadderPrice))//
for i,item:=range zySaveRequest.LadderPrice{
if(item.Purchases==0 || zySaveRequest.Cost<=0){//不符合删除其中一个阶梯价 php代码为 unset($p[$k])
zySaveRequest.LadderPrice=append(zySaveRequest.LadderPrice[:i],zySaveRequest.LadderPrice[i+1:]...)
continue
}
priceCn:=common.Round(item.PriceCn*priceRule.Ratio,4)
zySaveRequest.LadderPrice[i].PriceCn=priceCn
//zySaveRequest.LadderPrice[i].PriceCn=item.PriceCn*priceRule.Ratio
}
//价格不合法,强制下架
if(len(zySaveRequest.LadderPrice)==0){
zySkuEntity.Status=3
}
}else if (zySaveRequest.Cost>0 && priceRule.IsLadder==true){//成本价生成阶梯价
//用包装量和成本价生成阶梯价
if(priceRule.LadderRatio==0){
priceRule.LadderRatio=1
}
if(priceRule.Ratio==0){
//原PHP代码 $price_rule['ladder_ratio'] = 1; 怀疑写错了,直接复制过来,应该是 $price_rule['Ratio']
priceRule.Ratio=1
}
s:=model.LadderPrice{}
s.Purchases=int64(math.Ceil(float64(zySaveRequest.Mpq)*priceRule.LadderRatio))//ceil 向上取整
s.PriceCn=common.Round(zySaveRequest.Cost*priceRule.Ratio,4)
zySaveRequest.LadderPrice=append(zySaveRequest.LadderPrice,s)
}else{
return e.NewApiError("商品价格生成异常", 508001)
}
byteLadder,err:=json.Marshal(zySaveRequest.LadderPrice)
if(err!=nil){
return e.NewApiError("LadderPrice json 生成异常", 508001)
}
zySkuEntity.LadderPrice=string(byteLadder)
}
//阶梯价end
//处理供应商库存
stockRule:=supplierRule.SupplierStock
if(stockRule.Ratio==0){
stockRule.Ratio=1
}
if(zySaveRequest.SupplierStock!=0){
zySkuEntity.SupplierStock=int(math.Floor(float64(zySaveRequest.SupplierStock)*stockRule.Ratio))
}
//根据规则填充encoded
encoded:=supplierRule.FillField.Encoded
if(encoded!=""){
zySkuEntity.Encoded=encoded
}
return nil
}
//其他属性
func (S *ZySaveService) otherAttrHandle(zySkuEntity *model.ZySkuEntity, zySaveRequest *saveModel.ZySaveRequest) error {
if(zySaveRequest.OtherAttrs!=nil){
byteOtherAttrs,err:=json.Marshal(zySaveRequest.OtherAttrs)
if(err!=nil){
return e.NewApiError("OtherAttrs json处理失败", 508001)
}
zySkuEntity.OtherAttrs=string(byteOtherAttrs)
}
return nil
}
/**
获取skuName
1.获取分类名称 class_name
2.获取 lie_self_classify custom(参与命名规则),获取不到 读取默认的配置 custom。命名规则规定 分类名称 制造商 封装 商品型号 包装/方式 哪些参与命名(is_name=2) name_sort 排序
3.读取 lie_goods 表的 attrs 字段,attrs包含 此商品用了分类哪些属性,根据这些属性名到lie_classify_attr 表查询下,is_name是否等于2, 与 第二点 custom 合并参与命名
*/
func (S *ZySaveService) generateSkuName(zySkuEntity *model.ZySkuEntity, zySaveRequest *saveModel.ZySaveRequest) error {
zyClassify,err:=dao.GetClassInfo(zySkuEntity.ClassId2)
if(err!=nil){
return err
}
//如果数据库 lie_self_classify 的custom 有值,就用custom 字段的值作为生成sku_name的配置
if(zyClassify.Custom!=""){
Rule.SkuNameRule.ResetRule(zyClassify.Custom)
}
Rule.SkuNameRule.Sort()//排序
//属性暂时就不参与命名了,PHP原版本也没处理
skuName:=""
for _,v:=range Rule.SkuNameRule.ConfigList() {
switch v.AttrId {
case "custom1":
skuName=skuName+zyClassify.ClassName
//todo class name
break
case "custom2":
//todo brand name
zyBrandService:=ZyBrandService{}
err,brandName:=zyBrandService.GetBrandName(zySkuEntity.BrandId)
if(err!=nil){
return nil
}
skuName=skuName+brandName
break
case "custom3":
skuName=skuName+zySkuEntity.Encap
//todo encap 封装
break
case "custom4":
skuName=skuName+zySkuEntity.GoodsName
//todo 商品名称
break
case "custom5":
//todo 包装
err,packing:=dao.GetRedisUnit(zySkuEntity.Packing)
if(err!=nil){
return err
}
skuName=skuName+packing
//todo packing
break
}
}
zySkuEntity.SkuName=skuName
return nil
}
//goodsName,brandId,supplierId,Packing,encap 组成
func (S *ZySaveService)md5GoodsUnique(zySkuEntity *model.ZySkuEntity, Z *saveModel.ZySaveRequest) error {
goodsName:=strings.ToUpper(zySkuEntity.GoodsName)
brandId:=zySkuEntity.BrandId
supplierId:=zySkuEntity.SupplierId
Packing:=zySkuEntity.Packing
encap:=zySkuEntity.Encap
uniqueMd5Slice:=make([]interface{},0)
uniqueMd5Slice=append(uniqueMd5Slice,goodsName,brandId,supplierId,Packing,encap)
bytes,err:= json.Marshal(uniqueMd5Slice)
if(err!=nil){
return e.NewApiError("md5GoodsUnique json处理失败", 508001)
}
zySkuEntity.UniqueMd5=common.Md5(string(bytes))
return nil
}
//新增sku数据验证,ladder_price 和 cost必填一个,有些字段必填
func (S *ZySaveService)addDataAlidator(Z saveModel.ZySaveRequest) error{
Z.IsAdd=true
validate:= validator.New()
if(Z.LadderPrice==nil && common.Round(Z.Cost,4) == 0){
return e.NewApiError("新增sku时,LadderPrice 和 Cost必填一个:",108001)
}
err:= validate.Struct(Z)
if(err!=nil){
if fieldError,ok:=err.(validator.ValidationErrors);ok{
if(fieldError[0].Tag()=="required_with"){
return e.NewApiError("新增sku缺少必填字段:"+fieldError[0].Field(),108001)
}
}
}
return nil
}
//历史价格处理 参照 项目 self_sku HistoryPriceModel.php 的 AddHistoryPrice(感觉是有问题,暂时按照PHP的业务来)
//
func (S *ZySaveService) historyPriceHandle(goodsId int,LadderPrice []model.LadderPrice) {
if(len(LadderPrice)>0){
sort.Sort(LadderPriceSorter(LadderPrice))
ZyHistoryPrice:=model.ZyHistoryPrice{}
ZyHistoryPrice.Price=LadderPrice[0].PriceCn
ZyHistoryPrice.GoodsId=goodsId
//todo 查 redis Self_last_history_price 的price 是否与此次 price相等,相等就不插入mysql,不相等就插入mysql(不知道为啥是这个逻辑)
//todo 插入mysql 的价格,只是排序后的阶梯价第一个条数据的价格(不知道为啥是这个逻辑)
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment