Merge branch 'jdshop' of https://e.coding.net/rosydev/jx-callback into jdshop

This commit is contained in:
richboo111
2023-02-16 10:04:28 +08:00
10 changed files with 181 additions and 91 deletions

View File

@@ -950,7 +950,6 @@ func AddSkuName(ctx *jxcontext.Context, skuNameExt *model.SkuNameExt, userName s
}
func UpdateSkuName(ctx *jxcontext.Context, nameID int, payload map[string]interface{}, isExd bool) (num int64, err error) {
globals.SugarLogger.Debugf("==========payload %s", utils.Format4Output(payload, false))
userName := ctx.GetUserName()
skuName := &model.SkuName{}
skuName.ID = nameID
@@ -1026,10 +1025,6 @@ func UpdateSkuName(ctx *jxcontext.Context, nameID int, payload map[string]interf
panic(r)
}
}()
globals.SugarLogger.Debugf("UpdateEntityLogically 1 := %s", utils.Format4Output(skuName, false))
globals.SugarLogger.Debugf("UpdateEntityLogically 2 := %s", utils.Format4Output(valid, false))
globals.SugarLogger.Debugf("UpdateEntityLogically 3 := %s", userName)
// valid[model.FieldJdSyncStatus] = model.SyncFlagModifiedMask | skuName.JdSyncStatus
if num, err = dao.UpdateEntityLogically(db, skuName, valid, userName, nil); err != nil {
dao.Rollback(db, txDB)
return 0, err
@@ -1087,23 +1082,25 @@ func UpdateSkuName(ctx *jxcontext.Context, nameID int, payload map[string]interf
}
if len(skuIDs) > 0 {
// 判断是否改价
nowPrice, _ := payload["price"].(json.Number).Int64()
if skuName.Price != int(nowPrice) && nowPrice != 0 {
if payload["price"] != nil {
nowPrice, _ := payload["price"].(json.Number).Int64()
if skuName.Price != int(nowPrice) && nowPrice != 0 {
for _, v1 := range payload["skus"].([]interface{}) {
v := v1.(map[string]interface{})
skuInfo := &aa{}
if err := utils.Map2StructByJson(v, skuInfo, false); err != nil {
globals.SugarLogger.Debugf("errr %v", err)
continue
for _, v1 := range payload["skus"].([]interface{}) {
v := v1.(map[string]interface{})
skuInfo := &aa{}
if err := utils.Map2StructByJson(v, skuInfo, false); err != nil {
globals.SugarLogger.Debugf("errr %v", err)
continue
}
var skuPrice int64 = 0
if payload["unit"] == "份" { // 商品规格等于份的时候,标准重量保持为500g
skuPrice = int64(float64(skuInfo.SpecQuality) / float64(500) * float64(nowPrice))
} else {
skuPrice = nowPrice
}
SetUpdateSkuPriceIfChange(db, skuPrice, nowPrice, skuInfo.Id)
}
var skuPrice int64 = 0
if payload["unit"] == "份" { // 商品规格等于份的时候,标准重量保持为500g
skuPrice = int64(float64(skuInfo.SpecQuality) / float64(500) * float64(nowPrice))
} else {
skuPrice = nowPrice
}
SetUpdateSkuPriceIfChange(db, skuPrice, nowPrice, skuInfo.Id)
}
}

View File

@@ -523,6 +523,7 @@ func setStoreMapInfo(ctx *jxcontext.Context, db *dao.DaoDB, storesInfo *StoresIn
v.IDCardFront = ""
v.IDCardBack = ""
v.IDCardHand = ""
v.IDCardHandBack = ""
v.Licence = ""
v.Licence2Image = ""
}
@@ -3526,7 +3527,7 @@ func GetStoreCategoryMap(ctx *jxcontext.Context, parentID, level int, storeID in
if err != nil {
return nil, err
}
if ctx.GetLoginType() != weixin.AuthTypeMP && ctx.GetLoginType() != weixin.AuthTypeMini && ctx.GetLoginType() != weixin.AuthTypeWxApp && ctx.GetLoginType() != weixin.AuthTypeWxAppCaishi && ctx.GetLoginType() != auth2.AuthTypeMobile {
if ctx.GetLoginType() != auth2.AuthTypePassword && ctx.GetLoginType() != weixin.AuthTypeMP && ctx.GetLoginType() != weixin.AuthTypeMini && ctx.GetLoginType() != weixin.AuthTypeWxApp && ctx.GetLoginType() != weixin.AuthTypeWxAppCaishi && ctx.GetLoginType() != auth2.AuthTypeMobile {
return storeCatMaps, err
}
//表示没有门店分类
@@ -4455,7 +4456,7 @@ func RefreshTiktokShopToken(ctx *jxcontext.Context) (err error) {
v.UpdatedAt = time.Now()
v.StoreBrandName = "定时任务更新"
dao.UpdateEntity(db, v, "Token", "UpdatedAt", "StoreBrandName")
tiktok_store.HttpToGuoYuan(utils.Struct2MapByJson(v), "token")
tiktok_store.HttpToGuoYuan(utils.Struct2MapByJson(v), tiktok_store.CaiShiPushGyTagToken)
}
}
}

View File

@@ -340,10 +340,10 @@ type Store struct {
PrinterSound string `json:"printerSound"` //打印机语音,京西打印机
PrinterTemplate string `json:"printerTemplate"` //打印模板。京西打印机
IDCardFront string `orm:"size(255);column(id_card_front)" json:"idCardFront"`
IDCardBack string `orm:"size(255);column(id_card_back)" json:"idCardBack"`
IDCardHand string `orm:"size(255);column(id_card_hand)" json:"idCardHand"`
Licence string `orm:"size(255)" json:"licence"` // 营业执照图片
IDCardFront string `orm:"size(255);column(id_card_front)" json:"idCardFront"` // 身份证正面
IDCardBack string `orm:"size(255);column(id_card_back)" json:"idCardBack"` // 身份证背面
IDCardHand string `orm:"size(255);column(id_card_hand)" json:"idCardHand"` // 手持身份证正面
Licence string `orm:"size(255)" json:"licence"` // 营业执照图片
LicenceCode string `orm:"size(32)" json:"licenceCode"`
LicenceType int8 `json:"licenceType"` // 营业执照类型0个人1公司
@@ -390,13 +390,14 @@ type Store struct {
OperatorPhone3 string `orm:"size(16)" json:"operatorPhone3"` // 饿百运营人电话
OperatorRole3 string `orm:"size(32)" json:"operatorRole3"` // 饿百运营人组(角色)
PromoteInfo string `orm:"size(255)" json:"promoteInfo"` //门店公告(所有平台统一的公告)
IsBoughtMatter int `json:"isBoughtMatter"` //这周是否申请过物料
SoundPercentage int `json:"soundPercentage"` //打印机声音大小比例
Banner string `orm:"size(9999)" json:"banner"` //门店商城bannar图
BrandID int `orm:"column(brand_id)" json:"brandID"` //品牌ID
IsPrintCancelOrder int `orm:"column(is_print_cancel_order)" json:"isPrintCancelOrder"` //是否打印取消订单1是/-1否
IsPrintRefundOrder int `orm:"column(is_print_refund_order)" json:"isPrintRefundOrder"` //是否打印退款订单1是/-1否
PromoteInfo string `orm:"size(255)" json:"promoteInfo"` //门店公告(所有平台统一的公告)
IsBoughtMatter int `json:"isBoughtMatter"` //这周是否申请过物料
SoundPercentage int `json:"soundPercentage"` //打印机声音大小比例
Banner string `orm:"size(9999)" json:"banner"` //门店商城bannar图
BrandID int `orm:"column(brand_id)" json:"brandID"` //品牌ID
IsPrintCancelOrder int `orm:"column(is_print_cancel_order)" json:"isPrintCancelOrder"` //是否打印取消订单1是/-1否
IsPrintRefundOrder int `orm:"column(is_print_refund_order)" json:"isPrintRefundOrder"` //是否打印退款订单1是/-1否
IDCardHandBack string `orm:"size(255);column(id_card_hand_back)" json:"idCardHandBack"` // 手持身份证背面
}
func (*Store) TableUnique() [][]string {

View File

@@ -1,6 +1,7 @@
package ebai
import (
"errors"
"fmt"
"math"
"strings"
@@ -387,23 +388,36 @@ func (p *PurchaseHandler) ConfirmReceiveGoods(ctx *jxcontext.Context, order *mod
// 将订单从购物平台配送转为自送
func (p *PurchaseHandler) Swtich2SelfDeliver(order *model.GoodsOrder, userName string) (err error) {
if globals.EnableEbaiStoreWrite {
if order.DeliveryType == model.OrderDeliveryTypePlatform {
if err = api.EbaiAPI.OrderSwitchselfdelivery(order.VendorOrderID); err != nil {
if strings.Contains(err.Error(), "301251") {
api.EbaiAPI.OrderCancelDelivery(order.VendorOrderID) // 取消呼叫众包骑手
}
if utils.IsErrMatch(err, "301251", nil) {
if deliveryStatus, err2 := api.EbaiAPI.OrderDeliveryGet(order.VendorOrderID); err2 == nil {
deliveryStatus := utils.Int64ToStr(utils.MustInterface2Int64(deliveryStatus["status"]))
if deliveryStatus == ebaiapi.WaybillStatusSelfDelivery {
err = nil
} else if deliveryStatus == ebaiapi.WaybillStatusDeliveryCancled {
p.trySyncCancelStatus(order.VendorOrderID)
}
}
}
}
deliveryStatusObj, _ := api.EbaiAPI.OrderDeliveryGet(order.VendorOrderID)
deliveryStatus := utils.Int64ToStr(utils.MustInterface2Int64(deliveryStatusObj["status"]))
switch deliveryStatus {
case ebaiapi.WaybillStatusSelfDelivery:
err = nil
case ebaiapi.WaybillStatusDeliveryCancled:
p.trySyncCancelStatus(order.VendorOrderID)
case ebaiapi.WaybillStatusNew, ebaiapi.WaybillStatusRequestDelivery, ebaiapi.WaybillStatusWait4Courier:
err = api.EbaiAPI.OrderCancelDelivery(order.VendorOrderID) // 取消呼叫众包骑手
case ebaiapi.WaybillStatusCourierAccepted:
err = errors.New("骑手已接单,无法转自送")
}
//if order.DeliveryType == model.OrderDeliveryTypePlatform {
// if err = api.EbaiAPI.OrderSwitchselfdelivery(order.VendorOrderID); err != nil {
// if strings.Contains(err.Error(), "301251") {
// api.EbaiAPI.OrderCancelDelivery(order.VendorOrderID) // 取消呼叫众包骑手
// }
// if utils.IsErrMatch(err, "301251", nil) {
// if deliveryStatus, err2 := api.EbaiAPI.OrderDeliveryGet(order.VendorOrderID); err2 == nil {
// deliveryStatus := utils.Int64ToStr(utils.MustInterface2Int64(deliveryStatus["status"]))
// if deliveryStatus == ebaiapi.WaybillStatusSelfDelivery {
// err = nil
// } else if deliveryStatus == ebaiapi.WaybillStatusDeliveryCancled {
// p.trySyncCancelStatus(order.VendorOrderID)
// }
// }
// }
// }
//}
}
if err == nil {
// 饿百不会发送配送中,模拟发送

View File

@@ -6,69 +6,98 @@ import (
"git.rosy.net.cn/baseapi/utils"
"git.rosy.net.cn/jx-callback/business/jxutils"
"git.rosy.net.cn/jx-callback/business/model"
"git.rosy.net.cn/jx-callback/business/model/dao"
"git.rosy.net.cn/jx-callback/globals"
"git.rosy.net.cn/jx-callback/globals/api"
"io/ioutil"
"net/http"
"strings"
"time"
)
// 同一账号下,菜市消息推送到果园
const (
CaiShiPushGyTagOrder = "order" // 订单
CaiShiPushGyTagToken = "token" // 授权
CaiShiPushGyTagDeliveryRegister = "delivery" // 配送注册查询
CaiShiPushGyTagDeliveryDetail = "deliveryDetail" // 配送详情
CaiShiPushGyTagWayBill = "waybill" // 配送
)
// OnOrderMsg 抖音
func OnOrderMsg(msgId string, msg interface{}) (response *tiktokShop.CallbackResponse) {
globals.SugarLogger.Debugf("guoyuan %s,%s", msgId, utils.Format4Output(msg, false))
if CurPurchaseHandler != nil {
orderId, shopId, _ := api.TiktokStore.GetCallbackOrderId(msgId, msg)
globals.SugarLogger.Debugf("order_id %s,%s", orderId, shopId)
//orderDetail, err := GetTiktokApi(utils.Int64ToStr(shopId), 0, "").GetTiktokOrderDetail(orderId)
//if err != nil {
// return tiktokShop.Err2CallbackResponse(err, "")
//}
//vendorStoreID := orderDetail.ShopId
//if vendorStoreID != 0 {
// storeDetail, err := dao.GetStoreDetailByVendorStoreID(dao.GetDB(), utils.Int64ToStr(vendorStoreID), model.VendorIDDD, "")
// if err != nil || storeDetail == nil || storeDetail.Store.ID == 0 {
// // 当前订单所属门店不属于菜市时,将消息推送到果园
// gyMsg := map[string]interface{}{"tag": msgId, "msg_id": utils.Int64ToStr(time.Now().Unix()) + msgId, "data": msg}
// // 通知到果园
// gyResult, err := HttpToGuoYuan(gyMsg, "order")
// if err != nil {
// return tiktokShop.Err2CallbackResponse(err, "")
// }
// result, _ := ioutil.ReadAll(gyResult.Body)
// var guoYuan *tiktokShop.CallbackResponse
// if err := json.Unmarshal(result, guoYuan); err != nil {
// return tiktokShop.Err2CallbackResponse(err, "")
// }
// return guoYuan
// }
//}
globals.SugarLogger.Debugf("order_id %s,%d", orderId, shopId)
orderDetail, err := GetTiktokApi(utils.Int64ToStr(shopId), 0, "").GetTiktokOrderDetail(orderId)
if err != nil {
return tiktokShop.Err2CallbackResponse(err, "")
}
vendorStoreID := orderDetail.SkuOrderList[0].StoreInfo.StoreId
if vendorStoreID != "" {
storeDetail, err := dao.GetStoreDetailByVendorStoreID(dao.GetDB(), vendorStoreID, model.VendorIDDD, "")
if err != nil || storeDetail == nil || storeDetail.Store.ID == 0 {
// 当前订单所属门店不属于菜市时,将消息推送到果园
gyMsg := map[string]interface{}{"tag": msgId, "msg_id": utils.Int64ToStr(time.Now().Unix()) + msgId, "data": msg}
// 通知到果园
gyResult, err := HttpToGuoYuan(gyMsg, CaiShiPushGyTagOrder)
if err != nil {
return tiktokShop.Err2CallbackResponse(err, "")
}
result, _ := ioutil.ReadAll(gyResult.Body)
var guoYuan *tiktokShop.CallbackResponse
if err2 := json.Unmarshal(result, guoYuan); err2 != nil {
return tiktokShop.Err2CallbackResponse(err2, "")
}
return guoYuan
}
}
jxutils.CallMsgHandler(func() {
response = CurPurchaseHandler.onOrderMsg(msgId, orderId, msg)
}, jxutils.ComposeUniversalOrderID(orderId, model.VendorIDDD))
} else {
globals.SugarLogger.Debugf("============2")
}
return response
}
func HttpToGuoYuan(param map[string]interface{}, requestType string) (*http.Response, error) {
globals.SugarLogger.Debugf("=========param %s", utils.Format4Output(param, false))
paramData, err := json.Marshal(param)
if err != nil {
return nil, err
var paramData []byte
var err error
if requestType == "order" {
param["data"] = utils.Format4Output(param["data"], false)
paramData, err = json.Marshal([]interface{}{param})
if err != nil {
return nil, err
}
} else {
paramData, err = json.Marshal(param)
if err != nil {
return nil, err
}
}
body := strings.NewReader(string(paramData))
url := ""
switch requestType {
case "order": // 订单相关
case CaiShiPushGyTagOrder: // 订单相关
url = "http://callback-jxgy.jxc4.com/tiktok/callbackTiktokOrderMsg"
case "token": // 授权相关
case CaiShiPushGyTagToken: // 授权相关
url = "http://callback-jxgy.jxc4.com/tiktokShop/jxcsToGyTiktokToken"
case "wayBill": // 运单消息
case CaiShiPushGyTagDeliveryRegister: // 配送查询注册
url = "http://callback-jxgy.jxc4.com/logistics/logisticsRegister"
case CaiShiPushGyTagDeliveryDetail: // 配送查询详情
url = "http://callback-jxgy.jxc4.com/logistics/logisticsQuery"
case CaiShiPushGyTagWayBill: // 运单消息
}
httpReq, err := http.NewRequest(http.MethodPost, url, body)
if err != nil {
return nil, err
}
httpReq.Header.Set("Content-Type", "application/json")
httpRes, err := http.DefaultClient.Do(httpReq)

View File

@@ -47,7 +47,7 @@ func (c *PurchaseHandler) GetVendorID() int {
}
func (p *PurchaseHandler) GetVendorCategories(ctx *jxcontext.Context) (vendorCats []*model.SkuVendorCategory, err error) {
cats, err := getAPI("57939570", 0, "").GetShopCategory(0)
cats, err := getAPI("68023619", 0, "").GetShopCategory(0)
if err != nil {
return nil, err
}

View File

@@ -722,6 +722,9 @@ func CreateSaleTemp(storeId int64, api *tiktokShop.API) (int64, error) {
// GetDeliveryTemp 获取运费模板id,运费模板不存在则创建
func GetDeliveryTemp(api *tiktokShop.API, vendorStoreID string, storeDetail *dao.StoreDetail) (int64, error) {
if vendorStoreID == "" {
return 0, errors.New("平台门店id未绑定")
}
// 没有模板是查询线上模板
freightId, _ := api.GetStoreBindTemp(utils.Str2Int64(vendorStoreID))
if freightId == 0 {

View File

@@ -7,7 +7,7 @@ import (
"git.rosy.net.cn/baseapi/utils"
"git.rosy.net.cn/jx-callback/business/model"
"git.rosy.net.cn/jx-callback/business/model/dao"
"git.rosy.net.cn/jx-callback/globals"
"git.rosy.net.cn/jx-callback/business/partner/purchase/tiktok_store"
"github.com/astaxie/beego/server/web"
"io/ioutil"
"time"
@@ -58,8 +58,32 @@ func (c *LogisticsController) LogisticsRegister() {
}
// 查询订单的运单是否存在
data, err := dao.GetWayBillsByWayBillId(dao.GetDB(), register.TrackNo)
if err != nil {
globals.SugarLogger.Debugf("根据单号查询运单数据错误:%s", err)
// 此订单可能是果园订单
if web.BConfig.RunMode != "jxgy" && (len(data) == 0 || err != nil) {
resp, err := tiktok_store.HttpToGuoYuan(utils.Struct2Map(register, "", true), tiktok_store.CaiShiPushGyTagDeliveryRegister)
if err != nil {
c.Data["json"] = LogisticsRegisterResp{
Result: false,
ReturnCode: "1002",
Message: "单号不存在",
}
c.ServeJSON()
return
}
gyData := &LogisticsRegisterResp{}
gyBody, _ := ioutil.ReadAll(resp.Body)
if err := json.Unmarshal(gyBody, gyData); err != nil {
c.Data["json"] = LogisticsRegisterResp{
Result: false,
ReturnCode: "1002",
Message: "单号不存在",
}
c.ServeJSON()
return
}
c.Data["json"] = gyData
c.ServeJSON()
}
if len(data) == 0 || err != nil {
@@ -156,14 +180,30 @@ func (c *LogisticsController) LogisticsQuery() {
// 查询订单的运单是否存在
data, err := dao.GetWayBillsByWayBillId(dao.GetDB(), param.TrackNo)
if err != nil || len(data) == 0 {
c.Data["json"] = LogisticsQueryRest{
Result: false,
ReturnCode: "1002",
Message: "运单账号不存在",
if (err != nil || len(data) == 0) && web.BConfig.RunMode != "jxgy" {
resp, err := tiktok_store.HttpToGuoYuan(utils.Struct2Map(param, "", true), tiktok_store.CaiShiPushGyTagDeliveryDetail)
if err != nil {
c.Data["json"] = LogisticsQueryRest{
Result: false,
ReturnCode: "1002",
Message: "运单账号不存在",
}
c.ServeJSON()
return
}
wayBillDetail := &LogisticsQueryRest{}
gyBody, _ := ioutil.ReadAll(resp.Body)
if err := json.Unmarshal(gyBody, wayBillDetail); err != nil {
c.Data["json"] = LogisticsQueryRest{
Result: false,
ReturnCode: "1002",
Message: "json unmarshal",
}
c.ServeJSON()
return
}
c.Data["json"] = wayBillDetail
c.ServeJSON()
return
}
returnParam := &LogisticsQueryRest{

View File

@@ -2,7 +2,9 @@ package controllers
import (
"git.rosy.net.cn/baseapi/platformapi/tiktok_shop/tiktok_api"
"git.rosy.net.cn/baseapi/utils"
"git.rosy.net.cn/jx-callback/business/partner/purchase/tiktok_store"
"git.rosy.net.cn/jx-callback/globals"
"git.rosy.net.cn/jx-callback/globals/api"
"github.com/astaxie/beego/server/web"
"strings"
@@ -21,6 +23,7 @@ func (t *TiktokController) CallbackTiktokOrderMsg() {
t.ServeJSON()
return
}
if strings.Contains(string(byteList), "\"msg_id\":\"0\"") {
t.Data["json"] = tiktok_api.CallbackResponse{Code: tiktok_api.CallbackSuccessCode, Msg: tiktok_api.CallbackSuccess}
t.ServeJSON()
@@ -29,6 +32,7 @@ func (t *TiktokController) CallbackTiktokOrderMsg() {
// 2.参数解析
orderStatus, resp := api.TiktokStore.CreateOrderCallback(byteList)
globals.SugarLogger.Debugf("orderStatus %s,%s", utils.Format4Output(orderStatus, false), utils.Format4Output(resp, false))
if resp.Code != 0 {
t.Data["json"] = resp
t.ServeJSON()

View File

@@ -154,6 +154,7 @@ func (c *TiktokShopController) TokenMsg() {
c.ServeJSON()
}
// JxcsToGyTiktokToken 果园京西速食接受token更新
func (c *TiktokShopController) JxcsToGyTiktokToken() {
data, err := ioutil.ReadAll(c.Ctx.Request.Body)
if err != nil {