门店红线警告
This commit is contained in:
16
business/model/Store_Alert_Inform.go
Normal file
16
business/model/Store_Alert_Inform.go
Normal file
@@ -0,0 +1,16 @@
|
||||
package model
|
||||
|
||||
import "time"
|
||||
|
||||
type StoreOrderTime struct {
|
||||
StoreID int `orm:"column(store_id)"`
|
||||
OrderCreateTime time.Time `orm:"column(order_created_at)"`
|
||||
OrderFinishedTime time.Time `orm:"column(order_finished_at)"`
|
||||
}
|
||||
|
||||
type StoreOrderStatus struct {
|
||||
StoreID int `orm:"column(store_id)"`
|
||||
VendorOrderID string `orm:"column(vendor_order_id)"`
|
||||
StatusTime time.Time `orm:"column(status_time)"`
|
||||
Status int `orm:"column(status)"`
|
||||
}
|
||||
3
business/model/dao/Store_Alert_Inform.go
Normal file
3
business/model/dao/Store_Alert_Inform.go
Normal file
@@ -0,0 +1,3 @@
|
||||
package dao
|
||||
|
||||
|
||||
@@ -300,7 +300,7 @@ func GetDailyFinishOrderList(db *DaoDB, storeID int, dateTime time.Time) (orderL
|
||||
`
|
||||
sqlParams := []interface{}{
|
||||
storeID,
|
||||
1,
|
||||
model.OrderTypeOrder,
|
||||
model.OrderStatusFinishedPickup,
|
||||
dateTime,
|
||||
}
|
||||
@@ -308,14 +308,25 @@ func GetDailyFinishOrderList(db *DaoDB, storeID int, dateTime time.Time) (orderL
|
||||
}
|
||||
|
||||
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 DATE(createtime) = DATE(?)
|
||||
WHERE createtime >= ? AND createtime <= ?
|
||||
GROUP BY jxstoreid
|
||||
`
|
||||
sqlParams := []interface{}{
|
||||
dateTime,
|
||||
beginTime,
|
||||
endTime,
|
||||
}
|
||||
err = GetRows(db, &storeCountList, sql, sqlParams)
|
||||
|
||||
@@ -323,31 +334,64 @@ func GetDailyBadCommentOrderCount(db *DaoDB, dateTime time.Time) (storeCountList
|
||||
}
|
||||
|
||||
func GetDailyUnFinishOrderCount(db *DaoDB, dateTime time.Time) (storeCountList []*model.StoreCount, err error) {
|
||||
return GetDailyEndOrderCount(db, []int{model.OrderStatusCanceled}, false, dateTime)
|
||||
beginTime, endTime := utils.GetTimeRange(dateTime, 1, true)
|
||||
return GetUnFinishOrderCount(db, beginTime, endTime)
|
||||
}
|
||||
|
||||
func GetDailyFinishOrderCount(db *DaoDB, dateTime time.Time) (storeCountList []*model.StoreCount, err error) {
|
||||
return GetDailyEndOrderCount(db, []int{model.OrderStatusFinished}, false, dateTime)
|
||||
beginTime, endTime := utils.GetTimeRange(dateTime, 1, true)
|
||||
return GetFinishOrderCount(db, beginTime, endTime)
|
||||
}
|
||||
|
||||
func GetDailyAbsentGoodsOrderCount(db *DaoDB, dateTime time.Time) (storeCountList []*model.StoreCount, err error) {
|
||||
return GetDailyEndOrderCount(db, []int{model.OrderStatusFinished, model.OrderStatusCanceled}, true, dateTime)
|
||||
beginTime, endTime := utils.GetTimeRange(dateTime, 1, true)
|
||||
return GetAbsentGoodsOrderCount(db, beginTime, endTime)
|
||||
}
|
||||
|
||||
func GetDailyEndOrderCount(db *DaoDB, statusList []int, isAbsentOrder bool, dateTime time.Time) (storeCountList []*model.StoreCount, err error) {
|
||||
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 DATE(order_finished_at) = DATE(?)
|
||||
WHERE order_finished_at >= ? AND order_finished_at <= ?
|
||||
`
|
||||
sqlParams := []interface{}{
|
||||
dateTime,
|
||||
beginTime,
|
||||
endTime,
|
||||
}
|
||||
if len(statusList) > 0 {
|
||||
sql += ` AND status IN (` + GenQuestionMarks(len(statusList)) + `)`
|
||||
sqlParams = append(sqlParams, statusList)
|
||||
}
|
||||
if isAbsentOrder {
|
||||
if checkAbsentOrder {
|
||||
sql += `
|
||||
AND adjust_count > 0
|
||||
`
|
||||
@@ -358,3 +402,163 @@ func GetDailyEndOrderCount(db *DaoDB, statusList []int, isAbsentOrder bool, date
|
||||
|
||||
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 jx_store_id store_id, COUNT(*) count
|
||||
FROM goods_order t1
|
||||
JOIN order_status t2 ON t2.vendor_order_id = t1.vendor_order_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 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 orderCreateTime, order_finished_at orderFinishTime
|
||||
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 GetStandardPickUpTimeOrderCountBySelfDelivery(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 t2.vendor_order_id = t1.vendor_order_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 {
|
||||
storeOrderTimeSubList := []*model.StoreOrderStatus{}
|
||||
storeOrderTimeMapData[value.StoreID] = storeOrderTimeSubList
|
||||
}
|
||||
storeOrderTimeSubList := storeOrderTimeMapData[value.StoreID]
|
||||
storeOrderTimeSubList = append(storeOrderTimeSubList, 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++
|
||||
}
|
||||
}
|
||||
storeCountList = append(storeCountList, &model.StoreCount{storeID, count})
|
||||
}
|
||||
}
|
||||
|
||||
return storeCountList, err
|
||||
}
|
||||
|
||||
@@ -56,6 +56,11 @@ type StoreTotalScore struct {
|
||||
CityName string `orm:"column(city_name)" json:"cityName"`
|
||||
}
|
||||
|
||||
type StoreTotalScoreEx struct {
|
||||
StoreTotalScoreList []*StoreTotalScore `json:"storeTotalScoreList"`
|
||||
TotalCount int `json:"totalCount"`
|
||||
}
|
||||
|
||||
type StoreCount struct {
|
||||
StoreID int `orm:"column(store_id)"`
|
||||
Count int
|
||||
|
||||
Reference in New Issue
Block a user