diff --git a/business/jxstore/misc/Store_Alert_Inform.go b/business/jxstore/misc/Store_Alert_Inform.go index 950e7ab54..4ba8e882f 100644 --- a/business/jxstore/misc/Store_Alert_Inform.go +++ b/business/jxstore/misc/Store_Alert_Inform.go @@ -3,7 +3,6 @@ package misc import ( "fmt" "math" - "reflect" "time" "git.rosy.net.cn/baseapi" @@ -14,6 +13,7 @@ import ( "git.rosy.net.cn/jx-callback/business/jxutils/weixinmsg" "git.rosy.net.cn/jx-callback/business/model" "git.rosy.net.cn/jx-callback/business/model/dao" + "git.rosy.net.cn/jx-callback/globals/refutil" ) const ( @@ -36,11 +36,16 @@ const ( ColorYellow = "yellow" ColorUnknown = "Unknown" + AlertLevelExtraRed = 1 + AlertLevelRed = 2 + AlertLevelYellow = 3 + OneDayName = "单日" OneWeekDayName = "七日" OneMonthDayName = "三十日" YellowAlertInfo = "您的店铺京西菜市-%s,由于%s%s%s%d%%,可能会被系统下线,请及时补救。" RedAlertInfo = "您的店铺京西菜市-%s,由于%s%s%s%d%%,会被系统下线,需要马上补救。" + ExtraRedAlertInfo = "您的店铺京西菜市-%s,由于%s%s%s%d%%,会被系统下线,需要马上补救。" NoOrderAlertInfo = "您的店铺京西菜市-%s,由于近%s无订单,会被系统下线,需要马上补救。" RiskOrderAlertInfo = "您的店铺京西菜市-%s,可能有虚假定单,定单号为:%s,可能会被罚款,请及时与运营联系!" ) @@ -58,6 +63,12 @@ var ( AlertTypeStandardPickUpTimeOrderDaDa: "10分钟取货完成率(达达)", } + AlertTypeExtraNameMap = map[int]string{ + AlertTypePickTimeOrderDaDa: "拣货超时订单(达达)", + AlertTypeBadCommentOrder: "差评订单", + AlertTypeAbsentGoodsOrder: "缺货订单", + } + storeAlertDataWrapper StoreAlertDataWrapper ) @@ -73,6 +84,10 @@ func (s *StoreAlertDataWrapper) ClearData() { s.storeAlertList = nil } +func (s *StoreAlertDataWrapper) IsStatusField(valueName string) bool { + return valueName == model.FieldYellowStatus || valueName == model.FieldRedStatus || valueName == model.FieldExtraRedStatus +} + func (s *StoreAlertDataWrapper) SetData(storeID int, valueName string, value int) { data := s.storeAlertList[storeID] if data == nil { @@ -81,8 +96,13 @@ func (s *StoreAlertDataWrapper) SetData(storeID int, valueName string, value int data.AlertDate = utils.GetCurDate() s.storeAlertList[storeID] = data } - valueInfo := reflect.ValueOf(data).Elem() - valueInfo.FieldByName(valueName).SetInt(int64(value)) + // valueInfo := reflect.ValueOf(data).Elem() + // valueInfo.FieldByName(valueName).SetInt(int64(value)) + if s.IsStatusField(valueName) { + srcFieldValue := refutil.GetObjFieldByName(data, valueName).(int) + value |= srcFieldValue + } + refutil.SetObjFieldByName(data, valueName, value) } func (s StoreAlertDataWrapper) InsertStoreAlertList() { @@ -112,18 +132,22 @@ func ConvertListToMapEx(listData []*model.StoreOrder) (mapData map[int][]string) return mapData } -func GetAlertInfo(dayNum int, isRedAlert bool, storeName string, alertType int, logicCondition string, ratio int) (info string) { +func GetAlertInfo(dayNum, alertLevel int, storeName string, alertType int, logicCondition string, value int) (info string) { if dayNum == CheckStoreAlertOneDayNum { - if isRedAlert { - info = fmt.Sprintf(RedAlertInfo, storeName, OneDayName, AlertTypeNameMap[alertType], logicCondition, ratio) - } else { - info = fmt.Sprintf(YellowAlertInfo, storeName, OneDayName, AlertTypeNameMap[alertType], logicCondition, ratio) + if alertLevel == AlertLevelExtraRed { + info = fmt.Sprintf(ExtraRedAlertInfo, storeName, OneDayName, AlertTypeExtraNameMap[alertType], logicCondition, value) + } else if alertLevel == AlertLevelRed { + info = fmt.Sprintf(RedAlertInfo, storeName, OneDayName, AlertTypeNameMap[alertType], logicCondition, value) + } else if alertLevel == AlertLevelYellow { + info = fmt.Sprintf(YellowAlertInfo, storeName, OneDayName, AlertTypeNameMap[alertType], logicCondition, value) } } else if dayNum == CheckStoreAlertOneWeekDayNum { - if isRedAlert { - info = fmt.Sprintf(RedAlertInfo, storeName, OneWeekDayName, AlertTypeNameMap[alertType], logicCondition, ratio) - } else { - info = fmt.Sprintf(YellowAlertInfo, storeName, OneWeekDayName, AlertTypeNameMap[alertType], logicCondition, ratio) + if alertLevel == AlertLevelExtraRed { + info = fmt.Sprintf(ExtraRedAlertInfo, storeName, OneWeekDayName, AlertTypeExtraNameMap[alertType], logicCondition, value) + } else if alertLevel == AlertLevelRed { + info = fmt.Sprintf(RedAlertInfo, storeName, OneWeekDayName, AlertTypeNameMap[alertType], logicCondition, value) + } else if alertLevel == AlertLevelYellow { + info = fmt.Sprintf(YellowAlertInfo, storeName, OneWeekDayName, AlertTypeNameMap[alertType], logicCondition, value) } } else if dayNum == CheckStoreAlertOneMonthDayNum { info = fmt.Sprintf(NoOrderAlertInfo, storeName, OneMonthDayName) @@ -132,7 +156,7 @@ func GetAlertInfo(dayNum int, isRedAlert bool, storeName string, alertType int, return info } -func CheckAlert(alertType int, dayNum int, ratio int, count int) (isYellowAlert, isRedAlert bool, logicCondtion string, outRatio int) { +func CheckAlert(alertType int, dayNum int, ratio int, count int) (alertLevel int, logicCondtion string, outValue int) { yellowRatio := -1 redRatio := -1 extraCount := -1 @@ -179,28 +203,30 @@ func CheckAlert(alertType int, dayNum int, ratio int, count int) (isYellowAlert, if conditionLessEqual { logicCondtion = "<=" if extraCount != -1 && count >= extraCount { - isRedAlert = true + alertLevel = AlertLevelExtraRed + outValue = extraCount } else if redRatio != -1 && ratio <= redRatio { - isRedAlert = true - outRatio = redRatio + alertLevel = AlertLevelRed + outValue = redRatio } else if yellowRatio != -1 && ratio <= yellowRatio { - isYellowAlert = true - outRatio = yellowRatio + alertLevel = AlertLevelYellow + outValue = yellowRatio } } else { logicCondtion = ">=" if extraCount != -1 && count >= extraCount { - isRedAlert = true + alertLevel = AlertLevelExtraRed + outValue = extraCount } else if redRatio != -1 && ratio >= redRatio { - isRedAlert = true - outRatio = redRatio + alertLevel = AlertLevelRed + outValue = redRatio } else if yellowRatio != -1 && ratio >= yellowRatio { - isYellowAlert = true - outRatio = yellowRatio + alertLevel = AlertLevelYellow + outValue = yellowRatio } } - return isYellowAlert, isRedAlert, logicCondtion, outRatio + return alertLevel, logicCondtion, outValue } func SendAlertInfo(storeID int, storeName, alertInfo string) { @@ -210,47 +236,60 @@ func SendAlertInfo(storeID int, storeName, alertInfo string) { } } -func GetFieldNameByAlertType(alertType, dayNum int) (fieldName string) { +func GetFieldNameByAlertType(alertType, dayNum int) (fieldName string, fieldFlag int) { switch alertType { case AlertTypePickTimeOrderDaDa: if dayNum == CheckStoreAlertOneDayNum { fieldName = model.FieldPickTimeDaDa + fieldFlag = model.FlagPickTimeDaDa } else if dayNum == CheckStoreAlertOneWeekDayNum { fieldName = model.FieldPickTimeDaDaOneWeek + fieldFlag = model.FlagPickTimeDaDaOneWeek } case AlertTypeBadCommentOrder: if dayNum == CheckStoreAlertOneDayNum { fieldName = model.FieldBadComment + fieldFlag = model.FlagBadComment } else if dayNum == CheckStoreAlertOneWeekDayNum { fieldName = model.FieldBadCommentOneWeek + fieldFlag = model.FlagBadCommentOneWeek } case AlertTypeAbsentGoodsOrder: if dayNum == CheckStoreAlertOneDayNum { fieldName = model.FieldAbsentGoods + fieldFlag = model.FlagAbsentGoods } else if dayNum == CheckStoreAlertOneWeekDayNum { fieldName = model.FieldAbsentGoodsOneWeek + fieldFlag = model.FlagAbsentGoodsOneWeek } case AlertTypeStandardFinishTimeOrderSelfDelivery: fieldName = model.FieldStandardFinishTimeSelfDelivery + fieldFlag = model.FlagStandardFinishTimeSelfDelivery case AlertTypeStandardPickUpTimeOrderDaDa: fieldName = model.FieldStandardPickUpTimeDaDa + fieldFlag = model.FlagStandardPickUpTimeDaDa } - return fieldName + return fieldName, fieldFlag } func SendAlertInfoWrapper(storeID int, storeName string, dayNum, alertType, count, totalCount int) { if totalCount > 0 { ratio := int(math.Round(float64(count) * 100 / float64(totalCount))) - yellowAlert, redAlert, logicCondtion, outRatio := CheckAlert(alertType, dayNum, ratio, count) - isAlert := false - isRedAlert := redAlert - isAlert = yellowAlert || redAlert - if isAlert { - alertInfo := GetAlertInfo(dayNum, isRedAlert, storeName, alertType, logicCondtion, outRatio) + alertLevel, logicCondtion, outValue := CheckAlert(alertType, dayNum, ratio, count) + if alertLevel != 0 { + alertInfo := GetAlertInfo(dayNum, alertLevel, storeName, alertType, logicCondtion, outValue) SendAlertInfo(storeID, storeName, alertInfo) - fieldName := GetFieldNameByAlertType(alertType, dayNum) + fieldName, fieldFlag := GetFieldNameByAlertType(alertType, dayNum) storeAlertDataWrapper.SetData(storeID, fieldName, ratio) + + if alertLevel == AlertLevelExtraRed { + storeAlertDataWrapper.SetData(storeID, model.FieldExtraRedStatus, fieldFlag) + } else if alertLevel == AlertLevelRed { + storeAlertDataWrapper.SetData(storeID, model.FieldRedStatus, fieldFlag) + } else if alertLevel == AlertLevelYellow { + storeAlertDataWrapper.SetData(storeID, model.FieldYellowStatus, fieldFlag) + } } } } @@ -335,9 +374,10 @@ func CheckStoreMonthAlert(storeList []*cms.StoreExt) { storeID := storeInfo.ID storeName := storeInfo.Name if _, ok := storeCountMapData[storeID]; !ok { - alertInfo := GetAlertInfo(CheckStoreAlertOneMonthDayNum, true, storeName, -1, "", -1) + alertInfo := GetAlertInfo(CheckStoreAlertOneMonthDayNum, AlertLevelRed, storeName, -1, "", -1) SendAlertInfo(storeID, storeName, alertInfo) storeAlertDataWrapper.SetData(storeID, model.FieldNoOrderInMonth, 1) + storeAlertDataWrapper.SetData(storeID, model.FieldRedStatus, model.FlagNoOrderInMonth) } } } @@ -362,6 +402,7 @@ func CheckStoreRiskOrderAlert(storeList []*cms.StoreExt, dayNum int) { alertInfo := fmt.Sprintf(RiskOrderAlertInfo, storeName, vendorOrderIDStr) SendAlertInfo(storeID, storeName, alertInfo) storeAlertDataWrapper.SetData(storeID, model.FieldRiskOrderCount, len(vendorOrderIDList)) + storeAlertDataWrapper.SetData(storeID, model.FieldRedStatus, model.FlagRiskOrderCount) } } } @@ -393,12 +434,11 @@ func ScheduleCheckStoreAlert() { } } -func GetValueColor(alertType, dayNum, ratio, count int) (color string) { - yellowAlert, redAlert, _, _ := CheckAlert(alertType, dayNum, ratio, count) - if yellowAlert { - color = ColorYellow - } else if redAlert { +func GetValueColorByStatus(extraRedStatus, redStatus, yellowStatus, flag int) (color string) { + if (extraRedStatus&flag != 0) || (redStatus&flag != 0) { color = ColorRed + } else if yellowStatus&flag != 0 { + color = ColorYellow } else { color = ColorUnknown } @@ -428,46 +468,38 @@ func GetStoreAlertList(storeIDList []int, cityCode int, keyWord string, dateTime storeAlertAdvanced.CityName = value.CityName storeAlertAdvanced.PickTimeDaDa.Value = fmt.Sprintf("%d%%", value.PickTimeDaDa) - storeAlertAdvanced.PickTimeDaDa.Color = GetValueColor(AlertTypePickTimeOrderDaDa, CheckStoreAlertOneDayNum, value.PickTimeDaDa, -1) + storeAlertAdvanced.PickTimeDaDa.Color = GetValueColorByStatus(value.ExtraRedStatus, value.RedStatus, value.YellowStatus, model.FlagPickTimeDaDa) storeAlertAdvanced.BadComment.Value = fmt.Sprintf("%d%%", value.BadComment) - storeAlertAdvanced.BadComment.Color = GetValueColor(AlertTypeBadCommentOrder, CheckStoreAlertOneDayNum, value.BadComment, -1) + storeAlertAdvanced.BadComment.Color = GetValueColorByStatus(value.ExtraRedStatus, value.RedStatus, value.YellowStatus, model.FlagBadComment) storeAlertAdvanced.AbsentGoods.Value = fmt.Sprintf("%d%%", value.AbsentGoods) - storeAlertAdvanced.AbsentGoods.Color = GetValueColor(AlertTypeAbsentGoodsOrder, CheckStoreAlertOneDayNum, value.AbsentGoods, -1) + storeAlertAdvanced.AbsentGoods.Color = GetValueColorByStatus(value.ExtraRedStatus, value.RedStatus, value.YellowStatus, model.FlagAbsentGoods) storeAlertAdvanced.PickTimeDaDaOneWeek.Value = fmt.Sprintf("%d%%", value.PickTimeDaDaOneWeek) - storeAlertAdvanced.PickTimeDaDaOneWeek.Color = GetValueColor(AlertTypePickTimeOrderDaDa, CheckStoreAlertOneWeekDayNum, value.PickTimeDaDaOneWeek, -1) + storeAlertAdvanced.PickTimeDaDaOneWeek.Color = GetValueColorByStatus(value.ExtraRedStatus, value.RedStatus, value.YellowStatus, model.FlagPickTimeDaDaOneWeek) storeAlertAdvanced.BadCommentOneWeek.Value = fmt.Sprintf("%d%%", value.BadCommentOneWeek) - storeAlertAdvanced.BadCommentOneWeek.Color = GetValueColor(AlertTypeBadCommentOrder, CheckStoreAlertOneWeekDayNum, value.BadCommentOneWeek, -1) + storeAlertAdvanced.BadCommentOneWeek.Color = GetValueColorByStatus(value.ExtraRedStatus, value.RedStatus, value.YellowStatus, model.FlagBadCommentOneWeek) storeAlertAdvanced.AbsentGoodsOneWeek.Value = fmt.Sprintf("%d%%", value.AbsentGoodsOneWeek) - storeAlertAdvanced.AbsentGoodsOneWeek.Color = GetValueColor(AlertTypeAbsentGoodsOrder, CheckStoreAlertOneWeekDayNum, value.AbsentGoodsOneWeek, -1) + storeAlertAdvanced.AbsentGoodsOneWeek.Color = GetValueColorByStatus(value.ExtraRedStatus, value.RedStatus, value.YellowStatus, model.FlagAbsentGoodsOneWeek) storeAlertAdvanced.StandardFinishTimeSelfDelivery.Value = fmt.Sprintf("%d%%", value.StandardFinishTimeSelfDelivery) - storeAlertAdvanced.StandardFinishTimeSelfDelivery.Color = GetValueColor(AlertTypeStandardFinishTimeOrderSelfDelivery, CheckStoreAlertOneWeekDayNum, value.StandardFinishTimeSelfDelivery, -1) + storeAlertAdvanced.StandardFinishTimeSelfDelivery.Color = GetValueColorByStatus(value.ExtraRedStatus, value.RedStatus, value.YellowStatus, model.FlagStandardFinishTimeSelfDelivery) storeAlertAdvanced.StandardPickUpTimeDaDa.Value = fmt.Sprintf("%d%%", value.StandardPickUpTimeDaDa) - storeAlertAdvanced.StandardPickUpTimeDaDa.Color = GetValueColor(AlertTypeStandardPickUpTimeOrderDaDa, CheckStoreAlertOneWeekDayNum, value.StandardPickUpTimeDaDa, -1) - - storeAlertAdvanced.StandardPickUpTimeDaDa.Value = fmt.Sprintf("%d%%", value.StandardPickUpTimeDaDa) - storeAlertAdvanced.StandardPickUpTimeDaDa.Color = GetValueColor(AlertTypeStandardPickUpTimeOrderDaDa, CheckStoreAlertOneWeekDayNum, value.StandardPickUpTimeDaDa, -1) + storeAlertAdvanced.StandardPickUpTimeDaDa.Color = GetValueColorByStatus(value.ExtraRedStatus, value.RedStatus, value.YellowStatus, model.FlagStandardPickUpTimeDaDa) if value.NoOrderInMonth == 1 { storeAlertAdvanced.NoOrderInMonth.Value = "是" - storeAlertAdvanced.NoOrderInMonth.Color = ColorRed } else { storeAlertAdvanced.NoOrderInMonth.Value = "否" - storeAlertAdvanced.NoOrderInMonth.Color = ColorUnknown } + storeAlertAdvanced.NoOrderInMonth.Color = GetValueColorByStatus(value.ExtraRedStatus, value.RedStatus, value.YellowStatus, model.FlagNoOrderInMonth) storeAlertAdvanced.RiskOrderCount.Value = utils.Int2Str(value.RiskOrderCount) - if value.RiskOrderCount > 0 { - storeAlertAdvanced.RiskOrderCount.Color = ColorRed - } else { - storeAlertAdvanced.RiskOrderCount.Color = ColorUnknown - } + storeAlertAdvanced.RiskOrderCount.Color = GetValueColorByStatus(value.ExtraRedStatus, value.RedStatus, value.YellowStatus, model.FlagRiskOrderCount) storeAlertAdvancedList = append(storeAlertAdvancedList, storeAlertAdvanced) } diff --git a/business/model/Store_Alert_Inform.go b/business/model/Store_Alert_Inform.go index 7af87259a..bc9701edd 100644 --- a/business/model/Store_Alert_Inform.go +++ b/business/model/Store_Alert_Inform.go @@ -11,8 +11,26 @@ const ( FieldAbsentGoodsOneWeek = "AbsentGoodsOneWeek" FieldStandardFinishTimeSelfDelivery = "StandardFinishTimeSelfDelivery" FieldStandardPickUpTimeDaDa = "StandardPickUpTimeDaDa" - FieldNoOrderInMonth = "NoOrderInMonth" - FieldRiskOrderCount = "RiskOrderCount" + + FieldNoOrderInMonth = "NoOrderInMonth" + FieldRiskOrderCount = "RiskOrderCount" + + FieldYellowStatus = "YellowStatus" + FieldRedStatus = "RedStatus" + FieldExtraRedStatus = "ExtraRedStatus" +) + +const ( + FlagPickTimeDaDa = 1 + FlagBadComment = 2 + FlagAbsentGoods = 4 + FlagPickTimeDaDaOneWeek = 8 + FlagBadCommentOneWeek = 16 + FlagAbsentGoodsOneWeek = 32 + FlagStandardFinishTimeSelfDelivery = 64 + FlagStandardPickUpTimeDaDa = 128 + FlagNoOrderInMonth = 256 + FlagRiskOrderCount = 512 ) type StoreAlert struct { @@ -32,6 +50,10 @@ type StoreAlert struct { NoOrderInMonth int `json:"noOrderInMonth"` RiskOrderCount int `json:"riskOrderCount"` + + YellowStatus int + RedStatus int + ExtraRedStatus int } type StoreAlertEx struct {