方法移动到check文件

This commit is contained in:
qidongsheng
2020-06-19 14:18:56 +08:00
39 changed files with 1446 additions and 408 deletions

View File

@@ -7,9 +7,15 @@ import (
"strings"
"time"
"git.rosy.net.cn/jx-callback/business/jxstore/common"
"git.rosy.net.cn/jx-callback/business/jxutils/ddmsg"
"git.rosy.net.cn/jx-callback/business/jxutils/tasksch"
"git.rosy.net.cn/jx-callback/business/partner/purchase/jdshop"
"git.rosy.net.cn/jx-callback/globals/api"
"git.rosy.net.cn/baseapi"
"git.rosy.net.cn/baseapi/platformapi/dingdingapi"
"git.rosy.net.cn/baseapi/platformapi/jdshopapi"
"git.rosy.net.cn/baseapi/utils"
"git.rosy.net.cn/jx-callback/business/jxcallback/scheduler"
"git.rosy.net.cn/jx-callback/business/jxutils"
@@ -995,3 +1001,225 @@ func GetOrderSimpleInfo(ctx *jxcontext.Context, vendorOrderID string) (getOrderS
return getOrderSimpleInfoResult, err
}
func SaveJdsOrders(ctx *jxcontext.Context, orderCreatedStart, orderCreatedEnd time.Time) (err error) {
var (
pageNo = 1
pageSize = 10
)
orderResult, err := jdshop.CurPurchaseHandler.GetJdsOrders(ctx, utils.Time2Str(orderCreatedStart), utils.Time2Str(orderCreatedEnd), pageNo, pageSize)
if err != nil {
noticeMsg := fmt.Sprintf("京东商城保存订单出错多半是cookie过期了,err :[%v]", err)
ddmsg.SendUserMessage(dingdingapi.MsgTyeText, "DDC5657B43EE11E9A9FF525400E86DC0", "cookie", noticeMsg)
ddmsg.SendUserMessage(dingdingapi.MsgTyeText, "1439B3E07D3911EA881A525400E86DC0", "cookie", noticeMsg)
globals.SugarLogger.Errorf("SaveJdsOrders : %v", err)
}
orders, err := result2Orders(ctx, orderResult)
for _, order := range orders {
// partner.CurOrderManager.OnOrderNew(order, model.Order2Status(order))
globals.SugarLogger.Debugf("SaveJdsOrders order: [%v]", utils.Format4Output(order, false))
noticeMsg := fmt.Sprintf("京东商城新订单,订单号:[%v] ,将要发到的门店id[%v] , 门店名:[%v]", order.VendorOrderID, order.StoreID, order.StoreName)
ddmsg.SendUserMessage(dingdingapi.MsgTyeText, "DDC5657B43EE11E9A9FF525400E86DC0", "京东商城来新订单了!", noticeMsg)
ddmsg.SendUserMessage(dingdingapi.MsgTyeText, "1439B3E07D3911EA881A525400E86DC0", "京东商城来新订单了!", noticeMsg)
}
return err
}
func result2Orders(ctx *jxcontext.Context, result *jdshopapi.AllOrdersResult) (orders []*model.GoodsOrder, err error) {
for _, jdsOrder := range result.OrderList {
//等待付款的排除
if jdsOrder.OrderStatus != jdshopapi.JdsOrderStatusWaittingExport && jdsOrder.OrderStatus != jdshopapi.JdsOrderStatusPause {
continue
}
//有可能是库里已经有这个订单了
orderE, err := partner.CurOrderManager.LoadOrder(utils.Int64ToStr(jdsOrder.OrderID)+"01", model.VendorIDJDShop)
if orderE != nil {
continue
}
orderDetail, err := api.JdShopAPI.OrderDetail(utils.Int64ToStr(jdsOrder.OrderID))
if err != nil {
globals.SugarLogger.Debugf("jds OrderDetail error: %v", err.Error())
continue
}
order := &model.GoodsOrder{
VendorOrderID2: utils.Int64ToStr(jdsOrder.OrderID),
VendorOrderID: utils.Int64ToStr(jdsOrder.OrderID) + "01",
VendorID: model.VendorIDJDShop,
BaseFreightMoney: jxutils.StandardPrice2Int(jdsOrder.Freight),
VendorStatus: utils.Int2Str(jdsOrder.OrderStatus),
VendorUserID: jdsOrder.UserPin,
BuyerComment: jdsOrder.UserRemark,
PickDeadline: utils.DefaultTimeValue,
OriginalData: string(utils.MustMarshal(jdsOrder)),
StoreName: jdsOrder.StoreName,
OrderCreatedAt: utils.Str2Time(jdsOrder.OrderCreateTime + ":00"),
ConsigneeAddress: orderDetail.ConsigneeAddress,
ConsigneeName: orderDetail.ConsigneeName,
ActualPayPrice: orderDetail.ActualPayPrice,
Status: model.OrderStatusNew,
TotalShopMoney: utils.Float64TwoInt64(math.Round(utils.Int64ToFloat64(orderDetail.ActualPayPrice) * jdshopapi.JdsPayPercentage)),
}
//获取真实手机号
fakeMobile, err := api.JdShopAPI.PhoneSensltiveInfo(order.VendorOrderID2, orderDetail.MobileKey)
if err != nil {
globals.SugarLogger.Debugf("jds PhoneSensltiveInfo error: %v", err.Error())
continue
} else {
order.ConsigneeMobile = jxutils.DecryptDESECB([]byte(fakeMobile), []byte(jdshopapi.JdsMobileKey))
}
if order.TotalShopMoney < 100 {
order.TotalShopMoney = 100
}
if order.ConsigneeAddress != "" {
lng, lat, _ := api.AutonaviAPI.GetCoordinateFromAddress(order.ConsigneeAddress, "")
order.ConsigneeLng = jxutils.StandardCoordinate2Int(lng)
order.ConsigneeLat = jxutils.StandardCoordinate2Int(lat)
}
if order.StoreName != "" {
storeMaps, _ := dao.GetStoresMapList(dao.GetDB(), []int{model.VendorIDJDShop}, nil, nil, model.StoreStatusAll, model.StoreIsSyncAll, "", order.StoreName)
if len(storeMaps) > 0 {
order.StoreID = storeMaps[0].StoreID
order.VendorStoreID = storeMaps[0].VendorStoreID
}
} else {
storeList, err := common.GetStoreListByLocation(ctx, jxutils.IntCoordinate2Standard(order.ConsigneeLng), jxutils.IntCoordinate2Standard(order.ConsigneeLat), 5000, false, true)
if err != nil {
globals.SugarLogger.Debugf("jds GetStoreListByLocation error: %v", err.Error())
continue
}
order.StoreID = storeList[0].ID
order.StoreName = storeList[0].Name
}
//如果是暂停,表示是预订单
if jdsOrder.OrderStatus == jdshopapi.JdsOrderStatusPause {
order.BusinessType = model.BusinessTypeDingshida
order.ExpectedDeliveredTime = utils.Str2Time(orderDetail.ExpectedDeliveredTime)
} else if jdsOrder.OrderStatus == jdshopapi.JdsOrderStatusWaittingExport {
order.ExpectedDeliveredTime = order.CreatedAt.Add(time.Hour)
order.BusinessType = model.BusinessTypeImmediate
} else {
globals.SugarLogger.Errorf("未知的京东商城订单状态status : %v", jdsOrder.OrderStatus)
}
for _, v := range jdsOrder.OrderItems {
sku := &model.OrderSku{
VendorID: model.VendorIDJDShop,
VendorOrderID: order.VendorOrderID,
Count: v.SkuNum,
VendorSkuID: utils.Int64ToStr(v.SkuID),
SkuName: v.SkuName,
VendorPrice: jxutils.StandardPrice2Int(v.JdPrice),
SalePrice: jxutils.StandardPrice2Int(v.JdPrice),
}
var storeSku *model.StoreSkuBind
sql := `
SELECT * FROM store_sku_bind WHERE store_id = ? AND jds_id = ? AND deleted_at = ?
`
sqlParams := []interface{}{model.JdShopMainStoreID, v.SkuID, utils.DefaultTimeValue}
err = dao.GetRow(dao.GetDB(), &storeSku, sql, sqlParams)
if storeSku != nil {
sku.SkuID = storeSku.SkuID
}
_, _, _, specUnit, _, specQuality := jxutils.SplitSkuName(v.SkuName)
sku.Weight = jxutils.FormatSkuWeight(specQuality, specUnit)
order.Skus = append(order.Skus, sku)
}
orders = append(orders, order)
}
return orders, err
}
func TransferJdsOrder(ctx *jxcontext.Context, vendorOrderID string, storeID int) (vendorOrderIDJds string, err error) {
globals.SugarLogger.Debugf("jds TransferJdsOrder vendorOrderID: %v, storeID : %v", vendorOrderID, storeID)
var (
db = dao.GetDB()
waybill *model.Waybill
)
order, err := dao.GetSimpleOrder(db, vendorOrderID)
if err != nil || order == nil {
return "", fmt.Errorf("未查询到该订单!订单号:[%v]", vendorOrderID)
}
if order.Status >= model.OrderStatusDelivering {
return "", fmt.Errorf("暂不支持此状态的订单进行转移!")
}
if order.VendorID != model.VendorIDJDShop {
return "", fmt.Errorf("暂不支持非京狗的订单进行转移!")
}
skus, err := dao.GetSimpleOrderSkus(db, vendorOrderID)
if err != nil || order == nil {
return "", fmt.Errorf("未查询到该订单商品!订单号:[%v]", vendorOrderID)
}
//将订单和运单取消
waybills, err := dao.GetWaybills(db, vendorOrderID)
if err != nil {
return "", err
}
if len(waybills) > 0 {
for _, v := range waybills {
if v.Status != model.WaybillStatusCanceled {
waybill = v
}
}
handler := partner.DeliveryPlatformHandlers[waybill.WaybillVendorID]
err = handler.Handler.CancelWaybill(waybill, 0, "订单转移被取消")
if err != nil {
return "", err
}
}
err = jdshop.ChangeOrderStatus(vendorOrderID, model.OrderStatusCanceled, "订单转移被取消")
if err != nil {
return "", err
}
//重新构建order的数据
storeMaps, err := dao.GetStoresMapList(db, []int{order.VendorID}, []int{order.StoreID}, nil, model.StoreStatusAll, model.StoreIsSyncAll, "", "")
if len(storeMaps) > 0 {
order.StoreID = storeID
order.StoreName = storeMaps[0].StoreName
} else {
return "", fmt.Errorf("未查询到该门店对应的平台信息!门店:[%v]", order.StoreID)
}
if len(order.VendorOrderID) > 12 {
suffix := utils.Str2Int(order.VendorOrderID[12:len(order.VendorOrderID)])
suffix++
order.VendorOrderID = order.VendorOrderID2 + utils.Int2Str(suffix)
}
for _, sku := range skus {
sku.VendorOrderID = order.VendorOrderID
order.Skus = append(order.Skus, sku)
}
order.Status = model.OrderStatusNew
err = partner.CurOrderManager.OnOrderNew(order, model.Order2Status(order))
vendorOrderIDJds = order.VendorOrderID
return vendorOrderIDJds, err
}
func SendJdwlForJdsOrder(ctx *jxcontext.Context, vendorOrderID string) (err error) {
db := dao.GetDB()
order, err := partner.CurOrderManager.LoadOrder(vendorOrderID, model.VendorIDJDShop)
if order == nil || err != nil {
return fmt.Errorf("目前只支持京狗订单创建!")
}
if order.Status >= model.OrderStatusDelivering {
return fmt.Errorf("订单当前状态不支持创建!")
}
waybill := &model.Waybill{}
waybills, err := dao.GetWaybills(db, vendorOrderID)
if err != nil {
return err
}
if len(waybills) > 0 {
for _, v := range waybills {
if v.Status != model.WaybillStatusCanceled {
waybill = v
}
}
handler := partner.DeliveryPlatformHandlers[waybill.WaybillVendorID]
err = handler.Handler.CancelWaybill(waybill, 0, "订单已发送其他物流")
if err != nil {
return err
}
}
handler := partner.DeliveryPlatformHandlers[model.VendorIDJDWL]
waybill2, err := handler.Handler.CreateWaybill(order, 0)
jdshop.CurPurchaseHandler.OrderExport(ctx, vendorOrderID, waybill2.VendorWaybillID, false)
return err
}

View File

@@ -41,13 +41,6 @@ func (c *BaseScheduler) CreateWaybillOnProviders(ctx *jxcontext.Context, order *
courierVendorID := storeCourier.VendorID
bill, err2 := c.CreateWaybill(courierVendorID, order, maxDeliveryFee)
if err = err2; err == nil {
stores, _ := dao.GetStoreList(dao.GetDB(), []int{order.StoreID}, nil, nil, nil, "")
if len(stores) > 0 {
if stores[0].PayPercentage <= 50 {
order.NewEarningPrice = (order.TotalShopMoney - bill.DesiredFee) * int64((100 - stores[0].PayPercentage/2)) / 100
dao.UpdateEntity(dao.GetDB(), order, "NewEarningPrice")
}
}
globals.SugarLogger.Debugf("CreateWaybillOnProviders orderID:%s userName:%s vendorID:%d bill:%v", order.VendorOrderID, userName, courierVendorID, bill)
bills = append(bills, bill)
if createOnlyOne {

View File

@@ -7,6 +7,7 @@ import (
"time"
"git.rosy.net.cn/jx-callback/business/jxutils/ddmsg"
"git.rosy.net.cn/jx-callback/business/partner/purchase/jdshop"
"git.rosy.net.cn/jx-callback/business/jxutils/jxcontext"
"git.rosy.net.cn/jx-callback/business/jxutils/netprinter"
@@ -537,7 +538,10 @@ func (s *DefScheduler) OnWaybillStatusChanged(bill *model.Waybill, isPending boo
}
s.updateOrderByBill(order, bill, false)
s.cancelOtherWaybillsCheckOrderDeliveryFlag(savedOrderInfo, bill, partner.CancelWaybillReasonNotAcceptIntime, partner.CancelWaybillReasonStrNotAcceptIntime)
//京东商城的话,需要去把订单出库,如果是转移过的订单,则需要修改转移订单号
if order.VendorID == model.VendorIDJDShop {
s.solutionJdsOrder(bill)
}
if model.IsWaybillPlatformOwn(bill) {
if bill.Status == model.WaybillStatusDelivering && order.Status < model.OrderStatusEndBegin {
// 强制将订单状态置为配送中?
@@ -717,9 +721,10 @@ func (s *DefScheduler) createWaybillOn3rdProviders(savedOrderInfo *WatchOrderInf
if savedOrderInfo.retryCount <= maxWaybillRetryCount {
savedOrderInfo.isNeedCreate3rdWaybill = true
excludeVendorIDs := savedOrderInfo.GetWaybillVendorIDs()
if order.VendorID == model.VendorIDJX {
excludeVendorIDs = append(excludeVendorIDs, model.VendorIDMTPS)
}
//TODO 取消京西不自动发美团 2020-06-02
// if order.VendorID == model.VendorIDJX {
// excludeVendorIDs = append(excludeVendorIDs, model.VendorIDMTPS)
// }
if _, err = s.CreateWaybillOnProviders4SavedOrder(jxcontext.AdminCtx, savedOrderInfo, nil, excludeVendorIDs, false, maxDeliveryFee); err == nil {
savedOrderInfo.retryCount++
}
@@ -751,6 +756,21 @@ func (s *DefScheduler) cancelOtherWaybillsCheckOrderDeliveryFlag(savedOrderInfo
return err
}
func (s *DefScheduler) solutionJdsOrder(bill *model.Waybill) (err error) {
//表示此订单是京东商城转移的订单,不用出库,但要去修改运单号
if len(bill.VendorOrderID) > 12 {
if utils.Str2Int(bill.VendorOrderID[12:len(bill.VendorOrderID)]) > 1 {
err = jdshop.CurPurchaseHandler.OrderTransfer(jxcontext.AdminCtx, bill.VendorOrderID, bill.VendorWaybillID, true)
if err != nil {
globals.SugarLogger.Errorf("京东商城订单自动转移失败!", err)
}
} else {
err = jdshop.CurPurchaseHandler.OrderExport(jxcontext.AdminCtx, bill.VendorOrderID, bill.VendorWaybillID, true)
}
}
return err
}
func (s *DefScheduler) cancelOtherWaybills(savedOrderInfo *WatchOrderInfo, bill2Keep *model.Waybill, cancelReasonID int, cancelReason string) (err error) {
globals.SugarLogger.Debugf("cancelOtherWaybills, orderID:%s, bill:%v", savedOrderInfo.order.VendorOrderID, bill2Keep)
for _, v := range savedOrderInfo.waybills {

View File

@@ -412,7 +412,7 @@ func DeleteConfig(ctx *jxcontext.Context, key, configType string) (err error) {
db := dao.GetDB()
switch configType {
case model.ConfigTypePricePack:
storeMapList, err2 := dao.GetStoresMapList(db, nil, nil, nil, model.StoreStatusAll, model.StoreIsSyncYes, key)
storeMapList, err2 := dao.GetStoresMapList(db, nil, nil, nil, model.StoreStatusAll, model.StoreIsSyncYes, key, "")
if err = err2; err == nil {
var storeInfo []string
for _, v := range storeMapList {
@@ -423,7 +423,7 @@ func DeleteConfig(ctx *jxcontext.Context, key, configType string) (err error) {
}
}
case model.ConfigTypeFreightPack:
storeMapList, err2 := dao.GetStoresMapList(db, nil, nil, nil, model.StoreStatusAll, model.StoreIsSyncYes, "")
storeMapList, err2 := dao.GetStoresMapList(db, nil, nil, nil, model.StoreStatusAll, model.StoreIsSyncYes, "", "")
if err = err2; err == nil {
var storeInfo []string
for _, v := range storeMapList {
@@ -503,7 +503,7 @@ func UpdateConfig(ctx *jxcontext.Context, key, configType, value string) (hint s
}
switch configType {
case model.ConfigTypePricePack:
storeMapList, err := dao.GetStoresMapList(db, nil, nil, nil, model.StoreStatusAll, model.StoreIsSyncYes, key)
storeMapList, err := dao.GetStoresMapList(db, nil, nil, nil, model.StoreStatusAll, model.StoreIsSyncYes, key, "")
if err != nil {
dao.Rollback(db)
return "", err
@@ -522,7 +522,7 @@ func UpdateConfig(ctx *jxcontext.Context, key, configType, value string) (hint s
}
case model.ConfigTypeFreightPack:
dao.Commit(db)
storeMapList, err := dao.GetStoresMapList(db, nil, nil, nil, model.StoreStatusAll, model.StoreIsSyncYes, "")
storeMapList, err := dao.GetStoresMapList(db, nil, nil, nil, model.StoreStatusAll, model.StoreIsSyncYes, "", "")
if err != nil {
return "", err
}

View File

@@ -595,7 +595,8 @@ func GetSkuNames(ctx *jxcontext.Context, keyword string, isBySku, isQueryMidPric
t1.ex_prefix,
t1.ex_prefix_begin,
t1.ex_prefix_end,
t1.yb_name_suffix
t1.yb_name_suffix,
t1.jds_stock_switch
`
if isQueryMidPrice {
sql += `,
@@ -635,6 +636,7 @@ func GetSkuNames(ctx *jxcontext.Context, keyword string, isBySku, isQueryMidPric
t1.ex_prefix_begin,
t1.ex_prefix_end,
t1.yb_name_suffix,
t1.jds_stock_switch,
`
if isQueryMidPrice {
sqlData += " t4.mid_unit_price,"
@@ -992,6 +994,12 @@ func UpdateSkuName(ctx *jxcontext.Context, nameID int, payload map[string]interf
dao.Rollback(db)
return 0, err
}
if valid["jdsStockSwitch"] != nil {
if _, err = SetStoreSkuSyncStatus2(db, []int{model.JdShopMainStoreID}, []int{model.VendorIDJDShop}, skuIDs, model.SyncFlagSaleMask); err != nil {
dao.Rollback(db)
return 0, err
}
}
}
dao.Commit(db)
@@ -1124,7 +1132,7 @@ func AddSku(ctx *jxcontext.Context, nameID int, sku *model.Sku, userName string)
storeSkus, err := dao.GetStoreSkusByNameIDs(db, []int{model.JdShopMainStoreID}, nameID)
if len(storeSkus) > 0 {
storeIDs := make(map[int]int)
storeMaps, err2 := dao.GetStoresMapList(db, []int{model.VendorIDJDShop}, nil, nil, model.StoreStatusAll, model.StoreIsSyncAll, "")
storeMaps, err2 := dao.GetStoresMapList(db, []int{model.VendorIDJDShop}, nil, nil, model.StoreStatusAll, model.StoreIsSyncAll, "", "")
err = err2
for _, v := range storeMaps {
storeSkus2, err2 := dao.GetStoreSkusByNameIDs(db, []int{v.StoreID}, nameID)

View File

@@ -78,55 +78,6 @@ type StoreExt struct {
OrderCount int `json:"orderCount"`
}
type Store4User struct {
model.ModelIDCULD
OriginalName string `orm:"-" json:"originalName"`
Name string `orm:"size(255)" json:"name"`
OpenTime1 int16 `json:"openTime1"` // 930就表示9点半用两个的原因是为了支持中午休息1与2的时间段不能交叉为0表示没有
CloseTime1 int16 `json:"closeTime1"` // 格式同上
OpenTime2 int16 `json:"openTime2"` // 格式同上
CloseTime2 int16 `json:"closeTime2"` // 格式同上
Status int `json:"status"`
CityCode int `orm:"default(0);null" json:"cityCode"` // todo ?
DistrictCode int `orm:"default(0);null" json:"districtCode"` // todo ?
Address string `orm:"size(255)" json:"address"`
Tel1 string `orm:"size(32);index" json:"tel1"`
Tel2 string `orm:"size(32);index" json:"tel2"`
Lng int `json:"-"` // 乘了10的6次方
Lat int `json:"-"` // 乘了10的6次方
DeliveryRangeType int8 `json:"-"` // 参见相关常量定义
DeliveryRange string `orm:"type(text)" json:"-"` // 如果DeliveryRangeType为DeliveryRangeTypePolygon则为逗号分隔坐标分号分隔的坐标点坐标与Lng和Lat一样都是整数比如 121361504,31189308;121420555,31150238。否则为半径单位为米
FloatLng float64 `json:"lng"`
FloatLat float64 `json:"lat"`
CityName string `json:"cityName"`
DistrictName string `json:"districtName"`
Distance int `json:"distance"`
WalkDistance int `json:"walkDistance"`
}
type Store4UserList []*Store4User
func (x Store4UserList) Len() int {
return len(x)
}
func (x Store4UserList) Less(i, j int) bool {
if x[i].Status != x[j].Status {
return x[i].Status > x[j].Status
}
if x[i].WalkDistance != x[j].WalkDistance {
return x[i].WalkDistance < x[j].WalkDistance
}
return x[i].Distance < x[j].Distance
}
func (x Store4UserList) Swap(i, j int) {
x[i], x[j] = x[j], x[i]
}
type StoresInfo struct {
TotalCount int `json:"totalCount"`
MapCenterLng float64 `json:"mapCenterLng"`
@@ -426,7 +377,7 @@ func getStoresSql(ctx *jxcontext.Context, keyword string, params map[string]inte
}
func setStoreMapInfo(ctx *jxcontext.Context, db *dao.DaoDB, storesInfo *StoresInfo, storeIDs []int, briefLevel int) (err error) {
storeMapList, err := dao.GetStoresMapList(db, nil, storeIDs, nil, model.StoreStatusAll, model.StoreIsSyncAll, "")
storeMapList, err := dao.GetStoresMapList(db, nil, storeIDs, nil, model.StoreStatusAll, model.StoreIsSyncAll, "", "")
if err != nil {
return err
}
@@ -1194,7 +1145,7 @@ func AddStoreVendorMap(ctx *jxcontext.Context, db *dao.DaoDB, vendorID int, vend
}
}
}
storeMapList, err := dao.GetStoresMapList2(db, []int{vendorID}, []int{storeID}, nil, model.StoreStatusAll, model.StoreIsSyncAll, "", true)
storeMapList, err := dao.GetStoresMapList2(db, []int{vendorID}, []int{storeID}, nil, model.StoreStatusAll, model.StoreIsSyncAll, "", "", true)
if len(storeMapList) > 0 {
_, err = CurVendorSync.SyncStore(ctx, db, storeMap.VendorID, storeID, false, userName)
} else {
@@ -1806,7 +1757,7 @@ type EbaiStoreHealthy struct {
func ExportShopsHealthInfo(ctx *jxcontext.Context, vendorIDs, storeIDs []int, isAsync, isContinueWhenError bool) (hint string, err error) {
db := dao.GetDB()
vendorID := model.VendorIDEBAI
storeMapList, err := dao.GetStoresMapList(db, []int{vendorID}, storeIDs, nil, model.StoreStatusAll, model.StoreIsSyncYes, "")
storeMapList, err := dao.GetStoresMapList(db, []int{vendorID}, storeIDs, nil, model.StoreStatusAll, model.StoreIsSyncYes, "", "")
if err != nil {
return "", err
}
@@ -1924,7 +1875,7 @@ func GetCorporationInfo(ctx *jxcontext.Context, licenceCode string) (corporation
func GetStoresVendorSnapshot(ctx *jxcontext.Context, parentTask tasksch.ITask, vendorIDs, storeIDs []int) (vendorStoreSnapshotList []*model.VendorStoreSnapshot, err error) {
db := dao.GetDB()
storeMapList, err := dao.GetStoresMapList(db, vendorIDs, storeIDs, nil, model.StoreStatusAll, model.StoreIsSyncYes, "")
storeMapList, err := dao.GetStoresMapList(db, vendorIDs, storeIDs, nil, model.StoreStatusAll, model.StoreIsSyncYes, "", "")
if err != nil {
return nil, err
}
@@ -1971,7 +1922,7 @@ func getCurrentSnapshotAt(now time.Time) (snapshotAt time.Time) {
}
func updateVendorStoreStatusBySnapshot(db *dao.DaoDB, curSnapshotList []*model.VendorStoreSnapshot) (err error) {
storeMapList, err := dao.GetStoresMapList(db, nil, nil, nil, model.StoreStatusAll, model.StoreIsSyncAll, "")
storeMapList, err := dao.GetStoresMapList(db, nil, nil, nil, model.StoreStatusAll, model.StoreIsSyncAll, "", "")
if err != nil {
return err
}
@@ -2482,98 +2433,6 @@ func SyncStoresQualify(ctx *jxcontext.Context, storeIDs []int, isAsync, isContin
return hint, err
}
func GetStoreListByLocation(ctx *jxcontext.Context, lng, lat float64, needWalkDistance bool) (storeList []*Store4User, err error) {
const (
maxRadius = 20000
maxStoreCount4User = 5
)
lng2, _ := jxutils.ConvertDistanceToLogLat(lng, lat, float64(maxRadius), 90)
_, lat2 := jxutils.ConvertDistanceToLogLat(lng, lat, float64(maxRadius), 0)
lng1 := lng - (lng2 - lng)
lat1 := lat - (lat2 - lat)
// globals.SugarLogger.Debugf("%f,%f,%f,%f\n", lng1, lng2, lat1, lat2)
sql := `
SELECT t1.*,
city.name city_name
FROM store t1
JOIN place city ON city.code = t1.city_code
JOIN store_map sm ON sm.store_id = t1.id AND sm.vendor_id = ? AND sm.deleted_at = ? AND sm.status <> ?
WHERE t1.deleted_at = ? AND t1.status <> ? AND t1.lng > ? AND t1.lng < ? AND t1.lat > ? AND t1.lat < ?
AND sm.is_order <> ?
AND t1.id <> ?
ORDER BY t1.id
`
sqlParams := []interface{}{
model.VendorIDJX, utils.DefaultTimeValue, model.StoreStatusDisabled,
utils.DefaultTimeValue, model.StoreStatusDisabled, jxutils.StandardCoordinate2Int(lng1), jxutils.StandardCoordinate2Int(lng2), jxutils.StandardCoordinate2Int(lat1), jxutils.StandardCoordinate2Int(lat2),
model.YES,
model.MatterStoreID,
}
var storeList1 []*Store4User
if err = dao.GetRows(dao.GetDB(), &storeList1, sql, sqlParams...); err == nil {
var storeList2 []*Store4User
for _, v := range storeList1 {
distance := jxutils.Point2StoreDistance(lng, lat, v.Lng, v.Lat, v.DeliveryRangeType, v.DeliveryRange)
if distance > 0 || (lng == jxutils.IntCoordinate2Standard(v.Lng) && lat == jxutils.IntCoordinate2Standard(v.Lat)) {
v.Distance = distance
storeList2 = append(storeList2, v)
}
}
// 为了审核用
if len(storeList2) == 0 {
sql2 := `
SELECT t1.*,
city.name city_name
FROM store t1
JOIN place city ON city.code = t1.city_code
WHERE t1.deleted_at = ? AND t1.status <> ? AND t1.id = ?
`
sqlParams2 := []interface{}{
// model.VendorIDJX, utils.DefaultTimeValue, model.StoreStatusDisabled,
utils.DefaultTimeValue,
model.StoreStatusDisabled,
// jxutils.StandardCoordinate2Int(0),
// jxutils.StandardCoordinate2Int(10000),
// jxutils.StandardCoordinate2Int(0),
// jxutils.StandardCoordinate2Int(10000),
// model.YES,
102919, //商城模板店
}
dao.GetRows(dao.GetDB(), &storeList2, sql2, sqlParams2...)
// if len(storeList2) > 1 {
// storeList2 = storeList2[:1]
// }
}
// 如果要求以步行距离来算
if needWalkDistance {
var coordList []*autonavi.Coordinate
for _, v := range storeList2 {
coordList = append(coordList, &autonavi.Coordinate{
Lng: v.FloatLng,
Lat: v.FloatLat,
})
}
if distanceList, err2 := api.AutonaviAPI.BatchWalkingDistance(lng, lat, coordList); err2 == nil {
for k, v := range storeList2 {
v.WalkDistance = int(distanceList[k])
}
} else {
return nil, err2
}
}
sort.Sort(Store4UserList(storeList2))
storeList = storeList2
if len(storeList) > maxStoreCount4User {
storeList = storeList[:maxStoreCount4User]
}
}
return storeList, err
}
func JdStoreInfoCoordinateRecover(ctx *jxcontext.Context, vendorOrgCode string, files []*multipart.FileHeader) (err error) {
if len(files) == 0 {
return errors.New("没有文件上传!")
@@ -2583,7 +2442,7 @@ func JdStoreInfoCoordinateRecover(ctx *jxcontext.Context, vendorOrgCode string,
defer file1.Close()
db := dao.GetDB()
storeList, err := dao.GetStoresMapList(db, []int{model.VendorIDJD}, nil, nil, model.StoreStatusAll, model.StoreIsSyncYes, "")
storeList, err := dao.GetStoresMapList(db, []int{model.VendorIDJD}, nil, nil, model.StoreStatusAll, model.StoreIsSyncYes, "", "")
if err == nil {
var validStoreList []*dao.StoreDetail
for _, v := range storeList {
@@ -2849,7 +2708,7 @@ func CreateStorePriceScore(ctx *jxcontext.Context) (err error) {
func RefreshJdLevel(ctx *jxcontext.Context) (err error) {
db := dao.GetDB()
storeMapList, err := dao.GetStoresMapList(db, []int{model.VendorIDJD}, nil, nil, model.StoreStatusOpened, -1, "")
storeMapList, err := dao.GetStoresMapList(db, []int{model.VendorIDJD}, nil, nil, model.StoreStatusOpened, -1, "", "")
if len(storeMapList) > 0 {
dao.Begin(db)
defer func() {
@@ -3036,7 +2895,7 @@ func checkYbParams(db *dao.DaoDB, storeMap *model.StoreMap, storeID int) (err er
}
}
}
storeMaps, err := dao.GetStoresMapList2(db, []int{model.VendorIDYB}, nil, nil, model.StoreStatusAll, model.StoreIsSyncAll, "", false)
storeMaps, err := dao.GetStoresMapList2(db, []int{model.VendorIDYB}, nil, nil, model.StoreStatusAll, model.StoreIsSyncAll, "", "", false)
if len(storeMaps) > 0 {
for _, v := range storeMaps {
if v.YbAppID == appID {
@@ -3121,7 +2980,7 @@ func DisabledStoreWithoutVendor(ctx *jxcontext.Context, isContinueWhenError, isA
task := tasksch.NewParallelTask("DisabledStoreWithoutVendor", tasksch.NewParallelConfig().SetParallelCount(1).SetIsContinueWhenError(isContinueWhenError), ctx,
func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) {
store := batchItemList[0].(*model.Store)
storeMaps, err := dao.GetStoresMapList(db, []int{model.VendorIDYB, model.VendorIDJD, model.VendorIDJX, model.VendorIDEBAI, model.VendorIDMTWM}, []int{store.ID}, nil, model.StoreStatusAll, model.StoreIsSyncAll, "")
storeMaps, err := dao.GetStoresMapList(db, []int{model.VendorIDYB, model.VendorIDJD, model.VendorIDJX, model.VendorIDEBAI, model.VendorIDMTWM}, []int{store.ID}, nil, model.StoreStatusAll, model.StoreIsSyncAll, "", "")
if len(storeMaps) == 0 {
store.Status = model.StoreStatusDisabled
dao.UpdateEntity(db, store, "Status")

View File

@@ -96,6 +96,7 @@ type tStoreSkuBindAndSpec struct {
ExdSkuID string `orm:"column(exd_sku_id)"`
StoreName string
ChangePriceType int8 `json:"changePriceType"` // 修改价格类型,即是否需要审核
NameID int `orm:"column(name_id)" json:"nameID"`
}
type SkuSaleInfo struct {
@@ -128,6 +129,7 @@ type tGetStoresSkusInfo struct {
dao.StoreSkuExt
RealMidUnitPrice int `json:"realMidUnitPrice"` //真实的该商品的全国中位价
YbSkuName string
AuditUnitPrice int
}
type SheetParam struct {
@@ -312,11 +314,13 @@ func getGetStoresSkusBaseSQL(db *dao.DaoDB, storeIDs, skuIDs []int, isFocus bool
JOIN store_sku_bind t4 ON t4.store_id = t3.id AND t4.sku_id = t2.id AND t4.deleted_at = ?
LEFT JOIN sku_name_place_bind t5 ON t1.id = t5.name_id AND t3.city_code = t5.place_code
LEFT JOIN price_refer_snapshot t6 ON t6.city_code = ? AND t6.sku_id = t2.id AND t6.snapshot_at = ?
LEFT JOIN store_sku_audit t7 ON t7.store_id = t3.id AND t7.name_id = t1.id AND t7.status = ? AND t7.deleted_at = ?
WHERE t1.deleted_at = ? AND (t1.is_global = 1 OR t5.id IS NOT NULL OR 1 = ?)/* AND t1.status = ?*/
`
sqlParams = append(sqlParams, []interface{}{
utils.DefaultTimeValue,
0, utils.Time2Date(time.Now().AddDate(0, 0, -1)),
model.StoreAuditStatusOnline, utils.DefaultTimeValue,
utils.DefaultTimeValue,
utils.Bool2Int(isFocus),
})
@@ -544,7 +548,8 @@ func GetStoresSkusNew(ctx *jxcontext.Context, storeIDs, skuIDs []int, isFocus, i
t4.jd_price, t4.ebai_price, t4.mtwm_price, t4.jx_price, t4.yb_price, t4.jds_price,
t4.jd_lock_time, t4.ebai_lock_time, t4.mtwm_lock_time, t4.jx_lock_time, t4.yb_lock_time, t4.jds_lock_time,
t4.status_sale_begin, t4.status_sale_end,
t6.mid_unit_price real_mid_unit_price
t6.mid_unit_price real_mid_unit_price,
t7.unit_price audit_unit_price
` + sql
if isHighPrice || priceType != 0 {
sql += " , t4.unit_price DESC LIMIT 99"
@@ -573,6 +578,7 @@ func GetStoresSkusNew(ctx *jxcontext.Context, storeIDs, skuIDs []int, isFocus, i
PayPercentage: v.PayPercentage,
RealMidUnitPrice: v.RealMidUnitPrice,
YbSkuName: v.YbSkuName,
AuditUnitPrice: v.AuditUnitPrice,
}
if !isBySku {
storeNameMap[index] = storeName
@@ -702,7 +708,7 @@ func updateSaleInfo4StoreSkuName(ctx *jxcontext.Context, db *dao.DaoDB, storeIDs
}
func getValidStoreVendorMap(db *dao.DaoDB, storeIDs []int) (realVendorMap map[int]int, err error) {
storeMapList, err := dao.GetStoresMapList(db, nil, storeIDs, nil, model.StoreStatusAll, model.StoreIsSyncYes, "")
storeMapList, err := dao.GetStoresMapList(db, nil, storeIDs, nil, model.StoreStatusAll, model.StoreIsSyncYes, "", "")
if err != nil {
return nil, err
}
@@ -832,15 +838,16 @@ func UpdateStoreSku(ctx *jxcontext.Context, causeFlag, storeID int, skuBindInfo
}
func UpdateStoreSkus(ctx *jxcontext.Context, causeFlag, storeID int, skuBindInfos []*StoreSkuBindInfo, isAsync, isContinueWhenError bool) (hint string, err error) {
return UpdateStoresSkus(ctx, causeFlag, []int{storeID}, skuBindInfos, false, isAsync, isContinueWhenError)
return UpdateStoresSkus(ctx, causeFlag, []int{storeID}, skuBindInfos, false, false, isAsync, isContinueWhenError)
}
func UpdateStoresSkus(ctx *jxcontext.Context, causeFlag int, storeIDs []int, skuBindInfos []*StoreSkuBindInfo, isScale, isAsync, isContinueWhenError bool) (hint string, err error) {
func UpdateStoresSkus(ctx *jxcontext.Context, causeFlag int, storeIDs []int, skuBindInfos []*StoreSkuBindInfo, isScale, isRefreshHigh, isAsync, isContinueWhenError bool) (hint string, err error) {
globals.SugarLogger.Debugf("UpdateStoresSkus:%s, storeIDs:%v, skuBindInfos:%s", ctx.GetTrackInfo(), storeIDs, utils.Format4Output(skuBindInfos, true))
flag, err := doStoreSkuAudit(ctx, storeIDs, skuBindInfos)
if !flag {
var num int64
db := dao.GetDB()
skuIDs, err := updateStoresSkusWithoutSync(ctx, db, storeIDs, skuBindInfos, isScale)
skuIDs, err := updateStoresSkusWithoutSync(ctx, db, storeIDs, skuBindInfos, isScale, isRefreshHigh)
if err != nil {
return "", err
}
@@ -852,9 +859,22 @@ func UpdateStoresSkus(ctx *jxcontext.Context, causeFlag int, storeIDs []int, sku
if num == 0 || !isAsync || hint == "" {
hint = utils.Int64ToStr(num)
}
}
return hint, err
}
func UpdateStoresSkusWithoutSync(ctx *jxcontext.Context, storeIDs []int, skuBindInfos []*StoreSkuBindInfo, isRefreshHigh bool) (err error) {
db := dao.GetDB()
if len(storeIDs) == 0 {
stores, _ := dao.GetStoreList(db, nil, nil, nil, nil, "")
for _, v := range stores {
storeIDs = append(storeIDs, v.ID)
}
}
updateStoresSkusWithoutSync(ctx, db, storeIDs, skuBindInfos, false, isRefreshHigh)
return err
}
func UpdateStoresSkusByBind(ctx *jxcontext.Context, parentTask tasksch.ITask, skuBindInfos []*StoreSkuBindInfo, isAsync, isContinueWhenError, isFos bool) (hint string, err error) {
// if len(skuBindInfos) > maxStoreNameBind {
// return "", fmt.Errorf("门店商品信息大于%d", maxStoreNameBind)
@@ -880,7 +900,7 @@ func UpdateStoresSkusByBind(ctx *jxcontext.Context, parentTask tasksch.ITask, sk
// }
// }()
for _, storeID := range storeIDs {
skuIDs, err2 := updateStoresSkusWithoutSync(ctx, db, []int{storeID}, skuBindInfosMap[storeID], false)
skuIDs, err2 := updateStoresSkusWithoutSync(ctx, db, []int{storeID}, skuBindInfosMap[storeID], false, false)
if err = err2; err != nil {
// dao.Rollback(db)
return "", err
@@ -960,7 +980,7 @@ func uniqueStoreNameBind(skuBindInfos []*StoreSkuBindInfo) (outSkuBindInfos []*S
return outSkuBindInfos
}
func updateStoresSkusWithoutSync(ctx *jxcontext.Context, db *dao.DaoDB, storeIDs []int, skuBindInfos []*StoreSkuBindInfo, isScale bool) (needSyncSkus []int, err error) {
func updateStoresSkusWithoutSync(ctx *jxcontext.Context, db *dao.DaoDB, storeIDs []int, skuBindInfos []*StoreSkuBindInfo, isScale, isRefreshHigh bool) (needSyncSkus []int, err error) {
// if len(storeIDs)*len(skuBindInfos) > maxStoreNameBind2 {
// return nil, fmt.Errorf("门店商品信息大于%d", maxStoreNameBind2)
// }
@@ -976,9 +996,6 @@ func updateStoresSkusWithoutSync(ctx *jxcontext.Context, db *dao.DaoDB, storeIDs
// if err = checkStoresSkusSaleCity(ctx, db, storeIDs, skuBindInfos); err != nil {
// return nil, err
// }
// if storeIDs, skuBindInfos, err = filterStorePriceChange(ctx, storeIDs, skuBindInfos); err != nil {
// return nil, err
// }
// globals.SugarLogger.Debugf("updateStoresSkusWithoutSync2, storeIDs:%v, skuBindInfos:%s", storeIDs, utils.Format4Output(skuBindInfos, false))
isUserCanDirectChangePrice := true
if user := ctx.GetFullUser(); user != nil {
@@ -1018,7 +1035,7 @@ func updateStoresSkusWithoutSync(ctx *jxcontext.Context, db *dao.DaoDB, storeIDs
sql += " IF(t5.unit_price > 0, t5.unit_price, t3.price) sku_name_price,"
}
sql += `
t3.unit sku_name_unit, t3.name, t3.status sku_name_status,
t3.unit sku_name_unit, t3.name, t3.status sku_name_status, t3.id name_id,
ts.change_price_type, ts.name store_name
FROM sku t1
JOIN store ts ON ts.id = ? AND ts.deleted_at = ?
@@ -1139,6 +1156,15 @@ func updateStoresSkusWithoutSync(ctx *jxcontext.Context, db *dao.DaoDB, storeIDs
dao.Rollback(db)
return nil, err
}
//删除待审核商品信息
storeAudits, err := dao.GetStoreSkuAuditLight(db, []int{storeID}, []int{v.NameID}, model.StoreAuditStatusOnline)
if len(storeAudits) > 0 {
storeAudits[0].DeletedAt = time.Now()
if _, err = dao.UpdateEntity(db, storeAudits[0], "DeletedAt"); err != nil {
dao.Rollback(db)
return nil, err
}
}
} else {
// 用了SELECT FOR UPDATE后只更新修改字段是没有必要的暂时保留
updateFieldMap := make(map[string]interface{})
@@ -1168,12 +1194,22 @@ func updateStoresSkusWithoutSync(ctx *jxcontext.Context, db *dao.DaoDB, storeIDs
setStoreSkuBindStatus(skuBind, model.SyncFlagPriceMask)
updateFieldMap["Price"] = 1
}
if isRefreshHigh {
if beforeMsg.UnitPrice > skuBindInfo.UnitPrice {
skuBind.UnitPrice = unitPrice
skuBind.Price = price
skuBind.JxPrice = jxPrice
updateFieldMap["UnitPrice"] = 1
updateFieldMap["JxPrice"] = 1
}
} else {
skuBind.UnitPrice = unitPrice
skuBind.Price = price
skuBind.JxPrice = jxPrice
updateFieldMap["UnitPrice"] = 1
updateFieldMap["JxPrice"] = 1
}
}
}
if skuBindInfo.StatusSaleBegin != 0 && skuBindInfo.StatusSaleEnd != 0 {
if err := ValidateStruct(skuBindInfo); err != nil {
@@ -1851,7 +1887,7 @@ func AcceptStoreOpRequests(ctx *jxcontext.Context, reqIDs []int) (err error) {
}
}
if err2 == nil {
_, err2 := UpdateStoresSkus(ctx, 0, []int{op.StoreID}, []*StoreSkuBindInfo{skuBindInfo}, false, false, false)
_, err2 := UpdateStoresSkus(ctx, 0, []int{op.StoreID}, []*StoreSkuBindInfo{skuBindInfo}, false, false, false, false)
isLocalSucess := true
if err2 != nil {
subErrors[reqID] = err2
@@ -2067,7 +2103,7 @@ func RefreshStoresSkuByVendor(ctx *jxcontext.Context, storeIDs []int, vendorID i
return "", fmt.Errorf("此功能当前只支持京东到家平台")
}
db := dao.GetDB()
storeMapList, err := dao.GetStoresMapList(db, []int{vendorID}, storeIDs, nil, model.StoreStatusAll, model.StoreIsSyncAll, "")
storeMapList, err := dao.GetStoresMapList(db, []int{vendorID}, storeIDs, nil, model.StoreStatusAll, model.StoreIsSyncAll, "", "")
if err != nil {
return "", err
}
@@ -2570,7 +2606,7 @@ func RefershStoreSkusMidPrice(ctx *jxcontext.Context, storeIDs []int, isCountry
}
}
}
updateStoresSkusWithoutSync(ctx, db, []int{v}, skuBindInfos, false)
updateStoresSkusWithoutSync(ctx, db, []int{v}, skuBindInfos, false, false)
}
if err == nil {
CreateStorePriceScore(ctx)
@@ -2712,7 +2748,7 @@ func RefreshJxPriceByExcelBin(ctx *jxcontext.Context, storeIDs []int, reader io.
skuBindInfoList = append(skuBindInfoList, v.(*StoreSkuBindInfo))
}
if isErr {
UpdateStoresSkus(ctx, 0, storeIDs, skuBindInfoList, false, isAsync, isContinueWhenError)
UpdateStoresSkus(ctx, 0, storeIDs, skuBindInfoList, false, false, isAsync, isContinueWhenError)
}
case 3:
//写Excel
@@ -3372,7 +3408,7 @@ func AutoFocusStoreSkusWithoutFocus(ctx *jxcontext.Context, skuIDs []int, isSync
if isSync {
UpdateStoreSkus(ctx, 0, v.StoreID, skuBindInfoList, true, true)
} else {
updateStoresSkusWithoutSync(ctx, db, []int{v.StoreID}, skuBindInfoList, false)
updateStoresSkusWithoutSync(ctx, db, []int{v.StoreID}, skuBindInfoList, false, false)
}
}
return err
@@ -3479,7 +3515,7 @@ func SendSeckillSkusCountMsg(ctx *jxcontext.Context, vendorIDs []int, isAsync, i
ddMsgresult []interface{}
)
db := dao.GetDB()
storeList, err := dao.GetStoresMapList(db, vendorIDs, nil, []int{model.StoreStatusClosed, model.StoreStatusHaveRest, model.StoreStatusOpened}, model.StoreStatusOpened, model.StoreIsSyncAll, "")
storeList, err := dao.GetStoresMapList(db, vendorIDs, nil, []int{model.StoreStatusClosed, model.StoreStatusHaveRest, model.StoreStatusOpened}, model.StoreStatusOpened, model.StoreIsSyncAll, "", "")
taskSeqFunc := func(task *tasksch.SeqTask, step int, params ...interface{}) (result interface{}, err error) {
switch step {
case 0:
@@ -4076,7 +4112,7 @@ func RefreshMatterStock(ctx *jxcontext.Context, skuID int) (err error) {
}
}
//物料店666666
updateStoresSkusWithoutSync(ctx, db, []int{666666}, skuBindInfos, false)
updateStoresSkusWithoutSync(ctx, db, []int{666666}, skuBindInfos, false, false)
return err
}
@@ -4424,7 +4460,7 @@ func focusC4Matters(ctx *jxcontext.Context, db *dao.DaoDB, v *model.Sku) (err er
}
skuBindInfos = append(skuBindInfos, skuBindInfo)
}
updateStoresSkusWithoutSync(ctx, db, []int{model.MatterStoreID}, skuBindInfos, false)
updateStoresSkusWithoutSync(ctx, db, []int{model.MatterStoreID}, skuBindInfos, false, false)
}
return err
}
@@ -4443,24 +4479,190 @@ func RefreshJdsSkusStatus(ctx *jxcontext.Context) (err error) {
return err
}
func GetStoreSkuAudit(ctx *jxcontext.Context, storeIDs, nameIDs, skuIDs []int, status int, name, remark string, applyTimeStart, applyTimeEnd, auditTimeStart, auditTimeEnd time.Time, pageSize, offset int) (pagedInfo *model.PagedInfo, err error) {
pagedInfo, err = dao.GetStoreSkuAudit(dao.GetDB(), storeIDs, nameIDs, skuIDs, status, name, remark, applyTimeStart, applyTimeEnd, auditTimeStart, auditTimeEnd, pageSize, offset)
func GetStoreSkuAudit(ctx *jxcontext.Context, storeIDs, nameIDs, skuIDs, statuss, types []int, name, remark, keyword, cityName, marketManPhone, applyTimeStart, applyTimeEnd, auditTimeStart, auditTimeEnd string, pageSize, offset int) (pagedInfo *model.PagedInfo, err error) {
var (
applyTimeStartp, applyTimeEndp, auditTimeStartp, auditTimeEndp time.Time
)
if applyTimeStart != "" {
applyTimeStartp = utils.Str2Time(applyTimeStart)
}
if applyTimeEnd != "" {
applyTimeEndp = utils.Str2Time(applyTimeEnd)
}
if auditTimeStart != "" {
auditTimeStartp = utils.Str2Time(auditTimeStart)
}
if auditTimeEnd != "" {
auditTimeEndp = utils.Str2Time(auditTimeEnd)
}
pagedInfo, err = dao.GetStoreSkuAudit(dao.GetDB(), storeIDs, nameIDs, skuIDs, statuss, types, name, remark, keyword, marketManPhone, cityName, applyTimeStartp, applyTimeEndp, auditTimeStartp, auditTimeEndp, pageSize, offset)
return pagedInfo, err
}
func SetJxPrice(jxSkuInfoDataMulti *dao.StoreSkuNamesInfo,storeId int) (err error){
func doStoreSkuAudit(ctx *jxcontext.Context, storeIDs []int, skuBindInfos []*StoreSkuBindInfo) (isAudit bool, err error) {
globals.SugarLogger.Debugf("doStoreSkuAudit storeIDs: %v", storeIDs)
time.Sleep(time.Second / 5)
db := dao.GetDB()
storeDetail, err := dao.GetStoreDetail(dao.GetDB(), storeId, model.VendorIDJX)
for _, storeID := range storeIDs {
for _, skuBindInfo := range skuBindInfos {
globals.SugarLogger.Debugf("doStoreSkuAudit storeID: %v , nameID: %v", storeID, skuBindInfo.NameID)
storeAudits, err := dao.GetStoreSkuAuditLight(db, []int{storeID}, []int{skuBindInfo.NameID}, model.StoreAuditStatusOnline)
//取消关注,可售排除
if skuBindInfo.IsFocus == -1 || skuBindInfo.IsSale != 0 || skuBindInfo.UnitPrice == 0 {
globals.SugarLogger.Debugf("doStoreSkuAudit return1 storeID : %v nameID: %v", storeID, skuBindInfo.NameID)
return false, err
}
//运营排除
// if (ctx.GetFullUser().Type & model.UserTypeOperator) != 0 {
// if len(storeAudits) > 0 {
// storeAudits[0].DeletedAt = time.Now()
// dao.UpdateEntity(db, storeAudits[0], "DeletedAt")
// }
// globals.SugarLogger.Debugf("doStoreSkuAudit return2 storeID : %v nameID: %v", storeID, skuBindInfo.NameID)
// return false, err
// }
if ctx.GetLoginType() != weixin.AuthTypeMP && ctx.GetLoginType() != weixin.AuthTypeMini {
if len(storeAudits) > 0 {
storeAudits[0].DeletedAt = time.Now()
dao.UpdateEntity(db, storeAudits[0], "DeletedAt")
if globals.IsProductEnv() {
skuAndNames, err := dao.GetSkus(db, nil, []int{skuBindInfo.NameID}, nil, nil, nil)
if len(skuAndNames) > 0 && err == nil {
weixinmsg.NotifyStoreOpRequestStatus(true, storeID, skuBindInfo.NameID, jxutils.ComposeSpuName(skuAndNames[0].Prefix, skuAndNames[0].Name, 0), storeAudits[0].OriginUnitPrice, skuBindInfo.UnitPrice, "")
}
}
}
globals.SugarLogger.Debugf("doStoreSkuAudit return3 storeID : %v nameID: %v", storeID, skuBindInfo.NameID)
return false, err
}
storeSkuAudit := &model.StoreSkuAudit{
StoreID: storeID,
NameID: skuBindInfo.NameID,
Status: model.StoreAuditStatusOnline,
UnitPrice: skuBindInfo.UnitPrice,
}
//如果是关注改价
if skuBindInfo.IsFocus == 1 {
if len(storeAudits) > 0 {
storeAudits[0].DeletedAt = time.Now()
dao.UpdateEntity(db, storeAudits[0], "DeletedAt")
}
storeSkuAudit.Type = model.StoreSkuAuditTypeFocus
} else {
storeSkus, err := dao.GetStoreSkusByNameIDs(db, []int{storeID}, skuBindInfo.NameID)
if len(storeSkus) > 0 {
//如果改的价比原价低排除
if skuBindInfo.UnitPrice <= int(storeSkus[0].UnitPrice) {
if len(storeAudits) > 0 {
storeAudits[0].DeletedAt = time.Now()
dao.UpdateEntity(db, storeAudits[0], "DeletedAt")
}
globals.SugarLogger.Debugf("doStoreSkuAudit return4 storeID : %v nameID: %v", storeID, skuBindInfo.NameID)
return false, err
} else {
if len(storeAudits) > 0 {
storeAudits[0].DeletedAt = time.Now()
dao.UpdateEntity(db, storeAudits[0], "DeletedAt")
}
globals.SugarLogger.Debugf("doStoreSkuAudit cover storeID : %v nameID: %v", storeID, skuBindInfo.NameID)
}
} else {
return false, fmt.Errorf("未查询到该门店商品价storeID: %v, nameID: %V", storeID, skuBindInfo.NameID)
}
storeSkuAudit.Type = model.StoreSkuAuditTypePrice
storeSkuAudit.OriginUnitPrice = int(storeSkus[0].UnitPrice)
}
dao.WrapAddIDCULDEntity(storeSkuAudit, ctx.GetUserName())
err = dao.CreateEntity(db, storeSkuAudit)
}
}
return true, err
}
func StoreSkuPriceAudit(ctx *jxcontext.Context, storeSkuAudits []*model.StoreSkuAudit, status int, isAsync, isContinueWhenError bool) (hint string, err error) {
db := dao.GetDB()
if status == model.StoreAuditStatusOnline {
return "", fmt.Errorf("审核标志不正确!")
}
task := tasksch.NewParallelTask("StoreSkuPriceAudit", tasksch.NewParallelConfig().SetParallelCount(1).SetIsContinueWhenError(isContinueWhenError), ctx,
func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) {
storeAudit := batchItemList[0].(*model.StoreSkuAudit)
storeAudits, err := dao.GetStoreSkuAuditLight(db, []int{storeAudit.StoreID}, []int{storeAudit.NameID}, model.StoreAuditStatusOnline)
if len(storeAudits) == 0 || err != nil {
return retVal, fmt.Errorf("未查询到该门店该商品的待审核信息storeID: %v, nameID: %v", storeAudit.StoreID, storeAudit.NameID)
}
if len(storeAudits) > 1 {
return retVal, fmt.Errorf("查询到该门店该商品的待审核信息大于1条storeID: %v, nameID: %v", storeAudit.StoreID, storeAudit.NameID)
}
flag := false
//审核通过
if status == model.StoreAuditStatusCreated {
flag = true
storeAudits[0].UserID = ctx.GetUserID()
storeAudits[0].Status = model.StoreAuditStatusCreated
storeAudits[0].Remark = storeAudit.Remark
storeAudits[0].AuditPrice = storeAudit.AuditPrice
_, err = dao.UpdateEntity(db, storeAudits[0], "UserID", "Status", "Remark", "AuditPrice")
var skuBindInfos = []*StoreSkuBindInfo{
&StoreSkuBindInfo{
NameID: storeAudit.NameID,
UnitPrice: storeAudits[0].UnitPrice,
},
}
//证明填了额外的审核价格
if storeAudit.AuditPrice != 0 {
skuBindInfos[0].UnitPrice = storeAudit.AuditPrice
}
//如果是关注改价
if storeAudits[0].Type == model.StoreSkuAuditTypeFocus {
skuBindInfos[0].IsFocus = 1
}
var num int64
db := dao.GetDB()
skuIDs, err := updateStoresSkusWithoutSync(ctx, db, []int{storeAudit.StoreID}, skuBindInfos, false, false)
if err != nil {
dao.Rollback(db)
return err
return "", err
}
/*重新计算京西价格*/
for _,values := range jxSkuInfoDataMulti.SkuNames{
for _,value := range values.Skus{
value.JxPrice = jxutils.CaculatePriceByPricePack(storeDetail.PricePercentagePackObj, int(storeDetail.PricePercentage), value.JxPrice)
isAsync = asyncStoreSkuOpFilter(ctx, isAsync)
num = int64(len(skuIDs))
if num > 0 {
hint, err = CurVendorSync.SyncStoresSkus(ctx, nil, 0, db, nil, []int{storeAudit.StoreID}, skuIDs, false, isAsync, isContinueWhenError)
}
if num == 0 || !isAsync || hint == "" {
hint = utils.Int64ToStr(num)
}
// _, err = UpdateStoresSkus(ctx, 0, []int{storeID}, skuBindInfos, false, isAsync, isContinueWhenError)
} else if status == model.StoreAuditStatusRejected {
storeAudits[0].UserID = ctx.GetUserID()
storeAudits[0].Status = model.StoreAuditStatusRejected
storeAudits[0].Remark = storeAudit.Remark
_, err = dao.UpdateEntity(db, storeAudits[0], "UserID", "Status", "Remark")
} else {
return retVal, fmt.Errorf("审核标志不正确!")
}
if err == nil {
if globals.IsProductEnv() {
skuAndNames, err := dao.GetSkus(db, nil, []int{storeAudit.NameID}, nil, nil, nil)
if len(skuAndNames) > 0 && err == nil {
price := 0
if storeAudit.AuditPrice != 0 {
price = storeAudit.AuditPrice
} else {
price = storeAudits[0].UnitPrice
}
weixinmsg.NotifyStoreOpRequestStatus(flag, storeAudit.StoreID, storeAudit.NameID, jxutils.ComposeSpuName(skuAndNames[0].Prefix, skuAndNames[0].Name, 0), storeAudits[0].OriginUnitPrice, price, storeAudit.Remark)
}
}
/*重新计算京西价格*/
return nil
}
return retVal, err
}, storeSkuAudits)
tasksch.HandleTask(task, nil, true).Run()
if isAsync {
hint = task.GetID()
} else {
_, err = task.GetResult(0)
hint = "1"
}
return hint, err
}

View File

@@ -1017,7 +1017,7 @@ func WriteToExcel(task *tasksch.SeqTask, data map[int][]DiffData, depotData map[
}
}
func SetAAJxPrice(jxSkuInfoDataMulti *dao.StoreSkuNamesInfo, storeId int) (err error) {
func SetJxPrice(jxSkuInfoDataMulti *dao.StoreSkuNamesInfo, storeId int) (err error) {
db := dao.GetDB()
storeDetail, err := dao.GetStoreDetail(dao.GetDB(), storeId, model.VendorIDJX)
if err != nil {

View File

@@ -645,7 +645,7 @@ func (v *VendorSync) AmendAndPruneStoreStuff(ctx *jxcontext.Context, vendorIDs [
func (v *VendorSync) LoopStoresMap2(ctx *jxcontext.Context, parentTask tasksch.ITask, db *dao.DaoDB, taskName string, isAsync, isManageIt bool, vendorIDs []int, storeIDs []int, mustDirty bool, handler tasksch.WorkFunc, isContinueWhenError bool) (task tasksch.ITask, hint string, err error) {
var storeMapList []*model.StoreMap
if storeMapList, err = dao.GetStoresMapList2(db, vendorIDs, storeIDs, nil, model.StoreStatusAll, model.StoreIsSyncYes, "", mustDirty); err != nil {
if storeMapList, err = dao.GetStoresMapList2(db, vendorIDs, storeIDs, nil, model.StoreStatusAll, model.StoreIsSyncYes, "", "", mustDirty); err != nil {
return nil, "", err
}
if len(storeMapList) == 0 {
@@ -1028,7 +1028,7 @@ func syncStoreSkusFromYb(ctx *jxcontext.Context, storeID, vendorID int, vendorSt
for _, v := range resultDel {
skuBindInfosDel = append(skuBindInfosDel, v.(*StoreSkuBindInfo))
}
_, err = updateStoresSkusWithoutSync(ctx, db, []int{storeID}, skuBindInfosDel, false)
_, err = updateStoresSkusWithoutSync(ctx, db, []int{storeID}, skuBindInfosDel, false, false)
}
case 2:
if len(updateList) > 0 {
@@ -1071,7 +1071,7 @@ func syncStoreSkusFromYb(ctx *jxcontext.Context, storeID, vendorID int, vendorSt
for _, v := range resultUpt {
skuBindInfosUpt = append(skuBindInfosUpt, v.(*StoreSkuBindInfo))
}
_, err = updateStoresSkusWithoutSync(ctx, db, []int{storeID}, skuBindInfosUpt, false)
_, err = updateStoresSkusWithoutSync(ctx, db, []int{storeID}, skuBindInfosUpt, false, false)
}
case 3:
_, err = CurVendorSync.SyncStoresSkus2(jxcontext.AdminCtx, nil, 0, db, []int{0, 1, 3}, nil, false, nil, nil, 0, true, true)
@@ -1101,7 +1101,7 @@ func (v *VendorSync) SyncJdsStoresSkus(ctx *jxcontext.Context, storeIDs []int, i
func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) {
storeMap := batchItemList[0].(*model.StoreMap)
if storeMap.Status > model.StoreStatusDisabled && storeMap.StoreID != model.JdShopMainStoreID && storeMap.SyncRule != 0 {
_, err = syncJdsStoresSkus(ctx, db, task, storeMap, isAsync, isContinueWhenError)
err = syncJdsStoresSkus(ctx, db, task, storeMap, isAsync, isContinueWhenError)
}
return nil, err
}, loopMapInfo.StoreMapList)
@@ -1113,7 +1113,7 @@ func (v *VendorSync) SyncJdsStoresSkus(ctx *jxcontext.Context, storeIDs []int, i
return hint, err
}
func syncJdsStoresSkus(ctx *jxcontext.Context, db *dao.DaoDB, parentTask tasksch.ITask, storeMap *model.StoreMap, isAsync, isContinueWhenError bool) (hint string, err error) {
func syncJdsStoresSkus(ctx *jxcontext.Context, db *dao.DaoDB, parentTask tasksch.ITask, storeMap *model.StoreMap, isAsync, isContinueWhenError bool) (err error) {
var (
mainSkusMap = make(map[int]*model.StoreSkuBind)
skusMap = make(map[int]*model.StoreSkuBind)
@@ -1121,8 +1121,6 @@ func syncJdsStoresSkus(ctx *jxcontext.Context, db *dao.DaoDB, parentTask tasksch
addList []*model.StoreSkuBind
skuBindInfos1 []*StoreSkuBindInfo
skuBindInfos2 []*StoreSkuBindInfo
resultInterface1 []interface{}
resultInterface2 []interface{}
)
storeSkusMain, err := dao.GetStoresSkusInfo(db, []int{model.JdShopMainStoreID}, nil)
for _, v := range storeSkusMain {
@@ -1142,53 +1140,20 @@ func syncJdsStoresSkus(ctx *jxcontext.Context, db *dao.DaoDB, parentTask tasksch
}
}
}
// fmt.Println("updateList", utils.Format4Output(updateList, false))
// fmt.Println("addList", utils.Format4Output(addList, false))
task := tasksch.NewParallelTask("正在同步京东商城的库存商品", tasksch.NewParallelConfig().SetParallelCount(1).SetIsContinueWhenError(isContinueWhenError), ctx,
func(ptTask *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) {
step := batchItemList[0].(int)
switch step {
case 0:
if len(updateList) > 0 {
task := tasksch.NewParallelTask("同步门店库存", tasksch.NewParallelConfig().SetParallelCount(1).SetIsContinueWhenError(isContinueWhenError), ctx,
func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) {
storeBind := batchItemList[0].(*model.StoreSkuBind)
retVal = []*StoreSkuBindInfo{buildStoreSkuBindInfo(db, storeMap.StoreID, storeBind, false)}
return retVal, err
}, updateList)
tasksch.HandleTask(task, ptTask, false).Run()
resultInterface1, err = task.GetResult(0)
for _, v := range resultInterface1 {
skuBindInfos1 = append(skuBindInfos1, v.(*StoreSkuBindInfo))
for _, v := range updateList {
skuBindInfos1 = append(skuBindInfos1, buildStoreSkuBindInfo(db, storeMap.StoreID, v, false))
}
hint, err = UpdateStoresSkusByBind(ctx, ptTask, skuBindInfos1, isAsync, isContinueWhenError, false)
_, err = UpdateStoresSkusByBind(ctx, parentTask, skuBindInfos1, isAsync, isContinueWhenError, false)
}
case 1:
if len(addList) > 0 {
task := tasksch.NewParallelTask("同步门店商品", tasksch.NewParallelConfig().SetParallelCount(1).SetIsContinueWhenError(isContinueWhenError), ctx,
func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) {
storeBind := batchItemList[0].(*model.StoreSkuBind)
retVal = []*StoreSkuBindInfo{buildStoreSkuBindInfo(db, storeMap.StoreID, storeBind, true)}
return retVal, err
}, addList)
tasksch.HandleTask(task, ptTask, false).Run()
resultInterface2, err = task.GetResult(0)
for _, v := range resultInterface2 {
skuBindInfos2 = append(skuBindInfos2, v.(*StoreSkuBindInfo))
for _, v := range addList {
skuBindInfos2 = append(skuBindInfos2, buildStoreSkuBindInfo(db, storeMap.StoreID, v, false))
}
hint, err = UpdateStoresSkusByBind(ctx, ptTask, skuBindInfos2, isAsync, isContinueWhenError, false)
_, err = UpdateStoresSkusByBind(ctx, parentTask, skuBindInfos2, isAsync, isContinueWhenError, false)
}
}
return retVal, err
}, []int{0, 1})
tasksch.HandleTask(task, nil, true).Run()
if isAsync {
hint = task.GetID()
} else {
_, err = task.GetResult(0)
hint = "1"
}
return hint, err
return err
}
func buildStoreSkuBindInfo(db *dao.DaoDB, storeID int, storeBind *model.StoreSkuBind, isFocus bool) (skuBindInfo *StoreSkuBindInfo) {

View File

@@ -16,7 +16,7 @@ func OpenRemoteStoreByJxStatus(ctx *jxcontext.Context, vendorIDs, storeIDs []int
if !isForce {
status = model.StoreStatusClosed
}
storeMapList, err := dao.GetStoresMapList(db, vendorIDs, storeIDs, nil, status, model.StoreIsSyncYes, "")
storeMapList, err := dao.GetStoresMapList(db, vendorIDs, storeIDs, nil, status, model.StoreIsSyncYes, "", "")
if err != nil {
return "", err
}

View File

@@ -237,6 +237,7 @@ func storeSkuSyncInfo2Bare(inSku *dao.StoreSkuSyncInfo) (outSku *partner.StoreSk
JxPrice: inSku.Price,
JxUnitPrice: inSku.UnitPrice,
VendorSkuID2: utils.Int64ToStr(inSku.JdsWareID),
JdsStockSwitch: inSku.JdsStockSwitch,
}
if !isStoreSkuSyncNeedDelete(inSku) {
outSku.Stock = model.MaxStoreSkuStockQty

View File

@@ -0,0 +1,178 @@
package common
import (
"sort"
"git.rosy.net.cn/baseapi/platformapi/autonavi"
"git.rosy.net.cn/baseapi/utils"
"git.rosy.net.cn/jx-callback/business/jxutils"
"git.rosy.net.cn/jx-callback/business/jxutils/jxcontext"
"git.rosy.net.cn/jx-callback/business/model"
"git.rosy.net.cn/jx-callback/business/model/dao"
"git.rosy.net.cn/jx-callback/globals/api"
)
type Store4User struct {
model.ModelIDCULD
OriginalName string `orm:"-" json:"originalName"`
Name string `orm:"size(255)" json:"name"`
OpenTime1 int16 `json:"openTime1"` // 930就表示9点半用两个的原因是为了支持中午休息1与2的时间段不能交叉为0表示没有
CloseTime1 int16 `json:"closeTime1"` // 格式同上
OpenTime2 int16 `json:"openTime2"` // 格式同上
CloseTime2 int16 `json:"closeTime2"` // 格式同上
Status int `json:"status"`
CityCode int `orm:"default(0);null" json:"cityCode"` // todo ?
DistrictCode int `orm:"default(0);null" json:"districtCode"` // todo ?
Address string `orm:"size(255)" json:"address"`
Tel1 string `orm:"size(32);index" json:"tel1"`
Tel2 string `orm:"size(32);index" json:"tel2"`
Lng int `json:"-"` // 乘了10的6次方
Lat int `json:"-"` // 乘了10的6次方
DeliveryRangeType int8 `json:"-"` // 参见相关常量定义
DeliveryRange string `orm:"type(text)" json:"-"` // 如果DeliveryRangeType为DeliveryRangeTypePolygon则为逗号分隔坐标分号分隔的坐标点坐标与Lng和Lat一样都是整数比如 121361504,31189308;121420555,31150238。否则为半径单位为米
FloatLng float64 `json:"lng"`
FloatLat float64 `json:"lat"`
CityName string `json:"cityName"`
DistrictName string `json:"districtName"`
Distance int `json:"distance"`
WalkDistance int `json:"walkDistance"`
}
type Store4UserList []*Store4User
func (x Store4UserList) Len() int {
return len(x)
}
func (x Store4UserList) Less(i, j int) bool {
if x[i].Status != x[j].Status {
return x[i].Status > x[j].Status
}
if x[i].WalkDistance != x[j].WalkDistance {
return x[i].WalkDistance < x[j].WalkDistance
}
return x[i].Distance < x[j].Distance
}
func (x Store4UserList) Swap(i, j int) {
x[i], x[j] = x[j], x[i]
}
func GetStoreListByLocation(ctx *jxcontext.Context, lng, lat float64, maxRadius int, needWalkDistance, isJds bool) (storeList []*Store4User, err error) {
const (
maxStoreCount4User = 5
)
var (
sql string
sqlParams []interface{}
)
lng2, _ := jxutils.ConvertDistanceToLogLat(lng, lat, float64(maxRadius), 90)
_, lat2 := jxutils.ConvertDistanceToLogLat(lng, lat, float64(maxRadius), 0)
lng1 := lng - (lng2 - lng)
lat1 := lat - (lat2 - lat)
// globals.SugarLogger.Debugf("%f,%f,%f,%f\n", lng1, lng2, lat1, lat2)
if !isJds {
sql = `
SELECT t1.*,
city.name city_name
FROM store t1
JOIN place city ON city.code = t1.city_code
JOIN store_map sm ON sm.store_id = t1.id AND sm.vendor_id = ? AND sm.deleted_at = ? AND sm.status <> ?
WHERE t1.deleted_at = ? AND t1.status <> ? AND t1.lng > ? AND t1.lng < ? AND t1.lat > ? AND t1.lat < ?
AND sm.is_order <> ?
AND t1.id <> ?
ORDER BY t1.id
`
sqlParams = []interface{}{
model.VendorIDJX, utils.DefaultTimeValue, model.StoreStatusDisabled,
utils.DefaultTimeValue, model.StoreStatusDisabled, jxutils.StandardCoordinate2Int(lng1), jxutils.StandardCoordinate2Int(lng2), jxutils.StandardCoordinate2Int(lat1), jxutils.StandardCoordinate2Int(lat2),
model.YES,
model.MatterStoreID,
}
} else {
sql = `
SELECT t1.*,
city.name city_name
FROM store t1
JOIN place city ON city.code = t1.city_code
JOIN store_map sm ON sm.store_id = t1.id AND sm.vendor_id = ? AND sm.deleted_at = ? AND sm.status = ?
WHERE t1.deleted_at = ? AND t1.status = ? AND t1.lng > ? AND t1.lng < ? AND t1.lat > ? AND t1.lat < ?
AND sm.is_order <> ?
AND t1.id <> ?
ORDER BY t1.id
`
sqlParams = []interface{}{
model.VendorIDJDShop, utils.DefaultTimeValue, model.StoreStatusOpened,
utils.DefaultTimeValue, model.StoreStatusOpened, jxutils.StandardCoordinate2Int(lng1), jxutils.StandardCoordinate2Int(lng2), jxutils.StandardCoordinate2Int(lat1), jxutils.StandardCoordinate2Int(lat2),
model.YES,
model.MatterStoreID,
}
}
var storeList1 []*Store4User
if err = dao.GetRows(dao.GetDB(), &storeList1, sql, sqlParams...); err == nil {
var storeList2 []*Store4User
for _, v := range storeList1 {
distance := jxutils.Point2StoreDistance(lng, lat, v.Lng, v.Lat, v.DeliveryRangeType, v.DeliveryRange)
if distance > 0 || (lng == jxutils.IntCoordinate2Standard(v.Lng) && lat == jxutils.IntCoordinate2Standard(v.Lat)) {
v.Distance = distance
storeList2 = append(storeList2, v)
}
}
// 为了审核用
if len(storeList2) == 0 {
sql2 := `
SELECT t1.*,
city.name city_name
FROM store t1
JOIN place city ON city.code = t1.city_code
WHERE t1.deleted_at = ? AND t1.status <> ? AND t1.id = ?
`
sqlParams2 := []interface{}{
// model.VendorIDJX, utils.DefaultTimeValue, model.StoreStatusDisabled,
utils.DefaultTimeValue,
model.StoreStatusDisabled,
// jxutils.StandardCoordinate2Int(0),
// jxutils.StandardCoordinate2Int(10000),
// jxutils.StandardCoordinate2Int(0),
// jxutils.StandardCoordinate2Int(10000),
// model.YES,
102919, //商城模板店
}
dao.GetRows(dao.GetDB(), &storeList2, sql2, sqlParams2...)
// if len(storeList2) > 1 {
// storeList2 = storeList2[:1]
// }
}
// 如果要求以步行距离来算
if needWalkDistance {
var coordList []*autonavi.Coordinate
for _, v := range storeList2 {
coordList = append(coordList, &autonavi.Coordinate{
Lng: v.FloatLng,
Lat: v.FloatLat,
})
}
if distanceList, err2 := api.AutonaviAPI.BatchWalkingDistance(lng, lat, coordList); err2 == nil {
for k, v := range storeList2 {
v.WalkDistance = int(distanceList[k])
}
} else {
return nil, err2
}
}
sort.Sort(Store4UserList(storeList2))
storeList = storeList2
if len(storeList) > maxStoreCount4User {
storeList = storeList[:maxStoreCount4User]
}
}
return storeList, err
}

View File

@@ -45,6 +45,9 @@ var (
dailyWorkTimeList = []string{
"22:00:00",
}
dailyWorkTimeList2 = []string{
"23:00:00",
}
priceReferTimeList = []string{
"01:00:00",
}
@@ -158,6 +161,12 @@ func Init() {
if globals.IsProductEnv() {
ScheduleTimerFunc("doDailyWork", doDailyWork, dailyWorkTimeList)
ScheduleTimerFunc("doDailyWork2", doDailyWork2, dailyWorkTimeList2)
ScheduleTimerFuncByInterval(func() {
orderman.SaveJdsOrders(jxcontext.AdminCtx, time.Now().Add(-15*time.Minute), time.Now())
}, 10*time.Second, 10*time.Minute)
ScheduleTimerFuncByInterval(func() {
RefreshRealMobile(jxcontext.AdminCtx, model.VendorIDEBAI, time.Now().Add(-24*time.Hour), utils.DefaultTimeValue, false, true)
}, 5*time.Second, 1*time.Hour)
@@ -261,8 +270,6 @@ func Init() {
}, []string{
"04:05:06",
})
ScheduleTimerFuncByInterval(func() {
}, 5*time.Second, 5*time.Minute)
}
if configs, err := dao.QueryConfigs(dao.GetDB(), "ebaiStorePageCookieExdTOKEN", model.ConfigTypeCookie, ""); err == nil {
ebaiStorePageCookieExdTOKEN = configs[0].Value
@@ -373,6 +380,13 @@ func syncStoreSku() {
tasksch.HandleTask(task, nil, true).Run()
}
func doDailyWork2() {
globals.SugarLogger.Debug("doDailyWork2")
//同步京东商城门店库存和商品
cms.CurVendorSync.SyncJdsStoresSkus(jxcontext.AdminCtx, nil, true, true)
}
func doDailyWork() {
globals.SugarLogger.Debug("doDailyWork")
@@ -403,8 +417,6 @@ func doDailyWork() {
cms.CurVendorSync.SyncStoreSkusFromYb(jxcontext.AdminCtx, nil, true, true)
//刷新京东商城订单结算价
orderman.RefreshJdShopOrdersEarningPrice(jxcontext.AdminCtx, time.Now().AddDate(0, 0, -3).Format("20060102"), time.Now().Format("20060102"))
//同步京东商城门店库存和商品
cms.CurVendorSync.SyncJdsStoresSkus(jxcontext.AdminCtx, nil, true, true)
//同步上架京东商城待售商品
cms.RefreshJdsSkusStatus(jxcontext.AdminCtx)
}

View File

@@ -1236,7 +1236,7 @@ func FixMtwmCategory(ctx *jxcontext.Context, mtwmStoreIDs []int, isAsync, isCont
func JdStoreInfo1125() (hint string, err error) {
fileName := "老格恢复拓店进度.xlsx"
db := dao.GetDB()
storeList, err := dao.GetStoresMapList(db, []int{model.VendorIDJD}, nil, nil, model.StoreStatusAll, model.StoreIsSyncYes, "")
storeList, err := dao.GetStoresMapList(db, []int{model.VendorIDJD}, nil, nil, model.StoreStatusAll, model.StoreIsSyncYes, "", "")
if err == nil {
var validStoreList []*dao.StoreDetail
for _, v := range storeList {
@@ -1617,3 +1617,76 @@ func UploadJdsImage(ctx *jxcontext.Context) (err error) {
})
return err
}
func RefreshJXPriceChange(ctx *jxcontext.Context, storeID int) (hint string, err error) {
db := dao.GetDB()
var (
stores []*model.Store
vendorIDs = []int{0, 1, 3, 5, 9}
isAsync = true
isContinueWhenError = true
)
sql := `
SELECT *
FROM store
WHERE deleted_at = ? AND status <> ?
AND id <> 100118 AND id <> 100274 AND id <> 100205
`
sqlParams := []interface{}{utils.DefaultTimeValue, model.StoreStatusDisabled}
if storeID != 0 {
sql += " AND id = ?"
sqlParams = append(sqlParams, storeID)
}
err = dao.GetRows(db, &stores, sql, sqlParams)
task := tasksch.NewParallelTask("刷新门店价格", tasksch.NewParallelConfig().SetIsContinueWhenError(isContinueWhenError), ctx,
func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) {
store := batchItemList[0].(*model.Store)
var skuBindInfos []*cms.StoreSkuBindInfo
for _, v := range vendorIDs {
storeMaps, _ := dao.GetStoresMapList(db, []int{v}, []int{store.ID}, nil, model.StoreStatusAll, model.StoreIsSyncAll, "", "")
if len(storeMaps) > 0 {
storeMap := storeMaps[0]
switch v {
case model.VendorIDJD:
storeMap.PricePercentagePack = "京东测试报价=结算价"
dao.UpdateEntity(db, storeMap, "PricePercentagePack")
case model.VendorIDEBAI:
storeMap.PricePercentagePack = "美团测试报价=结算价"
dao.UpdateEntity(db, storeMap, "PricePercentagePack")
case model.VendorIDMTWM:
storeMap.PricePercentagePack = "饿百测试报价=结算价"
dao.UpdateEntity(db, storeMap, "PricePercentagePack")
case model.VendorIDJDShop:
storeMap.PricePercentagePack = "京西100-100"
dao.UpdateEntity(db, storeMap, "PricePercentagePack")
case model.VendorIDJX:
storeMap.PricePercentagePack = "京西100-100"
dao.UpdateEntity(db, storeMap, "PricePercentagePack")
}
}
}
storeSkus, err := dao.GetStoresSkusInfo(db, []int{store.ID}, nil)
for _, v := range storeSkus {
skuAndName, _ := dao.GetSkus(db, []int{v.SkuID}, nil, nil, nil, nil)
skuBindInfo := &cms.StoreSkuBindInfo{
// StoreID: store.ID,
NameID: skuAndName[0].NameID,
UnitPrice: v.UnitPrice * store.PayPercentage / 100,
}
skuBindInfos = append(skuBindInfos, skuBindInfo)
}
// cms.UpdateStoresSkusByBind(ctx, task, skuBindInfos, isAsync, isContinueWhenError, false)
cms.UpdateStoresSkusWithoutSync(ctx, []int{store.ID}, skuBindInfos, false)
store.PayPercentage = 100
dao.UpdateEntity(db, store, "PayPercentage")
return retVal, err
}, stores)
tasksch.HandleTask(task, nil, true).Run()
if isAsync {
hint = task.GetID()
} else {
_, err = task.GetResult(0)
hint = "1"
}
return hint, err
}

View File

@@ -851,7 +851,7 @@ func UpdateJxPriceByWeimob(ctx *jxcontext.Context, storeIDs []int, isAsync, isCo
for _, v := range storeSkuBindInfoList {
skuBindInfos = append(skuBindInfos, v.(*cms.StoreSkuBindInfo))
}
cms.UpdateStoresSkus(ctx, 0, storeIDs, skuBindInfos, false, isAsync, isContinueWhenError)
cms.UpdateStoresSkus(ctx, 0, storeIDs, skuBindInfos, false, false, isAsync, isContinueWhenError)
case 2:
WriteToExcel3(task, dataStoreSkusSuccess.dataStoreSkusSuccessList, dataFailed.dataFailedList)
}

View File

@@ -3,6 +3,8 @@ package jxutils
import (
"bytes"
"context"
"crypto/aes"
"encoding/base64"
"fmt"
"io/ioutil"
"math"
@@ -882,3 +884,35 @@ func TranslateSoundSize(vendorID, soundPercentage int) (soundSize string) {
}
return soundSize
}
//ECB,AES模式解密
//目前就京东商城订单手机号解密用
func DecryptDESECB(d, key []byte) string {
data, err := base64.StdEncoding.DecodeString(string(d))
if err != nil {
return ""
}
block, err := aes.NewCipher(key)
if err != nil {
return ""
}
bs := block.BlockSize()
if len(data)%bs != 0 {
return ""
}
out := make([]byte, len(data))
dst := out
for len(data) > 0 {
block.Decrypt(dst, data[:bs])
data = data[bs:]
dst = dst[bs:]
}
out = PKCS5UnPadding(out)
return string(out)
}
func PKCS5UnPadding(origData []byte) []byte {
length := len(origData)
unpadding := int(origData[length-1])
return origData[:(length - unpadding)]
}

View File

@@ -86,7 +86,7 @@ func isPushSMS(order *model.GoodsOrder) bool {
} else {
storeID = order.StoreID
}
stores, _ := dao.GetStoresMapList(dao.GetDB(), []int{order.VendorID}, []int{storeID}, nil, model.StoreStatusAll, model.StoreIsSyncAll, "")
stores, _ := dao.GetStoresMapList(dao.GetDB(), []int{order.VendorID}, []int{storeID}, nil, model.StoreStatusAll, model.StoreIsSyncAll, "", "")
if len(stores) > 0 {
if stores[0].IsOrder == model.NO {
if storeID == model.MatterStoreID {

View File

@@ -57,8 +57,8 @@ const (
WX_SALE_BILL_TEMPLATE_ID = "eTUuFZMWH7IsVBfcxNMpmaHYaxRkUaD6zG8wSGJDcic"
WX_NORMAL_STORE_MSG_TEMPLATE_ID = "EUeIJEz2TLUAn4TU2EffOGYLd3dEaYndD_y6Sw9FcSU"
// WX_CHANGE_APPROVED_TEMPLATE_ID = "gIG2olBZtQbjXmp6doNB_dESu60By5xuXYOGxksLv3Y"
// WX_CHANGE_REJECTED_TEMPLATE_ID = "tn2QXWi4HtSIwaztmtN6Bb2uzNL-jBxWltCZTDNJuYE"
WX_CHANGE_APPROVED_TEMPLATE_ID = "gIG2olBZtQbjXmp6doNB_dESu60By5xuXYOGxksLv3Y"
WX_CHANGE_REJECTED_TEMPLATE_ID = "OBF4-d5inK95epHcUltpdb1zq9boVp2HESpASVRh1Oo"
WX_ORDER_APPLY_CANCEL_TEMPLATE_ID = "e6urTtcm4PL0rgDMG_1qWNOwrE3Qxqcm_dx0kWWCmEI"
WX_ORDER_ORDER_CANCELED_TEMPLATE_ID = "HXjuSAbIk77Xh18hjgwoxHzbciR9jX3Rn2CpLJz9dZw"
@@ -460,50 +460,58 @@ func NotifySaleBill(storeID int, title, shopName, fileURL string) (err error) {
}
func NotifyStoreOpRequestStatus(isAccepted bool, storeID, nameID int, spuName string, originalUnitPrice, unitPrice int, rejectReason string) (err error) {
// globals.SugarLogger.Debugf("NotifyStoreOpRequestStatus isAccepted:%t, storeID:%d, nameID:%d, spuName:%s, originalUnitPrice:%d, unitPrice:%d, rejectReason:%s", isAccepted, storeID, nameID, spuName, originalUnitPrice, unitPrice, rejectReason)
// templateID := ""
// fileURL := globals.WxBackstageHost + fmt.Sprintf("%s%d", WX_TO_STORE_SKU_PAGE_URL, storeID)
// data := make(map[string]interface{})
// if isAccepted {
// templateID = WX_CHANGE_APPROVED_TEMPLATE_ID
// data = map[string]interface{}{
// "first": map[string]interface{}{
// "value": fmt.Sprintf("%s%s元修改为%s元已经通过审核。^_^", spuName, jxutils.IntPrice2StandardString(int64(originalUnitPrice)), jxutils.IntPrice2StandardString(int64(unitPrice))),
// "color": "#333333",
// },
// "keyword1": map[string]interface{}{
// "value": "审核通过",
// "color": "#2E408E",
// },
// "keyword2": map[string]interface{}{
// "value": utils.Time2Str(time.Now()),
// "color": "#2E408E",
// },
// "remark": map[string]interface{}{
// "value": "点击查看详情",
// },
// }
// } else {
// templateID = WX_CHANGE_REJECTED_TEMPLATE_ID
// data = map[string]interface{}{
// "first": map[string]interface{}{
// "value": fmt.Sprintf("您好!抱歉的通知您。%s%s元修改为%s元未通过审核。原因%s", spuName, jxutils.IntPrice2StandardString(int64(originalUnitPrice)), jxutils.IntPrice2StandardString(int64(unitPrice)), rejectReason),
// "color": "#E80000",
// },
// "keyword1": map[string]interface{}{
// "value": "1",
// "color": "#2E408E",
// },
// "keyword2": map[string]interface{}{
// "value": utils.Time2Str(time.Now()),
// "color": "#2E408E",
// },
// "remark": map[string]interface{}{
// "value": "请您及时到商品管理修改价格,修改后请重新提交。",
// },
// }
// }
// err = SendMsgToStore(storeID, templateID, fileURL, WX_MINI_TO_STORE_SKU_PAGE_URL, data)
globals.SugarLogger.Debugf("NotifyStoreOpRequestStatus isAccepted:%t, storeID:%d, nameID:%d, spuName:%s, originalUnitPrice:%d, unitPrice:%d, rejectReason:%s", isAccepted, storeID, nameID, spuName, originalUnitPrice, unitPrice, rejectReason)
templateID := ""
fileURL := globals.WxBackstageHost + fmt.Sprintf("%s%d", WX_TO_STORE_SKU_PAGE_URL, storeID)
data := make(map[string]interface{})
if isAccepted {
templateID = WX_CHANGE_APPROVED_TEMPLATE_ID
data = map[string]interface{}{
"first": map[string]interface{}{
"value": fmt.Sprintf("%s%s元修改为%s元已经通过审核。^_^", spuName, jxutils.IntPrice2StandardString(int64(originalUnitPrice)), jxutils.IntPrice2StandardString(int64(unitPrice))),
"color": "#333333",
},
"keyword1": map[string]interface{}{
"value": "审核通过",
"color": "#2E408E",
},
"keyword2": map[string]interface{}{
"value": utils.Time2Str(time.Now()),
"color": "#2E408E",
},
"remark": map[string]interface{}{
"value": "点击查看详情",
},
}
} else {
templateID = WX_CHANGE_REJECTED_TEMPLATE_ID
data = map[string]interface{}{
"first": map[string]interface{}{
"value": fmt.Sprintf("您好!抱歉的通知您。%s%s元修改为%s元未通过审核。原因%s", spuName, jxutils.IntPrice2StandardString(int64(originalUnitPrice)), jxutils.IntPrice2StandardString(int64(unitPrice)), rejectReason),
"color": "#E80000",
},
"keyword1": map[string]interface{}{
"value": "1",
"color": "#2E408E",
},
"keyword2": map[string]interface{}{
"value": "审核不通过",
"color": "#2E408E",
},
"keyword3": map[string]interface{}{
"value": utils.Time2Str(time.Now()),
"color": "#2E408E",
},
"keyword4": map[string]interface{}{
"value": "审核不通过",
"color": "#2E408E",
},
"remark": map[string]interface{}{
"value": "请您及时到商品管理修改价格,修改后请重新提交。",
},
}
}
err = SendMsgToStore(storeID, templateID, fileURL, WX_MINI_TO_STORE_SKU_PAGE_URL, data)
return err
}

View File

@@ -1281,3 +1281,14 @@ func GetSimpleOrder(db *DaoDB, vendorOrderID string) (goods *model.GoodsOrder, e
err = GetRow(db, &goods, sql, sqlParams)
return goods, err
}
func GetSimpleOrderSkus(db *DaoDB, vendorOrderID string) (skus []*model.OrderSku, err error) {
sql := `
SELECT *
FROM order_sku
WHERE vendor_order_id = ?
`
sqlParams := []interface{}{vendorOrderID}
err = GetRows(db, &skus, sql, sqlParams)
return skus, err
}

View File

@@ -231,7 +231,7 @@ func GetStoreCourierList(db *DaoDB, storeIDs []int, status, auditStatus int) (co
return nil, err
}
func GetStoresMapList2(db *DaoDB, vendorIDs, storeIDs, storeStatuss []int, status, isSync int, pricePack string, mustDirty bool) (storeMapList []*model.StoreMap, err error) {
func GetStoresMapList2(db *DaoDB, vendorIDs, storeIDs, storeStatuss []int, status, isSync int, pricePack, name string, mustDirty bool) (storeMapList []*model.StoreMap, err error) {
sql := `
SELECT t1.*
FROM store_map t1
@@ -266,6 +266,10 @@ func GetStoresMapList2(db *DaoDB, vendorIDs, storeIDs, storeStatuss []int, statu
sql += " AND t1.price_percentage_pack = ?"
sqlParams = append(sqlParams, pricePack)
}
if name != "" {
sql += " AND t2.name LIKE ?"
sqlParams = append(sqlParams, "%"+name+"%")
}
if mustDirty {
sql += " AND t1.sync_status <> 0"
}
@@ -300,8 +304,8 @@ func SetStoresMapSyncStatus(db *DaoDB, vendorIDs, storeIDs []int, syncStatus int
return err
}
func GetStoresMapList(db *DaoDB, vendorIDs, storeIDs, storeStatuss []int, status, isSync int, pricePack string) (storeMapList []*model.StoreMap, err error) {
return GetStoresMapList2(db, vendorIDs, storeIDs, storeStatuss, status, isSync, pricePack, false)
func GetStoresMapList(db *DaoDB, vendorIDs, storeIDs, storeStatuss []int, status, isSync int, pricePack, name string) (storeMapList []*model.StoreMap, err error) {
return GetStoresMapList2(db, vendorIDs, storeIDs, storeStatuss, status, isSync, pricePack, name, false)
}
func StoreMapList2Map(storeMapList []*model.StoreMap) (storeMapMap map[int][]*model.StoreMap) {

View File

@@ -86,6 +86,7 @@ type StoreSkuSyncInfo struct {
NameCategoryID int `orm:"column(name_category_id)"`
YbNameSuffix string //银豹的商品条码后缀
YbBarCode string //银豹的商品条码
JdsStockSwitch int
// 平台相关的图片信息
Img string
@@ -155,6 +156,7 @@ type StoreSkuNameExt struct {
RealMidUnitPrice int `json:"realMidUnitPrice"`
Count int `json:"count"`
YbSkuName string `json:"ybSkuName"`
AuditUnitPrice int `json:"auditUnitPrice"` //审核价格
}
// GetStoreSkus用
@@ -402,6 +404,7 @@ func GetStoreSkus2(db *DaoDB, vendorID, storeID int, skuIDs []int, mustDirty boo
t1.store_id, t1.deleted_at bind_deleted_at,t1.status_sale_begin,t1.status_sale_end, t1.jds_ware_id,
t2.*,
t3.id name_id, t3.prefix, t3.name, t3.unit, t3.upc, t3.status name_status, t3.ex_prefix, t3.ex_prefix_begin, t3.ex_prefix_end, t3.category_id name_category_id, t3.yb_name_suffix,
t3.jds_stock_switch,
IF(t11.%s <> '', t11.%s, t3.img) img,
IF(t12.%s <> '', t12.%s, t3.img2) img2,
IF(t13.%s <> '', t13.%s, t3.desc_img) desc_img,
@@ -1288,7 +1291,7 @@ func UpdateActPrice4StoreSkuNameNew(db *DaoDB, storeIDs, skuIDs []int, skuNamesI
vendorIDs = []int{actVendorID}
}
} else {
storeMapList, err := GetStoresMapList(db, nil, storeIDs, nil, model.StoreStatusAll, model.StoreIsSyncAll, "")
storeMapList, err := GetStoresMapList(db, nil, storeIDs, nil, model.StoreStatusAll, model.StoreIsSyncAll, "", "")
if err != nil {
return err
}
@@ -1534,15 +1537,39 @@ func UpdateJdsWareID(db *DaoDB, storeSkuSyncInfo *StoreSkuSyncInfo) (err error)
return err
}
func GetStoreSkuAudit(db *DaoDB, storeIDs, nameIDs, skuIDs []int, status int, name, remark string, applyTimeStart, applyTimeEnd, auditTimeStart, auditTimeEnd time.Time, pageSize, offset int) (pagedInfo *model.PagedInfo, err error) {
var requestList []*model.StoreSkuAudit
type tStoreSkuAudit struct {
model.StoreSkuAudit
SkuName string `orm:"size(255)" json:"skuName"`
StoreName string `json:"storeName"`
Prefix string `orm:"size(255)" json:"prefix"`
Unit string `orm:"size(8)" json:"unit"`
SpecQuality float32 `json:"-"` // 为份必然为500这个主要作用只是用于确保SkuName的唯一性
SpecUnit string `orm:"size(8)" json:"-"` // 为份必然为克这个主要作用只是用于确保SkuName的唯一性
Img string `orm:"size(512)" json:"img"`
Name string `json:"name"`
MidUnitPrice int `json:"midUnitPrice"`
CityName string `json:"cityName"`
PayPercentage int `json:"payPercentage"`
}
func GetStoreSkuAudit(db *DaoDB, storeIDs, nameIDs, skuIDs, statuss, types []int, name, remark, keyword, marketManPhone, cityName string, applyTimeStart, applyTimeEnd, auditTimeStart, auditTimeEnd time.Time, pageSize, offset int) (pagedInfo *model.PagedInfo, err error) {
var requestList []*tStoreSkuAudit
sql := `
SELECT SQL_CALC_FOUND_ROWS a.*
FROM store_sku_audit a, user b
SELECT SQL_CALC_FOUND_ROWS DISTINCT a.*,
c.name sku_name, c.prefix, c.unit, c.spec_quality, c.spec_unit, c.img,
d.name store_name, b.name, e.mid_unit_price, f.name city_name, d.pay_percentage
FROM store_sku_audit a
LEFT JOIN user b ON a.user_id = b.user_id
LEFT JOIN sku_name c ON c.id = a.name_id AND c.deleted_at = ?
LEFT JOIN store d ON d.id = a.store_id AND d.deleted_at = ?
LEFT JOIN place f ON f.code = d.city_code
LEFT JOIN price_refer_snapshot e ON e.name_id = c.id AND e.city_code = ? AND e.snapshot_at = ?
WHERE a.deleted_at = ?
AND a.user_id = b.user_id
`
sqlParams := []interface{}{utils.DefaultTimeValue}
sqlParams := []interface{}{
utils.DefaultTimeValue, utils.DefaultTimeValue,
0, utils.Time2Date(time.Now().AddDate(0, 0, -1)),
utils.DefaultTimeValue}
if len(storeIDs) > 0 {
sql += " AND a.store_id IN (" + GenQuestionMarks(len(storeIDs)) + ")"
sqlParams = append(sqlParams, storeIDs)
@@ -1551,9 +1578,9 @@ func GetStoreSkuAudit(db *DaoDB, storeIDs, nameIDs, skuIDs []int, status int, na
sql += " AND a.name_id IN (" + GenQuestionMarks(len(nameIDs)) + ")"
sqlParams = append(sqlParams, nameIDs)
}
if status != model.StoreAuditStatusAll {
sql += " AND a.status = ? "
sqlParams = append(sqlParams, status)
if len(statuss) > 0 {
sql += " AND a.status IN (" + GenQuestionMarks(len(statuss)) + ")"
sqlParams = append(sqlParams, statuss)
}
if remark != "" {
sql += " AND a.remark LIKE ? "
@@ -1571,7 +1598,23 @@ func GetStoreSkuAudit(db *DaoDB, storeIDs, nameIDs, skuIDs []int, status int, na
sql += " AND a.updated_at BETWEEN ? AND ?"
sqlParams = append(sqlParams, applyTimeStart, applyTimeEnd)
}
sql += "LIMIT ? OFFSET ?"
if len(types) > 0 {
sql += " AND a.type IN (" + GenQuestionMarks(len(types)) + ")"
sqlParams = append(sqlParams, types)
}
if keyword != "" {
sql += " AND (b.name LIKE ? OR a.remark LIKE ? OR a.name_id LIKE ? OR a.user_id LIKE ? OR a.store_id LIKE ? OR f.name LIKE ?)"
sqlParams = append(sqlParams, "%"+keyword+"%", "%"+keyword+"%", "%"+keyword+"%", "%"+keyword+"%", "%"+keyword+"%", "%"+keyword+"%")
}
if marketManPhone != "" {
sql += " AND d.market_man_phone LIKE ? "
sqlParams = append(sqlParams, "%"+marketManPhone+"%")
}
if cityName != "" {
sql += " AND f.name LIKE ? "
sqlParams = append(sqlParams, "%"+cityName+"%")
}
sql += " ORDER BY a.updated_at DESC LIMIT ? OFFSET ?"
pageSize = jxutils.FormalizePageSize(pageSize)
sqlParams = append(sqlParams, pageSize, offset)
Begin(db)
@@ -1584,3 +1627,26 @@ func GetStoreSkuAudit(db *DaoDB, storeIDs, nameIDs, skuIDs []int, status int, na
}
return pagedInfo, err
}
func GetStoreSkuAuditLight(db *DaoDB, storeIDs, nameIDs []int, status int) (storeSkuAudit []*model.StoreSkuAudit, err error) {
sql := `
SELECT a.*
FROM store_sku_audit a
WHERE a.deleted_at = ?
`
sqlParams := []interface{}{utils.DefaultTimeValue}
if len(storeIDs) > 0 {
sql += " AND a.store_id IN (" + GenQuestionMarks(len(storeIDs)) + ")"
sqlParams = append(sqlParams, storeIDs)
}
if len(nameIDs) > 0 {
sql += " AND a.name_id IN (" + GenQuestionMarks(len(nameIDs)) + ")"
sqlParams = append(sqlParams, nameIDs)
}
if status != model.StoreAuditStatusAll {
sql += " AND a.status = ? "
sqlParams = append(sqlParams, status)
}
err = GetRows(db, &storeSkuAudit, sql, sqlParams...)
return storeSkuAudit, err
}

View File

@@ -188,6 +188,7 @@ type SkuName struct {
// LinkID int `orm:"column(link_id);null;index" json:"linkID"`
YbNameSuffix string `json:"ybNameSuffix"` //银豹商品后缀
JdsStockSwitch int8 `orm:"default(1)" json:"jdsStockSwitch"`
}
func (*SkuName) TableUnique() [][]string {

View File

@@ -25,6 +25,11 @@ const (
StoreAuditStatusAll = -9
)
const (
StoreSkuAuditTypePrice = 1 //改价
StoreSkuAuditTypeFocus = 2 //关注
)
const (
MainSubStoreName = "本店"
MainSubStoreAddress = "本店"

View File

@@ -20,8 +20,8 @@ const (
const (
RequestStatusNew = 0
RequestStatusRejected = 1
RequestStatusAccepted = 2
RequestStatusRejected = -1
RequestStatusAccepted = 1
RequestStatusCanceled = 3
)
@@ -202,19 +202,13 @@ type StoreSkuAudit struct {
Status int8 `json:"status"` //
UserID string `orm:"size(48);column(user_id)" json:"userID"`
OriginUnitPrice int `json:"originPrice"` // 表示原价
UnitPrice int `json:"unitPrice"`
UnitPrice int `json:"unitPrice"` //老板申请的审核价格
AuditPrice int `json:"auditPrice"` //运营录入的审核价格
Remark string `orm:"size(255)" json:"remark"`
}
func (*StoreSkuAudit) TableUnique() [][]string {
return [][]string{
[]string{"StoreID", "Type", "NameID", "DeletedAt"},
}
}
func (*StoreSkuAudit) TableIndex() [][]string {
return [][]string{
[]string{"DeletedAt"},
[]string{"StoreID", "Status", "Type"},
[]string{"StoreID", "Type", "NameID", "Status", "DeletedAt"},
}
}

View File

@@ -0,0 +1,96 @@
package jdeclp
import (
"fmt"
"time"
"git.rosy.net.cn/baseapi/platformapi/jdeclpapi"
"git.rosy.net.cn/baseapi/utils"
"git.rosy.net.cn/jx-callback/business/jxutils"
"git.rosy.net.cn/jx-callback/business/jxutils/jxcontext"
"git.rosy.net.cn/jx-callback/business/model"
"git.rosy.net.cn/jx-callback/business/model/dao"
"git.rosy.net.cn/jx-callback/business/partner"
"git.rosy.net.cn/jx-callback/globals/api"
)
var (
CurDeliveryHandler *DeliveryHandler
)
type DeliveryHandler struct {
}
func init() {
CurDeliveryHandler = new(DeliveryHandler)
partner.RegisterDeliveryPlatform(CurDeliveryHandler, true)
}
func (c *DeliveryHandler) GetVendorID() int {
return model.VendorIDJDWL
}
func (c *DeliveryHandler) CreateStore(ctx *jxcontext.Context, storeDetail *dao.StoreDetail2) (vendorStoreID string, status int, err error) {
return vendorStoreID, status, err
}
func (c *DeliveryHandler) GetStore(ctx *jxcontext.Context, storeID int, vendorStoreID string) (storeDetail *dao.StoreDetail2, err error) {
return storeDetail, err
}
func (c *DeliveryHandler) IsErrStoreNotExist(err error) bool {
return false
}
func (c *DeliveryHandler) IsErrStoreExist(err error) bool {
return false
}
func (c *DeliveryHandler) CreateWaybill(order *model.GoodsOrder, maxDeliveryFee int64) (bill *model.Waybill, err error) {
storeID := jxutils.GetShowStoreIDFromOrder(order)
stores, err := dao.GetStoreList(dao.GetDB(), []int{storeID}, nil, nil, nil, "")
if len(stores) == 0 || err != nil {
return bill, fmt.Errorf("未查询到该门店! 门店id [%v]", storeID)
}
vendorWaybillID, err := api.JdEclpAPI.WaybillReceive(&jdeclpapi.WaybillReceiveParam{
SalePlat: jdeclpapi.SalePlatSourceDelivery,
CustomerCode: jdeclpapi.CustomerCode,
OrderID: order.VendorOrderID,
SenderName: order.StoreName,
SenderAddress: stores[0].Address,
SenderTel: stores[0].Tel1,
ReceiveName: order.ConsigneeName,
ReceiveAddress: order.ConsigneeAddress,
ReceiveTel: order.ConsigneeMobile,
Weight: order.Weight,
Vloumn: order.Weight,
PackageCount: 1,
Description: "生鲜",
Aging: 5,
})
waybill := &model.Waybill{
VendorOrderID: order.VendorOrderID,
OrderVendorID: model.VendorIDJDShop,
VendorWaybillID: vendorWaybillID,
WaybillVendorID: model.VendorIDJDWL,
Status: model.WaybillStatusDelivering,
WaybillCreatedAt: time.Now(),
StatusTime: time.Now(),
WaybillFinishedAt: utils.DefaultTimeValue,
DeliveryFlag: model.OrderDeliveryFlagMaskScheduleDisabled,
}
dao.CreateEntity(dao.GetDB(), waybill)
return waybill, err
}
func (c *DeliveryHandler) CancelWaybill(bill *model.Waybill, cancelReasonID int, cancelReason string) (err error) {
err = api.JdEclpAPI.CancelWayBill(&jdeclpapi.CancelWayBillParam{
WaybillCode: bill.VendorWaybillID,
CustomerCode: jdeclpapi.CustomerCode,
Source: "JOS",
CancelReason: cancelReason,
OperatorName: "jxadmin",
})
return err
}
func (c *DeliveryHandler) GetWaybillFee(order *model.GoodsOrder) (deliveryFeeInfo *partner.WaybillFeeInfo, err error) {
return deliveryFeeInfo, err
}
func (c *DeliveryHandler) ComplaintRider(bill *model.Waybill, resonID int, resonContent string) (err error) {
return err
}

View File

@@ -0,0 +1 @@
package jdeclp

View File

@@ -52,6 +52,7 @@ type StoreSkuInfo struct {
JxPrice int64 `json:"jxPrice,omitempty"`
JxUnitPrice int64 `json:"jxUnitPrice,omitempty"`
VendorSkuID2 string `json:"vendorSkuID2,omitempty"`
JdsStockSwitch int `json:"jdsStockSwitch"`
}
type StoreSkuInfoWithErr struct {

View File

@@ -73,6 +73,7 @@ func (c *PurchaseHandler) updateOrderFinancialInfo(a *jdapi.API, orderID string)
if err == nil {
if orderSettlement != nil {
updateOrderBySettleMent(order, orderSettlement)
globals.SugarLogger.Debugf("updateOrderBySettleMent: %v , %v", order.NewEarningPrice, order.TotalShopMoney)
err = partner.CurOrderManager.UpdateOrderFields(order, []string{ /*"WaybillTipMoney", */ "TotalShopMoney", "PmSubsidyMoney", "NewEarningPrice"})
}
}
@@ -146,6 +147,8 @@ func updateOrderBySettleMent(order *model.GoodsOrder, orderSettlement *jdapi.Ord
order.NewEarningPrice = order.EarningPrice
}
}
} else {
order.NewEarningPrice = order.EarningPrice
}
}
}

View File

@@ -1,11 +1,14 @@
package jdshop
import (
"time"
"git.rosy.net.cn/baseapi/platformapi/jdshopapi"
"git.rosy.net.cn/baseapi/utils"
"git.rosy.net.cn/jx-callback/business/jxutils"
"git.rosy.net.cn/jx-callback/business/jxutils/jxcontext"
"git.rosy.net.cn/jx-callback/business/model"
"git.rosy.net.cn/jx-callback/business/partner"
"git.rosy.net.cn/jx-callback/globals/api"
)
@@ -38,13 +41,31 @@ func (p *PurchaseHandler) GetOrder(vendorOrgCode, vendorOrderID string) (order *
return p.Map2Order(utils.Struct2FlatMap(resultOrders)), err
}
func (p *PurchaseHandler) GetOrderStatus(vendorOrgCode, vendorOrderID string) (status int, err error) {
return status, err
orderResult, err := api.JdShopAPI.AllOrders(&jdshopapi.AllOrdersParam{
OrderID: vendorOrderID,
Current: 1,
PageSize: 1,
})
return status2Jxstatus(orderResult.OrderList[0].OrderStatus), err
}
func (p *PurchaseHandler) AcceptOrRefuseOrder(order *model.GoodsOrder, isAcceptIt bool, userName string) (err error) {
return err
var status int
if isAcceptIt {
status = model.OrderStatusAccepted
} else {
status = model.OrderStatusCanceled
}
return ChangeOrderStatus(order.VendorOrderID, status, "")
}
func (p *PurchaseHandler) PickupGoods(order *model.GoodsOrder, isSelfDelivery bool, userName string) (err error) {
status, err := p.GetOrderStatus("", order.VendorOrderID2)
//说明此时该订单在平台上已经取消了
if status == model.OrderStatusApplyCancel {
err = ChangeOrderStatus(order.VendorOrderID, model.OrderStatusFinishedPickup, "自动拣货完成")
} else {
err = ChangeOrderStatus(order.VendorOrderID, model.OrderStatusCanceled, "订单状态发生了改变")
}
return err
}
@@ -97,6 +118,62 @@ func (p *PurchaseHandler) ConfirmReceivedReturnGoods(ctx *jxcontext.Context, ord
return err
}
func GetJdsOrder(ctx *jxcontext.Context, vendorOrderID string) {
func (p *PurchaseHandler) GetJdsOrders(ctx *jxcontext.Context, orderCreatedStart, orderCreatedEnd string, current, pageSize int) (orderResult *jdshopapi.AllOrdersResult, err error) {
orderResult, err = api.JdShopAPI.AllOrders(&jdshopapi.AllOrdersParam{
Current: current,
PageSize: pageSize,
OrderCreateDateRange: []string{orderCreatedStart, orderCreatedEnd},
})
return orderResult, err
}
func ChangeOrderStatus(vendorOrderID string, status int, remark string) (err error) {
orderStatus := &model.OrderStatus{
VendorOrderID: vendorOrderID,
VendorID: model.VendorIDJDShop,
OrderType: model.OrderTypeOrder,
RefVendorOrderID: vendorOrderID,
RefVendorID: model.VendorIDJDShop,
VendorStatus: utils.Int2Str(status),
Status: status,
StatusTime: time.Now(),
Remark: remark,
}
jxutils.CallMsgHandlerAsync(func() {
err = partner.CurOrderManager.OnOrderStatusChanged("", orderStatus)
}, jxutils.ComposeUniversalOrderID(vendorOrderID, model.VendorIDJDShop))
return err
}
func (p *PurchaseHandler) OrderExport(ctx *jxcontext.Context, vendorOrderID, vendorWaybillID string, isAuto bool) (err error) {
companyID := jdshopapi.JdsDeliveryCompany3rd
//表示是门店手动发京东
if !isAuto {
companyID = jdshopapi.JdsDeliveryCompanyJD
}
err = api.JdShopAPI.OrderShipment(utils.Str2Int64(vendorOrderID[:12]), companyID, vendorWaybillID)
return err
}
func (p *PurchaseHandler) OrderTransfer(ctx *jxcontext.Context, vendorOrderID, vendorWaybillID string, isAuto bool) (err error) {
companyID := jdshopapi.JdsDeliveryCompany3rd
//表示是门店手动发京东
if !isAuto {
companyID = jdshopapi.JdsDeliveryCompanyJD
}
err = api.JdShopAPI.UpdateWaybill(vendorOrderID[:12], companyID, vendorWaybillID)
return err
}
func status2Jxstatus(status int) (statusJx int) {
if status == jdshopapi.JdsOrderStatusWaittingPay {
statusJx = model.OrderStatusWait4Pay
} else if status == jdshopapi.JdsOrderStatusWaittingPayDel {
statusJx = model.OrderStatusApplyCancel
} else if status == jdshopapi.JdsOrderStatusWaittingExport {
statusJx = model.OrderStatusAccepted
} else if status == jdshopapi.JdsOrderStatusPause {
statusJx = model.OrderStatusNew
}
return statusJx
}

View File

@@ -76,20 +76,15 @@ func (p *PurchaseHandler) CreateStoreSkus(ctx *jxcontext.Context, storeID int, v
if img != "" {
suffix := img[strings.LastIndex(img, "."):]
if suffix != ".png" {
if resBinary, _, err := jxutils.DownloadFileByURL(img + model.SkuNameImgToPng); err == nil {
downloadURL, err2 := jxutils.UploadExportContent(resBinary, utils.Int64ToStr(time.Now().Unix()))
err = err2
imageURL, err = uploadImg(downloadURL, name, "tou")
if resBinary, _, _ := jxutils.DownloadFileByURL(img + model.SkuNameImgToPng); err == nil {
downloadURL, _ := jxutils.UploadExportContent(resBinary, utils.Int64ToStr(time.Now().Unix()))
imageURL, _ = uploadImg(downloadURL, name, "tou")
}
} else {
imageURL, err = uploadImg(img, name, "tou")
imageURL, _ = uploadImg(img, name, "tou")
}
}
err2 := api.JdShopAPI.TransparentImageAdd(createSkuResult.WareID, imageURL)
if err2 != nil {
failedList = putils.GetErrMsg2FailedSingleList(storeSkuList, err, storeID, model.VendorChineseNames[model.VendorIDJDShop], "创建商品")
return failedList, err
}
api.JdShopAPI.TransparentImageAdd(createSkuResult.WareID, imageURL)
}
var paramAttrs = make(map[string]*jdshopapi.CreateSkuParamSkus)
var resultAttrs = make(map[string]int64)
@@ -126,6 +121,7 @@ func (p *PurchaseHandler) UpdateStoreSkus(ctx *jxcontext.Context, storeID int, v
Title: name,
VenderID: jdshopapi.VenderID,
PromiseID: jdshopapi.JdsPromiseID,
ShopCategorys: []int{utils.Str2Int(v.VendorCatID)},
}
var desc string
if v.DescImg != "" {
@@ -157,7 +153,7 @@ func (p *PurchaseHandler) UpdateStoreSkus(ctx *jxcontext.Context, storeID int, v
},
&jdshopapi.CreateSkuParamFeatures{
Key: "tssp", //支持自提
Value: "4",
Value: "",
},
// &jdshopapi.CreateSkuParamFeatures{
// Key: "fdms", //分单?
@@ -248,6 +244,9 @@ func (p *PurchaseHandler) UpdateStoreSkusStatus(ctx *jxcontext.Context, vendorOr
stock = 9999
}
if storeID == model.JdShopMainStoreID {
if v.JdsStockSwitch == model.NO {
stock = 0
}
err = api.JdShopAPI.UpdateSkuStock(utils.Str2Int(v.VendorSkuID), stock)
} else {
storeSkus, err2 := dao.GetStoresSkusInfo(dao.GetDB(), []int{model.JdShopMainStoreID}, []int{v.SkuID})
@@ -309,6 +308,9 @@ func (p *PurchaseHandler) CreateStoreCategory(ctx *jxcontext.Context, storeID in
if status == -1 {
return fmt.Errorf("京东商城店内分类创建失败!")
}
if err != nil {
return err
}
time.Sleep(time.Second * 2)
// flag := false
// for {
@@ -323,6 +325,9 @@ func (p *PurchaseHandler) CreateStoreCategory(ctx *jxcontext.Context, storeID in
break
}
}
if storeCat.VendorCatID == "" {
return fmt.Errorf("京东商城店内分类创建可能失败了storeID: %v", storeID)
}
// if flag {
// break
// }
@@ -480,6 +485,10 @@ func buildCreateWareParam(storeSku *dao.StoreSkuSyncInfo) (createSkuParamWare *j
createSkuParamWare.PromiseID = jdshopapi.JdsPromiseID
}
if storeSku.VendorVendorCatID == jdshopapi.JdsBeefCatID {
createSkuParamWare.MultiCategoryID = jdshopapi.JdsBeefLastCatID
}
//上传京东图片
//规则,有两张就传两张,没有就重复传一张
pic1, err := uploadImg(storeSku.Img, name, "1")
@@ -527,6 +536,7 @@ func buildCreateWareParam(storeSku *dao.StoreSkuSyncInfo) (createSkuParamWare *j
gcjkValueID int64 //国产进口的id
lbValueID int64 //类别的ID
bcztValueID int64 //保存状态ID
rmsjValueID int64 //热卖时间ID
attrsProp []*jdshopapi.CreateSkuParamAttrs
)
attrs, err := api.JdShopAPI.FindAttrs(int(storeSku.VendorVendorCatID))
@@ -545,6 +555,8 @@ func buildCreateWareParam(storeSku *dao.StoreSkuSyncInfo) (createSkuParamWare *j
attrIDs[v.Name] = v.ID
} else if v.Name == "保存状态" {
attrIDs[v.Name] = v.ID
} else if v.Name == "热卖时间" {
attrIDs[v.Name] = v.ID
}
}
values, _, err := api.JdShopAPI.FindValuesByAttrId(attrIDs["贮存条件"])
@@ -581,6 +593,35 @@ func buildCreateWareParam(storeSku *dao.StoreSkuSyncInfo) (createSkuParamWare *j
}
attrsProp = append(attrsProp, attrbczt)
}
if attrIDs["热卖时间"] != 0 {
values2, _, err2 := api.JdShopAPI.FindValuesByAttrId(attrIDs["热卖时间"])
err = err2
for _, v := range values2 {
if v.Name == "12月" {
rmsjValueID = v.ID
}
}
attrrmsj := &jdshopapi.CreateSkuParamAttrs{
AttrID: utils.Int2Str(attrIDs["热卖时间"]),
AttrValues: []string{utils.Int64ToStr(rmsjValueID)},
}
attrsProp = append(attrsProp, attrrmsj)
}
if storeSku.VendorVendorCatID == jdshopapi.JdsBeefCatID {
var exValueID int64
values2, _, err2 := api.JdShopAPI.FindValuesByAttrId(150390)
err = err2
for _, v := range values2 {
if v.Name == "其它" {
exValueID = v.ID
}
}
attrex := &jdshopapi.CreateSkuParamAttrs{
AttrID: utils.Int2Str(150390),
AttrValues: []string{utils.Int64ToStr(exValueID)},
}
attrsProp = append(attrsProp, attrex)
}
attrZctj := &jdshopapi.CreateSkuParamAttrs{
AttrID: utils.Int2Str(attrIDs["贮存条件"]),
AttrValues: []string{utils.Int64ToStr(zctjValueID)},
@@ -604,7 +645,7 @@ func buildCreateWareParam(storeSku *dao.StoreSkuSyncInfo) (createSkuParamWare *j
},
&jdshopapi.CreateSkuParamFeatures{
Key: "tssp", //支持自提
Value: "4",
Value: "",
},
// &jdshopapi.CreateSkuParamFeatures{
// Key: "fdms", //分单?

View File

@@ -50,6 +50,7 @@ const (
cancelMatterOrderReason = "失败重发!"
splitMatterOrderMinWeight = 4500 //物料订单分包最少要4.5kg
jxwxfMatterEclpID = "EMG4418113943423" //京西五香粉物料编码
)
type JxSkuInfo struct {
@@ -876,6 +877,7 @@ func orderSolutionForWuLiao(order *model.GoodsOrder) (err error) {
goodsNos []string
prices []string
quantities []string
countSum int
)
for _, v := range orderSkus {
skus, err := dao.GetSkus(db, []int{v.SkuID}, nil, nil, nil, nil)
@@ -885,6 +887,28 @@ func orderSolutionForWuLiao(order *model.GoodsOrder) (err error) {
goodsNos = append(goodsNos, skus[0].EclpID)
prices = append(prices, "0")
quantities = append(quantities, utils.Int2Str(v.Count))
countSum += v.Count
}
//总订单不足3kg && 商品数量不足3个 && 五香粉有库存要送五香粉补足3个
stockResult, err := api.JdEclpAPI.QueryStock(jxwxfMatterEclpID)
if err == nil && len(stockResult) > 0 && stockResult[0].UsableNum > 0 {
if order.Weight < 3000 && countSum < 3 {
//要判断他本身买没买五香粉EMG4418113943423
var index = 9999
for k, v := range goodsNos {
if v == jxwxfMatterEclpID {
index = k
}
}
//说明他买了五香粉
if index != 9999 {
quantities[index] = utils.Int2Str(utils.Str2Int(quantities[index]) + 3 - countSum)
} else {
goodsNos = append(goodsNos, jxwxfMatterEclpID)
prices = append(prices, "0")
quantities = append(quantities, utils.Int2Str(3-countSum))
}
}
}
result, err := api.JdEclpAPI.AddOrder(&jdeclpapi.AddOrderParam{
IsvUUID: order.VendorOrderID,

View File

@@ -44,7 +44,7 @@ func formalizeTagList(mtwmTagList string) (outTagList string) {
}
func (c *PurchaseHandler) RefreshComment(fromTime, toTime time.Time) (err error) {
storeMapList, err2 := dao.GetStoresMapList(dao.GetDB(), []int{model.VendorIDMTWM}, nil, nil, model.StoreStatusAll, model.StoreIsSyncYes, "")
storeMapList, err2 := dao.GetStoresMapList(dao.GetDB(), []int{model.VendorIDMTWM}, nil, nil, model.StoreStatusAll, model.StoreIsSyncYes, "", "")
if err = err2; err != nil {
return err
}

View File

@@ -395,7 +395,7 @@ enableElmStoreWrite = false
enableMtwmStoreWrite = false
enableWscStoreWrite = false
enableYbStoreWrite = false
enableJdShopWrite = true
enableJdShopWrite = false
jdOrgCode = "320406"
jdLoginName = "jd_jxcs1223"

View File

@@ -3,6 +3,7 @@ package controllers
import (
"git.rosy.net.cn/baseapi/utils"
"git.rosy.net.cn/jx-callback/business/jxstore/cms"
"git.rosy.net.cn/jx-callback/business/jxstore/common"
"git.rosy.net.cn/jx-callback/business/jxstore/misc"
"git.rosy.net.cn/jx-callback/business/jxutils"
"git.rosy.net.cn/jx-callback/business/jxutils/netprinter"
@@ -546,7 +547,7 @@ func (c *StoreController) SyncStoresCourierInfo() {
// @router /GetStoreListByLocation [get]
func (c *StoreController) GetStoreListByLocation() {
c.callGetStoreListByLocation(func(params *tStoreGetStoreListByLocationParams) (retVal interface{}, errCode string, err error) {
retVal, err = cms.GetStoreListByLocation(params.Ctx, params.Lng, params.Lat, params.NeedWalkDistance)
retVal, err = common.GetStoreListByLocation(params.Ctx, params.Lng, params.Lat, 20000, params.NeedWalkDistance, false)
return retVal, "", err
})
}

View File

@@ -4,6 +4,8 @@ import (
"math"
"time"
"git.rosy.net.cn/jx-callback/business/model"
"git.rosy.net.cn/baseapi/platformapi/jdapi"
"git.rosy.net.cn/jx-callback/business/jxstore/cms"
@@ -214,6 +216,7 @@ func (c *StoreSkuController) SyncStoresSkus() {
// @Param payload formData string true "json数据StoreSkuBindInfo对象数组"
// @Param isScale formData bool false "是否按门店结算比例缩放"
// @Param causeFlag formData int false "操作类型"
// @Param isRefreshHigh formData bool false "是否只刷门店价高于给的价"
// @Param isContinueWhenError formData bool false "单个同步失败是否继续缺省false"
// @Param isAsync formData bool false "是否异步操作"
// @Success 200 {object} controllers.CallResult
@@ -226,7 +229,28 @@ func (c *StoreSkuController) UpdateStoresSkus() {
if err = jxutils.Strings2Objs(params.StoreIDs, &storeIDs, params.Payload, &skuBindInfos); err != nil {
return retVal, "", err
}
retVal, err = cms.UpdateStoresSkus(params.Ctx, params.CauseFlag, storeIDs, skuBindInfos, params.IsScale, params.IsAsync, params.IsContinueWhenError)
retVal, err = cms.UpdateStoresSkus(params.Ctx, params.CauseFlag, storeIDs, skuBindInfos, params.IsScale, params.IsRefreshHigh, params.IsAsync, params.IsContinueWhenError)
return retVal, "", err
})
}
// @Title 批量修改多商家商品绑定(不同步)
// @Description 批量修改多商家商品绑定(不同步)
// @Param token header string true "认证token"
// @Param storeIDs formData string false "门店ID列表"
// @Param payload formData string true "json数据StoreSkuBindInfo对象数组"
// @Param isRefreshHigh formData bool true "是否只刷门店价高于给的价"
// @Success 200 {object} controllers.CallResult
// @Failure 200 {object} controllers.CallResult
// @router /UpdateStoresSkusWithoutSync [put]
func (c *StoreSkuController) UpdateStoresSkusWithoutSync() {
c.callUpdateStoresSkusWithoutSync(func(params *tStoreSkuUpdateStoresSkusWithoutSyncParams) (retVal interface{}, errCode string, err error) {
var storeIDs []int
var skuBindInfos []*cms.StoreSkuBindInfo
if err = jxutils.Strings2Objs(params.StoreIDs, &storeIDs, params.Payload, &skuBindInfos); err != nil {
return retVal, "", err
}
err = cms.UpdateStoresSkusWithoutSync(params.Ctx, storeIDs, skuBindInfos, params.IsRefreshHigh)
return retVal, "", err
})
}
@@ -812,8 +836,8 @@ func (c *StoreSkuController) SyncMatterC4ToGy() {
})
}
// @Title 得到商家商品修改价格请求信息
// @Description 得到商家商品修改价格请求信息
// @Title 查询商品审核信息
// @Description 查询商品审核信息
// @Param token header string true "认证token"
// @Param applyTimeStart query string false "申请开始时间"
// @Param applyTimeEnd query string false "申请结束时间"
@@ -823,7 +847,11 @@ func (c *StoreSkuController) SyncMatterC4ToGy() {
// @Param remark query string false "不通过原因"
// @Param storeIDs query string false "门店ID列表"
// @Param nameIDs query string false "id列表对象当前指skuname id"
// @Param status query int false "审核状态"
// @Param statuss query string false "审核状态"
// @Param types query string false "改价类型1是普通改价2是关注"
// @Param keyword query string false "关键字"
// @Param marketManPhone query string false "市场负责人电话"
// @Param cityName query string false "城市名"
// @Param offset query int false "门店列表起始序号以0开始缺省为0"
// @Param pageSize query int false "门店列表页大小缺省为50-1表示全部"
// @Success 200 {object} controllers.CallResult
@@ -832,16 +860,33 @@ func (c *StoreSkuController) SyncMatterC4ToGy() {
func (c *StoreSkuController) GetStoreSkuAudit() {
c.callGetStoreSkuAudit(func(params *tStoreSkuGetStoreSkuAuditParams) (retVal interface{}, errCode string, err error) {
var (
timeList []time.Time
storeIDs, nameIDs []int
storeIDs, nameIDs, statuss, types []int
)
if timeList, err = jxutils.BatchStr2Time(params.ApplyTimeStart, params.ApplyTimeEnd, params.AuditTimeStart, params.AuditTimeEnd); err != nil {
if err = jxutils.Strings2Objs(params.StoreIDs, &storeIDs, params.NameIDs, &nameIDs, params.Statuss, &statuss, params.Types, &types); err != nil {
return retVal, "", err
}
if err = jxutils.Strings2Objs(params.StoreIDs, &storeIDs, params.NameIDs, &nameIDs); err != nil {
return retVal, "", err
}
retVal, err = cms.GetStoreSkuAudit(params.Ctx, storeIDs, nameIDs, nil, params.Status, params.Name, params.Remark, timeList[0], timeList[1], timeList[2], timeList[3], params.PageSize, params.Offset)
retVal, err = cms.GetStoreSkuAudit(params.Ctx, storeIDs, nameIDs, nil, statuss, types, params.Name, params.Remark, params.Keyword, params.MarketManPhone, params.CityName, params.ApplyTimeStart, params.ApplyTimeEnd, params.AuditTimeStart, params.AuditTimeEnd, params.PageSize, params.Offset)
return retVal, "", err
})
}
// @Title 审核商品
// @Description 审核商品
// @Param token header string true "认证token"
// @Param payload formData string true "json数据storeskuaudit对象"
// @Param status formData int false "审核标志1通过-1 不通过"
// @Param isAsync formData bool false "是否异步,缺省是同步"
// @Param isContinueWhenError formData bool false "单个同步失败是否继续缺省false"
// @Success 200 {object} controllers.CallResult
// @Failure 200 {object} controllers.CallResult
// @router /StoreSkuPriceAudit [post]
func (c *StoreSkuController) StoreSkuPriceAudit() {
c.callStoreSkuPriceAudit(func(params *tStoreSkuStoreSkuPriceAuditParams) (retVal interface{}, errCode string, err error) {
var storeSkuAudits []*model.StoreSkuAudit
if err = jxutils.Strings2Objs(params.Payload, &storeSkuAudits); err != nil {
return retVal, "", err
}
retVal, err = cms.StoreSkuPriceAudit(params.Ctx, storeSkuAudits, params.Status, params.IsAsync, params.IsContinueWhenError)
return retVal, "", err
})
}

View File

@@ -1059,3 +1059,32 @@ func (c *OrderController) GetOrderUserBuyFirst() {
return retVal, "", err
})
}
// @Title 京东商城订单转移
// @Description 京东商城订单转移
// @Param token header string true "认证token"
// @Param storeID formData int true "转移的门店ID"
// @Param vendorOrderID formData string true "转移的订单号"
// @Success 200 {object} controllers.CallResult
// @Failure 200 {object} controllers.CallResult
// @router /TransferJdsOrder [post]
func (c *OrderController) TransferJdsOrder() {
c.callTransferJdsOrder(func(params *tOrderTransferJdsOrderParams) (retVal interface{}, errCode string, err error) {
retVal, err = orderman.TransferJdsOrder(params.Ctx, params.VendorOrderID, params.StoreID)
return retVal, "", err
})
}
// @Title 京东商城订单发送京东物流
// @Description 京东商城订单发送京东物流
// @Param token header string true "认证token"
// @Param vendorOrderID formData string true "订单号"
// @Success 200 {object} controllers.CallResult
// @Failure 200 {object} controllers.CallResult
// @router /SendJdwlForJdsOrder [post]
func (c *OrderController) SendJdwlForJdsOrder() {
c.callSendJdwlForJdsOrder(func(params *tOrderSendJdwlForJdsOrderParams) (retVal interface{}, errCode string, err error) {
err = orderman.SendJdwlForJdsOrder(params.Ctx, params.VendorOrderID)
return retVal, "", err
})
}

View File

@@ -400,3 +400,17 @@ func (c *TempOpController) UploadJdsImage() {
return retVal, "", err
})
}
// @Title 京西刷新调价包和门店价格
// @Description 京西刷新调价包和门店价格
// @Param token header string true "认证token"
// @Param storeID formData int false "门店ID"
// @Success 200 {object} controllers.CallResult
// @Failure 200 {object} controllers.CallResult
// @router /RefreshJXPriceChange [post]
func (c *TempOpController) RefreshJXPriceChange() {
c.callRefreshJXPriceChange(func(params *tTempopRefreshJXPriceChangeParams) (retVal interface{}, errCode string, err error) {
retVal, err = tempop.RefreshJXPriceChange(params.Ctx, params.StoreID)
return retVal, "", err
})
}

View File

@@ -1,7 +1,6 @@
---
- hosts: "{{ deploy_hosts }}"
remote_user: ubuntu
become: True
tasks:
- name: copy shell
copy:

View File

@@ -1242,6 +1242,15 @@ func init() {
Filters: nil,
Params: nil})
beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:OrderController"] = append(beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:OrderController"],
beego.ControllerComments{
Method: "SendJdwlForJdsOrder",
Router: `/SendJdwlForJdsOrder`,
AllowHTTPMethods: []string{"post"},
MethodParams: param.Make(),
Filters: nil,
Params: nil})
beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:OrderController"] = append(beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:OrderController"],
beego.ControllerComments{
Method: "SetOrderPrintStatus",
@@ -1251,6 +1260,15 @@ func init() {
Filters: nil,
Params: nil})
beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:OrderController"] = append(beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:OrderController"],
beego.ControllerComments{
Method: "TransferJdsOrder",
Router: `/TransferJdsOrder`,
AllowHTTPMethods: []string{"post"},
MethodParams: param.Make(),
Filters: nil,
Params: nil})
beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:OrderController"] = append(beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:OrderController"],
beego.ControllerComments{
Method: "UpdateOrderWaybillTip",
@@ -2097,6 +2115,15 @@ func init() {
Filters: nil,
Params: nil})
beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:StoreSkuController"] = append(beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:StoreSkuController"],
beego.ControllerComments{
Method: "StoreSkuPriceAudit",
Router: `/StoreSkuPriceAudit`,
AllowHTTPMethods: []string{"post"},
MethodParams: param.Make(),
Filters: nil,
Params: nil})
beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:StoreSkuController"] = append(beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:StoreSkuController"],
beego.ControllerComments{
Method: "SyncJdStoreProducts",
@@ -2178,6 +2205,15 @@ func init() {
Filters: nil,
Params: nil})
beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:StoreSkuController"] = append(beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:StoreSkuController"],
beego.ControllerComments{
Method: "UpdateStoresSkusWithoutSync",
Router: `/UpdateStoresSkusWithoutSync`,
AllowHTTPMethods: []string{"put"},
MethodParams: param.Make(),
Filters: nil,
Params: nil})
beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:SyncController"] = append(beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:SyncController"],
beego.ControllerComments{
Method: "AddCreateFlagForJxStoreSku",
@@ -2439,6 +2475,15 @@ func init() {
Filters: nil,
Params: nil})
beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:TempOpController"] = append(beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:TempOpController"],
beego.ControllerComments{
Method: "RefreshJXPriceChange",
Router: `/RefreshJXPriceChange`,
AllowHTTPMethods: []string{"post"},
MethodParams: param.Make(),
Filters: nil,
Params: nil})
beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:TempOpController"] = append(beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:TempOpController"],
beego.ControllerComments{
Method: "RefreshMtpsWaybillFee",