Files
jx-callback/business/model/dao/dao_order.go
2020-07-21 15:19:49 +08:00

1345 lines
47 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 dao
import (
"fmt"
"strconv"
"time"
"git.rosy.net.cn/baseapi/utils"
"git.rosy.net.cn/jx-callback/business/jxutils"
"git.rosy.net.cn/jx-callback/business/model"
"git.rosy.net.cn/jx-callback/globals"
)
const (
AfsOrderStatus = -1
)
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"` // 预估结算给门店老板的钱
NewEarningPrice int64 `json:"newEarningPrice"` // 预估结算给门店老板的钱(新规则)
DistanceFreightMoney int64 `json:"distanceFreightMoney"` // 商户承担的远距离配送费(当前只有京东到家有值)
WaybillTipMoney int64 `json:"waybillTipMoney"` // 京西加的平台配送小费
}
type OrderSkuWithActualPayPrice struct {
model.OrderSku
ActualPayPrice int64 `json:"actualPayPrice"` // 单位为分 顾客实际支付
DistanceFreightMoney int64 `json:"distanceFreightMoney"` // 商户承担的远距离配送费(当前只有京东到家有值)
WaybillTipMoney int64 `json:"waybillTipMoney"` // 京西加的平台配送小费
StoreID int `orm:"column(store_id)" json:"storeID"` // 外部系统里记录的 jxstoreid
Status int `json:"status"` // 参见OrderStatus*相关的常量定义
PayPercentage int `json:"payPercentage"`
NewEarningPrice int64 `json:"newEarningPrice"`
}
type tGoodsAndOrder struct {
model.GoodsOrder
OrderSkuID int64 `orm:"column(order_sku_id)" json:"orderSkuID"`
StoreSubID int `orm:"column(store_sub_id)" json:"storeSubID"` // 当前这个字段被当成结算活动ID用
StoreSubName string `orm:"size(64)" json:"storeSubName"` // 当前这个字段被用作vendorActType
Count int `json:"count"`
VendorSkuID string `orm:"column(vendor_sku_id);size(48)" json:"vendorSkuID"`
SkuID int `orm:"column(sku_id)" json:"skuID"` // 外部系统里记录的 jxskuid
JxSkuID int `orm:"column(jx_sku_id)" json:"jxSkuID"` // 根据VendorSkuID在本地系统里查询出来的 jxskuid
SkuName string `orm:"size(255)" json:"skuName"`
SkuShopPrice int64 `json:"shopPrice"` // 京西价
SkuVendorPrice int64 `json:"vendorPrice"` // 平台价
SkuSalePrice int64 `json:"salePrice"` // 售卖价
SkuEarningPrice int64 `json:"earningPrice"` // 活动商品设置结算给门店老板的钱如果结算活动ID为0是按结算比例算的否则就是结算表中的值
Weight int `json:"weight"` // 单位为克
SkuType int `json:"skuType"` // 当前如果为gift就为1否则缺省为0
PromotionType int `json:"promotionType"` // todo 当前是用于记录京东的PromotionType(生成jxorder用),没有做转换
}
type GoodsOrderPay struct {
model.GoodsOrder
TransactionID string `orm:"column(transaction_id)" json:"transactionID"`
}
//actID指结算活动的id
func QueryOrders(db *DaoDB, vendorOrderID string, actID int, vendorIDs []int, storeID int, fromDate, toDate time.Time) (orderList []*model.GoodsOrder, err error) {
sqlParams := []interface{}{}
var (
orderNewList []*tGoodsAndOrder
orderNewMap map[string][]*model.OrderSku
)
sql := `
SELECT a.*,
b.id order_sku_id, b.store_sub_id, b.store_sub_name, b.count, b.vendor_sku_id, b.sku_id, b.jx_sku_id, b.sku_name, b.shop_price sku_shop_price,
b.vendor_price sku_vendor_price, b.sale_price sku_sale_price, b.earning_price sku_earning_price, b.weight, b.sku_type, b.promotion_type
FROM goods_order a
JOIN order_sku b ON a.vendor_order_id = b.vendor_order_id
`
if actID > 0 {
sql += `
JOIN ( SELECT t4.vendor_order_id, t4.vendor_id
FROM act t1
JOIN act_store_sku t2 ON t2.act_id = t1.id
JOIN order_sku t3 ON t3.sku_id = t2.sku_id
JOIN goods_order t4 ON t4.vendor_order_id = t3.vendor_order_id
AND t4.vendor_id = t3.vendor_id
AND t2.store_id = IF(t4.jx_store_id <> 0, t4.jx_store_id, t4.store_id)
AND t4.order_created_at BETWEEN t1.begin_at AND t1.end_at
WHERE t1.status = 1
AND t1.id = ?
GROUP BY 1,2
)s ON s.vendor_order_id = a.vendor_order_id AND s.vendor_id = a.vendor_id
`
sqlParams = append(sqlParams, actID)
}
sql += `
WHERE 1=1
`
if vendorOrderID != "" {
sql += " AND a.vendor_order_id = ?"
sqlParams = append(sqlParams, vendorOrderID)
}
if len(vendorIDs) > 0 {
sql += " AND a.vendor_id IN (" + GenQuestionMarks(len(vendorIDs)) + ")"
sqlParams = append(sqlParams, vendorIDs)
}
if storeID > 0 {
sql += " AND IF(a.jx_store_id <> 0, a.jx_store_id, a.store_id) = ?"
sqlParams = append(sqlParams, storeID)
}
if !utils.IsTimeZero(fromDate) && !utils.IsTimeZero(toDate) {
sql += " AND a.order_created_at BETWEEN ? AND ?"
sqlParams = append(sqlParams, fromDate, toDate)
}
err = GetRows(db, &orderNewList, sql, sqlParams...)
if len(orderNewList) > 0 {
orderNewMap = make(map[string][]*model.OrderSku)
for _, v := range orderNewList {
if orderNewMap[v.VendorOrderID] == nil {
orderList = append(orderList, &v.GoodsOrder)
}
orderNewMap[v.VendorOrderID] = append(orderNewMap[v.VendorOrderID], &model.OrderSku{
ID: v.OrderSkuID,
VendorOrderID: v.VendorOrderID,
VendorID: v.VendorID,
StoreSubID: v.StoreSubID,
StoreSubName: v.StoreSubName,
Count: v.Count,
VendorSkuID: v.VendorSkuID,
SkuID: v.SkuID,
JxSkuID: v.JxSkuID,
SkuName: v.SkuName,
ShopPrice: v.SkuShopPrice,
VendorPrice: v.SkuVendorPrice,
SalePrice: v.SkuSalePrice,
EarningPrice: v.SkuEarningPrice,
Weight: v.Weight,
SkuType: v.SkuType,
PromotionType: v.PromotionType,
})
}
for _, v := range orderList {
v.Skus = orderNewMap[v.VendorOrderID]
}
}
return orderList, err
}
// func QueryOrders(db *DaoDB, vendorOrderID string, vendorIDs []int, storeID int, orderCreatedAtBegin, orderCreatedAtEnd time.Time) (orderList []*model.GoodsOrder, err error) {
// sql := `
// SELECT t1.*
// FROM goods_order t1
// WHERE t1.order_created_at >= ?`
// sqlParams := []interface{}{
// orderCreatedAtBegin,
// }
// if vendorOrderID != "" {
// sql += " AND t1.vendor_order_id = ?"
// sqlParams = append(sqlParams, vendorOrderID)
// }
// if len(vendorIDs) > 0 {
// sql += " AND t1.vendor_id IN (" + GenQuestionMarks(len(vendorIDs)) + ")"
// sqlParams = append(sqlParams, vendorIDs)
// }
// if storeID > 0 {
// sql += " AND IF(t1.jx_store_id <> 0, t1.jx_store_id, t1.store_id) = ?"
// sqlParams = append(sqlParams, storeID)
// }
// if !utils.IsTimeZero(orderCreatedAtEnd) {
// sql += " AND t1.order_created_at <= ?"
// sqlParams = append(sqlParams, orderCreatedAtEnd)
// }
// // sql += " ORDER BY t1.order_created_at DESC, t1.id DESC;"
// return orderList, GetRows(db, &orderList, sql, sqlParams...)
// }
func GetStoreOrderAfterTime(db *DaoDB, storeID int, orderTime time.Time, lastOrderSeqID int64) (orderList []*model.GoodsOrderExt, err error) {
sql := `
SELECT t1.*,
t2.status waybill_status, t2.courier_name, t2.courier_mobile,
t2.actual_fee, t2.desired_fee, t2.waybill_created_at, t2.waybill_finished_at
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.id > ? AND t1.status >= ? AND t1.status < ?
AND (t1.flag & ?) = 0
ORDER BY t1.order_created_at DESC, t1.id DESC;
`
sqlParams := []interface{}{
storeID,
orderTime,
lastOrderSeqID,
model.OrderStatusNew,
model.OrderStatusEndBegin,
model.OrderFlagMaskFake,
}
return orderList, GetRows(db, &orderList, sql, sqlParams...)
}
func SetOrderPrintFlag(db *DaoDB, userName string, vendorOrderID string, vendorID int, isPrinted bool) (err error) {
if isPrinted {
err = SetOrderFlag(db, userName, vendorOrderID, vendorID, model.OrderFlagMaskPrinted)
} else {
err = SetOrderFlag(db, userName, vendorOrderID, vendorID, ^model.OrderFlagMaskPrinted)
}
return err
}
func SetOrderFlag(db *DaoDB, userName string, vendorOrderID string, vendorID int, flag int) (err error) {
_, err = ExecuteSQL(db, `
UPDATE goods_order
SET flag = flag | ?
WHERE vendor_order_id = ? AND vendor_id = ?
`, flag, vendorOrderID, vendorID)
return err
}
func ClearOrderFlag(db *DaoDB, userName string, vendorOrderID string, vendorID int, flag int) (err error) {
_, err = ExecuteSQL(db, `
UPDATE goods_order
SET flag = flag & ?
WHERE vendor_order_id = ? AND vendor_id = ?
`, ^flag, vendorOrderID, vendorID)
return err
}
func ClearOrderFlag2(db *DaoDB, userName string, vendorOrderID string, vendorID int, flag int) (err error) {
_, err = ExecuteSQL(db, `
UPDATE goods_order
SET flag = ?
WHERE vendor_order_id = ? AND vendor_id = ?
`, flag, vendorOrderID, vendorID)
return err
}
func SetAfsOrderFlag(db *DaoDB, userName string, afsOrderID string, vendorID int, flag int) (err error) {
_, err = ExecuteSQL(db, `
UPDATE afs_order
SET flag = flag | ?
WHERE afs_order_id = ? AND vendor_id = ?
`, flag, afsOrderID, vendorID)
return err
}
func GetAfsOrders(db *DaoDB, vendorID int, vendorOrderID, afsOrderID string) (afsOrderList []*model.AfsOrder, err error) {
sql := `
SELECT *
FROM afs_order t1
WHERE t1.vendor_id = ?
`
sqlParams := []interface{}{
vendorID,
}
if vendorOrderID != "" {
sql += " AND t1.vendor_order_id = ?"
sqlParams = append(sqlParams, vendorOrderID)
}
if afsOrderID != "" {
sql += " AND t1.afs_order_id = ?"
sqlParams = append(sqlParams, afsOrderID)
}
sql += " ORDER BY t1.afs_order_id DESC"
err = GetRows(db, &afsOrderList, sql, sqlParams...)
return afsOrderList, err
}
// 时间范围是订单完成时间
func GetStoresOrderSaleInfo(db *DaoDB, storeIDList []int, fromTime time.Time, toTime time.Time, statusList []int) (saleInfoList []*StoresOrderSaleInfo, err error) {
if utils.IsTimeZero(fromTime) {
return nil, fmt.Errorf("查询订单信息必须指定起始时间")
}
if utils.IsTimeZero(toTime) {
toTime = time.Now()
}
if toTime.Sub(fromTime) > time.Hour*24*60 {
return nil, fmt.Errorf("查询时间范围不能超过60天")
}
// 用int64类型去取float型的数据库返回值会取不到
// order_finished_at
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 (" + GenQuestionMarks(len(storeIDList)) + ")"
sqlParams = append(sqlParams, storeIDList)
}
if len(statusList) > 0 {
sql += " AND t1.status IN (" + GenQuestionMarks(len(statusList)) + ")"
sqlParams = append(sqlParams, statusList)
}
sql += `
GROUP BY 1,2,3`
sql += fmt.Sprintf(`
UNION
SELECT IF(t0.jx_store_id > 0, t0.jx_store_id, t0.store_id) store_id, t0.vendor_id, -1 status,
COUNT(DISTINCT(t0.id)) count, SUM(t1.shop_price) shop_price, SUM(t1.vendor_price) vendor_price, SUM(t1.sale_price) sale_price, 0 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 afs_order t0
JOIN order_sku_financial t2 ON t2.afs_order_id = t0.afs_order_id AND t2.vendor_id = t0.vendor_id AND t2.is_afs_order = 1
JOIN order_sku t1 ON t1.vendor_order_id = t2.vendor_order_id AND t1.vendor_id = t2.vendor_id AND t1.sku_id = t2.sku_id
LEFT JOIN store t5 ON t5.id = IF(t0.jx_store_id <> 0, t0.jx_store_id, t0.store_id)
WHERE t0.afs_finished_at >= ? AND t0.afs_finished_at <= ?`, model.DefaultEarningPricePercentage)
sqlParams = append(sqlParams, []interface{}{
fromTime,
toTime,
})
if len(storeIDList) > 0 {
sql += " AND IF(t0.jx_store_id > 0, t0.jx_store_id, t0.store_id) IN (" + GenQuestionMarks(len(storeIDList)) + ")"
sqlParams = append(sqlParams, storeIDList)
}
sql += `
GROUP BY 1,2,3`
sql += " ORDER BY 1,2,3"
// globals.SugarLogger.Debug(sql)
err = GetRows(db, &saleInfoList, sql, sqlParams...)
return saleInfoList, err
}
func GetAfsOrderSkuInfo(db *DaoDB, vendorOrderID, afsOrderID string, vendorID int, isNotFaild bool) (skus []*model.OrderFinancialSkuExt, err error) {
if vendorOrderID == "" && afsOrderID == "" {
return nil, fmt.Errorf("必须指定订单或售后单ID")
}
sql := `
SELECT t1.*, t3.img image
FROM order_sku_financial t1
LEFT JOIN sku t2 ON t2.id = IF(t1.jx_sku_id <> 0, t1.jx_sku_id, t1.sku_id)
LEFT JOIN sku_name t3 ON t3.id = t2.name_id
LEFT JOIN afs_order t4 ON t4.afs_order_id = t1.afs_order_id
WHERE t1.is_afs_order = 1 AND t1.vendor_id = ?`
sqlParams := []interface{}{
vendorID,
}
if vendorOrderID != "" {
sql += " AND t1.vendor_order_id = ?"
sqlParams = append(sqlParams, vendorOrderID)
}
if afsOrderID != "" {
sql += " AND t1.afs_order_id = ?"
sqlParams = append(sqlParams, afsOrderID)
}
if isNotFaild {
sql += " AND t4.status <> ?"
sqlParams = append(sqlParams, model.AfsOrderStatusFailed)
}
err = GetRows(db, &skus, sql, sqlParams...)
return skus, err
}
func GetStoreOrderSkuList(db *DaoDB, storeIDs []int, finishedAtBegin, finishedAtEnd time.Time, statusList []int, isFinish bool) (skuList []*OrderSkuWithActualPayPrice, err error) {
// order_finished_at
sql := `
SELECT t1.*,
IF(t2.jx_store_id > 0, t2.jx_store_id, t2.store_id) store_id, t2.status, t2.actual_pay_price, t2.distance_freight_money, t2.waybill_tip_money, t2.new_earning_price,
t3.pay_percentage
FROM order_sku t1
JOIN goods_order t2 ON t2.vendor_order_id = t1.vendor_order_id AND t2.vendor_id = t1.vendor_id
LEFT JOIN store t3 ON t3.id = IF(t2.jx_store_id > 0, t2.jx_store_id, t2.store_id)
WHERE 1=1`
if isFinish {
sql += " AND t2.order_finished_at >= ? AND t2.order_finished_at <= ?"
} else {
sql += " AND t2.order_created_at >= ? AND t2.order_created_at <= ?"
}
sqlParams := []interface{}{
finishedAtBegin,
finishedAtEnd,
}
if len(storeIDs) > 0 {
sql += " AND IF(t2.jx_store_id > 0, t2.jx_store_id, t2.store_id) IN (" + GenQuestionMarks(len(storeIDs)) + ")"
sqlParams = append(sqlParams, storeIDs)
}
if len(statusList) > 0 {
sql += " AND t2.status IN (" + GenQuestionMarks(len(statusList)) + ")"
sqlParams = append(sqlParams, statusList)
}
err = GetRows(db, &skuList, sql, sqlParams...)
return skuList, err
}
func GetStoreOrderSkuList4Afs(db *DaoDB, storeIDs []int, finishedAtBegin, finishedAtEnd time.Time, isFinish bool) (skuList []*OrderSkuWithActualPayPrice, err error) {
sql := `
SELECT t1.*,
t2.actual_pay_price, t2.status, IF(t2.jx_store_id > 0, t2.jx_store_id, t2.store_id) store_id, t2.new_earning_price,
t3.pay_percentage
FROM order_sku t1
JOIN goods_order t2 ON t2.vendor_order_id = t1.vendor_order_id AND t2.vendor_id = t1.vendor_id
LEFT JOIN store t3 ON t3.id = IF(t2.jx_store_id > 0, t2.jx_store_id, t2.store_id)
JOIN (
SELECT t12.*
FROM afs_order t12
WHERE IF(t12.jx_store_id > 0, t12.jx_store_id, t12.store_id) IN (` + GenQuestionMarks(len(storeIDs))
if isFinish {
sql += ") AND t12.afs_finished_at >= ? AND t12.afs_finished_at <= ?"
} else {
sql += ") AND t12.afs_created_at >= ? AND t12.afs_created_at <= ?"
}
sql += ") t4 ON t4.vendor_order_id = t2.vendor_order_id AND t4.vendor_id = t2.vendor_id"
sqlParams := []interface{}{
storeIDs,
finishedAtBegin,
finishedAtEnd,
}
err = GetRows(db, &skuList, sql, sqlParams...)
return skuList, err
}
func GetStoreAfsOrderSkuList(db *DaoDB, storeIDs []int, finishedAtBegin, finishedAtEnd time.Time, statusList []int, isFinish bool) (afsSkuList []*model.OrderSkuFinancial, err error) {
sql := `
SELECT t1.*
FROM order_sku_financial t1
JOIN afs_order t2 ON t2.vendor_order_id = t1.vendor_order_id AND t2.vendor_id = t1.vendor_id AND t2.afs_order_id = t1.afs_order_id
WHERE t1.is_afs_order = 1
`
if isFinish {
sql += " AND t2.afs_finished_at >= ? AND t2.afs_finished_at <= ?"
} else {
sql += " AND t2.afs_created_at >= ? AND t2.afs_created_at <= ?"
}
sqlParams := []interface{}{
finishedAtBegin,
finishedAtEnd,
}
if len(storeIDs) > 0 {
sql += " AND IF(t2.jx_store_id > 0, t2.jx_store_id, t2.store_id) IN (" + GenQuestionMarks(len(storeIDs)) + ")"
sqlParams = append(sqlParams, storeIDs)
}
if len(statusList) > 0 {
sql += " AND t2.status IN (" + GenQuestionMarks(len(statusList)) + ")"
sqlParams = append(sqlParams, statusList)
}
err = GetRows(db, &afsSkuList, sql, sqlParams...)
return afsSkuList, err
}
func GetDailyFinishOrderList(db *DaoDB, storeID int, dateTime time.Time) (orderList []*model.OrderPickupTime, err error) {
sql := `
SELECT t2.status_time, t1.pick_deadline
FROM goods_order t1
JOIN order_status t2 ON t1.vendor_order_id = t2.vendor_order_id AND t1.vendor_id = t2.vendor_id
WHERE t1.jx_store_id = ? AND t2.order_type = ? AND t2.status = ? AND DATE(t1.order_finished_at) = DATE(?)
`
sqlParams := []interface{}{
storeID,
model.OrderTypeOrder,
model.OrderStatusFinishedPickup,
dateTime,
}
return orderList, GetRows(db, &orderList, sql, sqlParams...)
}
func GetDailyBadCommentOrderCount(db *DaoDB, dateTime time.Time) (storeCountList []*model.StoreCount, err error) {
beginTime, endTime := utils.GetTimeRange(dateTime, 1, true)
return GetBadCommentOrderCount(db, beginTime, endTime)
}
func GetBadCommentOrderCountByDayNum(db *DaoDB, dayNum int, includeToday bool) (storeCountList []*model.StoreCount, err error) {
beginTime, endTime := utils.GetTimeRange(utils.GetCurDate(), dayNum, includeToday)
return GetBadCommentOrderCount(db, beginTime, endTime)
}
func GetBadCommentOrderCount(db *DaoDB, beginTime, endTime time.Time) (storeCountList []*model.StoreCount, err error) {
sql := `
SELECT jxstoreid store_id, COUNT(*) count
FROM jx_bad_comments
WHERE createtime >= ? AND createtime <= ?
GROUP BY jxstoreid
`
sqlParams := []interface{}{
beginTime,
endTime,
}
err = GetRows(db, &storeCountList, sql, sqlParams)
return storeCountList, err
}
func GetDailyUnFinishOrderCount(db *DaoDB, dateTime time.Time) (storeCountList []*model.StoreCount, err error) {
beginTime, endTime := utils.GetTimeRange(dateTime, 1, true)
return GetUnFinishOrderCount(db, beginTime, endTime)
}
func GetDailyFinishOrderCount(db *DaoDB, dateTime time.Time) (storeCountList []*model.StoreCount, err error) {
beginTime, endTime := utils.GetTimeRange(dateTime, 1, true)
return GetFinishOrderCount(db, beginTime, endTime)
}
func GetDailyAbsentGoodsOrderCount(db *DaoDB, dateTime time.Time) (storeCountList []*model.StoreCount, err error) {
beginTime, endTime := utils.GetTimeRange(dateTime, 1, true)
return GetAbsentGoodsOrderCount(db, beginTime, endTime)
}
func GetUnFinishOrderCount(db *DaoDB, beginTime, endTime time.Time) (storeCountList []*model.StoreCount, err error) {
return GetEndOrderCount(db, []int{model.OrderStatusCanceled}, false, beginTime, endTime)
}
func GetFinishOrderCount(db *DaoDB, beginTime, endTime time.Time) (storeCountList []*model.StoreCount, err error) {
return GetEndOrderCount(db, []int{model.OrderStatusFinished}, false, beginTime, endTime)
}
func GetAbsentGoodsOrderCount(db *DaoDB, beginTime, endTime time.Time) (storeCountList []*model.StoreCount, err error) {
return GetEndOrderCount(db, []int{model.OrderStatusFinished}, true, beginTime, endTime)
}
func GetUnFinishOrderCountByDayNum(db *DaoDB, dayNum int, includeToday bool) (storeCountList []*model.StoreCount, err error) {
return GetEndOrderCountByDayNum(db, []int{model.OrderStatusCanceled}, false, dayNum, includeToday)
}
func GetFinishOrderCountByDayNum(db *DaoDB, dayNum int, includeToday bool) (storeCountList []*model.StoreCount, err error) {
return GetEndOrderCountByDayNum(db, []int{model.OrderStatusFinished}, false, dayNum, includeToday)
}
func GetAbsentGoodsOrderCountByDayNum(db *DaoDB, dayNum int, includeToday bool) (storeCountList []*model.StoreCount, err error) {
return GetEndOrderCountByDayNum(db, []int{model.OrderStatusFinished}, true, dayNum, includeToday)
}
func GetEndOrderCountByDayNum(db *DaoDB, statusList []int, checkAbsentOrder bool, dayNum int, includeToday bool) (storeCountList []*model.StoreCount, err error) {
beginTime, endTime := utils.GetTimeRange(utils.GetCurDate(), dayNum, includeToday)
return GetEndOrderCount(db, statusList, checkAbsentOrder, beginTime, endTime)
}
func GetEndOrderCount(db *DaoDB, statusList []int, checkAbsentOrder bool, beginTime, endTime time.Time) (storeCountList []*model.StoreCount, err error) {
sql := `
SELECT jx_store_id store_id, COUNT(*) count
FROM goods_order
WHERE order_finished_at >= ? AND order_finished_at <= ?
`
sqlParams := []interface{}{
beginTime,
endTime,
}
if len(statusList) > 0 {
sql += ` AND status IN (` + GenQuestionMarks(len(statusList)) + `)`
sqlParams = append(sqlParams, statusList)
}
if checkAbsentOrder {
sql += `
AND adjust_count > 0
`
}
sql += `
GROUP BY jx_store_id`
err = GetRows(db, &storeCountList, sql, sqlParams)
return storeCountList, err
}
func GetFinishOrderCountByDaDa(db *DaoDB, dayNum int, includeToday bool) (storeCountList []*model.StoreCount, err error) {
return GetFinishOrderCountByWayBillVendorID(db, model.VendorIDDada, dayNum, includeToday)
}
func GetFinishOrderCountBySelfDelivery(db *DaoDB, dayNum int, includeToday bool) (storeCountList []*model.StoreCount, err error) {
return GetFinishOrderCountByWayBillVendorID(db, model.VendorIDUnknown, dayNum, includeToday)
}
//通过运单平台ID来统计完成的订单量
func GetFinishOrderCountByWayBillVendorID(db *DaoDB, wayBillVendorID, dayNum int, includeToday bool) (storeCountList []*model.StoreCount, err error) {
sql := `
SELECT jx_store_id store_id, COUNT(*) count
FROM goods_order
where order_finished_at >= ? AND order_finished_at <= ?
AND status = ?
AND waybill_vendor_id = ?
GROUP BY jx_store_id
`
beginTime, endTime := utils.GetTimeRange(utils.GetCurDate(), dayNum, includeToday)
sqlParams := []interface{}{
beginTime,
endTime,
model.OrderStatusFinished,
wayBillVendorID,
}
return storeCountList, GetRows(db, &storeCountList, sql, sqlParams)
}
//拣货履约订单量, 仅统计达达专送
func GetStandardPickTimeOrderCountByDaDa(db *DaoDB, dayNum int, includeToday bool) (storeCountList []*model.StoreCount, err error) {
sql := `
SELECT t1.jx_store_id store_id, COUNT(*) count
FROM goods_order t1
JOIN order_status t2 ON t1.vendor_order_id = t2.vendor_order_id AND t1.vendor_id = t2.vendor_id
WHERE t1.order_finished_at >= ? AND t1.order_finished_at <= ?
AND t1.status = ?
AND t1.waybill_vendor_id = ?
AND t2.order_type = ?
AND t2.status = ?
AND t2.status_time <= t1.pick_deadline
GROUP BY t1.jx_store_id
`
beginTime, endTime := utils.GetTimeRange(utils.GetCurDate(), dayNum, includeToday)
sqlParams := []interface{}{
beginTime,
endTime,
model.OrderStatusFinished,
model.VendorIDDada,
model.OrderTypeOrder,
model.OrderStatusFinishedPickup,
}
return storeCountList, GetRows(db, &storeCountList, sql, sqlParams)
}
//按时履约订单量, 仅统计商家自送门店
func GetStandardFinishTimeOrderCountBySelfDelivery(db *DaoDB, dayNum int, includeToday bool) (storeCountList []*model.StoreCount, err error) {
sql := `
SELECT jx_store_id store_id, order_created_at, order_finished_at
FROM goods_order
WHERE order_finished_at >= ? AND order_finished_at <= ?
AND status = ?
AND waybill_vendor_id = ?
`
beginTime, endTime := utils.GetTimeRange(utils.GetCurDate(), dayNum, includeToday)
sqlParams := []interface{}{
beginTime,
endTime,
model.OrderStatusFinished,
model.VendorIDUnknown,
}
standardTime := int64(3600)
var storeOrderTimeList []*model.StoreOrderTime
storeOrderTimeMapData := make(map[int]int)
err = GetRows(db, &storeOrderTimeList, sql, sqlParams)
if err == nil && len(storeOrderTimeList) > 0 {
for _, value := range storeOrderTimeList {
if value.OrderFinishedTime.Unix()-value.OrderCreateTime.Unix() <= standardTime {
storeOrderTimeMapData[value.StoreID]++
}
}
for storeID, count := range storeOrderTimeMapData {
storeCountList = append(storeCountList, &model.StoreCount{storeID, count})
}
}
return storeCountList, err
}
//10分钟取货完成订单量, 仅统计达达专送
func GetStandardPickUpTimeOrderCountByDaDa(db *DaoDB, dayNum int, includeToday bool) (storeCountList []*model.StoreCount, err error) {
sql := `
SELECT t1.jx_store_id store_id, t1.vendor_order_id, t2.status_time, t2.status
FROM goods_order t1
JOIN order_status t2 ON t1.vendor_order_id = t2.vendor_order_id AND t1.vendor_id = t2.vendor_id
WHERE t1.order_finished_at >= ? AND t1.order_finished_at <= ?
AND t1.status = ?
AND t1.waybill_vendor_id = ?
AND t2.status in (?, ?)
ORDER BY t1.vendor_order_id, t2.status_time
`
beginTime, endTime := utils.GetTimeRange(utils.GetCurDate(), dayNum, includeToday)
sqlParams := []interface{}{
beginTime,
endTime,
model.OrderStatusFinished,
model.VendorIDDada,
model.OrderStatusFinishedPickup,
model.OrderStatusDelivering,
}
standardTime := int64(600)
var storeOrderStatusList []*model.StoreOrderStatus
storeOrderTimeMapData := make(map[int][]*model.StoreOrderStatus)
err = GetRows(db, &storeOrderStatusList, sql, sqlParams)
if err == nil && len(storeOrderStatusList) > 0 {
for _, value := range storeOrderStatusList {
if storeOrderTimeMapData[value.StoreID] == nil {
storeOrderTimeMapData[value.StoreID] = []*model.StoreOrderStatus{}
}
storeOrderTimeMapData[value.StoreID] = append(storeOrderTimeMapData[value.StoreID], value)
}
for storeID, valueList := range storeOrderTimeMapData {
count := 0
vendorOrderID := ""
statusBeginTime := int64(0)
statusEndTime := int64(0)
for _, value := range valueList {
if vendorOrderID != value.VendorOrderID {
if statusBeginTime != 0 && statusEndTime != 0 {
if statusEndTime-statusBeginTime <= standardTime {
count++
}
}
vendorOrderID = value.VendorOrderID
statusBeginTime = int64(0)
statusEndTime = int64(0)
}
if value.Status == model.OrderStatusFinishedPickup {
statusBeginTime = value.StatusTime.Unix()
} else if value.Status == model.OrderStatusDelivering {
statusEndTime = value.StatusTime.Unix()
}
}
if statusBeginTime != 0 && statusEndTime != 0 {
if statusEndTime-statusBeginTime <= standardTime {
count++
}
}
if count > 0 {
storeCountList = append(storeCountList, &model.StoreCount{storeID, count})
}
}
}
return storeCountList, err
}
//风控定单(门店相关人员在自己的门店下单)
func GetRiskOrderCount(db *DaoDB, dayNum int, includeToday bool) (storeOrderList []*model.StoreOrder, err error) {
sql := `
SELECT t1.jx_store_id store_id, t1.vendor_order_id
FROM goods_order t1
JOIN store t2 ON t2.id = t1.jx_store_id
WHERE t1.order_finished_at >= ? AND t1.order_finished_at <= ?
AND t1.consignee_mobile2 <> ""
AND (t1.consignee_mobile2 = t2.tel1 or t1.consignee_mobile2 = t2.tel2)
GROUP BY t1.jx_store_id
`
beginTime, endTime := utils.GetTimeRange(utils.GetCurDate(), dayNum, includeToday)
sqlParams := []interface{}{
beginTime,
endTime,
}
return storeOrderList, GetRows(db, &storeOrderList, sql, sqlParams)
}
func GetOrderPayList(db *DaoDB, vendorOrderID string, vendorID int) (payList []*model.OrderPay, err error) {
sql := `
SELECT t1.*
FROM order_pay t1
WHERE t1.deleted_at = ? AND t1.vendor_order_id = ? AND t1.vendor_id = ?
`
sqlParams := []interface{}{
utils.DefaultTimeValue,
vendorOrderID,
vendorID,
}
return payList, GetRows(db, &payList, sql, sqlParams)
}
func GetOrders(db *DaoDB, ids []int64, isIncludeSku, isIncludeFake bool, fromDateStr, toDateStr string, isDateFinish bool, skuIDs []int, isJxFirst bool, userID string, params map[string]interface{}, offset, pageSize int) (orders []*model.GoodsOrderExt, totalCount int, err error) {
globals.SugarLogger.Debugf("dao GetOrders ids:%v from:%s to:%s", ids, fromDateStr, toDateStr)
pageSize = jxutils.FormalizePageSize(pageSize)
offset = jxutils.FormalizePageOffset(offset)
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,
t5.pay_percentage, t5.old_pay_percentage,
city.name city_name, district.name district_name`, model.DefaultEarningPricePercentage)
if isIncludeSku {
sql += `,
IF(t3.jx_sku_id > 0, t3.jx_sku_id, t3.sku_id) sku_id,
t3.count sku_count2,
t3.shop_price sku_shop_price,
IF(t3.store_sub_id = 0, 0, t3.earning_price) sku_earning_price,
t3.sale_price sku_sale_price,
t3.sku_name`
}
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)
LEFT JOIN place city ON city.code = t5.city_code
LEFT JOIN place district ON district.code = t5.district_code`
if isIncludeSku {
sql += `
JOIN order_sku t3 ON t3.vendor_order_id = t1.vendor_order_id AND t3.vendor_id = t1.vendor_id`
}
sqlWhere := " WHERE 1 = 1"
var (
sqlParams []interface{}
)
if len(ids) > 0 { // 如果给定了ids忽略其它所有条件
sqlWhere += " AND t1.id IN (" + GenQuestionMarks(len(ids)) + ")"
sqlParams = append(sqlParams, ids)
} else {
// 如果搜索关键字可能为订单号,则当成订单号查询
if params["keyword"] != nil {
if jxutils.GetPossibleVendorIDFromVendorOrderID(params["keyword"].(string)) > model.VendorIDUnknown {
params["vendorOrderID"] = params["keyword"]
}
}
if params["orderID"] != nil || params["vendorOrderID"] != nil {
sqlWhere += " AND (t1.vendor_order_id = ? OR t1.vendor_order_id2 = ?)"
vendorOrderID := params["vendorOrderID"]
if vendorOrderID == nil {
vendorOrderID = params["orderID"]
}
sqlParams = []interface{}{
vendorOrderID,
vendorOrderID,
}
} else {
timeList, err2 := jxutils.BatchStr2Time(fromDateStr, toDateStr)
if err = err2; err != nil {
return nil, 0, err
}
if utils.IsTimeZero(timeList[0]) {
return nil, 0, fmt.Errorf("在没有指定订单号时,必须指定查询日期范围")
}
if utils.IsTimeZero(timeList[1]) {
timeList[1] = timeList[0]
}
timeList[1] = timeList[1].Add(24 * time.Hour)
if isDateFinish {
sqlWhere += `
AND t1.order_finished_at >= ? AND t1.order_finished_at < ?`
} else {
sqlWhere += `
AND t1.order_created_at >= ? AND t1.order_created_at < ?`
}
sqlParams = []interface{}{
timeList[0],
timeList[1],
}
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_order_id2 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, 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 (" + 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 {
if storeIDs[0] == 0 { // 容错
sqlWhere += " AND 1 = 0"
} else {
sqlWhere += " AND IF(t1.jx_store_id != 0, t1.jx_store_id, t1.store_id) IN (" + 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, 0, err
}
if len(statuss) > 0 {
sqlWhere += " AND t1.status IN (" + 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 (" + 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 {
sqlWhere += " AND t5.city_code IN (" + GenQuestionMarks(len(cities)) + ") AND t5.id IS NOT NULL"
sqlParams = append(sqlParams, cities)
}
}
if !isIncludeFake {
sqlWhere += " AND (t1.flag & ?) = 0"
sqlParams = append(sqlParams, model.OrderFlagMaskFake)
}
if len(skuIDs) > 0 {
sqlWhere += " AND (SELECT COUNT(*) FROM order_sku t11 WHERE t11.vendor_order_id = t1.vendor_order_id AND t11.vendor_id = t1.vendor_id AND t11.jx_sku_id IN (" + GenQuestionMarks(len(skuIDs)) + ")) > 0"
sqlParams = append(sqlParams, skuIDs)
}
if params["adjustCount"] != nil {
sqlWhere += " AND t1.adjust_count >= ?"
sqlParams = append(sqlParams, params["adjustCount"])
}
if mustInvoice, ok := params["mustInvoice"].(bool); ok && mustInvoice {
sqlWhere += " AND t1.invoice_taxer_id <> ''"
}
}
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 (" + GenQuestionMarks(len(vendorIDs)) + ")"
sqlParams = append(sqlParams, vendorIDs)
}
}
if userID != "" {
sqlWhere += " AND t1.user_id = ?"
sqlParams = append(sqlParams, userID)
}
}
sql += sqlWhere
if isJxFirst {
sql += `
ORDER BY IF(t1.status < ?, IF(t1.vendor_id = ?, 0, 1), 0), t1.order_created_at DESC`
sqlParams = append(sqlParams, model.OrderStatusEndBegin, model.VendorIDJX)
} else {
if isIncludeSku && userID == "" && len(ids) == 0 {
sql += `
ORDER BY t1.id`
} else {
sql += `
ORDER BY t1.order_created_at DESC`
}
}
sql += `
LIMIT ? OFFSET ?`
sqlParams = append(sqlParams, pageSize, offset)
Begin(db)
defer Commit(db)
if err = GetRows(db, &orders, sql, sqlParams...); err == nil {
totalCount = GetLastTotalRowCount(db)
}
return orders, totalCount, err
}
func UpdateOrdersWithoutJxStoreID(db *DaoDB, fromDate, toDate time.Time) (count int64, err error) {
sql := `
UPDATE goods_order t1
JOIN store_map a ON a.vendor_store_id = t1.vendor_store_id AND a.vendor_id = t1.vendor_id
SET t1.jx_store_id = a.store_id
WHERE t1.jx_store_id = 0
AND a.deleted_at = ?
AND t1.order_created_at >= ? AND t1.order_created_at <= ?
`
sqlParams := []interface{}{
utils.DefaultTimeValue,
}
if !utils.IsTimeZero(fromDate) {
sqlParams = append(sqlParams, fromDate)
if !utils.IsTimeZero(toDate) {
sqlParams = append(sqlParams, toDate)
} else {
sqlParams = append(sqlParams, time.Now())
}
} else {
if !utils.IsTimeZero(toDate) {
sqlParams = append(sqlParams, toDate.AddDate(0, 0, -5))
sqlParams = append(sqlParams, toDate)
} else {
sqlParams = append(sqlParams, time.Now().AddDate(0, 0, -5))
sqlParams = append(sqlParams, time.Now())
}
}
return ExecuteSQL(db, sql, sqlParams)
}
func GetMyOrderCountInfo(db *DaoDB, userID string, fromDate, toDate time.Time, statuss []int) (countInfo []*model.GoodsOrderCountInfo, err error) {
if utils.IsTimeZero(fromDate) {
return nil, fmt.Errorf("必须指定开始日期")
}
if !utils.IsTimeZero(fromDate) {
fromDate = utils.Time2Date(fromDate)
if utils.IsTimeZero(toDate) {
toDate = fromDate
}
}
if !utils.IsTimeZero(toDate) {
toDate = utils.Time2Date(toDate)
toDate = toDate.Add(24 * time.Hour)
}
sql := `
SELECT t1.lock_status, t1.status, COUNT(*) count
FROM goods_order t1
WHERE t1.user_id = ? AND t1.vendor_id = ?
AND t1.order_created_at >= ? AND t1.order_created_at < ?
`
sqlParams := []interface{}{
userID,
model.VendorIDJX,
fromDate, toDate,
}
if len(statuss) > 0 {
sql += " AND t1.status IN (" + GenQuestionMarks(len(statuss)) + ")"
sqlParams = append(sqlParams, statuss)
}
sql += " GROUP BY 1,2"
err = GetRows(db, &countInfo, sql, sqlParams...)
return countInfo, err
}
func GetPendingFakeOrders(db *DaoDB, vendorIDs []int, orderCreatedAfter, orderCreatedBefore time.Time) (orderList []*model.GoodsOrder, err error) {
sql := `
SELECT t1.*
FROM goods_order t1
JOIN new_config t2 ON t2.type = ? AND t2.key = ? AND t2.deleted_at = ?
AND LOCATE(IF(t1.consignee_mobile2 <> '', t1.consignee_mobile2, t1.consignee_mobile), t2.value) > 0
WHERE t1.order_created_at >= ? AND t1.order_created_at <= ?
AND t1.delivery_type = ?
AND t1.status >= ? AND t1.status < ?
`
sqlParams := []interface{}{
model.ConfigTypeSys,
model.ConfigSysFakeOrderMobiles,
utils.DefaultTimeValue,
orderCreatedAfter,
orderCreatedBefore,
model.OrderDeliveryTypeSelfTake,
model.OrderStatusAccepted,
model.OrderStatusEndBegin,
}
if len(vendorIDs) > 0 {
sql += " AND t1.vendor_id IN (" + GenQuestionMarks(len(vendorIDs)) + ")"
sqlParams = append(sqlParams, vendorIDs)
}
// globals.SugarLogger.Debug(sql)
err = GetRows(db, &orderList, sql, sqlParams...)
return orderList, err
}
// 不会有Skus信息
func LoadPendingOrders(db *DaoDB, orderCreatedAfter time.Time, beforStatus int) (orderList []*model.GoodsOrder, err error) {
sql := `
SELECT *
FROM goods_order
WHERE order_created_at >= ?
AND status < ?`
sqlParams := []interface{}{orderCreatedAfter, beforStatus}
err = GetRows(db, &orderList, sql, sqlParams...)
return orderList, err
}
func GetWayBillByOrderID(db *DaoDB, orderStatus, vendorID, waybillVendorID int, vendorOrderID string) (wayBillList []*model.Waybill, err error) {
sql := `
SELECT b.*
FROM goods_order a
JOIN waybill b ON IF(a.waybill_vendor_id = -1,a.vendor_order_id,a.vendor_waybill_id) = b.vendor_waybill_id AND b.order_vendor_id = a.vendor_id
WHERE a.vendor_order_id = ?
AND a.vendor_id = ?
`
sqlParams := []interface{}{
vendorOrderID,
vendorID,
}
if orderStatus > 0 {
sql += ` AND a.status = ?`
sqlParams = append(sqlParams, orderStatus)
}
if waybillVendorID > 0 {
sql += ` AND b.waybill_vendor_id = ?`
sqlParams = append(sqlParams, waybillVendorID)
}
err = GetRows(db, &wayBillList, sql, sqlParams...)
return wayBillList, err
}
func GetOrdersSupplement(db *DaoDB, storIDs, vendorIDs, statuss []int, vendorOrderID string, fromTime, toTime time.Time, stype, IsReverse, offset, pageSize int) (orderSupplementFee []*model.OrderSupplementFee, totalCount int, err error) {
sql := `
SELECT SQL_CALC_FOUND_ROWS *
FROM order_supplement_fee
WHERE 1=1
AND deleted_at = ?
`
sqlParams := []interface{}{
utils.DefaultTimeValue,
}
if !utils.IsTimeZero(fromTime) {
sql += " AND supplement_time >= ?"
sqlParams = append(sqlParams, fromTime)
}
if !utils.IsTimeZero(toTime) {
sql += " AND supplement_time <= ?"
sqlParams = append(sqlParams, toTime)
}
if len(storIDs) > 0 {
sql += " AND store_id IN (" + GenQuestionMarks(len(storIDs)) + ")"
sqlParams = append(sqlParams, storIDs)
}
if len(vendorIDs) > 0 {
sql += " AND vendor_id IN (" + GenQuestionMarks(len(vendorIDs)) + ")"
sqlParams = append(sqlParams, vendorIDs)
}
if vendorOrderID != "" {
sql += " AND vendor_order_id = ?"
sqlParams = append(sqlParams, vendorOrderID)
}
if len(statuss) > 0 {
sql += " AND status IN (" + GenQuestionMarks(len(statuss)) + ")"
sqlParams = append(sqlParams, statuss)
}
if stype > 0 {
sql += " AND type = ?"
sqlParams = append(sqlParams, stype)
}
if IsReverse == -1 {
sql += " AND link_id = 0"
} else if IsReverse == 1 {
sql += " AND link_id <> 0"
}
sql += " ORDER BY supplement_time DESC"
sql += " LIMIT ? OFFSET ?"
sqlParams = append(sqlParams, pageSize, offset)
Begin(db)
defer Commit(db)
if err = GetRows(db, &orderSupplementFee, sql, sqlParams...); err == nil {
totalCount = GetLastTotalRowCount(db)
}
return orderSupplementFee, totalCount, err
}
func GetOrdersSupplementNoPage(db *DaoDB, ID int, storIDs, vendorIDs, statuss []int, vendorOrderID string, fromTime, toTime time.Time, stype, IsReverse int) (orderSupplementFee []*model.OrderSupplementFee, err error) {
sql := `
SELECT *
FROM order_supplement_fee
WHERE 1=1
AND deleted_at = ?
`
sqlParams := []interface{}{
utils.DefaultTimeValue,
}
if !utils.IsTimeZero(fromTime) {
sql += " AND supplement_time >= ?"
sqlParams = append(sqlParams, fromTime)
}
if !utils.IsTimeZero(toTime) {
sql += " AND supplement_time <= ?"
sqlParams = append(sqlParams, toTime)
}
if len(storIDs) > 0 {
sql += " AND store_id IN (" + GenQuestionMarks(len(storIDs)) + ")"
sqlParams = append(sqlParams, storIDs)
}
if len(vendorIDs) > 0 {
sql += " AND vendor_id IN (" + GenQuestionMarks(len(vendorIDs)) + ")"
sqlParams = append(sqlParams, vendorIDs)
}
if vendorOrderID != "" {
sql += " AND vendor_order_id = ?"
sqlParams = append(sqlParams, vendorOrderID)
}
if len(statuss) > 0 {
sql += " AND status IN (" + GenQuestionMarks(len(statuss)) + ")"
sqlParams = append(sqlParams, statuss)
}
if stype > 0 {
sql += " AND type = ?"
sqlParams = append(sqlParams, stype)
}
if ID > 0 {
sql += " AND id = ?"
sqlParams = append(sqlParams, ID)
}
if IsReverse == -1 {
sql += " AND link_id = 0"
} else if IsReverse == 1 {
sql += " AND link_id <> 0"
}
err = GetRows(db, &orderSupplementFee, sql, sqlParams...)
return orderSupplementFee, err
}
func GetJxOrderCount(db *DaoDB, storeID int, orderID string, date time.Time) (count int, err error) {
if utils.IsTimeZero(date) {
date = time.Now()
}
sql := `
SELECT COUNT(*) ct
FROM goods_order t1
WHERE t1.vendor_id = ? AND t1.jx_store_id = ? AND (t1.status >= ? OR t1.order_seq > 0) AND t1.order_created_at >= ? AND t1.order_created_at < ?
`
sqlParams := []interface{}{
model.VendorIDJX,
storeID,
model.OrderStatusNew,
utils.Time2Date(date),
utils.Time2Date(date).Add(24 * time.Hour),
}
if orderID != "" {
sql += " AND t1.vendor_order_id != ?"
sqlParams = append(sqlParams, orderID)
}
err = GetRow(db, &count, sql, sqlParams...)
return count, err
}
func GetOrdersForJxPay(db *DaoDB, finishTimeBegin, finishTimeEnd time.Time) (goods []*GoodsOrderPay, err error) {
sql := `
SELECT a.*,b.transaction_id
FROM goods_order a
JOIN order_pay b ON a.vendor_order_id = b.vendor_order_id AND a.vendor_id = b.vendor_id
JOIN user c ON c.user_id = a.user_id
WHERE a.vendor_id = ?
AND a.order_finished_at >= ?
AND a.order_finished_at <= ?
AND a.status = ?
AND c.parent_mobile <> ''
AND a.store_id <> ?
`
sqlParams := []interface{}{
model.VendorIDJX,
finishTimeBegin,
finishTimeEnd,
model.OrderStatusFinished,
model.MatterStoreID,
}
err = GetRows(db, &goods, sql, sqlParams...)
return goods, err
}
func GetWaybills(db *DaoDB, vendorOrderID string) (waybills []*model.Waybill, err error) {
sql := `SELECT *
FROM waybill
WHERE vendor_order_id = ?
`
sqlParams := []interface{}{vendorOrderID}
err = GetRows(db, &waybills, sql, sqlParams)
return waybills, err
}
func GetMatterChildOrders(db *DaoDB, vendorOrderID string) (goods []*model.GoodsOrder, err error) {
sql := `SELECT *
FROM goods_order
WHERE vendor_order_id LIKE ? OR vendor_order_id LIKE ?
AND vendor_id = ?
ORDER BY vendor_order_id DESC
`
sqlParams := []interface{}{
vendorOrderID + "0%", vendorOrderID + "1%",
model.VendorIDJX,
}
err = GetRows(db, &goods, sql, sqlParams)
return goods, err
}
func GetSimpleOrder(db *DaoDB, vendorOrderID string) (goods *model.GoodsOrder, err error) {
sql := `
SELECT *
FROM goods_order
WHERE vendor_order_id = ?
`
sqlParams := []interface{}{vendorOrderID}
err = GetRow(db, &goods, sql, sqlParams)
return goods, err
}
func GetSimpleOrderSkus(db *DaoDB, vendorOrderID string, skuIDs []int) (skus []*model.OrderSku, err error) {
sql := `
SELECT *
FROM order_sku
WHERE vendor_order_id = ?
`
sqlParams := []interface{}{vendorOrderID}
if len(skuIDs) > 0 {
sql += " AND sku_id IN (" + GenQuestionMarks(len(skuIDs)) + ")"
sqlParams = append(sqlParams, skuIDs)
}
err = GetRows(db, &skus, sql, sqlParams)
return skus, err
}
func GetAfsOrdersByPage(db *DaoDB, vendorOrderID, afsOrderID, userID string, fromTime, toTime time.Time, offset, pageSize int) (afsOrderList []*model.AfsOrder, totalCount int, err error) {
pageSize = jxutils.FormalizePageSize(pageSize)
offset = jxutils.FormalizePageOffset(offset)
sql := `
SELECT SQL_CALC_FOUND_ROWS t1.*
FROM afs_order t1
LEFT JOIN goods_order t2 ON t2.vendor_order_id = t1.vendor_order_id AND t2.vendor_id = t1.vendor_id
WHERE 1 = 1
`
sqlParams := []interface{}{}
if vendorOrderID != "" {
sql += " AND t1.vendor_order_id = ?"
sqlParams = append(sqlParams, vendorOrderID)
}
if afsOrderID != "" {
sql += " AND t1.afs_order_id = ?"
sqlParams = append(sqlParams, afsOrderID)
}
if !utils.IsTimeZero(fromTime) {
sql += " AND t1.afs_created_at >= ?"
sqlParams = append(sqlParams, fromTime)
}
if !utils.IsTimeZero(toTime) {
sql += " AND t1.afs_created_at <= ?"
sqlParams = append(sqlParams, toTime)
}
if userID != "" {
sql += " AND t2.user_id = ?"
sqlParams = append(sqlParams, userID)
}
sql += ` ORDER BY t1.afs_order_id DESC
LIMIT ? OFFSET ?
`
sqlParams = append(sqlParams, pageSize, offset)
Begin(db)
defer Commit(db)
if err = GetRows(db, &afsOrderList, sql, sqlParams...); err == nil {
totalCount = GetLastTotalRowCount(db)
}
return afsOrderList, totalCount, err
}