This commit is contained in:
苏尹岚
2021-02-19 16:50:40 +08:00
parent ea374f228a
commit 1b3bcb8b6a
17 changed files with 191 additions and 48 deletions

View File

@@ -342,16 +342,18 @@ func (c *OrderManager) SaveOrder(order *model.GoodsOrder, isAdjust bool, db *dao
baseapi.SugarLogger.Infof("saveOrder duplicated orderid:%s msg received", order.VendorOrderID)
}
}
//修改商品库存
if err == nil {
err = ModifyOrderSkusStock(db, order, false)
}
} else {
globals.SugarLogger.Warnf("saveOrder create order:%v, error:%v", order, err)
}
if err == nil {
dao.Commit(db)
}
//修改商品库存
if err == nil {
utils.CallFuncAsync(func() {
err = ModifyOrderSkusStock(db, order, false)
})
}
return isDuplicated, err
}

View File

@@ -332,6 +332,29 @@ func (c *OrderManager) ExportOrders(ctx *jxcontext.Context, fromDateStr, toDateS
func(task *tasksch.SeqTask, step int, params ...interface{}) (result interface{}, err error) {
switch step {
case 0:
//权限
if permission.IsRoled(ctx) {
if storeIDsMap, err := permission.GetUserStoresResultMap(ctx.GetUserID()); err == nil {
var storeIDs2 []int
if mapParams["storeIDs"] != nil {
var storeIDs []int
if err = utils.UnmarshalUseNumber([]byte(mapParams["storeIDs"].(string)), &storeIDs); err == nil {
for _, v := range storeIDs {
if storeIDsMap[v] != 0 {
storeIDs2 = append(storeIDs2, v)
}
}
}
} else {
for k, _ := range storeIDsMap {
storeIDs2 = append(storeIDs2, k)
}
}
if data, err := json.Marshal(storeIDs2); err == nil {
mapParams["storeIDs"] = string(data)
}
}
}
orders, _, err = dao.GetOrders(dao.GetDB(), nil, true, true, fromDateStr, toDateStr, true, nil, false, "", mapParams, 0, model.UnlimitedPageSize)
globals.SugarLogger.Debugf("orders:%d, er:%v", len(orders), err)
case 1:

View File

@@ -143,7 +143,7 @@ func (c *BaseScheduler) CancelOrder(ctx *jxcontext.Context, order *model.GoodsOr
if globals.IsAddEvent {
err = cms.AddEventDetail(dao.GetDB(), ctx, model.OperateUpdate, order.StoreID, model.ThingTypeOrder, order.StoreID, order.VendorOrderID, order.StoreName)
}
err = partner.GetPurchaseOrderHandlerFromVendorID(order.VendorID).CancelOrder(ctx, order, reason)
err = partner.GetPurchaseOrderHandlerFromVendorID(order.VendorID).CancelOrder(ctx, order, reason+","+ctx.GetUserName())
}
return err
}

View File

@@ -853,7 +853,10 @@ func (s *DefScheduler) createWaybillOn3rdProviders(savedOrderInfo *WatchOrderInf
}
}
}
//TODO 2021-02-19 增加品牌配送开关
if storeDetail.BrandIsOpen == model.YES {
err = fmt.Errorf("此品牌已关闭配送! [%v]", storeDetail.BrandName)
}
if err == nil {
if _, err = s.CreateWaybillOnProviders4SavedOrder(jxcontext.AdminCtx, savedOrderInfo, nil, excludeVendorIDs, false, maxDeliveryFee); err == nil {
savedOrderInfo.retryCount++

View File

@@ -2696,6 +2696,7 @@ func UpdateSkuExinfoMap(ctx *jxcontext.Context, nameIDs []int, imgWaterMark stri
VendorID: vendorID,
BeginAt: fromTimeP,
EndAt: toTimeP,
BrandID: brandID,
}
dao.WrapAddIDCULDEntity(skuEx, ctx.GetUserName())
if imgWaterMark != "" {
@@ -2729,7 +2730,15 @@ func UpdateSkuExinfoMap(ctx *jxcontext.Context, nameIDs []int, imgWaterMark stri
OnUpdateThing(ctx, db, nil, int64(v), model.ThingTypeSku)
}
} else {
SetStoreSkuSyncStatus2(db, nil, []int{vendorID}, skuIDs, model.SyncFlagModifiedMask)
var storeIDs []int
if brandID != 0 {
if stores, _ := dao.GetStoreList(db, nil, nil, nil, []int{brandID}, nil, ""); len(stores) > 0 {
for _, v := range stores {
storeIDs = append(storeIDs, v.ID)
}
}
}
SetStoreSkuSyncStatus2(db, storeIDs, []int{vendorID}, skuIDs, model.SyncFlagModifiedMask)
}
}
}

