Merge branch 'jdshop' of e.coding.net:rosydev/jx-callback into jdshop
This commit is contained in:
@@ -84,7 +84,6 @@ func SplicingTimeToDoudian(openTime1, closeTime1, openTime2, closeTime2 int16, f
|
||||
func (P *PurchaseHandler) CreateStore2(db *dao.DaoDB, storeID int, userName string, params map[string]interface{}, storeDetail *dao.StoreDetail) (vendorStoreID string, err error) {
|
||||
var (
|
||||
vendorStoreIDs string
|
||||
lists []shop_batchCreateStore_request.StoreListItem
|
||||
ShopBatchCreateStoreParam *shop_batchCreateStore_request.ShopBatchCreateStoreParam
|
||||
errList = errlist.New()
|
||||
timeStr = ""
|
||||
@@ -103,32 +102,48 @@ func (P *PurchaseHandler) CreateStore2(db *dao.DaoDB, storeID int, userName stri
|
||||
m[int64(j)] = timeStr
|
||||
}
|
||||
}
|
||||
list := shop_batchCreateStore_request.StoreListItem{
|
||||
RowId: 1,
|
||||
Name: "京西菜市(" + storeDetail.Name + ")",
|
||||
StoreCode: utils.Int2Str(storeDetail.Store.ID),
|
||||
Longitude: utils.Float64ToStr(jxutils.IntCoordinate2Standard(storeDetail.Lng)),
|
||||
Latitude: utils.Float64ToStr(jxutils.IntCoordinate2Standard(storeDetail.Lat)),
|
||||
Province: storeDetail.ProvinceName,
|
||||
City: storeDetail.CityName,
|
||||
District: storeDetail.DistrictName,
|
||||
Address: storeDetail.Address,
|
||||
Contact: storeDetail.Tel1,
|
||||
OpenTime: &shop_batchCreateStore_request.OpenTime{
|
||||
DayMap: m,
|
||||
},
|
||||
}
|
||||
lists = append(lists, list)
|
||||
ShopBatchCreateStoreParam = &shop_batchCreateStore_request.ShopBatchCreateStoreParam{
|
||||
StoreList: lists,
|
||||
StoreList: []shop_batchCreateStore_request.StoreListItem{
|
||||
{
|
||||
RowId: 1,
|
||||
Name: "京西菜市(" + storeDetail.Name + ")",
|
||||
StoreCode: utils.Int2Str(storeDetail.Store.ID),
|
||||
Longitude: utils.Float64ToStr(jxutils.IntCoordinate2Standard(storeDetail.Lng)),
|
||||
Latitude: utils.Float64ToStr(jxutils.IntCoordinate2Standard(storeDetail.Lat)),
|
||||
Province: storeDetail.ProvinceName,
|
||||
City: storeDetail.CityName,
|
||||
District: storeDetail.DistrictName,
|
||||
Address: storeDetail.Address,
|
||||
Contact: storeDetail.Tel1,
|
||||
OpenTime: &shop_batchCreateStore_request.OpenTime{
|
||||
DayMap: m,
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
if resp, err := a.BatchCreateStore(ShopBatchCreateStoreParam); err != nil {
|
||||
return "", err
|
||||
} else {
|
||||
//必须先存进数据库
|
||||
|
||||
storeMap := &model.StoreMap{
|
||||
VendorStoreID: vendorStoreID,
|
||||
StoreID: storeID,
|
||||
VendorID: model.VendorIDDD,
|
||||
VendorOrgCode: storeDetail.VendorOrgCode,
|
||||
Status: 0,
|
||||
DeliveryType: model.StoreDeliveryTypeByStore,
|
||||
PricePercentage: int16(utils.MustInterface2Int64(storeDetail.PricePercentage)),
|
||||
AutoPickup: 1,
|
||||
DeliveryCompetition: 1,
|
||||
IsSync: 1,
|
||||
PricePercentagePack: "",
|
||||
}
|
||||
dao.WrapAddIDCULDEntity(storeMap, userName)
|
||||
if err := dao.CreateEntity(db, storeMap); err != nil {
|
||||
errList.AddErr(dao.CreateEntity(db, storeMap))
|
||||
}
|
||||
vendorStoreIDs = utils.Int64ToStr(resp.ResultList[0].Store.StoreId)
|
||||
if err := CreateOrUpdateAll(storeDetail.VendorOrgCode, int64(storeDetail.Store.ID), resp.ResultList[0].Store.StoreId, int64(storeDetail.DeliveryFeeDeductionFee), utils.Str2Int64(storeDetail.YbStorePrefix)); err != nil {
|
||||
if err := CreateAndBindAllV2(storeDetail.VendorOrgCode, int64(storeDetail.Store.ID), resp.ResultList[0].Store.StoreId, int64(storeDetail.DeliveryFeeDeductionFee), utils.Str2Int64(storeDetail.YbStorePrefix), userName); err != nil {
|
||||
errList.AddErr(err)
|
||||
}
|
||||
}
|
||||
@@ -136,7 +151,7 @@ func (P *PurchaseHandler) CreateStore2(db *dao.DaoDB, storeID int, userName stri
|
||||
return vendorStoreIDs, errors.New(fmt.Sprintf("创建抖店平台店铺相关错误信息:%v", endErr))
|
||||
}
|
||||
|
||||
//电子围栏 仓库 运费模板 限售模板 打包费 更新与绑定
|
||||
// todo 暂时不删除
|
||||
func CreateOrUpdateAll(vendorOrgCode string, storeID, vendorStoreID, deliveryFeeDeductionFee, minPrice int64) error {
|
||||
var (
|
||||
errList = errlist.New()
|
||||
@@ -214,7 +229,6 @@ func CreateOrUpdateAll(vendorOrgCode string, storeID, vendorStoreID, deliveryFee
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
|
||||
}
|
||||
|
||||
//3.平台获取限售模板
|
||||
@@ -265,15 +279,123 @@ func CreateOrUpdateAll(vendorOrgCode string, storeID, vendorStoreID, deliveryFee
|
||||
}
|
||||
}
|
||||
|
||||
func CreateAndBindAllV2(vendorOrgCode string, storeID, vendorStoreID, deliveryFeeDeductionFee, minPrice int64, userName string) error {
|
||||
var (
|
||||
db *dao.DaoDB
|
||||
ctx *jxcontext.Context
|
||||
errList = errlist.New()
|
||||
FreightTemplate = &model.FreightTemplate{
|
||||
VendorStoreID: utils.Int64ToStr(vendorStoreID),
|
||||
StoreID: int(storeID),
|
||||
}
|
||||
)
|
||||
task := tasksch.NewParallelTask("CreateAndBindAllV2", tasksch.NewParallelConfig().SetIsContinueWhenError(true).SetParallelCount(1), ctx,
|
||||
func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) {
|
||||
step := batchItemList[0].(int)
|
||||
switch step {
|
||||
case 0: //1.门店运费模板
|
||||
bindFreightIDs, err := GetStoreFreight(vendorOrgCode, vendorStoreID)
|
||||
if err != nil {
|
||||
globals.SugarLogger.Debugf("获取门店(%d) 绑定运费模板出错:%v", vendorStoreID, err)
|
||||
errList.AddErr(fmt.Errorf("获取门店(%d) 绑定运费模板出错:%v", vendorStoreID, err))
|
||||
}
|
||||
if bindFreightIDs == 0 {
|
||||
if freightTemplateID, err := CreateFreightTemplate(int(storeID)); err != nil || freightTemplateID == 0 || utils.IsNil(freightTemplateID) {
|
||||
globals.SugarLogger.Debugf("京西菜市门店:%d 平台门店:%d 创建运费模板:%d 失败:%v", storeID, vendorStoreID, freightTemplateID, err)
|
||||
errList.AddErr(fmt.Errorf("京西菜市门店:%d 平台门店:%d 创建运费模板:%d 失败:%v", storeID, vendorStoreID, freightTemplateID, err))
|
||||
} else {
|
||||
if err = ShopBindStoreFreight(vendorOrgCode, vendorStoreID, freightTemplateID); err != nil {
|
||||
globals.SugarLogger.Debugf("京西菜市门店:%d 平台门店:%d 绑定运费模板:%d 失败:%v", storeID, vendorStoreID, freightTemplateID, err)
|
||||
errList.AddErr(fmt.Errorf("京西菜市门店:%d 平台门店:%d 绑定运费模板:%d 失败:%v", storeID, vendorStoreID, freightTemplateID, err))
|
||||
} else {
|
||||
FreightTemplate.TemplateID = freightTemplateID
|
||||
}
|
||||
}
|
||||
} else {
|
||||
FreightTemplate.TemplateID = bindFreightIDs
|
||||
}
|
||||
case 1: //2.仓库以及电子围栏
|
||||
warehouseID, err := CreateWarehouse(vendorOrgCode, storeID)
|
||||
if err != nil || len(warehouseID) == 0 || utils.IsNil(warehouseID) {
|
||||
globals.SugarLogger.Debugf("门店(%d) 创建仓库失败:%v", storeID, err)
|
||||
errList.AddErr(fmt.Errorf("门店(%d) 创建仓库失败:%v", storeID, err))
|
||||
} else { //绑定
|
||||
if err = BindStoreWarehouse(vendorOrgCode, utils.Int64ToStr(storeID), vendorStoreID); err != nil { //仓库绑定通过自定义外部ID
|
||||
globals.SugarLogger.Debugf("门店(%d) 绑定仓库:%s 失败:%v", storeID, warehouseID, err)
|
||||
errList.AddErr(fmt.Errorf("门店(%d) 绑定仓库:%s 失败:%v", storeID, warehouseID, err))
|
||||
} else {
|
||||
FreightTemplate.WarehouseID = utils.Str2Int64(warehouseID)
|
||||
}
|
||||
}
|
||||
case 2: //3.电子围栏
|
||||
fenceID, err := CreateFenceByStore(vendorOrgCode, storeID)
|
||||
if err != nil || utils.Str2Int(fenceID) == 0 || utils.IsNil(fenceID) { //不管存在与否 直接创建
|
||||
globals.SugarLogger.Debugf("门店(%d) 创建电子围栏失败:%v", storeID, err)
|
||||
errList.AddErr(fmt.Errorf("门店(%d) 创建电子围栏失败:%v", storeID, err))
|
||||
} else { //绑定
|
||||
if err := BindFenceByStore(vendorOrgCode, vendorStoreID, []string{utils.Int64ToStr(storeID)}); err != nil {
|
||||
globals.SugarLogger.Debugf("门店(%d) 绑定电子围栏:%s失败:%v", storeID, fenceID, err)
|
||||
errList.AddErr(fmt.Errorf("门店(%d) 绑定电子围栏:%s失败:%v", storeID, fenceID, err))
|
||||
} else {
|
||||
FreightTemplate.FenceID = utils.Int64ToStr(storeID)
|
||||
}
|
||||
}
|
||||
case 3: //4.限售模板
|
||||
bindSaleLimitID, err := GetStoreSaleLimit(vendorOrgCode, vendorStoreID)
|
||||
if err != nil {
|
||||
globals.SugarLogger.Debugf("获取门店(%d) 限售模板失败:%v", vendorStoreID, err)
|
||||
errList.AddErr(fmt.Errorf("获取门店(%d) 限售模板失败:%v", vendorStoreID, err))
|
||||
}
|
||||
if bindSaleLimitID == 0 || utils.IsNil(bindSaleLimitID) { //未绑定限售模板,目前默认创建起送价限售模板
|
||||
if createSaleLimitID, err := CreateAndBindMinPriceTemplate(vendorOrgCode, vendorStoreID, minPrice); err != nil {
|
||||
errList.AddErr(fmt.Errorf("设置门店起送价限售模板失败:%v", err))
|
||||
} else {
|
||||
FreightTemplate.TradeLimitID = createSaleLimitID
|
||||
}
|
||||
} else {
|
||||
if updateSaleLimitID, err := UpdateTradeLimitTemplate(vendorOrgCode, bindSaleLimitID, minPrice); err != nil {
|
||||
errList.AddErr(fmt.Errorf("更新门店起送价限售模板失败:%v", err))
|
||||
} else {
|
||||
FreightTemplate.TradeLimitID = updateSaleLimitID
|
||||
}
|
||||
}
|
||||
case 4: //5.门店打包费 默认为 0
|
||||
if err := SetStorePackageFee(vendorOrgCode, vendorStoreID, deliveryFeeDeductionFee); err != nil {
|
||||
errList.AddErr(fmt.Errorf("设置门店打包费失败:%v", err))
|
||||
}
|
||||
}
|
||||
return nil, err
|
||||
}, []int{0, 1, 2, 3, 4})
|
||||
tasksch.ManageTask(task).Run()
|
||||
//6.同步进数据库
|
||||
globals.SugarLogger.Debugf("preTest TradeLimitID==%d,TemplateID==%d, WarehouseID==%d,FenceID==%s", FreightTemplate.TradeLimitID, FreightTemplate.TemplateID, FreightTemplate.WarehouseID, FreightTemplate.FenceID)
|
||||
dao.WrapAddIDCULDEntity(FreightTemplate, userName)
|
||||
if err := dao.CreateEntity(db, FreightTemplate); err != nil {
|
||||
_, err1 := dao.UpdateEntity(db, FreightTemplate, "TemplateID", "WarehouseID", "FenceID", "TradeLimitID")
|
||||
if err1 == nil {
|
||||
errList.AddErr(fmt.Errorf("同步进数据库错误信息:%v", err))
|
||||
} else {
|
||||
errList.AddErr(fmt.Errorf("同步进数据库错误信息:%v", err1))
|
||||
}
|
||||
}
|
||||
endErr := errList.GetErrListAsOne()
|
||||
if utils.IsNil(errList) {
|
||||
globals.SugarLogger.Debug("绑定门店需进行的错误处理:%v", endErr)
|
||||
return endErr
|
||||
} else {
|
||||
return nil
|
||||
}
|
||||
}
|
||||
|
||||
// shop/editStore 编辑门店信息 正向推送平台
|
||||
func (P *PurchaseHandler) UpdateStore(db *dao.DaoDB, storeID int, userName string) (err error) {
|
||||
var (
|
||||
storeInfo *dao.StoreDetail
|
||||
m = make(map[int64]string)
|
||||
name string
|
||||
FreightTemplate = &model.FreightTemplate{}
|
||||
storeInfo *dao.StoreDetail
|
||||
errList = errlist.New()
|
||||
timeStr = ""
|
||||
m = make(map[int64]string)
|
||||
FreightTemplate = &model.FreightTemplate{}
|
||||
)
|
||||
if db == nil {
|
||||
db = dao.GetDB()
|
||||
@@ -333,9 +455,9 @@ func (P *PurchaseHandler) UpdateStore(db *dao.DaoDB, storeID int, userName strin
|
||||
}
|
||||
err3 := apiObj.EditStore(params)
|
||||
if err3 != nil {
|
||||
errList.AddErr(err3)
|
||||
errList.AddErr(fmt.Errorf("修改门店(%d) 信息失败:%v", utils.Str2Int64(storeInfo.VendorStoreID), err3))
|
||||
}
|
||||
//获取电子围栏
|
||||
//电子围栏
|
||||
bindWarehouseAndFence, err := GetWarehouseByStore(storeInfo.VendorOrgCode, utils.Str2Int64(storeInfo.VendorStoreID)) //todo 此接口暂时有问题
|
||||
if err != nil {
|
||||
errList.AddErr(fmt.Errorf("获取门店(%d) 电子围栏失败:%v", utils.Str2Int64(storeInfo.VendorStoreID), err))
|
||||
@@ -350,30 +472,38 @@ func (P *PurchaseHandler) UpdateStore(db *dao.DaoDB, storeID int, userName strin
|
||||
errList.AddErr(fmt.Errorf("门店(%d) 绑定电子围栏:%s失败:%v", storeID, fenceID, err))
|
||||
} else {
|
||||
FreightTemplate.FenceID = utils.Int2Str(storeID)
|
||||
if err := dao.CreateEntity(db, FreightTemplate); err != nil {
|
||||
globals.SugarLogger.Debug("电子围栏ID(%s) 同步到数据库失败:%v", fenceID, err)
|
||||
errList.AddErr(fmt.Errorf("电子围栏ID(%s) 同步到数据库失败:%v", fenceID, err))
|
||||
}
|
||||
}
|
||||
FreightTemplate.FenceID = utils.Int2Str(storeID)
|
||||
}
|
||||
} else {
|
||||
//更新电子围栏
|
||||
outFenceID := bindWarehouseAndFence[utils.Str2Int64(storeInfo.VendorStoreID)][0].OutFenceIds[0]
|
||||
//容错绑定
|
||||
if err := BindFenceByStore(storeInfo.VendorOrgCode, utils.Str2Int64(storeInfo.VendorStoreID), []string{outFenceID}); err != nil {
|
||||
globals.SugarLogger.Debugf("门店(%d) 容错绑定电子围栏:%s失败:%v", storeID, outFenceID, err)
|
||||
errList.AddErr(fmt.Errorf("门店(%d) 容错绑定电子围栏:%s失败:%v", storeID, outFenceID, err))
|
||||
}
|
||||
if err = UpdateFenceByStore(storeInfo.VendorOrgCode, outFenceID, storeID); err != nil {
|
||||
return errors.New(fmt.Sprintf("更新电子围栏失败,原因:%v", err))
|
||||
}
|
||||
if err = dao.CreateEntity(db, FreightTemplate); err != nil {
|
||||
if _, err1 := dao.UpdateEntity(db, FreightTemplate, "FenceID"); err1 != nil {
|
||||
globals.SugarLogger.Debug("db update storeID,vendorStoreID defeat on :%v", err1)
|
||||
errList.AddErr(fmt.Errorf("同步进数据库错误信息:%v", err1))
|
||||
} else {
|
||||
errList.AddErr(fmt.Errorf("同步进数据库错误信息:%v", err))
|
||||
}
|
||||
FreightTemplate.FenceID = outFenceID
|
||||
}
|
||||
//同步进数据库
|
||||
FreightTemplate = &model.FreightTemplate{
|
||||
StoreID: storeID,
|
||||
VendorStoreID: storeInfo.VendorStoreID,
|
||||
}
|
||||
dao.WrapAddIDCULDEntity(FreightTemplate, userName)
|
||||
if err = dao.CreateEntity(db, FreightTemplate); err != nil {
|
||||
if _, err1 := dao.UpdateEntity(db, FreightTemplate, "FenceID"); err1 != nil {
|
||||
globals.SugarLogger.Debug("db update storeID,vendorStoreID defeat on :%v", err1)
|
||||
errList.AddErr(fmt.Errorf("同步进数据库错误信息:%v", err1))
|
||||
} else {
|
||||
errList.AddErr(fmt.Errorf("同步进数据库错误信息:%v", err))
|
||||
}
|
||||
}
|
||||
}
|
||||
endErr := errList.GetErrListAsOne()
|
||||
globals.SugarLogger.Debugf("DouDian UpdateStore wrong information:%v", endErr)
|
||||
return errors.New(fmt.Sprintf("更新抖店平台店铺信息,相关处理错误:%v", endErr))
|
||||
}
|
||||
|
||||
@@ -383,28 +513,25 @@ func UpdateStoreStatus(ctx *jxcontext.Context, vendorOrgCode string, storeID int
|
||||
a := getAPI(vendorOrgCode, storeID, vendorStoreID)
|
||||
if globals.EnableDdStoreWrite {
|
||||
if isOnline != tiktok_api.StoreStatusOnline { //暂停营业状态
|
||||
suspendStoreID := &shop_storeSuspend_request.ShopStoreSuspendParam{
|
||||
if _, err = a.StoreSuspend(&shop_storeSuspend_request.ShopStoreSuspendParam{
|
||||
StoreId: utils.Str2Int64(vendorStoreID),
|
||||
}
|
||||
if _, err = a.StoreSuspend(suspendStoreID); err != nil {
|
||||
}); err != nil {
|
||||
return err
|
||||
}
|
||||
} else { //恢复营业
|
||||
unsuspendStoreID := &shop_unsuspendStore_request.ShopUnsuspendStoreParam{
|
||||
//与平台上店铺状态对比
|
||||
remoteStoreInfo, err2 := a.GetStoreDetail(&shop_getStoreDetail_request.ShopGetStoreDetailParam{
|
||||
StoreId: utils.Str2Int64(vendorStoreID),
|
||||
}
|
||||
getStoreID := &shop_getStoreDetail_request.ShopGetStoreDetailParam{
|
||||
StoreId: utils.Str2Int64(vendorStoreID),
|
||||
}
|
||||
//平台上店铺状态
|
||||
remoteStoreInfo, err2 := a.GetStoreDetail(getStoreID)
|
||||
})
|
||||
if err2 != nil {
|
||||
return err2
|
||||
}
|
||||
if remoteStoreInfo.StoreDetail.Store.SuspendType == tiktok_api.SuspendTypePlatformPenalty {
|
||||
err = errors.New("门店因平台处罚暂停营业,不可主动修改营业状态")
|
||||
} else {
|
||||
if _, err = a.UnsuspendStore(unsuspendStoreID); err != nil {
|
||||
if _, err = a.UnsuspendStore(&shop_unsuspendStore_request.ShopUnsuspendStoreParam{
|
||||
StoreId: utils.Str2Int64(vendorStoreID),
|
||||
}); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
@@ -587,12 +714,10 @@ func (P *PurchaseHandler) CreateFreightTemplateDirectly(templateInfo freightTemp
|
||||
// /shop/bindStoreFreight 门店绑定运费模版
|
||||
//门店绑定运费模版,运费模版必须属于门店关联的抖店,且门店与运费模版是一对一关系
|
||||
func ShopBindStoreFreight(vendorOrgCode string, storeID, freightID int64) error {
|
||||
param := &shop_bindStoreFreight_request.ShopBindStoreFreightParam{
|
||||
if err := getAPI(vendorOrgCode, int(storeID), "").BindFreightTemplate(&shop_bindStoreFreight_request.ShopBindStoreFreightParam{
|
||||
StoreId: storeID,
|
||||
FreightId: freightID,
|
||||
}
|
||||
err := getAPI(vendorOrgCode, int(storeID), "").BindFreightTemplate(param)
|
||||
if err != nil {
|
||||
}); err != nil {
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
@@ -600,30 +725,28 @@ func ShopBindStoreFreight(vendorOrgCode string, storeID, freightID int64) error
|
||||
|
||||
// /shop/getStoreFreight 获取门店绑定运费模板
|
||||
func GetStoreFreight(vendorOrgCode string, storeID int64) (int64, error) {
|
||||
resp, err := getAPI(vendorOrgCode, int(storeID), "").GetStoreFreight(storeID)
|
||||
if err != nil || len(resp) == 0 {
|
||||
if resp, err := getAPI(vendorOrgCode, int(storeID), "").GetStoreFreight(storeID); err != nil || len(resp) == 0 {
|
||||
return 0, err
|
||||
} else {
|
||||
return resp[0], nil
|
||||
}
|
||||
return resp[0], nil
|
||||
}
|
||||
|
||||
// /address/create 创建店铺地址库(新建即绑定)
|
||||
func (P *PurchaseHandler) CreateAddress(addressInfo address_create_request.AddressCreateParam) (addressID int64, err error) {
|
||||
info := &address_create_request.AddressCreateParam{
|
||||
func (P *PurchaseHandler) CreateAddress(appOrgCode string, addressInfo address_create_request.AddressCreateParam) (addressID int64, err error) {
|
||||
if resp, err := getAPI(appOrgCode, 0, utils.Int64ToStr(addressInfo.StoreId)).AddressCreate(&address_create_request.AddressCreateParam{
|
||||
Address: addressInfo.Address,
|
||||
StoreId: addressInfo.StoreId,
|
||||
}
|
||||
api := getAPI("", 0, utils.Int64ToStr(info.StoreId))
|
||||
resp, err := api.AddressCreate(info)
|
||||
if err != nil {
|
||||
}); err != nil {
|
||||
return 0, err
|
||||
} else {
|
||||
return resp.AddressId, nil
|
||||
}
|
||||
return resp.AddressId, nil
|
||||
}
|
||||
|
||||
// /address/list 获取售后地址列表接口
|
||||
//分页获取商家地址列表
|
||||
func (P *PurchaseHandler) GetAddressList(param *address_list_request.AddressListParam) (*address_list_response.AddressListData, error) {
|
||||
func (P *PurchaseHandler) GetAddressList(appOrgCode string, param *address_list_request.AddressListParam) (*address_list_response.AddressListData, error) {
|
||||
//不传入ID则是获取所有门店售后地址列表
|
||||
info := &address_list_request.AddressListParam{
|
||||
PageSize: 10,
|
||||
@@ -634,14 +757,14 @@ func (P *PurchaseHandler) GetAddressList(param *address_list_request.AddressList
|
||||
if param.StoreId != 0 {
|
||||
info.StoreId = param.StoreId
|
||||
}
|
||||
listInfo, err := getAPI("", 0, utils.Int64ToStr(info.StoreId)).GetAddressList(info)
|
||||
if err != nil {
|
||||
if listInfo, err := getAPI(appOrgCode, 0, utils.Int64ToStr(info.StoreId)).GetAddressList(info); err != nil {
|
||||
return nil, err
|
||||
} else {
|
||||
return listInfo, nil
|
||||
}
|
||||
return listInfo, nil
|
||||
}
|
||||
|
||||
// /trade/createTradeLimitTemplate 创建限售模板 默认模板
|
||||
// /trade/createTradeLimitTemplate 创建限售模板 默认模板 暂时不使用
|
||||
func CreateTradeLimitTemplate(appOrgCode string, vendorStoreID int64) (tradeLimitID int64, err error) {
|
||||
param := &trade_createTradeLimitTemplate_request.TradeCreateTradeLimitTemplateParam{
|
||||
StoreId: vendorStoreID,
|
||||
@@ -667,7 +790,7 @@ func CreateTradeLimitTemplate(appOrgCode string, vendorStoreID int64) (tradeLimi
|
||||
|
||||
//创建起送价的 运费模板以及绑定
|
||||
func CreateAndBindMinPriceTemplate(vendorOrgCode string, vendorStoreID, minimum int64) (int64, error) {
|
||||
param := &trade_createTradeLimitTemplate_request.TradeCreateTradeLimitTemplateParam{
|
||||
resp, err := getAPI(vendorOrgCode, 0, "").CreateTradeLimitTemplate(&trade_createTradeLimitTemplate_request.TradeCreateTradeLimitTemplateParam{
|
||||
StoreId: vendorStoreID,
|
||||
TradeLimitRuleRequestList: []trade_createTradeLimitTemplate_request.TradeLimitRuleRequestListItem{
|
||||
{
|
||||
@@ -686,8 +809,7 @@ func CreateAndBindMinPriceTemplate(vendorOrgCode string, vendorStoreID, minimum
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
resp, err := getAPI(vendorOrgCode, 0, "").CreateTradeLimitTemplate(param)
|
||||
})
|
||||
if err != nil || resp.TradeLimitId == 0 {
|
||||
return 0, errors.New(fmt.Sprintf("创建门店(%d)的起送价失败:%v", vendorStoreID, err))
|
||||
} else { //绑定
|
||||
@@ -700,7 +822,7 @@ func CreateAndBindMinPriceTemplate(vendorOrgCode string, vendorStoreID, minimum
|
||||
|
||||
// /trade/UpdateTradeLimitTemplate 更新限售模板 目前只做起送价
|
||||
func UpdateTradeLimitTemplate(vendorOrgCode string, tradeLimitID, minPrice int64) (int64, error) {
|
||||
param := &trade_UpdateTradeLimitTemplate_request.TradeUpdateTradeLimitTemplateParam{
|
||||
if updateTradeLimit, err := getAPI(vendorOrgCode, 0, "").UpdateTradeLimitTemplate(&trade_UpdateTradeLimitTemplate_request.TradeUpdateTradeLimitTemplateParam{
|
||||
TradeLimitTemplateId: tradeLimitID,
|
||||
TradeLimitRuleRequestList: []trade_UpdateTradeLimitTemplate_request.TradeLimitRuleRequestListItem{
|
||||
{
|
||||
@@ -710,24 +832,21 @@ func UpdateTradeLimitTemplate(vendorOrgCode string, tradeLimitID, minPrice int64
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
updateTradeLimit, err := getAPI(vendorOrgCode, 0, "").UpdateTradeLimitTemplate(param)
|
||||
if err != nil {
|
||||
}); err != nil {
|
||||
return 0, err
|
||||
}
|
||||
if updateTradeLimit.TradeLimitTemplateId == 0 {
|
||||
} else if updateTradeLimit.TradeLimitTemplateId == 0 {
|
||||
return 0, errors.New(fmt.Sprintf("更新操作返回的TradeLimitTemplateId=0"))
|
||||
} else {
|
||||
return updateTradeLimit.TradeLimitTemplateId, nil
|
||||
}
|
||||
return updateTradeLimit.TradeLimitTemplateId, nil
|
||||
}
|
||||
|
||||
// /shop/bindStoreSaleLimit 门店绑定限售模板
|
||||
func BindStoreSaleLimit(appOrgCode string, storeID, saleLimitTemplateID int64) error {
|
||||
info := &shop_bindStoreSaleLimit_request.ShopBindStoreSaleLimitParam{
|
||||
if err := getAPI(appOrgCode, 0, utils.Int64ToStr(storeID)).BindStoreSaleLimit(&shop_bindStoreSaleLimit_request.ShopBindStoreSaleLimitParam{
|
||||
StoreId: storeID,
|
||||
SaleLimitId: saleLimitTemplateID,
|
||||
}
|
||||
if err := getAPI(appOrgCode, 0, utils.Int64ToStr(info.StoreId)).BindStoreSaleLimit(info); err != nil {
|
||||
}); err != nil {
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
@@ -743,11 +862,14 @@ func GetStoreSaleLimit(appOrgCode string, storeID int64) (int64, error) {
|
||||
}
|
||||
|
||||
func (P *PurchaseHandler) UpdateStoreOpTime(ctx *jxcontext.Context, vendorOrgCode string, storeID int, vendorStoreID string, opTimeList []int16) (err error) {
|
||||
t1 := opTimeList[0]
|
||||
t2 := opTimeList[1]
|
||||
t3 := opTimeList[2]
|
||||
t4 := opTimeList[4]
|
||||
timeStr := ""
|
||||
var (
|
||||
timeStr = ""
|
||||
t1 = opTimeList[0]
|
||||
t2 = opTimeList[1]
|
||||
t3 = opTimeList[2]
|
||||
t4 = opTimeList[4]
|
||||
m = make(map[int64]string)
|
||||
)
|
||||
if t1 != 0 && t2 != 0 {
|
||||
if t3 != 0 && t4 != 0 {
|
||||
timeStr = SplicingTimeToDoudian(t1, t2, t3, t4, true)
|
||||
@@ -757,37 +879,33 @@ func (P *PurchaseHandler) UpdateStoreOpTime(ctx *jxcontext.Context, vendorOrgCod
|
||||
} else {
|
||||
return fmt.Errorf("营业时间必填")
|
||||
}
|
||||
m := make(map[int64]string)
|
||||
for j := 1; j <= 7; j++ {
|
||||
m[int64(j)] = timeStr
|
||||
}
|
||||
params := &shop_editStore_request.ShopEditStoreParam{
|
||||
StoreId: utils.Str2Int64(vendorStoreID),
|
||||
OpenTime: &shop_editStore_request.OpenTime{
|
||||
DayMap: m,
|
||||
},
|
||||
}
|
||||
if globals.EnableDdStoreWrite {
|
||||
err = getAPI(vendorOrgCode, storeID, vendorStoreID).EditStore(params)
|
||||
err = getAPI(vendorOrgCode, storeID, vendorStoreID).EditStore(&shop_editStore_request.ShopEditStoreParam{
|
||||
StoreId: utils.Str2Int64(vendorStoreID),
|
||||
OpenTime: &shop_editStore_request.OpenTime{
|
||||
DayMap: m,
|
||||
},
|
||||
})
|
||||
}
|
||||
return err
|
||||
}
|
||||
|
||||
//获取门店状态
|
||||
func (P *PurchaseHandler) GetStoreStatus(ctx *jxcontext.Context, vendorOrgCode string, storeID int, vendorStoreID string) (storeStatus int, err error) {
|
||||
params := &shop_getStoreDetail_request.ShopGetStoreDetailParam{
|
||||
if result, err := getAPI(vendorOrgCode, storeID, vendorStoreID).GetStoreDetail(&shop_getStoreDetail_request.ShopGetStoreDetailParam{
|
||||
StoreId: utils.Str2Int64(vendorStoreID),
|
||||
IsNeedChargeInfo: false,
|
||||
IsNeedPoiAuditInfo: false,
|
||||
IsNeedRelShopUser: false,
|
||||
}
|
||||
result, err := getAPI(vendorOrgCode, storeID, vendorStoreID).GetStoreDetail(params)
|
||||
if err != nil {
|
||||
}); err != nil {
|
||||
return 0, err
|
||||
} else {
|
||||
poiStatus := int(result.StoreDetail.Store.PoiAuditState)
|
||||
return poiStatus, nil
|
||||
}
|
||||
poiStatus := int(result.StoreDetail.Store.PoiAuditState)
|
||||
//status := bizStatusJX2DouDian(int(result.StoreDetail.Store.PoiAuditState))
|
||||
return poiStatus, nil
|
||||
}
|
||||
|
||||
func (P *PurchaseHandler) EnableAutoAcceptOrder(ctx *jxcontext.Context, vendorOrgCode string, storeID int, vendorStoreID string, isSetEnable bool) (err error) {
|
||||
@@ -815,17 +933,15 @@ func (P *PurchaseHandler) GetAllStoresVendorID(ctx *jxcontext.Context, vendorOrg
|
||||
}
|
||||
|
||||
func (P *PurchaseHandler) UpdateStoreLineStatus(ctx *jxcontext.Context, vendorOrgCode string, storeID int, vendorStoreID string, lineStatus int) (err error) {
|
||||
api := getAPI(vendorOrgCode, storeID, vendorStoreID)
|
||||
a := getAPI(vendorOrgCode, storeID, vendorStoreID)
|
||||
if lineStatus == model.StoreStatusOpened {
|
||||
param := &shop_unsuspendStore_request.ShopUnsuspendStoreParam{
|
||||
_, err = a.UnsuspendStore(&shop_unsuspendStore_request.ShopUnsuspendStoreParam{
|
||||
StoreId: utils.Str2Int64(vendorStoreID),
|
||||
}
|
||||
_, err = api.UnsuspendStore(param)
|
||||
})
|
||||
} else {
|
||||
param := &shop_storeSuspend_request.ShopStoreSuspendParam{
|
||||
_, err = a.StoreSuspend(&shop_storeSuspend_request.ShopStoreSuspendParam{
|
||||
StoreId: utils.Str2Int64(vendorStoreID),
|
||||
}
|
||||
_, err = api.StoreSuspend(param)
|
||||
})
|
||||
}
|
||||
return err
|
||||
}
|
||||
@@ -842,18 +958,10 @@ func (P *PurchaseHandler) ReadStore(ctx *jxcontext.Context, vendorOrgCode, vendo
|
||||
}
|
||||
retVal.OriginalName = vendorStore.StoreDetail.Store.Name
|
||||
_, retVal.Name = jxutils.SplitStoreName(retVal.OriginalName, partner.StoreNameSeparator, globals.StoreNameTiktok)
|
||||
|
||||
retVal.SetTiktokOpenTime(vendorStore.StoreDetail.Store.OpenTime.DayMap[1])
|
||||
retVal.Status = bizStatusTiktok2JX(vendorStore.StoreDetail.Store.State)
|
||||
|
||||
//tel2 := result.StandbyTel
|
||||
//if tel2 != "" && tel2 != retVal.Tel1 {
|
||||
// retVal.Tel2 = tel2
|
||||
//}
|
||||
|
||||
retVal.Lng = int(utils.Str2Float64(vendorStore.StoreDetail.Store.Longitude) * 1000000)
|
||||
retVal.Lat = int(utils.Str2Float64(vendorStore.StoreDetail.Store.Latitude) * 1000000)
|
||||
|
||||
lng := jxutils.IntCoordinate2Standard(retVal.Lng)
|
||||
lat := jxutils.IntCoordinate2Standard(retVal.Lat)
|
||||
db := dao.GetDB()
|
||||
@@ -861,30 +969,12 @@ func (P *PurchaseHandler) ReadStore(ctx *jxcontext.Context, vendorOrgCode, vendo
|
||||
city, err := dao.GetPlaceByCode(db, utils.Str2Int(vendorStore.StoreDetail.Store.CityCode))
|
||||
retVal.CityName = city.Name
|
||||
retVal.CityCode = utils.Str2Int(vendorStore.StoreDetail.Store.CityCode)
|
||||
|
||||
poiCode := vendorStore.StoreDetail.Store.StoreCode
|
||||
retVal.VendorStoreID = vendorStoreID
|
||||
retVal.ID = utils.Str2Int(poiCode)
|
||||
retVal.DeliveryRangeType = model.DeliveryRangeTypeRadius
|
||||
retVal.DeliveryRange = "3000"
|
||||
retVal.DeliveryType = scheduler.StoreDeliveryTypeByStore
|
||||
//retVal.DeliveryRangeType = model.DeliveryRangeTypePolygon
|
||||
//var deliveryRangeInfo []map[string]interface{}
|
||||
//deliveryRangeInfo, err = getAPIWithoutToken(vendorOrgCode).ShippingFetch(poiCode)
|
||||
//if err != nil {
|
||||
// deliveryRangeInfo, err = getAPIWithoutToken(vendorOrgCode).ShippingList(poiCode)
|
||||
//}
|
||||
//if err == nil {
|
||||
// if len(deliveryRangeInfo) > 0 {
|
||||
// retVal.DeliveryRange = rangeMtwm2JX(deliveryRangeInfo[0]["area"].(string))
|
||||
// logisticsCode := utils.Interface2String(deliveryRangeInfo[0]["logistics_code"])
|
||||
// if logisticsCode == "" || logisticsCode == mtwmapi.PeiSongTypeSelf {
|
||||
// retVal.DeliveryType = scheduler.StoreDeliveryTypeByStore
|
||||
// } else {
|
||||
// retVal.DeliveryType = scheduler.StoreDeliveryTypeByPlatform
|
||||
// }
|
||||
// }
|
||||
//}
|
||||
return retVal, nil
|
||||
}
|
||||
|
||||
|
||||
@@ -32,7 +32,7 @@ func CreateWarehouse(appOrgCode string, storeID int64) (warehouseID string, err
|
||||
if err != nil {
|
||||
return "", fmt.Errorf("获取门店本地信息失败:%v", err)
|
||||
}
|
||||
param := &warehouse_create_request.WarehouseCreateParam{
|
||||
resp, err := getAPI(appOrgCode, 0, "").CreateWarehouse(&warehouse_create_request.WarehouseCreateParam{
|
||||
OutWarehouseId: utils.Int64ToStr(storeID), //本地storeID绑定
|
||||
Name: "京西菜市_" + storeDetail.Name + "_" + utils.Int64ToStr(storeID) + "_区域仓",
|
||||
Intro: "",
|
||||
@@ -45,31 +45,26 @@ func CreateWarehouse(appOrgCode string, storeID int64) (warehouseID string, err
|
||||
},
|
||||
AddressDetail: storeDetail.Address,
|
||||
},
|
||||
}
|
||||
resp, err := getAPI(appOrgCode, 0, "").CreateWarehouse(param)
|
||||
})
|
||||
if err != nil {
|
||||
return "", fmt.Errorf("创建单个区域仓失败:%v", err)
|
||||
}
|
||||
return resp.WarehouseId, nil
|
||||
}
|
||||
|
||||
// /warehouse/createBatch 批量创建区域仓
|
||||
// /warehouse/createBatch 批量创建区域仓 暂时不使用
|
||||
func (P *PurchaseHandler) BatchCreateWarehouse(param warehouse_createBatch_request.WarehouseCreateBatchParam, appOrgCode string) error {
|
||||
infos := []warehouse_createBatch_request.OutWarehouseListItem{}
|
||||
for _, v := range param.OutWarehouseList {
|
||||
info := warehouse_createBatch_request.OutWarehouseListItem{
|
||||
OutWarehouseId: v.OutWarehouseId,
|
||||
Name: v.Name,
|
||||
Intro: v.Intro,
|
||||
AddressDetail: v.AddressDetail,
|
||||
WarehouseLocation: v.WarehouseLocation,
|
||||
}
|
||||
infos = append(infos, info)
|
||||
}
|
||||
req := &warehouse_createBatch_request.WarehouseCreateBatchParam{
|
||||
OutWarehouseList: infos,
|
||||
OutWarehouseList: []warehouse_createBatch_request.OutWarehouseListItem{
|
||||
{
|
||||
OutWarehouseId: param.OutWarehouseList[0].OutWarehouseId,
|
||||
Name: param.OutWarehouseList[0].Name,
|
||||
Intro: param.OutWarehouseList[0].Intro,
|
||||
AddressDetail: param.OutWarehouseList[0].AddressDetail,
|
||||
WarehouseLocation: param.OutWarehouseList[0].WarehouseLocation,
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
resp, err := getAPI(appOrgCode, 0, "").BatchCreateWarehouse(req)
|
||||
if err != nil {
|
||||
return err
|
||||
@@ -82,11 +77,10 @@ func (P *PurchaseHandler) BatchCreateWarehouse(param warehouse_createBatch_reque
|
||||
|
||||
// /warehouse/bindStore 仓库绑定门店
|
||||
func BindStoreWarehouse(VendorOrgCode, outWarehouseID string, storeIDs int64) error {
|
||||
param := &warehouse_bindStore_request.WarehouseBindStoreParam{
|
||||
if _, err := getAPI(VendorOrgCode, 0, "").StoreBindWarehouse(&warehouse_bindStore_request.WarehouseBindStoreParam{
|
||||
StoreIds: []int64{storeIDs},
|
||||
OutWarehouseId: outWarehouseID,
|
||||
}
|
||||
if _, err := getAPI(VendorOrgCode, 0, "").StoreBindWarehouse(param); err != nil {
|
||||
}); err != nil {
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
@@ -94,11 +88,11 @@ func BindStoreWarehouse(VendorOrgCode, outWarehouseID string, storeIDs int64) er
|
||||
|
||||
// /warehouse/getWarehouseByStore 门店id获取绑定仓库详情包括电子围栏
|
||||
func GetWarehouseByStore(appOrgCode string, storeID int64) (map[int64][]warehouse_getWarehouseByStore_response.WarehouseInfoMapItem, error) {
|
||||
info, err := getAPI(appOrgCode, 0, "").GetWarehouseByStore(storeID)
|
||||
if err != nil {
|
||||
if resp, err := getAPI(appOrgCode, 0, "").GetWarehouseByStore(storeID); err != nil {
|
||||
return nil, err
|
||||
} else {
|
||||
return resp, nil
|
||||
}
|
||||
return info, nil
|
||||
}
|
||||
|
||||
type LocalStore struct {
|
||||
@@ -118,7 +112,6 @@ func CreateFenceByStore(appOrgCode string, storeID int64) (fenceID string, err e
|
||||
param = &warehouse_createFence_request.WarehouseCreateFenceParam{}
|
||||
sqlParam = []interface{}{}
|
||||
)
|
||||
|
||||
sqlStr := `SELECT t.lng,t.lat,t.delivery_range_type,t.delivery_range FROM store t`
|
||||
if storeID != 0 {
|
||||
sqlStr += " WHERE t.id = ? "
|
||||
@@ -243,11 +236,10 @@ func UpdateFenceByStore(appOrgCode, outFenceID string, storeID int) error {
|
||||
|
||||
//门店直接绑定围栏
|
||||
func BindFenceByStore(appOrgCode string, storeID int64, addOutFenceIDs []string) error {
|
||||
param := &warehouse_bindFencesByStore_request.WarehouseBindFencesByStoreParam{
|
||||
if _, err := getAPI(appOrgCode, 0, "").BindFenceByStore(&warehouse_bindFencesByStore_request.WarehouseBindFencesByStoreParam{
|
||||
StoreId: storeID,
|
||||
AddOutFenceIds: addOutFenceIDs,
|
||||
}
|
||||
if _, err := getAPI(appOrgCode, 0, "").BindFenceByStore(param); err != nil {
|
||||
}); err != nil {
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
@@ -255,22 +247,26 @@ func BindFenceByStore(appOrgCode string, storeID int64, addOutFenceIDs []string)
|
||||
|
||||
//获取电子围栏信息
|
||||
func GetFence(appOrgCode, outFenceID string) (warehouse_getFences_response.FencesItem, error) {
|
||||
data := warehouse_getFences_response.FencesItem{}
|
||||
resp, err := getAPI(appOrgCode, 0, "").GetFence(outFenceID)
|
||||
if err != nil {
|
||||
return data, err
|
||||
emptyResp := warehouse_getFences_response.FencesItem{}
|
||||
if resp, err := getAPI(appOrgCode, 0, "").GetFence(outFenceID); err != nil {
|
||||
return emptyResp, err
|
||||
} else {
|
||||
return resp.Fences[0], nil
|
||||
}
|
||||
return resp.Fences[0], nil
|
||||
|
||||
}
|
||||
|
||||
//特殊处理
|
||||
func SpecialTreat(vendorOrgCode string, vendorStoreID, storeID, deliveryFeeDeductionFee, minPrice int64) error {
|
||||
func SpecialTreat(vendorOrgCode string, vendorStoreID, storeID, deliveryFeeDeductionFee, minPrice int64, userName string) error {
|
||||
var (
|
||||
errList = errlist.New()
|
||||
FreightTemplate = &model.FreightTemplate{}
|
||||
db *dao.DaoDB
|
||||
errList = errlist.New()
|
||||
FreightTemplate = &model.FreightTemplate{
|
||||
VendorStoreID: utils.Int64ToStr(vendorStoreID),
|
||||
StoreID: int(storeID),
|
||||
}
|
||||
)
|
||||
//首先获取绑定信息
|
||||
//1.运费模板
|
||||
bindFreightIDs, err := GetStoreFreight(vendorOrgCode, vendorStoreID)
|
||||
if err != nil {
|
||||
globals.SugarLogger.Debug("获取门店(%d) 绑定运费模板出错:", vendorStoreID, err)
|
||||
@@ -294,13 +290,12 @@ func SpecialTreat(vendorOrgCode string, vendorStoreID, storeID, deliveryFeeDeduc
|
||||
errList.AddErr(fmt.Errorf("更新运费模板失败:%v", err))
|
||||
}
|
||||
}
|
||||
//设置门店打包费 默认为0
|
||||
//2.设置门店打包费 默认为0
|
||||
if err := SetStorePackageFee(vendorOrgCode, vendorStoreID, deliveryFeeDeductionFee); err != nil {
|
||||
errList.AddErr(fmt.Errorf("设置门店打包费失败:%v", err))
|
||||
}
|
||||
//设置门店起送价 默认为0
|
||||
bindSaleLimitID, err := GetStoreSaleLimit(vendorOrgCode, vendorStoreID)
|
||||
if err != nil {
|
||||
//3.设置门店起送价 默认为0
|
||||
if bindSaleLimitID, err := GetStoreSaleLimit(vendorOrgCode, vendorStoreID); err != nil {
|
||||
errList.AddErr(fmt.Errorf("获取门店限售模板失败:%v", err))
|
||||
} else {
|
||||
if bindSaleLimitID == 0 || utils.IsNil(bindSaleLimitID) { //创建
|
||||
@@ -317,14 +312,18 @@ func SpecialTreat(vendorOrgCode string, vendorStoreID, storeID, deliveryFeeDeduc
|
||||
}
|
||||
}
|
||||
}
|
||||
err1 := dao.CreateEntity(db, FreightTemplate)
|
||||
if err1 != nil {
|
||||
_, err2 := dao.UpdateEntity(db, FreightTemplate, "TemplateID")
|
||||
if err2 != nil {
|
||||
//多次同步数据库,兜底处理
|
||||
if err := dao.CreateEntity(db, FreightTemplate); err != nil {
|
||||
_, err1 := dao.UpdateEntity(db, FreightTemplate, "TemplateID", "TradeLimitID")
|
||||
if err1 != nil {
|
||||
errList.AddErr(fmt.Errorf("同步进数据库错误信息:%v", err1))
|
||||
} else {
|
||||
errList.AddErr(fmt.Errorf("同步进数据库错误信息:%v", err))
|
||||
}
|
||||
} else {
|
||||
dao.WrapAddIDCULDEntity(FreightTemplate, userName)
|
||||
}
|
||||
endErr := errList.GetErrListAsOne()
|
||||
globals.SugarLogger.Debugf("endErr===============%s", endErr)
|
||||
globals.SugarLogger.Debugf("SpecialTreat wrong information endErr: %s", endErr)
|
||||
return endErr
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user