Merge branch 'mark' into get-store

This commit is contained in:
gazebo
2019-06-24 21:43:41 +08:00
33 changed files with 1229 additions and 766 deletions

View File

@@ -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[int64]*dao.PromotionStoreSku
if len(skuIDMap) > 0 {
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
}
}
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 := dao.GenSkuPriceMapKey(jxStoreID, v.SkuID)
if skuPriceMap[index] != nil && skuPriceMap[index].EarningPrice > 0 {
v.EarningPrice = int64(skuPriceMap[index].EarningPrice)
}
}
}
}
@@ -349,22 +330,37 @@ 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,
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)
if !dao.IsNoRowsError(err) {
return err
}
err = nil
} else {
order.JxStoreID = storeDetail.Store.ID
payPercentage = storeDetail.PayPercentage
}
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)
return err
}
order.JxStoreID = storeMap.StoreID
if err = c.updateOrderSkuOtherInfo(order, db); err == nil {
jxutils.RefreshOrderSkuRelated(order)
caculateOrderEarningPrice(order, payPercentage)
}
return err
}
// 计算结算给门店的金额
func caculateOrderEarningPrice(order *model.GoodsOrder, storePayPercentage int) {
order.EarningPrice = 0
for _, v := range order.Skus {
skuEarningPrice := v.EarningPrice
if skuEarningPrice == 0 {
skuEarningPrice = jxutils.CaculateSkuEarningPrice(v.ShopPrice, v.SalePrice, storePayPercentage)
}
order.EarningPrice += skuEarningPrice * int64(v.Count)
}
}
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 {
@@ -516,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

View File

@@ -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,14 +253,18 @@ 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.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.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`
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
@@ -475,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
@@ -780,14 +757,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.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.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,