935 lines
31 KiB
Go
935 lines
31 KiB
Go
package orderman
|
||
|
||
import (
|
||
"fmt"
|
||
"strconv"
|
||
"strings"
|
||
"time"
|
||
|
||
"git.rosy.net.cn/jx-callback/business/jxutils/tasksch"
|
||
|
||
"git.rosy.net.cn/baseapi/utils"
|
||
"git.rosy.net.cn/jx-callback/business/jxutils"
|
||
"git.rosy.net.cn/jx-callback/business/jxutils/excel"
|
||
"git.rosy.net.cn/jx-callback/business/jxutils/jxcontext"
|
||
"git.rosy.net.cn/jx-callback/business/model"
|
||
"git.rosy.net.cn/jx-callback/business/model/dao"
|
||
"git.rosy.net.cn/jx-callback/business/partner"
|
||
"git.rosy.net.cn/jx-callback/globals"
|
||
"github.com/astaxie/beego/orm"
|
||
)
|
||
|
||
const (
|
||
maxLastHours = 7 * 24 // 最多只能查询7天内的订单数据
|
||
defLastHours = 2 * 24 // 缺省是两天内的订单
|
||
)
|
||
|
||
type tWaybillExt struct {
|
||
model.Waybill
|
||
StoreName string `json:"storeName"`
|
||
StoreID int `json:"storeID" orm:"column(store_id)"`
|
||
}
|
||
|
||
type StoresOrderSaleInfo struct {
|
||
StoreID int `orm:"column(store_id)" json:"storeID"`
|
||
VendorID int `orm:"column(vendor_id)" json:"vendorID"`
|
||
Status int `json:"status"`
|
||
Count int `json:"count"`
|
||
ShopPrice int64 `json:"shopPrice"`
|
||
VendorPrice int64 `json:"vendorPrice"`
|
||
SalePrice int64 `json:"salePrice"`
|
||
ActualPayPrice int64 `json:"actualPayPrice"`
|
||
|
||
EarningPrice int64 `json:"earningPrice"` // 预估结算给门店老板的钱
|
||
}
|
||
|
||
func (c *OrderManager) GetStoreOrderCountInfo(ctx *jxcontext.Context, storeID, lastHours int) (countInfo []*model.GoodsOrderCountInfo, err error) {
|
||
globals.SugarLogger.Debugf("GetStoreOrderCountInfo storeID:%d", storeID)
|
||
if lastHours > maxLastHours {
|
||
lastHours = maxLastHours
|
||
} else if lastHours == 0 {
|
||
lastHours = defLastHours
|
||
}
|
||
|
||
db := dao.GetDB()
|
||
err = dao.GetRows(db, &countInfo, `
|
||
SELECT t1.lock_status, t1.status, COUNT(*) count
|
||
FROM goods_order t1
|
||
WHERE t1.vendor_id <> 2 AND IF(t1.vendor_id = ?, t1.store_id, IF(t1.jx_store_id != 0, t1.jx_store_id, t1.store_id) ) = ?
|
||
AND t1.order_created_at >= ?
|
||
GROUP BY 1,2
|
||
ORDER BY 1,2
|
||
`, model.VendorIDWSC, storeID, time.Now().Add(-time.Duration(lastHours)*time.Hour))
|
||
if err == nil {
|
||
return countInfo, nil
|
||
}
|
||
globals.SugarLogger.Infof("GetStoreOrderCountInfo storeID:%d failed with error:%v", storeID, err)
|
||
return nil, err
|
||
}
|
||
|
||
func (c *OrderManager) GetOrderSkuInfo(ctx *jxcontext.Context, vendorOrderID string, vendorID int) (skus []*model.OrderSkuExt, err error) {
|
||
globals.SugarLogger.Debugf("GetOrderSkuInfo orderID:%s", vendorOrderID)
|
||
|
||
fullSkuNameSQL := "t1.sku_name"
|
||
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, 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, 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, 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
|
||
}
|
||
}
|
||
if len(skus) == 0 {
|
||
return nil, ErrCanNotFindOrder
|
||
}
|
||
return skus, nil
|
||
}
|
||
|
||
func (c *OrderManager) GetOrderInfo(ctx *jxcontext.Context, vendorOrderID string, vendorID int, isRefresh bool) (order *model.GoodsOrderExt, err error) {
|
||
globals.SugarLogger.Debugf("GetOrderInfo orderID:%s", vendorOrderID)
|
||
db := orm.NewOrm()
|
||
orders := []*model.GoodsOrderExt{}
|
||
|
||
// 这里用QueryRows而不用QueryRow的原因是用QueryRow在这种情况下不能将数据读出,很奇怪。大概的原因是QueryRow对于GoodsOrderExt这种有嵌入的struct处理有问题
|
||
num, err := db.Raw(`
|
||
SELECT t1.*, t2.status waybill_status, t2.courier_name, t2.courier_mobile
|
||
FROM goods_order t1
|
||
LEFT JOIN waybill t2 ON t1.vendor_waybill_id = t2.vendor_waybill_id AND t1.waybill_vendor_id = t2.waybill_vendor_id
|
||
WHERE t1.vendor_order_id = ? AND vendor_id = ?
|
||
`, vendorOrderID, vendorID).QueryRows(&orders)
|
||
if err == nil && num > 0 {
|
||
order = orders[0]
|
||
if isRefresh && vendorID == model.VendorIDJD {
|
||
tmpOrder, err2 := partner.GetPurchasePlatformFromVendorID(vendorID).GetOrder(vendorOrderID)
|
||
if err = err2; err == nil {
|
||
order.CurrentConsigneeMobile = tmpOrder.ConsigneeMobile
|
||
} else {
|
||
order.CurrentConsigneeMobile = "Error"
|
||
globals.SugarLogger.Infof("GetOrderInfo GetOrder failed with error:%v", err2)
|
||
}
|
||
}
|
||
return order, nil
|
||
}
|
||
if err == nil {
|
||
err = ErrCanNotFindOrder
|
||
}
|
||
globals.SugarLogger.Infof("GetOrderInfo orderID:%s failed with error:%v", vendorOrderID, err)
|
||
return nil, err
|
||
}
|
||
|
||
func (c *OrderManager) GetOrderWaybillInfo(ctx *jxcontext.Context, vendorOrderID string, vendorID int, isNotEnded bool) (bills []*model.Waybill, err error) {
|
||
globals.SugarLogger.Debugf("GetOrderWaybillInfo orderID:%s", vendorOrderID)
|
||
db := dao.GetDB()
|
||
sql := `
|
||
SELECT t1.*
|
||
FROM waybill t1
|
||
WHERE t1.vendor_order_id = ? AND order_vendor_id = ?
|
||
`
|
||
sqlParams := []interface{}{
|
||
vendorOrderID,
|
||
vendorID,
|
||
}
|
||
if isNotEnded {
|
||
sql += " AND t1.status < ?"
|
||
sqlParams = append(sqlParams, model.OrderStatusEndBegin)
|
||
}
|
||
err = dao.GetRows(db, &bills, sql, sqlParams...)
|
||
globals.SugarLogger.Infof("GetOrderWaybillInfo orderID:%s failed with error:%v", vendorOrderID, err)
|
||
return bills, err
|
||
}
|
||
|
||
func (c *OrderManager) ExportMTWaybills(ctx *jxcontext.Context, fromDateStr, toDateStr string) (excelContent []byte, err error) {
|
||
globals.SugarLogger.Debugf("ExportMTWaybills from:%s to:%s", fromDateStr, toDateStr)
|
||
|
||
fromDate, err := utils.TryStr2Time(fromDateStr)
|
||
if err != nil {
|
||
return nil, err
|
||
}
|
||
if toDateStr == "" {
|
||
toDateStr = fromDateStr
|
||
}
|
||
toDate, err := utils.TryStr2Time(toDateStr)
|
||
if err != nil {
|
||
return nil, err
|
||
}
|
||
toDate = toDate.Add(24 * time.Hour)
|
||
var waybills []*tWaybillExt
|
||
sql := `
|
||
SELECT t1.*, t2.store_name, IF(t1.vendor_id = ?, t1.store_id, IF(t1.jx_store_id != 0, t1.jx_store_id, t1.store_id) ) store_id
|
||
FROM waybill t1
|
||
JOIN goods_order t2 ON t1.vendor_order_id = t2.vendor_order_id
|
||
WHERE t1.waybill_vendor_id = 102 AND t1.status = 105 AND t1.waybill_created_at >= ? AND t1.waybill_created_at <= ?
|
||
ORDER BY t1.id
|
||
`
|
||
db := dao.GetDB()
|
||
if err = dao.GetRows(db, &waybills, sql, model.VendorIDWSC, fromDate, toDate); err == nil {
|
||
config := []*excel.Obj2ExcelSheetConfig{
|
||
&excel.Obj2ExcelSheetConfig{
|
||
Title: "Sheet1",
|
||
Data: waybills,
|
||
CaptionList: []string{
|
||
"vendorWaybillID",
|
||
"waybillVendorID",
|
||
"vendorOrderID",
|
||
"orderVendorID",
|
||
"storeName",
|
||
"storeID",
|
||
"courierName",
|
||
"status",
|
||
"desiredFee",
|
||
"waybillCreatedAt",
|
||
},
|
||
},
|
||
}
|
||
return excel.Obj2Excel(config), nil
|
||
}
|
||
return nil, err
|
||
}
|
||
|
||
func (c *OrderManager) getOrders(ctx *jxcontext.Context, isIncludeSku bool, fromDateStr, toDateStr string, params map[string]interface{}, offset, pageSize int) (orders []*model.GoodsOrderExt, totalCount int, err error) {
|
||
globals.SugarLogger.Debugf("getOrders from:%s to:%s", fromDateStr, toDateStr)
|
||
|
||
pageSize = jxutils.FormalizePageSize(pageSize)
|
||
if offset < 0 {
|
||
offset = 0
|
||
}
|
||
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, %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`, model.DefaultEarningPricePercentage)
|
||
if isIncludeSku {
|
||
sql += `,
|
||
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
|
||
LEFT JOIN waybill t2 ON t1.vendor_waybill_id = t2.vendor_waybill_id AND t1.waybill_vendor_id = t2.waybill_vendor_id
|
||
LEFT JOIN store t5 ON t5.id = IF(t1.jx_store_id <> 0, t1.jx_store_id, t1.store_id)`
|
||
if isIncludeSku {
|
||
sql += `
|
||
JOIN order_sku t3 ON t3.vendor_order_id = t1.vendor_order_id AND t3.vendor_id = t1.vendor_id`
|
||
}
|
||
var (
|
||
sqlWhere string
|
||
sqlParams []interface{}
|
||
)
|
||
// 如果搜索关键字可能为订单号,则当成订单号查询
|
||
if params["keyword"] != nil {
|
||
if jxutils.GetPossibleVendorIDFromVendorOrderID(params["keyword"].(string)) > model.VendorIDUnknown {
|
||
params["vendorOrderID"] = params["keyword"]
|
||
}
|
||
}
|
||
if params["orderID"] != nil || params["vendorOrderID"] != nil {
|
||
sqlWhere = " WHERE (t1.vendor_order_id = ? OR t1.vendor_order_id2 = ?)"
|
||
vendorOrderID := params["vendorOrderID"]
|
||
if vendorOrderID == nil {
|
||
vendorOrderID = params["orderID"]
|
||
}
|
||
sqlParams = []interface{}{
|
||
vendorOrderID,
|
||
vendorOrderID,
|
||
}
|
||
} else {
|
||
fromDate, err2 := utils.TryStr2Time(fromDateStr)
|
||
if err = err2; err != nil {
|
||
return nil, 0, err
|
||
}
|
||
if toDateStr == "" {
|
||
toDateStr = fromDateStr
|
||
}
|
||
toDate, err2 := utils.TryStr2Time(toDateStr)
|
||
if err = err2; err != nil {
|
||
return nil, 0, err
|
||
}
|
||
toDate = toDate.Add(24 * time.Hour)
|
||
|
||
sqlWhere = `
|
||
WHERE t1.order_created_at >= ? AND t1.order_created_at < ?
|
||
`
|
||
sqlParams = []interface{}{
|
||
fromDate,
|
||
toDate,
|
||
}
|
||
if params["keyword"] != nil {
|
||
keyword := params["keyword"].(string)
|
||
keywordLike := "%" + keyword + "%"
|
||
sqlWhere += `
|
||
AND (t1.store_name LIKE ? OR t1.vendor_order_id LIKE ? OR t1.vendor_store_id LIKE ?
|
||
OR t1.consignee_name LIKE ? OR t1.consignee_mobile LIKE ? OR t1.consignee_mobile2 LIKE ? OR t1.consignee_address LIKE ?
|
||
OR t2.vendor_waybill_id LIKE ? OR t2.courier_name LIKE ? OR t2.courier_mobile LIKE ?
|
||
`
|
||
sqlParams = append(sqlParams, keywordLike, keywordLike, keywordLike, keywordLike, keywordLike, keywordLike, keywordLike, keywordLike, keywordLike, keywordLike)
|
||
if keywordInt64, err2 := strconv.ParseInt(keyword, 10, 64); err2 == nil {
|
||
sqlWhere += " OR t1.store_id = ? OR t1.jx_store_id = ?"
|
||
sqlParams = append(sqlParams, keywordInt64, keywordInt64)
|
||
}
|
||
sqlWhere += ")"
|
||
}
|
||
if params["waybillVendorIDs"] != nil {
|
||
var waybillVendorIDs []int
|
||
if err = utils.UnmarshalUseNumber([]byte(params["waybillVendorIDs"].(string)), &waybillVendorIDs); err != nil {
|
||
return nil, 0, err
|
||
}
|
||
if len(waybillVendorIDs) > 0 {
|
||
sqlWhere += " AND t1.waybill_vendor_id IN (" + dao.GenQuestionMarks(len(waybillVendorIDs)) + ")"
|
||
sqlParams = append(sqlParams, waybillVendorIDs)
|
||
}
|
||
}
|
||
if params["storeIDs"] != nil {
|
||
var storeIDs []int
|
||
if err = utils.UnmarshalUseNumber([]byte(params["storeIDs"].(string)), &storeIDs); err != nil {
|
||
return nil, 0, err
|
||
}
|
||
if len(storeIDs) > 0 {
|
||
sqlWhere += " AND IF(t1.vendor_id = ?, t1.store_id, IF(t1.jx_store_id != 0, t1.jx_store_id, t1.store_id) ) IN (" + dao.GenQuestionMarks(len(storeIDs)) + ")"
|
||
sqlParams = append(sqlParams, model.VendorIDWSC, storeIDs)
|
||
}
|
||
}
|
||
if params["statuss"] != nil {
|
||
var statuss []int
|
||
if err = utils.UnmarshalUseNumber([]byte(params["statuss"].(string)), &statuss); err != nil {
|
||
return nil, 0, err
|
||
}
|
||
if len(statuss) > 0 {
|
||
sqlWhere += " AND t1.status IN (" + dao.GenQuestionMarks(len(statuss)) + ")"
|
||
sqlParams = append(sqlParams, statuss)
|
||
}
|
||
}
|
||
if params["lockStatuss"] != nil {
|
||
var lockStatuss []int
|
||
if err = utils.UnmarshalUseNumber([]byte(params["lockStatuss"].(string)), &lockStatuss); err != nil {
|
||
return nil, 0, err
|
||
}
|
||
if len(lockStatuss) > 0 {
|
||
sqlWhere += " AND t1.lock_status IN (" + dao.GenQuestionMarks(len(lockStatuss)) + ")"
|
||
sqlParams = append(sqlParams, lockStatuss)
|
||
}
|
||
}
|
||
if params["cities"] != nil {
|
||
var cities []int
|
||
if err = utils.UnmarshalUseNumber([]byte(params["cities"].(string)), &cities); err != nil {
|
||
return nil, 0, err
|
||
}
|
||
if len(cities) > 0 {
|
||
sql += " JOIN store st ON t1.store_id = st.id"
|
||
sqlWhere += " AND st.city_code IN (" + dao.GenQuestionMarks(len(cities)) + ")"
|
||
sqlParams = append(sqlParams, cities)
|
||
}
|
||
}
|
||
}
|
||
if params["vendorIDs"] != nil {
|
||
var vendorIDs []int
|
||
if err = utils.UnmarshalUseNumber([]byte(params["vendorIDs"].(string)), &vendorIDs); err != nil {
|
||
return nil, 0, err
|
||
}
|
||
if len(vendorIDs) > 0 {
|
||
sqlWhere += " AND t1.vendor_id IN (" + dao.GenQuestionMarks(len(vendorIDs)) + ")"
|
||
sqlParams = append(sqlParams, vendorIDs)
|
||
}
|
||
}
|
||
db := dao.GetDB()
|
||
sql += sqlWhere
|
||
if isIncludeSku {
|
||
sql += `
|
||
ORDER BY t1.id`
|
||
} else {
|
||
sql += `
|
||
ORDER BY t1.order_created_at DESC
|
||
LIMIT ? OFFSET ?`
|
||
sqlParams = append(sqlParams, pageSize, offset)
|
||
|
||
dao.Begin(db)
|
||
defer func() {
|
||
if r := recover(); r != nil {
|
||
dao.Rollback(db)
|
||
panic(r)
|
||
}
|
||
}()
|
||
}
|
||
if err = dao.GetRows(db, &orders, sql, sqlParams...); err == nil {
|
||
totalCount = dao.GetLastTotalRowCount(db)
|
||
}
|
||
if !isIncludeSku {
|
||
dao.Commit(db)
|
||
}
|
||
return orders, totalCount, err
|
||
}
|
||
|
||
func (c *OrderManager) GetOrders(ctx *jxcontext.Context, fromDateStr, toDateStr string, params map[string]interface{}, offset, pageSize int) (pagedInfo *model.PagedInfo, err error) {
|
||
globals.SugarLogger.Debugf("GetOrders from:%s to:%s", fromDateStr, toDateStr)
|
||
orders, totalCount, err := c.getOrders(ctx, false, fromDateStr, toDateStr, params, offset, pageSize)
|
||
if err == nil {
|
||
pagedInfo = &model.PagedInfo{
|
||
TotalCount: totalCount,
|
||
Data: orders,
|
||
}
|
||
}
|
||
return pagedInfo, err
|
||
}
|
||
|
||
func (c *OrderManager) ExportOrders(ctx *jxcontext.Context, fromDateStr, toDateStr string, mapParams map[string]interface{}) (hint string, err error) {
|
||
globals.SugarLogger.Debugf("ExportOrders from:%s to:%s", fromDateStr, toDateStr)
|
||
var (
|
||
orders, orders2 []*model.GoodsOrderExt
|
||
order *model.GoodsOrderExt
|
||
excelBin []byte
|
||
)
|
||
task := tasksch.NewSeqTask("导出订单SKU信息", ctx,
|
||
func(task *tasksch.SeqTask, step int, params ...interface{}) (result interface{}, err error) {
|
||
switch step {
|
||
case 0:
|
||
orders, _, err = c.getOrders(ctx, true, fromDateStr, toDateStr, mapParams, 0, -1)
|
||
case 1:
|
||
for _, v := range orders {
|
||
skuStr := strings.Join([]string{
|
||
utils.Int2Str(v.SkuID),
|
||
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
|
||
v.CourierVendorName = model.VendorChineseNames[v.WaybillVendorID]
|
||
v.Status2 = model.OrderStatusName[v.Status]
|
||
v.SkuInfo = skuStr
|
||
orders2 = append(orders2, v)
|
||
} else {
|
||
order.SkuInfo += ";" + skuStr
|
||
}
|
||
}
|
||
case 2:
|
||
excelConf := &excel.Obj2ExcelSheetConfig{
|
||
Title: "订单导出",
|
||
Data: orders2,
|
||
CaptionList: []string{
|
||
"vendorOrderID",
|
||
"vendorID",
|
||
"vendorStoreID",
|
||
"jxStoreID",
|
||
"storeName",
|
||
"salePrice",
|
||
"shopPrice",
|
||
"weight",
|
||
"consigneeName",
|
||
"consigneeMobile",
|
||
"consigneeMobile2",
|
||
"consigneeAddress",
|
||
"skuCount",
|
||
"status",
|
||
"orderSeq",
|
||
"buyerComment",
|
||
"businessType",
|
||
"expectedDeliveredTime",
|
||
"vendorWaybillID",
|
||
"waybillVendorID",
|
||
"orderCreatedAt",
|
||
"orderFinishedAt",
|
||
"courierVendorName",
|
||
"courierName",
|
||
"courierMobile",
|
||
"courierMobile",
|
||
"desiredFee",
|
||
"waybillCreatedAt",
|
||
"waybillFinishedAt",
|
||
"status2",
|
||
"skuInfo",
|
||
},
|
||
}
|
||
excelBin = excel.Obj2Excel([]*excel.Obj2ExcelSheetConfig{excelConf})
|
||
case 3:
|
||
keyPart := []string{
|
||
ctx.GetUserName(),
|
||
}
|
||
if fromDateStr != "" {
|
||
keyPart = append(keyPart, fromDateStr)
|
||
}
|
||
if toDateStr != "" {
|
||
keyPart = append(keyPart, toDateStr)
|
||
}
|
||
keyPart = append(keyPart, time.Now().Format("20060102T150405")+".xlsx")
|
||
key := "export/" + strings.Join(keyPart, "_")
|
||
excelURL, err2 := jxutils.UploadExportContent(excelBin, key)
|
||
if err = err2; err == nil {
|
||
task.SetNoticeMsg(excelURL)
|
||
}
|
||
globals.SugarLogger.Debugf("导出订单SKU信息excelURL:%s, err:%v", excelURL, err)
|
||
}
|
||
return nil, err
|
||
}, 4)
|
||
tasksch.ManageTask(task).Run()
|
||
hint = task.GetID()
|
||
return hint, err
|
||
}
|
||
|
||
func (c *OrderManager) GetWaybills(ctx *jxcontext.Context, fromDateStr, toDateStr string, params map[string]interface{}, offset, pageSize int) (pagedInfo *model.PagedInfo, err error) {
|
||
globals.SugarLogger.Debugf("GetWaybills from:%s to:%s", fromDateStr, toDateStr)
|
||
|
||
fromDate, err := utils.TryStr2Time(fromDateStr)
|
||
if err != nil {
|
||
return nil, err
|
||
}
|
||
if toDateStr == "" {
|
||
toDateStr = fromDateStr
|
||
}
|
||
toDate, err := utils.TryStr2Time(toDateStr)
|
||
if err != nil {
|
||
return nil, err
|
||
}
|
||
toDate = toDate.Add(24 * time.Hour)
|
||
pageSize = jxutils.FormalizePageSize(pageSize)
|
||
if offset < 0 {
|
||
offset = 0
|
||
}
|
||
|
||
sqlParams := []interface{}{
|
||
model.VendorIDWSC,
|
||
fromDate,
|
||
toDate,
|
||
}
|
||
sql := `
|
||
SELECT SQL_CALC_FOUND_ROWS t1.*, t2.store_name, IF(t1.vendor_id = ?, t1.store_id, IF(t1.jx_store_id != 0, t1.jx_store_id, t1.store_id) ) store_id
|
||
FROM waybill t1
|
||
JOIN goods_order t2 ON t1.vendor_order_id = t2.vendor_order_id
|
||
WHERE t1.status = 105 AND t1.waybill_created_at >= ? AND t1.waybill_created_at < ?
|
||
`
|
||
if params["keyword"] != nil {
|
||
keyword := params["keyword"].(string)
|
||
keywordLike := "%" + keyword + "%"
|
||
sql += `
|
||
AND (t2.store_name LIKE ? OR t1.vendor_order_id LIKE ?
|
||
OR t2.vendor_waybill_id LIKE ? OR t2.courier_name LIKE ? OR t2.courier_mobile LIKE ?
|
||
`
|
||
sqlParams = append(sqlParams, keywordLike, keywordLike, keywordLike, keywordLike, keywordLike)
|
||
if keywordInt64, err2 := strconv.ParseInt(keyword, 10, 64); err2 == nil {
|
||
sql += " OR t2.store_id = ? OR t2.jx_store_id = ?"
|
||
sqlParams = append(sqlParams, keywordInt64, keywordInt64)
|
||
}
|
||
sql += ")"
|
||
}
|
||
|
||
if params["waybillVendorIDs"] != nil {
|
||
var waybillVendorIDs []int
|
||
if err = utils.UnmarshalUseNumber([]byte(params["waybillVendorIDs"].(string)), &waybillVendorIDs); err != nil {
|
||
return nil, err
|
||
}
|
||
if len(waybillVendorIDs) > 0 {
|
||
sql += " AND t2.waybill_vendor_id IN (" + dao.GenQuestionMarks(len(waybillVendorIDs)) + ")"
|
||
sqlParams = append(sqlParams, waybillVendorIDs)
|
||
}
|
||
}
|
||
if params["statuss"] != nil {
|
||
var statuss []int
|
||
if err = utils.UnmarshalUseNumber([]byte(params["statuss"].(string)), &statuss); err != nil {
|
||
return nil, err
|
||
}
|
||
if len(statuss) > 0 {
|
||
sql += " AND t1.status IN (" + dao.GenQuestionMarks(len(statuss)) + ")"
|
||
sqlParams = append(sqlParams, statuss)
|
||
}
|
||
}
|
||
sql += `
|
||
ORDER BY t1.id
|
||
LIMIT ? OFFSET ?
|
||
`
|
||
sqlParams = append(sqlParams, pageSize, offset)
|
||
var waybills []*tWaybillExt
|
||
db := dao.GetDB()
|
||
dao.Begin(db)
|
||
defer func() {
|
||
if r := recover(); r != nil {
|
||
dao.Rollback(db)
|
||
panic(r)
|
||
}
|
||
}()
|
||
if err = dao.GetRows(db, &waybills, sql, sqlParams...); err == nil {
|
||
pagedInfo = &model.PagedInfo{
|
||
TotalCount: dao.GetLastTotalRowCount(db),
|
||
Data: waybills,
|
||
}
|
||
}
|
||
dao.Commit(db)
|
||
return pagedInfo, err
|
||
}
|
||
|
||
func (c *OrderManager) GetOrderStatusList(ctx *jxcontext.Context, vendorOrderID string, vendorID int, orderType int) (statusList []*model.OrderStatus, err error) {
|
||
sql := `
|
||
SELECT *
|
||
FROM order_status t1
|
||
WHERE t1.ref_vendor_order_id = ? AND t1.ref_vendor_id = ?
|
||
`
|
||
sqlParams := []interface{}{
|
||
vendorOrderID,
|
||
vendorID,
|
||
}
|
||
if orderType > 0 {
|
||
sql += " AND t1.order_type = ?"
|
||
sqlParams = append(sqlParams, orderType)
|
||
}
|
||
sql += " ORDER BY t1.status_time, t1.order_type DESC"
|
||
|
||
db := dao.GetDB()
|
||
if err = dao.GetRows(db, &statusList, sql, sqlParams...); err != nil {
|
||
return nil, err
|
||
}
|
||
return statusList, nil
|
||
}
|
||
|
||
func (c *OrderManager) GetOrdersFinancial(ctx *jxcontext.Context, fromDateStr, toDateStr string, params map[string]interface{}, offset, pageSize int) (pagedInfo *model.PagedInfo, err error) {
|
||
globals.SugarLogger.Debugf("GetOrdersFinancial from:%s to:%s", fromDateStr, toDateStr)
|
||
pageSize = jxutils.FormalizePageSize(pageSize)
|
||
if offset < 0 {
|
||
offset = 0
|
||
}
|
||
sql := `
|
||
SELECT SQL_CALC_FOUND_ROWS t1.*,
|
||
t2.store_name,t2.vendor_store_id,t2.store_id,t2.jx_store_id,t2.status,t2.order_finished_at
|
||
FROM order_financial t1
|
||
LEFT JOIN goods_order t2 ON t1.vendor_order_id = t2.vendor_order_id
|
||
`
|
||
var (
|
||
sqlWhere string
|
||
sqlParams []interface{}
|
||
)
|
||
if params["orderID"] != nil {
|
||
sqlWhere = " WHERE (t1.vendor_order_id = ? OR t1.vendor_order_id2 = ?)"
|
||
sqlParams = []interface{}{
|
||
params["orderID"],
|
||
params["orderID"],
|
||
}
|
||
} else {
|
||
fromDate, err2 := utils.TryStr2Time(fromDateStr)
|
||
if err = err2; err != nil {
|
||
return nil, err
|
||
}
|
||
if toDateStr == "" {
|
||
toDateStr = fromDateStr
|
||
}
|
||
toDate, err2 := utils.TryStr2Time(toDateStr)
|
||
if err = err2; err != nil {
|
||
return nil, err
|
||
}
|
||
toDate = toDate.Add(24 * time.Hour)
|
||
|
||
sqlWhere = `
|
||
WHERE t2.order_finished_at >= ? AND t2.order_finished_at < ?
|
||
`
|
||
sqlParams = []interface{}{
|
||
fromDate,
|
||
toDate,
|
||
}
|
||
if params["vendorIDs"] != nil {
|
||
var vendorIDs []int
|
||
if err = utils.UnmarshalUseNumber([]byte(params["vendorIDs"].(string)), &vendorIDs); err != nil {
|
||
return nil, err
|
||
}
|
||
if len(vendorIDs) > 0 {
|
||
sqlWhere += " AND t1.vendor_id IN (" + dao.GenQuestionMarks(len(vendorIDs)) + ")"
|
||
sqlParams = append(sqlParams, vendorIDs)
|
||
}
|
||
}
|
||
if params["storeIDs"] != nil {
|
||
var storeIDs []int
|
||
if err = utils.UnmarshalUseNumber([]byte(params["storeIDs"].(string)), &storeIDs); err != nil {
|
||
return nil, err
|
||
}
|
||
if len(storeIDs) > 0 {
|
||
sqlWhere += " AND IF(t1.vendor_id = ?, t2.store_id, IF(t2.jx_store_id != 0, t2.jx_store_id, t2.store_id)) IN (" + dao.GenQuestionMarks(len(storeIDs)) + ")"
|
||
sqlParams = append(sqlParams, model.VendorIDWSC, storeIDs)
|
||
}
|
||
}
|
||
if params["statuss"] != nil {
|
||
var statuss []int
|
||
if err = utils.UnmarshalUseNumber([]byte(params["statuss"].(string)), &statuss); err != nil {
|
||
return nil, err
|
||
}
|
||
if len(statuss) > 0 {
|
||
sqlWhere += " AND t2.status IN (" + dao.GenQuestionMarks(len(statuss)) + ")"
|
||
sqlParams = append(sqlParams, statuss)
|
||
}
|
||
}
|
||
if params["cities"] != nil {
|
||
var cities []int
|
||
if err = utils.UnmarshalUseNumber([]byte(params["cities"].(string)), &cities); err != nil {
|
||
return nil, err
|
||
}
|
||
if len(cities) > 0 {
|
||
sql += "JOIN store st ON t2.store_id = st.id"
|
||
sqlWhere += " AND st.city_code IN (" + dao.GenQuestionMarks(len(cities)) + ")"
|
||
sqlParams = append(sqlParams, cities)
|
||
}
|
||
}
|
||
}
|
||
sql += sqlWhere
|
||
sql += `
|
||
ORDER BY t2.order_created_at DESC
|
||
LIMIT ? OFFSET ?
|
||
`
|
||
sqlParams = append(sqlParams, pageSize, offset)
|
||
|
||
var orders []*model.OrderFinancialExt
|
||
db := dao.GetDB()
|
||
dao.Begin(db)
|
||
defer func() {
|
||
if r := recover(); r != nil {
|
||
dao.Rollback(db)
|
||
panic(r)
|
||
}
|
||
}()
|
||
if err = dao.GetRows(db, &orders, sql, sqlParams...); err == nil {
|
||
pagedInfo = &model.PagedInfo{
|
||
TotalCount: dao.GetLastTotalRowCount(db),
|
||
Data: orders,
|
||
}
|
||
}
|
||
dao.Commit(db)
|
||
|
||
return pagedInfo, err
|
||
}
|
||
|
||
func (c *OrderManager) GetStoresOrderSaleInfo(ctx *jxcontext.Context, storeIDList []int, fromTime time.Time, toTime time.Time, statusList []int) (saleInfoList []*StoresOrderSaleInfo, err error) {
|
||
if toTime.Sub(fromTime) > time.Hour*24*60 {
|
||
return nil, fmt.Errorf("查询时间范围不能超过60天")
|
||
}
|
||
// 用int64类型去取float型的数据库返回值,会取不到
|
||
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, %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,
|
||
toTime,
|
||
}
|
||
if len(storeIDList) > 0 {
|
||
sql += " AND IF(t1.jx_store_id > 0, t1.jx_store_id, t1.store_id) IN (" + dao.GenQuestionMarks(len(storeIDList)) + ")"
|
||
sqlParams = append(sqlParams, storeIDList)
|
||
}
|
||
if len(statusList) > 0 {
|
||
sql += " AND t1.status IN (" + dao.GenQuestionMarks(len(statusList)) + ")"
|
||
sqlParams = append(sqlParams, statusList)
|
||
}
|
||
sql += `
|
||
GROUP BY 1,2,3
|
||
ORDER BY 1,2,3`
|
||
err = dao.GetRows(dao.GetDB(), &saleInfoList, sql, sqlParams...)
|
||
return saleInfoList, err
|
||
}
|
||
|
||
func (c *OrderManager) GetAfsOrders(ctx *jxcontext.Context, keyword, afsOrderID, vendorOrderID string, vendorIDList, appealTypeList, storeIDList, statusList []int, fromTime, toTime time.Time, offset, pageSize int) (pagedInfo *model.PagedInfo, err error) {
|
||
globals.SugarLogger.Debugf("GetAfsOrders")
|
||
|
||
pageSize = jxutils.FormalizePageSize(pageSize)
|
||
if offset < 0 {
|
||
offset = 0
|
||
}
|
||
sql := `
|
||
SELECT SQL_CALC_FOUND_ROWS t1.*
|
||
FROM afs_order t1
|
||
`
|
||
var (
|
||
sqlWhere string
|
||
sqlParams []interface{}
|
||
)
|
||
// 如果搜索关键字可能为订单或售后单号,则当成订单或售后单查询
|
||
if keyword != "" {
|
||
if jxutils.GetPossibleVendorIDFromAfsOrderID(keyword) > model.VendorIDUnknown && afsOrderID == "" {
|
||
afsOrderID = keyword
|
||
keyword = ""
|
||
} else if jxutils.GetPossibleVendorIDFromVendorOrderID(keyword) > model.VendorIDUnknown && vendorOrderID == "" {
|
||
vendorOrderID = keyword
|
||
keyword = ""
|
||
}
|
||
}
|
||
if vendorOrderID != "" || afsOrderID != "" {
|
||
if vendorOrderID != "" {
|
||
sqlWhere = " WHERE (t1.vendor_order_id = ? OR t1.vendor_order_id2 = ?)"
|
||
sqlParams = []interface{}{
|
||
vendorOrderID,
|
||
vendorOrderID,
|
||
}
|
||
} else {
|
||
sqlWhere = " WHERE (t1.afs_order_id = ?)"
|
||
sqlParams = []interface{}{
|
||
afsOrderID,
|
||
}
|
||
}
|
||
} else {
|
||
if toTime.Sub(fromTime) > 24*time.Hour*60 {
|
||
return nil, fmt.Errorf("售后单查询时间不能超过60天")
|
||
}
|
||
sqlWhere = `
|
||
WHERE t1.afs_created_at >= ? AND t1.afs_created_at <= ?
|
||
`
|
||
sqlParams = []interface{}{
|
||
fromTime,
|
||
toTime,
|
||
}
|
||
if keyword != "" {
|
||
keywordLike := "%" + keyword + "%"
|
||
sqlWhere += `
|
||
AND (t1.vendor_order_id2 LIKE ? OR t1.vendor_order_id LIKE ? OR t1.afs_order_id LIKE ?
|
||
OR t1.vendor_store_id LIKE ? OR t1.reason_desc LIKE ?
|
||
`
|
||
sqlParams = append(sqlParams, keywordLike, keywordLike, keywordLike, keywordLike, keywordLike)
|
||
if keywordInt64 := utils.Str2Int64WithDefault(keyword, 0); keywordInt64 > 0 {
|
||
sqlWhere += " OR t1.store_id = ? OR t1.jx_store_id = ?"
|
||
sqlParams = append(sqlParams, keywordInt64, keywordInt64)
|
||
}
|
||
sqlWhere += ")"
|
||
}
|
||
if len(storeIDList) > 0 {
|
||
sqlWhere += " AND IF(t1.jx_store_id != 0, t1.jx_store_id, t1.store_id) IN (" + dao.GenQuestionMarks(len(storeIDList)) + ")"
|
||
sqlParams = append(sqlParams, storeIDList)
|
||
}
|
||
if len(statusList) > 0 {
|
||
sqlWhere += " AND t1.status IN (" + dao.GenQuestionMarks(len(statusList)) + ")"
|
||
sqlParams = append(sqlParams, statusList)
|
||
}
|
||
if len(appealTypeList) > 0 {
|
||
sqlWhere += " AND t1.appeal_type IN (" + dao.GenQuestionMarks(len(appealTypeList)) + ")"
|
||
sqlParams = append(sqlParams, appealTypeList)
|
||
}
|
||
}
|
||
if len(vendorIDList) > 0 {
|
||
sqlWhere += " AND t1.vendor_id IN (" + dao.GenQuestionMarks(len(vendorIDList)) + ")"
|
||
sqlParams = append(sqlParams, vendorIDList)
|
||
}
|
||
|
||
sql += sqlWhere
|
||
sql += `
|
||
ORDER BY t1.afs_created_at DESC
|
||
LIMIT ? OFFSET ?
|
||
`
|
||
sqlParams = append(sqlParams, pageSize, offset)
|
||
|
||
var orders []*model.AfsOrder
|
||
db := dao.GetDB()
|
||
dao.Begin(db)
|
||
defer func() {
|
||
if r := recover(); r != nil || err != nil {
|
||
dao.Rollback(db)
|
||
if r != nil {
|
||
panic(r)
|
||
}
|
||
}
|
||
}()
|
||
if err = dao.GetRows(db, &orders, sql, sqlParams...); err == nil {
|
||
pagedInfo = &model.PagedInfo{
|
||
TotalCount: dao.GetLastTotalRowCount(db),
|
||
Data: orders,
|
||
}
|
||
dao.Commit(db)
|
||
}
|
||
return pagedInfo, err
|
||
}
|
||
|
||
func (c *OrderManager) GetAfsOrderSkuInfo(ctx *jxcontext.Context, afsOrderID string, vendorID int) (skus []*model.OrderFinancialSkuExt, err error) {
|
||
sql := `
|
||
SELECT t1.*, t3.img image
|
||
FROM order_sku_financial t1
|
||
JOIN sku t2 ON t2.id = IF(t1.jx_sku_id <> 0, t1.jx_sku_id, t1.sku_id)
|
||
JOIN sku_name t3 ON t3.id = t2.name_id
|
||
WHERE t1.afs_order_id = ? AND t1.vendor_id = ?
|
||
`
|
||
sqlParams := []interface{}{
|
||
afsOrderID,
|
||
vendorID,
|
||
}
|
||
err = dao.GetRows(dao.GetDB(), &skus, sql, sqlParams...)
|
||
return skus, err
|
||
}
|
||
|
||
func (c *OrderManager) GetStoreAfsOrderCountInfo(ctx *jxcontext.Context, storeID, lastHours int) (countInfo []*model.GoodsOrderCountInfo, err error) {
|
||
globals.SugarLogger.Debugf("GetStoreAfsOrderCountInfo storeID:%d", storeID)
|
||
if lastHours > maxLastHours {
|
||
lastHours = maxLastHours
|
||
} else if lastHours == 0 {
|
||
lastHours = defLastHours
|
||
}
|
||
|
||
db := dao.GetDB()
|
||
err = dao.GetRows(db, &countInfo, `
|
||
SELECT 0 lock_status, t1.status, COUNT(*) count
|
||
FROM afs_order t1
|
||
WHERE t1.vendor_id <> 2 AND IF(t1.vendor_id = ?, t1.store_id, IF(t1.jx_store_id != 0, t1.jx_store_id, t1.store_id) ) = ?
|
||
AND t1.afs_created_at >= ?
|
||
GROUP BY 1,2
|
||
ORDER BY 1,2
|
||
`, model.VendorIDWSC, storeID, time.Now().Add(-time.Duration(lastHours)*time.Hour))
|
||
if err == nil {
|
||
return countInfo, nil
|
||
}
|
||
globals.SugarLogger.Infof("GetStoreAfsOrderCountInfo storeID:%d failed with error:%v", storeID, err)
|
||
return nil, err
|
||
}
|