package dao import ( "fmt" "time" "git.rosy.net.cn/baseapi/utils" "git.rosy.net.cn/jx-callback/business/model" ) 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"` // 预估结算给门店老板的钱 } type OrderSkuWithActualPayPrice struct { model.OrderSku ActualPayPrice int64 `json:"actualPayPrice"` // 单位为分 顾客实际支付 StoreID int `orm:"column(store_id)" json:"storeID"` // 外部系统里记录的 jxstoreid Status int `json:"status"` // 参见OrderStatus*相关的常量定义 PayPercentage int `json:"payPercentage"` } 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用),没有做转换 } //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.type = ? 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, model.ActSkuFake, 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 < ? ORDER BY t1.order_created_at DESC, t1.id DESC; ` sqlParams := []interface{}{ storeID, orderTime, lastOrderSeqID, model.OrderStatusEndBegin, } 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 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) (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 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) } err = GetRows(db, &skus, sql, sqlParams...) return skus, err } func GetStoreOrderSkuList(db *DaoDB, storeIDs []int, finishedAtBegin, finishedAtEnd time.Time, statusList []int) (skuList []*OrderSkuWithActualPayPrice, err error) { // order_finished_at sql := ` SELECT t1.*, t2.actual_pay_price, t2.status, IF(t2.jx_store_id > 0, t2.jx_store_id, t2.store_id) store_id, 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 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) (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, 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)) + `) AND t12.afs_finished_at >= ? AND t12.afs_finished_at <= ? ) 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) (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 WHERE t1.is_afs_order = 1 AND t2.afs_finished_at >= ? AND t2.afs_finished_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) }