Files
jx-callback/business/jxcallback/orderman/orderman_ext.go
2018-10-28 14:10:58 +08:00

468 lines
16 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
package orderman
import (
"strconv"
"time"
"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)"`
}
func (c *OrderManager) GetStoreOrderInfo(ctx *jxcontext.Context, storeID string, lastHours int, fromStatus, toStatus, offset, pageSize int) (orders []*model.GoodsOrderExt, err error) {
globals.SugarLogger.Debugf("GetStoreOrderInfo storeID:%s", storeID)
if lastHours > maxLastHours {
lastHours = maxLastHours
} else if lastHours == 0 {
lastHours = defLastHours
}
if toStatus == 0 {
toStatus = fromStatus
}
if offset < 0 {
offset = 0
}
pageSize = jxutils.FormalizePageSize(pageSize)
db := orm.NewOrm()
_, 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 IF(t1.jx_store_id != 0, t1.jx_store_id, t1.store_id) = ?
AND t1.order_created_at >= ?
AND t1.Status >= ? AND t1.Status <= ?
ORDER BY t1.status, t1.order_created_at
LIMIT ? OFFSET ?
`, storeID, time.Now().Add(-time.Duration(lastHours)*time.Hour), fromStatus, toStatus, pageSize, offset).QueryRows(&orders)
if err == nil {
return orders, nil
}
globals.SugarLogger.Infof("GetStoreOrderInfo storeID:%s failed with error:%v", storeID, err)
return nil, err
}
func (c *OrderManager) GetStoreOrderCountInfo(ctx *jxcontext.Context, storeID string, lastHours int) (countInfo []*model.GoodsOrderCountInfo, err error) {
globals.SugarLogger.Debugf("GetStoreOrderCountInfo storeID:%s", storeID)
if lastHours > maxLastHours {
lastHours = maxLastHours
} else if lastHours == 0 {
lastHours = defLastHours
}
db := orm.NewOrm()
_, err = db.Raw(`
SELECT t1.status, COUNT(*) count
FROM goods_order t1
WHERE IF(t1.jx_store_id != 0, t1.jx_store_id, t1.store_id) = ?
AND t1.order_created_at >= ?
GROUP BY 1
ORDER BY 1
`, storeID, time.Now().Add(-time.Duration(lastHours)*time.Hour)).QueryRows(&countInfo)
if err == nil {
return countInfo, nil
}
globals.SugarLogger.Infof("GetStoreOrderCountInfo storeID:%s 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)
if globals.OrderUseNewTable {
db := dao.GetDB()
if vendorID == model.VendorIDELM {
err = dao.GetRows(db, &skus, `
SELECT t1.*, IF(t3.img IS NULL OR t3.img = '', t4.col_imageUrl, t3.img) image
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
`, utils.DefaultTimeValue, utils.DefaultTimeValue, vendorOrderID, vendorID)
} else if vendorID == model.VendorIDJD {
err = dao.GetRows(db, &skus, `
SELECT t1.*, IF(t3.img IS NULL OR t3.img = '', t4.image, t3.img) image
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
`, utils.DefaultTimeValue, utils.DefaultTimeValue, vendorOrderID, vendorID)
}
if err != nil || len(skus) == 0 {
err = dao.GetRows(db, &skus, `
SELECT t1.*, t3.img image
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
`, 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
}
db := orm.NewOrm()
var num int64
// 为了显示图片,非正规的使用导出表
if vendorID == model.VendorIDELM {
num, err = db.Raw(`
SELECT t1.*, IF(t3.img IS NULL OR t3.img = '', t4.col_imageUrl, t3.img) image
FROM order_sku t1
LEFT JOIN jx_sku t2 ON IF(t1.jx_sku_id != 0, t1.jx_sku_id, t1.sku_id) = t2.id
LEFT JOIN jx_sku_name t3 ON t2.nameid = t3.id
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
`, vendorOrderID, vendorID).QueryRows(&skus)
} else if vendorID == model.VendorIDJD {
num, err = db.Raw(`
SELECT t1.*, IF(t3.img IS NULL OR t3.img = '', t4.image, t3.img) image
FROM order_sku t1
LEFT JOIN jx_sku t2 ON IF(t1.jx_sku_id != 0, t1.jx_sku_id, t1.sku_id) = t2.id
LEFT JOIN jx_sku_name t3 ON t2.nameid = t3.id
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
`, vendorOrderID, vendorID).QueryRows(&skus)
}
if err != nil || num == 0 {
num, err = db.Raw(`
SELECT t1.*, t3.img image
FROM order_sku t1
LEFT JOIN jx_sku t2 ON IF(t1.jx_sku_id != 0, t1.jx_sku_id, t1.sku_id) = t2.id
LEFT JOIN jx_sku_name t3 ON t2.nameid = t3.id
WHERE vendor_order_id = ? AND vendor_id = ?
ORDER BY t1.sku_name
`, vendorOrderID, vendorID).QueryRows(&skus)
}
if err == nil && num > 0 {
return skus, nil
}
if err == nil {
err = ErrCanNotFindOrder
}
globals.SugarLogger.Infof("GetOrderSkuInfo orderID:%s vendorID:%d failed with error:%v", vendorOrderID, vendorID, err)
return nil, err
}
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) (bills []*model.Waybill, err error) {
globals.SugarLogger.Debugf("GetOrderWaybillInfo orderID:%s", vendorOrderID)
db := orm.NewOrm()
_, err = db.Raw(`
SELECT t1.*
FROM waybill t1
WHERE t1.vendor_order_id = ? AND order_vendor_id = ?
`, vendorOrderID, vendorID).QueryRows(&bills)
if err == nil {
return bills, nil
}
globals.SugarLogger.Infof("GetOrderWaybillInfo orderID:%s failed with error:%v", vendorOrderID, err)
return nil, 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 := utils.Str2Time(fromDateStr)
if toDateStr == "" {
toDateStr = fromDateStr
}
toDate := utils.Str2Time(toDateStr).Add(24 * time.Hour)
var waybills []*tWaybillExt
sql := `
SELECT t1.*, t2.store_name, IF(t2.store_id <> 0, t2.store_id, t2.jx_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, 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, 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)
fromDate := utils.Str2Time(fromDateStr)
if toDateStr == "" {
toDateStr = fromDateStr
}
toDate := utils.Str2Time(toDateStr).Add(24 * time.Hour)
pageSize = jxutils.FormalizePageSize(pageSize)
if offset < 0 {
offset = 0
}
sql := `
SELECT SQL_CALC_FOUND_ROWS 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
`
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_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)
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["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["waybillVendorIDs"] != nil {
var waybillVendorIDs []int
if err = utils.UnmarshalUseNumber([]byte(params["waybillVendorIDs"].(string)), &waybillVendorIDs); err != nil {
return nil, err
}
if len(waybillVendorIDs) > 0 {
sqlWhere += " AND t2.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, err
}
if len(storeIDs) > 0 {
sqlWhere += " AND IF(t1.jx_store_id != 0, t1.jx_store_id, t1.store_id) IN (" + dao.GenQuestionMarks(len(storeIDs)) + ")"
sqlParams = append(sqlParams, 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 t1.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 t1.store_id = st.id"
sqlWhere += " AND st.city_code IN (" + dao.GenQuestionMarks(len(cities)) + ")"
sqlParams = append(sqlParams, cities)
}
}
sql += sqlWhere
sql += `
ORDER BY t1.order_created_at DESC
LIMIT ? OFFSET ?
`
sqlParams = append(sqlParams, pageSize, offset)
var orders []*model.GoodsOrderExt
pagedInfo = &model.PagedInfo{}
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 {
countInfo := &struct{ Ct int }{}
if err = dao.GetRow(db, countInfo, "SELECT FOUND_ROWS() ct"); err == nil {
pagedInfo.TotalCount = countInfo.Ct
pagedInfo.Data = orders
}
}
dao.Commit(db)
return pagedInfo, 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 := utils.Str2Time(fromDateStr)
if toDateStr == "" {
toDateStr = fromDateStr
}
toDate := utils.Str2Time(toDateStr).Add(24 * time.Hour)
pageSize = jxutils.FormalizePageSize(pageSize)
if offset < 0 {
offset = 0
}
sqlParams := []interface{}{
fromDate,
toDate,
}
sql := `
SELECT SQL_CALC_FOUND_ROWS t1.*, t2.store_name, IF(t2.store_id <> 0, t2.store_id, t2.jx_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
pagedInfo = &model.PagedInfo{}
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 {
countInfo := &struct{ Ct int }{}
if err = dao.GetRow(db, countInfo, "SELECT FOUND_ROWS() ct"); err == nil {
pagedInfo.TotalCount = countInfo.Ct
pagedInfo.Data = waybills
return pagedInfo, nil
}
}
dao.Commit(db)
return nil, err
}