Merge branch 'jdshop' of e.coding.net:rosydev/jx-callback into jdshop
This commit is contained in:
@@ -8,6 +8,8 @@ import (
|
|||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
"git.rosy.net.cn/baseapi/platformapi/baidunavi"
|
||||||
|
|
||||||
"git.rosy.net.cn/jx-callback/business/partner/purchase/ebai"
|
"git.rosy.net.cn/jx-callback/business/partner/purchase/ebai"
|
||||||
|
|
||||||
"git.rosy.net.cn/baseapi/utils/errlist"
|
"git.rosy.net.cn/baseapi/utils/errlist"
|
||||||
@@ -583,3 +585,23 @@ func GetCityBankBranches(ctx *jxcontext.Context, cityCode int, bankCode string)
|
|||||||
}
|
}
|
||||||
return info, err
|
return info, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// GetSToUWalkingDistance 获取商家与用户间步行距离
|
||||||
|
func GetSToURidingDistance(sLng, sLat, uLng, uLat float64) (stepInfo interface{}, err error) {
|
||||||
|
var coords []*baidunavi.Coordinate
|
||||||
|
coords = append(coords, &baidunavi.Coordinate{
|
||||||
|
Lng: sLng,
|
||||||
|
Lat: sLat,
|
||||||
|
}, &baidunavi.Coordinate{
|
||||||
|
Lat: uLat,
|
||||||
|
Lng: uLng,
|
||||||
|
})
|
||||||
|
if coords, err = api.BaiDuNaviAPI.BatchCoordinateConvert(coords, baidunavi.CoordSysGCJ02, baidunavi.CoordSysBaiDu); err == nil {
|
||||||
|
if len(coords) > 0 {
|
||||||
|
if stepInfo, err = api.BaiDuNaviAPI.DirectionLiteRide(coords); err == nil && stepInfo.(string) != "" {
|
||||||
|
return stepInfo, nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 0, err
|
||||||
|
}
|
||||||
|
|||||||
@@ -4,7 +4,6 @@ import (
|
|||||||
"encoding/json"
|
"encoding/json"
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"git.rosy.net.cn/jx-callback/globals/api/apimanager"
|
|
||||||
"io"
|
"io"
|
||||||
"math"
|
"math"
|
||||||
"mime/multipart"
|
"mime/multipart"
|
||||||
@@ -14,6 +13,8 @@ import (
|
|||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
"git.rosy.net.cn/jx-callback/globals/api/apimanager"
|
||||||
|
|
||||||
beego "github.com/astaxie/beego/server/web"
|
beego "github.com/astaxie/beego/server/web"
|
||||||
|
|
||||||
"git.rosy.net.cn/baseapi/platformapi/aliupcapi"
|
"git.rosy.net.cn/baseapi/platformapi/aliupcapi"
|
||||||
@@ -1323,7 +1324,27 @@ func updateOrCreateSkuVendorCategoryMap(db *dao.DaoDB, ctx *jxcontext.Context, n
|
|||||||
ddCategoryID = value
|
ddCategoryID = value
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
ddCategoryID = getCategoryByImg(payload["descImg"].(string), payload["img"].(string), payload["img2"].(string), payload["img3"].(string), payload["img4"].(string), payload["img5"].(string))
|
imgs := make([]string, 0)
|
||||||
|
if payload["descImg"] != nil {
|
||||||
|
imgs = append(imgs, payload["descImg"].(string))
|
||||||
|
}
|
||||||
|
if payload["img"] != "" {
|
||||||
|
imgs = append(imgs, payload["descImg"].(string))
|
||||||
|
}
|
||||||
|
if payload["img2"] != "" {
|
||||||
|
imgs = append(imgs, payload["img2"].(string))
|
||||||
|
}
|
||||||
|
if payload["img3"] != "" {
|
||||||
|
imgs = append(imgs, payload["img3"].(string))
|
||||||
|
}
|
||||||
|
if payload["img4"] != "" {
|
||||||
|
imgs = append(imgs, payload["img4"].(string))
|
||||||
|
}
|
||||||
|
if payload["img5"] != "" {
|
||||||
|
imgs = append(imgs, payload["img5"].(string))
|
||||||
|
}
|
||||||
|
ddCategoryID = getCategoryByImg(imgs...)
|
||||||
|
//ddCategoryID = getCategoryByImg(payload["descImg"].(string), payload["img"].(string), payload["img2"].(string), payload["img3"].(string), payload["img4"].(string), payload["img5"].(string))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -4,8 +4,6 @@ import (
|
|||||||
"bytes"
|
"bytes"
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"git.rosy.net.cn/jx-callback/business/partner/purchase/mtwm"
|
|
||||||
"git.rosy.net.cn/jx-callback/business/partner/purchase/tiktok_store"
|
|
||||||
"io"
|
"io"
|
||||||
"math"
|
"math"
|
||||||
"mime/multipart"
|
"mime/multipart"
|
||||||
@@ -16,6 +14,9 @@ import (
|
|||||||
"time"
|
"time"
|
||||||
"unicode"
|
"unicode"
|
||||||
|
|
||||||
|
"git.rosy.net.cn/jx-callback/business/partner/purchase/mtwm"
|
||||||
|
"git.rosy.net.cn/jx-callback/business/partner/purchase/tiktok_store"
|
||||||
|
|
||||||
"git.rosy.net.cn/baseapi/platformapi/mtwmapi"
|
"git.rosy.net.cn/baseapi/platformapi/mtwmapi"
|
||||||
|
|
||||||
"git.rosy.net.cn/jx-callback/business/auth2"
|
"git.rosy.net.cn/jx-callback/business/auth2"
|
||||||
@@ -394,7 +395,11 @@ func GetStoresSkusForStore(ctx *jxcontext.Context, storeID int, isFocus, isAct b
|
|||||||
sqlParams = append(sqlParams, pageSize, offset)
|
sqlParams = append(sqlParams, pageSize, offset)
|
||||||
txDB, _ := dao.Begin(db)
|
txDB, _ := dao.Begin(db)
|
||||||
defer dao.Commit(db, txDB)
|
defer dao.Commit(db, txDB)
|
||||||
|
|
||||||
|
//globals.SugarLogger.Debugf("store_sku 检查:sql:%s sqlParams:%s", sql, sqlParams)
|
||||||
|
|
||||||
if err = dao.GetRowsTx(txDB, &SkuNames, sql, sqlParams...); err == nil {
|
if err = dao.GetRowsTx(txDB, &SkuNames, sql, sqlParams...); err == nil {
|
||||||
|
//globals.SugarLogger.Debugf(" 检查参数:SkuNames:%s", utils.Format4Output(SkuNames, false))
|
||||||
skuNamesInfo = &dao.StoreSkuNamesInfo2{
|
skuNamesInfo = &dao.StoreSkuNamesInfo2{
|
||||||
TotalCount: dao.GetLastTotalRowCount2(db, txDB),
|
TotalCount: dao.GetLastTotalRowCount2(db, txDB),
|
||||||
}
|
}
|
||||||
@@ -403,13 +408,21 @@ func GetStoresSkusForStore(ctx *jxcontext.Context, storeID int, isFocus, isAct b
|
|||||||
func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) {
|
func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) {
|
||||||
v := batchItemList[0].(*dao.StoreSkuNameExt2)
|
v := batchItemList[0].(*dao.StoreSkuNameExt2)
|
||||||
var skus []*dao.StoreSkuExt
|
var skus []*dao.StoreSkuExt
|
||||||
|
// sql2 := `
|
||||||
|
// SELECT a.id sku_id, a.spec_quality sku_spec_quality, a.spec_unit sku_spec_unit, a.status sku_status, a.comment,
|
||||||
|
// b.stock, b.price bind_price, b.unit_price,
|
||||||
|
// b.status store_sku_status
|
||||||
|
// FROM sku a
|
||||||
|
// JOIN sku_name c ON a.name_id = c.id AND c.deleted_at = ? AND c.status = ?
|
||||||
|
//`
|
||||||
sql2 := `
|
sql2 := `
|
||||||
SELECT a.id sku_id, a.spec_quality sku_spec_quality, a.spec_unit sku_spec_unit, a.status sku_status, a.comment,
|
SELECT a.id sku_id, a.spec_quality sku_spec_quality, a.spec_unit sku_spec_unit, a.status sku_status, a.comment,
|
||||||
b.stock, b.price bind_price, b.unit_price,
|
b.stock, b.price bind_price, b.unit_price,b.jd_sync_status,b.mtwm_id,b.mtwm_sync_status,b.ebai_id,b.ebai_sync_status,
|
||||||
b.status store_sku_status
|
b.status store_sku_status
|
||||||
FROM sku a
|
FROM sku a
|
||||||
JOIN sku_name c ON a.name_id = c.id AND c.deleted_at = ? AND c.status = ?
|
JOIN sku_name c ON a.name_id = c.id AND c.deleted_at = ? AND c.status = ?
|
||||||
`
|
`
|
||||||
|
|
||||||
sqlParams2 := []interface{}{
|
sqlParams2 := []interface{}{
|
||||||
utils.DefaultTimeValue, model.SkuStatusNormal,
|
utils.DefaultTimeValue, model.SkuStatusNormal,
|
||||||
}
|
}
|
||||||
@@ -428,7 +441,9 @@ func GetStoresSkusForStore(ctx *jxcontext.Context, storeID int, isFocus, isAct b
|
|||||||
sql2 += " AND b.status = ?"
|
sql2 += " AND b.status = ?"
|
||||||
sqlParams2 = append(sqlParams2, status)
|
sqlParams2 = append(sqlParams2, status)
|
||||||
}
|
}
|
||||||
|
//globals.SugarLogger.Debugf("store_sku 检查:sql2:%s sqlParams2:%s", sql2, sqlParams2)
|
||||||
if err = dao.GetRows(db, &skus, sql2, sqlParams2); err == nil {
|
if err = dao.GetRows(db, &skus, sql2, sqlParams2); err == nil {
|
||||||
|
//globals.SugarLogger.Debugf(" 检查参数:skus:%s", utils.Format4Output(skus, false))
|
||||||
v.Skus = skus
|
v.Skus = skus
|
||||||
}
|
}
|
||||||
return retVal, err
|
return retVal, err
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ const (
|
|||||||
SoundsFileNewOrder = "newOrder.caf"
|
SoundsFileNewOrder = "newOrder.caf"
|
||||||
SoundsFileNewAfsOrder = "afsOrder.caf"
|
SoundsFileNewAfsOrder = "afsOrder.caf"
|
||||||
SoundsFileNewCancelOrder = "cancelOrder.caf"
|
SoundsFileNewCancelOrder = "cancelOrder.caf"
|
||||||
SoundsFileNewImMsg = "" //TODO 待定
|
SoundsFileNewImMsg = "newMsg.caf"
|
||||||
)
|
)
|
||||||
|
|
||||||
// NotifyNewOrder 推送新订单
|
// NotifyNewOrder 推送新订单
|
||||||
@@ -116,19 +116,11 @@ func NotifyImNewMessage(vendorStoreID string, vendorID int) error {
|
|||||||
if len(vendorStoreID) == 0 {
|
if len(vendorStoreID) == 0 {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
var (
|
var msg = MsgContext{}
|
||||||
temp = 0
|
|
||||||
msg = MsgContext{}
|
|
||||||
)
|
|
||||||
if vendorID == 10 { //美团
|
|
||||||
temp = 1
|
|
||||||
} else if vendorID == 11 { //饿了么
|
|
||||||
temp = 3
|
|
||||||
}
|
|
||||||
|
|
||||||
store, err := dao.GetStoreBaseByVendorStoreID(vendorStoreID, temp)
|
store, err := dao.GetStoreBaseByVendorStoreID(vendorStoreID, vendorID)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("未查到此门店:%s", vendorStoreID)
|
return fmt.Errorf("未查到此门店/门店未与平台正常绑定:%s", vendorStoreID)
|
||||||
}
|
}
|
||||||
|
|
||||||
cid, err := GetStoreBoosCID(store.ID)
|
cid, err := GetStoreBoosCID(store.ID)
|
||||||
@@ -138,13 +130,12 @@ func NotifyImNewMessage(vendorStoreID string, vendorID int) error {
|
|||||||
}
|
}
|
||||||
fmt.Print(cid)
|
fmt.Print(cid)
|
||||||
msg.MsgType = "newImMsg"
|
msg.MsgType = "newImMsg"
|
||||||
msg.VendorName = model.VendorChineseNames[temp]
|
msg.VendorName = model.VendorChineseNames[vendorID]
|
||||||
msg.StoreTitle = store.Name
|
msg.StoreTitle = store.Name
|
||||||
msg.Context = "老板,你有新的用户消息,请及时查看!"
|
msg.Context = "老板,你有新的用户消息,请及时查看!"
|
||||||
context, _ := json.Marshal(msg)
|
context, _ := json.Marshal(msg)
|
||||||
body := fmt.Sprintf(msg.Context+"(%s)", model.VendorChineseNames[temp])
|
|
||||||
|
|
||||||
pushMsgByUniApp(store.ID, store.Name, cid, string(context), body, SoundsFileNewImMsg)
|
pushMsgByUniApp(store.ID, store.Name, cid, string(context), "", SoundsFileNewImMsg)
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -3,10 +3,11 @@ package weixinmsg
|
|||||||
import (
|
import (
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"fmt"
|
"fmt"
|
||||||
"git.rosy.net.cn/baseapi/platformapi/weixinapi"
|
|
||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
"git.rosy.net.cn/baseapi/platformapi/weixinapi"
|
||||||
|
|
||||||
beego "github.com/astaxie/beego/server/web"
|
beego "github.com/astaxie/beego/server/web"
|
||||||
|
|
||||||
"git.rosy.net.cn/jx-callback/business/auth2/authprovider/weixin"
|
"git.rosy.net.cn/jx-callback/business/auth2/authprovider/weixin"
|
||||||
@@ -48,6 +49,7 @@ const (
|
|||||||
WX_TEMPLATE_VENDERCOLOR_ELM = "#0191EA" //蓝色
|
WX_TEMPLATE_VENDERCOLOR_ELM = "#0191EA" //蓝色
|
||||||
WX_TEMPLATE_VENDERCOLOR_BAD_COMMENTS = "#4F4DA0"
|
WX_TEMPLATE_VENDERCOLOR_BAD_COMMENTS = "#4F4DA0"
|
||||||
|
|
||||||
|
WX_NEWORDER_TEMPLATE_ID2 = "b8-tLyWwAmK-1tEU1eGqp_YAAqQtSzoVDZkHuyUe9lk" //微信新订单推送2
|
||||||
WX_NEWORDER_TEMPLATE_ID = "_DtNGwmOeR6TkkTVUblxLIlkV2MAPOX57TkvfdqG6nY" //微信新订单推送
|
WX_NEWORDER_TEMPLATE_ID = "_DtNGwmOeR6TkkTVUblxLIlkV2MAPOX57TkvfdqG6nY" //微信新订单推送
|
||||||
WX_ADJUSTORDER_TEMPLATE_ID = "N5rmV2-PDf3opjkv23IdLc76VnFThr_uOKSh5FzT13M" //微信调整订单推送
|
WX_ADJUSTORDER_TEMPLATE_ID = "N5rmV2-PDf3opjkv23IdLc76VnFThr_uOKSh5FzT13M" //微信调整订单推送
|
||||||
WX_MTPS_DELIVERY_GRABDONE_TEMPLATE_ID = "h4dkON6AgnHz1XmaksEUB_8Bcir4V8MSexUhC149pPE" //微信美团配送员接单推送
|
WX_MTPS_DELIVERY_GRABDONE_TEMPLATE_ID = "h4dkON6AgnHz1XmaksEUB_8Bcir4V8MSexUhC149pPE" //微信美团配送员接单推送
|
||||||
@@ -197,6 +199,7 @@ func getOrderDetailBrief(order *model.GoodsOrder) (brief string) {
|
|||||||
return sb.String()
|
return sb.String()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//新订单推送模板2
|
||||||
func NotifyNewOrder(order *model.GoodsOrder) (err error) {
|
func NotifyNewOrder(order *model.GoodsOrder) (err error) {
|
||||||
if order.VendorID == model.VendorIDELM {
|
if order.VendorID == model.VendorIDELM {
|
||||||
return nil
|
return nil
|
||||||
@@ -210,49 +213,97 @@ func NotifyNewOrder(order *model.GoodsOrder) (err error) {
|
|||||||
globals.SugarLogger.Infof("NotifyNewOrder orderID:%s is not solid", order.VendorOrderID)
|
globals.SugarLogger.Infof("NotifyNewOrder orderID:%s is not solid", order.VendorOrderID)
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
suffix := ""
|
|
||||||
storeDetail, err := dao.GetStoreDetail(dao.GetDB(), jxutils.GetSaleStoreIDFromOrder(order), order.VendorID, "")
|
storeDetail, err := dao.GetStoreDetail(dao.GetDB(), jxutils.GetSaleStoreIDFromOrder(order), order.VendorID, "")
|
||||||
if err == nil && storeDetail != nil {
|
|
||||||
suffix = storeDetail.CityName + "," + storeDetail.Name
|
var expectedDeliveredTime = ""
|
||||||
|
if utils.Time2Str(order.ExpectedDeliveredTime) == "1970-01-01 00:00:00" || len(utils.Time2Str(order.ExpectedDeliveredTime)) == 0 {
|
||||||
|
expectedDeliveredTime = "立即送"
|
||||||
|
} else {
|
||||||
|
expectedDeliveredTime = "预定单"
|
||||||
}
|
}
|
||||||
sb := new(strings.Builder)
|
|
||||||
sb.WriteString(suffix + "老板,")
|
|
||||||
sb.WriteString(order.ConsigneeName)
|
|
||||||
sb.WriteString("购买了商品")
|
|
||||||
sb.WriteString(getOrderDetailBrief(order))
|
|
||||||
data := map[string]interface{}{
|
data := map[string]interface{}{
|
||||||
"first": map[string]interface{}{
|
"keyword1": map[string]interface{}{ //订单来源
|
||||||
"value": sb.String(),
|
"value": fmt.Sprintf("%s #%d", model.VendorChineseNames[order.VendorID], order.OrderSeq),
|
||||||
"color": WX_NEW_ORDER_TEMPLATE_COLOR,
|
|
||||||
},
|
|
||||||
"Day": map[string]interface{}{
|
|
||||||
"value": FormatDeliveryTime(order),
|
|
||||||
"color": WX_NEW_ORDER_TEMPLATE_COLOR,
|
|
||||||
},
|
|
||||||
"orderId": map[string]interface{}{
|
|
||||||
"value": order.VendorOrderID,
|
|
||||||
"color": WX_NEW_ORDER_TEMPLATE_COLOR,
|
|
||||||
},
|
|
||||||
"orderType": map[string]interface{}{
|
|
||||||
"value": fmt.Sprintf("%s 第%d号订单", model.VendorChineseNames[order.VendorID], order.OrderSeq),
|
|
||||||
"color": VendorColors[order.VendorID],
|
"color": VendorColors[order.VendorID],
|
||||||
},
|
},
|
||||||
"customerName": map[string]interface{}{
|
"keyword2": map[string]interface{}{ //商家信息
|
||||||
"value": order.ConsigneeName,
|
"value": storeDetail.Name,
|
||||||
"color": WX_NEW_ORDER_TEMPLATE_COLOR,
|
"color": WX_NEW_ORDER_TEMPLATE_COLOR,
|
||||||
},
|
},
|
||||||
"customerPhone": map[string]interface{}{
|
"keyword3": map[string]interface{}{ //顾客信息
|
||||||
"value": order.ConsigneeMobile,
|
"value": order.ConsigneeName + " " + order.ConsigneeMobile,
|
||||||
|
"color": WX_NEW_ORDER_TEMPLATE_COLOR,
|
||||||
|
},
|
||||||
|
"keyword4": map[string]interface{}{ //下单时间及金额
|
||||||
|
"value": utils.Time2Str(order.CreatedAt),
|
||||||
|
"color": WX_NEW_ORDER_TEMPLATE_COLOR,
|
||||||
|
},
|
||||||
|
"keyword5": map[string]interface{}{ //配送时间
|
||||||
|
"value": expectedDeliveredTime,
|
||||||
"color": WX_NEW_ORDER_TEMPLATE_COLOR,
|
"color": WX_NEW_ORDER_TEMPLATE_COLOR,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
storeID := jxutils.GetSaleStoreIDFromOrder(order)
|
storeID := jxutils.GetSaleStoreIDFromOrder(order)
|
||||||
//return SendMsgToStore(storeID, WX_NEWORDER_TEMPLATE_ID, globals.WxBackstageHost+fmt.Sprintf("%s%d", WX_TO_ORDER_PAGE_URL, storeID), WX_MINI_TO_ORDER_PAGE_URL+fmt.Sprintf("?jxStoreId=%v", storeID), data)
|
return SendMsgToStore(storeID, WX_NEWORDER_TEMPLATE_ID2, globals.WxBackstageHost+fmt.Sprintf("%s%d", WX_TO_ORDER_PAGE_URL, storeID), WX_MINI_TO_ORDER_PAGE_URL, data)
|
||||||
//dataStore := fmt.Sprintf(`{"address":"%s","cityName":"%s","id":%d,"name":"%s","payeeName":"%s","status":%d,"tel1":"%s","tel2":"%s"}`, storeDetail.Address, storeDetail.CityName, storeDetail.ID, storeDetail.Name, storeDetail.PayeeName, storeDetail.Status, storeDetail.Tel1, storeDetail.Tel2)
|
|
||||||
//url := WX_MINI_TO_ORDER_PAGE_URL + fmt.Sprintf("?jxStoreId=%v&data=%v", storeID, dataStore)
|
|
||||||
return SendMsgToStore(storeID, WX_NEWORDER_TEMPLATE_ID, globals.WxBackstageHost+fmt.Sprintf("%s%d", WX_TO_ORDER_PAGE_URL, storeID), WX_MINI_TO_ORDER_PAGE_URL, data)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//func NotifyNewOrder(order *model.GoodsOrder) (err error) {
|
||||||
|
// if order.VendorID == model.VendorIDELM {
|
||||||
|
// return nil
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// if len(order.Skus) == 0 {
|
||||||
|
// return nil
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// if !model.IsOrderSolid(order) {
|
||||||
|
// globals.SugarLogger.Infof("NotifyNewOrder orderID:%s is not solid", order.VendorOrderID)
|
||||||
|
// return nil
|
||||||
|
// }
|
||||||
|
// suffix := ""
|
||||||
|
// storeDetail, err := dao.GetStoreDetail(dao.GetDB(), jxutils.GetSaleStoreIDFromOrder(order), order.VendorID, "")
|
||||||
|
// if err == nil && storeDetail != nil {
|
||||||
|
// suffix = storeDetail.CityName + "," + storeDetail.Name
|
||||||
|
// }
|
||||||
|
// sb := new(strings.Builder)
|
||||||
|
// sb.WriteString(suffix + "老板,")
|
||||||
|
// sb.WriteString(order.ConsigneeName)
|
||||||
|
// sb.WriteString("购买了商品")
|
||||||
|
// sb.WriteString(getOrderDetailBrief(order))
|
||||||
|
// data := map[string]interface{}{
|
||||||
|
// "first": map[string]interface{}{
|
||||||
|
// "value": sb.String(),
|
||||||
|
// "color": WX_NEW_ORDER_TEMPLATE_COLOR,
|
||||||
|
// },
|
||||||
|
// "Day": map[string]interface{}{
|
||||||
|
// "value": FormatDeliveryTime(order),
|
||||||
|
// "color": WX_NEW_ORDER_TEMPLATE_COLOR,
|
||||||
|
// },
|
||||||
|
// "orderId": map[string]interface{}{
|
||||||
|
// "value": order.VendorOrderID,
|
||||||
|
// "color": WX_NEW_ORDER_TEMPLATE_COLOR,
|
||||||
|
// },
|
||||||
|
// "orderType": map[string]interface{}{
|
||||||
|
// "value": fmt.Sprintf("%s 第%d号订单", model.VendorChineseNames[order.VendorID], order.OrderSeq),
|
||||||
|
// "color": VendorColors[order.VendorID],
|
||||||
|
// },
|
||||||
|
// "customerName": map[string]interface{}{
|
||||||
|
// "value": order.ConsigneeName,
|
||||||
|
// "color": WX_NEW_ORDER_TEMPLATE_COLOR,
|
||||||
|
// },
|
||||||
|
// "customerPhone": map[string]interface{}{
|
||||||
|
// "value": order.ConsigneeMobile,
|
||||||
|
// "color": WX_NEW_ORDER_TEMPLATE_COLOR,
|
||||||
|
// },
|
||||||
|
// }
|
||||||
|
// storeID := jxutils.GetSaleStoreIDFromOrder(order)
|
||||||
|
// //return SendMsgToStore(storeID, WX_NEWORDER_TEMPLATE_ID, globals.WxBackstageHost+fmt.Sprintf("%s%d", WX_TO_ORDER_PAGE_URL, storeID), WX_MINI_TO_ORDER_PAGE_URL+fmt.Sprintf("?jxStoreId=%v", storeID), data)
|
||||||
|
// //dataStore := fmt.Sprintf(`{"address":"%s","cityName":"%s","id":%d,"name":"%s","payeeName":"%s","status":%d,"tel1":"%s","tel2":"%s"}`, storeDetail.Address, storeDetail.CityName, storeDetail.ID, storeDetail.Name, storeDetail.PayeeName, storeDetail.Status, storeDetail.Tel1, storeDetail.Tel2)
|
||||||
|
// //url := WX_MINI_TO_ORDER_PAGE_URL + fmt.Sprintf("?jxStoreId=%v&data=%v", storeID, dataStore)
|
||||||
|
// return SendMsgToStore(storeID, WX_NEWORDER_TEMPLATE_ID, globals.WxBackstageHost+fmt.Sprintf("%s%d", WX_TO_ORDER_PAGE_URL, storeID), WX_MINI_TO_ORDER_PAGE_URL, data)
|
||||||
|
//}
|
||||||
|
|
||||||
func NotifyWaybillStatus(bill *model.Waybill, order *model.GoodsOrder, isBillAlreadyCandidate bool) (err error) {
|
func NotifyWaybillStatus(bill *model.Waybill, order *model.GoodsOrder, isBillAlreadyCandidate bool) (err error) {
|
||||||
if order.VendorID == model.VendorIDELM {
|
if order.VendorID == model.VendorIDELM {
|
||||||
return nil
|
return nil
|
||||||
|
|||||||
@@ -2,9 +2,6 @@ package model
|
|||||||
|
|
||||||
// VendorIDJD, VendorIDMTWM与VendorIDELM的定义和老系统是兼容的
|
// VendorIDJD, VendorIDMTWM与VendorIDELM的定义和老系统是兼容的
|
||||||
const (
|
const (
|
||||||
IMVendorIDMT = "10" //美团IM
|
|
||||||
IMVendorIDELM = "11" //饿了么im
|
|
||||||
|
|
||||||
VendorTypeUnknown = 0 // 未知
|
VendorTypeUnknown = 0 // 未知
|
||||||
VendorTypePurchase = 1 // 购物平台
|
VendorTypePurchase = 1 // 购物平台
|
||||||
VendorTypeDelivery = 2 // 快递平台
|
VendorTypeDelivery = 2 // 快递平台
|
||||||
|
|||||||
@@ -1654,9 +1654,9 @@ func GetStoreBaseByVendorStoreID(vendorStoreID string, vendorID int) (storeDetai
|
|||||||
return nil, errors.New("vendorStoreID不能为空")
|
return nil, errors.New("vendorStoreID不能为空")
|
||||||
}
|
}
|
||||||
|
|
||||||
DefaultTimeValue := utils.Str2Time("1970-01-01 00:00:00")
|
//DefaultTimeValue := utils.Str2Time("1970-01-01 00:00:00")
|
||||||
sql := `SELECT t.* FROM store t WHERE t.id = (SELECT s.store_id FROM store_map s WHERE s.vendor_store_id= ? AND s.vendor_id= ? AND s.deleted_at= ? )`
|
sql := `SELECT t.* FROM store t WHERE t.id = (SELECT s.store_id FROM store_map s WHERE s.vendor_store_id= ? AND s.vendor_id= ? AND s.deleted_at= '1970-01-01 00:00:00' )`
|
||||||
if err := GetRow(GetDB(), &storeDetail, sql, []interface{}{vendorStoreID, vendorID, DefaultTimeValue}); err != nil {
|
if err := GetRow(GetDB(), &storeDetail, sql, []interface{}{vendorStoreID, vendorID}); err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
return storeDetail, err
|
return storeDetail, err
|
||||||
|
|||||||
@@ -23,8 +23,8 @@ const (
|
|||||||
|
|
||||||
const (
|
const (
|
||||||
SkuStatusDeleted = -1 // 商品删除
|
SkuStatusDeleted = -1 // 商品删除
|
||||||
SkuStatusDontSale = 0 // 商品正常
|
SkuStatusDontSale = 0 // 商品不可售
|
||||||
SkuStatusNormal = 1 // 商品不可售
|
SkuStatusNormal = 1 // 商品正常
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
|
|||||||
@@ -3,13 +3,14 @@ package delivery
|
|||||||
import (
|
import (
|
||||||
"crypto/rand"
|
"crypto/rand"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"math/big"
|
||||||
|
"time"
|
||||||
|
|
||||||
"git.rosy.net.cn/baseapi"
|
"git.rosy.net.cn/baseapi"
|
||||||
"git.rosy.net.cn/baseapi/platformapi/mtwmapi"
|
"git.rosy.net.cn/baseapi/platformapi/mtwmapi"
|
||||||
"git.rosy.net.cn/jx-callback/business/jxutils/jxcontext"
|
"git.rosy.net.cn/jx-callback/business/jxutils/jxcontext"
|
||||||
"git.rosy.net.cn/jx-callback/business/jxutils/tasksch"
|
"git.rosy.net.cn/jx-callback/business/jxutils/tasksch"
|
||||||
"git.rosy.net.cn/jx-callback/business/partner/purchase/mtwm"
|
"git.rosy.net.cn/jx-callback/business/partner/purchase/mtwm"
|
||||||
"math/big"
|
|
||||||
"time"
|
|
||||||
|
|
||||||
"git.rosy.net.cn/baseapi/platformapi/mtpsapi"
|
"git.rosy.net.cn/baseapi/platformapi/mtpsapi"
|
||||||
"git.rosy.net.cn/baseapi/platformapi/tiktok_shop/tiktok_api"
|
"git.rosy.net.cn/baseapi/platformapi/tiktok_shop/tiktok_api"
|
||||||
@@ -86,6 +87,9 @@ func GetOrderRiderInfoToPlatform(orderId string, wayBillStatus int) {
|
|||||||
//3.当同一个订单已经上传了一次配送信息,如再次同步会更新配送信息,以最新的一次为准。
|
//3.当同一个订单已经上传了一次配送信息,如再次同步会更新配送信息,以最新的一次为准。
|
||||||
//4.如订单已完成、已取消等状态发货将失败。
|
//4.如订单已完成、已取消等状态发货将失败。
|
||||||
for _, v := range orders {
|
for _, v := range orders {
|
||||||
|
//if v.Status >= model.OrderStatusFinished || v.Status < model.OrderStatusDelivering {
|
||||||
|
// continue
|
||||||
|
//}
|
||||||
if orderId == "" && v.VendorID == model.VendorIDDD { // 抖音门店订单除了三方配送回调时推送,不在主动推送配送消息
|
if orderId == "" && v.VendorID == model.VendorIDDD { // 抖音门店订单除了三方配送回调时推送,不在主动推送配送消息
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
@@ -167,7 +171,7 @@ func GetOrderRiderInfoToPlatform(orderId string, wayBillStatus int) {
|
|||||||
|
|
||||||
if riderInfo.CourierPhone == "" {
|
if riderInfo.CourierPhone == "" {
|
||||||
storeDetail, err := dao.GetStoreDetail(dao.GetDB(), v.JxStoreID, 0, "")
|
storeDetail, err := dao.GetStoreDetail(dao.GetDB(), v.JxStoreID, 0, "")
|
||||||
if err != nil {
|
if err == nil {
|
||||||
riderInfo.CourierPhone = storeDetail.Tel1
|
riderInfo.CourierPhone = storeDetail.Tel1
|
||||||
}
|
}
|
||||||
riderInfo.CourierName = "老板"
|
riderInfo.CourierName = "老板"
|
||||||
|
|||||||
@@ -101,11 +101,19 @@ func (p PrinterHandler) PrintOrder(ctx *jxcontext.Context, store *model.Store, s
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
content := ""
|
content := ""
|
||||||
|
if store.ID == 669063 {
|
||||||
|
if store.PrinterFontSize == partner.PrinterFontSizeBig || store.PrinterFontSize == partner.PrinterFontSizeBig2 {
|
||||||
|
content = p.getOrderContentBig(order, store.Tel1, storeDetail)
|
||||||
|
} else {
|
||||||
|
content = p.getOrderContent(order, store.Tel1, storeDetail)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
if store.PrinterFontSize == partner.PrinterFontSizeBig || store.PrinterFontSize == partner.PrinterFontSizeBig2 {
|
if store.PrinterFontSize == partner.PrinterFontSizeBig || store.PrinterFontSize == partner.PrinterFontSizeBig2 {
|
||||||
content = p.getOrderContentBigV2(order, store.Tel1, storeDetail)
|
content = p.getOrderContentBigV2(order, store.Tel1, storeDetail)
|
||||||
} else {
|
} else {
|
||||||
content = p.getOrderContentV2(order, store.Tel1, storeDetail)
|
content = p.getOrderContentV2(order, store.Tel1, storeDetail)
|
||||||
}
|
}
|
||||||
|
}
|
||||||
count := 0
|
count := 0
|
||||||
for {
|
for {
|
||||||
printerStatus, err := p.PrintMsg(ctx, store.PrinterSN, "", trenditapi.VoiceNewShort, content)
|
printerStatus, err := p.PrintMsg(ctx, store.PrinterSN, "", trenditapi.VoiceNewShort, content)
|
||||||
@@ -194,6 +202,7 @@ func (c *PrinterHandler) getOrderContentV2(order *model.GoodsOrder, storeTel str
|
|||||||
<LEFT>期望送达: %s</LEFT>
|
<LEFT>期望送达: %s</LEFT>
|
||||||
<LEFT>客户姓名: %s</LEFT>
|
<LEFT>客户姓名: %s</LEFT>
|
||||||
<LEFT>客户电话: %s</LEFT>
|
<LEFT>客户电话: %s</LEFT>
|
||||||
|
<LEFT>店铺名称: %s</LEFT>
|
||||||
<LEFT><font# bolder=0 height=2 width=1>订单编号: %s</font#></LEFT><BR>
|
<LEFT><font# bolder=0 height=2 width=1>订单编号: %s</font#></LEFT><BR>
|
||||||
<C><font# bolder=0 height=2 width=2>%s#%d</font#>
|
<C><font# bolder=0 height=2 width=2>%s#%d</font#>
|
||||||
<QR>%s</QR></C>
|
<QR>%s</QR></C>
|
||||||
@@ -202,7 +211,6 @@ func (c *PrinterHandler) getOrderContentV2(order *model.GoodsOrder, storeTel str
|
|||||||
<font# bolder=0 height=1 width=1>--------------------------------</font#>
|
<font# bolder=0 height=1 width=1>--------------------------------</font#>
|
||||||
<LEFT><font# bolder=0 height=1 width=1>客户备注:%s</font#></LEFT>
|
<LEFT><font# bolder=0 height=1 width=1>客户备注:%s</font#></LEFT>
|
||||||
<font# bolder=0 height=1 width=1>--------------------------------</font#>
|
<font# bolder=0 height=1 width=1>--------------------------------</font#>
|
||||||
<LEFT><font# bolder=0 height=1 width=1>商品列表</font#></LEFT>
|
|
||||||
商品名` + trenditapi.StrRepeat(" ", 20) + `数量
|
商品名` + trenditapi.StrRepeat(" ", 20) + `数量
|
||||||
` + trenditapi.StrRepeat("-", 32) + `
|
` + trenditapi.StrRepeat("-", 32) + `
|
||||||
`
|
`
|
||||||
@@ -211,6 +219,7 @@ func (c *PrinterHandler) getOrderContentV2(order *model.GoodsOrder, storeTel str
|
|||||||
utils.Time2Str(expectedDeliveryTime),
|
utils.Time2Str(expectedDeliveryTime),
|
||||||
order.ConsigneeName,
|
order.ConsigneeName,
|
||||||
order.ConsigneeMobile,
|
order.ConsigneeMobile,
|
||||||
|
order.StoreName,
|
||||||
order.VendorOrderID,
|
order.VendorOrderID,
|
||||||
jxutils.GetVendorName(order.VendorID),
|
jxutils.GetVendorName(order.VendorID),
|
||||||
order.OrderSeq,
|
order.OrderSeq,
|
||||||
@@ -227,6 +236,7 @@ func (c *PrinterHandler) getOrderContentV2(order *model.GoodsOrder, storeTel str
|
|||||||
orderParams = append(orderParams, order.SkuCount, order.GoodsCount, order.OrderSeq)
|
orderParams = append(orderParams, order.SkuCount, order.GoodsCount, order.OrderSeq)
|
||||||
return fmt.Sprintf(orderFmt, orderParams...)
|
return fmt.Sprintf(orderFmt, orderParams...)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *PrinterHandler) getOrderContentBigV2(order *model.GoodsOrder, storeTel string, storeDetail *dao.StoreDetail) (content string) {
|
func (c *PrinterHandler) getOrderContentBigV2(order *model.GoodsOrder, storeTel string, storeDetail *dao.StoreDetail) (content string) {
|
||||||
expectedDeliveryTime := order.ExpectedDeliveredTime
|
expectedDeliveryTime := order.ExpectedDeliveredTime
|
||||||
if utils.IsTimeZero(expectedDeliveryTime) {
|
if utils.IsTimeZero(expectedDeliveryTime) {
|
||||||
@@ -257,6 +267,7 @@ func (c *PrinterHandler) getOrderContentBigV2(order *model.GoodsOrder, storeTel
|
|||||||
<LEFT>期望送达: %s</LEFT>
|
<LEFT>期望送达: %s</LEFT>
|
||||||
<LEFT>客户姓名: %s</LEFT>
|
<LEFT>客户姓名: %s</LEFT>
|
||||||
<LEFT>客户电话: %s</LEFT>
|
<LEFT>客户电话: %s</LEFT>
|
||||||
|
<LEFT>店铺名称: %s</LEFT>
|
||||||
<LEFT><font# bolder=1 height=2 width=1>订单编号: %s</font#></LEFT><BR>
|
<LEFT><font# bolder=1 height=2 width=1>订单编号: %s</font#></LEFT><BR>
|
||||||
<C><font# bolder=0 height=2 width=2>%s#%d</font#>
|
<C><font# bolder=0 height=2 width=2>%s#%d</font#>
|
||||||
<QR>%s</QR></C>
|
<QR>%s</QR></C>
|
||||||
@@ -265,7 +276,6 @@ func (c *PrinterHandler) getOrderContentBigV2(order *model.GoodsOrder, storeTel
|
|||||||
<font# bolder=0 height=1 width=1>--------------------------------</font#>
|
<font# bolder=0 height=1 width=1>--------------------------------</font#>
|
||||||
<LEFT><font# bolder=0 height=2 width=1>客户备注:%s</font#></LEFT>
|
<LEFT><font# bolder=0 height=2 width=1>客户备注:%s</font#></LEFT>
|
||||||
<font# bolder=0 height=1 width=1>--------------------------------</font#>
|
<font# bolder=0 height=1 width=1>--------------------------------</font#>
|
||||||
<LEFT><font# bolder=0 height=1 width=1>商品列表</font#></LEFT>
|
|
||||||
商品名` + trenditapi.StrRepeat(" ", 20) + `数量
|
商品名` + trenditapi.StrRepeat(" ", 20) + `数量
|
||||||
` + trenditapi.StrRepeat("-", 32) + `
|
` + trenditapi.StrRepeat("-", 32) + `
|
||||||
`
|
`
|
||||||
@@ -274,6 +284,7 @@ func (c *PrinterHandler) getOrderContentBigV2(order *model.GoodsOrder, storeTel
|
|||||||
utils.Time2Str(expectedDeliveryTime),
|
utils.Time2Str(expectedDeliveryTime),
|
||||||
order.ConsigneeName,
|
order.ConsigneeName,
|
||||||
order.ConsigneeMobile,
|
order.ConsigneeMobile,
|
||||||
|
order.StoreName,
|
||||||
order.VendorOrderID,
|
order.VendorOrderID,
|
||||||
jxutils.GetVendorName(order.VendorID),
|
jxutils.GetVendorName(order.VendorID),
|
||||||
order.OrderSeq,
|
order.OrderSeq,
|
||||||
@@ -323,6 +334,7 @@ func (c *PrinterHandler) getOrderContent(order *model.GoodsOrder, storeTel strin
|
|||||||
<LEFT>期望送达: %s</LEFT>
|
<LEFT>期望送达: %s</LEFT>
|
||||||
<LEFT>客户姓名: %s</LEFT>
|
<LEFT>客户姓名: %s</LEFT>
|
||||||
<LEFT>客户电话: %s</LEFT>
|
<LEFT>客户电话: %s</LEFT>
|
||||||
|
<LEFT>店铺名称: %s</LEFT>
|
||||||
<LEFT><font# bolder=0 height=2 width=1>订单编号: %s</font#></LEFT><BR>
|
<LEFT><font# bolder=0 height=2 width=1>订单编号: %s</font#></LEFT><BR>
|
||||||
<C><font# bolder=0 height=2 width=2>%s#%d</font#>
|
<C><font# bolder=0 height=2 width=2>%s#%d</font#>
|
||||||
<QR>%s</QR></C>
|
<QR>%s</QR></C>
|
||||||
@@ -331,7 +343,6 @@ func (c *PrinterHandler) getOrderContent(order *model.GoodsOrder, storeTel strin
|
|||||||
<font# bolder=0 height=1 width=1>--------------------------------</font#>
|
<font# bolder=0 height=1 width=1>--------------------------------</font#>
|
||||||
<LEFT><font# bolder=0 height=1 width=1>客户备注:%s</font#></LEFT>
|
<LEFT><font# bolder=0 height=1 width=1>客户备注:%s</font#></LEFT>
|
||||||
<font# bolder=0 height=1 width=1>--------------------------------</font#>
|
<font# bolder=0 height=1 width=1>--------------------------------</font#>
|
||||||
<LEFT><font# bolder=0 height=1 width=1>商品列表</font#></LEFT>
|
|
||||||
商品名` + trenditapi.StrRepeat(" ", 2) + `数量` + trenditapi.StrRepeat(" ", 3) + `单价` + trenditapi.StrRepeat(" ", 5) + `小计
|
商品名` + trenditapi.StrRepeat(" ", 2) + `数量` + trenditapi.StrRepeat(" ", 3) + `单价` + trenditapi.StrRepeat(" ", 5) + `小计
|
||||||
` + trenditapi.StrRepeat("-", 32) + `
|
` + trenditapi.StrRepeat("-", 32) + `
|
||||||
`
|
`
|
||||||
@@ -340,6 +351,7 @@ func (c *PrinterHandler) getOrderContent(order *model.GoodsOrder, storeTel strin
|
|||||||
utils.Time2Str(expectedDeliveryTime),
|
utils.Time2Str(expectedDeliveryTime),
|
||||||
order.ConsigneeName,
|
order.ConsigneeName,
|
||||||
order.ConsigneeMobile,
|
order.ConsigneeMobile,
|
||||||
|
order.StoreName,
|
||||||
order.VendorOrderID,
|
order.VendorOrderID,
|
||||||
jxutils.GetVendorName(order.VendorID),
|
jxutils.GetVendorName(order.VendorID),
|
||||||
order.OrderSeq,
|
order.OrderSeq,
|
||||||
@@ -391,6 +403,7 @@ func (c *PrinterHandler) getOrderContentBig(order *model.GoodsOrder, storeTel st
|
|||||||
<LEFT><font# bolder=0 height=2 width=1>期望送达: %s</font#></LEFT>
|
<LEFT><font# bolder=0 height=2 width=1>期望送达: %s</font#></LEFT>
|
||||||
<LEFT><font# bolder=0 height=2 width=1>客户姓名: %s</font#></LEFT>
|
<LEFT><font# bolder=0 height=2 width=1>客户姓名: %s</font#></LEFT>
|
||||||
<LEFT><font# bolder=0 height=2 width=1>客户电话: %s</font#></LEFT>
|
<LEFT><font# bolder=0 height=2 width=1>客户电话: %s</font#></LEFT>
|
||||||
|
<LEFT><font# bolder=0 height=3 width=1>店铺名称: %s</font#></LEFT>
|
||||||
<LEFT><font# bolder=0 height=3 width=1>订单编号: %s</font#></LEFT><BR>
|
<LEFT><font# bolder=0 height=3 width=1>订单编号: %s</font#></LEFT><BR>
|
||||||
<C><font# bolder=1 height=2 width=2>%s#%d</font#>
|
<C><font# bolder=1 height=2 width=2>%s#%d</font#>
|
||||||
<QR>%s</QR></C>
|
<QR>%s</QR></C>
|
||||||
@@ -399,7 +412,6 @@ func (c *PrinterHandler) getOrderContentBig(order *model.GoodsOrder, storeTel st
|
|||||||
<font# bolder=0 height=1 width=1>--------------------------------</font#>
|
<font# bolder=0 height=1 width=1>--------------------------------</font#>
|
||||||
<LEFT><font# bolder=0 height=2 width=1>客户备注:%s</font#></LEFT>
|
<LEFT><font# bolder=0 height=2 width=1>客户备注:%s</font#></LEFT>
|
||||||
<font# bolder=0 height=1 width=1>--------------------------------</font#>
|
<font# bolder=0 height=1 width=1>--------------------------------</font#>
|
||||||
<LEFT><font# bolder=0 height=2 width=1>商品列表</font#>
|
|
||||||
<LEFT><font# bolder=0 height=2 width=1>商品名 数量 单价 小计</font#></LEFT>
|
<LEFT><font# bolder=0 height=2 width=1>商品名 数量 单价 小计</font#></LEFT>
|
||||||
<font# bolder=0 height=1 width=1>--------------------------------</font#>
|
<font# bolder=0 height=1 width=1>--------------------------------</font#>
|
||||||
`
|
`
|
||||||
@@ -408,6 +420,7 @@ func (c *PrinterHandler) getOrderContentBig(order *model.GoodsOrder, storeTel st
|
|||||||
utils.Time2Str(expectedDeliveryTime),
|
utils.Time2Str(expectedDeliveryTime),
|
||||||
order.ConsigneeName,
|
order.ConsigneeName,
|
||||||
order.ConsigneeMobile,
|
order.ConsigneeMobile,
|
||||||
|
order.StoreName,
|
||||||
order.VendorOrderID,
|
order.VendorOrderID,
|
||||||
jxutils.GetVendorName(order.VendorID),
|
jxutils.GetVendorName(order.VendorID),
|
||||||
order.OrderSeq,
|
order.OrderSeq,
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
IMVendorIDELM = 11 //饿了么
|
IMVendorIDELM = 3 //饿了么
|
||||||
)
|
)
|
||||||
|
|
||||||
// OnImMessage 用户/骑手 发送/已读消息 回调
|
// OnImMessage 用户/骑手 发送/已读消息 回调
|
||||||
|
|||||||
@@ -5,6 +5,10 @@ import (
|
|||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
|
||||||
|
"git.rosy.net.cn/jx-callback/business/jxutils"
|
||||||
|
|
||||||
|
"git.rosy.net.cn/baseapi/utils/errlist"
|
||||||
|
|
||||||
"git.rosy.net.cn/jx-callback/globals"
|
"git.rosy.net.cn/jx-callback/globals"
|
||||||
|
|
||||||
"git.rosy.net.cn/baseapi/platformapi/ebaiapi"
|
"git.rosy.net.cn/baseapi/platformapi/ebaiapi"
|
||||||
@@ -19,7 +23,6 @@ import (
|
|||||||
// SendToVendor 向平台发消息
|
// SendToVendor 向平台发消息
|
||||||
func SendToVendor(msg []byte) {
|
func SendToVendor(msg []byte) {
|
||||||
var (
|
var (
|
||||||
//w http.ResponseWriter
|
|
||||||
sendData SendData
|
sendData SendData
|
||||||
err error
|
err error
|
||||||
elmAppID = api.EbaiAPI.GetSource()
|
elmAppID = api.EbaiAPI.GetSource()
|
||||||
@@ -36,7 +39,11 @@ func SendToVendor(msg []byte) {
|
|||||||
//发送信息
|
//发送信息
|
||||||
if sendData.VendorID == VendorIDMT {
|
if sendData.VendorID == VendorIDMT {
|
||||||
temp, _ := json.Marshal(sendData.Data)
|
temp, _ := json.Marshal(sendData.Data)
|
||||||
Send(temp)
|
if sendData.Data.(map[string]interface{})["app_id"] == nil {
|
||||||
|
globals.SugarLogger.Debug("SendToVendor appId=null")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
Send(temp, sendData.Data.(map[string]interface{})["app_id"])
|
||||||
}
|
}
|
||||||
if sendData.VendorID == VendorIDELM {
|
if sendData.VendorID == VendorIDELM {
|
||||||
param := sendData.Data.(ebaiapi.BusinessSendMsgReq)
|
param := sendData.Data.(ebaiapi.BusinessSendMsgReq)
|
||||||
@@ -46,23 +53,24 @@ func SendToVendor(msg []byte) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if err != nil {
|
//if err != nil {
|
||||||
ClientRender(Fail, FailMsg, map[string]string{
|
// ClientRender(Fail, FailMsg, map[string]string{
|
||||||
"errMsg": fmt.Sprintf("%v", err),
|
// "errMsg": fmt.Sprintf("%v", err),
|
||||||
})
|
// })
|
||||||
|
// return err
|
||||||
|
//} else {
|
||||||
|
// ClientRender(SuccessCode, SuccessMsg, map[string]interface{}{
|
||||||
|
// "vendorID": sendData.VendorID,
|
||||||
|
// "msg": "ok",
|
||||||
|
// })
|
||||||
|
// return nil
|
||||||
|
//}
|
||||||
return
|
return
|
||||||
} else {
|
|
||||||
ClientRender(SuccessCode, SuccessMsg, map[string]interface{}{
|
|
||||||
"vendorID": sendData.VendorID,
|
|
||||||
"msg": "ok",
|
|
||||||
})
|
|
||||||
return
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func Send(data []byte) {
|
func Send(data []byte, appID interface{}) {
|
||||||
//生成完整url
|
//根据appID生成完整url
|
||||||
fullUrl := GenFullUrl() //clientID暂时不用
|
fullUrl := GenFullUrl(appID.(float64)) //clientID暂时不用
|
||||||
|
|
||||||
conn, resp, err := websocket.DefaultDialer.Dial(fullUrl, nil)
|
conn, resp, err := websocket.DefaultDialer.Dial(fullUrl, nil)
|
||||||
if err != nil || resp.StatusCode != 101 {
|
if err != nil || resp.StatusCode != 101 {
|
||||||
@@ -83,11 +91,11 @@ func Send(data []byte) {
|
|||||||
|
|
||||||
for {
|
for {
|
||||||
_, msg, err := conn.ReadMessage()
|
_, msg, err := conn.ReadMessage()
|
||||||
|
temp := string(msg)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
break
|
break
|
||||||
} else {
|
} else {
|
||||||
temp := string(msg)
|
if temp != HeartSuccessWord {
|
||||||
if temp != HeartCheckSuccess || temp != "成功" {
|
|
||||||
ReadMsgFromVendor(VendorIDMT, "", msg)
|
ReadMsgFromVendor(VendorIDMT, "", msg)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -96,6 +104,87 @@ func Send(data []byte) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// MtInit 发送心跳
|
||||||
|
func MtInit() {
|
||||||
|
data := []byte(HeartCheckMsg)
|
||||||
|
//生成完整url
|
||||||
|
url := GenFullUrl2()
|
||||||
|
//主连接
|
||||||
|
jxutils.CallMsgHandlerAsync(func() {
|
||||||
|
conn, resp, err := websocket.DefaultDialer.Dial(url.UrlMain, nil)
|
||||||
|
if err != nil || resp.StatusCode != 101 {
|
||||||
|
fmt.Printf("连接失败:%v http响应不成功", err)
|
||||||
|
}
|
||||||
|
//关闭
|
||||||
|
defer func(conn *websocket.Conn) {
|
||||||
|
err := conn.Close()
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}(conn)
|
||||||
|
|
||||||
|
//client连接事件
|
||||||
|
client := NewClient(url.ClientIDMain, conn, ClientTypeMt)
|
||||||
|
Manager.Connect <- client
|
||||||
|
|
||||||
|
err = conn.WriteMessage(websocket.TextMessage, data)
|
||||||
|
if err != nil {
|
||||||
|
fmt.Println(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
for {
|
||||||
|
_, msg, err := conn.ReadMessage()
|
||||||
|
temp := string(msg)
|
||||||
|
if err != nil || temp != "HB" {
|
||||||
|
break
|
||||||
|
} else {
|
||||||
|
ReadMsgFromVendor(VendorIDMT, "", msg)
|
||||||
|
}
|
||||||
|
fmt.Printf("%s receive: %s\n", conn.RemoteAddr(), string(msg))
|
||||||
|
}
|
||||||
|
}, url.ClientIDMain)
|
||||||
|
|
||||||
|
//副连接
|
||||||
|
if url.UrlSub != "" {
|
||||||
|
jxutils.CallMsgHandlerAsync(func() {
|
||||||
|
connSub, respSub, errSub := websocket.DefaultDialer.Dial(url.UrlSub, nil)
|
||||||
|
if errSub != nil || respSub.StatusCode != 101 {
|
||||||
|
fmt.Printf("连接失败:%v http响应不成功", errSub)
|
||||||
|
}
|
||||||
|
|
||||||
|
//关闭
|
||||||
|
defer func(conn *websocket.Conn) {
|
||||||
|
err := conn.Close()
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}(connSub)
|
||||||
|
|
||||||
|
//client连接事件
|
||||||
|
client := NewClient(url.ClientIDSub, connSub, ClientTypeMt)
|
||||||
|
Manager.Connect <- client
|
||||||
|
|
||||||
|
errSub = connSub.WriteMessage(websocket.TextMessage, data)
|
||||||
|
if errSub != nil {
|
||||||
|
fmt.Println(errSub)
|
||||||
|
}
|
||||||
|
|
||||||
|
for {
|
||||||
|
_, msg, err := connSub.ReadMessage()
|
||||||
|
temp := string(msg)
|
||||||
|
if err != nil || temp != HeartCheckSuccess {
|
||||||
|
break
|
||||||
|
} else {
|
||||||
|
ReadMsgFromVendor(VendorIDMT, "", msg)
|
||||||
|
}
|
||||||
|
fmt.Printf("%s connSub:receive: %s\n", connSub.RemoteAddr(), string(msg))
|
||||||
|
}
|
||||||
|
|
||||||
|
}, url.ClientIDSub)
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
// ReadMsgFromClient 存储客户端发送的消息
|
// ReadMsgFromClient 存储客户端发送的消息
|
||||||
func ReadMsgFromClient(vendorID int, elmAppID string, msg interface{}) {
|
func ReadMsgFromClient(vendorID int, elmAppID string, msg interface{}) {
|
||||||
var (
|
var (
|
||||||
@@ -221,13 +310,8 @@ func PushMsgByCid(vendorStoreID string, vendorID int) error {
|
|||||||
func SetMessageDetail(req *JXMsg, vendorID int, elmAppID string) error {
|
func SetMessageDetail(req *JXMsg, vendorID int, elmAppID string) error {
|
||||||
//生成京西消息ID detail
|
//生成京西消息ID detail
|
||||||
msgID := GenMsgDetailID(req, vendorID, elmAppID)
|
msgID := GenMsgDetailID(req, vendorID, elmAppID)
|
||||||
err := rdb.Set("test", "可以插入数据sjdfoiqaj", ExpireTimeDay)
|
|
||||||
if err != nil {
|
|
||||||
globals.SugarLogger.Debugf("测试插入err:%v", err)
|
|
||||||
}
|
|
||||||
data, _ := json.Marshal(req)
|
data, _ := json.Marshal(req)
|
||||||
err = rdb.RPush(msgID, string(data))
|
err := rdb.RPush(msgID, string(data))
|
||||||
globals.SugarLogger.Debugf("im SetUserList err=%v", err)
|
|
||||||
ok, err := rdb.ExpireResult(msgID, ExpireTimeDay)
|
ok, err := rdb.ExpireResult(msgID, ExpireTimeDay)
|
||||||
if err != nil || !ok {
|
if err != nil || !ok {
|
||||||
return err
|
return err
|
||||||
@@ -251,12 +335,6 @@ func SetUserList(jxMsg *JXMsg, userList *UserMessageList, vendorID int, elmAppID
|
|||||||
//存储当前数据
|
//存储当前数据
|
||||||
data, _ := json.Marshal(userList)
|
data, _ := json.Marshal(userList)
|
||||||
err = rdb.RPush(msgID, string(data))
|
err = rdb.RPush(msgID, string(data))
|
||||||
globals.SugarLogger.Debugf("im SetUserList msgID=%s", msgID)
|
|
||||||
globals.SugarLogger.Debugf("im SetUserList err=%v", err)
|
|
||||||
//test
|
|
||||||
str := rdb.Get(msgID)
|
|
||||||
globals.SugarLogger.Debugf("im SetUserList str=%v", str)
|
|
||||||
//over
|
|
||||||
ok, err := rdb.ExpireResult(msgID, ExpireTimeDay)
|
ok, err := rdb.ExpireResult(msgID, ExpireTimeDay)
|
||||||
if err != nil || !ok {
|
if err != nil || !ok {
|
||||||
return err
|
return err
|
||||||
@@ -331,6 +409,8 @@ func GetImUserList(req []RelInfo) (map[string][]interface{}, error) {
|
|||||||
temp := rdb.LRange(j)
|
temp := rdb.LRange(j)
|
||||||
for _, v := range temp {
|
for _, v := range temp {
|
||||||
retVal[j] = append(retVal[j], v)
|
retVal[j] = append(retVal[j], v)
|
||||||
|
//暂时写死
|
||||||
|
//retVal["userList"] = append(retVal["userList"], v)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return retVal, nil
|
return retVal, nil
|
||||||
@@ -351,6 +431,7 @@ func GetImChatDetail(req []UserRelInfo) (map[string][]interface{}, error) {
|
|||||||
temp := rdb.LRange(j)
|
temp := rdb.LRange(j)
|
||||||
for _, v := range temp {
|
for _, v := range temp {
|
||||||
retVal[j] = append(retVal[j], v)
|
retVal[j] = append(retVal[j], v)
|
||||||
|
//retVal["chatDetail"] = append(retVal["chatDetail"], v)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return retVal, nil
|
return retVal, nil
|
||||||
@@ -388,3 +469,18 @@ func SetJxMsgRead(appID, vendorStoreID, vendorID, userID string) error {
|
|||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// DelRedisByKey 清除redis数据
|
||||||
|
func DelRedisByKey(keys []string) {
|
||||||
|
var errList errlist.ErrList
|
||||||
|
for _, key := range keys {
|
||||||
|
err := rdb.Del(key)
|
||||||
|
if err != nil {
|
||||||
|
errList.AddErr(err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if errList.GetErrListAsOne() != nil {
|
||||||
|
globals.SugarLogger.Debugf("DelRedisByKey err=%v", errList.GetErrListAsOne())
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|||||||
@@ -38,6 +38,7 @@ type ClientManager struct {
|
|||||||
type Client struct {
|
type Client struct {
|
||||||
ClientId string // 标识ID
|
ClientId string // 标识ID
|
||||||
Socket *websocket.Conn // 用户连接
|
Socket *websocket.Conn // 用户连接
|
||||||
|
ClientType string //标识是美团/客户端长链接
|
||||||
ConnectTime uint64 // 首次连接时间
|
ConnectTime uint64 // 首次连接时间
|
||||||
IsDeleted bool // 是否删除或下线
|
IsDeleted bool // 是否删除或下线
|
||||||
UserId string // 业务端标识用户ID
|
UserId string // 业务端标识用户ID
|
||||||
@@ -132,26 +133,44 @@ type UserRelInfo struct {
|
|||||||
UserID string `json:"userID"` //用户id/groupID
|
UserID string `json:"userID"` //用户id/groupID
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// UrlInfo 生成美团长链接url信息
|
||||||
|
type UrlInfo struct {
|
||||||
|
UrlMain string `json:"urlMain"` //主连接路由
|
||||||
|
ClientIDMain string `json:"ClientIDMain"` //主连接id
|
||||||
|
UrlSub string `json:"urlSub"` //副连接路由
|
||||||
|
ClientIDSub string `json:"ClientIDSub"` //副连接id
|
||||||
|
}
|
||||||
|
|
||||||
var (
|
var (
|
||||||
cfg *ini.File
|
cfg *ini.File
|
||||||
rdb = api.Cacher
|
rdb = api.Cacher
|
||||||
|
//客户端相关
|
||||||
Manager = NewClientManager() // 管理者
|
Manager = NewClientManager() // 管理者
|
||||||
|
ToClientChan chan clientInfo
|
||||||
|
ClientTypeJx = "jx" //京西客户端
|
||||||
|
ClientTypeMt = "mt" //美团客户端
|
||||||
|
//配置文件
|
||||||
CommonSetting = &commonConf{}
|
CommonSetting = &commonConf{}
|
||||||
GlobalSetting = &global{}
|
GlobalSetting = &global{}
|
||||||
ToClientChan chan clientInfo
|
//心跳相关
|
||||||
heartbeatInterval = 60 * time.Second // 心跳间隔
|
heartbeatInterval = 60 * time.Second // 心跳间隔
|
||||||
HeartCheckMsg = "~#HHHBBB#~" //心跳检测消息
|
HeartCheckMsg = "~#HHHBBB#~" //心跳检测消息
|
||||||
HeartCheckSuccess = "HB" //成功发送返回心跳消息
|
HeartCheckSuccess = "HB" //成功发送返回心跳消息
|
||||||
VendorIDMT = 10 //im美团
|
HeartSuccessWord = "成功" //成功发送返回心跳消息
|
||||||
VendorIDELM = 11 //im饿了么
|
//平台标识
|
||||||
|
AppID5873 = float64(5873)
|
||||||
|
AppID589 = "589"
|
||||||
|
VendorIDMT = 1 //im美团
|
||||||
|
VendorIDELM = 3 //im饿了么
|
||||||
SendTypeJx = "jx" //京西客户端发送方标识
|
SendTypeJx = "jx" //京西客户端发送方标识
|
||||||
SendTypeMt = "mt" //美团用户发送方标识符
|
SendTypeMt = "mt" //美团用户发送方标识符
|
||||||
SendTypeElm = "elm" //饿了么用户发送方标识符
|
SendTypeElm = "elm" //饿了么用户发送方标识符
|
||||||
MTIMPushUrl = "wss://wpush.meituan.com/websocket" //buildPushConnect建立长连接
|
MTIMPushUrl = "wss://wpush.meituan.com/websocket" //buildPushConnect建立长连接
|
||||||
|
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
ExpireTimeDay = 24 * time.Hour //redis一天过期时间
|
ExpireTimeDay = 2 * time.Hour //redis一天过期时间
|
||||||
maxMessageSize = 8192 // 最大的消息大小
|
maxMessageSize = 8192 // 最大的消息大小
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -162,7 +181,7 @@ type renderData struct {
|
|||||||
const (
|
const (
|
||||||
SuccessCode = 0
|
SuccessCode = 0
|
||||||
SuccessMsg = "success"
|
SuccessMsg = "success"
|
||||||
Fail = -1
|
FailCode = -1
|
||||||
FailMsg = "fail"
|
FailMsg = "fail"
|
||||||
|
|
||||||
SYSTEM_ID_ERROR = -1001
|
SYSTEM_ID_ERROR = -1001
|
||||||
@@ -189,12 +208,13 @@ func Render(conn *websocket.Conn, messageId string, code int, message string, da
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func ClientRender(code int, msg string, data interface{}) (str string) {
|
// ClientRender http响应
|
||||||
|
func ClientRender(code int, msg string) (str string) {
|
||||||
var retData RetData
|
var retData RetData
|
||||||
|
|
||||||
retData.Code = code
|
retData.Code = code
|
||||||
retData.Msg = msg
|
retData.Msg = msg
|
||||||
retData.Data = data
|
//retData.Data = data
|
||||||
|
|
||||||
retJson, _ := json.Marshal(retData)
|
retJson, _ := json.Marshal(retData)
|
||||||
str = string(retJson)
|
str = string(retJson)
|
||||||
@@ -272,7 +292,16 @@ func getIntranetIp() string {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// GenFullUrl 组装完整websocket url以及生成clientID
|
// GenFullUrl 组装完整websocket url以及生成clientID
|
||||||
func GenFullUrl() (fullUrl string) {
|
func GenFullUrl(appID float64) (fullUrl string) {
|
||||||
|
if appID == AppID5873 {
|
||||||
|
if resp5873, err := api.Mtwm2API.GetConnectionToken(); err == nil {
|
||||||
|
r1 := mtwmapi.GetConnTokenResp{}
|
||||||
|
err = mapstructure.Decode(resp5873, &r1)
|
||||||
|
fullUrl = MTIMPushUrl + "/" + r1.AppKey + "/" + r1.ConnectionToken
|
||||||
|
return fullUrl
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//589/4123
|
||||||
resp, err := api.MtwmAPI.GetConnectionToken()
|
resp, err := api.MtwmAPI.GetConnectionToken()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return ""
|
return ""
|
||||||
@@ -280,13 +309,34 @@ func GenFullUrl() (fullUrl string) {
|
|||||||
retVal := mtwmapi.GetConnTokenResp{}
|
retVal := mtwmapi.GetConnTokenResp{}
|
||||||
err = mapstructure.Decode(resp, &retVal)
|
err = mapstructure.Decode(resp, &retVal)
|
||||||
fullUrl = MTIMPushUrl + "/" + retVal.AppKey + "/" + retVal.ConnectionToken
|
fullUrl = MTIMPushUrl + "/" + retVal.AppKey + "/" + retVal.ConnectionToken
|
||||||
//clientID = api.MtwmAPI.GetAppID() + ":" + retVal.ConnectionToken
|
|
||||||
//打印输出
|
|
||||||
//fmt.Printf("Create websocket connect failCount:%d", retVal.UserCount)
|
|
||||||
return fullUrl
|
return fullUrl
|
||||||
}
|
}
|
||||||
|
|
||||||
//生成随机字符串
|
// GenFullUrl2 组装完整websocket url以及生成clientID
|
||||||
|
func GenFullUrl2() *UrlInfo {
|
||||||
|
urlInfo := &UrlInfo{}
|
||||||
|
//1 589/4123
|
||||||
|
resp, err := api.MtwmAPI.GetConnectionToken()
|
||||||
|
if err != nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
retVal := mtwmapi.GetConnTokenResp{}
|
||||||
|
err = mapstructure.Decode(resp, &retVal)
|
||||||
|
urlInfo.UrlMain = MTIMPushUrl + "/" + retVal.AppKey + "/" + retVal.ConnectionToken
|
||||||
|
urlInfo.ClientIDMain = retVal.AppKey + ":" + retVal.ConnectionToken
|
||||||
|
|
||||||
|
if api.MtwmAPI.GetAppID() == AppID589 { //目前果园无4123
|
||||||
|
if resp5873, err := api.Mtwm2API.GetConnectionToken(); err == nil {
|
||||||
|
r1 := mtwmapi.GetConnTokenResp{}
|
||||||
|
err = mapstructure.Decode(resp5873, &r1)
|
||||||
|
urlInfo.UrlSub = MTIMPushUrl + "/" + r1.AppKey + "/" + r1.ConnectionToken
|
||||||
|
urlInfo.ClientIDSub = r1.AppKey + ":" + r1.ConnectionToken
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return urlInfo
|
||||||
|
}
|
||||||
|
|
||||||
|
// RandString 生成随机字符串
|
||||||
func RandString() string {
|
func RandString() string {
|
||||||
bytes := make([]byte, 16)
|
bytes := make([]byte, 16)
|
||||||
for i := 0; i < 16; i++ {
|
for i := 0; i < 16; i++ {
|
||||||
|
|||||||
@@ -6,6 +6,8 @@ import (
|
|||||||
"net/http"
|
"net/http"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
"git.rosy.net.cn/jx-callback/business/jxutils"
|
||||||
|
|
||||||
"git.rosy.net.cn/baseapi/utils"
|
"git.rosy.net.cn/baseapi/utils"
|
||||||
|
|
||||||
"git.rosy.net.cn/jx-callback/globals"
|
"git.rosy.net.cn/jx-callback/globals"
|
||||||
@@ -18,16 +20,21 @@ func Init() {
|
|||||||
//写入全局变量
|
//写入全局变量
|
||||||
Setup()
|
Setup()
|
||||||
//建立长链接
|
//建立长链接
|
||||||
go Send([]byte(HeartCheckMsg))
|
jxutils.CallMsgHandlerAsync(func() {
|
||||||
|
MtInit()
|
||||||
|
}, "MtInit:"+RandString())
|
||||||
|
|
||||||
//启动定时器
|
//启动定时器
|
||||||
PingTimer()
|
PingTimer()
|
||||||
|
|
||||||
go WriteMessage()
|
jxutils.CallMsgHandlerAsync(func() {
|
||||||
|
WriteMessage()
|
||||||
|
}, "WriteMessage:"+RandString())
|
||||||
|
|
||||||
go Manager.Start()
|
jxutils.CallMsgHandlerAsync(func() {
|
||||||
|
Manager.Start()
|
||||||
|
}, "Manager Start:"+RandString())
|
||||||
|
|
||||||
//fmt.Printf("服务器启动成功,端口号:%s\n", CommonSetting.HttpPort)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func Run(w http.ResponseWriter, r *http.Request) {
|
func Run(w http.ResponseWriter, r *http.Request) {
|
||||||
@@ -54,8 +61,8 @@ func Run(w http.ResponseWriter, r *http.Request) {
|
|||||||
} else {
|
} else {
|
||||||
clientID = temp
|
clientID = temp
|
||||||
}
|
}
|
||||||
globals.SugarLogger.Debugf("Run clientID=%s", clientID)
|
|
||||||
clientSocket := NewClient(clientID, conn)
|
clientSocket := NewClient(clientID, conn, ClientTypeJx)
|
||||||
|
|
||||||
//读取客户端消息
|
//读取客户端消息
|
||||||
clientSocket.Read()
|
clientSocket.Read()
|
||||||
@@ -69,40 +76,18 @@ func Run(w http.ResponseWriter, r *http.Request) {
|
|||||||
Manager.Connect <- clientSocket
|
Manager.Connect <- clientSocket
|
||||||
}
|
}
|
||||||
|
|
||||||
func StartWebSocket(conn *websocket.Conn, clientID string, err error) {
|
|
||||||
|
|
||||||
//设置读取消息大小上线
|
|
||||||
conn.SetReadLimit(maxMessageSize)
|
|
||||||
|
|
||||||
clientSocket := NewClient(clientID, conn)
|
|
||||||
|
|
||||||
//读取客户端消息
|
|
||||||
clientSocket.Read()
|
|
||||||
|
|
||||||
if err = ConnRender(conn, renderData{ClientId: clientID}); err != nil {
|
|
||||||
_ = conn.Close()
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// 用户连接事件
|
|
||||||
Manager.Connect <- clientSocket
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
// PingTimer 定时器发送心跳
|
// PingTimer 定时器发送心跳
|
||||||
func PingTimer() {
|
func PingTimer() {
|
||||||
go func() {
|
go func() {
|
||||||
ticker := time.NewTicker(heartbeatInterval)
|
ticker := time.NewTicker(heartbeatInterval)
|
||||||
defer ticker.Stop()
|
defer ticker.Stop()
|
||||||
//测试用
|
//测试用
|
||||||
i := 0
|
//i := 0
|
||||||
for {
|
for {
|
||||||
i++
|
//i++
|
||||||
<-ticker.C
|
<-ticker.C
|
||||||
//对美团发送心跳
|
|
||||||
Send([]byte(HeartCheckMsg))
|
|
||||||
|
|
||||||
for clientId, conn := range Manager.AllClient() {
|
for clientId, conn := range Manager.AllClient() {
|
||||||
|
if conn.ClientType == ClientTypeJx {
|
||||||
if err := conn.Socket.WriteControl(websocket.PingMessage, []byte{}, time.Now().Add(time.Second)); err != nil {
|
if err := conn.Socket.WriteControl(websocket.PingMessage, []byte{}, time.Now().Add(time.Second)); err != nil {
|
||||||
Manager.DisConnect <- conn
|
Manager.DisConnect <- conn
|
||||||
globals.SugarLogger.Debugf("发送心跳失败: %s 总连接数:%d", clientId, Manager.Count())
|
globals.SugarLogger.Debugf("发送心跳失败: %s 总连接数:%d", clientId, Manager.Count())
|
||||||
@@ -110,7 +95,13 @@ func PingTimer() {
|
|||||||
if err := ConnRender(conn.Socket, renderData{ClientId: clientId}); err != nil {
|
if err := ConnRender(conn.Socket, renderData{ClientId: clientId}); err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
globals.SugarLogger.Debugf("发送心跳 clientId=%s,i=%d", clientId, i)
|
} else {
|
||||||
|
if err := conn.Socket.WriteMessage(websocket.TextMessage, []byte(HeartCheckMsg)); err != nil {
|
||||||
|
//对美团重新建立连接
|
||||||
|
MtInit()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//globals.SugarLogger.Debugf("发送心跳 clientId=%s,i=%d", clientId, i)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
@@ -121,16 +112,18 @@ func WriteMessage() {
|
|||||||
i := 0
|
i := 0
|
||||||
for {
|
for {
|
||||||
clientInfo := <-ToClientChan
|
clientInfo := <-ToClientChan
|
||||||
//广播发送通知所有客户端
|
//广播发送通知所有京西客户端
|
||||||
i++
|
i++
|
||||||
fmt.Printf("WriteMessage clientInfo=%s i=%d", utils.Format4Output(clientInfo, false), i)
|
fmt.Printf("WriteMessage clientInfo=%s i=%d", utils.Format4Output(clientInfo, false), i)
|
||||||
if Manager.AllClient() != nil {
|
if Manager.AllClient() != nil {
|
||||||
for _, conn := range Manager.AllClient() {
|
for _, conn := range Manager.AllClient() {
|
||||||
|
if conn.ClientType == ClientTypeJx { //只发送给京西
|
||||||
globals.SugarLogger.Debugf("WriteMessage conn.ClientId=%s", conn.ClientId)
|
globals.SugarLogger.Debugf("WriteMessage conn.ClientId=%s", conn.ClientId)
|
||||||
if err := Render(conn.Socket, clientInfo.MessageId, clientInfo.Code, clientInfo.Msg, clientInfo.Data); err != nil {
|
if err := Render(conn.Socket, clientInfo.MessageId, clientInfo.Code, clientInfo.Msg, clientInfo.Data); err != nil {
|
||||||
Manager.DisConnect <- conn
|
Manager.DisConnect <- conn
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
globals.SugarLogger.Debugf("无客户端连接,请检查")
|
globals.SugarLogger.Debugf("无客户端连接,请检查")
|
||||||
return
|
return
|
||||||
@@ -162,6 +155,8 @@ func (c *Client) Read() {
|
|||||||
go func() {
|
go func() {
|
||||||
for {
|
for {
|
||||||
messageType, msg, err := c.Socket.ReadMessage()
|
messageType, msg, err := c.Socket.ReadMessage()
|
||||||
|
temp := string(msg)
|
||||||
|
fmt.Print(temp)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if messageType == -1 && websocket.IsCloseError(err, websocket.CloseGoingAway, websocket.CloseNormalClosure, websocket.CloseNoStatusReceived) {
|
if messageType == -1 && websocket.IsCloseError(err, websocket.CloseGoingAway, websocket.CloseNormalClosure, websocket.CloseNoStatusReceived) {
|
||||||
Manager.DisConnect <- c
|
Manager.DisConnect <- c
|
||||||
@@ -169,10 +164,8 @@ func (c *Client) Read() {
|
|||||||
} else if messageType != websocket.PingMessage {
|
} else if messageType != websocket.PingMessage {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
SendToVendor(msg)
|
|
||||||
return
|
|
||||||
}
|
}
|
||||||
|
SendToVendor(msg)
|
||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
}
|
}
|
||||||
@@ -197,10 +190,11 @@ func (manager *ClientManager) EventDisconnect(client *Client) {
|
|||||||
//以下为客户端Client操作*******************************************
|
//以下为客户端Client操作*******************************************
|
||||||
|
|
||||||
// NewClient 初始化Client
|
// NewClient 初始化Client
|
||||||
func NewClient(clientId string, socket *websocket.Conn) *Client {
|
func NewClient(clientId string, socket *websocket.Conn, clientType string) *Client {
|
||||||
return &Client{
|
return &Client{
|
||||||
ClientId: clientId,
|
ClientId: clientId,
|
||||||
Socket: socket,
|
Socket: socket,
|
||||||
|
ClientType: clientType,
|
||||||
ConnectTime: uint64(time.Now().Unix()),
|
ConnectTime: uint64(time.Now().Unix()),
|
||||||
IsDeleted: false,
|
IsDeleted: false,
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -122,6 +122,10 @@ func (p *PurchaseHandler) Map2Order(orderData map[string]interface{}) (order *mo
|
|||||||
// 因为美团外卖不能自动设置商家门店号,且只能通过商家门店号来访问门店,
|
// 因为美团外卖不能自动设置商家门店号,且只能通过商家门店号来访问门店,
|
||||||
// 为了在后台设置简单一致,把app_poi_code直接当成平台门店号使用(即在后台设置时,平台门店号与商家门店号一样)
|
// 为了在后台设置简单一致,把app_poi_code直接当成平台门店号使用(即在后台设置时,平台门店号与商家门店号一样)
|
||||||
// 订单中wm_poi_id实际来平台门店号,app_poi_code为商家门店号,这样一来,这两个就相同了
|
// 订单中wm_poi_id实际来平台门店号,app_poi_code为商家门店号,这样一来,这两个就相同了
|
||||||
|
|
||||||
|
//_修改为,
|
||||||
|
caution := strings.ReplaceAll(utils.Interface2String(result["caution"]), "_", ",")
|
||||||
|
|
||||||
order = &model.GoodsOrder{
|
order = &model.GoodsOrder{
|
||||||
VendorOrderID: vendorOrderID,
|
VendorOrderID: vendorOrderID,
|
||||||
// VendorOrderID2: utils.Int64ToStr(utils.MustInterface2Int64(result["wm_order_id_view"])),
|
// VendorOrderID2: utils.Int64ToStr(utils.MustInterface2Int64(result["wm_order_id_view"])),
|
||||||
@@ -135,7 +139,8 @@ func (p *PurchaseHandler) Map2Order(orderData map[string]interface{}) (order *mo
|
|||||||
ConsigneeMobile: jxutils.FormalizeMobile(result["recipient_phone"].(string)),
|
ConsigneeMobile: jxutils.FormalizeMobile(result["recipient_phone"].(string)),
|
||||||
ConsigneeAddress: result["recipient_address"].(string),
|
ConsigneeAddress: result["recipient_address"].(string),
|
||||||
CoordinateType: model.CoordinateTypeMars,
|
CoordinateType: model.CoordinateTypeMars,
|
||||||
BuyerComment: utils.TrimBlankChar(utils.Interface2String(result["caution"])),
|
//BuyerComment: utils.TrimBlankChar(utils.Interface2String(result["caution"])),
|
||||||
|
BuyerComment: utils.TrimBlankChar(caution),
|
||||||
ExpectedDeliveredTime: getTimeFromTimestamp(utils.Interface2Int64WithDefault(result["delivery_time"], 0)),
|
ExpectedDeliveredTime: getTimeFromTimestamp(utils.Interface2Int64WithDefault(result["delivery_time"], 0)),
|
||||||
PickDeadline: utils.DefaultTimeValue,
|
PickDeadline: utils.DefaultTimeValue,
|
||||||
VendorStatus: utils.Int64ToStr(utils.MustInterface2Int64(result["status"])),
|
VendorStatus: utils.Int64ToStr(utils.MustInterface2Int64(result["status"])),
|
||||||
|
|||||||
@@ -26,7 +26,8 @@ tiktokShopAppSecret = "c397aa9f-3927-47c4-8cfe-4d84e02602e0"
|
|||||||
|
|
||||||
autonaviKey = "ef64f638f31e05cb7bde28790f7309fe"
|
autonaviKey = "ef64f638f31e05cb7bde28790f7309fe"
|
||||||
|
|
||||||
baidunaviAK = "eL94zToVOdGDTkNQxV8dnEQ1ZRcB2UKb"
|
# baidunaviAK = "eL94zToVOdGDTkNQxV8dnEQ1ZRcB2UKb"
|
||||||
|
baidunaviAK = "wW2AwzPS0hdaPy5QLalzso7ARX5uYZtZ"
|
||||||
baidunaviSK = "ZG0OOpOsOVURUwAkkmoHQFKRCbzn0zGb"
|
baidunaviSK = "ZG0OOpOsOVURUwAkkmoHQFKRCbzn0zGb"
|
||||||
|
|
||||||
disableElm = true
|
disableElm = true
|
||||||
|
|||||||
@@ -359,3 +359,24 @@ func (c *CmsController) GetVendorOrgCodeInfo() {
|
|||||||
return retVal, "", err
|
return retVal, "", err
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// @Title 得到商家与用户之间骑行路线规划
|
||||||
|
// @Description 得到商家与用户之间骑行路线规划
|
||||||
|
// @Param token header string true "认证token"
|
||||||
|
// @Param sLng query int true "商家经度"
|
||||||
|
// @Param sLat query int true "商家纬度"
|
||||||
|
// @Param uLng query int true "用户经度"
|
||||||
|
// @Param uLat query int true "用户纬度"
|
||||||
|
// @Success 200 {object} controllers.CallResult
|
||||||
|
// @Failure 200 {object} controllers.CallResult
|
||||||
|
// @router /GetSToURidingDistance [get]
|
||||||
|
func (c *CmsController) GetSToURidingDistance() {
|
||||||
|
c.callGetSToURidingDistance(func(params *tCmsGetSToURidingDistanceParams) (retVal interface{}, errCode string, err error) {
|
||||||
|
sLng := jxutils.IntCoordinate2Standard(params.SLng)
|
||||||
|
sLat := jxutils.IntCoordinate2Standard(params.SLat)
|
||||||
|
uLng := jxutils.IntCoordinate2Standard(params.ULng)
|
||||||
|
uLat := jxutils.IntCoordinate2Standard(params.ULat)
|
||||||
|
retVal, err = cms.GetSToURidingDistance(sLng, sLat, uLng, uLat)
|
||||||
|
return retVal, "", err
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|||||||
@@ -11,46 +11,13 @@ type IMController struct {
|
|||||||
web.Controller
|
web.Controller
|
||||||
}
|
}
|
||||||
|
|
||||||
var maxMessageSize = int64(8192) // 最大的消息大小
|
|
||||||
|
|
||||||
// @Title IM初始化长链接
|
// @Title IM初始化长链接
|
||||||
// @Description IM初始化长链接
|
// @Description IM初始化长链接
|
||||||
// @Success 200 {object} controllers.CallResult
|
// @Success 200 {object} controllers.CallResult
|
||||||
// @Failure 200 {object} controllers.CallResult
|
// @Failure 200 {object} controllers.CallResult
|
||||||
// @router /StartWebSocket [get]
|
// @router /StartWebSocket [get]
|
||||||
func (c *IMController) StartWebSocket() {
|
func (c *IMController) StartWebSocket() {
|
||||||
|
|
||||||
im.Run(c.Ctx.ResponseWriter, c.Ctx.Request)
|
im.Run(c.Ctx.ResponseWriter, c.Ctx.Request)
|
||||||
//
|
|
||||||
//upgrader.CheckOrigin = func(r *http.Request) bool {
|
|
||||||
// return true
|
|
||||||
//}
|
|
||||||
//conn, err := upgrader.Upgrade(c.Ctx.ResponseWriter, c.Ctx.Request, nil)
|
|
||||||
//if err != nil {
|
|
||||||
// globals.SugarLogger.Errorf("upgrade error: %v", err)
|
|
||||||
// return
|
|
||||||
//}
|
|
||||||
//defer conn.Close()
|
|
||||||
//
|
|
||||||
//clientID := c.GetString("clientID")
|
|
||||||
//globals.SugarLogger.Debugf("clientID=%s", clientID)
|
|
||||||
//
|
|
||||||
////设置读取消息大小上线
|
|
||||||
//conn.SetReadLimit(maxMessageSize)
|
|
||||||
//
|
|
||||||
//clientSocket := im.NewClient(clientID, conn)
|
|
||||||
//
|
|
||||||
////读取客户端消息
|
|
||||||
//clientSocket.Read()
|
|
||||||
//
|
|
||||||
//if err = im.ConnRender(conn, im.RetData{Data: clientID}); err != nil {
|
|
||||||
// _ = conn.Close()
|
|
||||||
// return
|
|
||||||
//}
|
|
||||||
//
|
|
||||||
//// 用户连接事件
|
|
||||||
//im.Manager.Connect <- clientSocket
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// @Title IM获取门店用户聊天列表
|
// @Title IM获取门店用户聊天列表
|
||||||
|
|||||||
@@ -204,6 +204,7 @@ func (c *LogisticsController) LogisticsQuery() {
|
|||||||
}
|
}
|
||||||
c.Data["json"] = wayBillDetail
|
c.Data["json"] = wayBillDetail
|
||||||
c.ServeJSON()
|
c.ServeJSON()
|
||||||
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
returnParam := &LogisticsQueryRest{
|
returnParam := &LogisticsQueryRest{
|
||||||
|
|||||||
3
main.go
3
main.go
@@ -97,11 +97,10 @@ func Init() {
|
|||||||
auto_delivery.Init() // 初始化骑手列表
|
auto_delivery.Init() // 初始化骑手列表
|
||||||
|
|
||||||
im.Init() //初始化ws连接
|
im.Init() //初始化ws连接
|
||||||
//http.HandleFunc("/ws", im.Run)
|
|
||||||
|
|
||||||
//test
|
//test
|
||||||
//mux := http.NewServeMux()
|
//mux := http.NewServeMux()
|
||||||
//mux.HandleFunc("/v2/im/Run", im.Run)
|
//mux.HandleFunc("/v2/im/SendToVendor", im.Run)
|
||||||
//go http.ListenAndServe(":8082", mux)
|
//go http.ListenAndServe(":8082", mux)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -448,6 +448,15 @@ func init() {
|
|||||||
Filters: nil,
|
Filters: nil,
|
||||||
Params: nil})
|
Params: nil})
|
||||||
|
|
||||||
|
web.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:CmsController"] = append(web.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:CmsController"],
|
||||||
|
web.ControllerComments{
|
||||||
|
Method: "GetSToURidingDistance",
|
||||||
|
Router: `/GetSToURidingDistance`,
|
||||||
|
AllowHTTPMethods: []string{"get"},
|
||||||
|
MethodParams: param.Make(),
|
||||||
|
Filters: nil,
|
||||||
|
Params: nil})
|
||||||
|
|
||||||
web.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:CmsController"] = append(web.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:CmsController"],
|
web.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:CmsController"] = append(web.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:CmsController"],
|
||||||
web.ControllerComments{
|
web.ControllerComments{
|
||||||
Method: "NewConfig",
|
Method: "NewConfig",
|
||||||
|
|||||||
Reference in New Issue
Block a user