Merge remote-tracking branch 'origin/mark' into yonghui
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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")
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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 := `
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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,
|
||||
}
|
||||
)
|
||||
|
||||
@@ -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/
|
||||
|
||||
Reference in New Issue
Block a user