View File

@@ -1101,6 +1101,13 @@ func CreateStore(ctx *jxcontext.Context, storeExt *StoreExt, userName string) (i
}
storeExt.LinkStoreID = realLinkStoreID
if storeExt.MarketManName == "" {
storeExt.MarketManName = ctx.GetUserName()
}
if storeExt.MarketManPhone == "" {
storeExt.MarketManPhone, _ = ctx.GetMobileAndUserID()
}
existingID := store.ID
store.Lng = jxutils.StandardCoordinate2Int(storeExt.FloatLng)
store.Lat = jxutils.StandardCoordinate2Int(storeExt.FloatLat)
@@ -3331,6 +3338,19 @@ func CopyStoreCategories(ctx *jxcontext.Context, fromStoreID int, toStoreIDs, ca
var (
db = dao.GetDB()
)
//权限
if permission.IsRoled(ctx) {
if storeIDsMap, err := permission.GetUserStoresResultMap(ctx.GetUserID()); err == nil {
if storeIDsMap[fromStoreID] == 0 {
return "", fmt.Errorf("抱歉,您无权更改他人店铺分类 [%v]", fromStoreID)
}
for _, v := range toStoreIDs {
if storeIDsMap[v] == 0 {
return "", fmt.Errorf("抱歉,您无权更改他人店铺分类 [%v]", v)
}
}
}
}
storeCatList, err := dao.GetStoreCategoryMap(db, -1, 0, fromStoreID, 0)
if err != nil {
return "", err
@@ -3733,6 +3753,8 @@ func StoreAudit(ctx *jxcontext.Context, storeAudits []*model.StoreAudit, status
storeExt.FloatLng = jxutils.IntCoordinate2Standard(utils.Float64TwoInt(storeExt.FloatLng))
storeExt.FloatLat = jxutils.IntCoordinate2Standard(utils.Float64TwoInt(storeExt.FloatLat))
storeExt.Status = model.StoreStatusDisabled
storeExt.MarketManName = ctx.GetUserName()
storeExt.MarketManPhone, _ = ctx.GetMobileAndUserID()
storeID, err := CreateStore(ctx, storeExt, ctx.GetUserName())
if err != nil {
return retVal, fmt.Errorf(err.Error())

View File

@@ -487,23 +487,29 @@ func getGetStoresSkusBaseSQL(db *dao.DaoDB, storeIDs, skuIDs []int, isFocus bool
}
func GetStoresSkus(ctx *jxcontext.Context, storeIDs, skuIDs []int, isFocus, isHighPrice bool, priceType int, keyword string, isBySku, isAct bool, params map[string]interface{}, offset, pageSize int) (skuNamesInfo *dao.StoreSkuNamesInfo, err error) {
return GetStoresSkusNew(ctx, storeIDs, skuIDs, isFocus, isHighPrice, priceType, keyword, isBySku, isAct, params, offset, pageSize)
}
func GetStoresSkusNew(ctx *jxcontext.Context, storeIDs, skuIDs []int, isFocus, isHighPrice bool, priceType int, keyword string, isBySku, isAct bool, params map[string]interface{}, offset, pageSize int) (skuNamesInfo *dao.StoreSkuNamesInfo, err error) {
//权限
if permission.IsRoled(ctx) {
if storeIDsMap, err := permission.GetUserStoresResultMap(ctx.GetUserID()); err == nil {
var storeIDs2 []int
if len(storeIDs) > 0 {
for _, v := range storeIDs {
if storeIDsMap[v] != 0 {
storeIDs2 = append(storeIDs2, v)
}
}
} else {
for k, _ := range storeIDsMap {
storeIDs2 = append(storeIDs2, k)
}
}
storeIDs = nil
storeIDs = storeIDs2
}
}
return GetStoresSkusNew(ctx, storeIDs, skuIDs, isFocus, isHighPrice, priceType, keyword, isBySku, isAct, params, offset, pageSize)
}
func GetStoresSkusNew(ctx *jxcontext.Context, storeIDs, skuIDs []int, isFocus, isHighPrice bool, priceType int, keyword string, isBySku, isAct bool, params map[string]interface{}, offset, pageSize int) (skuNamesInfo *dao.StoreSkuNamesInfo, err error) {
if !isFocus && !isBySku && (len(storeIDs) > 1 || len(storeIDs) == 0) {
return nil, fmt.Errorf("未关注按SkuName只能查询单店")
}
@@ -1631,6 +1637,19 @@ func CopyStoreSkus(ctx *jxcontext.Context, fromStoreID int, toStoreIDs []int, co
if copyMode != CopyStoreSkuModeFresh && copyMode != CopyStoreSkuModeUpdate && copyMode != CopyStoreSkuModeUpdatePrice {
return 0, fmt.Errorf("不支持的拷贝模式:%s", copyMode)
}
//权限
if permission.IsRoled(ctx) {
if storeIDsMap, err := permission.GetUserStoresResultMap(ctx.GetUserID()); err == nil {
if storeIDsMap[fromStoreID] == 0 {
return 0, fmt.Errorf("抱歉,您无权更改他人店铺商品 [%v]", fromStoreID)
}
for _, v := range toStoreIDs {
if storeIDsMap[v] == 0 {
return 0, fmt.Errorf("抱歉,您无权更改他人店铺商品 [%v]", v)
}
}
}
}
db := dao.GetDB()
fromStore, err := checkStoreExisting(db, fromStoreID)
if err != nil {
@@ -3715,7 +3734,13 @@ func UpdateStoreSkusSpecTagBin(ctx *jxcontext.Context, reader io.Reader, vendorI
results[i] = results[len(results)-i-1]
results[len(results)-i-1] = tmp
}
//权限
if permission.IsRoled(ctx) {
if storeIDsMap, err := permission.GetUserStoresResultMap(ctx.GetUserID()); err == nil {
for _, v := range results {
if storeIDsMap[v.StoreID] == 0 {
continue
}
store, err := dao.GetStoreDetail(db, v.StoreID, model.VendorIDMTWM, "")
if err != nil || store == nil {
continue
@@ -3736,6 +3761,8 @@ func UpdateStoreSkusSpecTagBin(ctx *jxcontext.Context, reader io.Reader, vendorI
}
}
}
}
}
return result, err
}
taskSeq := tasksch.NewSeqTask2("修改平台力荐商品", ctx, isContinueWhenError, taskSeqFunc, 2)

View File

@@ -10,6 +10,7 @@ import (
"git.rosy.net.cn/baseapi/platformapi/mtpsapi"
"git.rosy.net.cn/jx-callback/business/jxstore/permission"
"git.rosy.net.cn/jx-callback/business/partner/putils"
"git.rosy.net.cn/jx-callback/globals/api"
@@ -521,6 +522,25 @@ func (v *VendorSync) SyncStoresSkus(ctx *jxcontext.Context, parentTask tasksch.I
if isForce {
setSyncStatus = model.SyncFlagStoreSkuModifiedMask
}
//权限
if permission.IsRoled(ctx) {
if storeIDsMap, err := permission.GetUserStoresResultMap(ctx.GetUserID()); err == nil {
var storeIDs2 []int
if len(storeIDs) > 0 {
for _, v := range storeIDs {
if storeIDsMap[v] != 0 {
storeIDs2 = append(storeIDs2, v)
}
}
} else {
for k, _ := range storeIDsMap {
storeIDs2 = append(storeIDs2, k)
}
}
storeIDs = nil
storeIDs = storeIDs2
}
}
return v.SyncStoresSkus2(ctx, parentTask, causeFlag, db, vendorIDs, storeIDs, true, skuIDs, nil, setSyncStatus, isAsync, isContinueWhenError)
}

View File

@@ -158,7 +158,7 @@ func SyncSkus(ctx *jxcontext.Context, parentTask tasksch.ITask, vendorIDs []int,
if skuVendorInfo.SkuVendorMapCatID != "" {
skuVendorInfo.VendorVendorCatID = utils.Str2Int64(skuVendorInfo.SkuVendorMapCatID)
}
skuVendorInfo.SkuName = jxutils.ComposeSkuNameSync(skuVendorInfo.Prefix, skuVendorInfo.Name, skuVendorInfo.Comment, skuVendorInfo.Unit, skuVendorInfo.SpecQuality, skuVendorInfo.SpecUnit, 0, skuVendorInfo.ExPrefix, skuVendorInfo.ExPrefixBegin, skuVendorInfo.ExPrefixEnd)
skuVendorInfo.SkuName = jxutils.ComposeSkuNameSync(skuVendorInfo.Prefix, skuVendorInfo.Name, skuVendorInfo.Comment, skuVendorInfo.Unit, skuVendorInfo.SpecQuality, skuVendorInfo.SpecUnit, 0, skuVendorInfo.ExPrefix, skuVendorInfo.ExPrefixBegin, skuVendorInfo.ExPrefixEnd, true)
skuVendorInfo.SkuNameOrigin = jxutils.ComposeSkuNameOriginal(skuVendorInfo.Prefix, skuVendorInfo.Name, skuVendorInfo.Comment, skuVendorInfo.Unit, skuVendorInfo.SpecQuality, skuVendorInfo.SpecUnit, 0)
if skuVendorInfo.ImgWatermark != "" {
downLoad, _ := uploadImgStandard(skuVendorInfo.ImgWatermark)

View File

@@ -299,9 +299,9 @@ func formalizeStoreSkuList(inSkuList []*dao.StoreSkuSyncInfo) []*dao.StoreSkuSyn
skuItem.MergedStatus = jxutils.MergeSkuStatus(jxutils.MergeSkuStatus(skuItem.NameStatus, skuItem.Status), skuItem.StoreSkuStatus)
//美团的商品名字非标品中间不能有 ‘约’
if skuItem.VendorID == model.VendorIDMTWM {
skuItem.SkuName = jxutils.ComposeSkuNameSync2(skuItem.Prefix, skuItem.Name, skuItem.Comment, skuItem.Unit, skuItem.SpecQuality, skuItem.SpecUnit, 0, skuItem.ExPrefix, skuItem.ExPrefixBegin, skuItem.ExPrefixEnd)
skuItem.SkuName = jxutils.ComposeSkuNameSync2(skuItem.Prefix, skuItem.Name, skuItem.Comment, skuItem.Unit, skuItem.SpecQuality, skuItem.SpecUnit, 0, skuItem.ExPrefix, skuItem.ExPrefixBegin, skuItem.ExPrefixEnd, skuItem.BrandID == skuItem.ExBrandID)
} else {
skuItem.SkuName = jxutils.ComposeSkuNameSync(skuItem.Prefix, skuItem.Name, skuItem.Comment, skuItem.Unit, skuItem.SpecQuality, skuItem.SpecUnit, 0, skuItem.ExPrefix, skuItem.ExPrefixBegin, skuItem.ExPrefixEnd)
skuItem.SkuName = jxutils.ComposeSkuNameSync(skuItem.Prefix, skuItem.Name, skuItem.Comment, skuItem.Unit, skuItem.SpecQuality, skuItem.SpecUnit, 0, skuItem.ExPrefix, skuItem.ExPrefixBegin, skuItem.ExPrefixEnd, skuItem.BrandID == skuItem.ExBrandID)
}
skuItem.SkuNameOrigin = jxutils.ComposeSkuNameOriginal(skuItem.Prefix, skuItem.Name, skuItem.Comment, skuItem.Unit, skuItem.SpecQuality, skuItem.SpecUnit, 0)
// if skuItem.ImgWatermark != "" && model.IsSyncStatusUpdate(skuItem.SkuSyncStatus) && skuItem.VendorID != model.VendorIDJD {

View File

@@ -432,11 +432,13 @@ func ComposeSkuName(prefix, name, comment, unit string, spec_quality float32, sp
return skuName
}
func ComposeSkuNameSync(prefix, name, comment, unit string, spec_quality float32, spec_unit string, maxLen int, exPrefix string, exPrefixBegin, exPrefixEnd *time.Time) (skuName string) {
func ComposeSkuNameSync(prefix, name, comment, unit string, spec_quality float32, spec_unit string, maxLen int, exPrefix string, exPrefixBegin, exPrefixEnd *time.Time, isEx bool) (skuName string) {
if exPrefix != "" && exPrefixBegin != nil && exPrefixEnd != nil {
if utils.Time2Date(time.Now().Add(6*time.Hour)).Sub(*exPrefixBegin) >= 0 && utils.Time2Date(time.Now()).Sub(*exPrefixEnd) <= 0 {
if isEx {
skuName = exPrefix
}
}
if utils.Time2Date(time.Now().Add(6*time.Hour)).Sub(*exPrefixEnd) > 0 {
skuName = ""
}
@@ -445,11 +447,13 @@ func ComposeSkuNameSync(prefix, name, comment, unit string, spec_quality float32
return skuName
}
func ComposeSkuNameSync2(prefix, name, comment, unit string, spec_quality float32, spec_unit string, maxLen int, exPrefix string, exPrefixBegin, exPrefixEnd *time.Time) (skuName string) {
func ComposeSkuNameSync2(prefix, name, comment, unit string, spec_quality float32, spec_unit string, maxLen int, exPrefix string, exPrefixBegin, exPrefixEnd *time.Time, isEx bool) (skuName string) {
if exPrefix != "" && exPrefixBegin != nil && exPrefixEnd != nil {
if utils.Time2Date(time.Now().Add(6*time.Hour)).Sub(*exPrefixBegin) >= 0 && utils.Time2Date(time.Now()).Sub(*exPrefixEnd) <= 0 {
if isEx {
skuName = exPrefix
}
}
if utils.Time2Date(time.Now().Add(6*time.Hour)).Sub(*exPrefixEnd) > 0 {
skuName = ""
}

View File

@@ -10,6 +10,7 @@ import (
"git.rosy.net.cn/jx-callback/business/auth2/authprovider/weixin"
"git.rosy.net.cn/jx-callback/business/authz/autils"
"git.rosy.net.cn/jx-callback/business/jxstore/permission"
"git.rosy.net.cn/jx-callback/business/jxutils/jxcontext"
"git.rosy.net.cn/jx-callback/business/jxutils/netprinter"
"git.rosy.net.cn/jx-callback/business/jxutils/tasksch"
@@ -764,6 +765,25 @@ func NotifyStoreAlertMessage(storeID int, storeName, title, content string) (err
func SendStoreMessage(ctx *jxcontext.Context, title, content string, storeIDs []int, isAsync, isContinueWhenError bool) (hint string, err error) {
db := dao.GetDB()
//权限
if permission.IsRoled(ctx) {
if storeIDsMap, err := permission.GetUserStoresResultMap(ctx.GetUserID()); err == nil {
var storeIDs2 []int
if len(storeIDs) > 0 {
for _, v := range storeIDs {
if storeIDsMap[v] != 0 {
storeIDs2 = append(storeIDs2, v)
}
}
} else {
for k, _ := range storeIDsMap {
storeIDs2 = append(storeIDs2, k)
}
}
storeIDs = nil
storeIDs = storeIDs2
}
}
dao.Begin(db)
defer func() {
if r := recover(); r != nil {

View File

@@ -61,6 +61,10 @@ type StoreDetail struct {
MtwmToken string `json:"mtwmToken"`
EbaiSupplierID string `json:"ebaiSupplierID"`
BrandName string `json:"brandName"` //品牌信息
BrandLogo string `json:"brandLogo"`
BrandIsOpen int `json:"brandIsOpen"`
}
// 带快递门店信息的
@@ -117,7 +121,10 @@ func getStoreDetail(db *DaoDB, storeID, vendorID int, vendorStoreID, vendorOrgCo
IF(mm.name <> '', mm.name, mm.user_id2) market_man_name,
IF(om.name <> '', om.name, om.user_id2) operator_name,
IF(om2.name <> '', om2.name, om2.user_id2) operator_name2,
IF(om3.name <> '', om3.name, om3.user_id2) operator_name3
IF(om3.name <> '', om3.name, om3.user_id2) operator_name3,
b.name brand_name,
b.logo brand_logo,
b.is_open brand_is_open
FROM store t1
LEFT JOIN store_map t2 ON t1.id = t2.store_id AND t2.vendor_id = ? AND t2.deleted_at = ?
LEFT JOIN place city ON city.code = t1.city_code
@@ -129,6 +136,7 @@ func getStoreDetail(db *DaoDB, storeID, vendorID int, vendorStoreID, vendorOrgCo
LEFT JOIN user om ON om.mobile <> '' AND om.mobile = t1.operator_phone
LEFT JOIN user om2 ON om2.mobile <> '' AND om2.mobile = t1.operator_phone2
LEFT JOIN user om3 ON om3.mobile <> '' AND om3.mobile = t1.operator_phone3
LEFT JOIN brand b ON b.id = t1.brand_id AND b.deleted_at = ?
WHERE t1.deleted_at = ?
`
sqlParams := []interface{}{
@@ -139,6 +147,7 @@ func getStoreDetail(db *DaoDB, storeID, vendorID int, vendorStoreID, vendorOrgCo
model.ConfigTypeFreightPack,
utils.DefaultTimeValue,
utils.DefaultTimeValue,
utils.DefaultTimeValue,
}
// if vendorID != model.VendorIDJX {
// sql += " AND t2.id IS NOT NULL"

View File

@@ -81,6 +81,8 @@ type StoreSkuSyncInfo struct {
model.Sku
ExdSkuID string `orm:"column(exd_sku_id)"`
ExdCategoryThirdID int `orm:"column(exd_category_third_id)"`
BrandID int `orm:"column(brand_id)"`
ExBrandID int `orm:"column(ex_brand_id)"`
StoreName string
// sku_name
@@ -459,7 +461,8 @@ func GetStoreSkus2(db *DaoDB, vendorID, storeID int, skuIDs []int, mustDirty boo
t4.%s_category_id vendor_vendor_cat_id,
t4.name category_name,
ts.name store_name,
tsu.ex_prefix, tsu.begin_at ex_prefix_begin, tsu.end_at ex_prefix_end, tsu.img_watermark, tsu.img_watermark_mix img_mix,
ts.brand_id,
tsu.ex_prefix, tsu.begin_at ex_prefix_begin, tsu.end_at ex_prefix_end, tsu.img_watermark, tsu.img_watermark_mix img_mix, tsu.brand_id ex_brand_id,
tsu1.vendor_category_id sku_vendor_map_cat_id`
fmtParams := []interface{}{
skuVendorIDField, fieldPrefix, fieldPrefix, fieldPrefix,

View File

@@ -306,6 +306,7 @@ type SkuExinfoMap struct {
ExPrefix string `orm:"size(255)" json:"exPrefix"` //额外前缀
ImgWatermark string `orm:"size(512)" json:"imgWatermark"` //图片水印
ImgWatermarkMix string `orm:"size(512)" json:"imgWatermark"` //合成水印图
BrandID int `orm:"column(brand_id);default(0)" json:"brandID"` //品牌ID
}
func (*SkuExinfoMap) TableIndex() [][]string {

View File

@@ -397,7 +397,7 @@ func (p *PurchaseHandler) UpdateStoreSkusStock(ctx *jxcontext.Context, vendorOrg
func genSkuParamsFromStoreSkuInfo2(storeSku *dao.StoreSkuSyncInfo, isCreate, isExd bool) (params map[string]interface{}) {
var img string
if storeSku.ImgMix != "" {
if storeSku.ImgMix != "" && storeSku.BrandID == storeSku.ExBrandID {
img = storeSku.ImgMix
} else {
img = storeSku.Img

View File

@@ -289,7 +289,7 @@ func (p *PurchaseHandler) createOrUpdateStoreSkus(ctx *jxcontext.Context, storeI
if img2 == "" {
img2 = storeSku.Img
}
if storeSku.ImgMix != "" {
if storeSku.ImgMix != "" && storeSku.BrandID == storeSku.ExBrandID {
foodData["picture"] = strings.Join(jxutils.BatchString2Slice(storeSku.ImgMix, img2, storeSku.ImgMix, storeSku.ImgMix, storeSku.ImgMix), ",")
} else {
foodData["picture"] = strings.Join(jxutils.BatchString2Slice(storeSku.Img, img2, storeSku.Img, storeSku.Img, storeSku.Img), ",")