From 8f382e4dec6de6bbddbccb9826a297352a4fbc46 Mon Sep 17 00:00:00 2001 From: gazebo Date: Wed, 19 Jun 2019 18:07:06 +0800 Subject: [PATCH 01/26] =?UTF-8?q?-=20GoodsOrder.TotalShopMoney=E7=9A=84jso?= =?UTF-8?q?n=E4=BF=AE=E6=AD=A3=E4=B8=BAtotalShopMoney?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- business/model/order.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/business/model/order.go b/business/model/order.go index bbde7a557..58b85dde2 100644 --- a/business/model/order.go +++ b/business/model/order.go @@ -20,7 +20,7 @@ type GoodsOrder struct { VendorPrice int64 `json:"vendorPrice"` // 平台价 SalePrice int64 `json:"salePrice"` // 售卖价 ActualPayPrice int64 `json:"actualPayPrice"` // 单位为分 顾客实际支付 - TotalShopMoney int64 `json:"shopMoney"` // 应结金额-第三方平台结算给京西的金额(包括了所有的补贴,扣除) + TotalShopMoney int64 `json:"totalShopMoney"` // 应结金额-第三方平台结算给京西的金额(包括了所有的补贴,扣除) PmSubsidyMoney int64 `json:"pmSubsidyMoney"` // 平台活动补贴(订单主体活动补贴+订单单条sku补贴)1+ Weight int `json:"weight"` // 单位为克 ConsigneeName string `orm:"size(32)" json:"consigneeName"` From 9360f11da948435476f12420ff94d3ad06b1c092 Mon Sep 17 00:00:00 2001 From: gazebo Date: Wed, 19 Jun 2019 22:11:54 +0800 Subject: [PATCH 02/26] =?UTF-8?q?-=20=E4=BF=AE=E6=94=B9=E8=AE=A2=E5=8D=95?= =?UTF-8?q?=E4=B8=AD=E5=AE=9E=E6=97=B6=E8=AE=A1=E7=AE=97=E7=9A=84earningPr?= =?UTF-8?q?ice=E7=AE=97=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- business/jxcallback/orderman/orderman_ext.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/business/jxcallback/orderman/orderman_ext.go b/business/jxcallback/orderman/orderman_ext.go index 8eca3932f..cc9ca007d 100644 --- a/business/jxcallback/orderman/orderman_ext.go +++ b/business/jxcallback/orderman/orderman_ext.go @@ -283,7 +283,7 @@ func (c *OrderManager) getOrders(ctx *jxcontext.Context, isIncludeSku bool, from } sql := ` SELECT SQL_CALC_FOUND_ROWS t1.*, - CAST(IF(t1.shop_price <= t1.vendor_price, IF(t1.shop_price = 0, t1.sale_price, t1.shop_price), IF(t1.vendor_price = 0, t1.sale_price, t1.vendor_price))*IF(t5.pay_percentage IS NULL OR t5.pay_percentage <= 0, 70, t5.pay_percentage)/100 AS SIGNED) earning_price, + CAST(IF(t1.shop_price <> 0 && t1.shop_price < t1.sale_price, t1.shop_price, t1.sale_price) * IF(t5.pay_percentage > 0, t5.pay_percentage, 70) / 100 AS SIGNED) earning_price, t2.status waybill_status, t2.courier_name, t2.courier_mobile, t2.actual_fee, t2.desired_fee, t2.waybill_created_at, t2.waybill_finished_at` if isIncludeSku { @@ -783,7 +783,7 @@ func (c *OrderManager) GetStoresOrderSaleInfo(ctx *jxcontext.Context, storeIDLis sql := ` SELECT IF(t1.jx_store_id > 0, t1.jx_store_id, t1.store_id) store_id, t1.vendor_id, IF(t1.status < ?, 0, t1.status) status, COUNT(*) count, SUM(t1.shop_price) shop_price, SUM(t1.vendor_price) vendor_price, SUM(t1.sale_price) sale_price, SUM(t1.actual_pay_price) actual_pay_price, - CAST(SUM(IF(t1.shop_price <= t1.vendor_price, IF(t1.shop_price = 0, t1.sale_price, t1.shop_price), IF(t1.vendor_price = 0, t1.sale_price, t1.vendor_price))*IF(t5.pay_percentage IS NULL OR t5.pay_percentage <= 0, 70, t5.pay_percentage)/100) AS SIGNED) earning_price + CAST(SUM(IF(t1.shop_price <> 0 && t1.shop_price < t1.sale_price, t1.shop_price, t1.sale_price) * IF(t5.pay_percentage > 0, t5.pay_percentage, 70) / 100) AS SIGNED) earning_price FROM goods_order t1 LEFT JOIN store t5 ON t5.id = IF(t1.jx_store_id <> 0, t1.jx_store_id, t1.store_id) WHERE t1.order_created_at >= ? AND t1.order_created_at <= ? From 7a4eb0cce36d4b29b59d3084a94606c804dce644 Mon Sep 17 00:00:00 2001 From: gazebo Date: Wed, 19 Jun 2019 22:45:14 +0800 Subject: [PATCH 03/26] =?UTF-8?q?+=20GoodsOrder=E6=B7=BB=E5=8A=A0EarningPr?= =?UTF-8?q?ice=E8=A1=A8=E7=A4=BA=E7=BB=93=E7=AE=97=E7=BB=99=E9=97=A8?= =?UTF-8?q?=E5=BA=97=E7=9A=84=E9=87=91=E9=A2=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- business/jxcallback/orderman/order.go | 33 +++++++++++++++----- business/jxcallback/orderman/orderman_ext.go | 4 +-- business/model/const.go | 4 +++ business/model/order.go | 1 + 4 files changed, 32 insertions(+), 10 deletions(-) diff --git a/business/jxcallback/orderman/order.go b/business/jxcallback/orderman/order.go index fb9a9a441..7e7c7faa8 100644 --- a/business/jxcallback/orderman/order.go +++ b/business/jxcallback/orderman/order.go @@ -349,22 +349,39 @@ func (c *OrderManager) updateOrderSkuOtherInfo(order *model.GoodsOrder, db *dao. func (c *OrderManager) updateOrderOtherInfo(order *model.GoodsOrder, db *dao.DaoDB) (err error) { globals.SugarLogger.Debugf("updateOrderOtherInfo orderID:%s, VendorStoreID:%s", order.VendorOrderID, order.VendorStoreID) - storeMap := &model.StoreMap{ - VendorID: order.VendorID, - VendorStoreID: order.VendorStoreID, - } - storeMap.DeletedAt = utils.DefaultTimeValue - if err = dao.GetEntity(db, storeMap, model.FieldVendorID, model.FieldVendorStoreID, model.FieldDeletedAt); err != nil && err != orm.ErrNoRows { - globals.SugarLogger.Warnf("updateOrderOtherInfo GetEntity orderID:%s, VendorStoreID:%s, error:%v", order.VendorOrderID, order.VendorStoreID, err) + storeDetail, err := dao.GetStoreDetailByVendorStoreID(db, order.VendorStoreID, order.VendorID) + if err != nil { + globals.SugarLogger.Warnf("updateOrderOtherInfo GetStoreDetailByVendorStoreID orderID:%s, VendorStoreID:%s, error:%v", order.VendorOrderID, order.VendorStoreID, err) return err } - order.JxStoreID = storeMap.StoreID + order.JxStoreID = storeDetail.Store.ID if err = c.updateOrderSkuOtherInfo(order, db); err == nil { jxutils.RefreshOrderSkuRelated(order) + + caculateOrderEarningPrice(order, storeDetail.PayPercentage) } return err } +// 计算结算给门店的金额 +func caculateOrderEarningPrice(order *model.GoodsOrder, storePayPercentage int) { + order.EarningPrice = 0 + for _, v := range order.Skus { + skuEarningPrice := v.EarningPrice + if skuEarningPrice == 0 { + basePrice := v.SalePrice + if v.ShopPrice > 0 && v.ShopPrice < basePrice { + basePrice = v.ShopPrice + } + if storePayPercentage <= 0 { + storePayPercentage = model.DefaultEarningPricePercentage + } + skuEarningPrice = basePrice * int64(storePayPercentage) / 100 + } + order.EarningPrice += skuEarningPrice + } +} + func (c *OrderManager) addOrderStatus(orderStatus *model.OrderStatus, db *dao.DaoDB) (isDuplicated bool, order *model.GoodsOrder, err error) { globals.SugarLogger.Debugf("addOrderStatus refOrderID:%s, orderID:%s", orderStatus.RefVendorOrderID, orderStatus.VendorOrderID) if db == nil { diff --git a/business/jxcallback/orderman/orderman_ext.go b/business/jxcallback/orderman/orderman_ext.go index cc9ca007d..078dadfbc 100644 --- a/business/jxcallback/orderman/orderman_ext.go +++ b/business/jxcallback/orderman/orderman_ext.go @@ -283,7 +283,7 @@ func (c *OrderManager) getOrders(ctx *jxcontext.Context, isIncludeSku bool, from } sql := ` SELECT SQL_CALC_FOUND_ROWS t1.*, - CAST(IF(t1.shop_price <> 0 && t1.shop_price < t1.sale_price, t1.shop_price, t1.sale_price) * IF(t5.pay_percentage > 0, t5.pay_percentage, 70) / 100 AS SIGNED) earning_price, + CAST(IF(t1.earning_price <> 0, t1.earning_price, IF(t1.shop_price <> 0 && t1.shop_price < t1.sale_price, t1.shop_price, t1.sale_price) * IF(t5.pay_percentage > 0, t5.pay_percentage, 70) / 100) AS SIGNED) earning_price, t2.status waybill_status, t2.courier_name, t2.courier_mobile, t2.actual_fee, t2.desired_fee, t2.waybill_created_at, t2.waybill_finished_at` if isIncludeSku { @@ -783,7 +783,7 @@ func (c *OrderManager) GetStoresOrderSaleInfo(ctx *jxcontext.Context, storeIDLis sql := ` SELECT IF(t1.jx_store_id > 0, t1.jx_store_id, t1.store_id) store_id, t1.vendor_id, IF(t1.status < ?, 0, t1.status) status, COUNT(*) count, SUM(t1.shop_price) shop_price, SUM(t1.vendor_price) vendor_price, SUM(t1.sale_price) sale_price, SUM(t1.actual_pay_price) actual_pay_price, - CAST(SUM(IF(t1.shop_price <> 0 && t1.shop_price < t1.sale_price, t1.shop_price, t1.sale_price) * IF(t5.pay_percentage > 0, t5.pay_percentage, 70) / 100) AS SIGNED) earning_price + CAST(SUM(IF(t1.earning_price <> 0, t1.earning_price, IF(t1.shop_price <> 0 && t1.shop_price < t1.sale_price, t1.shop_price, t1.sale_price) * IF(t5.pay_percentage > 0, t5.pay_percentage, 70) / 100)) AS SIGNED) earning_price FROM goods_order t1 LEFT JOIN store t5 ON t5.id = IF(t1.jx_store_id <> 0, t1.jx_store_id, t1.store_id) WHERE t1.order_created_at >= ? AND t1.order_created_at <= ? diff --git a/business/model/const.go b/business/model/const.go index b46de96e6..1b7da9b68 100644 --- a/business/model/const.go +++ b/business/model/const.go @@ -406,3 +406,7 @@ func WaybillVendorID2Mask(vendorID int) (mask int8) { func IsAfsOrderFinalStatus(status int) bool { return status >= AfsOrderStatusFinished && status <= AfsOrderStatusFailed } + +const ( + DefaultEarningPricePercentage = 70 // 门店缺省结算百分比 +) diff --git a/business/model/order.go b/business/model/order.go index 58b85dde2..61c119200 100644 --- a/business/model/order.go +++ b/business/model/order.go @@ -22,6 +22,7 @@ type GoodsOrder struct { ActualPayPrice int64 `json:"actualPayPrice"` // 单位为分 顾客实际支付 TotalShopMoney int64 `json:"totalShopMoney"` // 应结金额-第三方平台结算给京西的金额(包括了所有的补贴,扣除) PmSubsidyMoney int64 `json:"pmSubsidyMoney"` // 平台活动补贴(订单主体活动补贴+订单单条sku补贴)1+ + EarningPrice int64 `json:"earningPrice"` // 结算给门店老板的钱(未扣除可能的三方配送费) Weight int `json:"weight"` // 单位为克 ConsigneeName string `orm:"size(32)" json:"consigneeName"` ConsigneeMobile string `orm:"size(32)" json:"consigneeMobile"` From faca22c9935d50e70414fac67b108d32075d6876 Mon Sep 17 00:00:00 2001 From: gazebo Date: Thu, 20 Jun 2019 09:41:00 +0800 Subject: [PATCH 04/26] =?UTF-8?q?-=20=E5=8F=96=E6=B6=88=E6=B4=BB=E5=8A=A8?= =?UTF-8?q?=E6=97=B6=E9=80=BB=E8=BE=91=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- business/jxstore/promotion/jd_promotion.go | 27 +++++++++++++--------- 1 file changed, 16 insertions(+), 11 deletions(-) diff --git a/business/jxstore/promotion/jd_promotion.go b/business/jxstore/promotion/jd_promotion.go index 2b78d6fda..3910a50b2 100644 --- a/business/jxstore/promotion/jd_promotion.go +++ b/business/jxstore/promotion/jd_promotion.go @@ -653,20 +653,25 @@ func CancelJdPromotion(ctx *jxcontext.Context, promotionID int) (err error) { if err = dao.GetEntity(db, promotion); err != nil { return err } - if promotion.Status != model.PromotionStatusRemoteCreated { - return errors.New("当前状态不能进行取消操作") + if promotion.Status != model.PromotionStatusCanceled { + return errors.New("当前状态已经是取消") } - promotionHandler := getPromotionHander(promotion.Type) - if promotionHandler == nil { - return errors.New("非法的活动类型") - } - if err = promotionHandler.CancelPromotion(utils.Str2Int64(promotion.VendorPromotionID), ""); err == nil { - if _, err = dao.UpdateEntityLogically(db, promotion, map[string]interface{}{ - "Status": model.PromotionStatusCanceled, - }, ctx.GetUserName(), nil); err == nil { - RefreshJdPromotionLockStatus(ctx, promotionID) + if promotion.Status == model.PromotionStatusRemoteCreated { + if promotion.VendorPromotionID != "" { + promotionHandler := getPromotionHander(promotion.Type) + if promotionHandler == nil { + return errors.New("非法的活动类型") + } + if err = promotionHandler.CancelPromotion(utils.Str2Int64(promotion.VendorPromotionID), ""); err != nil { + return err + } } } + if _, err = dao.UpdateEntityLogically(db, promotion, map[string]interface{}{ + "Status": model.PromotionStatusCanceled, + }, ctx.GetUserName(), nil); err == nil { + // RefreshJdPromotionLockStatus(ctx, promotionID) + } return err } From 8a707df7730bb3ce8ed27eb0ed69a69e17164775 Mon Sep 17 00:00:00 2001 From: gazebo Date: Thu, 20 Jun 2019 10:05:35 +0800 Subject: [PATCH 05/26] =?UTF-8?q?-=20GetOrderSkuInfo=E8=BF=94=E5=9B=9EReal?= =?UTF-8?q?EarningPrice=E4=BB=A3=E8=A1=A8=E5=8D=95=E5=93=81=E5=AE=9E?= =?UTF-8?q?=E9=99=85=E7=BB=93=E7=BB=99=E5=95=86=E5=AE=B6=E7=9A=84=E9=92=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- business/jxcallback/orderman/order.go | 9 +- business/jxcallback/orderman/orderman_ext.go | 150 ++++++++----------- business/jxutils/jxutils_cms.go | 12 ++ business/model/api.go | 5 +- 4 files changed, 77 insertions(+), 99 deletions(-) diff --git a/business/jxcallback/orderman/order.go b/business/jxcallback/orderman/order.go index 7e7c7faa8..9ef9aa13a 100644 --- a/business/jxcallback/orderman/order.go +++ b/business/jxcallback/orderman/order.go @@ -369,14 +369,7 @@ func caculateOrderEarningPrice(order *model.GoodsOrder, storePayPercentage int) for _, v := range order.Skus { skuEarningPrice := v.EarningPrice if skuEarningPrice == 0 { - basePrice := v.SalePrice - if v.ShopPrice > 0 && v.ShopPrice < basePrice { - basePrice = v.ShopPrice - } - if storePayPercentage <= 0 { - storePayPercentage = model.DefaultEarningPricePercentage - } - skuEarningPrice = basePrice * int64(storePayPercentage) / 100 + skuEarningPrice = jxutils.CaculateSkuEarningPrice(v.ShopPrice, v.SalePrice, storePayPercentage) } order.EarningPrice += skuEarningPrice } diff --git a/business/jxcallback/orderman/orderman_ext.go b/business/jxcallback/orderman/orderman_ext.go index 078dadfbc..b8f8caaee 100644 --- a/business/jxcallback/orderman/orderman_ext.go +++ b/business/jxcallback/orderman/orderman_ext.go @@ -74,94 +74,66 @@ func (c *OrderManager) GetOrderSkuInfo(ctx *jxcontext.Context, vendorOrderID str if vendorID == model.VendorIDJD { fullSkuNameSQL = "CONCAT(t1.sku_name, IF(t3.is_spu = 1 AND LOCATE(';', t1.sku_name) = 0, CONCAT('[约', t2.spec_quality, t2.spec_unit, '/', t3.unit, ']'), ''))" } + sql := fmt.Sprintf(` + SELECT + t1.id, + t1.vendor_order_id, + t1.vendor_id, + t1.count, + t1.vendor_sku_id, + t1.sku_id, + t1.jx_sku_id, + t1.sku_name, + IF(t1.shop_price = 0, t1.sale_price, t1.shop_price) shop_price, + t1.sale_price, + t1.earning_price, + CAST(IF(t1.earning_price <> 0, t1.earning_price, IF(t1.shop_price <> 0 && t1.shop_price < t1.sale_price, t1.shop_price, t1.sale_price) * IF(t5.pay_percentage > 0, t5.pay_percentage, %d) / 100) AS SIGNED) real_earning_price, + t1.weight, + t1.sku_type, + t1.promotion_type, + t1.order_created_at, + t1.store_sub_id, + t1.store_sub_name, + t1.vendor_price, + %s full_sku_name, + `, model.DefaultEarningPricePercentage, fullSkuNameSQL) db := dao.GetDB() if vendorID == model.VendorIDELM { - err = dao.GetRows(db, &skus, fmt.Sprintf(` - SELECT - t1.id, - t1.vendor_order_id, - t1.vendor_id, - t1.count, - t1.vendor_sku_id, - t1.sku_id, - t1.jx_sku_id, - t1.sku_name, - IF(t1.shop_price = 0, t1.sale_price, t1.shop_price) shop_price, - t1.sale_price, - t1.earning_price, - t1.weight, - t1.sku_type, - t1.promotion_type, - t1.order_created_at, - t1.store_sub_id, - t1.store_sub_name, - t1.vendor_price, - IF(t3.img IS NULL OR t3.img = '', t4.col_imageUrl, t3.img) image, %s full_sku_name - FROM order_sku t1 - LEFT JOIN sku t2 ON IF(t1.jx_sku_id != 0, t1.jx_sku_id, t1.sku_id) = t2.id/* AND t2.deleted_at = ?*/ - LEFT JOIN sku_name t3 ON t2.name_id = t3.id/* AND t3.deleted_at = ?*/ - LEFT JOIN ede_skus t4 ON t1.vendor_sku_id = t4.col_id - WHERE vendor_order_id = ? AND vendor_id = ? - ORDER BY t1.sku_name - `, fullSkuNameSQL), /*, utils.DefaultTimeValue, utils.DefaultTimeValue*/ vendorOrderID, vendorID) + err = dao.GetRows(db, &skus, sql+` + IF(t3.img <> '', t3.img, t4.col_imageUrl) image + FROM order_sku t1 + LEFT JOIN goods_order t6 ON t6.vendor_order_id = t1.vendor_order_id AND t6.vendor_id = t1.vendor_id + LEFT JOIN store t5 ON t5.id = IF(t6.jx_store_id <> 0, t6.jx_store_id, t6.store_id) + LEFT JOIN sku t2 ON IF(t1.jx_sku_id != 0, t1.jx_sku_id, t1.sku_id) = t2.id/* AND t2.deleted_at = ?*/ + LEFT JOIN sku_name t3 ON t2.name_id = t3.id/* AND t3.deleted_at = ?*/ + LEFT JOIN ede_skus t4 ON t1.vendor_sku_id = t4.col_id + WHERE t1.vendor_order_id = ? AND t1.vendor_id = ? + ORDER BY t1.sku_name + `, /*, utils.DefaultTimeValue, utils.DefaultTimeValue*/ vendorOrderID, vendorID) } else if vendorID == model.VendorIDJD { - err = dao.GetRows(db, &skus, fmt.Sprintf(` - SELECT - t1.id, - t1.vendor_order_id, - t1.vendor_id, - t1.count, - t1.vendor_sku_id, - t1.sku_id, - t1.jx_sku_id, - t1.sku_name, - IF(t1.shop_price = 0, t1.sale_price, t1.shop_price) shop_price, - t1.sale_price, - t1.earning_price, - t1.weight, - t1.sku_type, - t1.promotion_type, - t1.order_created_at, - t1.store_sub_id, - t1.store_sub_name, - t1.vendor_price, - IF(t3.img IS NULL OR t3.img = '', t4.image, t3.img) image, %s full_sku_name - FROM order_sku t1 - LEFT JOIN sku t2 ON IF(t1.jx_sku_id != 0, t1.jx_sku_id, t1.sku_id) = t2.id/* AND t2.deleted_at = ?*/ - LEFT JOIN sku_name t3 ON t2.name_id = t3.id/* AND t3.deleted_at = ?*/ - LEFT JOIN jde_sku_infos t4 ON t1.vendor_sku_id = t4.skuId - WHERE vendor_order_id = ? AND vendor_id = ? - ORDER BY t1.sku_name - `, fullSkuNameSQL), /*, utils.DefaultTimeValue, utils.DefaultTimeValue*/ vendorOrderID, vendorID) + err = dao.GetRows(db, &skus, sql+` + IF(t3.img <> '', t3.img, t4.image) image + FROM order_sku t1 + LEFT JOIN goods_order t6 ON t6.vendor_order_id = t1.vendor_order_id AND t6.vendor_id = t1.vendor_id + LEFT JOIN store t5 ON t5.id = IF(t6.jx_store_id <> 0, t6.jx_store_id, t6.store_id) + LEFT JOIN sku t2 ON IF(t1.jx_sku_id != 0, t1.jx_sku_id, t1.sku_id) = t2.id/* AND t2.deleted_at = ?*/ + LEFT JOIN sku_name t3 ON t2.name_id = t3.id/* AND t3.deleted_at = ?*/ + LEFT JOIN jde_sku_infos t4 ON t1.vendor_sku_id = t4.skuId + WHERE t1.vendor_order_id = ? AND t1.vendor_id = ? + ORDER BY t1.sku_name + `, /*, utils.DefaultTimeValue, utils.DefaultTimeValue*/ vendorOrderID, vendorID) } if err != nil || len(skus) == 0 { - err = dao.GetRows(db, &skus, fmt.Sprintf(` - SELECT - t1.id, - t1.vendor_order_id, - t1.vendor_id, - t1.count, - t1.vendor_sku_id, - t1.sku_id, - t1.jx_sku_id, - t1.sku_name, - IF(t1.shop_price = 0, t1.sale_price, t1.shop_price) shop_price, - t1.sale_price, - t1.earning_price, - t1.weight, - t1.sku_type, - t1.promotion_type, - t1.order_created_at, - t1.store_sub_id, - t1.store_sub_name, - t1.vendor_price, - t3.img image, %s full_sku_name - FROM order_sku t1 - LEFT JOIN sku t2 ON IF(t1.jx_sku_id != 0, t1.jx_sku_id, t1.sku_id) = t2.id/* AND t2.deleted_at = ?*/ - LEFT JOIN sku_name t3 ON t2.name_id = t3.id/* AND t3.deleted_at = ?*/ - WHERE t1.vendor_order_id = ? AND t1.vendor_id = ? - ORDER BY t1.sku_name - `, fullSkuNameSQL), /*, utils.DefaultTimeValue, utils.DefaultTimeValue*/ vendorOrderID, vendorID) + err = dao.GetRows(db, &skus, sql+` + t3.img image + FROM order_sku t1 + LEFT JOIN goods_order t6 ON t6.vendor_order_id = t1.vendor_order_id AND t6.vendor_id = t1.vendor_id + LEFT JOIN store t5 ON t5.id = IF(t6.jx_store_id <> 0, t6.jx_store_id, t6.store_id) + LEFT JOIN sku t2 ON IF(t1.jx_sku_id != 0, t1.jx_sku_id, t1.sku_id) = t2.id/* AND t2.deleted_at = ?*/ + LEFT JOIN sku_name t3 ON t2.name_id = t3.id/* AND t3.deleted_at = ?*/ + WHERE t1.vendor_order_id = ? AND t1.vendor_id = ? + ORDER BY t1.sku_name + `, /*, utils.DefaultTimeValue, utils.DefaultTimeValue*/ vendorOrderID, vendorID) if err != nil { globals.SugarLogger.Infof("GetOrderSkuInfo orderID:%s vendorID:%d failed with error:%v", vendorOrderID, vendorID, err) return nil, err @@ -281,11 +253,11 @@ func (c *OrderManager) getOrders(ctx *jxcontext.Context, isIncludeSku bool, from if offset < 0 { offset = 0 } - sql := ` + sql := fmt.Sprintf(` SELECT SQL_CALC_FOUND_ROWS t1.*, - CAST(IF(t1.earning_price <> 0, t1.earning_price, IF(t1.shop_price <> 0 && t1.shop_price < t1.sale_price, t1.shop_price, t1.sale_price) * IF(t5.pay_percentage > 0, t5.pay_percentage, 70) / 100) AS SIGNED) earning_price, + CAST(IF(t1.earning_price <> 0, t1.earning_price, IF(t1.shop_price <> 0 && t1.shop_price < t1.sale_price, t1.shop_price, t1.sale_price) * IF(t5.pay_percentage > 0, t5.pay_percentage, %d) / 100) AS SIGNED) earning_price, t2.status waybill_status, t2.courier_name, t2.courier_mobile, - t2.actual_fee, t2.desired_fee, t2.waybill_created_at, t2.waybill_finished_at` + t2.actual_fee, t2.desired_fee, t2.waybill_created_at, t2.waybill_finished_at`, model.DefaultEarningPricePercentage) if isIncludeSku { sql += `, t3.sku_id, t3.count sku_count2, t3.shop_price sku_shop_price, IF(t3.earning_price <> 0, t3.earning_price, t3.sale_price) sku_sale_price` @@ -780,14 +752,14 @@ func (c *OrderManager) GetStoresOrderSaleInfo(ctx *jxcontext.Context, storeIDLis return nil, fmt.Errorf("查询时间范围不能超过60天") } // 用int64类型去取float型的数据库返回值,会取不到 - sql := ` + sql := fmt.Sprintf(` SELECT IF(t1.jx_store_id > 0, t1.jx_store_id, t1.store_id) store_id, t1.vendor_id, IF(t1.status < ?, 0, t1.status) status, COUNT(*) count, SUM(t1.shop_price) shop_price, SUM(t1.vendor_price) vendor_price, SUM(t1.sale_price) sale_price, SUM(t1.actual_pay_price) actual_pay_price, - CAST(SUM(IF(t1.earning_price <> 0, t1.earning_price, IF(t1.shop_price <> 0 && t1.shop_price < t1.sale_price, t1.shop_price, t1.sale_price) * IF(t5.pay_percentage > 0, t5.pay_percentage, 70) / 100)) AS SIGNED) earning_price + CAST(SUM(IF(t1.earning_price <> 0, t1.earning_price, IF(t1.shop_price <> 0 && t1.shop_price < t1.sale_price, t1.shop_price, t1.sale_price) * IF(t5.pay_percentage > 0, t5.pay_percentage, %d) / 100)) AS SIGNED) earning_price FROM goods_order t1 LEFT JOIN store t5 ON t5.id = IF(t1.jx_store_id <> 0, t1.jx_store_id, t1.store_id) WHERE t1.order_created_at >= ? AND t1.order_created_at <= ? - ` + `, model.DefaultEarningPricePercentage) sqlParams := []interface{}{ model.OrderStatusEndBegin, fromTime, diff --git a/business/jxutils/jxutils_cms.go b/business/jxutils/jxutils_cms.go index 690f75148..90de001ea 100644 --- a/business/jxutils/jxutils_cms.go +++ b/business/jxutils/jxutils_cms.go @@ -374,3 +374,15 @@ func GuessVendorIDFromVendorStoreID(vendorStoreID int64) (vendorID int) { func GetVendorName(vendorID int) (vendorName string) { return model.VendorChineseNames[vendorID] } + +func CaculateSkuEarningPrice(shopPrice, salePrice int64, storePayPercentage int) (earningPrice int64) { + earningPrice = salePrice + if shopPrice > 0 && shopPrice < earningPrice { + earningPrice = shopPrice + } + if storePayPercentage <= 0 { + storePayPercentage = model.DefaultEarningPricePercentage + } + earningPrice = earningPrice * int64(storePayPercentage) / 100 + return earningPrice +} diff --git a/business/model/api.go b/business/model/api.go index 6838910e2..1c5b1d0db 100644 --- a/business/model/api.go +++ b/business/model/api.go @@ -35,8 +35,9 @@ type GoodsOrderExt struct { type OrderSkuExt struct { OrderSku - FullSkuName string `json:"fullSkuName"` - Image string `json:"image"` + FullSkuName string `json:"fullSkuName"` + Image string `json:"image"` + RealEarningPrice int64 `json:"realEarningPrice"` // 实际单品结算给门店老板钱 } type GoodsOrderCountInfo struct { From bb7834c2687969ebf56b34e08954e24bab23eb26 Mon Sep 17 00:00:00 2001 From: gazebo Date: Thu, 20 Jun 2019 10:32:17 +0800 Subject: [PATCH 06/26] =?UTF-8?q?-=20=E8=AE=A2=E5=8D=95=E5=AF=BC=E5=87=BAs?= =?UTF-8?q?ku=E7=9A=84earningPrice?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- business/jxcallback/orderman/orderman_ext.go | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/business/jxcallback/orderman/orderman_ext.go b/business/jxcallback/orderman/orderman_ext.go index b8f8caaee..472fa50ef 100644 --- a/business/jxcallback/orderman/orderman_ext.go +++ b/business/jxcallback/orderman/orderman_ext.go @@ -260,7 +260,11 @@ func (c *OrderManager) getOrders(ctx *jxcontext.Context, isIncludeSku bool, from t2.actual_fee, t2.desired_fee, t2.waybill_created_at, t2.waybill_finished_at`, model.DefaultEarningPricePercentage) if isIncludeSku { sql += `, - t3.sku_id, t3.count sku_count2, t3.shop_price sku_shop_price, IF(t3.earning_price <> 0, t3.earning_price, t3.sale_price) sku_sale_price` + t3.sku_id, + t3.count sku_count2, + t3.shop_price sku_shop_price, + t3.earning_price sku_earning_price, + t3.sale_price sku_sale_price` } sql += ` FROM goods_order t1 @@ -447,6 +451,7 @@ func (c *OrderManager) ExportOrders(ctx *jxcontext.Context, fromDateStr, toDateS utils.Int2Str(v.SkuCount2), utils.Int2Str(v.SkuShopPrice), utils.Int2Str(v.SkuSalePrice), + utils.Int2Str(v.SkuEarningPrice), }, ",") if order == nil || v.ID != order.ID { order = v From ae9833361a965bd9d503ac25ba620d6529da932a Mon Sep 17 00:00:00 2001 From: gazebo Date: Thu, 20 Jun 2019 11:20:28 +0800 Subject: [PATCH 07/26] =?UTF-8?q?-=20dao.GetPromotionSkuPriceMap=20-=20?= =?UTF-8?q?=E4=BA=AC=E8=A5=BF=E6=B4=BB=E5=8A=A8=E8=A6=81=E6=B1=82=E4=B8=8D?= =?UTF-8?q?=E8=83=BD=E5=86=B2=E7=AA=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- business/jxcallback/orderman/order.go | 45 ++++++-------------- business/jxstore/promotion/jd_promotion.go | 24 ++++++++--- business/model/api.go | 11 ++--- business/model/dao/promotion.go | 48 ++++++++++++++++++++++ 4 files changed, 85 insertions(+), 43 deletions(-) create mode 100644 business/model/dao/promotion.go diff --git a/business/jxcallback/orderman/order.go b/business/jxcallback/orderman/order.go index 9ef9aa13a..248931811 100644 --- a/business/jxcallback/orderman/order.go +++ b/business/jxcallback/orderman/order.go @@ -236,29 +236,6 @@ func (c *OrderManager) SaveOrder(order *model.GoodsOrder, isAdjust bool, db *dao return isDuplicated, err } -func getPromotionSkuPriceMap(db *dao.DaoDB, storeID int, skuIDs []int) (skuPriceMap map[int64]*model.PromotionSku, err error) { - sql := ` - SELECT t3.* - FROM promotion t1 - JOIN promotion_store t2 ON t2.promotion_id = t1.id AND t2.store_id = ? - JOIN promotion_sku t3 ON t3.promotion_id = t1.id AND t3.sku_id IN (` + dao.GenQuestionMarks(len(skuIDs)) + `) AND t3.earning_price > 0 - WHERE t1.deleted_at = ? AND (t1.status = ? OR t1.status = ?) AND (t1.begin_at <= NOW() AND t1.end_at >= NOW()) AND t1.vendor_id = ?` - var skuPriceList []*model.PromotionSku - if err = dao.GetRows(db, &skuPriceList, sql, storeID, skuIDs, utils.DefaultTimeValue, model.PromotionStatusLocalCreated, model.PromotionStatusRemoteCreated, model.VendorIDJX); err != nil { - return nil, err - } - skuPriceMap = make(map[int64]*model.PromotionSku) - for _, v := range skuPriceList { - if v.EarningPrice > 0 { - index := jxutils.Combine2Int(v.SkuID, v.Price) - if skuPriceMap[index] == nil || v.EarningPrice < skuPriceMap[index].EarningPrice { - skuPriceMap[index] = v - } - } - } - return skuPriceMap, err -} - func (c *OrderManager) updateOrderSkuOtherInfo(order *model.GoodsOrder, db *dao.DaoDB) (err error) { globals.SugarLogger.Debugf("updateOrderSkuOtherInfo orderID:%s, VendorStoreID:%s", order.VendorOrderID, order.VendorStoreID) jxStoreID := jxutils.GetShowStoreIDFromOrder(order) @@ -309,12 +286,14 @@ func (c *OrderManager) updateOrderSkuOtherInfo(order *model.GoodsOrder, db *dao. skumapper[v.VendorSkuID] = v } - skuPriceMap, err2 := getPromotionSkuPriceMap(db, jxStoreID, jxutils.IntMap2List(skuIDMap)) - if err = err2; err != nil { - globals.SugarLogger.Errorf("updateOrderSkuOtherInfo can not get sku promotion info for orderID:%s, error:%v", order.VendorOrderID, err) - return err + var skuPriceMap map[int]*model.PromotionSku + if len(skuIDMap) > 0 { + skuPriceMap, err = dao.GetPromotionSkuPriceMap(db, []int{jxStoreID}, jxutils.IntMap2List(skuIDMap), time.Now(), time.Now()) + if err != nil { + globals.SugarLogger.Errorf("updateOrderSkuOtherInfo can not get sku promotion info for orderID:%s, error:%v", order.VendorOrderID, err) + return err + } } - for _, v := range orderSkus { v.VendorOrderID = order.VendorOrderID v.VendorID = order.VendorID @@ -335,10 +314,12 @@ func (c *OrderManager) updateOrderSkuOtherInfo(order *model.GoodsOrder, db *dao. } } - if skuID := jxutils.GetSkuIDFromOrderSku(v); skuID > 0 && v.StoreSubName != "" { - index := jxutils.Combine2Int(jxStoreID, int(v.SalePrice)) - if skuPriceMap[index] != nil { - v.EarningPrice = int64(skuPriceMap[index].EarningPrice) + if skuPriceMap != nil { + if skuID := jxutils.GetSkuIDFromOrderSku(v); skuID > 0 /*&& v.StoreSubName != ""*/ { + index := skuID + if skuPriceMap[index] != nil { + v.EarningPrice = int64(skuPriceMap[index].EarningPrice) + } } } } diff --git a/business/jxstore/promotion/jd_promotion.go b/business/jxstore/promotion/jd_promotion.go index 3910a50b2..7bd391e79 100644 --- a/business/jxstore/promotion/jd_promotion.go +++ b/business/jxstore/promotion/jd_promotion.go @@ -283,13 +283,25 @@ func CreateJdPromotion(ctx *jxcontext.Context, vendorID int, isIDJd bool, isAsyn Source: PromotionSourceOpenPlatform, } - if vendorPromotionID == "" && vendorID == model.VendorIDJD { - skuIDs := make([]int, len(params.SkuPrices)) - skuPriceMap := make(map[int64]*SkuPrice) - for k, v := range params.SkuPrices { - skuIDs[k] = v.SkuID - skuPriceMap[int64(v.SkuID)] = v + skuIDs := make([]int, len(params.SkuPrices)) + skuPriceMap := make(map[int64]*SkuPrice) + for k, v := range params.SkuPrices { + skuIDs[k] = v.SkuID + skuPriceMap[int64(v.SkuID)] = v + } + if len(skuIDs) == 0 { + return "", fmt.Errorf("商品列表为空") + } + if vendorID == model.VendorIDJX { + conflictPromotion, err2 := dao.GetPromotionSkuPriceMap(db, params.StoreIDs, skuIDs, promotion.BeginAt, promotion.EndAt) + if err = err2; err != nil { + return "", err } + if len(conflictPromotion) > 0 { + return "", fmt.Errorf("有冲突配置:%s", utils.Format4Output(conflictPromotion, true)) + } + } + if vendorPromotionID == "" && vendorID == model.VendorIDJD { sql := ` SELECT t1.*, t2.jd_id, t3.vendor_store_id FROM store_sku_bind t1 diff --git a/business/model/api.go b/business/model/api.go index 1c5b1d0db..1a3396774 100644 --- a/business/model/api.go +++ b/business/model/api.go @@ -26,11 +26,12 @@ type GoodsOrderExt struct { WaybillCreatedAt time.Time `orm:"type(datetime);index" json:"waybillCreatedAt"` WaybillFinishedAt time.Time `orm:"type(datetime)" json:"waybillFinishedAt"` - SkuID int `orm:"column(sku_id)" json:"skuID,omitempty"` - SkuShopPrice int `json:"skuShopPrice,omitempty"` - SkuSalePrice int `json:"skuSalePrice,omitempty"` - SkuCount2 int `json:"skuCount2,omitempty"` - SkuInfo string `json:"skuInfo,omitempty"` + SkuID int `orm:"column(sku_id)" json:"skuID,omitempty"` + SkuShopPrice int `json:"skuShopPrice,omitempty"` + SkuSalePrice int `json:"skuSalePrice,omitempty"` + SkuEarningPrice int `json:"skuEarningPrice,omitempty"` + SkuCount2 int `json:"skuCount2,omitempty"` + SkuInfo string `json:"skuInfo,omitempty"` } type OrderSkuExt struct { diff --git a/business/model/dao/promotion.go b/business/model/dao/promotion.go new file mode 100644 index 000000000..ce195db4c --- /dev/null +++ b/business/model/dao/promotion.go @@ -0,0 +1,48 @@ +package dao + +import ( + "time" + + "git.rosy.net.cn/baseapi/utils" + "git.rosy.net.cn/jx-callback/business/model" +) + +func GetPromotionSkuPriceMap(db *DaoDB, storeIDs, skuIDs []int, fromTime, toTime time.Time) (skuPriceMap map[int]*model.PromotionSku, err error) { + sql := ` + SELECT t3.* + FROM promotion t1 + JOIN promotion_store t2 ON t2.promotion_id = t1.id + JOIN promotion_sku t3 ON t3.promotion_id = t1.id + WHERE t1.deleted_at = ? AND t1.vendor_id = ? AND (t1.status = ? OR t1.status = ?) AND (t1.begin_at <= ? AND t1.end_at >= ?)` + sqlParams := []interface{}{ + utils.DefaultTimeValue, + model.VendorIDJX, + model.PromotionStatusLocalCreated, + model.PromotionStatusRemoteCreated, + toTime, + fromTime, + } + if len(storeIDs) > 0 { + sql += " AND t2.store_id IN (" + GenQuestionMarks(len(storeIDs)) + ")" + sqlParams = append(sqlParams, storeIDs) + } + if len(skuIDs) > 0 { + sql += " AND t3.sku_id IN (" + GenQuestionMarks(len(skuIDs)) + ")" + sqlParams = append(sqlParams, skuIDs) + } + + var skuPriceList []*model.PromotionSku + if err = GetRows(db, &skuPriceList, sql, sqlParams...); err != nil { + return nil, err + } + skuPriceMap = make(map[int]*model.PromotionSku) + for _, v := range skuPriceList { + if v.EarningPrice > 0 { + index := v.SkuID + if skuPriceMap[index] == nil || v.EarningPrice < skuPriceMap[index].EarningPrice { + skuPriceMap[index] = v + } + } + } + return skuPriceMap, err +} From 5adafac6699f16f30dc5fdfa642a2c464abfbd35 Mon Sep 17 00:00:00 2001 From: gazebo Date: Thu, 20 Jun 2019 11:33:49 +0800 Subject: [PATCH 08/26] - up --- business/jxcallback/orderman/order.go | 2 +- business/jxstore/promotion/jd_promotion.go | 122 +++++++++++---------- 2 files changed, 63 insertions(+), 61 deletions(-) diff --git a/business/jxcallback/orderman/order.go b/business/jxcallback/orderman/order.go index 248931811..4004cede6 100644 --- a/business/jxcallback/orderman/order.go +++ b/business/jxcallback/orderman/order.go @@ -352,7 +352,7 @@ func caculateOrderEarningPrice(order *model.GoodsOrder, storePayPercentage int) if skuEarningPrice == 0 { skuEarningPrice = jxutils.CaculateSkuEarningPrice(v.ShopPrice, v.SalePrice, storePayPercentage) } - order.EarningPrice += skuEarningPrice + order.EarningPrice += skuEarningPrice * int64(v.Count) } } diff --git a/business/jxstore/promotion/jd_promotion.go b/business/jxstore/promotion/jd_promotion.go index 7bd391e79..cab1b7c7b 100644 --- a/business/jxstore/promotion/jd_promotion.go +++ b/business/jxstore/promotion/jd_promotion.go @@ -298,79 +298,81 @@ func CreateJdPromotion(ctx *jxcontext.Context, vendorID int, isIDJd bool, isAsyn return "", err } if len(conflictPromotion) > 0 { - return "", fmt.Errorf("有冲突配置:%s", utils.Format4Output(conflictPromotion, true)) + return "", fmt.Errorf("有冲突配置:%s", utils.Format4Output(conflictPromotion, false)) } } - if vendorPromotionID == "" && vendorID == model.VendorIDJD { - sql := ` + if vendorPromotionID == "" { + if vendorID == model.VendorIDJD { + sql := ` SELECT t1.*, t2.jd_id, t3.vendor_store_id FROM store_sku_bind t1 JOIN sku t2 ON t1.sku_id = t2.id JOIN store_map t3 ON t1.store_id = t3.store_id AND t3.vendor_id = ? AND t3.deleted_at = ? WHERE t1.deleted_at = ? ` - sqlParam := []interface{}{ - model.VendorIDJD, - utils.DefaultTimeValue, - utils.DefaultTimeValue, - skuIDs, - } - if isIDJd { - sql += " AND t2.jd_id IN (" + dao.GenQuestionMarks(len(skuIDs)) + ") AND t3.vendor_store_id = ?" - } else { - sql += " AND t1.sku_id IN (" + dao.GenQuestionMarks(len(skuIDs)) + ") AND t1.store_id = ?" - } + sqlParam := []interface{}{ + model.VendorIDJD, + utils.DefaultTimeValue, + utils.DefaultTimeValue, + skuIDs, + } + if isIDJd { + sql += " AND t2.jd_id IN (" + dao.GenQuestionMarks(len(skuIDs)) + ") AND t3.vendor_store_id = ?" + } else { + sql += " AND t1.sku_id IN (" + dao.GenQuestionMarks(len(skuIDs)) + ") AND t1.store_id = ?" + } - errMsg := "" - index := 0 - for _, storeID := range params.StoreIDs { - var skuBinds []*tStoreSkuBindExt - if err = dao.GetRows(db, &skuBinds, sql, append(sqlParam, storeID)...); err != nil { - return "", err - } - for k, skuBind := range skuBinds { - if k == 0 { - jxStoreIDs = append(jxStoreIDs, skuBind.StoreID) + errMsg := "" + index := 0 + for _, storeID := range params.StoreIDs { + var skuBinds []*tStoreSkuBindExt + if err = dao.GetRows(db, &skuBinds, sql, append(sqlParam, storeID)...); err != nil { + return "", err } - mapSkuID := int64(skuBind.SkuID) - if isIDJd { - mapSkuID = skuBind.JdSkuID - } - promotionSkuPrice := skuPriceMap[mapSkuID] - if promotionSkuPrice.PriceType == PriceTypePercentage { - promotionSkuPrice.Price = skuBind.Price * promotionSkuPrice.Price / 100 - } - if vendorID != model.VendorIDJX && promotionSkuPrice.Price >= skuBind.Price { - errMsg += fmt.Sprintf("活动价大于等于原价,storeID:%d, skuID:%d\n", skuBind.StoreID, skuBind.SkuID) - } - if promotionSkuPrice.LimitSkuCount <= 0 { - promotionSkuPrice.LimitSkuCount = DefaultLimitSkuCount - } - if errMsg == "" { - if params.Type == PromotionTypeLimitedTime { - if skuBind.Price*PromotionLimitedTimeMinPercentage/100 < promotionSkuPrice.Price { - modifyPricesList[skuBind.StoreID] = append(modifyPricesList[skuBind.StoreID], &jdapi.SkuPriceInfo{ - OutSkuId: utils.Int2Str(skuBind.SkuID), - Price: promotionSkuPrice.Price*100/PromotionLimitedTimeMinPercentage + 5, - }) + for k, skuBind := range skuBinds { + if k == 0 { + jxStoreIDs = append(jxStoreIDs, skuBind.StoreID) + } + mapSkuID := int64(skuBind.SkuID) + if isIDJd { + mapSkuID = skuBind.JdSkuID + } + promotionSkuPrice := skuPriceMap[mapSkuID] + if promotionSkuPrice.PriceType == PriceTypePercentage { + promotionSkuPrice.Price = skuBind.Price * promotionSkuPrice.Price / 100 + } + if vendorID != model.VendorIDJX && promotionSkuPrice.Price >= skuBind.Price { + errMsg += fmt.Sprintf("活动价大于等于原价,storeID:%d, skuID:%d\n", skuBind.StoreID, skuBind.SkuID) + } + if promotionSkuPrice.LimitSkuCount <= 0 { + promotionSkuPrice.LimitSkuCount = DefaultLimitSkuCount + } + if errMsg == "" { + if params.Type == PromotionTypeLimitedTime { + if skuBind.Price*PromotionLimitedTimeMinPercentage/100 < promotionSkuPrice.Price { + modifyPricesList[skuBind.StoreID] = append(modifyPricesList[skuBind.StoreID], &jdapi.SkuPriceInfo{ + OutSkuId: utils.Int2Str(skuBind.SkuID), + Price: promotionSkuPrice.Price*100/PromotionLimitedTimeMinPercentage + 5, + }) + } } + promotionPrices[index] = &jdapi.PromotionSku{ + StationNo: utils.Str2Int64(skuBind.VendorStoreID), + SkuID: skuBind.JdSkuID, + PromotionPrice: int64(promotionSkuPrice.Price), + LimitSkuCount: promotionSkuPrice.LimitSkuCount, + } + index++ } - promotionPrices[index] = &jdapi.PromotionSku{ - StationNo: utils.Str2Int64(skuBind.VendorStoreID), - SkuID: skuBind.JdSkuID, - PromotionPrice: int64(promotionSkuPrice.Price), - LimitSkuCount: promotionSkuPrice.LimitSkuCount, - } - index++ } } - } - if errMsg != "" { - return "", errors.New(errMsg) - } - promotionPrices = promotionPrices[:index] - if len(promotionPrices) == 0 { - return "", ErrEmptySkus + if errMsg != "" { + return "", errors.New(errMsg) + } + promotionPrices = promotionPrices[:index] + if len(promotionPrices) == 0 { + return "", ErrEmptySkus + } } } else { promotion.VendorPromotionID = vendorPromotionID @@ -665,7 +667,7 @@ func CancelJdPromotion(ctx *jxcontext.Context, promotionID int) (err error) { if err = dao.GetEntity(db, promotion); err != nil { return err } - if promotion.Status != model.PromotionStatusCanceled { + if promotion.Status == model.PromotionStatusCanceled { return errors.New("当前状态已经是取消") } if promotion.Status == model.PromotionStatusRemoteCreated { From 62f497fcaaa4723aa4d2d80efaff49620f89073e Mon Sep 17 00:00:00 2001 From: gazebo Date: Thu, 20 Jun 2019 16:08:26 +0800 Subject: [PATCH 09/26] - up --- business/jxstore/act/act.go | 60 ++++++++++++++++++++++++++----------- business/model/act.go | 8 +++++ 2 files changed, 51 insertions(+), 17 deletions(-) diff --git a/business/jxstore/act/act.go b/business/jxstore/act/act.go index e97ed4a05..25e7a3be7 100644 --- a/business/jxstore/act/act.go +++ b/business/jxstore/act/act.go @@ -25,15 +25,9 @@ type ActOrderRuleParam struct { } type ActStoreSkuParam struct { + model.ActStoreSku + Action int // -1删除,1修改,2新增 - - StoreID int `orm:"column(store_id)" json:"storeID"` - SkuID int `orm:"column(sku_id)" json:"skuID"` - - PricePercentage int `orm:"" json:"pricePercentage"` // 单品级活动用,SKU级的价格比例,非0覆盖Act中的PricePercentage - ActPrice int64 `orm:"" json:"actPrice"` // 单品级活动用,SKU级指定的价格,非0覆盖CustomPricePercentage与Act中的PricePercentage - - Stock int `orm:"" json:"stock"` // 订单级活动用 } type ActDetail struct { @@ -117,15 +111,9 @@ func ActStoreSkuParam2Model(ctx *jxcontext.Context, act *model.Act, vendorIDs [] for _, v := range oneStoreSkuParam { if validSkuMap[v.SkuID] == 1 { if storeSkuInfo := storeSkuMap[genStoreSkuMapKey(v.StoreID, v.SkuID)]; storeSkuInfo != nil { - storeSku := &model.ActStoreSku{ - ActID: act.ID, - StoreID: v.StoreID, - SkuID: v.SkuID, - OriginalPrice: int64(storeSkuInfo.Price), - PricePercentage: v.PricePercentage, - ActPrice: v.ActPrice, - Stock: v.Stock, - } + storeSku := &v.ActStoreSku + storeSku.ActID = act.ID + storeSku.OriginalPrice = int64(storeSkuInfo.Price) dao.WrapAddIDCULDEntity(storeSku, ctx.GetUserName()) actStoreSkuList = append(actStoreSkuList, storeSku) } @@ -262,6 +250,44 @@ func CancelAct(ctx *jxcontext.Context, actID int) (err error) { return err } +func DeleteActStoreBind(ctx *jxcontext.Context, actID int, actStoreSku []*ActStoreSkuParam) (err error) { + storeIDMap := make(map[int]int) + skuIDMap := make(map[int]int) + actStoreSkuParamMap := make(map[int64]*ActStoreSkuParam) + for _, v := range actStoreSku { + storeIDMap[v.StoreID] = 1 + skuIDMap[v.SkuID] = 1 + actStoreSkuParamMap[jxutils.Combine2Int(v.StoreID, v.SkuID)] = v + } + + db := dao.GetDB() + actStoreSkuMap, err := dao.GetActStoreSkuVendorInfo(db, actID, nil, jxutils.IntMap2List(storeIDMap), jxutils.IntMap2List(skuIDMap)) + if err != nil { + return err + } + dao.Begin(db) + defer func() { + if r := recover(); r != nil || err != nil { + dao.Rollback(db) + if r != nil { + panic(r) + } + } + }() + for _, v := range actStoreSkuMap { + for _, storeSku := range v { + storeSku.SyncStatus |= model.SyncFlagDeletedMask + if param := actStoreSkuParamMap[jxutils.Combine2Int(storeSku.StoreID, storeSku.SkuID)]; param != nil { + if _, err = dao.UpdateEntity(db, storeSku); err != nil { + return err + } + } + } + } + dao.Commit(db) + return err +} + func SyncAct(ctx *jxcontext.Context, actID int, vendorIDs, storeIDs, skuIDs []int) (err error) { var actOrderRules []*model.ActOrderRule db := dao.GetDB() diff --git a/business/model/act.go b/business/model/act.go index 188729be6..f42d7df44 100644 --- a/business/model/act.go +++ b/business/model/act.go @@ -3,6 +3,7 @@ package model import "time" const ( + ActSkuFake = 0 // 假活动,只用于存储活动结算信息 ActSkuDirectDown = 1 ActSkuSecKill = 2 @@ -103,10 +104,17 @@ type ActStoreSku struct { OriginalPrice int64 `orm:"" json:"originalPrice"` // 单品级活动用,创建活动时商品的原始京西价 PricePercentage int `orm:"" json:"pricePercentage"` // 单品级活动用,SKU级的价格比例,非0覆盖Act中的PricePercentage ActPrice int64 `orm:"" json:"actPrice"` // 单品级活动用,SKU级指定的价格,非0覆盖CustomPricePercentage与Act中的PricePercentage + EarningPrice int64 `json:"earningPrice"` // 活动商品设置,结算给门店老板的钱 Stock int `orm:"" json:"stock"` // 订单级活动用 } +func (*ActStoreSku) TableUnique() [][]string { + return [][]string{ + []string{"ActID", "SkuID", "StoreID", "DeletedAt"}, + } +} + type ActStoreSkuMap struct { ModelIDCULD From df7d58c50dd9858a0361fdff2bae7baf8b4f2df8 Mon Sep 17 00:00:00 2001 From: gazebo Date: Thu, 20 Jun 2019 17:04:47 +0800 Subject: [PATCH 10/26] =?UTF-8?q?-=20updateOrderOtherInfo=E4=B8=AD?= =?UTF-8?q?=E5=BF=BD=E7=95=A5=E6=89=BE=E4=B8=8D=E5=88=B0=E9=97=A8=E5=BA=97?= =?UTF-8?q?=E6=98=A0=E5=B0=84=E7=9A=84=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- business/jxcallback/orderman/order.go | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/business/jxcallback/orderman/order.go b/business/jxcallback/orderman/order.go index 4004cede6..fad9d9b48 100644 --- a/business/jxcallback/orderman/order.go +++ b/business/jxcallback/orderman/order.go @@ -330,16 +330,21 @@ func (c *OrderManager) updateOrderSkuOtherInfo(order *model.GoodsOrder, db *dao. func (c *OrderManager) updateOrderOtherInfo(order *model.GoodsOrder, db *dao.DaoDB) (err error) { globals.SugarLogger.Debugf("updateOrderOtherInfo orderID:%s, VendorStoreID:%s", order.VendorOrderID, order.VendorStoreID) + payPercentage := 0 storeDetail, err := dao.GetStoreDetailByVendorStoreID(db, order.VendorStoreID, order.VendorID) if err != nil { globals.SugarLogger.Warnf("updateOrderOtherInfo GetStoreDetailByVendorStoreID orderID:%s, VendorStoreID:%s, error:%v", order.VendorOrderID, order.VendorStoreID, err) - return err + if !dao.IsNoRowsError(err) { + return err + } + err = nil + } else { + order.JxStoreID = storeDetail.Store.ID + payPercentage = storeDetail.PayPercentage } - order.JxStoreID = storeDetail.Store.ID if err = c.updateOrderSkuOtherInfo(order, db); err == nil { jxutils.RefreshOrderSkuRelated(order) - - caculateOrderEarningPrice(order, storeDetail.PayPercentage) + caculateOrderEarningPrice(order, payPercentage) } return err } From 18073dc157116f3010744f352b64fff281d2db5a Mon Sep 17 00:00:00 2001 From: gazebo Date: Thu, 20 Jun 2019 18:01:54 +0800 Subject: [PATCH 11/26] - refactor --- business/jxstore/act/act.go | 121 +++++++++++++++----------- business/jxstore/act/act_test.go | 24 +++-- business/partner/partner_act.go | 14 ++- business/partner/purchase/ebai/act.go | 4 +- business/partner/purchase/mtwm/act.go | 6 +- 5 files changed, 100 insertions(+), 69 deletions(-) diff --git a/business/jxstore/act/act.go b/business/jxstore/act/act.go index 25e7a3be7..71704452a 100644 --- a/business/jxstore/act/act.go +++ b/business/jxstore/act/act.go @@ -7,7 +7,6 @@ import ( "git.rosy.net.cn/baseapi/utils" "git.rosy.net.cn/jx-callback/business/jxutils" "git.rosy.net.cn/jx-callback/business/partner" - "git.rosy.net.cn/jx-callback/globals" "git.rosy.net.cn/jx-callback/business/jxutils/jxcontext" "git.rosy.net.cn/jx-callback/business/jxutils/tasksch" @@ -34,19 +33,6 @@ type ActDetail struct { model.Act2 } -func ActStoreSkuParam2Map(actStoreSku []*ActStoreSkuParam) (actStoreSkuMap map[int][]*ActStoreSkuParam) { - if len(actStoreSku) > 0 { - for _, v := range actStoreSku { - actStoreSkuMap[v.StoreID] = append(actStoreSkuMap[v.StoreID], v) - } - } - return actStoreSkuMap -} - -func genStoreSkuMapKey(storeID, skuID int) int64 { - return int64(storeID) + int64(skuID)*1000000 -} - func ActStoreSkuParam2Model(ctx *jxcontext.Context, act *model.Act, vendorIDs []int, actStoreSku []*ActStoreSkuParam) (actMapList []*model.ActMap, actStoreMapList []*model.ActStoreMap, actStoreSkuList []*model.ActStoreSku, actStoreSkuMapList []*model.ActStoreSkuMap, err error) { if len(actStoreSku) > 0 { storeIDMap := make(map[int]int) @@ -65,7 +51,7 @@ func ActStoreSkuParam2Model(ctx *jxcontext.Context, act *model.Act, vendorIDs [] } storeSkuMap := make(map[int64]*model.StoreSkuBind) for _, v := range storeSkuList { - storeSkuMap[genStoreSkuMapKey(v.StoreID, v.SkuID)] = v + storeSkuMap[jxutils.Combine2Int(v.StoreID, v.SkuID)] = v } wholeValidVendorMap := make(map[int]int) @@ -76,7 +62,7 @@ func ActStoreSkuParam2Model(ctx *jxcontext.Context, act *model.Act, vendorIDs [] storeDetail, err2 := dao.GetStoreDetail(db, storeID, vendorID) if err = err2; err == nil { for _, v := range oneStoreSkuParam { - if storeSkuInfo := storeSkuMap[genStoreSkuMapKey(v.StoreID, v.SkuID)]; storeSkuInfo != nil { + if storeSkuInfo := storeSkuMap[jxutils.Combine2Int(v.StoreID, v.SkuID)]; storeSkuInfo != nil { validVendorMap[vendorID] = 1 validSkuMap[v.SkuID] = 1 actSkuMap := &model.ActStoreSkuMap{ @@ -110,7 +96,7 @@ func ActStoreSkuParam2Model(ctx *jxcontext.Context, act *model.Act, vendorIDs [] for _, v := range oneStoreSkuParam { if validSkuMap[v.SkuID] == 1 { - if storeSkuInfo := storeSkuMap[genStoreSkuMapKey(v.StoreID, v.SkuID)]; storeSkuInfo != nil { + if storeSkuInfo := storeSkuMap[jxutils.Combine2Int(v.StoreID, v.SkuID)]; storeSkuInfo != nil { storeSku := &v.ActStoreSku storeSku.ActID = act.ID storeSku.OriginalPrice = int64(storeSkuInfo.Price) @@ -211,46 +197,24 @@ func GetActDetail(ctx *jxcontext.Context, actID int) (actDetail *ActDetail, err // return err // } -func parseActStoreSkuParam(actStoreSku []*ActStoreSkuParam) { - -} - func UpdateAct(ctx *jxcontext.Context, act *model.Act, actRules []*ActOrderRuleParam, actStoreSku []*ActStoreSkuParam) (err error) { return err } func CancelAct(ctx *jxcontext.Context, actID int) (err error) { db := dao.GetDB() - act := &model.Act{} - act.ID = actID - if err = dao.GetEntity(db, act); err != nil { + if err = deleteActStoreBind(ctx, db, actID, nil); err != nil { return err } - dao.Begin(db) - defer func() { - if r := recover(); r != nil { - dao.Rollback(db) - panic(r) - } - }() - - dao.UpdateEntityLogically(db, act, map[string]interface{}{ - model.FieldStatus: model.ActStatusCanceled, - }, ctx.GetUserName(), nil) - _, err = dao.UpdateEntityLogicallyAndUpdateSyncStatus(db, &model.ActMap{}, nil, ctx.GetUserName(), map[string]interface{}{ - model.FieldActID: actID, - }, model.FieldSyncStatus, model.SyncFlagModifiedMask) - if err == nil { - dao.Commit(db) - globals.SugarLogger.Debugf("CancelAct track:%s", ctx.GetTrackInfo()) - err = SyncAct(ctx, actID, nil, nil, nil) - } else { - dao.Rollback(db) - } + err = SyncAct(ctx, actID, nil, nil, nil) return err } func DeleteActStoreBind(ctx *jxcontext.Context, actID int, actStoreSku []*ActStoreSkuParam) (err error) { + return deleteActStoreBind(ctx, dao.GetDB(), actID, actStoreSku) +} + +func deleteActStoreBind(ctx *jxcontext.Context, db *dao.DaoDB, actID int, actStoreSku []*ActStoreSkuParam) (err error) { storeIDMap := make(map[int]int) skuIDMap := make(map[int]int) actStoreSkuParamMap := make(map[int64]*ActStoreSkuParam) @@ -259,9 +223,18 @@ func DeleteActStoreBind(ctx *jxcontext.Context, actID int, actStoreSku []*ActSto skuIDMap[v.SkuID] = 1 actStoreSkuParamMap[jxutils.Combine2Int(v.StoreID, v.SkuID)] = v } + storeIDs := jxutils.IntMap2List(storeIDMap) + skuIDs := jxutils.IntMap2List(skuIDMap) - db := dao.GetDB() - actStoreSkuMap, err := dao.GetActStoreSkuVendorInfo(db, actID, nil, jxutils.IntMap2List(storeIDMap), jxutils.IntMap2List(skuIDMap)) + actMap, err := dao.GetActVendorInfo(db, actID, nil) + if err != nil { + return err + } + actStoreMap, err := dao.GetActStoreVendorInfo(db, actID, nil, storeIDs) + if err != nil { + return err + } + actStoreSkuMap, err := dao.GetActStoreSkuVendorInfo(db, actID, nil, storeIDs, skuIDs) if err != nil { return err } @@ -274,14 +247,56 @@ func DeleteActStoreBind(ctx *jxcontext.Context, actID int, actStoreSku []*ActSto } } }() - for _, v := range actStoreSkuMap { - for _, storeSku := range v { - storeSku.SyncStatus |= model.SyncFlagDeletedMask - if param := actStoreSkuParamMap[jxutils.Combine2Int(storeSku.StoreID, storeSku.SkuID)]; param != nil { - if _, err = dao.UpdateEntity(db, storeSku); err != nil { - return err + + isNeedCancelAct := true + for vendorID, act := range actMap { + actStoreMap := partner.SplitActStore(actStoreMap[vendorID]) + actStoreSkuMap := partner.SplitActStoreSku(actStoreSkuMap[vendorID]) + isStoreAllDeleted := true + for _, actStore := range actStoreMap { + isStoreSkuAllDeleted := true + for _, actStoreSku := range actStoreSkuMap[actStore.StoreID] { + if actStoreSku == nil || actStoreSkuParamMap[jxutils.Combine2Int(actStoreSku.StoreID, actStoreSku.SkuID)] != nil { + objActStoreSkuMap := &model.ActStoreSkuMap{} + objActStoreSkuMap.ID = actStoreSku.MapID + if _, err = dao.UpdateEntityLogically(db, objActStoreSkuMap, map[string]interface{}{ + model.FieldSyncStatus: actStoreSku.SyncStatus | model.SyncFlagDeletedMask, + }, ctx.GetUserName(), nil); err != nil { + return err + } + } else { + isStoreSkuAllDeleted = false } } + if isStoreSkuAllDeleted { + if _, err = dao.UpdateEntityLogically(db, &actStore.ActStoreMap, map[string]interface{}{ + model.FieldSyncStatus: actStore.SyncStatus | model.SyncFlagDeletedMask, + }, ctx.GetUserName(), nil); err != nil { + return err + } + } else { + isStoreAllDeleted = false + isNeedCancelAct = false + } + } + + if isStoreAllDeleted { + objActMap := &model.ActMap{} + objActMap.ID = act.MapID + if _, err = dao.UpdateEntityLogically(db, objActMap, map[string]interface{}{ + model.FieldSyncStatus: act.SyncStatus | model.SyncFlagDeletedMask, + }, ctx.GetUserName(), nil); err != nil { + return err + } + } + } + if isNeedCancelAct { + act := &model.Act{} + act.ID = actID + if _, err = dao.UpdateEntityLogically(db, act, map[string]interface{}{ + model.FieldStatus: model.ActStatusCanceled, + }, ctx.GetUserName(), nil); err != nil { + return err } } dao.Commit(db) diff --git a/business/jxstore/act/act_test.go b/business/jxstore/act/act_test.go index 7e91f6eea..d93c7038f 100644 --- a/business/jxstore/act/act_test.go +++ b/business/jxstore/act/act_test.go @@ -31,20 +31,28 @@ func TestCreateAct(t *testing.T) { PricePercentage: 80, }, []int{0, 1, 3}, nil, []*ActStoreSkuParam{ &ActStoreSkuParam{ - StoreID: 100119, - SkuID: 30828, + ActStoreSku: model.ActStoreSku{ + StoreID: 100119, + SkuID: 30828, + }, }, &ActStoreSkuParam{ - StoreID: 100119, - SkuID: 30827, + ActStoreSku: model.ActStoreSku{ + StoreID: 100119, + SkuID: 30827, + }, }, &ActStoreSkuParam{ - StoreID: 100118, - SkuID: 30592, + ActStoreSku: model.ActStoreSku{ + StoreID: 100118, + SkuID: 30592, + }, }, &ActStoreSkuParam{ - StoreID: 100118, - SkuID: 30565, + ActStoreSku: model.ActStoreSku{ + StoreID: 100118, + SkuID: 30565, + }, }, }) if err != nil { diff --git a/business/partner/partner_act.go b/business/partner/partner_act.go index 458dd183b..74550b270 100644 --- a/business/partner/partner_act.go +++ b/business/partner/partner_act.go @@ -15,10 +15,18 @@ type IPurchasePlatformPromotionHandler interface { CancelAct(ctx *jxcontext.Context, parentTask tasksch.ITask, act *model.Act2, actStoreMap []*model.ActStore2, actStoreSku []*model.ActStoreSku2) (err error) } -func ActStoreSku2Map(actStoreSku []*model.ActStoreSku2) (actStoreSkuMap map[int][]*model.ActStoreSku2) { +func SplitActStore(actStoreList []*model.ActStore2) (actStoreMap map[int]*model.ActStore2) { + actStoreMap = make(map[int]*model.ActStore2) + for _, v := range actStoreList { + actStoreMap[v.StoreID] = v + } + return actStoreMap +} + +func SplitActStoreSku(actStoreSkuList []*model.ActStoreSku2) (actStoreSkuMap map[int][]*model.ActStoreSku2) { actStoreSkuMap = make(map[int][]*model.ActStoreSku2) - for _, storeSku := range actStoreSku { - actStoreSkuMap[storeSku.StoreID] = append(actStoreSkuMap[storeSku.StoreID], storeSku) + for _, v := range actStoreSkuList { + actStoreSkuMap[v.StoreID] = append(actStoreSkuMap[v.StoreID], v) } return actStoreSkuMap } diff --git a/business/partner/purchase/ebai/act.go b/business/partner/purchase/ebai/act.go index f0c89bd08..6be37576c 100644 --- a/business/partner/purchase/ebai/act.go +++ b/business/partner/purchase/ebai/act.go @@ -105,7 +105,7 @@ func ActivitySkuUpdateBatch(activityID int64, actSkuInfoList []*ebaiapi.Activity func (c *PurchaseHandler) CreateAct(ctx *jxcontext.Context, parentTask tasksch.ITask, act *model.Act2, actOrderRules []*model.ActOrderRule, actStoreMap []*model.ActStore2, actStoreSku []*model.ActStoreSku2) (err error) { activity := act2EbaiActivity(act, actOrderRules) if act.Type < model.ActOrderBegin { - actStoreSkuMap := partner.ActStoreSku2Map(actStoreSku) + actStoreSkuMap := partner.SplitActStoreSku(actStoreSku) task := tasksch.NewParallelTask("ebai CreateAct", nil, ctx, func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) { store := batchItemList[0].(*model.ActStore2) @@ -122,7 +122,7 @@ func (c *PurchaseHandler) CreateAct(ctx *jxcontext.Context, parentTask tasksch.I func (c *PurchaseHandler) UpdateAct(ctx *jxcontext.Context, parentTask tasksch.ITask, act *model.Act2, actOrderRules []*model.ActOrderRule, actStoreMap2Remove, actStoreMap2Add, actStoreMap2Update []*model.ActStore2, actStoreSku []*model.ActStoreSku2) (err error) { if act.Type < model.ActOrderBegin { - actStoreSkuMap := partner.ActStoreSku2Map(actStoreSku) + actStoreSkuMap := partner.SplitActStoreSku(actStoreSku) if len(actStoreMap2Remove) > 0 { if err = c.CancelAct(ctx, parentTask, act, actStoreMap2Remove, nil); err != nil { return err diff --git a/business/partner/purchase/mtwm/act.go b/business/partner/purchase/mtwm/act.go index 144a5b59d..3d3494599 100644 --- a/business/partner/purchase/mtwm/act.go +++ b/business/partner/purchase/mtwm/act.go @@ -89,7 +89,7 @@ func createOneShopAct(act *model.Act2, storeMap *model.ActStore2, actStoreSku [] func (c *PurchaseHandler) CreateAct(ctx *jxcontext.Context, parentTask tasksch.ITask, act *model.Act2, actOrderRules []*model.ActOrderRule, actStoreMap []*model.ActStore2, actStoreSku []*model.ActStoreSku2) (err error) { globals.SugarLogger.Debugf("mtwm CreateAct actID:%d", act.ID) if act.Type < model.ActOrderBegin { - actStoreSkuMap := partner.ActStoreSku2Map(actStoreSku) + actStoreSkuMap := partner.SplitActStoreSku(actStoreSku) task := tasksch.NewParallelTask("mtwm CreateAct", nil, ctx, func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) { store := batchItemList[0].(*model.ActStore2) @@ -106,7 +106,7 @@ func (c *PurchaseHandler) CreateAct(ctx *jxcontext.Context, parentTask tasksch.I func (c *PurchaseHandler) UpdateAct(ctx *jxcontext.Context, parentTask tasksch.ITask, act *model.Act2, actOrderRules []*model.ActOrderRule, actStoreMap2Remove, actStoreMap2Add, actStoreMap2Update []*model.ActStore2, actStoreSku []*model.ActStoreSku2) (err error) { if act.Type < model.ActOrderBegin { - actStoreSkuMap := partner.ActStoreSku2Map(actStoreSku) + actStoreSkuMap := partner.SplitActStoreSku(actStoreSku) if len(actStoreMap2Remove) > 0 { if err = c.CancelAct(ctx, parentTask, act, actStoreMap2Remove, nil); err != nil { return err @@ -148,7 +148,7 @@ func (c *PurchaseHandler) UpdateAct(ctx *jxcontext.Context, parentTask tasksch.I func (c *PurchaseHandler) CancelAct(ctx *jxcontext.Context, parentTask tasksch.ITask, act *model.Act2, actStoreMap []*model.ActStore2, actStoreSku []*model.ActStoreSku2) (err error) { if act.Type < model.ActOrderBegin { - actStoreSkuMap := partner.ActStoreSku2Map(actStoreSku) + actStoreSkuMap := partner.SplitActStoreSku(actStoreSku) task := tasksch.NewParallelTask("mtwm DeleteAct", nil, ctx, func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) { v := batchItemList[0].(*model.ActStore2) From 717b15cf90bc86059aa01caee3f2618568cdedbf Mon Sep 17 00:00:00 2001 From: gazebo Date: Thu, 20 Jun 2019 18:13:59 +0800 Subject: [PATCH 12/26] =?UTF-8?q?-=20jd.onAfsOrderMsg=E9=81=BF=E5=85=8D?= =?UTF-8?q?=E6=B6=88=E6=81=AF=E9=87=8D=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- business/partner/purchase/jd/order_afs.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/business/partner/purchase/jd/order_afs.go b/business/partner/purchase/jd/order_afs.go index c0b73c099..4d855b791 100644 --- a/business/partner/purchase/jd/order_afs.go +++ b/business/partner/purchase/jd/order_afs.go @@ -70,6 +70,9 @@ func (c *PurchaseHandler) onAfsOrderMsg(msg *jdapi.CallbackOrderMsg) (retVal *jd afsInfo, err := api.JdAPI.GetAfsService2(msg.BillID) if err == nil { status := c.callbackAfsMsg2Status(msg, afsInfo) + if partner.CurOrderManager.GetStatusDuplicatedCount(status) > 0 { + return nil + } if status.Status == model.AfsOrderStatusWait4Approve || status.Status == model.AfsOrderStatusNew { afsOrder := c.buildAfsOrder(afsInfo) err = partner.CurOrderManager.OnAfsOrderNew(afsOrder, status) From 16cf42718aeec36f1fc06211c140991fb17f0cc7 Mon Sep 17 00:00:00 2001 From: gazebo Date: Fri, 21 Jun 2019 09:55:44 +0800 Subject: [PATCH 13/26] =?UTF-8?q?-=20GetStoresSkus=E8=BF=94=E5=9B=9E?= =?UTF-8?q?=E5=95=86=E5=93=81=E6=B4=BB=E5=8A=A8=E4=BB=B7=E6=A0=BC=E4=BF=A1?= =?UTF-8?q?=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- business/jxcallback/orderman/order.go | 6 +-- business/jxstore/cms/store_sku.go | 48 +++++++++++++++------- business/jxstore/promotion/jd_promotion.go | 2 +- business/model/dao/promotion.go | 33 ++++++++++----- 4 files changed, 61 insertions(+), 28 deletions(-) diff --git a/business/jxcallback/orderman/order.go b/business/jxcallback/orderman/order.go index fad9d9b48..aa834c5ec 100644 --- a/business/jxcallback/orderman/order.go +++ b/business/jxcallback/orderman/order.go @@ -286,9 +286,9 @@ func (c *OrderManager) updateOrderSkuOtherInfo(order *model.GoodsOrder, db *dao. skumapper[v.VendorSkuID] = v } - var skuPriceMap map[int]*model.PromotionSku + var skuPriceMap map[int64]*dao.PromotionStoreSku if len(skuIDMap) > 0 { - skuPriceMap, err = dao.GetPromotionSkuPriceMap(db, []int{jxStoreID}, jxutils.IntMap2List(skuIDMap), time.Now(), time.Now()) + skuPriceMap, err = dao.GetPromotionSkuPriceMap(db, model.VendorIDJX, []int{jxStoreID}, jxutils.IntMap2List(skuIDMap), time.Now(), time.Now()) if err != nil { globals.SugarLogger.Errorf("updateOrderSkuOtherInfo can not get sku promotion info for orderID:%s, error:%v", order.VendorOrderID, err) return err @@ -316,7 +316,7 @@ func (c *OrderManager) updateOrderSkuOtherInfo(order *model.GoodsOrder, db *dao. if skuPriceMap != nil { if skuID := jxutils.GetSkuIDFromOrderSku(v); skuID > 0 /*&& v.StoreSubName != ""*/ { - index := skuID + index := dao.GenSkuPriceMapKey(jxStoreID, v.SkuID) if skuPriceMap[index] != nil { v.EarningPrice = int64(skuPriceMap[index].EarningPrice) } diff --git a/business/jxstore/cms/store_sku.go b/business/jxstore/cms/store_sku.go index 04e3a82d9..91522e77d 100644 --- a/business/jxstore/cms/store_sku.go +++ b/business/jxstore/cms/store_sku.go @@ -191,19 +191,8 @@ func GetStoresSkus(ctx *jxcontext.Context, storeIDs []int, isFocus bool, keyword sql += " AND t1.unit = ?" sqlParams = append(sqlParams, params["unit"].(string)) } - if params["skuID"] != nil { - skuID, ok := params["skuID"].(int) - if ok { - sql += " AND t2.id = ?" - sqlParams = append(sqlParams, skuID) - } else { // todo 这里是没有用的,应该删除掉 - skuIDs := params["skuID"].([]interface{}) - sql += " AND t2.id IN (" + dao.GenQuestionMarks(len(skuIDs)) + ")" - sqlParams = append(sqlParams, skuIDs) - } - } + var skuIDs []int if params["skuIDs"] != nil { - var skuIDs []int if err = utils.UnmarshalUseNumber([]byte(params["skuIDs"].(string)), &skuIDs); err != nil { return nil, err } @@ -211,6 +200,13 @@ func GetStoresSkus(ctx *jxcontext.Context, storeIDs []int, isFocus bool, keyword sql += " AND t2.id IN (" + dao.GenQuestionMarks(len(skuIDs)) + ")" sqlParams = append(sqlParams, skuIDs) } + } else if params["skuID"] != nil { + skuID, ok := params["skuID"].(int) + if ok { + skuIDs = append(skuIDs, skuID) + sql += " AND t2.id = ?" + sqlParams = append(sqlParams, skuID) + } } if isFocus { if params["fromStatus"] != nil { @@ -287,7 +283,7 @@ func GetStoresSkus(ctx *jxcontext.Context, storeIDs []int, isFocus bool, keyword CONCAT("[", GROUP_CONCAT(DISTINCT CONCAT('{"id":', t2.id, ',"comment":"', t2.comment, '","status":', t2.status, ',"createdAt":"', CONCAT(REPLACE(IF(t4.created_at IS NULL, '1970-01-01 00:00:00', t4.created_at)," ","T"),"+08:00"), '","updatedAt":"', CONCAT(REPLACE(IF(t4.updated_at IS NULL, '1970-01-01 00:00:00', t4.updated_at)," ","T"),"+08:00"), '","lastOperator":"', IF(t4.last_operator IS NULL, '', t4.last_operator), '","specQuality":', t2.spec_quality, ',"specUnit":"', t2.spec_unit, '","weight":', t2.weight, - ',"categoryID":', t2.category_id, ',"nameID":', t2.name_id, ',"subStoreID":', IF(t4.sub_store_id IS NULL, 0, t4.sub_store_id), + ',"categoryID":', t2.category_id, ',"subStoreID":', IF(t4.sub_store_id IS NULL, 0, t4.sub_store_id), ',"price":', IF(t4.price IS NULL, 0, t4.price), ',"unitPrice":', IF(t4.unit_price IS NULL, t1.price, t4.unit_price), ',"storeSkuStatus":', IF(t4.status IS NULL, 0, t4.status), ',"jdID":', t2.jd_id, ',"jdSyncStatus":', IF(t4.jd_sync_status IS NULL, 0, t4.jd_sync_status), @@ -319,6 +315,20 @@ func GetStoresSkus(ctx *jxcontext.Context, storeIDs []int, isFocus bool, keyword // globals.SugarLogger.Debug(sqlData, sqlParams) if err = dao.GetRows(db, &skuNamesInfo.SkuNames, sqlData, sqlParams...); err == nil { skuNamesInfo.TotalCount = dao.GetLastTotalRowCount(db) + + // 活动商品信息 + jxSkuPriceMap, err2 := dao.GetPromotionSkuPriceMap(db, model.VendorIDJX, storeIDs, skuIDs, time.Now(), time.Now()) + if err = err2; err != nil { + dao.Rollback(db) + globals.SugarLogger.Errorf("GetStoresSkus can not get sku promotion info for error:%v", err) + return nil, err + } + jdSkuPriceMap, err2 := dao.GetPromotionSkuPriceMap(db, model.VendorIDJD, storeIDs, skuIDs, time.Now(), time.Now()) + if err = err2; err != nil { + dao.Rollback(db) + globals.SugarLogger.Errorf("GetStoresSkus can not get sku promotion info for error:%v", err) + return nil, err + } for _, skuName := range skuNamesInfo.SkuNames { if skuName.SkusStr != "" { if err = utils.UnmarshalUseNumber([]byte(skuName.SkusStr), &skuName.Skus); err != nil { @@ -328,7 +338,17 @@ func GetStoresSkus(ctx *jxcontext.Context, storeIDs []int, isFocus bool, keyword if len(skuName.Skus) > 0 { skuName.UnitPrice = int(utils.MustInterface2Int64(skuName.Skus[0]["unitPrice"])) for _, v := range skuName.Skus { - delete(v, "unitPrice") + index := dao.GenSkuPriceMapKey(skuName.StoreID, int(utils.MustInterface2Int64(v["id"]))) + if jdSkuPriceMap[index] != nil { + v["actPrice"] = jdSkuPriceMap[index].Price + } else { + v["actPrice"] = 0 + } + if jxSkuPriceMap[index] != nil { + v["earningPrice"] = jxSkuPriceMap[index].EarningPrice + } else { + v["earningPrice"] = 0 + } } } else { skuName.UnitPrice = skuName.Price diff --git a/business/jxstore/promotion/jd_promotion.go b/business/jxstore/promotion/jd_promotion.go index cab1b7c7b..8abb597aa 100644 --- a/business/jxstore/promotion/jd_promotion.go +++ b/business/jxstore/promotion/jd_promotion.go @@ -293,7 +293,7 @@ func CreateJdPromotion(ctx *jxcontext.Context, vendorID int, isIDJd bool, isAsyn return "", fmt.Errorf("商品列表为空") } if vendorID == model.VendorIDJX { - conflictPromotion, err2 := dao.GetPromotionSkuPriceMap(db, params.StoreIDs, skuIDs, promotion.BeginAt, promotion.EndAt) + conflictPromotion, err2 := dao.GetPromotionSkuPriceMap(db, model.VendorIDJX, params.StoreIDs, skuIDs, promotion.BeginAt, promotion.EndAt) if err = err2; err != nil { return "", err } diff --git a/business/model/dao/promotion.go b/business/model/dao/promotion.go index ce195db4c..ddfd9783b 100644 --- a/business/model/dao/promotion.go +++ b/business/model/dao/promotion.go @@ -7,20 +7,33 @@ import ( "git.rosy.net.cn/jx-callback/business/model" ) -func GetPromotionSkuPriceMap(db *DaoDB, storeIDs, skuIDs []int, fromTime, toTime time.Time) (skuPriceMap map[int]*model.PromotionSku, err error) { +type PromotionStoreSku struct { + model.PromotionSku + StoreID int `orm:"column(store_id)" json:"storeID"` +} + +func GenSkuPriceMapKey(storeID, skuID int) (key int64) { + return int64(storeID)*1000000 + int64(skuID) +} + +func GetPromotionSkuPriceMap(db *DaoDB, vendorID int, storeIDs, skuIDs []int, fromTime, toTime time.Time) (skuPriceMap map[int64]*PromotionStoreSku, err error) { sql := ` - SELECT t3.* + SELECT t2.store_id, t3.* FROM promotion t1 JOIN promotion_store t2 ON t2.promotion_id = t1.id JOIN promotion_sku t3 ON t3.promotion_id = t1.id - WHERE t1.deleted_at = ? AND t1.vendor_id = ? AND (t1.status = ? OR t1.status = ?) AND (t1.begin_at <= ? AND t1.end_at >= ?)` + WHERE t1.deleted_at = ? AND t1.vendor_id = ? AND (t1.begin_at <= ? AND t1.end_at >= ?) AND (t1.status = ? OR t1.status = ?)` sqlParams := []interface{}{ utils.DefaultTimeValue, - model.VendorIDJX, - model.PromotionStatusLocalCreated, - model.PromotionStatusRemoteCreated, + vendorID, toTime, fromTime, + model.PromotionStatusRemoteCreated, + } + if vendorID == model.VendorIDJX { + sqlParams = append(sqlParams, model.PromotionStatusLocalCreated) + } else { + sqlParams = append(sqlParams, model.PromotionStatusRemoteCreated) } if len(storeIDs) > 0 { sql += " AND t2.store_id IN (" + GenQuestionMarks(len(storeIDs)) + ")" @@ -30,15 +43,15 @@ func GetPromotionSkuPriceMap(db *DaoDB, storeIDs, skuIDs []int, fromTime, toTime sql += " AND t3.sku_id IN (" + GenQuestionMarks(len(skuIDs)) + ")" sqlParams = append(sqlParams, skuIDs) } - - var skuPriceList []*model.PromotionSku + sql += "ORDER BY t2.store_id, t3.sku_id, t3.price" + var skuPriceList []*PromotionStoreSku if err = GetRows(db, &skuPriceList, sql, sqlParams...); err != nil { return nil, err } - skuPriceMap = make(map[int]*model.PromotionSku) + skuPriceMap = make(map[int64]*PromotionStoreSku) for _, v := range skuPriceList { if v.EarningPrice > 0 { - index := v.SkuID + index := GenSkuPriceMapKey(v.StoreID, v.SkuID) if skuPriceMap[index] == nil || v.EarningPrice < skuPriceMap[index].EarningPrice { skuPriceMap[index] = v } From 9d01bddc6575c4d45ebe2d75a6c10282c397f66a Mon Sep 17 00:00:00 2001 From: gazebo Date: Fri, 21 Jun 2019 10:32:20 +0800 Subject: [PATCH 14/26] =?UTF-8?q?-=20GetPromotionSkuPriceMap=E4=B8=8D?= =?UTF-8?q?=E4=B8=8EEarningPrice=E7=9B=B8=E5=85=B3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- business/jxcallback/orderman/order.go | 2 +- business/model/dao/promotion.go | 8 +++----- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/business/jxcallback/orderman/order.go b/business/jxcallback/orderman/order.go index aa834c5ec..1c9f3b35d 100644 --- a/business/jxcallback/orderman/order.go +++ b/business/jxcallback/orderman/order.go @@ -317,7 +317,7 @@ func (c *OrderManager) updateOrderSkuOtherInfo(order *model.GoodsOrder, db *dao. if skuPriceMap != nil { if skuID := jxutils.GetSkuIDFromOrderSku(v); skuID > 0 /*&& v.StoreSubName != ""*/ { index := dao.GenSkuPriceMapKey(jxStoreID, v.SkuID) - if skuPriceMap[index] != nil { + if skuPriceMap[index] != nil && skuPriceMap[index].EarningPrice > 0 { v.EarningPrice = int64(skuPriceMap[index].EarningPrice) } } diff --git a/business/model/dao/promotion.go b/business/model/dao/promotion.go index ddfd9783b..8c5fb0d70 100644 --- a/business/model/dao/promotion.go +++ b/business/model/dao/promotion.go @@ -50,11 +50,9 @@ func GetPromotionSkuPriceMap(db *DaoDB, vendorID int, storeIDs, skuIDs []int, fr } skuPriceMap = make(map[int64]*PromotionStoreSku) for _, v := range skuPriceList { - if v.EarningPrice > 0 { - index := GenSkuPriceMapKey(v.StoreID, v.SkuID) - if skuPriceMap[index] == nil || v.EarningPrice < skuPriceMap[index].EarningPrice { - skuPriceMap[index] = v - } + index := GenSkuPriceMapKey(v.StoreID, v.SkuID) + if true /*skuPriceMap[index] == nil || v.EarningPrice < skuPriceMap[index].EarningPrice*/ { + skuPriceMap[index] = v } } return skuPriceMap, err From 7f44446390d0020729443a9855533f97a647f9a0 Mon Sep 17 00:00:00 2001 From: gazebo Date: Fri, 21 Jun 2019 11:02:16 +0800 Subject: [PATCH 15/26] - up --- business/jxstore/act/act.go | 10 +- business/partner/partner_act.go | 16 +++ business/partner/purchase/jd/act.go | 168 ++++++++++++++++++++++------ 3 files changed, 151 insertions(+), 43 deletions(-) diff --git a/business/jxstore/act/act.go b/business/jxstore/act/act.go index 71704452a..a4b2bd5a9 100644 --- a/business/jxstore/act/act.go +++ b/business/jxstore/act/act.go @@ -257,9 +257,7 @@ func deleteActStoreBind(ctx *jxcontext.Context, db *dao.DaoDB, actID int, actSto isStoreSkuAllDeleted := true for _, actStoreSku := range actStoreSkuMap[actStore.StoreID] { if actStoreSku == nil || actStoreSkuParamMap[jxutils.Combine2Int(actStoreSku.StoreID, actStoreSku.SkuID)] != nil { - objActStoreSkuMap := &model.ActStoreSkuMap{} - objActStoreSkuMap.ID = actStoreSku.MapID - if _, err = dao.UpdateEntityLogically(db, objActStoreSkuMap, map[string]interface{}{ + if _, err = dao.UpdateEntityLogically(db, partner.ActStoreSku2ActStoreSkuMap(actStoreSku), map[string]interface{}{ model.FieldSyncStatus: actStoreSku.SyncStatus | model.SyncFlagDeletedMask, }, ctx.GetUserName(), nil); err != nil { return err @@ -269,7 +267,7 @@ func deleteActStoreBind(ctx *jxcontext.Context, db *dao.DaoDB, actID int, actSto } } if isStoreSkuAllDeleted { - if _, err = dao.UpdateEntityLogically(db, &actStore.ActStoreMap, map[string]interface{}{ + if _, err = dao.UpdateEntityLogically(db, partner.ActStore2ActStoreMap(actStore), map[string]interface{}{ model.FieldSyncStatus: actStore.SyncStatus | model.SyncFlagDeletedMask, }, ctx.GetUserName(), nil); err != nil { return err @@ -281,9 +279,7 @@ func deleteActStoreBind(ctx *jxcontext.Context, db *dao.DaoDB, actID int, actSto } if isStoreAllDeleted { - objActMap := &model.ActMap{} - objActMap.ID = act.MapID - if _, err = dao.UpdateEntityLogically(db, objActMap, map[string]interface{}{ + if _, err = dao.UpdateEntityLogically(db, partner.Act2ActMap(act), map[string]interface{}{ model.FieldSyncStatus: act.SyncStatus | model.SyncFlagDeletedMask, }, ctx.GetUserName(), nil); err != nil { return err diff --git a/business/partner/partner_act.go b/business/partner/partner_act.go index 74550b270..1c7de58bc 100644 --- a/business/partner/partner_act.go +++ b/business/partner/partner_act.go @@ -30,3 +30,19 @@ func SplitActStoreSku(actStoreSkuList []*model.ActStoreSku2) (actStoreSkuMap map } return actStoreSkuMap } + +func Act2ActMap(act *model.Act2) (actMap *model.ActMap) { + actMap = &model.ActMap{} + actMap.ID = act.MapID + return actMap +} + +func ActStore2ActStoreMap(actStore *model.ActStore2) (actStoreMap *model.ActStoreMap) { + return &actStore.ActStoreMap +} + +func ActStoreSku2ActStoreSkuMap(actStoreSku *model.ActStoreSku2) (actStoreSkuMap *model.ActStoreSkuMap) { + actStoreSkuMap = &model.ActStoreSkuMap{} + actStoreSkuMap.ID = actStoreSku.MapID + return actStoreSkuMap +} diff --git a/business/partner/purchase/jd/act.go b/business/partner/purchase/jd/act.go index f2dbcedde..1342382af 100644 --- a/business/partner/purchase/jd/act.go +++ b/business/partner/purchase/jd/act.go @@ -3,6 +3,8 @@ package jd import ( "time" + "git.rosy.net.cn/jx-callback/business/partner" + "git.rosy.net.cn/jx-callback/business/jxutils" "git.rosy.net.cn/jx-callback/globals" @@ -15,6 +17,12 @@ import ( "git.rosy.net.cn/jx-callback/business/model" ) +type LogicUpdateInfo struct { + Item interface{} + KVs map[string]interface{} + Condition map[string]interface{} +} + func CreatePromotionInfos(promotionType int, name string, beginDate, endDate time.Time, outInfoId, advertising, traceId string) (infoId int64, err error) { if globals.EnableJdStoreWrite { if promotionType == model.ActSkuDirectDown { @@ -125,51 +133,40 @@ func storeSku2Jd(actStoreSku []*model.ActStoreSku2, handler func(syncStatus int) } func (c *PurchaseHandler) CreateAct(ctx *jxcontext.Context, parentTask tasksch.ITask, act *model.Act2, actOrderRules []*model.ActOrderRule, actStoreMap []*model.ActStore2, actStoreSku []*model.ActStoreSku2) (err error) { - traceID := getTraceID(ctx) if act.Type < model.ActOrderBegin { - outInfoID := utils.Int2Str(act.ID) - infoID, err2 := CreatePromotionInfos(act.Type, act.Name, act.BeginAt, act.EndAt, outInfoID, act.Advertising, traceID) - if err = err2; err == nil { - act.VendorActID = utils.Int64ToStr(infoID) - if err = CreatePromotionRules(act.Type, infoID, "", act.LimitDevice, act.LimitPin, act.LimitCount, act.LimitDaily, traceID); err == nil { - if _, err = CreatePromotionSku(act.Type, infoID, "", storeSku2Jd(actStoreSku, model.IsSyncStatusNeedCreate), traceID); err == nil { - err = ConfirmPromotion(act.Type, infoID, "", traceID) - } - } - } + act.VendorActID, err = createSkuAct(ctx, act, actStoreSku) } else { } return err } -func (c *PurchaseHandler) UpdateAct(ctx *jxcontext.Context, parentTask tasksch.ITask, act *model.Act2, actOrderRules []*model.ActOrderRule, actStoreMap2Remove, actStoreMap2Add, actStoreMap2Update []*model.ActStore2, actStoreSku []*model.ActStoreSku2) (err error) { +func createSkuAct(ctx *jxcontext.Context, act *model.Act2, actStoreSku []*model.ActStoreSku2) (vendorActID string, err error) { traceID := getTraceID(ctx) - if act.Type < model.ActOrderBegin { - outInfoID := utils.Int2Str(act.ID) - if !utils.IsTimeZero(act.EndAt) { - if err = AdjustPromotionTime(act.Type, 0, outInfoID, act.EndAt, traceID); err != nil { - return err - } - } - if toBeDeleted := storeSku2Jd(actStoreSku, model.IsSyncStatusNeedDelete); len(toBeDeleted) > 0 { - if err = CancelPromotionSku(act.Type, 0, outInfoID, toBeDeleted, traceID); err != nil { - return err - } - } - // if toBeAdded := storeSku2Jd(actStoreSku, model.IsSyncStatusNeedDelete); len(toBeAdded) > 0 { - // if _, err = CreatePromotionSku(act.Type, 0, outInfoID, toBeAdded, traceID); err != nil { - // return err - // } - // } - // if toBeUpdated := storeSku2Jd(actStoreSku, model.IsSyncStatusNeedDelete); len(toBeUpdated) > 0 { - // if _, err = AdjustPromotionSku(act.Type, 0, outInfoID, toBeUpdated, traceID); err != nil { - // return err - // } - // } - } else { - + outInfoID := "" + if act.VendorActID == "" { + outInfoID = utils.Int2Str(act.ID) } + infoID, err2 := CreatePromotionInfos(act.Type, act.Name, act.BeginAt, act.EndAt, outInfoID, act.Advertising, traceID) + if err = err2; err == nil { + vendorActID = utils.Int64ToStr(infoID) + if err = CreatePromotionRules(act.Type, infoID, "", act.LimitDevice, act.LimitPin, act.LimitCount, act.LimitDaily, traceID); err == nil { + if _, err = CreatePromotionSku(act.Type, infoID, "", storeSku2Jd(actStoreSku, model.IsSyncStatusNeedCreate), traceID); err == nil { + err = ConfirmPromotion(act.Type, infoID, "", traceID) + } + } + } + return vendorActID, err +} + +func cancelSkuActSkus(ctx *jxcontext.Context, actType int, vendorActID string, actStoreSku []*model.ActStoreSku2) (err error) { + if skuList := storeSku2Jd(actStoreSku, model.IsSyncStatusNeedDelete); len(skuList) > 0 { + err = CancelPromotionSku(actType, utils.Str2Int64(vendorActID), "", skuList, getTraceID(ctx)) + } + return err +} + +func (c *PurchaseHandler) UpdateAct(ctx *jxcontext.Context, parentTask tasksch.ITask, act *model.Act2, actOrderRules []*model.ActOrderRule, actStoreMap2Remove, actStoreMap2Add, actStoreMap2Update []*model.ActStore2, actStoreSku []*model.ActStoreSku2) (err error) { return err } @@ -181,3 +178,102 @@ func (c *PurchaseHandler) CancelAct(ctx *jxcontext.Context, parentTask tasksch.I } return err } + +func (c *PurchaseHandler) SyncAct(ctx *jxcontext.Context, parentTask tasksch.ITask, act *model.Act2, actStoreList []*model.ActStore2, actStoreSkuList []*model.ActStoreSku2) (err error) { + traceID := getTraceID(ctx) + + actStoreMap := partner.SplitActStore(actStoreList) + actStoreSkuMap := partner.SplitActStoreSku(actStoreSkuList) + var actStoreSkuList4Create, actStoreSkuList4Delete []*model.ActStoreSku2 + var okList []*LogicUpdateInfo + for _, actStore := range actStoreMap { + for _, actStoreSku := range actStoreSkuMap[actStore.StoreID] { + if model.IsSyncStatusNeedCreate(actStoreSku.SyncStatus) { + if actStore.VendorActID == "" { + actStoreSkuList4Create = append(actStoreSkuList4Create, actStoreSku) + } else { + if actStoreSku.VendorActID, err = createSkuAct(ctx, act, []*model.ActStoreSku2{actStoreSku}); err != nil { + return err + } + okList = append(okList, &LogicUpdateInfo{ + Item: partner.ActStoreSku2ActStoreSkuMap(actStoreSku), + KVs: map[string]interface{}{ + model.FieldSyncStatus: 0, + model.FieldVendorActID: actStoreSku.VendorActID, + }, + }) + } + } else if model.IsSyncStatusNeedDelete(actStoreSku.SyncStatus) { + if actStoreSku.VendorActID == "" { + actStoreSkuList4Delete = append(actStoreSkuList4Delete, actStoreSku) + } else { + if err = CancelPromotion(act.Type, utils.Str2Int64(actStoreSku.VendorActID), "", traceID); err != nil { + return err + } + okList = append(okList, &LogicUpdateInfo{ + Item: partner.ActStoreSku2ActStoreSkuMap(actStoreSku), + KVs: map[string]interface{}{ + model.FieldSyncStatus: 0, + model.FieldDeletedAt: time.Now(), + }, + }) + } + } + } + if actStore.VendorActID != "" { + if model.IsSyncStatusDelete(actStore.SyncStatus) { + if err = CancelPromotion(act.Type, utils.Str2Int64(actStore.VendorActID), "", traceID); err != nil { + return err + } + okList = append(okList, &LogicUpdateInfo{ + Item: partner.ActStore2ActStoreMap(actStore), + KVs: map[string]interface{}{ + model.FieldSyncStatus: 0, + model.FieldDeletedAt: time.Now(), + }, + }) + + } else if len(actStoreSkuList4Delete) > 0 { + if err = cancelSkuActSkus(ctx, act.Type, actStore.VendorActID, actStoreSkuList4Delete); err != nil { + return err + } + } + for _, v := range actStoreSkuList4Delete { + okList = append(okList, &LogicUpdateInfo{ + Item: partner.ActStoreSku2ActStoreSkuMap(v), + KVs: map[string]interface{}{ + model.FieldSyncStatus: 0, + model.FieldDeletedAt: time.Now(), + }, + }) + } + actStoreSkuList4Delete = nil + } + + if act.VendorActID != "" { + if len(actStoreSkuList4Create) > 0 { + if actStore.VendorActID, err = createSkuAct(ctx, act, actStoreSkuList4Create); err != nil { + return err + } + okList = append(okList, &LogicUpdateInfo{ + Item: partner.ActStore2ActStoreMap(actStore), + KVs: map[string]interface{}{ + model.FieldSyncStatus: 0, + }, + }) + for _, v := range actStoreSkuList4Create { + okList = append(okList, &LogicUpdateInfo{ + Item: partner.ActStoreSku2ActStoreSkuMap(v), + KVs: map[string]interface{}{ + model.FieldSyncStatus: 0, + }, + }) + } + actStoreSkuList4Create = nil + } + } + } + // db := dao.GetDB() + + return err +} From 46a7d291a2d30a8119b24851e02d54b7d013e2ab Mon Sep 17 00:00:00 2001 From: gazebo Date: Fri, 21 Jun 2019 11:09:25 +0800 Subject: [PATCH 16/26] =?UTF-8?q?-=20GetStoresSkus=E6=81=A2=E5=A4=8D?= =?UTF-8?q?=E8=AF=AF=E5=88=A0=E7=9A=84name=5Fid?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- business/jxstore/cms/store_sku.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/business/jxstore/cms/store_sku.go b/business/jxstore/cms/store_sku.go index 91522e77d..fd1f8c39d 100644 --- a/business/jxstore/cms/store_sku.go +++ b/business/jxstore/cms/store_sku.go @@ -283,7 +283,7 @@ func GetStoresSkus(ctx *jxcontext.Context, storeIDs []int, isFocus bool, keyword CONCAT("[", GROUP_CONCAT(DISTINCT CONCAT('{"id":', t2.id, ',"comment":"', t2.comment, '","status":', t2.status, ',"createdAt":"', CONCAT(REPLACE(IF(t4.created_at IS NULL, '1970-01-01 00:00:00', t4.created_at)," ","T"),"+08:00"), '","updatedAt":"', CONCAT(REPLACE(IF(t4.updated_at IS NULL, '1970-01-01 00:00:00', t4.updated_at)," ","T"),"+08:00"), '","lastOperator":"', IF(t4.last_operator IS NULL, '', t4.last_operator), '","specQuality":', t2.spec_quality, ',"specUnit":"', t2.spec_unit, '","weight":', t2.weight, - ',"categoryID":', t2.category_id, ',"subStoreID":', IF(t4.sub_store_id IS NULL, 0, t4.sub_store_id), + ',"categoryID":', t2.category_id, ',"nameID":', t2.name_id, ',"subStoreID":', IF(t4.sub_store_id IS NULL, 0, t4.sub_store_id), ',"price":', IF(t4.price IS NULL, 0, t4.price), ',"unitPrice":', IF(t4.unit_price IS NULL, t1.price, t4.unit_price), ',"storeSkuStatus":', IF(t4.status IS NULL, 0, t4.status), ',"jdID":', t2.jd_id, ',"jdSyncStatus":', IF(t4.jd_sync_status IS NULL, 0, t4.jd_sync_status), @@ -349,6 +349,7 @@ func GetStoresSkus(ctx *jxcontext.Context, storeIDs []int, isFocus bool, keyword } else { v["earningPrice"] = 0 } + delete(v, "unitPrice") } } else { skuName.UnitPrice = skuName.Price From c11a0af51ae5edce0bf97c206a5fdd5919167429 Mon Sep 17 00:00:00 2001 From: gazebo Date: Fri, 21 Jun 2019 15:26:52 +0800 Subject: [PATCH 17/26] =?UTF-8?q?+=20RefreshOrderFinancial=20-=20=E4=BA=AC?= =?UTF-8?q?=E4=B8=9C=E8=AE=A2=E5=8D=95=E5=9C=A8=E6=94=B6=E5=88=B0=E8=AE=A2?= =?UTF-8?q?=E5=8D=95=E5=BA=94=E7=BB=93=E6=B6=88=E6=81=AF=E6=97=B6=E5=86=8D?= =?UTF-8?q?=E6=AC=A1=E5=88=B7=E6=96=B0=E5=BA=94=E7=BB=93=E4=BF=A1=E6=81=AF?= =?UTF-8?q?=EF=BC=88=E6=9C=89=E6=97=B6=E5=9C=A8=E8=AE=A2=E5=8D=95=E7=94=9F?= =?UTF-8?q?=E6=88=90=E6=97=B6=E4=B8=8D=E8=83=BD=E6=AD=A3=E5=B8=B8=E5=BE=97?= =?UTF-8?q?=E5=88=B0=E5=BA=94=E7=BB=93=E6=B6=88=E6=81=AF=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- business/jxcallback/orderman/order.go | 13 ++++++-- business/jxstore/misc/misc.go | 43 +++++++++++++++++++++++++++ business/partner/purchase/jd/order.go | 28 ++++++++++++++--- controllers/jx_order.go | 20 +++++++++++++ routers/commentsRouter_controllers.go | 9 ++++++ 5 files changed, 107 insertions(+), 6 deletions(-) diff --git a/business/jxcallback/orderman/order.go b/business/jxcallback/orderman/order.go index 1c9f3b35d..90010b9f1 100644 --- a/business/jxcallback/orderman/order.go +++ b/business/jxcallback/orderman/order.go @@ -512,9 +512,18 @@ func (c *OrderManager) UpdateOrderStatusAndDeliveryFlag(order *model.GoodsOrder) } func (c *OrderManager) UpdateOrderFields(order *model.GoodsOrder, fieldList []string) (err error) { - db := orm.NewOrm() + db := dao.GetDB() utils.CallFuncLogError(func() error { - _, err = db.Update(order, fieldList...) + if order.ID == 0 { + order2 := *order + if err = dao.GetEntity(db, &order2, model.FieldVendorOrderID, model.FieldVendorID); err == nil { + order.ID = order2.ID + } + err = nil // 强制忽略订单不存在错误 + } + if err == nil && order.ID != 0 { + _, err = db.Db.Update(order, fieldList...) + } return err }, "UpdateOrderFields orderID:%s failed with error:%v", order.VendorOrderID, err) return err diff --git a/business/jxstore/misc/misc.go b/business/jxstore/misc/misc.go index 6520ce94f..a011872bb 100644 --- a/business/jxstore/misc/misc.go +++ b/business/jxstore/misc/misc.go @@ -79,6 +79,49 @@ func RefreshRealMobile(ctx *jxcontext.Context, vendorID int, fromTime, toTime ti return hint, err } +func RefreshOrderFinancial(ctx *jxcontext.Context, fromTime, toTime time.Time, isAsync, isContinueWhenError bool) (hint string, err error) { + sql := ` + SELECT * + FROM goods_order + WHERE status = ? AND total_shop_money = 0 + ` + sqlParams := []interface{}{ + model.OrderStatusFinished, + } + if !utils.IsTimeZero(fromTime) { + sql += " AND order_created_at >= ?" + sqlParams = append(sqlParams, fromTime) + } + if !utils.IsTimeZero(toTime) { + sql += " AND order_created_at <= ?" + sqlParams = append(sqlParams, toTime) + } + var orderList []*model.GoodsOrder + db := dao.GetDB() + if err = dao.GetRows(db, &orderList, sql, sqlParams...); err == nil && len(orderList) > 0 { + task := tasksch.NewParallelTask("misc RefreshOrderFinancial", tasksch.NewParallelConfig().SetIsContinueWhenError(isContinueWhenError), ctx, + func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) { + order := batchItemList[0].(*model.GoodsOrder) + handler := partner.GetPurchasePlatformFromVendorID(order.VendorID) + if handler != nil { + remoteOrder, err2 := handler.GetOrder(order.VendorOrderID) + if err = err2; err == nil { + order.TotalShopMoney = remoteOrder.TotalShopMoney + order.PmSubsidyMoney = remoteOrder.PmSubsidyMoney + err = partner.CurOrderManager.UpdateOrderFields(order, []string{"TotalShopMoney", "PmSubsidyMoney"}) + } + } + return nil, err + }, orderList) + tasksch.HandleTask(task, nil, true).Run() + hint = task.ID + if !isAsync { + _, err = task.GetResult(0) + } + } + return hint, err +} + func StartDailyWork() { if globals.ReallyCallPlatformAPI { now := time.Now() diff --git a/business/partner/purchase/jd/order.go b/business/partner/purchase/jd/order.go index 1d887dc6f..8d8200d3c 100644 --- a/business/partner/purchase/jd/order.go +++ b/business/partner/purchase/jd/order.go @@ -43,6 +43,21 @@ func (c *PurchaseHandler) OnOrderMsg(msg *jdapi.CallbackOrderMsg) (retVal *jdapi return retVal } +func (c *PurchaseHandler) updateOrderFinancialInfo(orderID string) (err error) { + order := &model.GoodsOrder{ + VendorOrderID: orderID, + VendorID: model.VendorIDJD, + } + orderSettlement, err := api.JdAPI.OrderShoudSettlementService2(orderID) + if err == nil { + if orderSettlement != nil { + updateOrderBySettleMent(order, orderSettlement) + err = partner.CurOrderManager.UpdateOrderFields(order, []string{"TotalShopMoney", "PmSubsidyMoney"}) + } + } + return err +} + func (c *PurchaseHandler) onOrderMsg(msg *jdapi.CallbackOrderMsg) (retVal *jdapi.CallbackResponse) { status := c.callbackMsg2Status(msg) if jdapi.StatusIDNewOrder == msg.StatusID { @@ -53,6 +68,7 @@ func (c *PurchaseHandler) onOrderMsg(msg *jdapi.CallbackOrderMsg) (retVal *jdapi } if msg.MsgURL == jdapi.CallbackMsgOrderAccounting { retVal = c.OnFinancialMsg(msg) + retVal = jdapi.Err2CallbackResponse(c.updateOrderFinancialInfo(msg.BillID), status.VendorStatus) } else if msg.MsgURL == jdapi.CallbackMsgAfterSaleBillStatus { retVal = c.OnAfsOrderMsg(msg) } else { @@ -77,6 +93,13 @@ func (c *PurchaseHandler) onOrderMsg(msg *jdapi.CallbackOrderMsg) (retVal *jdapi return retVal } +func updateOrderBySettleMent(order *model.GoodsOrder, orderSettlement *jdapi.OrderSettlementInfo) { + if orderSettlement != nil { + order.TotalShopMoney = orderSettlement.SettlementAmount + order.PmSubsidyMoney = orderSettlement.PlatOrderGoodsDiscountMoney + orderSettlement.PlatSkuGoodsDiscountMoney + } +} + func (c *PurchaseHandler) getOrder(orderID string) (order *model.GoodsOrder, orderMap map[string]interface{}, err error) { globals.SugarLogger.Debugf("jd getOrder orderID:%s", orderID) var ( @@ -104,10 +127,7 @@ func (c *PurchaseHandler) getOrder(orderID string) (order *model.GoodsOrder, ord task.Run() task.GetResult(0) if order != nil { - if orderSettlement != nil { - order.TotalShopMoney = orderSettlement.SettlementAmount - order.PmSubsidyMoney = orderSettlement.PlatOrderGoodsDiscountMoney + orderSettlement.PlatSkuGoodsDiscountMoney - } + updateOrderBySettleMent(order, orderSettlement) } // if orderMap, err = api.JdAPI.QuerySingleOrder(orderID); err == nil { // globals.SugarLogger.Debugf("jd getOrder2 orderID:%s", orderID) diff --git a/controllers/jx_order.go b/controllers/jx_order.go index 168c51985..bf2c872d2 100644 --- a/controllers/jx_order.go +++ b/controllers/jx_order.go @@ -437,6 +437,26 @@ func (c *OrderController) RefreshOrderRealMobile() { }) } +// @Title 刷新订单平台结算信息 +// @Description 刷新订单平台结算信息 +// @Param token header string true "认证token" +// @Param fromTime formData string true "起始时间" +// @Param toTime formData string false "结束时间" +// @Param isAsync formData bool true "是否异步操作" +// @Param isContinueWhenError formData bool false "单个同步失败是否继续,缺省false" +// @Success 200 {object} controllers.CallResult +// @Failure 200 {object} controllers.CallResult +// @router /RefreshOrderFinancial [put] +func (c *OrderController) RefreshOrderFinancial() { + c.callRefreshOrderFinancial(func(params *tOrderRefreshOrderFinancialParams) (retVal interface{}, errCode string, err error) { + timeList, err2 := jxutils.BatchStr2Time(params.FromTime, params.ToTime) + if err = err2; err == nil { + retVal, err = misc.RefreshOrderFinancial(params.Ctx, timeList[0], timeList[1], params.IsAsync, params.IsContinueWhenError) + } + return retVal, "", err + }) +} + // @Title 设置订单打印状态 // @Description 同步商家SKU类别 // @Param token header string true "认证token" diff --git a/routers/commentsRouter_controllers.go b/routers/commentsRouter_controllers.go index 82f7e70ae..b0c9f0c33 100644 --- a/routers/commentsRouter_controllers.go +++ b/routers/commentsRouter_controllers.go @@ -772,6 +772,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: "RefreshOrderFinancial", + Router: `/RefreshOrderFinancial`, + AllowHTTPMethods: []string{"put"}, + 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: "RefreshOrderRealMobile", From a482cd6b12778fedb561487263342012561734b8 Mon Sep 17 00:00:00 2001 From: gazebo Date: Fri, 21 Jun 2019 16:16:48 +0800 Subject: [PATCH 18/26] =?UTF-8?q?-=20ebai=E5=95=86=E5=93=81=E5=AE=8C?= =?UTF-8?q?=E5=85=A8=E4=BD=BF=E7=94=A8=E7=A7=81=E8=87=AA=E7=BC=96=E7=A0=81?= =?UTF-8?q?=E7=9A=84UPC=EF=BC=8C=E5=8D=B3=E4=BD=BF=E5=A1=AB=E4=BA=86?= =?UTF-8?q?=E7=9C=9F=E5=AE=9E=E7=9A=84=E4=B9=9F=E4=B8=8D=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- business/partner/purchase/ebai/store_sku.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/business/partner/purchase/ebai/store_sku.go b/business/partner/purchase/ebai/store_sku.go index 02f625644..2a6079c94 100644 --- a/business/partner/purchase/ebai/store_sku.go +++ b/business/partner/purchase/ebai/store_sku.go @@ -496,9 +496,9 @@ func genSkuParamsFromStoreSkuInfo(storeSku *tStoreSkuFullInfo) (params map[strin params["status"] = jxSkuStatus2Ebai(jxutils.MergeSkuStatus(storeSku.SkuStatus, storeSku.Status)) } // todo 饿百如果给的UPC是空要报错,但如果我要删除UPC怎么弄? - if storeSku.Upc != "" { - params["upc"] = storeSku.Upc - } + // if storeSku.Upc != "" { + // params["upc"] = storeSku.Upc + // } return params } From 945c5285ddc8887b6f51e4ca54f6f06cd68774d3 Mon Sep 17 00:00:00 2001 From: gazebo Date: Fri, 21 Jun 2019 16:26:13 +0800 Subject: [PATCH 19/26] =?UTF-8?q?-=20SyncStoresSkus=E5=BC=BA=E5=88=B6?= =?UTF-8?q?=E6=9B=B4=E6=96=B0=E6=A0=87=E5=BF=97=E4=BB=8ESyncFlagModifiedMa?= =?UTF-8?q?sk=E6=94=B9=E4=B8=BASyncFlagStoreSkuModifiedMask?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- business/jxstore/cms/sync.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/business/jxstore/cms/sync.go b/business/jxstore/cms/sync.go index d9a7ce333..9172e46cd 100644 --- a/business/jxstore/cms/sync.go +++ b/business/jxstore/cms/sync.go @@ -400,7 +400,7 @@ func (v *VendorSync) SyncStoresSkus(ctx *jxcontext.Context, db *dao.DaoDB, vendo loopMapInfo := batchItemList[0].(*LoopStoreMapInfo) if handler := v.GetStoreHandler(loopMapInfo.VendorID); handler != nil { if isForce { - dao.SetStoreSkuSyncStatus(db, loopMapInfo.VendorID, storeIDs, skuIDs, model.SyncFlagModifiedMask) + dao.SetStoreSkuSyncStatus(db, loopMapInfo.VendorID, storeIDs, skuIDs, model.SyncFlagStoreSkuModifiedMask) } if len(loopMapInfo.StoreMapList) > 1 { var loopStoreTask tasksch.ITask From bbf381834ff80ddd4675c1a17554e49c0b9baee2 Mon Sep 17 00:00:00 2001 From: gazebo Date: Fri, 21 Jun 2019 21:15:54 +0800 Subject: [PATCH 20/26] =?UTF-8?q?-=20=E7=A6=81=E7=94=A8=E4=BA=AC=E4=B8=9C?= =?UTF-8?q?=E9=97=A8=E5=BA=97=E4=BF=AE=E6=94=B9=E6=B6=88=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- business/partner/purchase/jd/store.go | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/business/partner/purchase/jd/store.go b/business/partner/purchase/jd/store.go index 34603eb9c..733a18d10 100644 --- a/business/partner/purchase/jd/store.go +++ b/business/partner/purchase/jd/store.go @@ -304,17 +304,17 @@ func (p *PurchaseHandler) GetStoreStatus(ctx *jxcontext.Context, vendorStoreID s // 当前京东的storeCrud消息不会在门店状态改变时发送,所以意义不大,先放在这里 func (c *PurchaseHandler) OnStoreMsg(msg *jdapi.CallbackOrderMsg) (response *jdapi.CallbackResponse) { var err error - if msg.StatusID == jdapi.StatusIDUpdateStore { - var storeStatus int - vendorStoreID := msg.BillID - if storeStatus, err = c.GetStoreStatus(jxcontext.AdminCtx, vendorStoreID); err == nil { - err = partner.CurStoreManager.OnStoreStatusChanged(vendorStoreID, model.VendorIDJD, storeStatus) - } else { - // 可能在门店删除的情况下会出查不到门店的错误 - if errExt, ok := err.(*utils.ErrorWithCode); ok && errExt.IntCode() == 4 { - err = nil - } - } - } + // if msg.StatusID == jdapi.StatusIDUpdateStore { + // var storeStatus int + // vendorStoreID := msg.BillID + // if storeStatus, err = c.GetStoreStatus(jxcontext.AdminCtx, vendorStoreID); err == nil { + // err = partner.CurStoreManager.OnStoreStatusChanged(vendorStoreID, model.VendorIDJD, storeStatus) + // } else { + // // 可能在门店删除的情况下会出查不到门店的错误 + // if errExt, ok := err.(*utils.ErrorWithCode); ok && errExt.IntCode() == 4 { + // err = nil + // } + // } + // } return jdapi.Err2CallbackResponse(err, "") } From 1c9e3acd0f2ffb6be45d3e27e78fea6979403ee7 Mon Sep 17 00:00:00 2001 From: gazebo Date: Sat, 22 Jun 2019 01:16:59 +0800 Subject: [PATCH 21/26] =?UTF-8?q?-=20=E4=BF=AE=E5=A4=8DupdateStoreSkusSale?= =?UTF-8?q?WithoutSync=E4=B8=AD=E6=9B=B4=E6=96=B0StoreSkuBind=E7=9A=84?= =?UTF-8?q?=E9=94=99=E8=AF=AF=EF=BC=88=E5=BA=94=E8=AF=A5=E5=85=88=E8=AF=BB?= =?UTF-8?q?=E5=86=8D=E5=AD=98=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- business/jxstore/cms/store_sku.go | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/business/jxstore/cms/store_sku.go b/business/jxstore/cms/store_sku.go index fd1f8c39d..ac35c57eb 100644 --- a/business/jxstore/cms/store_sku.go +++ b/business/jxstore/cms/store_sku.go @@ -918,6 +918,13 @@ func updateStoreSkusSaleWithoutSync(ctx *jxcontext.Context, storeID int, skuBind var num int64 db := dao.GetDB() needSyncIDMap := make(map[int]int) + skuIDMap := make(map[int]int) + skuBindSkuInfosMap := make(map[int]*StoreSkuBindSkuInfo) + for _, v := range skuBindSkuInfos { + skuIDMap[v.SkuID] = 1 + skuBindSkuInfosMap[v.SkuID] = v + } + dao.Begin(db) defer func() { if r := recover(); r != nil { @@ -925,9 +932,13 @@ func updateStoreSkusSaleWithoutSync(ctx *jxcontext.Context, storeID int, skuBind panic(r) } }() - for _, v := range skuBindSkuInfos { - if v.IsSale != 0 { - skuBind := &model.StoreSkuBind{} + storeSkuList, err := dao.GetStoresSkusInfo(db, []int{storeID}, jxutils.IntMap2List(skuIDMap)) + if err != nil { + dao.Rollback(db) + return nil, err + } + for _, skuBind := range storeSkuList { + if v := skuBindSkuInfosMap[skuBind.SkuID]; v != nil && v.IsSale != 0 { if v.IsSale == 1 { skuBind.Status = model.StoreSkuBindStatusNormal } else { @@ -940,10 +951,7 @@ func updateStoreSkusSaleWithoutSync(ctx *jxcontext.Context, storeID int, skuBind model.FieldMtwmSyncStatus: skuBind.MtwmSyncStatus | model.SyncFlagSaleMask, model.FieldElmSyncStatus: skuBind.ElmSyncStatus | model.SyncFlagSaleMask, model.FieldWscSyncStatus: skuBind.WscSyncStatus | model.SyncFlagSaleMask, - }, userName, map[string]interface{}{ - model.FieldStoreID: storeID, - model.FieldSkuID: v.SkuID, - }); err != nil { + }, userName, nil); err != nil { dao.Rollback(db) return nil, err } From b536d7a01a029f16a2ed3389c584a39f01268be2 Mon Sep 17 00:00:00 2001 From: gazebo Date: Sat, 22 Jun 2019 17:25:08 +0800 Subject: [PATCH 22/26] =?UTF-8?q?-=20service=E6=9C=8D=E5=8A=A1=E5=90=AF?= =?UTF-8?q?=E5=8A=A8=E6=96=87=E4=BB=B6=E5=8A=A0=E5=A4=A7=E6=89=93=E5=BC=80?= =?UTF-8?q?=E6=96=87=E4=BB=B6=E6=95=B0=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- deploy/jx-callback.service | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/deploy/jx-callback.service b/deploy/jx-callback.service index 2a9415345..611ba39b7 100644 --- a/deploy/jx-callback.service +++ b/deploy/jx-callback.service @@ -5,6 +5,10 @@ After=network.target After=mysql.service [Service] +LimitCORE=infinity +LimitNOFILE=100000 +LimitNPROC=100000 + Environment="GOPATH=/home/ubuntu/go/" Type=simple User=ubuntu From c3feea5ff4c4cc7ad745807ea5ff519c0c071e69 Mon Sep 17 00:00:00 2001 From: gazebo Date: Sat, 22 Jun 2019 18:18:25 +0800 Subject: [PATCH 23/26] =?UTF-8?q?-=20GetStoresSkus=E4=B8=AD=E8=BF=94?= =?UTF-8?q?=E5=9B=9ErealEarningPrice?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- business/jxstore/cms/store_sku.go | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/business/jxstore/cms/store_sku.go b/business/jxstore/cms/store_sku.go index ac35c57eb..b381ea969 100644 --- a/business/jxstore/cms/store_sku.go +++ b/business/jxstore/cms/store_sku.go @@ -45,6 +45,8 @@ type StoreSkuNameExt struct { PendingOpType int8 `json:"pendingOpType"` // 取值同 StoreOpRequest.Type PendingUnitPrice int `json:"pendingUnitPrice"` // 这个是待审核的价格申请 + + PayPercentage int `json:"-"` } // GetStoreSkus用 @@ -256,7 +258,8 @@ func GetStoresSkus(ctx *jxcontext.Context, storeIDs []int, isFocus bool, keyword t1.img, t1.elm_img_hash_code, t3.id, - t3.name` + t3.name, + t3.pay_percentage` if isBySku { sql += `, t2.id` @@ -280,6 +283,7 @@ func GetStoresSkus(ctx *jxcontext.Context, storeIDs []int, isFocus bool, keyword t1.elm_img_hash_code, t3.id store_id, t3.name store_name, + t3.pay_percentage, CONCAT("[", GROUP_CONCAT(DISTINCT CONCAT('{"id":', t2.id, ',"comment":"', t2.comment, '","status":', t2.status, ',"createdAt":"', CONCAT(REPLACE(IF(t4.created_at IS NULL, '1970-01-01 00:00:00', t4.created_at)," ","T"),"+08:00"), '","updatedAt":"', CONCAT(REPLACE(IF(t4.updated_at IS NULL, '1970-01-01 00:00:00', t4.updated_at)," ","T"),"+08:00"), '","lastOperator":"', IF(t4.last_operator IS NULL, '', t4.last_operator), '","specQuality":', t2.spec_quality, ',"specUnit":"', t2.spec_unit, '","weight":', t2.weight, @@ -344,11 +348,20 @@ func GetStoresSkus(ctx *jxcontext.Context, storeIDs []int, isFocus bool, keyword } else { v["actPrice"] = 0 } + + earningPrice := 0 if jxSkuPriceMap[index] != nil { - v["earningPrice"] = jxSkuPriceMap[index].EarningPrice - } else { - v["earningPrice"] = 0 + earningPrice = jxSkuPriceMap[index].EarningPrice } + v["earningPrice"] = earningPrice + + realEarningPrice := earningPrice + if realEarningPrice == 0 { + shopPrice := utils.Interface2Int64WithDefault(v["price"], 0) + realEarningPrice = int(jxutils.CaculateSkuEarningPrice(shopPrice, shopPrice, skuName.PayPercentage)) + } + v["realEarningPrice"] = realEarningPrice + delete(v, "unitPrice") } } else { From c3119f4932c09f9a4c826212badea925e2323f77 Mon Sep 17 00:00:00 2001 From: gazebo Date: Sat, 22 Jun 2019 20:44:35 +0800 Subject: [PATCH 24/26] =?UTF-8?q?-=20=E9=87=8D=E6=9E=84GetStoresSkus?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- business/jxstore/cms/store_sku.go | 62 ++++++++++++++++++------------- controllers/cms_store_sku.go | 11 ++++-- 2 files changed, 43 insertions(+), 30 deletions(-) diff --git a/business/jxstore/cms/store_sku.go b/business/jxstore/cms/store_sku.go index b381ea969..ac000d4a2 100644 --- a/business/jxstore/cms/store_sku.go +++ b/business/jxstore/cms/store_sku.go @@ -105,23 +105,24 @@ const ( maxStoreNameBind2 = 10000 // 最大门店乘SkuName个数 ) -func GetStoreSkus(ctx *jxcontext.Context, storeID int, isFocus bool, keyword string, isBySku bool, params map[string]interface{}, offset, pageSize int) (skuNamesInfo *StoreSkuNamesInfo, err error) { - return GetStoresSkus(ctx, []int{storeID}, isFocus, keyword, isBySku, params, offset, pageSize) +func GetStoreSkus(ctx *jxcontext.Context, storeID int, skuIDs []int, isFocus bool, keyword string, isBySku bool, params map[string]interface{}, offset, pageSize int) (skuNamesInfo *StoreSkuNamesInfo, err error) { + return GetStoresSkus(ctx, []int{storeID}, skuIDs, isFocus, keyword, isBySku, params, offset, pageSize) } -// 商品不可售,直接排除 -// 如果门店商品是可售状态,那么会忽略区域限制。否则有区域限制 -func GetStoresSkus(ctx *jxcontext.Context, storeIDs []int, isFocus bool, keyword string, isBySku bool, params map[string]interface{}, offset, pageSize int) (skuNamesInfo *StoreSkuNamesInfo, err error) { - db := dao.GetDB() - sql := ` +func getGetStoresSkusBaseSQL(db *dao.DaoDB, storeIDs, skuIDs []int, isFocus bool, keyword string, isBySku bool, params map[string]interface{}) (sql string, sqlParams []interface{}, err error) { + sql = ` FROM sku_name t1 JOIN sku t2 ON t1.id = t2.name_id AND t2.deleted_at = ?/* AND t2.status = ?*/ - JOIN store t3 ON t3.id IN (` + dao.GenQuestionMarks(len(storeIDs)) + `) - LEFT JOIN store_sku_bind t4 ON t4.sku_id = t2.id AND t4.deleted_at = ? AND t4.store_id = t3.id + JOIN store t3 ON t3.id IN (` + dao.GenQuestionMarks(len(storeIDs)) + `)` + if !isFocus { + sql += " LEFT" + } + sql += ` + JOIN store_sku_bind t4 ON t4.sku_id = t2.id AND t4.deleted_at = ? AND t4.store_id = t3.id LEFT JOIN sku_name_place_bind t5 ON t1.id = t5.name_id AND t3.city_code = t5.place_code WHERE t1.deleted_at = ? AND (t1.is_global = 1 OR t5.id IS NOT NULL OR 1 = ?)/* AND t1.status = ?*/ ` - sqlParams := []interface{}{ + sqlParams = []interface{}{ utils.DefaultTimeValue, // model.SkuStatusNormal, storeIDs, @@ -131,10 +132,10 @@ func GetStoresSkus(ctx *jxcontext.Context, storeIDs []int, isFocus bool, keyword // model.SkuStatusNormal, } if isFocus { - sql += " AND t4.sku_id IS NOT NULL AND ((t2.status = ? AND t1.status = ?) OR t4.status = ?)" + sql += " AND ((t2.status = ? AND t1.status = ?) OR t4.status = ?)" sqlParams = append(sqlParams, model.SkuStatusNormal, model.SkuStatusNormal, model.SkuStatusNormal) } else { - sql += " AND t4.sku_id IS NULL AND t2.status = ? AND t1.status = ?" + sql += " AND t4.sku_id IS NULL AND (t2.status = ? AND t1.status = ?)" sqlParams = append(sqlParams, model.SkuStatusNormal, model.SkuStatusNormal) } if keyword != "" { @@ -143,8 +144,12 @@ func GetStoresSkus(ctx *jxcontext.Context, storeIDs []int, isFocus bool, keyword sqlParams = append(sqlParams, keywordLike, keywordLike, keywordLike, keywordLike) if keywordInt64, err2 := strconv.ParseInt(keyword, 10, 64); err2 == nil { - sql += " OR t1.id = ? OR t2.id = ? OR t2.jd_id = ? OR t4.ebai_id = ? OR t4.mtwm_id = ?" - sqlParams = append(sqlParams, keywordInt64, keywordInt64, keywordInt64, keywordInt64, keywordInt64) + sql += " OR t1.id = ? OR t2.id = ? OR t2.jd_id = ?" + sqlParams = append(sqlParams, keywordInt64, keywordInt64, keywordInt64) + if isFocus { + sql += " OR t4.ebai_id = ? OR t4.mtwm_id = ?" + sqlParams = append(sqlParams, keywordInt64, keywordInt64) + } } sql += ")" } @@ -156,7 +161,7 @@ func GetStoresSkus(ctx *jxcontext.Context, storeIDs []int, isFocus bool, keyword if params["nameIDs"] != nil { var nameIDs []int if err = utils.UnmarshalUseNumber([]byte(params["nameIDs"].(string)), &nameIDs); err != nil { - return nil, err + return "", nil, err } if len(nameIDs) > 0 { sql += " AND t1.id IN (" + dao.GenQuestionMarks(len(nameIDs)) + ")" @@ -167,7 +172,7 @@ func GetStoresSkus(ctx *jxcontext.Context, storeIDs []int, isFocus bool, keyword cat := &model.SkuCategory{} cat.ID = params["categoryID"].(int) if err = dao.GetEntity(db, cat); err != nil { - return nil, err + return "", nil, err } sql += " AND (t1.category_id = ?" sqlParams = append(sqlParams, cat.ID) @@ -193,15 +198,9 @@ func GetStoresSkus(ctx *jxcontext.Context, storeIDs []int, isFocus bool, keyword sql += " AND t1.unit = ?" sqlParams = append(sqlParams, params["unit"].(string)) } - var skuIDs []int - if params["skuIDs"] != nil { - if err = utils.UnmarshalUseNumber([]byte(params["skuIDs"].(string)), &skuIDs); err != nil { - return nil, err - } - if len(skuIDs) > 0 { - sql += " AND t2.id IN (" + dao.GenQuestionMarks(len(skuIDs)) + ")" - sqlParams = append(sqlParams, skuIDs) - } + if len(skuIDs) > 0 { + sql += " AND t2.id IN (" + dao.GenQuestionMarks(len(skuIDs)) + ")" + sqlParams = append(sqlParams, skuIDs) } else if params["skuID"] != nil { skuID, ok := params["skuID"].(int) if ok { @@ -223,7 +222,7 @@ func GetStoresSkus(ctx *jxcontext.Context, storeIDs []int, isFocus bool, keyword if params["jdSyncStatus"] != nil || params["ebaiSyncStatus"] != nil || params["mtwmSyncStatus"] != nil { realVendorMap, err2 := getValidStoreVendorMap(db, storeIDs) if err = err2; err != nil { - return nil, err + return "", nil, err } sql += " AND ( 1 = 0" if params["jdSyncStatus"] != nil && realVendorMap[model.VendorIDJD] == 1 { @@ -241,6 +240,17 @@ func GetStoresSkus(ctx *jxcontext.Context, storeIDs []int, isFocus bool, keyword sql += ")" } } + return sql, sqlParams, err +} + +// 商品不可售,直接排除 +// 如果门店商品是可售状态,那么会忽略区域限制。否则有区域限制 +func GetStoresSkus(ctx *jxcontext.Context, storeIDs, skuIDs []int, isFocus bool, keyword string, isBySku bool, params map[string]interface{}, offset, pageSize int) (skuNamesInfo *StoreSkuNamesInfo, err error) { + db := dao.GetDB() + sql, sqlParams, err := getGetStoresSkusBaseSQL(db, storeIDs, skuIDs, isFocus, keyword, isBySku, params) + if err != nil { + return nil, err + } sql += ` GROUP BY t1.id, diff --git a/controllers/cms_store_sku.go b/controllers/cms_store_sku.go index 5b080ecd1..3299d8896 100644 --- a/controllers/cms_store_sku.go +++ b/controllers/cms_store_sku.go @@ -48,7 +48,10 @@ type StoreSkuController struct { // @router /GetStoreSkus [get] func (c *StoreSkuController) GetStoreSkus() { c.callGetStoreSkus(func(params *tStoreSkuGetStoreSkusParams) (retVal interface{}, errCode string, err error) { - retVal, err = cms.GetStoreSkus(params.Ctx, params.StoreID, params.IsFocus, params.Keyword, params.IsBySku, params.MapData, params.Offset, params.PageSize) + var skuIDs []int + if err = jxutils.Strings2Objs(params.SkuIDs, &skuIDs); err == nil { + retVal, err = cms.GetStoreSkus(params.Ctx, params.StoreID, skuIDs, params.IsFocus, params.Keyword, params.IsBySku, params.MapData, params.Offset, params.PageSize) + } return retVal, "", err }) } @@ -84,9 +87,9 @@ func (c *StoreSkuController) GetStoreSkus() { // @router /GetStoresSkus [get] func (c *StoreSkuController) GetStoresSkus() { c.callGetStoresSkus(func(params *tStoreSkuGetStoresSkusParams) (retVal interface{}, errCode string, err error) { - var storeIDs []int - if err = jxutils.Strings2Objs(params.StoreIDs, &storeIDs); err == nil { - retVal, err = cms.GetStoresSkus(params.Ctx, storeIDs, params.IsFocus, params.Keyword, params.IsBySku, params.MapData, params.Offset, params.PageSize) + var storeIDs, skuIDs []int + if err = jxutils.Strings2Objs(params.StoreIDs, &storeIDs, params.SkuIDs, &skuIDs); err == nil { + retVal, err = cms.GetStoresSkus(params.Ctx, storeIDs, skuIDs, params.IsFocus, params.Keyword, params.IsBySku, params.MapData, params.Offset, params.PageSize) } return retVal, "", err }) From ec891581ce34706ee92bbe176b65208207cdd203 Mon Sep 17 00:00:00 2001 From: gazebo Date: Sun, 23 Jun 2019 10:03:35 +0800 Subject: [PATCH 25/26] + tSkuInfo --- business/jxstore/cms/store_sku.go | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/business/jxstore/cms/store_sku.go b/business/jxstore/cms/store_sku.go index ac000d4a2..f282dcb2a 100644 --- a/business/jxstore/cms/store_sku.go +++ b/business/jxstore/cms/store_sku.go @@ -100,6 +100,32 @@ type StoreOpRequestInfo struct { UnitPrice int `json:"unitPrice"` } +// 待用于新的GetStoresSkus实现 +type tSkuInfo struct { + ID int `orm:"column(sku_id)" json:"id"` + CreatedAt time.Time `orm:"auto_now_add;type(datetime)" json:"createdAt"` + UpdatedAt time.Time `orm:"auto_now;type(datetime)" json:"updatedAt"` + LastOperator string `orm:"size(32)" json:"lastOperator"` // 最后操作员 + DeletedAt time.Time `orm:"type(datetime);default('1970-01-01 00:00:00')" json:"deletedAt"` + + CategoryID int `orm:"column(category_id)" json:"categoryID"` // 特殊类别,一般用于秒杀,特价之类的特殊类别 + NameID int `orm:"column(name_id)" json:"nameID"` // todo 这个索引应该要求唯一 + SkuIndex int `json:"-"` + Comment string `orm:"size(255)" json:"comment"` + SpecQuality float32 `json:"specQuality"` + SpecUnit string `orm:"size(8)" json:"specUnit"` // 质量或容量 + Weight int `json:"weight"` // 重量/质量,单位为克,当相应的SkuName的SpecUnit为g或kg时,必须等于SpecQuality + Status int `json:"status"` + + JdID int64 `orm:"column(jd_id);null;index" json:"jdID"` + EbaiID int64 `orm:"column(ebai_id);index"` + MtwmID string `orm:"column(mtwm_id);index;size(16)"` // 美团外卖没有ID,保存名字 + + JdSyncStatus int8 `orm:"default(2)" json:"jdSyncStatus"` + EbaiSyncStatus int8 `orm:"default(2)"` + MtwmSyncStatus int8 `orm:"default(2)"` +} + const ( maxStoreNameBind = 3000 // 最大门店SkuName bind个数 maxStoreNameBind2 = 10000 // 最大门店乘SkuName个数 From 594aa3e6b7317d431cd9737c26e1bed7f2f9d42d Mon Sep 17 00:00:00 2001 From: gazebo Date: Sun, 23 Jun 2019 21:06:41 +0800 Subject: [PATCH 26/26] =?UTF-8?q?-=20=E9=87=8D=E6=9E=84=E6=96=B0=E4=BA=AC?= =?UTF-8?q?=E8=A5=BF=E6=B4=BB=E5=8A=A8=EF=BC=8C=E5=B9=B3=E5=8F=B0=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3=E5=AE=9A=E4=B8=BA=E7=AC=BC=E7=BB=9F=E7=9A=84SyncAct?= =?UTF-8?q?=EF=BC=8C=E4=BA=AC=E5=B9=B3=E5=8F=B0=E6=94=AF=E6=8C=81=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0=EF=BC=8C=E5=88=A0=E9=99=A4=E5=95=86=E5=93=81=EF=BC=8C?= =?UTF-8?q?=E6=9A=82=E4=B8=8D=E6=94=AF=E6=8C=81=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- business/jxstore/act/act.go | 437 +++++++++++--------- business/jxstore/act/act_test.go | 70 +++- business/model/act.go | 49 +-- business/model/dao/act.go | 39 +- business/model/dao/dao_bz.go | 28 ++ business/partner/partner.go | 2 +- business/partner/partner_act.go | 71 +++- business/partner/purchase/ebai/act.go | 118 +++--- business/partner/purchase/elm/act.go | 12 +- business/partner/purchase/jd/act.go | 172 ++++---- business/partner/purchase/mtwm/act.go | 86 +--- business/partner/purchase/weimob/wsc/act.go | 12 +- globals/beegodb/beegodb.go | 2 +- main.go | 1 + 14 files changed, 565 insertions(+), 534 deletions(-) diff --git a/business/jxstore/act/act.go b/business/jxstore/act/act.go index a4b2bd5a9..0063d2d76 100644 --- a/business/jxstore/act/act.go +++ b/business/jxstore/act/act.go @@ -1,15 +1,13 @@ package act import ( - "fmt" "time" - "git.rosy.net.cn/baseapi/utils" "git.rosy.net.cn/jx-callback/business/jxutils" "git.rosy.net.cn/jx-callback/business/partner" + "git.rosy.net.cn/jx-callback/globals" "git.rosy.net.cn/jx-callback/business/jxutils/jxcontext" - "git.rosy.net.cn/jx-callback/business/jxutils/tasksch" "git.rosy.net.cn/jx-callback/business/model" "git.rosy.net.cn/jx-callback/business/model/dao" ) @@ -33,7 +31,8 @@ type ActDetail struct { model.Act2 } -func ActStoreSkuParam2Model(ctx *jxcontext.Context, act *model.Act, vendorIDs []int, actStoreSku []*ActStoreSkuParam) (actMapList []*model.ActMap, actStoreMapList []*model.ActStoreMap, actStoreSkuList []*model.ActStoreSku, actStoreSkuMapList []*model.ActStoreSkuMap, err error) { +func ActStoreSkuParam2Model(ctx *jxcontext.Context, db *dao.DaoDB, act *model.Act, vendorIDs []int, actStoreSku []*ActStoreSkuParam) (validVendorIDs []int, actStoreSkuList []*model.ActStoreSku, actStoreSkuMapList []*model.ActStoreSkuMap, err error) { + wholeValidVendorMap := make(map[int]int) if len(actStoreSku) > 0 { storeIDMap := make(map[int]int) skuIDMap := make(map[int]int) @@ -43,18 +42,16 @@ func ActStoreSkuParam2Model(ctx *jxcontext.Context, act *model.Act, vendorIDs [] skuIDMap[v.SkuID] = 1 storeSkuParamMap[v.StoreID] = append(storeSkuParamMap[v.StoreID], v) } - db := dao.GetDB() storeSkuList, err2 := dao.GetStoresSkusInfo(db, jxutils.IntMap2List(storeIDMap), jxutils.IntMap2List(skuIDMap)) if err = err2; err != nil { - return nil, nil, nil, nil, err + return nil, nil, nil, err } storeSkuMap := make(map[int64]*model.StoreSkuBind) for _, v := range storeSkuList { storeSkuMap[jxutils.Combine2Int(v.StoreID, v.SkuID)] = v } - wholeValidVendorMap := make(map[int]int) for storeID, oneStoreSkuParam := range storeSkuParamMap { validVendorMap := make(map[int]int) validSkuMap := make(map[int]int) @@ -87,15 +84,16 @@ func ActStoreSkuParam2Model(ctx *jxcontext.Context, act *model.Act, vendorIDs [] actStoreSkuMapList = append(actStoreSkuMapList, actSkuMap) } } + wholeValidVendorMap[vendorID] = 1 } else if !dao.IsNoRowsError(err) { - return nil, nil, nil, nil, err + return nil, nil, nil, err } else { err = nil } } for _, v := range oneStoreSkuParam { - if validSkuMap[v.SkuID] == 1 { + if validSkuMap[v.SkuID] == 1 { // todo 这里是否需要判断 if storeSkuInfo := storeSkuMap[jxutils.Combine2Int(v.StoreID, v.SkuID)]; storeSkuInfo != nil { storeSku := &v.ActStoreSku storeSku.ActID = act.ID @@ -105,40 +103,12 @@ func ActStoreSkuParam2Model(ctx *jxcontext.Context, act *model.Act, vendorIDs [] } } } - for vendorID := range validVendorMap { - wholeValidVendorMap[vendorID] = 1 - actStoreMap := &model.ActStoreMap{ - ActID: act.ID, - StoreID: storeID, - VendorID: vendorID, - - SyncStatus: model.SyncFlagNewMask, - } - dao.WrapAddIDCULDEntity(actStoreMap, ctx.GetUserName()) - actStoreMapList = append(actStoreMapList, actStoreMap) - } - } - for vendorID := range wholeValidVendorMap { - actMap := &model.ActMap{ - ActID: act.ID, - VendorID: vendorID, - - SyncStatus: model.SyncFlagNewMask, - } - dao.WrapAddIDCULDEntity(actMap, ctx.GetUserName()) - actMapList = append(actMapList, actMap) } } - return actMapList, actStoreMapList, actStoreSkuList, actStoreSkuMapList, err + return jxutils.IntMap2List(wholeValidVendorMap), actStoreSkuList, actStoreSkuMapList, err } -func CreateAct(ctx *jxcontext.Context, act *model.Act, vendorIDs []int, actRules []*ActOrderRuleParam, actStoreSku []*ActStoreSkuParam) (actID int, err error) { - vendorIDMap := make(map[int]bool) - for _, v := range vendorIDs { - vendorIDMap[v] = true - } - db := dao.GetDB() - dao.WrapAddIDCULDEntity(act, ctx.GetUserName()) +func addActStoreBind(ctx *jxcontext.Context, db *dao.DaoDB, actStoreSkuList []*model.ActStoreSku, actStoreSkuMapList []*model.ActStoreSkuMap) (err error) { dao.Begin(db) defer func() { if r := recover(); r != nil { @@ -146,32 +116,108 @@ func CreateAct(ctx *jxcontext.Context, act *model.Act, vendorIDs []int, actRules panic(r) } }() - err = dao.CreateEntity(db, act) - if err != nil { - return 0, err + + storeSkuMap := make(map[int64]int) + for _, v := range actStoreSkuList { + err = dao.CreateEntity(db, v) + if err != nil { + dao.Rollback(db) + return err + } + storeSkuMap[jxutils.Combine2Int(v.StoreID, v.SkuID)] = v.ID } - actMapList, actStoreMapList, actStoreSkuList, actStoreSkuMapList, err := ActStoreSkuParam2Model(ctx, act, vendorIDs, actStoreSku) - if err != nil { - return 0, err + for _, v := range actStoreSkuMapList { + v.BindID = storeSkuMap[jxutils.Combine2Int(v.StoreID, v.SkuID)] } - isEmptyAct := true - for _, list := range []interface{}{ - actMapList, actStoreMapList, actStoreSkuList, actStoreSkuMapList, - } { - if len(utils.Interface2Slice(list)) > 0 { - err = dao.CreateMultiEntities(db, list) - if err != nil { - dao.Rollback(db) - return 0, err - } - isEmptyAct = false + + if len(actStoreSkuMapList) > 0 { + err = dao.CreateMultiEntities(db, actStoreSkuMapList) + if err != nil { + dao.Rollback(db) + return err } } - if isEmptyAct { + dao.Commit(db) + return err +} + +func AddActStoreBind(ctx *jxcontext.Context, actID int, actStoreSku []*ActStoreSkuParam) (err error) { + db := dao.GetDB() + var vendorIDs []int + actMap, err := dao.GetActVendorInfo(db, actID, nil) + if err != nil { + return err + } + for vendorID := range actMap { + vendorIDs = append(vendorIDs, vendorID) + } + var act *model.Act + if len(vendorIDs) > 0 { + act = &actMap[vendorIDs[0]].Act + } else { + act = &model.Act{} + act.ID = actID + if err = dao.GetEntity(db, act); err != nil { + return err + } + } + _, actStoreSkuList, actStoreSkuMapList, err := ActStoreSkuParam2Model(ctx, db, act, vendorIDs, actStoreSku) + if err != nil { + return err + } + + err = addActStoreBind(ctx, db, actStoreSkuList, actStoreSkuMapList) + return err +} + +func CreateAct(ctx *jxcontext.Context, act *model.Act, vendorIDs []int, actRules []*ActOrderRuleParam, actStoreSku []*ActStoreSkuParam) (actID int, err error) { + db := dao.GetDB() + + dao.Begin(db) + defer func() { + if r := recover(); r != nil { + dao.Rollback(db) + panic(r) + } + }() + + dao.WrapAddIDCULDEntity(act, ctx.GetUserName()) + err = dao.CreateEntity(db, act) + if err != nil { dao.Rollback(db) - return 0, fmt.Errorf("没有门店及SKU满足需求,空操作") + return 0, err + } + + validVendorIDs, actStoreSkuList, actStoreSkuMapList, err := ActStoreSkuParam2Model(ctx, db, act, vendorIDs, actStoreSku) + if err != nil { + return 0, err + } + + var actMapList []*model.ActMap + for vendorID := range validVendorIDs { + actMap := &model.ActMap{ + ActID: act.ID, + VendorID: vendorID, + + SyncStatus: model.SyncFlagNewMask, + } + dao.WrapAddIDCULDEntity(actMap, ctx.GetUserName()) + actMapList = append(actMapList, actMap) + } + if len(actMapList) > 0 { + err = dao.CreateMultiEntities(db, actMapList) + if err != nil { + dao.Rollback(db) + return 0, err + } + } + + if err = addActStoreBind(ctx, db, actStoreSkuList, actStoreSkuMapList); err != nil { + dao.Rollback(db) + return 0, err } dao.Commit(db) + actID = act.ID err = SyncAct(ctx, actID, nil, nil, nil) return actID, err @@ -185,18 +231,6 @@ func GetActDetail(ctx *jxcontext.Context, actID int) (actDetail *ActDetail, err return actDetail, err } -// func GetAcVendorInfo(ctx *jxcontext.Context, actID int) (err error) { -// return err -// } - -// func GetAcStoresVendorInfo(ctx *jxcontext.Context, actID int, storeIDs []int) (err error) { -// return err -// } - -// func GetAcStoresSkusVendorInfo(ctx *jxcontext.Context, actID int, storeIDs, skuIDs []int) (err error) { -// return err -// } - func UpdateAct(ctx *jxcontext.Context, act *model.Act, actRules []*ActOrderRuleParam, actStoreSku []*ActStoreSkuParam) (err error) { return err } @@ -214,27 +248,13 @@ func DeleteActStoreBind(ctx *jxcontext.Context, actID int, actStoreSku []*ActSto return deleteActStoreBind(ctx, dao.GetDB(), actID, actStoreSku) } -func deleteActStoreBind(ctx *jxcontext.Context, db *dao.DaoDB, actID int, actStoreSku []*ActStoreSkuParam) (err error) { - storeIDMap := make(map[int]int) - skuIDMap := make(map[int]int) - actStoreSkuParamMap := make(map[int64]*ActStoreSkuParam) - for _, v := range actStoreSku { - storeIDMap[v.StoreID] = 1 - skuIDMap[v.SkuID] = 1 - actStoreSkuParamMap[jxutils.Combine2Int(v.StoreID, v.SkuID)] = v - } - storeIDs := jxutils.IntMap2List(storeIDMap) - skuIDs := jxutils.IntMap2List(skuIDMap) - +func deleteActStoreBind(ctx *jxcontext.Context, db *dao.DaoDB, actID int, actStoreSkuParam []*ActStoreSkuParam) (err error) { actMap, err := dao.GetActVendorInfo(db, actID, nil) if err != nil { return err } - actStoreMap, err := dao.GetActStoreVendorInfo(db, actID, nil, storeIDs) - if err != nil { - return err - } - actStoreSkuMap, err := dao.GetActStoreSkuVendorInfo(db, actID, nil, storeIDs, skuIDs) + + actStoreSkuMap, err := dao.GetActStoreSkuVendorInfo(db, actID, nil, nil, nil) if err != nil { return err } @@ -248,50 +268,66 @@ func deleteActStoreBind(ctx *jxcontext.Context, db *dao.DaoDB, actID int, actSto } }() + actStoreSkuParamMap := make(map[int64]*ActStoreSkuParam) + for _, v := range actStoreSkuParam { + actStoreSkuParamMap[jxutils.Combine2Int(v.StoreID, v.SkuID)] = v + if _, err = dao.DeleteEntityLogically(db, &model.ActStoreSku{}, nil, ctx.GetUserName(), + map[string]interface{}{ + model.FieldActID: actID, + model.FieldStoreID: v.StoreID, + model.FieldSkuID: v.SkuID, + }); err != nil { + return err + } + } + isNeedCancelAct := true for vendorID, act := range actMap { - actStoreMap := partner.SplitActStore(actStoreMap[vendorID]) + isDeleteAll := true + isDeleteAtLeastOne := false actStoreSkuMap := partner.SplitActStoreSku(actStoreSkuMap[vendorID]) - isStoreAllDeleted := true - for _, actStore := range actStoreMap { - isStoreSkuAllDeleted := true - for _, actStoreSku := range actStoreSkuMap[actStore.StoreID] { - if actStoreSku == nil || actStoreSkuParamMap[jxutils.Combine2Int(actStoreSku.StoreID, actStoreSku.SkuID)] != nil { - if _, err = dao.UpdateEntityLogically(db, partner.ActStoreSku2ActStoreSkuMap(actStoreSku), map[string]interface{}{ - model.FieldSyncStatus: actStoreSku.SyncStatus | model.SyncFlagDeletedMask, - }, ctx.GetUserName(), nil); err != nil { + for storeID := range actStoreSkuMap { + for _, actStoreSku := range actStoreSkuMap[storeID] { + if actStoreSkuParam == nil || actStoreSkuParamMap[jxutils.Combine2Int(actStoreSku.StoreID, actStoreSku.SkuID)] != nil { + if _, err = dao.UpdateEntityLogically(db, partner.ActStoreSku2ActStoreSkuMap(actStoreSku), + map[string]interface{}{ + model.FieldSyncStatus: actStoreSku.SyncStatus | model.SyncFlagDeletedMask, + }, ctx.GetUserName(), nil); err != nil { return err } + isDeleteAtLeastOne = true } else { - isStoreSkuAllDeleted = false + isNeedCancelAct = false + isDeleteAll = false } } - if isStoreSkuAllDeleted { - if _, err = dao.UpdateEntityLogically(db, partner.ActStore2ActStoreMap(actStore), map[string]interface{}{ - model.FieldSyncStatus: actStore.SyncStatus | model.SyncFlagDeletedMask, - }, ctx.GetUserName(), nil); err != nil { - return err - } - } else { - isStoreAllDeleted = false - isNeedCancelAct = false - } } - - if isStoreAllDeleted { - if _, err = dao.UpdateEntityLogically(db, partner.Act2ActMap(act), map[string]interface{}{ - model.FieldSyncStatus: act.SyncStatus | model.SyncFlagDeletedMask, - }, ctx.GetUserName(), nil); err != nil { + if isDeleteAll || isDeleteAtLeastOne { + // globals.SugarLogger.Debugf("isDeleteAll:%t", isDeleteAll) + syncStatus := model.SyncFlagModifiedMask + if isDeleteAll { + syncStatus = model.SyncFlagDeletedMask + } + syncStatus |= act.SyncStatus + if _, err = dao.UpdateEntityLogically(db, partner.Act2ActMap(act), + map[string]interface{}{ + model.FieldSyncStatus: syncStatus, + }, ctx.GetUserName(), nil); err != nil { return err } } + if isDeleteAll != isNeedCancelAct { + globals.SugarLogger.Warnf("deleteActStoreBind, actID:%d isDeleteAll:%t != isNeedCancelAct:%t", act.ID, isDeleteAll, isNeedCancelAct) + } } + if isNeedCancelAct { act := &model.Act{} act.ID = actID - if _, err = dao.UpdateEntityLogically(db, act, map[string]interface{}{ - model.FieldStatus: model.ActStatusCanceled, - }, ctx.GetUserName(), nil); err != nil { + if _, err = dao.UpdateEntityLogically(db, act, + map[string]interface{}{ + model.FieldStatus: model.ActStatusCanceled, + }, ctx.GetUserName(), nil); err != nil { return err } } @@ -300,93 +336,110 @@ func deleteActStoreBind(ctx *jxcontext.Context, db *dao.DaoDB, actID int, actSto } func SyncAct(ctx *jxcontext.Context, actID int, vendorIDs, storeIDs, skuIDs []int) (err error) { - var actOrderRules []*model.ActOrderRule db := dao.GetDB() actMap, err := dao.GetActVendorInfo(db, actID, vendorIDs) if err != nil { return err } - actStoreMap, err := dao.GetActStoreVendorInfo(db, actID, vendorIDs, storeIDs) + actStoreSkuMap, err := dao.GetActStoreSkuVendorInfo(db, actID, nil, storeIDs, skuIDs) if err != nil { return err } - actStoreSkuMap, err := dao.GetActStoreSkuVendorInfo(db, actID, vendorIDs, storeIDs, skuIDs) - if err != nil { - return err - } - var realVendorIDs []int for vendorID := range actMap { - realVendorIDs = append(realVendorIDs, vendorID) - } - - task := tasksch.NewParallelTask("SyncAct", nil, ctx, - func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) { - vendorID := batchItemList[0].(int) - handler := partner.GetPurchasePlatformFromVendorID(vendorID) - if handler == nil { - err = fmt.Errorf("不被支持的vendorID:%d", vendorID) - } else { - act := actMap[vendorID] - actStore := actStoreMap[vendorID] - actStoreSku := actStoreSkuMap[vendorID] - // globals.SugarLogger.Debugf("%s", utils.Format4Output(act, false)) - // globals.SugarLogger.Debugf("%s", utils.Format4Output(actStore, false)) - // globals.SugarLogger.Debugf("%s", utils.Format4Output(actStoreSku, false)) - if act != nil && actStore != nil && actStoreSku != nil { - if model.IsSyncStatusNeedCreate(act.SyncStatus) { - err = handler.CreateAct(ctx, task, act, actOrderRules, actStore, actStoreSku) - } else if model.IsSyncStatusNeedUpdate(act.SyncStatus) { - if act.Status == model.ActStatusCanceled { - err = handler.CancelAct(ctx, task, act, actStore, actStoreSku) - } else { - // actStoreMap2Remove, actStoreMap2Add, actStoreMap2Update := splitActStore(actStore) - // err = handler.UpdateAct(ctx, task, act, actOrderRules, actStoreMap2Remove, actStoreMap2Add, actStoreMap2Update, actStoreSku) - } - } - if err == nil { - actMap := &model.ActMap{} - actMap.ID = act.MapID - dao.UpdateEntityLogically(db, actMap, map[string]interface{}{ - model.FieldSyncStatus: 0, - model.FieldVendorActID: act.VendorActID, - }, ctx.GetUserName(), nil) - for _, v := range actStore { - storeMap := model.ActStoreMap{} - storeMap.ID = v.MapID - dao.UpdateEntityLogically(db, storeMap, map[string]interface{}{ - model.FieldSyncStatus: 0, - model.FieldVendorActID: v.VendorActID, - }, ctx.GetUserName(), nil) - } - for _, v := range actStoreSku { - storeSkuMap := model.ActStoreSkuMap{} - storeSkuMap.ID = v.MapID - dao.UpdateEntityLogically(db, storeSkuMap, map[string]interface{}{ - model.FieldSyncStatus: 0, - model.FieldVendorActID: v.VendorActID, - }, ctx.GetUserName(), nil) - } - } - } + if handler := partner.GetPurchasePlatformFromVendorID(vendorID).(partner.IPurchasePlatformActHandler); handler != nil { + if err = handler.SyncAct(ctx, nil, actMap[vendorID], nil, actStoreSkuMap[vendorID]); err != nil { + return err } - return nil, err - }, realVendorIDs) - tasksch.ManageTask(task).Run() - _, err = task.GetResult(0) + } + } + return err + // var actOrderRules []*model.ActOrderRule + // db := dao.GetDB() + // actMap, err := dao.GetActVendorInfo(db, actID, vendorIDs) + // if err != nil { + // return err + // } + // actStoreMap, err := dao.GetActStoreVendorInfo(db, actID, vendorIDs, storeIDs) + // if err != nil { + // return err + // } + // actStoreSkuMap, err := dao.GetActStoreSkuVendorInfo(db, actID, vendorIDs, storeIDs, skuIDs) + // if err != nil { + // return err + // } + // var realVendorIDs []int + // for vendorID := range actMap { + // realVendorIDs = append(realVendorIDs, vendorID) + // } + + // task := tasksch.NewParallelTask("SyncAct", nil, ctx, + // func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) { + // vendorID := batchItemList[0].(int) + // handler := partner.GetPurchasePlatformFromVendorID(vendorID) + // if handler == nil { + // err = fmt.Errorf("不被支持的vendorID:%d", vendorID) + // } else { + // act := actMap[vendorID] + // actStore := actStoreMap[vendorID] + // actStoreSku := actStoreSkuMap[vendorID] + // // globals.SugarLogger.Debugf("%s", utils.Format4Output(act, false)) + // // globals.SugarLogger.Debugf("%s", utils.Format4Output(actStore, false)) + // // globals.SugarLogger.Debugf("%s", utils.Format4Output(actStoreSku, false)) + // if act != nil && actStore != nil && actStoreSku != nil { + // if model.IsSyncStatusNeedCreate(act.SyncStatus) { + // err = handler.CreateAct(ctx, task, act, actOrderRules, actStore, actStoreSku) + // } else if model.IsSyncStatusNeedUpdate(act.SyncStatus) { + // if act.Status == model.ActStatusCanceled { + // err = handler.CancelAct(ctx, task, act, actStore, actStoreSku) + // } else { + // // actStoreMap2Remove, actStoreMap2Add, actStoreMap2Update := splitActStore(actStore) + // // err = handler.UpdateAct(ctx, task, act, actOrderRules, actStoreMap2Remove, actStoreMap2Add, actStoreMap2Update, actStoreSku) + // } + // } + // if err == nil { + // actMap := &model.ActMap{} + // actMap.ID = act.MapID + // dao.UpdateEntityLogically(db, actMap, map[string]interface{}{ + // model.FieldSyncStatus: 0, + // model.FieldVendorActID: act.VendorActID, + // }, ctx.GetUserName(), nil) + // for _, v := range actStore { + // storeMap := model.ActStoreMap{} + // storeMap.ID = v.MapID + // dao.UpdateEntityLogically(db, storeMap, map[string]interface{}{ + // model.FieldSyncStatus: 0, + // model.FieldVendorActID: v.VendorActID, + // }, ctx.GetUserName(), nil) + // } + // for _, v := range actStoreSku { + // storeSkuMap := model.ActStoreSkuMap{} + // storeSkuMap.ID = v.MapID + // dao.UpdateEntityLogically(db, storeSkuMap, map[string]interface{}{ + // model.FieldSyncStatus: 0, + // model.FieldVendorActID: v.VendorActID, + // }, ctx.GetUserName(), nil) + // } + // } + // } + // } + // return nil, err + // }, realVendorIDs) + // tasksch.ManageTask(task).Run() + // _, err = task.GetResult(0) return err } -func splitActStore(actStore []*model.ActStore2) (actStoreMap2Remove, actStoreMap2Add, actStoreMap2Update []*model.ActStore2) { - for _, v := range actStore { - if model.IsSyncStatusNeedDelete(v.SyncStatus) { - if !dao.IsVendorThingIDEmpty(v.VendorActID) { - actStoreMap2Remove = append(actStoreMap2Remove, v) - } - } else if model.IsSyncStatusNeedCreate(v.SyncStatus) { - actStoreMap2Add = append(actStoreMap2Add, v) - } else if model.IsSyncStatusNeedUpdate(v.SyncStatus) { - actStoreMap2Update = append(actStoreMap2Update, v) - } - } - return actStoreMap2Remove, actStoreMap2Add, actStoreMap2Update -} +// func splitActStore(actStore []*model.ActStore2) (actStoreMap2Remove, actStoreMap2Add, actStoreMap2Update []*model.ActStore2) { +// for _, v := range actStore { +// if model.IsSyncStatusNeedDelete(v.SyncStatus) { +// if !dao.IsVendorThingIDEmpty(v.VendorActID) { +// actStoreMap2Remove = append(actStoreMap2Remove, v) +// } +// } else if model.IsSyncStatusNeedCreate(v.SyncStatus) { +// actStoreMap2Add = append(actStoreMap2Add, v) +// } else if model.IsSyncStatusNeedUpdate(v.SyncStatus) { +// actStoreMap2Update = append(actStoreMap2Update, v) +// } +// } +// return actStoreMap2Remove, actStoreMap2Add, actStoreMap2Update +// } diff --git a/business/jxstore/act/act_test.go b/business/jxstore/act/act_test.go index d93c7038f..00b860feb 100644 --- a/business/jxstore/act/act_test.go +++ b/business/jxstore/act/act_test.go @@ -21,15 +21,15 @@ func init() { func TestInitDb(t *testing.T) { dao.ExecuteSQL(dao.GetDB(), ` - DROP TABLE IF EXISTS act,act_map, act_order_rule, act_store_map, act_store_sku, act_store_sku_map; + DROP TABLE IF EXISTS act, act_map, act_order_rule, act_store_sku, act_store_sku_map; `) } func TestCreateAct(t *testing.T) { actID, err := CreateAct(jxcontext.AdminCtx, &model.Act{ - Name: "测试活动2", + Name: "测试活动", PricePercentage: 80, - }, []int{0, 1, 3}, nil, []*ActStoreSkuParam{ + }, []int{0}, nil, []*ActStoreSkuParam{ &ActStoreSkuParam{ ActStoreSku: model.ActStoreSku{ StoreID: 100119, @@ -68,6 +68,70 @@ func TestCancelAct(t *testing.T) { } } +func TestDeleteActStoreBind(t *testing.T) { + err := DeleteActStoreBind(jxcontext.AdminCtx, 1, []*ActStoreSkuParam{ + // &ActStoreSkuParam{ + // ActStoreSku: model.ActStoreSku{ + // StoreID: 100119, + // SkuID: 30828, + // }, + // }, + // &ActStoreSkuParam{ + // ActStoreSku: model.ActStoreSku{ + // StoreID: 100119, + // SkuID: 30827, + // }, + // }, + &ActStoreSkuParam{ + ActStoreSku: model.ActStoreSku{ + StoreID: 100118, + SkuID: 30592, + }, + }, + &ActStoreSkuParam{ + ActStoreSku: model.ActStoreSku{ + StoreID: 100118, + SkuID: 30565, + }, + }, + }) + if err != nil { + t.Fatal(err) + } +} + +func TestAddActStoreBind(t *testing.T) { + err := AddActStoreBind(jxcontext.AdminCtx, 1, []*ActStoreSkuParam{ + // &ActStoreSkuParam{ + // ActStoreSku: model.ActStoreSku{ + // StoreID: 100119, + // SkuID: 30828, + // }, + // }, + // &ActStoreSkuParam{ + // ActStoreSku: model.ActStoreSku{ + // StoreID: 100119, + // SkuID: 30827, + // }, + // }, + &ActStoreSkuParam{ + ActStoreSku: model.ActStoreSku{ + StoreID: 100118, + SkuID: 30592, + }, + }, + &ActStoreSkuParam{ + ActStoreSku: model.ActStoreSku{ + StoreID: 100118, + SkuID: 30565, + }, + }, + }) + if err != nil { + t.Fatal(err) + } +} + func TestSyncAct(t *testing.T) { err := SyncAct(jxcontext.AdminCtx, 1, nil, nil, nil) if err != nil { diff --git a/business/model/act.go b/business/model/act.go index f42d7df44..94af19ba3 100644 --- a/business/model/act.go +++ b/business/model/act.go @@ -48,6 +48,13 @@ type ActMap struct { SyncStatus int `orm:"default(2)" json:"syncStatus"` } +func (*ActMap) TableUnique() [][]string { + return [][]string{ + []string{"ActID", "VendorID", "DeletedAt"}, + } +} + +// 不建表 type Act2 struct { MapID int `orm:"column(map_id)"` @@ -66,32 +73,6 @@ type ActOrderRule struct { DeductPrice int64 `orm:"" json:"deductPrice"` // 减的价格 } -// type ActStore struct { -// ModelIDCULD - -// ActID int `orm:"column(act_id)" json:"actID"` -// StoreID int `orm:"column(store_id)" json:"storeID"` -// } - -type ActStoreMap struct { - ModelIDCULD - - ActID int `orm:"column(act_id)" json:"actID"` - StoreID int `orm:"column(store_id)" json:"storeID"` - VendorID int `orm:"column(vendor_id)" json:"vendorID"` - - VendorActID string `orm:"column(vendor_act_id);size(48)" json:"vendorActID"` - SyncStatus int `orm:"default(2)" json:"syncStatus"` -} - -type ActStore2 struct { - MapID int `orm:"column(map_id)"` - - ActStoreMap - - VendorStoreID string `orm:"column(vendor_store_id)" json:"vendorStoreID"` -} - type ActStoreSku struct { ModelIDCULD @@ -111,13 +92,14 @@ type ActStoreSku struct { func (*ActStoreSku) TableUnique() [][]string { return [][]string{ - []string{"ActID", "SkuID", "StoreID", "DeletedAt"}, + []string{"ActID", "StoreID", "SkuID", "DeletedAt"}, } } type ActStoreSkuMap struct { ModelIDCULD + BindID int `orm:"column(bind_id)" json:"bindID"` ActID int `orm:"column(act_id)" json:"actID"` StoreID int `orm:"column(store_id)" json:"storeID"` SkuID int `orm:"column(sku_id)" json:"skuID"` @@ -128,6 +110,19 @@ type ActStoreSkuMap struct { ActualActPrice int64 `orm:"" json:"actualActPrice"` // 单品级活动用,创建活动时商品的活动价格 } +func (*ActStoreSkuMap) TableUnique() [][]string { + return [][]string{ + []string{"ActID", "BindID", "VendorID"}, + } +} + +func (*ActStoreSkuMap) TableIndex() [][]string { + return [][]string{ + []string{"ActID", "StoreID", "SkuID", "VendorID", "DeletedAt"}, + } +} + +// 不建表 type ActStoreSku2 struct { MapID int `orm:"column(map_id)"` diff --git a/business/model/dao/act.go b/business/model/dao/act.go index 97b000667..d3a120fe4 100644 --- a/business/model/dao/act.go +++ b/business/model/dao/act.go @@ -32,38 +32,6 @@ func GetActVendorInfo(db *DaoDB, actID int, vendorIDs []int) (actMap map[int]*mo return actMap, err } -func GetActStoreVendorInfo(db *DaoDB, actID int, vendorIDs, storeIDs []int) (actStoreMap map[int][]*model.ActStore2, err error) { - sql := ` - SELECT t1.*, - t1.id map_id, - t2.vendor_store_id - FROM act_store_map t1 - JOIN store_map t2 ON t2.store_id = t1.store_id AND t2.vendor_id = t1.vendor_id AND t2.deleted_at = ? - WHERE t1.deleted_at = ? AND t1.act_id = ? - ` - sqlParams := []interface{}{ - utils.DefaultTimeValue, - utils.DefaultTimeValue, - actID, - } - if len(vendorIDs) > 0 { - sql += " AND t1.vendor_id IN (" + GenQuestionMarks(len(vendorIDs)) + ")" - sqlParams = append(sqlParams, vendorIDs) - } - if len(storeIDs) > 0 { - sql += " AND t1.store_id IN (" + GenQuestionMarks(len(storeIDs)) + ")" - sqlParams = append(sqlParams, storeIDs) - } - var actStoreList []*model.ActStore2 - if err = GetRows(db, &actStoreList, sql, sqlParams...); err == nil { - actStoreMap = make(map[int][]*model.ActStore2) - for _, v := range actStoreList { - actStoreMap[v.VendorID] = append(actStoreMap[v.VendorID], v) - } - } - return actStoreMap, err -} - func GetActStoreSkuVendorInfo(db *DaoDB, actID int, vendorIDs, storeIDs, skuIDs []int) (actStoreSkuMap map[int][]*model.ActStoreSku2, err error) { sql := ` SELECT t1.*, @@ -79,15 +47,14 @@ func GetActStoreSkuVendorInfo(db *DaoDB, actID int, vendorIDs, storeIDs, skuIDs ELSE '' END vendor_sku_id - FROM act_store_sku t1 - JOIN act_store_sku_map t2 ON t2.act_id = t1.act_id AND t2.sku_id = t1.sku_id AND t2.store_id = t1.store_id AND t2.deleted_at = ? + FROM act_store_sku_map t2 + JOIN act_store_sku t1 ON t1.id = t2.bind_id JOIN store_map t3 ON t3.store_id = t1.store_id AND t3.vendor_id = t2.vendor_id AND t3.deleted_at = ? JOIN sku t4 ON t4.id = t1.sku_id AND t4.deleted_at = ? JOIN store_sku_bind t5 ON t5.sku_id = t1.sku_id AND t5.store_id = t1.store_id AND t5.deleted_at = ? - WHERE t1.deleted_at = ? AND t1.act_id = ? + WHERE t2.deleted_at = ? AND t2.act_id = ? ` sqlParams := []interface{}{ - utils.DefaultTimeValue, utils.DefaultTimeValue, utils.DefaultTimeValue, utils.DefaultTimeValue, diff --git a/business/model/dao/dao_bz.go b/business/model/dao/dao_bz.go index e2ddbab3a..da1cb74e3 100644 --- a/business/model/dao/dao_bz.go +++ b/business/model/dao/dao_bz.go @@ -11,6 +11,11 @@ import ( "github.com/astaxie/beego/orm" ) +type KVUpdateItem struct { + Item interface{} + KVs map[string]interface{} +} + // 这里面的函数要求实体是IDCUDL的,即含有ID, UpdatedAt, LastOperator, DeletedAt字段 func GetEntitiesByKV(db *DaoDB, item interface{}, conditions map[string]interface{}, isIncludeDeleted bool) (err error) { @@ -57,6 +62,29 @@ func UpdateEntityByKV(db *DaoDB, item interface{}, kvs map[string]interface{}, c return num, err } +func BatchUpdateEntityByKV(db *DaoDB, items []*KVUpdateItem) (num int64, err error) { + if len(items) > 0 { + Begin(db) + defer func() { + if r := recover(); r != nil || err != nil { + Rollback(db) + if r != nil { + panic(r) + } + } + }() + for _, v := range items { + num2, err2 := UpdateEntityByKV(db, v.Item, v.KVs, nil) + if err = err2; err != nil { + return 0, err + } + num += num2 + } + Commit(db) + } + return num, nil +} + func UpdateEntityLogically(db *DaoDB, item interface{}, kvs map[string]interface{}, userName string, conditions map[string]interface{}) (num int64, err error) { if conditions != nil && refutil.IsFieldExist(item, model.FieldDeletedAt) { conditions = utils.MergeMaps(conditions, map[string]interface{}{ diff --git a/business/partner/partner.go b/business/partner/partner.go index 6e88e4211..25f96ccf0 100644 --- a/business/partner/partner.go +++ b/business/partner/partner.go @@ -172,7 +172,7 @@ type IStoreManager interface { // 所有非以Sync,Refresh开头的函数不用自己清理sync_status标记(VendorSync统一处理) type IPurchasePlatformHandler interface { - IPurchasePlatformPromotionHandler + IPurchasePlatformActHandler GetVendorID() int GetStatusFromVendorStatus(vendorStatus string) int diff --git a/business/partner/partner_act.go b/business/partner/partner_act.go index 1c7de58bc..c32fa3a7c 100644 --- a/business/partner/partner_act.go +++ b/business/partner/partner_act.go @@ -1,26 +1,23 @@ package partner import ( + "time" + "git.rosy.net.cn/jx-callback/business/jxutils/jxcontext" "git.rosy.net.cn/jx-callback/business/jxutils/tasksch" "git.rosy.net.cn/jx-callback/business/model" + "git.rosy.net.cn/jx-callback/business/model/dao" ) -type IPurchasePlatformPromotionHandler interface { - // 如果是单品级活动,actOrderRules为空 - // 如果是订单级活动,actStoreSku可以为空(表示不限制SKU) - CreateAct(ctx *jxcontext.Context, parentTask tasksch.ITask, act *model.Act2, actOrderRules []*model.ActOrderRule, actStoreMap []*model.ActStore2, actStoreSku []*model.ActStoreSku2) (err error) - UpdateAct(ctx *jxcontext.Context, parentTask tasksch.ITask, act *model.Act2, actOrderRules []*model.ActOrderRule, actStoreMap2Remove, actStoreMap2Add, actStoreMap2Update []*model.ActStore2, actStoreSku []*model.ActStoreSku2) (err error) - // 取消整个京西活动 - CancelAct(ctx *jxcontext.Context, parentTask tasksch.ITask, act *model.Act2, actStoreMap []*model.ActStore2, actStoreSku []*model.ActStoreSku2) (err error) -} +type IPurchasePlatformActHandler interface { + // // 如果是单品级活动,actOrderRules为空 + // // 如果是订单级活动,actStoreSku可以为空(表示不限制SKU) + // CreateAct(ctx *jxcontext.Context, parentTask tasksch.ITask, act *model.Act2, actOrderRules []*model.ActOrderRule, actStoreSku []*model.ActStoreSku2) (err error) + // UpdateAct(ctx *jxcontext.Context, parentTask tasksch.ITask, act *model.Act2, actOrderRules []*model.ActOrderRule, actStoreSku []*model.ActStoreSku2) (err error) + // // 取消整个京西活动 + // CancelAct(ctx *jxcontext.Context, parentTask tasksch.ITask, act *model.Act2, actStoreSku []*model.ActStoreSku2) (err error) -func SplitActStore(actStoreList []*model.ActStore2) (actStoreMap map[int]*model.ActStore2) { - actStoreMap = make(map[int]*model.ActStore2) - for _, v := range actStoreList { - actStoreMap[v.StoreID] = v - } - return actStoreMap + SyncAct(ctx *jxcontext.Context, parentTask tasksch.ITask, act *model.Act2, actOrderRules []*model.ActOrderRule, actStoreSkuList []*model.ActStoreSku2) (err error) } func SplitActStoreSku(actStoreSkuList []*model.ActStoreSku2) (actStoreSkuMap map[int][]*model.ActStoreSku2) { @@ -31,18 +28,56 @@ func SplitActStoreSku(actStoreSkuList []*model.ActStoreSku2) (actStoreSkuMap map return actStoreSkuMap } +func SplitActStoreSku2List(actStoreSkuList []*model.ActStoreSku2) (actStoreSkuListList [][]*model.ActStoreSku2) { + actStoreSkuMap := SplitActStoreSku(actStoreSkuList) + for _, v := range actStoreSkuMap { + actStoreSkuListList = append(actStoreSkuListList, v) + } + return actStoreSkuListList +} + func Act2ActMap(act *model.Act2) (actMap *model.ActMap) { actMap = &model.ActMap{} actMap.ID = act.MapID return actMap } -func ActStore2ActStoreMap(actStore *model.ActStore2) (actStoreMap *model.ActStoreMap) { - return &actStore.ActStoreMap -} - func ActStoreSku2ActStoreSkuMap(actStoreSku *model.ActStoreSku2) (actStoreSkuMap *model.ActStoreSkuMap) { actStoreSkuMap = &model.ActStoreSkuMap{} actStoreSkuMap.ID = actStoreSku.MapID return actStoreSkuMap } + +func Act2Update(act *model.Act2, syncStatus int) (item *dao.KVUpdateItem) { + kvs := map[string]interface{}{ + model.FieldSyncStatus: 0, + } + if syncStatus == model.SyncFlagDeletedMask { + kvs[model.FieldDeletedAt] = time.Now() + } else if syncStatus == model.SyncFlagNewMask { + kvs[model.FieldVendorActID] = act.VendorActID + } + item = &dao.KVUpdateItem{ + Item: Act2ActMap(act), + KVs: kvs, + } + return item +} + +func ActStoreSku2Update(actStoreSkuList []*model.ActStoreSku2, syncStatus int) (items []*dao.KVUpdateItem) { + for _, v := range actStoreSkuList { + kvs := map[string]interface{}{ + model.FieldSyncStatus: 0, + } + if syncStatus == model.SyncFlagDeletedMask { + kvs[model.FieldDeletedAt] = time.Now() + } else if syncStatus == model.SyncFlagNewMask { + kvs[model.FieldVendorActID] = v.VendorActID + } + items = append(items, &dao.KVUpdateItem{ + Item: ActStoreSku2ActStoreSkuMap(v), + KVs: kvs, + }) + } + return items +} diff --git a/business/partner/purchase/ebai/act.go b/business/partner/purchase/ebai/act.go index 6be37576c..e20faed53 100644 --- a/business/partner/purchase/ebai/act.go +++ b/business/partner/purchase/ebai/act.go @@ -102,16 +102,20 @@ func ActivitySkuUpdateBatch(activityID int64, actSkuInfoList []*ebaiapi.Activity return api.EbaiAPI.ActivitySkuUpdateBatch(activityID, actSkuInfoList) } -func (c *PurchaseHandler) CreateAct(ctx *jxcontext.Context, parentTask tasksch.ITask, act *model.Act2, actOrderRules []*model.ActOrderRule, actStoreMap []*model.ActStore2, actStoreSku []*model.ActStoreSku2) (err error) { +func (c *PurchaseHandler) CreateAct(ctx *jxcontext.Context, parentTask tasksch.ITask, act *model.Act2, actOrderRules []*model.ActOrderRule, actStoreSku []*model.ActStoreSku2) (err error) { activity := act2EbaiActivity(act, actOrderRules) if act.Type < model.ActOrderBegin { - actStoreSkuMap := partner.SplitActStoreSku(actStoreSku) + actStoreSkuListList := partner.SplitActStoreSku2List(actStoreSku) task := tasksch.NewParallelTask("ebai CreateAct", nil, ctx, func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) { - store := batchItemList[0].(*model.ActStore2) - store.VendorActID, err = createOneShopAct(utils.Int2Str(store.StoreID), activity, actStoreSkuMap[store.StoreID]) + list := batchItemList[0].([]*model.ActStoreSku2) + var vendorActID string + vendorActID, err = createOneShopAct(utils.Int2Str(list[0].StoreID), activity, list) + for _, v := range list { + v.VendorActID = vendorActID + } return nil, err - }, actStoreMap) + }, actStoreSkuListList) tasksch.HandleTask(task, parentTask, true).Run() _, err = task.GetResult(0) } else { @@ -120,67 +124,55 @@ func (c *PurchaseHandler) CreateAct(ctx *jxcontext.Context, parentTask tasksch.I return err } -func (c *PurchaseHandler) UpdateAct(ctx *jxcontext.Context, parentTask tasksch.ITask, act *model.Act2, actOrderRules []*model.ActOrderRule, actStoreMap2Remove, actStoreMap2Add, actStoreMap2Update []*model.ActStore2, actStoreSku []*model.ActStoreSku2) (err error) { - if act.Type < model.ActOrderBegin { - actStoreSkuMap := partner.SplitActStoreSku(actStoreSku) - if len(actStoreMap2Remove) > 0 { - if err = c.CancelAct(ctx, parentTask, act, actStoreMap2Remove, nil); err != nil { - return err - } - for _, v := range actStoreMap2Remove { - delete(actStoreSkuMap, v.StoreID) - } - } - if len(actStoreMap2Add) > 0 { - if err = c.CreateAct(ctx, parentTask, act, actOrderRules, actStoreMap2Add, actStoreSku); err != nil { - return err - } - for _, v := range actStoreMap2Add { - delete(actStoreSkuMap, v.StoreID) - } - } - task := tasksch.NewParallelTask("ebai UpdateAct", nil, ctx, - func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) { - v := batchItemList[0].(*model.ActStore2) - if storeSkus := actStoreSkuMap[v.StoreID]; storeSkus != nil { - if list := actStoreSu2Ebai4Delete(storeSkus); len(list) > 0 { - if _, err = ActivitySkuDeleteBatch(utils.Str2Int64(v.VendorActID), utils.Int2Str(v.StoreID), 0, list, false); err != nil { - return nil, err - } - } - if list := actStoreSu2Ebai4Add(storeSkus); len(list) > 0 { - if _, err = ActivitySkuAddBatch(utils.Str2Int64(v.VendorActID), utils.Int2Str(v.StoreID), 0, actType2Ebai(act.Type), list, false); err != nil { - return nil, err - } - } - if list := actStoreSu2Ebai4Update(storeSkus); len(list) > 0 { - if _, err = ActivitySkuUpdateBatch(utils.Str2Int64(v.VendorActID), list); err != nil { - return nil, err - } - } - } - return nil, err - }, actStoreMap2Update) - tasksch.HandleTask(task, parentTask, true).Run() - _, err = task.GetResult(0) - } else { +func (c *PurchaseHandler) UpdateAct(ctx *jxcontext.Context, parentTask tasksch.ITask, act *model.Act2, actOrderRules []*model.ActOrderRule, actStoreSku []*model.ActStoreSku2) (err error) { + // if act.Type < model.ActOrderBegin { + // actStoreSkuMap := partner.SplitActStoreSku(actStoreSku) + // task := tasksch.NewParallelTask("ebai UpdateAct", nil, ctx, + // func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) { + // v := batchItemList[0].(*model.ActStore2) + // if storeSkus := actStoreSkuMap[v.StoreID]; storeSkus != nil { + // if list := actStoreSu2Ebai4Delete(storeSkus); len(list) > 0 { + // if _, err = ActivitySkuDeleteBatch(utils.Str2Int64(v.VendorActID), utils.Int2Str(v.StoreID), 0, list, false); err != nil { + // return nil, err + // } + // } + // if list := actStoreSu2Ebai4Add(storeSkus); len(list) > 0 { + // if _, err = ActivitySkuAddBatch(utils.Str2Int64(v.VendorActID), utils.Int2Str(v.StoreID), 0, actType2Ebai(act.Type), list, false); err != nil { + // return nil, err + // } + // } + // if list := actStoreSu2Ebai4Update(storeSkus); len(list) > 0 { + // if _, err = ActivitySkuUpdateBatch(utils.Str2Int64(v.VendorActID), list); err != nil { + // return nil, err + // } + // } + // } + // return nil, err + // }, actStoreMap2Update) + // tasksch.HandleTask(task, parentTask, true).Run() + // _, err = task.GetResult(0) + // } else { - } + // } return err } -func (c *PurchaseHandler) CancelAct(ctx *jxcontext.Context, parentTask tasksch.ITask, act *model.Act2, actStoreMap []*model.ActStore2, actStoreSku []*model.ActStoreSku2) (err error) { - if act.Type < model.ActOrderBegin { - task := tasksch.NewParallelTask("ebai DeleteAct", nil, ctx, - func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) { - v := batchItemList[0].(*model.ActStore2) - if globals.EnableEbaiStoreWrite { - err = api.EbaiAPI.ActivityDisable(utils.Str2Int64(v.VendorActID), utils.Int2Str(v.StoreID), 0, 0) - } - return nil, err - }, actStoreMap) - tasksch.HandleTask(task, parentTask, true).Run() - _, err = task.GetResult(0) - } +func (c *PurchaseHandler) CancelAct(ctx *jxcontext.Context, parentTask tasksch.ITask, act *model.Act2, actStoreSku []*model.ActStoreSku2) (err error) { + // if act.Type < model.ActOrderBegin { + // task := tasksch.NewParallelTask("ebai DeleteAct", nil, ctx, + // func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) { + // v := batchItemList[0].(*model.ActStore2) + // if globals.EnableEbaiStoreWrite { + // err = api.EbaiAPI.ActivityDisable(utils.Str2Int64(v.VendorActID), utils.Int2Str(v.StoreID), 0, 0) + // } + // return nil, err + // }, actStoreMap) + // tasksch.HandleTask(task, parentTask, true).Run() + // _, err = task.GetResult(0) + // } return err } + +func (c *PurchaseHandler) SyncAct(ctx *jxcontext.Context, parentTask tasksch.ITask, act *model.Act2, actOrderRules []*model.ActOrderRule, actStoreSkuList []*model.ActStoreSku2) (err error) { + return nil +} diff --git a/business/partner/purchase/elm/act.go b/business/partner/purchase/elm/act.go index bcc142ed5..d2ea0ea42 100644 --- a/business/partner/purchase/elm/act.go +++ b/business/partner/purchase/elm/act.go @@ -6,14 +6,6 @@ import ( "git.rosy.net.cn/jx-callback/business/model" ) -func (c *PurchaseHandler) CreateAct(ctx *jxcontext.Context, parentTask tasksch.ITask, act *model.Act2, actOrderRules []*model.ActOrderRule, actStoreMap []*model.ActStore2, actStoreSku []*model.ActStoreSku2) (err error) { - return err -} - -func (c *PurchaseHandler) UpdateAct(ctx *jxcontext.Context, parentTask tasksch.ITask, act *model.Act2, actOrderRules []*model.ActOrderRule, actStoreMap2Remove, actStoreMap2Add, actStoreMap2Update []*model.ActStore2, actStoreSku []*model.ActStoreSku2) (err error) { - return err -} - -func (c *PurchaseHandler) CancelAct(ctx *jxcontext.Context, parentTask tasksch.ITask, act *model.Act2, actStoreMap []*model.ActStore2, actStoreSku []*model.ActStoreSku2) (err error) { - return err +func (c *PurchaseHandler) SyncAct(ctx *jxcontext.Context, parentTask tasksch.ITask, act *model.Act2, actOrderRules []*model.ActOrderRule, actStoreSkuList []*model.ActStoreSku2) (err error) { + return nil } diff --git a/business/partner/purchase/jd/act.go b/business/partner/purchase/jd/act.go index 1342382af..6bedb6f44 100644 --- a/business/partner/purchase/jd/act.go +++ b/business/partner/purchase/jd/act.go @@ -3,6 +3,7 @@ package jd import ( "time" + "git.rosy.net.cn/jx-callback/business/model/dao" "git.rosy.net.cn/jx-callback/business/partner" "git.rosy.net.cn/jx-callback/business/jxutils" @@ -132,7 +133,7 @@ func storeSku2Jd(actStoreSku []*model.ActStoreSku2, handler func(syncStatus int) return jdActStoreSku } -func (c *PurchaseHandler) CreateAct(ctx *jxcontext.Context, parentTask tasksch.ITask, act *model.Act2, actOrderRules []*model.ActOrderRule, actStoreMap []*model.ActStore2, actStoreSku []*model.ActStoreSku2) (err error) { +func (c *PurchaseHandler) CreateAct(ctx *jxcontext.Context, parentTask tasksch.ITask, act *model.Act2, actOrderRules []*model.ActOrderRule, actStoreSku []*model.ActStoreSku2) (err error) { if act.Type < model.ActOrderBegin { act.VendorActID, err = createSkuAct(ctx, act, actStoreSku) } else { @@ -152,7 +153,11 @@ func createSkuAct(ctx *jxcontext.Context, act *model.Act2, actStoreSku []*model. vendorActID = utils.Int64ToStr(infoID) if err = CreatePromotionRules(act.Type, infoID, "", act.LimitDevice, act.LimitPin, act.LimitCount, act.LimitDaily, traceID); err == nil { if _, err = CreatePromotionSku(act.Type, infoID, "", storeSku2Jd(actStoreSku, model.IsSyncStatusNeedCreate), traceID); err == nil { - err = ConfirmPromotion(act.Type, infoID, "", traceID) + if err = ConfirmPromotion(act.Type, infoID, "", traceID); err == nil { + for _, v := range actStoreSku { + v.VendorActID = vendorActID + } + } } } } @@ -166,114 +171,93 @@ func cancelSkuActSkus(ctx *jxcontext.Context, actType int, vendorActID string, a return err } -func (c *PurchaseHandler) UpdateAct(ctx *jxcontext.Context, parentTask tasksch.ITask, act *model.Act2, actOrderRules []*model.ActOrderRule, actStoreMap2Remove, actStoreMap2Add, actStoreMap2Update []*model.ActStore2, actStoreSku []*model.ActStoreSku2) (err error) { +func cancelSkuAct(ctx *jxcontext.Context, actType int, vendorActID string) (err error) { + err = CancelPromotion(actType, utils.Str2Int64(vendorActID), "", getTraceID(ctx)) return err } -func (c *PurchaseHandler) CancelAct(ctx *jxcontext.Context, parentTask tasksch.ITask, act *model.Act2, actStoreMap []*model.ActStore2, actStoreSku []*model.ActStoreSku2) (err error) { - traceID := getTraceID(ctx) +func (c *PurchaseHandler) UpdateAct(ctx *jxcontext.Context, parentTask tasksch.ITask, act *model.Act2, actOrderRules []*model.ActOrderRule, actStoreSku []*model.ActStoreSku2) (err error) { + return err +} + +func (c *PurchaseHandler) CancelAct(ctx *jxcontext.Context, parentTask tasksch.ITask, act *model.Act2, actStoreSku []*model.ActStoreSku2) (err error) { if act.Type < model.ActOrderBegin { outInfoID := utils.Int2Str(act.ID) - err = CancelPromotion(act.Type, 0, outInfoID, traceID) + err = CancelPromotion(act.Type, 0, outInfoID, getTraceID(ctx)) } return err } -func (c *PurchaseHandler) SyncAct(ctx *jxcontext.Context, parentTask tasksch.ITask, act *model.Act2, actStoreList []*model.ActStore2, actStoreSkuList []*model.ActStoreSku2) (err error) { - traceID := getTraceID(ctx) +func (c *PurchaseHandler) SyncAct(ctx *jxcontext.Context, parentTask tasksch.ITask, act *model.Act2, actOrderRules []*model.ActOrderRule, actStoreSkuList []*model.ActStoreSku2) (err error) { + globals.SugarLogger.Debugf("jd SyncAct, actID:%d", act.ID) + vendorActInfoMap := make(map[string][]*model.ActStoreSku2) + deleteActInfoMap := make(map[string][]*model.ActStoreSku2) + var actStoreSkuList4Create []*model.ActStoreSku2 + var updateItems []*dao.KVUpdateItem - actStoreMap := partner.SplitActStore(actStoreList) actStoreSkuMap := partner.SplitActStoreSku(actStoreSkuList) - var actStoreSkuList4Create, actStoreSkuList4Delete []*model.ActStoreSku2 - var okList []*LogicUpdateInfo - for _, actStore := range actStoreMap { - for _, actStoreSku := range actStoreSkuMap[actStore.StoreID] { + for storeID := range actStoreSkuMap { + for _, actStoreSku := range actStoreSkuMap[storeID] { + vendorActInfoMap[actStoreSku.VendorActID] = append(vendorActInfoMap[actStoreSku.VendorActID], actStoreSku) if model.IsSyncStatusNeedCreate(actStoreSku.SyncStatus) { - if actStore.VendorActID == "" { - actStoreSkuList4Create = append(actStoreSkuList4Create, actStoreSku) - } else { - if actStoreSku.VendorActID, err = createSkuAct(ctx, act, []*model.ActStoreSku2{actStoreSku}); err != nil { - return err - } - okList = append(okList, &LogicUpdateInfo{ - Item: partner.ActStoreSku2ActStoreSkuMap(actStoreSku), - KVs: map[string]interface{}{ - model.FieldSyncStatus: 0, - model.FieldVendorActID: actStoreSku.VendorActID, - }, - }) - } + actStoreSkuList4Create = append(actStoreSkuList4Create, actStoreSku) } else if model.IsSyncStatusNeedDelete(actStoreSku.SyncStatus) { - if actStoreSku.VendorActID == "" { - actStoreSkuList4Delete = append(actStoreSkuList4Delete, actStoreSku) - } else { - if err = CancelPromotion(act.Type, utils.Str2Int64(actStoreSku.VendorActID), "", traceID); err != nil { - return err - } - okList = append(okList, &LogicUpdateInfo{ - Item: partner.ActStoreSku2ActStoreSkuMap(actStoreSku), - KVs: map[string]interface{}{ - model.FieldSyncStatus: 0, - model.FieldDeletedAt: time.Now(), - }, - }) + vendorActID := actStoreSku.VendorActID + if vendorActID == "" { + vendorActID = act.VendorActID } - } - } - if actStore.VendorActID != "" { - if model.IsSyncStatusDelete(actStore.SyncStatus) { - if err = CancelPromotion(act.Type, utils.Str2Int64(actStore.VendorActID), "", traceID); err != nil { - return err - } - okList = append(okList, &LogicUpdateInfo{ - Item: partner.ActStore2ActStoreMap(actStore), - KVs: map[string]interface{}{ - model.FieldSyncStatus: 0, - model.FieldDeletedAt: time.Now(), - }, - }) - - } else if len(actStoreSkuList4Delete) > 0 { - if err = cancelSkuActSkus(ctx, act.Type, actStore.VendorActID, actStoreSkuList4Delete); err != nil { - return err - } - } - for _, v := range actStoreSkuList4Delete { - okList = append(okList, &LogicUpdateInfo{ - Item: partner.ActStoreSku2ActStoreSkuMap(v), - KVs: map[string]interface{}{ - model.FieldSyncStatus: 0, - model.FieldDeletedAt: time.Now(), - }, - }) - } - actStoreSkuList4Delete = nil - } - - if act.VendorActID != "" { - if len(actStoreSkuList4Create) > 0 { - if actStore.VendorActID, err = createSkuAct(ctx, act, actStoreSkuList4Create); err != nil { - return err - } - okList = append(okList, &LogicUpdateInfo{ - Item: partner.ActStore2ActStoreMap(actStore), - KVs: map[string]interface{}{ - model.FieldSyncStatus: 0, - }, - }) - for _, v := range actStoreSkuList4Create { - okList = append(okList, &LogicUpdateInfo{ - Item: partner.ActStoreSku2ActStoreSkuMap(v), - KVs: map[string]interface{}{ - model.FieldSyncStatus: 0, - }, - }) - } - actStoreSkuList4Create = nil + deleteActInfoMap[vendorActID] = append(deleteActInfoMap[vendorActID], actStoreSku) } } } - // db := dao.GetDB() - + err = func() (err error) { + if model.IsSyncStatusNeedCreate(act.SyncStatus) { + if act.VendorActID, err = createSkuAct(ctx, act, actStoreSkuList4Create); err != nil { + return err + } + updateItems = append(updateItems, partner.ActStoreSku2Update(actStoreSkuList4Create, model.SyncFlagNewMask)...) + updateItems = append(updateItems, partner.Act2Update(act, model.SyncFlagNewMask)) + } else if model.IsSyncStatusNeedDelete(act.SyncStatus) { + for vendorActID := range vendorActInfoMap { + if vendorActID != "" { + if err = cancelSkuAct(ctx, act.Type, vendorActID); err != nil { + return err + } + } + } + for _, actStoreSkuList := range vendorActInfoMap { + updateItems = append(updateItems, partner.ActStoreSku2Update(actStoreSkuList, model.SyncFlagDeletedMask)...) + } + updateItems = append(updateItems, partner.Act2Update(act, model.SyncFlagDeletedMask)) + } else if model.IsSyncStatusNeedUpdate(act.SyncStatus) { + // globals.SugarLogger.Debug(utils.Format4Output(updateItems, false)) + for vendorActID := range deleteActInfoMap { + if vendorActID != "" { + if len(vendorActInfoMap[vendorActID]) == len(deleteActInfoMap[vendorActID]) { + err = cancelSkuAct(ctx, act.Type, vendorActID) + } else { + err = cancelSkuActSkus(ctx, act.Type, vendorActID, deleteActInfoMap[vendorActID]) + } + if err != nil { + return err + } + } + updateItems = append(updateItems, partner.ActStoreSku2Update(deleteActInfoMap[vendorActID], model.SyncFlagDeletedMask)...) + } + if len(actStoreSkuList4Create) > 0 { + if _, err = createSkuAct(ctx, act, actStoreSkuList4Create); err != nil { + return err + } + updateItems = append(updateItems, partner.ActStoreSku2Update(actStoreSkuList4Create, model.SyncFlagNewMask)...) + } + updateItems = append(updateItems, partner.Act2Update(act, model.SyncFlagModifiedMask)) + } + return nil + }() + db := dao.GetDB() + _, err2 := dao.BatchUpdateEntityByKV(db, updateItems) + if err == nil { + err = err2 + } return err } diff --git a/business/partner/purchase/mtwm/act.go b/business/partner/purchase/mtwm/act.go index 3d3494599..93d394528 100644 --- a/business/partner/purchase/mtwm/act.go +++ b/business/partner/purchase/mtwm/act.go @@ -7,7 +7,6 @@ import ( "git.rosy.net.cn/jx-callback/business/jxutils/jxcontext" "git.rosy.net.cn/jx-callback/business/jxutils/tasksch" "git.rosy.net.cn/jx-callback/business/model" - "git.rosy.net.cn/jx-callback/business/partner" "git.rosy.net.cn/jx-callback/globals" "git.rosy.net.cn/jx-callback/globals/api" ) @@ -60,11 +59,11 @@ func isCreateOrUpdate(syncStatus int) bool { return model.IsSyncStatusNeedCreate(syncStatus) || model.IsSyncStatusNeedUpdate(syncStatus) } -func createOneShopAct(act *model.Act2, storeMap *model.ActStore2, actStoreSku []*model.ActStoreSku2) (err error) { +func createOneShopAct(act *model.Act2, vendorStoreID string, actStoreSku []*model.ActStoreSku2) (err error) { actData := storeSku2ActData(act, actStoreSku, isCreateOrUpdate) if len(actData) > 0 { if globals.EnableMtwmStoreWrite { - actResult, err2 := api.MtwmAPI.RetailDiscountBatchSave(storeMap.VendorStoreID, actData) + actResult, err2 := api.MtwmAPI.RetailDiscountBatchSave(vendorStoreID, actData) if err = err2; err != nil { return err } @@ -86,84 +85,13 @@ func createOneShopAct(act *model.Act2, storeMap *model.ActStore2, actStoreSku [] return err } -func (c *PurchaseHandler) CreateAct(ctx *jxcontext.Context, parentTask tasksch.ITask, act *model.Act2, actOrderRules []*model.ActOrderRule, actStoreMap []*model.ActStore2, actStoreSku []*model.ActStoreSku2) (err error) { - globals.SugarLogger.Debugf("mtwm CreateAct actID:%d", act.ID) - if act.Type < model.ActOrderBegin { - actStoreSkuMap := partner.SplitActStoreSku(actStoreSku) - task := tasksch.NewParallelTask("mtwm CreateAct", nil, ctx, - func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) { - store := batchItemList[0].(*model.ActStore2) - err = createOneShopAct(act, store, actStoreSkuMap[store.StoreID]) - return nil, err - }, actStoreMap) - tasksch.HandleTask(task, parentTask, true).Run() - _, err = task.GetResult(0) - } else { - +func cancelOneShopAct(ctx *jxcontext.Context, vendorStoreID string, actStoreSku []*model.ActStoreSku2) (err error) { + if list := storeSku2ActData4Delete(actStoreSku, model.IsSyncStatusNeedDelete); len(list) > 0 { + err = api.MtwmAPI.RetailDiscountDelete(vendorStoreID, list) } return err } -func (c *PurchaseHandler) UpdateAct(ctx *jxcontext.Context, parentTask tasksch.ITask, act *model.Act2, actOrderRules []*model.ActOrderRule, actStoreMap2Remove, actStoreMap2Add, actStoreMap2Update []*model.ActStore2, actStoreSku []*model.ActStoreSku2) (err error) { - if act.Type < model.ActOrderBegin { - actStoreSkuMap := partner.SplitActStoreSku(actStoreSku) - if len(actStoreMap2Remove) > 0 { - if err = c.CancelAct(ctx, parentTask, act, actStoreMap2Remove, nil); err != nil { - return err - } - for _, v := range actStoreMap2Remove { - delete(actStoreSkuMap, v.StoreID) - } - } - if len(actStoreMap2Add) > 0 { - if err = c.CreateAct(ctx, parentTask, act, actOrderRules, actStoreMap2Add, actStoreSku); err != nil { - return err - } - for _, v := range actStoreMap2Add { - delete(actStoreSkuMap, v.StoreID) - } - } - task := tasksch.NewParallelTask("mtwm UpdateAct", nil, ctx, - func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) { - v := batchItemList[0].(*model.ActStore2) - if storeSkus := actStoreSkuMap[v.StoreID]; storeSkus != nil { - if list := storeSku2ActData4Delete(storeSkus, model.IsSyncStatusNeedDelete); len(list) > 0 { - if err = api.MtwmAPI.RetailDiscountDelete(v.VendorStoreID, list); err != nil { - return nil, err - } - } - if err = createOneShopAct(act, v, actStoreSkuMap[v.StoreID]); err != nil { - return nil, err - } - } - return nil, err - }, actStoreMap2Update) - tasksch.HandleTask(task, parentTask, true).Run() - _, err = task.GetResult(0) - } else { - - } - return err -} - -func (c *PurchaseHandler) CancelAct(ctx *jxcontext.Context, parentTask tasksch.ITask, act *model.Act2, actStoreMap []*model.ActStore2, actStoreSku []*model.ActStoreSku2) (err error) { - if act.Type < model.ActOrderBegin { - actStoreSkuMap := partner.SplitActStoreSku(actStoreSku) - task := tasksch.NewParallelTask("mtwm DeleteAct", nil, ctx, - func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) { - v := batchItemList[0].(*model.ActStore2) - actIDList := storeSku2ActData4Delete(actStoreSkuMap[v.StoreID], nil) - if len(actIDList) > 0 { - if globals.EnableMtwmStoreWrite { - err = api.MtwmAPI.RetailDiscountDelete(v.VendorStoreID, actIDList) - } - } - return nil, err - }, actStoreMap) - tasksch.HandleTask(task, parentTask, true).Run() - _, err = task.GetResult(0) - } else { - - } - return err +func (c *PurchaseHandler) SyncAct(ctx *jxcontext.Context, parentTask tasksch.ITask, act *model.Act2, actOrderRules []*model.ActOrderRule, actStoreSkuList []*model.ActStoreSku2) (err error) { + return nil } diff --git a/business/partner/purchase/weimob/wsc/act.go b/business/partner/purchase/weimob/wsc/act.go index 12d69f212..1210cab88 100644 --- a/business/partner/purchase/weimob/wsc/act.go +++ b/business/partner/purchase/weimob/wsc/act.go @@ -6,14 +6,6 @@ import ( "git.rosy.net.cn/jx-callback/business/model" ) -func (c *PurchaseHandler) CreateAct(ctx *jxcontext.Context, parentTask tasksch.ITask, act *model.Act2, actOrderRules []*model.ActOrderRule, actStoreMap []*model.ActStore2, actStoreSku []*model.ActStoreSku2) (err error) { - return err -} - -func (c *PurchaseHandler) UpdateAct(ctx *jxcontext.Context, parentTask tasksch.ITask, act *model.Act2, actOrderRules []*model.ActOrderRule, actStoreMap2Remove, actStoreMap2Add, actStoreMap2Update []*model.ActStore2, actStoreSku []*model.ActStoreSku2) (err error) { - return err -} - -func (c *PurchaseHandler) CancelAct(ctx *jxcontext.Context, parentTask tasksch.ITask, act *model.Act2, actStoreMap []*model.ActStore2, actStoreSku []*model.ActStoreSku2) (err error) { - return err +func (c *PurchaseHandler) SyncAct(ctx *jxcontext.Context, parentTask tasksch.ITask, act *model.Act2, actOrderRules []*model.ActOrderRule, actStoreSkuList []*model.ActStoreSku2) (err error) { + return nil } diff --git a/globals/beegodb/beegodb.go b/globals/beegodb/beegodb.go index 0680b55d2..8c2c288cc 100644 --- a/globals/beegodb/beegodb.go +++ b/globals/beegodb/beegodb.go @@ -46,7 +46,7 @@ func Init() { // 如下语句建表时要出错(INDEX名字太长了),暂时放一下,必须放最后一句 orm.RegisterModel(&model.OrderFinancial{}, &model.AfsOrder{}, &model.OrderDiscountFinancial{}, &model.OrderSkuFinancial{}) // orm.RegisterModel(&model.Act{}, &model.ActOrderRule{}, &model.ActStoreSku{}) - // orm.RegisterModel(&model.ActMap{}, &model.ActStoreMap{}, &model.ActStoreSkuMap{}) + // orm.RegisterModel(&model.ActMap{}, &model.ActStoreSkuMap{}) // create table orm.RunSyncdb("default", false, true) } diff --git a/main.go b/main.go index ada89dd47..9b298a3c8 100644 --- a/main.go +++ b/main.go @@ -20,6 +20,7 @@ import ( "git.rosy.net.cn/jx-callback/globals/beegodb" _ "git.rosy.net.cn/jx-callback/routers" + // _ "git.rosy.net.cn/jx-callback/business/jxstore/act" _ "git.rosy.net.cn/jx-callback/business/partner/printer/feie" _ "git.rosy.net.cn/jx-callback/business/partner/printer/xiaowm" _ "git.rosy.net.cn/jx-callback/business/partner/printer/yilianyun"