抖音授权登录,小程序门店切换,门店状态改变日志打印!
This commit is contained in:
@@ -6,6 +6,7 @@ import (
|
||||
"encoding/json"
|
||||
"errors"
|
||||
"fmt"
|
||||
"git.rosy.net.cn/jx-callback/business/jxstore/event"
|
||||
"io"
|
||||
"math"
|
||||
"mime/multipart"
|
||||
@@ -537,6 +538,7 @@ func GetStores(ctx *jxcontext.Context, keyword string, params map[string]interfa
|
||||
}
|
||||
} else {
|
||||
//storeIDs2 = append(storeIDs2, -1)
|
||||
// 商家小程序用户切换门店,如果角色storeIDsMap没有数据则查询传入数据
|
||||
storeIDs2 = append(storeIDs2, int(utils.Interface2Int64WithDefault(params["storeID"], 0)))
|
||||
}
|
||||
}
|
||||
@@ -5262,11 +5264,17 @@ func UpdateOrCreateCourierStoresByBrand(ctx *jxcontext.Context, brandID, vendorI
|
||||
return hint, err
|
||||
}
|
||||
|
||||
//StoreStatusDisabled = -2
|
||||
//StoreStatusClosed = -1
|
||||
//StoreStatusHaveRest = 0
|
||||
//StoreStatusOpened = 1
|
||||
// 定时任务更新门店信息,添加storeStatuss参数,只查询和同步营业的门店 1营业0临时休息-1休息-2禁用
|
||||
func RefreshStoreIsOnline(ctx *jxcontext.Context) (err error) {
|
||||
var (
|
||||
db = dao.GetDB()
|
||||
)
|
||||
stores, _ := dao.GetStoresMapList(db, []int{model.VendorIDMTWM, model.VendorIDJD, model.VendorIDEBAI}, nil, nil, model.StoreStatusAll, model.StoreIsSyncAll, "", "", "")
|
||||
|
||||
stores, _ := dao.GetStoresMapList(db, []int{model.VendorIDMTWM, model.VendorIDJD, model.VendorIDEBAI}, nil, []int{model.StoreStatusOpened, model.StoreStatusHaveRest}, model.StoreStatusAll, model.StoreIsSyncAll, "", "", "")
|
||||
task := tasksch.NewParallelTask("RefreshStoreBind", tasksch.NewParallelConfig().SetIsContinueWhenError(true), ctx,
|
||||
func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) {
|
||||
storeMap := batchItemList[0].(*model.StoreMap)
|
||||
@@ -5278,6 +5286,8 @@ func RefreshStoreIsOnline(ctx *jxcontext.Context) (err error) {
|
||||
storeMap.IsOnline = -1
|
||||
}
|
||||
dao.UpdateEntity(db, storeMap, "IsOnline")
|
||||
store := fmt.Sprintf("门店id:%d,门店名称:%s,第三方门店状态:%d,本地门店修改后状态:%d,第三方平台Id(美团,饿了么...):%d", store.Store.ID, store.Store.Name, store.Store.Status, storeMap.IsOnline, storeMap.VendorID)
|
||||
event.AddOperateEvent(ctx, ctx.GetTrackInfo(), store, err.Error(), "", int(time.Now().UnixNano()/1000), "UpdateStore")
|
||||
}
|
||||
}
|
||||
return retVal, err
|
||||
|
||||
@@ -2,6 +2,7 @@ package misc
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"git.rosy.net.cn/jx-callback/business/partner/delivery"
|
||||
"sync"
|
||||
"time"
|
||||
|
||||
@@ -388,7 +389,7 @@ func Init() {
|
||||
})
|
||||
// 每五分钟轮询一次推送骑手信息坐标给美团
|
||||
ScheduleTimerFuncByInterval(func() {
|
||||
//delivery.GetOrderRiderInfoToPlatform("")
|
||||
delivery.GetOrderRiderInfoToPlatform("")
|
||||
}, 10*time.Second, 5*time.Minute)
|
||||
}
|
||||
if configs, err := dao.QueryConfigs(dao.GetDB(), "ebaiStorePageCookie", model.ConfigTypeCookie, ""); err == nil {
|
||||
|
||||
@@ -34,6 +34,7 @@ type GoodsOrderExt struct {
|
||||
DesiredFee int64 `json:"desiredFee"` // 运单总费用
|
||||
WaybillCreatedAt time.Time `orm:"type(datetime);index" json:"waybillCreatedAt"`
|
||||
WaybillFinishedAt time.Time `orm:"type(datetime)" json:"waybillFinishedAt"`
|
||||
VendorWaybillID2 string `orm:"column(vendor_waybill_id2);size(48)" json:"vendorWaybillID2"` // 某些平台有多个ID,比如美团配送,当前美团配送的 delivery_id存这里
|
||||
|
||||
DistrictName string `json:"districtName"`
|
||||
CityName string `json:"cityName"`
|
||||
|
||||
@@ -821,7 +821,7 @@ func GetOrders(db *DaoDB, ids []int64, isIncludeSku, isIncludeFake bool, fromDat
|
||||
DISTINCT t1.*,
|
||||
-- CAST(IF(t1.earning_price <> 0, t1.earning_price, IF(t1.shop_price <> 0 && t1.shop_price < t1.sale_price, t1.shop_price, t1.sale_price) * IF(t1.order_pay_percentage > 0, t1.order_pay_percentage, %d) / 100) AS SIGNED) earning_price,
|
||||
t2.status waybill_status, t2.courier_name, t2.courier_mobile,
|
||||
t2.actual_fee, t2.desired_fee, t2.waybill_created_at, t2.waybill_finished_at,
|
||||
t2.actual_fee, t2.desired_fee, t2.waybill_created_at, t2.waybill_finished_at,t2.vendor_waybill_id2,
|
||||
t5.pay_percentage, t5.old_pay_percentage, t5.market_man_phone, tu.name market_man_name,
|
||||
t5.operator_phone, t5.operator_phone2, t5.operator_phone3, tu1.name operator_name, tu2.name operator_name2, tu3.name operator_name3,
|
||||
t6.vendor_pay_percentage,
|
||||
|
||||
@@ -84,7 +84,7 @@ func (c *DeliveryHandler) onWaybillMsg(msg *dadaapi.CallbackMsg) (retVal *dadaap
|
||||
}
|
||||
case dadaapi.OrderStatusDelivering:
|
||||
order.Status = model.WaybillStatusDelivering
|
||||
//delivery.GetOrderRiderInfoToPlatform(order.VendorOrderID)
|
||||
delivery.GetOrderRiderInfoToPlatform(order.VendorOrderID)
|
||||
case dadaapi.OrderStatusFinished:
|
||||
order.Status = model.WaybillStatusDelivered
|
||||
case dadaapi.OrderStatusCanceled, dadaapi.OrderStatusExpired:
|
||||
|
||||
@@ -2,6 +2,7 @@ package delivery
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"git.rosy.net.cn/baseapi/platformapi/mtpsapi"
|
||||
"math"
|
||||
"time"
|
||||
|
||||
@@ -163,58 +164,58 @@ func OnWaybillCreated(waybill *model.Waybill) {
|
||||
//40-骑手已送达(C端:商品已送达;B端:骑手已送达)
|
||||
//100-配送单已取消(C端:商家已接单;B端:配送已取消)
|
||||
//注:若同步配送状态为“配送单已取消”,接口仍支持继续同步配送状态。 说明:商家如未上传此信息,则平台默认值为20(现已要求必传)。
|
||||
//func GetOrderRiderInfoToPlatform(orderId string) {
|
||||
// params := make(map[string]interface{}, 0)
|
||||
// params["brandID"] = 0
|
||||
// params["statuss"] = 20
|
||||
// params["isDateFinish"] = false
|
||||
// params["isIncludeFake"] = true
|
||||
// params["mustInvoice"] = false
|
||||
// params["adjustCount"] = 0
|
||||
// params["waybillVendorIDs"] = `[101,102,103]`
|
||||
// if orderId != "" { // 订单id会忽略其他参数
|
||||
// params["keyword"] = orderId
|
||||
// }
|
||||
// //params["offset"] = 0
|
||||
// //params["pageSize"] = 10000
|
||||
// // 查询三天内一万条数据
|
||||
// orders, _, err := dao.GetOrders(dao.GetDB(), nil, false, true, time.Now().Add(-24*3*time.Hour).Format("2006-01-02"), time.Now().Format("2006-01-02"), false, nil, false, "", params, 0, 10000)
|
||||
// if err != nil {
|
||||
// globals.SugarLogger.Errorf("GetOrder err :%v", err)
|
||||
// return
|
||||
// }
|
||||
//
|
||||
// for _, v := range orders {
|
||||
// var riderInfo *mtpsapi.RiderInfo
|
||||
// if handlerInfo := partner.GetDeliveryPlatformFromVendorID(v.WaybillVendorID); handlerInfo != nil {
|
||||
// riderInfo, err = handlerInfo.Handler.GetRiderInfo(v.VendorOrderID, utils.Str2Int64(v.VendorWaybillId2), v.VendorWaybillID)
|
||||
// if err != nil {
|
||||
// globals.SugarLogger.Errorf("Get Order waybill rider info err :%v", err)
|
||||
// continue
|
||||
// }
|
||||
// }
|
||||
//
|
||||
// // 目前只推送美团骑手信息
|
||||
// switch v.VendorID {
|
||||
// case model.VendorIDMTWM: // 美团发单
|
||||
// paramsMap := utils.Struct2Map(riderInfo, "", true)
|
||||
// if handler := partner.GetPurchaseOrderHandlerFromVendorID(v.VendorID); handler != nil {
|
||||
// if err := handler.GetOrderRider(v.VendorOrgCode, v.VendorOrderID, paramsMap); err != nil {
|
||||
// globals.SugarLogger.Errorf("Error pushing meituan rider information :%v", err)
|
||||
// }
|
||||
// }
|
||||
// case model.VendorIDELM: // 饿了么
|
||||
// case model.VendorIDEBAI: // 饿百发单
|
||||
//
|
||||
// case model.VendorIDJD: // 京东发单
|
||||
// case model.VendorIDGD: // 美团发单
|
||||
// case model.VendorIDYB: // 银豹发单
|
||||
// case model.VendorIDJDShop: // 京东商城
|
||||
// case model.VendorIDWSC: // 微盟微商城
|
||||
// default:
|
||||
// globals.SugarLogger.Errorf("Order source error, non system order")
|
||||
// return
|
||||
// }
|
||||
// }
|
||||
// return
|
||||
//}
|
||||
func GetOrderRiderInfoToPlatform(orderId string) {
|
||||
params := make(map[string]interface{}, 0)
|
||||
params["brandID"] = 0
|
||||
params["statuss"] = 20
|
||||
params["isDateFinish"] = false
|
||||
params["isIncludeFake"] = true
|
||||
params["mustInvoice"] = false
|
||||
params["adjustCount"] = 0
|
||||
params["waybillVendorIDs"] = `[101,102,103]`
|
||||
if orderId != "" { // 订单id会忽略其他参数
|
||||
params["keyword"] = orderId
|
||||
}
|
||||
//params["offset"] = 0
|
||||
//params["pageSize"] = 10000
|
||||
// 查询三天内一万条数据
|
||||
orders, _, err := dao.GetOrders(dao.GetDB(), nil, false, true, time.Now().Add(-24*3*time.Hour).Format("2006-01-02"), time.Now().Format("2006-01-02"), false, nil, false, "", params, 0, 10000)
|
||||
if err != nil {
|
||||
globals.SugarLogger.Errorf("GetOrder err :%v", err)
|
||||
return
|
||||
}
|
||||
|
||||
for _, v := range orders {
|
||||
var riderInfo *mtpsapi.RiderInfo
|
||||
if handlerInfo := partner.GetDeliveryPlatformFromVendorID(v.WaybillVendorID); handlerInfo != nil {
|
||||
riderInfo, err = handlerInfo.Handler.GetRiderInfo(v.VendorOrderID, utils.Str2Int64(v.VendorWaybillID2), v.VendorWaybillID)
|
||||
if err != nil {
|
||||
globals.SugarLogger.Errorf("Get Order waybill rider info err :%v", err)
|
||||
continue
|
||||
}
|
||||
}
|
||||
|
||||
// 目前只推送美团骑手信息
|
||||
switch v.VendorID {
|
||||
case model.VendorIDMTWM: // 美团发单
|
||||
paramsMap := utils.Struct2Map(riderInfo, "", true)
|
||||
if handler := partner.GetPurchaseOrderHandlerFromVendorID(v.VendorID); handler != nil {
|
||||
if err := handler.GetOrderRider(v.VendorOrgCode, v.VendorOrderID, paramsMap); err != nil {
|
||||
globals.SugarLogger.Errorf("Error pushing meituan rider information :%v", err)
|
||||
}
|
||||
}
|
||||
case model.VendorIDELM: // 饿了么
|
||||
case model.VendorIDEBAI: // 饿百发单
|
||||
|
||||
case model.VendorIDJD: // 京东发单
|
||||
case model.VendorIDGD: // 美团发单
|
||||
case model.VendorIDYB: // 银豹发单
|
||||
case model.VendorIDJDShop: // 京东商城
|
||||
case model.VendorIDWSC: // 微盟微商城
|
||||
default:
|
||||
globals.SugarLogger.Errorf("Order source error, non system order")
|
||||
return
|
||||
}
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
@@ -235,7 +235,7 @@ func OnWaybillMsg(msg *fnpsapi.OrderStatusNottify) (resp *fnpsapi.CallbackRespon
|
||||
order.Status = model.WaybillStatusCourierArrived
|
||||
case fnpsapi.OrderStatusDelivering: // 2 配送中
|
||||
order.Status = model.WaybillStatusDelivering
|
||||
//delivery.GetOrderRiderInfoToPlatform(order.VendorOrderID)
|
||||
delivery.GetOrderRiderInfoToPlatform(order.VendorOrderID)
|
||||
case fnpsapi.OrderStatusDelivered: // 3 已经送达
|
||||
order.Status = model.WaybillStatusDelivered
|
||||
case fnpsapi.OrderStatusAcceptCacle: // 4取消订单
|
||||
|
||||
@@ -103,7 +103,7 @@ func (c *DeliveryHandler) onWaybillMsg(msg *mtpsapi.CallbackOrderMsg) (retVal *m
|
||||
order.Remark = order.CourierName + "," + order.CourierMobile
|
||||
case mtpsapi.OrderStatusPickedUp:
|
||||
order.Status = model.WaybillStatusDelivering
|
||||
///delivery.GetOrderRiderInfoToPlatform(order.VendorOrderID)
|
||||
delivery.GetOrderRiderInfoToPlatform(order.VendorOrderID)
|
||||
case mtpsapi.OrderStatusDeliverred:
|
||||
order.Status = model.WaybillStatusDelivered
|
||||
case mtpsapi.OrderStatusCanceled:
|
||||
|
||||
@@ -2,7 +2,9 @@ package ebai
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"git.rosy.net.cn/jx-callback/business/jxstore/event"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"git.rosy.net.cn/baseapi/platformapi/autonavi"
|
||||
"git.rosy.net.cn/baseapi/platformapi/ebaiapi"
|
||||
@@ -579,6 +581,11 @@ func (c *PurchaseHandler) onShopMsgPush(msg *ebaiapi.CallbackMsg) (response *eba
|
||||
if err == nil {
|
||||
err = partner.CurStoreManager.OnStoreStatusChanged(vendorStoreID, model.VendorIDEBAI, storeStatus)
|
||||
}
|
||||
// 操作日志(ebai)
|
||||
ctx := jxcontext.AdminCtx
|
||||
store := fmt.Sprintf("饿百外卖回调门店改变回调(营业状态/审核状态):门店id:%s,饿百门店状态:%d.]", vendorStoreID, storeStatus)
|
||||
event.AddOperateEvent(ctx, ctx.GetTrackInfo(), store, err.Error(), "", int(time.Now().UnixNano()/1000), "UpdateStore")
|
||||
|
||||
return api.EbaiAPI.Err2CallbackResponse(msg.Cmd, err, nil)
|
||||
}
|
||||
|
||||
|
||||
@@ -84,7 +84,7 @@ func TestUpdateStore2(t *testing.T) {
|
||||
// }
|
||||
|
||||
func TestSyncQualify(t *testing.T) {
|
||||
storeDetail, err := dao.GetStoreDetail(dao.GetDB(), 102610, model.VendorIDJD)
|
||||
storeDetail, err := dao.GetStoreDetail(dao.GetDB(), 102610, model.VendorIDJD, "")
|
||||
if err != nil {
|
||||
t.Fatal(err.Error())
|
||||
}
|
||||
|
||||
@@ -48,6 +48,9 @@ func (p *PurchaseHandler) GetOrder(vendorOrgCode, vendorOrderID, vendorStoreID s
|
||||
Current: 1,
|
||||
PageSize: 1,
|
||||
})
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return p.Map2Order(utils.Struct2FlatMap(resultOrders)), err
|
||||
}
|
||||
func (p *PurchaseHandler) GetOrderStatus(vendorOrgCode, vendorOrderID string) (status int, err error) {
|
||||
@@ -81,6 +84,10 @@ func (p *PurchaseHandler) AcceptOrRefuseOrder(order *model.GoodsOrder, isAcceptI
|
||||
}
|
||||
func (p *PurchaseHandler) PickupGoods(order *model.GoodsOrder, isSelfDelivery bool, userName string) (err error) {
|
||||
status, err := p.GetOrderStatus(order.VendorOrgCode, order.VendorOrderID2)
|
||||
if err != nil {
|
||||
globals.SugarLogger.Debug("jdShop GetOrders err := ", err)
|
||||
return err
|
||||
}
|
||||
//说明此时该订单在平台上已经取消了
|
||||
if status == model.OrderStatusCanceled {
|
||||
err = ChangeOrderStatus(order.VendorOrderID, model.OrderStatusCanceled, "订单在京东商城已被取消!")
|
||||
|
||||
@@ -4,14 +4,11 @@ import (
|
||||
"encoding/json"
|
||||
"errors"
|
||||
"fmt"
|
||||
"math"
|
||||
"regexp"
|
||||
"strings"
|
||||
|
||||
"git.rosy.net.cn/baseapi/platformapi/mtwmapi"
|
||||
"git.rosy.net.cn/baseapi/utils"
|
||||
"git.rosy.net.cn/baseapi/utils/errlist"
|
||||
"git.rosy.net.cn/jx-callback/business/jxcallback/scheduler"
|
||||
"git.rosy.net.cn/jx-callback/business/jxstore/event"
|
||||
"git.rosy.net.cn/jx-callback/business/jxutils"
|
||||
"git.rosy.net.cn/jx-callback/business/jxutils/jxcontext"
|
||||
"git.rosy.net.cn/jx-callback/business/jxutils/tasksch"
|
||||
@@ -20,6 +17,10 @@ import (
|
||||
"git.rosy.net.cn/jx-callback/business/partner"
|
||||
"git.rosy.net.cn/jx-callback/globals"
|
||||
"git.rosy.net.cn/jx-callback/globals/api"
|
||||
"math"
|
||||
"regexp"
|
||||
"strings"
|
||||
"time"
|
||||
)
|
||||
|
||||
var (
|
||||
@@ -344,11 +345,15 @@ func (p *PurchaseHandler) onStoreStatusChanged(msg *mtwmapi.CallbackMsg) (respon
|
||||
}
|
||||
}
|
||||
}
|
||||
fmt.Println(storeStatus)
|
||||
//if err == nil {
|
||||
// err = partner.CurStoreManager.OnStoreStatusChanged(vendorStoreID, model.VendorIDMTWM, storeStatus)
|
||||
//}
|
||||
|
||||
if err == nil {
|
||||
err = partner.CurStoreManager.OnStoreStatusChanged(vendorStoreID, model.VendorIDMTWM, storeStatus)
|
||||
}
|
||||
response = mtwmapi.Err2CallbackResponse(err, "")
|
||||
// 操作日志(美团外卖)
|
||||
ctx := jxcontext.AdminCtx
|
||||
store := fmt.Sprintf("美团外卖回调门店改变回调(营业状态/审核状态):门店id:%s,美团门店状态:%d.[121营业,120休息,18上线,19下线]", vendorStoreID, int(utils.Str2Int64(msg.FormData.Get("poi_status"))))
|
||||
event.AddOperateEvent(ctx, ctx.GetTrackInfo(), store, err.Error(), "", int(time.Now().UnixNano()/1000), "UpdateStore")
|
||||
return response
|
||||
}
|
||||
|
||||
|
||||
@@ -3,6 +3,7 @@ package api
|
||||
import (
|
||||
"git.rosy.net.cn/baseapi/platformapi/jxprintapi"
|
||||
"git.rosy.net.cn/baseapi/platformapi/qywxapi"
|
||||
"git.rosy.net.cn/baseapi/platformapi/tiktok"
|
||||
"time"
|
||||
|
||||
"git.rosy.net.cn/baseapi/platformapi/fnpsapi"
|
||||
@@ -72,12 +73,12 @@ var (
|
||||
WeixinMiniAPI *weixinapi.API // 小程序
|
||||
WeixinMiniAPI2 *weixinapi.API // 小程序2
|
||||
WeixinMiniAPIsc *weixinapi.API //小程序商超
|
||||
//WeixinMiniAPIPrint *weixinapi.API //小程序打印机
|
||||
WeixinMiniAPIPrint *weixinapi.API //小程序打印机
|
||||
WeixinApp *weixinapi.API // app微信登录
|
||||
WeixinMiniAppID2 string
|
||||
WeixinMiniAppID3 string
|
||||
WeixinMiniAppIDsc string
|
||||
//WeixinMiniPrintAppId string
|
||||
WeixinMiniPrintAppId string
|
||||
WxpayAPI *wxpayapi.API // 微信支付API
|
||||
TLpayAPI *tonglianpayapi.API //通联收银宝api
|
||||
FnAPI *fnpsapi.API //蜂鸟配送api
|
||||
@@ -109,7 +110,7 @@ var (
|
||||
Cacher cache.ICacher
|
||||
SMSClient *aliyunsmsclient.SmsClient
|
||||
|
||||
//TiktokApi *tiktok.API
|
||||
TiktokApi *tiktok.API
|
||||
)
|
||||
|
||||
func init() {
|
||||
@@ -253,9 +254,9 @@ func Init() {
|
||||
if WeixinMiniAppIDsc = beego.AppConfig.DefaultString("weixinMiniAppIDsc", ""); WeixinMiniAppIDsc != "" {
|
||||
WeixinMiniAPIsc = weixinapi.New(WeixinMiniAppIDsc, beego.AppConfig.DefaultString("weixinMiniSecretsc", ""))
|
||||
}
|
||||
//if WeixinMiniPrintAppId = beego.AppConfig.DefaultString("weixinAppIdPrint", ""); WeixinMiniPrintAppId != "" {
|
||||
// WeixinMiniAPIPrint = weixinapi.New(WeixinMiniPrintAppId, beego.AppConfig.DefaultString("weixinAppSecretPrint", ""))
|
||||
//}
|
||||
if WeixinMiniPrintAppId = beego.AppConfig.DefaultString("weixinAppIdPrint", ""); WeixinMiniPrintAppId != "" {
|
||||
WeixinMiniAPIPrint = weixinapi.New(WeixinMiniPrintAppId, beego.AppConfig.DefaultString("weixinAppSecretPrint", ""))
|
||||
}
|
||||
|
||||
if globals.WxpayNotifyURL != "" {
|
||||
// WxpayAPI = wxpayapi.New(beego.AppConfig.DefaultString("wxpayAppID"), beego.AppConfig.DefaultString("wxpayAppKey"), beego.AppConfig.DefaultString("wxpayAppMchID"))
|
||||
@@ -293,5 +294,5 @@ func Init() {
|
||||
SMSClient = aliyunsmsclient.New("http://dysmsapi.aliyuncs.com/")
|
||||
|
||||
QywxAPI = qywxapi.New(beego.AppConfig.DefaultString("qywxID", ""), beego.AppConfig.DefaultString("qywxSecret", ""), "")
|
||||
//TiktokApi = tiktok.New(beego.AppConfig.DefaultString("tiktokAppSecret", ""), beego.AppConfig.DefaultString("tiktokAppKey", ""))
|
||||
TiktokApi = tiktok.New(beego.AppConfig.DefaultString("tiktokAppSecret", ""), beego.AppConfig.DefaultString("tiktokAppKey", ""))
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user