Merge remote-tracking branch 'origin/mark' into yonghui

This commit is contained in:
苏尹岚
2019-12-16 11:03:10 +08:00
10 changed files with 178 additions and 40 deletions

View File

@@ -1043,6 +1043,7 @@ func AddStoreVendorMap(ctx *jxcontext.Context, db *dao.DaoDB, vendorID int, vend
userName := ctx.GetUserName()
storeMap.StoreID = storeID
storeMap.VendorID = vendorID
storeMap.VendorOrgCode = vendorOrgCode
storeMap.Status = model.StoreStatusOpened
storeMap.DeliveryType = model.StoreDeliveryTypeByStore
storeMap.SyncStatus = 0

View File

@@ -355,14 +355,18 @@ func syncStoreSkuNew(ctx *jxcontext.Context, parentTask tasksch.ITask, isFull bo
} else if model.IsSyncStatusNew(sku.SkuSyncStatus) {
calVendorPrice4StoreSku(sku, storeDetail.PricePercentagePackObj, int(storeDetail.PricePercentage))
if singleStoreHandler == nil {
sku.SkuSyncStatus |= model.SyncFlagSaleMask | model.SyncFlagPriceMask
bareSku = storeSkuSyncInfo2Bare(sku)
stockList = append(stockList, bareSku)
priceList = append(priceList, bareSku)
if sku.MergedStatus == model.SkuStatusNormal {
onlineList = append(onlineList, bareSku)
if dao.IsVendorThingIDEmpty(sku.VendorSkuID) {
// todo 多平台商品库没有正常创建,直接跳过
} else {
offlineList = append(offlineList, bareSku)
sku.SkuSyncStatus |= model.SyncFlagSaleMask | model.SyncFlagPriceMask
bareSku = storeSkuSyncInfo2Bare(sku)
stockList = append(stockList, bareSku)
priceList = append(priceList, bareSku)
if sku.MergedStatus == model.SkuStatusNormal {
onlineList = append(onlineList, bareSku)
} else {
offlineList = append(offlineList, bareSku)
}
}
} else {
if sku.MergedStatus == model.SkuStatusNormal {

View File

@@ -409,8 +409,29 @@ func SplitSkuName(skuName string) (prefix, name, comment, specUnit, unit string,
return prefix, name, comment, specUnit, unit, specQuality
}
// https://my.oschina.net/hyller/blog/700414
func CalUpcCheckSum(upc12 int64) (checkSum int) {
var sum [2]int
for i := 0; i < 12; i++ {
base := int64(math.Pow10(i))
sum[i%2] += int((upc12 / base) % 10)
}
sum[0] *= 3
return (10 - (sum[0]+sum[1])%10) % 10
}
func IsUpcValid(upc string) bool {
if len(upc) != 13 {
return false
}
upcInt := utils.Str2Int64WithDefault(upc, 0)
checkSum := CalUpcCheckSum(upcInt / 10)
return int(utils.Str2Int64(upc[12:])) == checkSum
}
func GenFakeUPC(skuID int) string {
return fmt.Sprintf("%013d", int64(skuID)+6666000000000)
id := int64(skuID) + 666600000000
return fmt.Sprintf("%012d%d", id, CalUpcCheckSum(id))
}
func MakeValidationMapFromSlice(validValues []string, flag int) map[string]int {

View File

@@ -288,11 +288,11 @@ func TestGetOneEmailFromStr(t *testing.T) {
func TestGenFakeUPC(t *testing.T) {
for _, v := range [][]string{
[]string{
"6666000000123",
"123",
"6666000298034",
"29803",
},
[]string{
"6666007654321",
"6666076543212",
"7654321",
},
} {
@@ -300,4 +300,10 @@ func TestGenFakeUPC(t *testing.T) {
t.Errorf("%s failed, result:%s, expect:%s", v[1], str, v[0])
}
}
if !IsUpcValid("6666076543212") {
t.Fatal("wrong1")
}
if IsUpcValid("6666076543210") {
t.Fatal("wrong2")
}
}

View File

@@ -179,6 +179,9 @@ func SetSkuSyncStatus(db *DaoDB, vendorID int, skuIDs []int, syncStatus int) (nu
return ExecuteSQL(db, sql, sqlParams...)
}
// todo, GetSkuCategoryWithVendor与GetSkusWithVendor
// 如果mustDirty为true应该是要thing_map为基表LEFT JOIN原始实体表否则当原始实体记录在未同步前被物理删除后无法真正同步
// 多门店平台使用,当前只有京东
func GetSkuCategoryWithVendor(db *DaoDB, vendorIDs []int, appOrgCodes []string, parentCatID int, catIDs []int, mustDirty bool) (catList []*SkuStoreCatInfo, err error) {
sql := `

View File

@@ -351,7 +351,7 @@ func newGetStoreSkus2(db *DaoDB, vendorID, storeID int, skuIDs []int, mustDirty
} else {
sql += `
LEFT JOIN sku_category t5sku ON t5sku.id = t2.category_id
LEFT JOIN thing_map t2m ON t2m.thing_id = t1.sku_id AND t2m.vendor_org_code = t14.vendor_org_code AND t2m.thing_type = ? AND t2m.vendor_id = ? AND t2m.deleted_at = ?
JOIN thing_map t2m ON t2m.thing_id = t1.sku_id AND t2m.vendor_org_code = t14.vendor_org_code AND t2m.thing_type = ? AND t2m.vendor_id = ? AND t2m.deleted_at = ?
LEFT JOIN thing_map t4m ON t4m.thing_id = t3.category_id AND t4m.vendor_org_code = t14.vendor_org_code AND t4m.thing_type = ? AND t4m.vendor_id = ? AND t4m.deleted_at = ?
LEFT JOIN thing_map t5skum ON t5skum.thing_id = t5sku.id AND t5skum.vendor_org_code = t14.vendor_org_code AND t5skum.thing_type = ? AND t5skum.vendor_id = ? AND t5skum.deleted_at = ?
`
@@ -504,8 +504,11 @@ func GetFullStoreSkus(db *DaoDB, vendorID, storeID int) (skus []*StoreSkuSyncInf
func newGetFullStoreSkus(db *DaoDB, vendorID, storeID int) (skus []*StoreSkuSyncInfo, err error) {
globals.SugarLogger.Debugf("GetFullStoreSkus, storeID:%d, vendorID:%d", storeID, vendorID)
// 对于多门店平台商品库删除后不需要操作门店商品所以sku_name用JOIN, sku与sku_name也可以直接排除下架的
sql := `
SELECT t1.id bind_id, t1.price, t1.unit_price, t1.status store_sku_status,
SELECT
sm.vendor_id, sm.vendor_org_code,
t1.id bind_id, t1.price, t1.unit_price, t1.status store_sku_status,
t1.%s_sync_status sku_sync_status, t1.store_id, t1.deleted_at bind_deleted_at,
t2.*, t2.id sku_id, t2m.vendor_thing_id vendor_sku_id,
t3.id name_id, t3.prefix, t3.name, t3.unit, t3.upc,
@@ -516,12 +519,12 @@ func newGetFullStoreSkus(db *DaoDB, vendorID, storeID int) (skus []*StoreSkuSync
t4m.sync_status cat_sync_status, t4m.vendor_thing_id vendor_cat_id,
t5skum.sync_status sku_cat_sync_status, t5skum.vendor_thing_id sku_vendor_cat_id
FROM sku t2
LEFT JOIN store_sku_bind t1 ON t1.sku_id = t2.id AND t1.store_id = ? AND t1.deleted_at = ?
LEFT JOIN store_map sm ON sm.store_id = t1.store_id AND sm.vendor_id = ? AND sm.deleted_at = ?
LEFT JOIN thing_map t2m ON t2m.thing_id = t2.id AND t2m.vendor_org_code = sm.vendor_org_code AND t2m.thing_type = ? AND t2m.vendor_id = ? AND t2m.deleted_at = ?
JOIN sku_name t3 ON t2.name_id = t3.id AND t3.deleted_at = ? AND t3.status = ?
JOIN sku_category t4 ON t3.category_id = t4.id AND t4.deleted_at = ?
LEFT JOIN thing_map t4m ON t4m.thing_id = t3.category_id AND t4m.vendor_org_code = sm.vendor_org_code AND t4m.thing_type = ? AND t4m.vendor_id = ? AND t4m.deleted_at = ?
JOIN store_map sm ON sm.vendor_id = ? AND sm.store_id = ? AND sm.deleted_at = ?
JOIN thing_map t2m ON t2m.thing_id = t2.id AND t2m.vendor_org_code = sm.vendor_org_code AND t2m.thing_type = ? AND t2m.vendor_id = ? AND t2m.deleted_at = ?
JOIN thing_map t4m ON t4m.thing_id = t3.category_id AND t4m.vendor_org_code = sm.vendor_org_code AND t4m.thing_type = ? AND t4m.vendor_id = ? AND t4m.deleted_at = ?
LEFT JOIN store_sku_bind t1 ON sm.store_id = t1.store_id AND t1.sku_id = t2.id AND t1.deleted_at = ?
LEFT JOIN sku_category t5sku ON t2.category_id = t5sku.id
LEFT JOIN thing_map t5skum ON t5skum.thing_id = t2.category_id AND t5skum.vendor_org_code = sm.vendor_org_code AND t5skum.thing_type = ? AND t5skum.vendor_id = ? AND t5skum.deleted_at = ?
LEFT JOIN data_resource t11 ON t11.main_url = t3.img
@@ -530,17 +533,14 @@ func newGetFullStoreSkus(db *DaoDB, vendorID, storeID int) (skus []*StoreSkuSync
WHERE t2.deleted_at = ? AND t2.status = ? AND t2m.vendor_thing_id <> ''
ORDER BY t1.price DESC`
sqlParams := []interface{}{
storeID,
utils.DefaultTimeValue, model.SkuStatusNormal,
utils.DefaultTimeValue,
vendorID, utils.DefaultTimeValue,
vendorID, storeID, utils.DefaultTimeValue,
model.ThingTypeSku, vendorID, utils.DefaultTimeValue,
utils.DefaultTimeValue,
model.SkuStatusNormal,
utils.DefaultTimeValue,
model.ThingTypeCategory, vendorID, utils.DefaultTimeValue,
model.ThingTypeCategory, vendorID, utils.DefaultTimeValue,
utils.DefaultTimeValue,
model.SkuStatusNormal,
model.ThingTypeCategory, vendorID, utils.DefaultTimeValue,
utils.DefaultTimeValue, model.SkuStatusNormal,
}
fieldPrefix := ConvertDBFieldPrefix(model.VendorNames[vendorID])
sql = fmt.Sprintf(sql,

View File

@@ -42,6 +42,9 @@ func AppKey2OrgCode(appKey string) (vendorOrgCode string) {
break
}
}
if vendorOrgCode == "" {
globals.SugarLogger.Warnf("AppKey2OrgCode appKey:%s get empty vendorOrgCode", appKey)
}
return vendorOrgCode
}

View File

@@ -284,12 +284,14 @@ func (c *PurchaseHandler) callbackMsg2Status(msg *jdapi.CallbackOrderMsg) *model
return orderStatus
}
func (c *PurchaseHandler) postFakeMsg(vendorOrderID, vendorStatus string) {
func (c *PurchaseHandler) postFakeMsg(vendorOrgCode, vendorOrderID, vendorStatus string) {
msg := &jdapi.CallbackOrderMsg{
CallbackMsg: &jdapi.CallbackMsg{},
BillID: vendorOrderID,
StatusID: vendorStatus,
Timestamp: utils.Time2Str(time.Now()),
CallbackMsg: &jdapi.CallbackMsg{
AppKey: getAPI(vendorOrgCode).GetAppKey(),
},
BillID: vendorOrderID,
StatusID: vendorStatus,
Timestamp: utils.Time2Str(time.Now()),
}
utils.CallFuncAsync(func() {
OnOrderMsg(msg)
@@ -309,14 +311,14 @@ func (c *PurchaseHandler) AcceptOrRefuseOrder(order *model.GoodsOrder, isAcceptI
if globals.EnableJdStoreWrite {
err = getAPI(order.VendorOrgCode).OrderAcceptOperate(order.VendorOrderID, isAcceptIt, userName)
if isAcceptIt && err == nil {
c.postFakeMsg(order.VendorOrderID, jdapi.StatusIDWaitOutStore)
c.postFakeMsg(order.VendorOrgCode, order.VendorOrderID, jdapi.StatusIDWaitOutStore)
}
} else {
if isAcceptIt {
c.postFakeMsg(order.VendorOrderID, jdapi.StatusIDWaitOutStore)
c.postFakeMsg(order.VendorOrgCode, order.VendorOrderID, jdapi.StatusIDWaitOutStore)
} else {
c.postFakeMsg(order.VendorOrderID, jdapi.OrderStatusCanceled)
c.postFakeMsg(order.VendorOrgCode, order.VendorOrderID, jdapi.OrderStatusCanceled)
}
}
return err
@@ -327,7 +329,7 @@ func (c *PurchaseHandler) PickupGoods(order *model.GoodsOrder, isSelfDelivery bo
if !isSelfDelivery && globals.EnableJdStoreWrite {
_, err = getAPI(order.VendorOrgCode).OrderJDZBDelivery(order.VendorOrderID, userName)
} else {
c.postFakeMsg(order.VendorOrderID, jdapi.OrderStatusFinishedPickup)
c.postFakeMsg(order.VendorOrgCode, order.VendorOrderID, jdapi.OrderStatusFinishedPickup)
}
return err
}

View File

@@ -167,13 +167,13 @@ func skuInfo2Param(ctx *jxcontext.Context, sku *dao.StoreSkuSyncInfo) (param *jd
Upc: sku.Upc,
Images: jxutils.BatchString2Slice(sku.Img, sku.Img2),
}
// 不为份的SKU如果没有设置upc自动生成一个假的
if sku.Unit != model.SpecialUnit && param.Upc == "" {
param.Upc = jxutils.GenFakeUPC(sku.SkuID)
}
if param.CategoryID == 0 {
param.CategoryID = int64(getDefJdCategoryID())
}
// 京东强制要求upc的商品如果没有设置upc自动生成一个假的
if param.Upc == "" && isSkuMustHaveUpc(sku.Unit, param.CategoryID) {
param.Upc = jxutils.GenFakeUPC(sku.SkuID)
}
if sku.IsGlobal == 0 && len(sku.SellCities) > 0 {
param.SellCities = utils.StringSlice2Int64(sku.SellCities)
}
@@ -362,3 +362,101 @@ func jxStatus2jdStatus(jxStatus int) (jdStatus int) {
}
return jdStatus
}
func isSkuMustHaveUpc(unit string, vendorVendorCatID int64) bool {
return unit != model.SpecialUnit || !upcLessMap[vendorVendorCatID]
}
var (
upcLessMap = map[int64]bool{
20250: true,
20252: true,
20258: true,
20259: true,
20261: true,
20262: true,
20263: true,
20264: true,
20265: true,
20266: true,
20267: true,
22822: true,
20269: true,
20270: true,
20271: true,
20272: true,
20273: true,
20275: true,
20276: true,
20277: true,
20278: true,
20279: true,
20281: true,
20282: true,
20283: true,
20285: true,
20286: true,
20287: true,
22821: true,
20289: true,
20290: true,
23018: true,
20354: true,
20355: true,
20357: true,
20359: true,
23019: true,
20294: true,
20295: true,
20296: true,
20297: true,
20298: true,
20299: true,
20300: true,
20302: true,
20303: true,
20304: true,
22840: true,
22841: true,
20317: true,
20320: true,
20321: true,
20323: true,
20325: true,
20326: true,
20328: true,
20329: true,
20331: true,
20335: true,
20337: true,
20338: true,
20339: true,
22842: true,
22843: true,
23020: true,
20309: true,
20310: true,
20311: true,
20312: true,
20313: true,
20314: true,
20315: true,
22410: true,
23050: true,
20319: true,
20322: true,
20330: true,
20332: true,
20334: true,
20336: true,
20340: true,
20342: true,
23049: true,
20356: true,
20358: true,
20360: true,
20361: true,
20362: true,
20364: true,
}
)

View File

@@ -9,8 +9,8 @@
owner: ubuntu
group: ubuntu
mode: 0777
- name: cleanup previous backup files
shell: cd {{ deploy_dir }} && ./cleanup.sh
# - name: cleanup previous backup files
# shell: cd {{ deploy_dir }} && ./cleanup.sh
- name: copy execute file to dest
copy:
src: ../jx-callback
@@ -18,7 +18,7 @@
owner: ubuntu
group: ubuntu
mode: 0755
backup: yes
backup: no
- name: copy conf file to dest
copy:
src: ../conf/