You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

212 lines
4.4 KiB

package jst
import (
"bytes"
"encoding/json"
"fmt"
"github.com/gin-gonic/gin"
"log"
"recook/internal/dbc"
order2 "recook/internal/v2/logic/manage/order"
"recook/internal/v2/model/gys/goods"
jst2 "recook/internal/v2/model/jst"
manage "recook/internal/v2/model/recook/order"
"recook/tools"
"strconv"
)
type jst struct {
Code int `json:"code"`
Msg string `json:"msg"`
}
var ok = jst{
0,
"执行成功",
}
var fail = jst{
-1,
"执行失败",
}
type query struct {
TS string `form:"ts"`
PartnerID string `form:"partnerid"`
Method string `form:"method"`
Sign string `form:"sign"`
}
type InventorySync struct {
Modified string `json:"modified" binding:"required"`
Qty uint `json:"qty" binding:"required"`
SkuID string `json:"sku_id" binding:"required"`
}
type logisticsSync struct {
Items []struct {
OuterOiID string `json:"outer_oi_id"`
Qty int64 `json:"qty"`
SkuID string `json:"sku_id"`
SoID string `json:"so_id"`
} `json:"items"`
LID string `json:"l_id"`
LcID string `json:"lc_id"`
LogisticsCompany string `json:"logistics_company"`
OID uint `json:"o_id"`
SendDate string `json:"send_date"`
SoID string `json:"so_id"`
}
func (l *logisticsSync) String() string {
b, err := json.Marshal(*l)
if err != nil {
return fmt.Sprintf("%+v", *l)
}
var out bytes.Buffer
err = json.Indent(&out, b, "", " ")
if err != nil {
return fmt.Sprintf("%+v", *l)
}
return out.String()
}
func validate(q *query, js *jst2.ShopModel) bool {
r := tools.MD5(q.Method+js.PartnerID+"ts"+q.TS+js.PartnerKey) == q.Sign
if !r {
log.Printf("参数校验失败: %+v, %+v\n", q, js)
}
return r
}
//CallBack 聚水潭消息推送callback.
func CallBack(c *gin.Context) {
fmt.Printf("接受的URL:%v\n", c.Request.URL.String())
var q = c.DefaultQuery("method", "null")
//if e := c.ShouldBindQuery(&q); e != nil {
// log.Println(e.Error())
// c.JSON(400, fail)
// return
//}
log.Printf("方法是%+v", q)
switch q {
case "logistics.upload":
var o logisticsSync
if e := c.ShouldBindJSON(&o); e != nil {
log.Println("bind logistics data error")
c.JSON(400, fail)
return
}
log.Printf("logistics jst_back: %+v\n", o.String())
handleLogisticsSyncCallback(&o)
case "inventory.upload":
var o []InventorySync
if e := c.ShouldBindJSON(&o); e != nil {
log.Println("bind inventory data error")
c.JSON(400, fail)
return
}
log.Printf("inventory jst_back: %+v\n", o)
handleInventorySyncCallback(o)
default:
}
c.JSON(200, ok)
}
//物流同步,消息回传
func handleLogisticsSyncCallback(o *logisticsSync) {
ogi, err := strconv.ParseInt(o.SoID, 10, 64)
if err != nil {
return
}
//构建聚水潭,数据库查询店铺资料
j := &jst2.OrderModel{}
jo := j.FindByOrderID(uint(ogi))
jsm := &jst2.ShopModel{}
js := jsm.FindByID(jo.JSTShopID)
if js.ID == 0 {
return
}
og := &manage.RecookOrderGoodsDetailModel{}
data := og.FindByOrderId(jo.OrderID)
if len(data) == 0 {
return
}
//遍历聚水潭订单数据data
for _, v := range data {
for _, k := range o.Items {
if v.SkuCode == k.SkuID { //比较sku_code,相同则进行发货
je := jst2.ExpressModel{}
je = je.FindByLcID(o.LcID)
e := []order2.ExpressInfo{
{
o.LogisticsCompany,
o.LID,
},
}
if je.Id > 0 {
e = []order2.ExpressInfo{
{
je.Name,
o.LID,
},
}
}
//查询该子订单是否有过发货记录,有记录则把快递数据叠加
var ex []manage.RecookOrderGoodsExpressModel
dbc.DB.Table((&manage.RecookOrderGoodsExpressModel{}).TableName()).Find(&ex, "order_goods_id=?", v.Id)
if len(ex) > 0 {
for _, model := range ex {
e = append(e, order2.ExpressInfo{
ExpressCompName: model.ExpressCompName,
ExpressNo: model.ExpressNo,
})
}
}
fmt.Println(e)
_ = order2.Expresslogic.Express(v.VendorId, "jst", v, e)
}
}
}
//原代码
//je := jst2.ExpressModel{}
//je = je.FindByLcID(o.LcID)
//e := []order2.ExpressInfo{
// {
// o.LogisticsCompany,
// o.LID,
// },
//}
//if je.Id > 0 {
// e = []order2.ExpressInfo{
// {
// je.Name,
// o.LID,
// },
// }
//}
//for _, v := range data {
// _ = order2.Expresslogic.Express(v.VendorId, "jst", v, e)
//}
}
func handleInventorySyncCallback(o []InventorySync) {
for _, v := range o {
gg := &goods.GysGoodsSkuModel{}
gg.SetInventoryByCode(v.SkuID, v.Qty)
}
}