爆品预警统一发送消息

This commit is contained in:
苏尹岚
2020-01-21 09:22:45 +08:00
parent 6ca1f427a3
commit f579b1e50e
8 changed files with 146 additions and 100 deletions

View File

@@ -328,7 +328,7 @@ func DeleteConfig(ctx *jxcontext.Context, key, configType string) (err error) {
db := dao.GetDB()
switch configType {
case model.ConfigTypePricePack:
storeMapList, err2 := dao.GetStoresMapList(db, nil, nil, model.StoreStatusAll, model.StoreIsSyncYes, key)
storeMapList, err2 := dao.GetStoresMapList(db, nil, nil, nil, model.StoreStatusAll, model.StoreIsSyncYes, key)
if err = err2; err == nil {
var storeInfo []string
for _, v := range storeMapList {
@@ -339,7 +339,7 @@ func DeleteConfig(ctx *jxcontext.Context, key, configType string) (err error) {
}
}
case model.ConfigTypeFreightPack:
storeMapList, err2 := dao.GetStoresMapList(db, nil, nil, model.StoreStatusAll, model.StoreIsSyncYes, "")
storeMapList, err2 := dao.GetStoresMapList(db, nil, nil, nil, model.StoreStatusAll, model.StoreIsSyncYes, "")
if err = err2; err == nil {
var storeInfo []string
for _, v := range storeMapList {
@@ -419,7 +419,7 @@ func UpdateConfig(ctx *jxcontext.Context, key, configType, value string) (hint s
}
switch configType {
case model.ConfigTypePricePack:
storeMapList, err := dao.GetStoresMapList(db, nil, nil, model.StoreStatusAll, model.StoreIsSyncYes, key)
storeMapList, err := dao.GetStoresMapList(db, nil, nil, nil, model.StoreStatusAll, model.StoreIsSyncYes, key)
if err != nil {
dao.Rollback(db)
return "", err
@@ -438,7 +438,7 @@ func UpdateConfig(ctx *jxcontext.Context, key, configType, value string) (hint s
}
case model.ConfigTypeFreightPack:
dao.Commit(db)
storeMapList, err := dao.GetStoresMapList(db, nil, nil, model.StoreStatusAll, model.StoreIsSyncYes, "")
storeMapList, err := dao.GetStoresMapList(db, nil, nil, nil, model.StoreStatusAll, model.StoreIsSyncYes, "")
if err != nil {
return "", err
}

View File

@@ -398,7 +398,7 @@ func getStoresSql(ctx *jxcontext.Context, keyword string, params map[string]inte
}
func setStoreMapInfo(ctx *jxcontext.Context, db *dao.DaoDB, storesInfo *StoresInfo, storeIDs []int, briefLevel int) (err error) {
storeMapList, err := dao.GetStoresMapList(db, nil, storeIDs, model.StoreStatusAll, model.StoreIsSyncAll, "")
storeMapList, err := dao.GetStoresMapList(db, nil, storeIDs, nil, model.StoreStatusAll, model.StoreIsSyncAll, "")
if err != nil {
return err
}
@@ -1661,7 +1661,7 @@ func formalizeStore4Courier(storeDetail *dao.StoreDetail2) *dao.StoreDetail2 {
func ExportShopsHealthInfo(ctx *jxcontext.Context, vendorIDs, storeIDs []int, isAsync, isContinueWhenError bool) (hint string, err error) {
db := dao.GetDB()
vendorID := model.VendorIDEBAI
storeMapList, err := dao.GetStoresMapList(db, []int{vendorID}, storeIDs, model.StoreStatusAll, model.StoreIsSyncYes, "")
storeMapList, err := dao.GetStoresMapList(db, []int{vendorID}, storeIDs, nil, model.StoreStatusAll, model.StoreIsSyncYes, "")
if err != nil {
return "", err
}
@@ -1749,7 +1749,7 @@ func GetCorporationInfo(ctx *jxcontext.Context, licenceCode string) (corporation
func GetStoresVendorSnapshot(ctx *jxcontext.Context, parentTask tasksch.ITask, vendorIDs, storeIDs []int) (vendorStoreSnapshotList []*model.VendorStoreSnapshot, err error) {
db := dao.GetDB()
storeMapList, err := dao.GetStoresMapList(db, vendorIDs, storeIDs, model.StoreStatusAll, model.StoreIsSyncYes, "")
storeMapList, err := dao.GetStoresMapList(db, vendorIDs, storeIDs, nil, model.StoreStatusAll, model.StoreIsSyncYes, "")
if err != nil {
return nil, err
}
@@ -1796,7 +1796,7 @@ func getCurrentSnapshotAt(now time.Time) (snapshotAt time.Time) {
}
func updateVendorStoreStatusBySnapshot(db *dao.DaoDB, curSnapshotList []*model.VendorStoreSnapshot) (err error) {
storeMapList, err := dao.GetStoresMapList(db, nil, nil, model.StoreStatusAll, model.StoreIsSyncAll, "")
storeMapList, err := dao.GetStoresMapList(db, nil, nil, nil, model.StoreStatusAll, model.StoreIsSyncAll, "")
if err != nil {
return err
}
@@ -2380,7 +2380,7 @@ func JdStoreInfoCoordinateRecover(ctx *jxcontext.Context, vendorOrgCode string,
defer file1.Close()
db := dao.GetDB()
storeList, err := dao.GetStoresMapList(db, []int{model.VendorIDJD}, nil, model.StoreStatusAll, model.StoreIsSyncYes, "")
storeList, err := dao.GetStoresMapList(db, []int{model.VendorIDJD}, nil, nil, model.StoreStatusAll, model.StoreIsSyncYes, "")
if err == nil {
var validStoreList []*dao.StoreDetail
for _, v := range storeList {
@@ -2645,7 +2645,7 @@ func CreateStorePriceScore(ctx *jxcontext.Context) (err error) {
func RefreshJdLevel(ctx *jxcontext.Context) (err error) {
db := dao.GetDB()
storeMapList, err := dao.GetStoresMapList(db, []int{model.VendorIDJD}, nil, model.StoreStatusOpened, -1, "")
storeMapList, err := dao.GetStoresMapList(db, []int{model.VendorIDJD}, nil, nil, model.StoreStatusOpened, -1, "")
if len(storeMapList) > 0 {
dao.Begin(db)
defer func() {

View File

@@ -169,10 +169,13 @@ type tUpdateStoresSkus struct {
}
type tStoreSkusSecKill struct {
StoreID int `orm:"column(store_id)"`
VendorID int `orm:"column(vendor_id)"`
SecKillCount int
SecKillCount2 int
StoreID int `orm:"column(store_id)"`
VendorID int `orm:"column(vendor_id)"`
SecKillCount int
SecKillCount2 int
OperatorPhone string
MarketManPhone string
NoticeMsg string
}
const (
@@ -656,7 +659,7 @@ func updateSaleInfo4StoreSkuName(ctx *jxcontext.Context, db *dao.DaoDB, storeIDs
}
func getValidStoreVendorMap(db *dao.DaoDB, storeIDs []int) (realVendorMap map[int]int, err error) {
storeMapList, err := dao.GetStoresMapList(db, nil, storeIDs, model.StoreStatusAll, model.StoreIsSyncYes, "")
storeMapList, err := dao.GetStoresMapList(db, nil, storeIDs, nil, model.StoreStatusAll, model.StoreIsSyncYes, "")
if err != nil {
return nil, err
}
@@ -1982,7 +1985,7 @@ func RefreshStoresSkuByVendor(ctx *jxcontext.Context, storeIDs []int, vendorID i
return "", fmt.Errorf("此功能当前只支持京东到家平台")
}
db := dao.GetDB()
storeMapList, err := dao.GetStoresMapList(db, []int{vendorID}, storeIDs, model.StoreStatusAll, model.StoreIsSyncAll, "")
storeMapList, err := dao.GetStoresMapList(db, []int{vendorID}, storeIDs, nil, model.StoreStatusAll, model.StoreIsSyncAll, "")
if err != nil {
return "", err
}
@@ -3352,43 +3355,46 @@ func SendSeckillSkusCountMsg(ctx *jxcontext.Context, vendorIDs []int, isAsync, i
// 1. 如果爆品低于8个报警 type1
// 2. 爆品价格低于1元商品小于5个报警 type2
var (
type1Count = 8
type2Count = 5
type1Count = 8
type2Count = 5
ddMsgresult []interface{}
)
db := dao.GetDB()
storeList, err := dao.GetStoresMapList(db, vendorIDs, nil, model.StoreStatusOpened, model.StoreIsSyncAll, "")
pTask := tasksch.NewParallelTask("SendSeckillSkusCountMsg", tasksch.NewParallelConfig().SetIsContinueWhenError(isContinueWhenError), ctx,
func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) {
store := batchItemList[0].(*model.StoreMap)
var type1, type2 int
switch store.VendorID {
case model.VendorIDEBAI:
result, _ := api.EbaiAPI.GetStoresShowWindowSkus(utils.Str2Int64(store.VendorStoreID))
for _, v := range result {
type1++
if v.SalePrice < 1 {
type2++
}
}
case model.VendorIDMTWM:
handler := partner.GetPurchasePlatformFromVendorID(store.VendorID).(partner.ISingleStoreStoreSkuHandler)
remoteSkuList, err := handler.GetStoreSkusFullInfo(ctx, nil, store.StoreID, store.VendorStoreID, nil)
if err != nil {
return retVal, err
}
for _, v := range remoteSkuList {
for _, vv := range v.SkuList {
if vv.IsSpecialty == 1 {
type1++
}
if vv.IsSpecialty == 1 && vv.VendorPrice < 100 {
storeList, err := dao.GetStoresMapList(db, vendorIDs, nil, []int{model.StoreStatusClosed, model.StoreStatusHaveRest, model.StoreStatusOpened}, model.StoreStatusOpened, model.StoreIsSyncAll, "")
taskSeqFunc := func(task *tasksch.SeqTask, step int, params ...interface{}) (result interface{}, err error) {
switch step {
case 0:
taskFunc := func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) {
store := batchItemList[0].(*model.StoreMap)
var type1, type2 int
switch store.VendorID {
case model.VendorIDEBAI:
result, _ := api.EbaiAPI.GetStoresShowWindowSkus(utils.Str2Int64(store.VendorStoreID))
for _, v := range result {
type1++
if v.SalePrice < 1 {
type2++
}
}
}
case model.VendorIDJD:
var storeSecKill []*tStoreSkusSecKill
sql := `
case model.VendorIDMTWM:
handler := partner.GetPurchasePlatformFromVendorID(store.VendorID).(partner.ISingleStoreStoreSkuHandler)
remoteSkuList, err := handler.GetStoreSkusFullInfo(ctx, nil, store.StoreID, store.VendorStoreID, nil)
if err != nil {
return retVal, err
}
for _, v := range remoteSkuList {
for _, vv := range v.SkuList {
if vv.IsSpecialty == 1 {
type1++
}
if vv.IsSpecialty == 1 && vv.VendorPrice < 100 {
type2++
}
}
}
case model.VendorIDJD:
var storeSecKill []*tStoreSkusSecKill
sql := `
SELECT t1.store_id,count(*) sec_kill_count, count(t1.price < 100 or NULL) sec_kill_count2
FROM(
SELECT a.store_id, a.sku_id, d.type, MIN(b.act_price) price
@@ -3406,60 +3412,96 @@ func SendSeckillSkusCountMsg(ctx *jxcontext.Context, vendorIDs []int, isAsync, i
GROUP BY 1,2,3)t1
GROUP BY 1
`
sqlParams := []interface{}{
store.StoreID, store.VendorID,
model.ActSkuSecKill, model.StoreSkuBindStatusNormal,
utils.DefaultTimeValue,
sqlParams := []interface{}{
store.StoreID, store.VendorID,
model.ActSkuSecKill, model.StoreSkuBindStatusNormal,
utils.DefaultTimeValue,
}
err = dao.GetRows(db, &storeSecKill, sql, sqlParams...)
if len(storeSecKill) > 0 {
type1 = storeSecKill[0].SecKillCount
type2 = storeSecKill[0].SecKillCount2
} else {
type1 = 0
type2 = 0
}
}
err = dao.GetRows(db, &storeSecKill, sql, sqlParams...)
if len(storeSecKill) > 0 {
type1 = storeSecKill[0].SecKillCount
type2 = storeSecKill[0].SecKillCount2
if type1 < type1Count || type2 < type2Count {
storeDetail, _ := dao.GetStoreDetail(db, store.StoreID, store.VendorID)
var (
operatorName string
operatorPhone string
type1Str = "爆品数量低于8个"
type2Str = "爆品价格小于1元的爆品数量低于5个"
typeResult = ""
)
if storeDetail.OperatorPhone != "" {
operatorName = storeDetail.OperatorName
operatorPhone = storeDetail.OperatorPhone
} else if storeDetail.OperatorPhone2 != "" {
operatorName = storeDetail.OperatorName2
operatorPhone = storeDetail.OperatorPhone2
}
if type1 < type1Count {
typeResult += type1Str
}
if type2 < type2Count {
typeResult += type2Str
}
var result = &tStoreSkusSecKill{}
noticeMsg := fmt.Sprintf("运营负责人:[%v],市场负责人:[%v]门店ID[%v]平台门店ID[%v],门店名:[%v],平台:[%v],警告类型:[%v]\n", operatorName, storeDetail.MarketManName, store.StoreID, storeDetail.VendorStoreID, store.StoreName, model.VendorChineseNames[store.VendorID], typeResult)
result.OperatorPhone = operatorPhone
result.MarketManPhone = storeDetail.MarketManPhone
result.NoticeMsg = noticeMsg
retVal = []*tStoreSkusSecKill{result}
}
return retVal, err
}
taskParallel := tasksch.NewParallelTask("获取各平台爆品数量", tasksch.NewParallelConfig().SetParallelCount(parallelCount), ctx, taskFunc, storeList)
tasksch.HandleTask(taskParallel, task, true).Run()
ddMsgresult, err = taskParallel.GetResult(0)
case 1:
var (
operaterMap = make(map[string]string)
marketMap = make(map[string]string)
)
for _, v := range ddMsgresult {
ddm := v.(*tStoreSkusSecKill)
if operaterMap[ddm.OperatorPhone] != "" {
operaterMap[ddm.OperatorPhone] += ddm.NoticeMsg
} else {
type1 = 0
type2 = 0
operaterMap[ddm.OperatorPhone] = ddm.NoticeMsg
}
if marketMap[ddm.MarketManPhone] != "" {
marketMap[ddm.MarketManPhone] += ddm.NoticeMsg
} else {
marketMap[ddm.MarketManPhone] = ddm.NoticeMsg
}
}
if type1 < type1Count || type2 < type2Count {
storeDetail, _ := dao.GetStoreDetail(db, store.StoreID, store.VendorID)
var (
operatorName string
operatorPhone string
type1Str = "爆品数量低于8个"
type2Str = "爆品价格小于1元的爆品数量低于5个"
typeResult = ""
)
if storeDetail.OperatorPhone != "" {
operatorName = storeDetail.OperatorName
operatorPhone = storeDetail.OperatorPhone
} else if storeDetail.OperatorPhone2 != "" {
operatorName = storeDetail.OperatorName2
operatorPhone = storeDetail.OperatorPhone2
}
if type1 < type1Count {
typeResult += type1Str
}
if type2 < type2Count {
typeResult += type2Str
}
noticeMsg := fmt.Sprintf("运营负责人:[%v],市场负责人:[%v]门店ID[%v]平台门店ID[%v],门店名:[%v],平台:[%v],警告类型:[%v]", operatorName, storeDetail.MarketManName, store.StoreID, storeDetail.VendorStoreID, store.StoreName, model.VendorChineseNames[store.VendorID], typeResult)
globals.SugarLogger.Debugf("SendSeckillSkusCountMsg: [%v]", noticeMsg)
user, err := dao.GetUserByID(db, "mobile", operatorPhone)
for k, v := range operaterMap {
user, err := dao.GetUserByID(db, "mobile", k)
if user != nil && err == nil {
ddmsg.SendUserMessage(dingdingapi.MsgTyeText, user.UserID, "警告!门店爆品数量异常!", noticeMsg)
}
user2, err := dao.GetUserByID(db, "mobile", storeDetail.MarketManPhone)
if err == nil && user2 != nil {
ddmsg.SendUserMessage(dingdingapi.MsgTyeText, user2.UserID, "警告!门店爆品数量异常!", noticeMsg)
ddmsg.SendUserMessage(dingdingapi.MsgTyeText, user.UserID, "警告!门店爆品数量异常!", v)
}
globals.SugarLogger.Debugf("SendSeckillSkusCountMsg: [%v]", v)
}
return retVal, err
}, storeList)
tasksch.HandleTask(pTask, nil, true).Run()
for k, v := range marketMap {
user, err := dao.GetUserByID(db, "mobile", k)
if user != nil && err == nil {
ddmsg.SendUserMessage(dingdingapi.MsgTyeText, user.UserID, "警告!门店爆品数量异常!", v)
}
globals.SugarLogger.Debugf("SendSeckillSkusCountMsg: [%v]", v)
}
}
return result, err
}
taskSeq := tasksch.NewSeqTask2("爆品预警", ctx, isContinueWhenError, taskSeqFunc, 3)
tasksch.HandleTask(taskSeq, nil, true).Run()
if !isAsync {
_, err = pTask.GetResult(0)
_, err = taskSeq.GetResult(0)
hint = "1"
} else {
hint = pTask.GetID()
hint = taskSeq.GetID()
}
return hint, err
}

View File

@@ -598,7 +598,7 @@ func (v *VendorSync) AmendAndPruneStoreStuff(ctx *jxcontext.Context, vendorIDs [
func (v *VendorSync) LoopStoresMap2(ctx *jxcontext.Context, parentTask tasksch.ITask, db *dao.DaoDB, taskName string, isAsync, isManageIt bool, vendorIDs []int, storeIDs []int, mustDirty bool, handler tasksch.WorkFunc, isContinueWhenError bool) (task tasksch.ITask, hint string, err error) {
var storeMapList []*model.StoreMap
if storeMapList, err = dao.GetStoresMapList2(db, vendorIDs, storeIDs, model.StoreStatusAll, model.StoreIsSyncYes, "", mustDirty); err != nil {
if storeMapList, err = dao.GetStoresMapList2(db, vendorIDs, storeIDs, nil, model.StoreStatusAll, model.StoreIsSyncYes, "", mustDirty); err != nil {
return nil, "", err
}
if len(storeMapList) == 0 {

View File

@@ -16,7 +16,7 @@ func OpenRemoteStoreByJxStatus(ctx *jxcontext.Context, vendorIDs, storeIDs []int
if !isForce {
status = model.StoreStatusClosed
}
storeMapList, err := dao.GetStoresMapList(db, vendorIDs, storeIDs, status, model.StoreIsSyncYes, "")
storeMapList, err := dao.GetStoresMapList(db, vendorIDs, storeIDs, nil, status, model.StoreIsSyncYes, "")
if err != nil {
return "", err
}

View File

@@ -211,7 +211,7 @@ func GetStoreCourierList(db *DaoDB, storeIDs []int, status, auditStatus int) (co
return nil, err
}
func GetStoresMapList2(db *DaoDB, vendorIDs, storeIDs []int, status, isSync int, pricePack string, mustDirty bool) (storeMapList []*model.StoreMap, err error) {
func GetStoresMapList2(db *DaoDB, vendorIDs, storeIDs, storeStatuss []int, status, isSync int, pricePack string, mustDirty bool) (storeMapList []*model.StoreMap, err error) {
sql := `
SELECT t1.*
FROM store_map t1
@@ -230,6 +230,10 @@ func GetStoresMapList2(db *DaoDB, vendorIDs, storeIDs []int, status, isSync int,
sql += " AND t1.store_id IN (" + GenQuestionMarks(len(storeIDs)) + ")"
sqlParams = append(sqlParams, storeIDs)
}
if len(storeStatuss) > 0 {
sql += " AND t2.status IN (" + GenQuestionMarks(len(storeStatuss)) + ")"
sqlParams = append(sqlParams, storeStatuss)
}
if status != model.StoreStatusAll {
sql += " AND t1.status = ?"
sqlParams = append(sqlParams, status)
@@ -252,8 +256,8 @@ func GetStoresMapList2(db *DaoDB, vendorIDs, storeIDs []int, status, isSync int,
return nil, err
}
func GetStoresMapList(db *DaoDB, vendorIDs, storeIDs []int, status, isSync int, pricePack string) (storeMapList []*model.StoreMap, err error) {
return GetStoresMapList2(db, vendorIDs, storeIDs, status, isSync, pricePack, false)
func GetStoresMapList(db *DaoDB, vendorIDs, storeIDs, storeStatuss []int, status, isSync int, pricePack string) (storeMapList []*model.StoreMap, err error) {
return GetStoresMapList2(db, vendorIDs, storeIDs, storeStatuss, status, isSync, pricePack, false)
}
func StoreMapList2Map(storeMapList []*model.StoreMap) (storeMapMap map[int][]*model.StoreMap) {

View File

@@ -1253,7 +1253,7 @@ func UpdateActPrice4StoreSkuNameNew(db *DaoDB, storeIDs, skuIDs []int, skuNamesI
vendorIDs = []int{actVendorID}
}
} else {
storeMapList, err := GetStoresMapList(db, nil, storeIDs, model.StoreStatusAll, model.StoreIsSyncAll, "")
storeMapList, err := GetStoresMapList(db, nil, storeIDs, nil, model.StoreStatusAll, model.StoreIsSyncAll, "")
if err != nil {
return err
}

View File

@@ -44,7 +44,7 @@ func formalizeTagList(mtwmTagList string) (outTagList string) {
}
func (c *PurchaseHandler) RefreshComment(fromTime, toTime time.Time) (err error) {
storeMapList, err2 := dao.GetStoresMapList(dao.GetDB(), []int{model.VendorIDMTWM}, nil, model.StoreStatusAll, model.StoreIsSyncYes, "")
storeMapList, err2 := dao.GetStoresMapList(dao.GetDB(), []int{model.VendorIDMTWM}, nil, nil, model.StoreStatusAll, model.StoreIsSyncYes, "")
if err = err2; err != nil {
return err
}