From 6efdcdf6927341413de472f50ca8aaa2ec63d885 Mon Sep 17 00:00:00 2001 From: gazebo Date: Thu, 5 Sep 2019 09:34:48 +0800 Subject: [PATCH 01/10] =?UTF-8?q?-=20GetOrderStatusList=E4=B8=AD=E7=9A=84?= =?UTF-8?q?=E6=8E=92=E5=BA=8F=E8=A7=84=E5=88=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- business/jxcallback/orderman/orderman_ext.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/business/jxcallback/orderman/orderman_ext.go b/business/jxcallback/orderman/orderman_ext.go index 50e52fd70..a1cc23bd2 100644 --- a/business/jxcallback/orderman/orderman_ext.go +++ b/business/jxcallback/orderman/orderman_ext.go @@ -626,7 +626,7 @@ func (c *OrderManager) GetOrderStatusList(ctx *jxcontext.Context, vendorOrderID sql += " AND t1.order_type = ?" sqlParams = append(sqlParams, orderType) } - sql += " ORDER BY t1.status_time, t1.order_type DESC" + sql += " ORDER BY t1.status_time, t1.order_type DESC, t1.status" db := dao.GetDB() if err = dao.GetRows(db, &statusList, sql, sqlParams...); err != nil { From 059e563f0858af9f87b10ea2e2deaf5f0aa75bbd Mon Sep 17 00:00:00 2001 From: gazebo Date: Thu, 5 Sep 2019 14:58:31 +0800 Subject: [PATCH 02/10] - HandleOrder4Consignee --- business/jxcallback/orderman/order.go | 2 + business/jxstore/cms/user2.go | 89 +++++++++++++++++++++------ business/model/order.go | 3 +- business/model/user.go | 23 ++++--- 4 files changed, 88 insertions(+), 29 deletions(-) diff --git a/business/jxcallback/orderman/order.go b/business/jxcallback/orderman/order.go index b6cab1841..4d8da0cde 100644 --- a/business/jxcallback/orderman/order.go +++ b/business/jxcallback/orderman/order.go @@ -177,6 +177,8 @@ func (c *OrderManager) SaveOrder(order *model.GoodsOrder, isAdjust bool, db *dao order.WaybillVendorID = model.VendorIDUnknown order.OrderFinishedAt = utils.DefaultTimeValue + // cms.HandleOrder4Consignee(order) + dao.Begin(db) defer func() { if r := recover(); r != nil || err != nil { diff --git a/business/jxstore/cms/user2.go b/business/jxstore/cms/user2.go index f955a3cbe..227807131 100644 --- a/business/jxstore/cms/user2.go +++ b/business/jxstore/cms/user2.go @@ -23,7 +23,7 @@ import ( ) var ( - ErrUserIDAndNameMustGiven = errors.New("用户ID2,用户名及手机号必须不为空") + ErrUserIDAndNameMustGiven = errors.New("用户ID2和用户名必须不为空") ) var ( @@ -128,7 +128,7 @@ func HandleOrder4Consignee(order *model.GoodsOrder) (err error) { var user *model.User authType := jxutils.GetAuthType4Vendor(order.VendorID) if authType == "" { - msg := fmt.Sprintf("平台ID:%d当前不支持", order.VendorID) + msg := fmt.Sprintf("平台ID:%d当前不被支持,请联系开发", order.VendorID) globals.SugarLogger.Warn(msg) return fmt.Errorf(msg) } @@ -147,42 +147,85 @@ func HandleOrder4Consignee(order *model.GoodsOrder) (err error) { } vendorUserID := order.VendorUserID - if err == nil { - authList, err2 := dao.GetUserBindAuthInfo(db, "", model.AuthBindTypeID, "", []string{authType}) - if err = err2; err != nil { + if err == nil && vendorUserID != "" { + authInfo, err2 := dao.GetAuthBind(db, "", model.AuthBindTypeID, authType, vendorUserID) + if err = err2; err != nil && !dao.IsNoRowsError(err) { return err } - if len(authList) > 0 { - if user, err = dao.GetUserByID(db, "UserID", authList[0].UserID); err != nil { - return err + if err == nil { + vendorUserID = "" + if user == nil { + if user, err = dao.GetUserByID(db, "UserID", authInfo.UserID); err != nil { + return err + } } + } else { + err = nil } } + if user == nil { user = &model.User{ UserID2: mobileNumber, Name: order.ConsigneeName, Mobile: &mobileNumber, Type: model.UserTypeConsumer, + Address: order.ConsigneeAddress, Remark: order.VendorOrderID, } + setUserAddress(db, user, order) + + if user.GetID2() == "" { + user.UserID2 = vendorUserID + } + if user.GetID2() == "" { + user.UserID2 = order.VendorUserID + } + user.Type = model.UserTypeConsumer err = CreateUser(user, oeratorName) - } - if err == nil && vendorUserID != "" { - authBind := &model.AuthBind{ - UserID: user.GetID(), - BindType: model.AuthBindTypeID, - AuthID: vendorUserID, - Type: authType, + globals.SugarLogger.Debug(err) + } else { + if user.GetMobile() == "" && mobileNumber != "" { + user.Mobile = &mobileNumber + dao.UpdateEntity(db, user, "Mobile") + } + } + if err == nil { + order.UserID = user.GetID() + if vendorUserID != "" { + authBind := &model.AuthBind{ + UserID: user.GetID(), + BindType: model.AuthBindTypeID, + AuthID: vendorUserID, + Type: authType, + } + dao.WrapAddIDCULDEntity(authBind, oeratorName) + authBind.Status = model.AuthBindStatusNormal + err = dao.CreateEntity(nil, authBind) } - dao.WrapAddIDCULDEntity(authBind, oeratorName) - authBind.Status = model.AuthBindStatusNormal - err = dao.CreateEntity(nil, authBind) } return err } +func setUserAddress(db *dao.DaoDB, user *model.User, order *model.GoodsOrder) { + user.Address = order.ConsigneeAddress + store := &model.Store{} + store.ID = jxutils.GetSaleStoreIDFromOrder(order) + if err := dao.GetEntity(db, store); err == nil { + user.CityCode = store.CityCode + user.DistrictCode = store.DistrictCode + } else if dao.IsNoRowsError(err) { + if order.ConsigneeLng != 0 && order.ConsigneeLat != 0 { + if user.DistrictCode = api.AutonaviAPI.GetCoordinateDistrictCode(jxutils.IntCoordinate2Standard(order.ConsigneeLng), jxutils.IntCoordinate2Standard(order.ConsigneeLat)); user.DistrictCode > 0 { + if placeInfo, err := dao.GetPlaceByCode(db, user.DistrictCode); err == nil { + user.CityCode = placeInfo.ParentCode + } + } + } + } +} + func GetUserBindAuthInfo(ctx *jxcontext.Context) (authList []*model.AuthBind, err error) { authInfo, err := ctx.GetV2AuthInfo() if err == nil { @@ -192,9 +235,17 @@ func GetUserBindAuthInfo(ctx *jxcontext.Context) (authList []*model.AuthBind, er } func CreateUser(user *model.User, creatorName string) (err error) { - if user == nil || user.UserID2 == "" || user.Name == "" || user.GetMobile() == "" { + globals.SugarLogger.Debugf("CreateUser user:%s, creatorName:%s", utils.Format4Output(user, true), creatorName) + + if user == nil || user.UserID2 == "" || user.Name == "" { return ErrUserIDAndNameMustGiven } + if user.GetMobile() == "" { + user.Mobile = nil + } + if user.GetEmail() == "" { + user.Email = nil + } dao.WrapAddIDCULDEntity(user, creatorName) user.UserID = utils.GetUUID() user.Status = model.UserStatusNormal diff --git a/business/model/order.go b/business/model/order.go index 093283ce6..53b2fa605 100644 --- a/business/model/order.go +++ b/business/model/order.go @@ -32,6 +32,8 @@ type GoodsOrder struct { WaybillTipMoney int64 `json:"waybillTipMoney"` // 京西加的平台配送小费 EarningPrice int64 `json:"earningPrice"` // 结算给门店老板的钱(未扣除可能的三方配送费) Weight int `json:"weight"` // 单位为克 + VendorUserID string `orm:"column(vendor_user_id);size(48)" json:"vendorUserID"` + UserID string `orm:"column(user_id);size(48)" json:"userID"` ConsigneeName string `orm:"size(32)" json:"consigneeName"` ConsigneeMobile string `orm:"size(32)" json:"consigneeMobile"` ConsigneeMobile2 string `orm:"size(32)" json:"consigneeMobile2"` @@ -65,7 +67,6 @@ type GoodsOrder struct { // 以下只是用于传递数据 OriginalData string `orm:"-" json:"-"` Skus []*OrderSku `orm:"-" json:"-"` - VendorUserID string `orm:"-" json:"-"` } func (o *GoodsOrder) TableUnique() [][]string { diff --git a/business/model/user.go b/business/model/user.go index e8138d299..b71e6638a 100644 --- a/business/model/user.go +++ b/business/model/user.go @@ -26,15 +26,20 @@ var ( type User struct { ModelIDCULD - UserID string `orm:"size(48);column(user_id)" json:"userID" compact:"userID"` // 内部唯一标识 - UserID2 string `orm:"size(48);column(user_id2)" json:"userID2" compact:"userID2"` // 外部唯一标识(一般用于登录) - Name string `orm:"size(48);index" json:"name" compact:"name"` // 外部显示标识(当前可以重复) - Mobile *string `orm:"size(32);null" json:"mobile" compact:"mobile"` - Email *string `orm:"size(32);null" json:"email" compact:"email"` - Status int8 `json:"status" compact:"status"` - Type int8 `json:"type" compact:"type"` // 用户类型 - IDCardNo string `orm:"size(18);column(id_card_no)" json:"idCardNo" compact:"idCardNo"` // 身份证号 - Remark string `orm:"size(255)" json:"remark"` + UserID string `orm:"size(48);column(user_id)" json:"userID" compact:"userID"` // 内部唯一标识 + UserID2 string `orm:"size(48);column(user_id2)" json:"userID2" compact:"userID2"` // 外部唯一标识(一般用于登录) + Name string `orm:"size(48);index" json:"name" compact:"name"` // 外部显示标识(当前可以重复) + Mobile *string `orm:"size(32);null" json:"mobile" compact:"mobile"` + Email *string `orm:"size(32);null" json:"email" compact:"email"` + Status int8 `json:"status" compact:"status"` + Type int8 `json:"type" compact:"type"` // 用户类型 + + CityCode int `orm:"default(0)" json:"cityCode"` + DistrictCode int `orm:"default(0);index" json:"districtCode"` + Address string `orm:"size(255)" json:"address"` + + IDCardNo string `orm:"size(18);column(id_card_no)" json:"idCardNo" compact:"idCardNo"` // 身份证号 + Remark string `orm:"size(255)" json:"remark"` } func (*User) TableUnique() [][]string { From c98745ce59dcaab5b2719bba3e62b7ae7fe85860 Mon Sep 17 00:00:00 2001 From: gazebo Date: Thu, 5 Sep 2019 16:09:00 +0800 Subject: [PATCH 03/10] =?UTF-8?q?-=20=E9=A5=BF=E7=99=BE=E8=BD=AC=E8=87=AA?= =?UTF-8?q?=E9=80=81=E6=97=B6=EF=BC=8C=E5=A6=82=E6=9E=9C=E9=94=99=E8=AF=AF?= =?UTF-8?q?=E6=98=AF=E5=B7=B2=E7=BB=8F=E6=98=AF=E8=87=AA=E9=80=81=E7=8A=B6?= =?UTF-8?q?=E6=80=81=EF=BC=8C=E5=88=99=E8=BF=94=E5=9B=9E=E6=88=90=E5=8A=9F?= =?UTF-8?q?=20-=20CreateWaybillOnProviders=E4=B8=AD=E9=83=A8=E5=88=86?= =?UTF-8?q?=E5=A4=B1=E8=B4=A5=E6=97=B6=EF=BC=8C=E8=BE=93=E5=87=BA=E5=87=BA?= =?UTF-8?q?=E9=94=99=E6=97=A5=E5=BF=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../jxcallback/scheduler/basesch/basesch_ext.go | 14 +++++++++----- business/partner/purchase/ebai/order.go | 10 +++++++++- 2 files changed, 18 insertions(+), 6 deletions(-) diff --git a/business/jxcallback/scheduler/basesch/basesch_ext.go b/business/jxcallback/scheduler/basesch/basesch_ext.go index 3b1b7e2ea..5a804f83e 100644 --- a/business/jxcallback/scheduler/basesch/basesch_ext.go +++ b/business/jxcallback/scheduler/basesch/basesch_ext.go @@ -3,7 +3,7 @@ package basesch import ( "fmt" - "git.rosy.net.cn/baseapi/utils" + "git.rosy.net.cn/baseapi/utils/errlist" "git.rosy.net.cn/jx-callback/business/jxcallback/scheduler" "git.rosy.net.cn/jx-callback/business/jxutils" "git.rosy.net.cn/jx-callback/business/jxutils/jxcontext" @@ -23,7 +23,7 @@ func (c *BaseScheduler) CreateWaybillOnProviders(ctx *jxcontext.Context, order * } courierVendorIDMap := jxutils.IntList2Map(courierVendorIDs) excludeCourierVendorIDMap := jxutils.IntList2Map(excludeCourierVendorIDs) - var errList []string + errList := errlist.New() for _, storeCourier := range storeCourierList { if (courierVendorIDs == nil || courierVendorIDMap[storeCourier.VendorID] == 1) && (excludeCourierVendorIDs == nil || excludeCourierVendorIDMap[storeCourier.VendorID] == 0) { @@ -39,18 +39,22 @@ func (c *BaseScheduler) CreateWaybillOnProviders(ctx *jxcontext.Context, order * } } else { globals.SugarLogger.Debugf("CreateWaybillOnProviders orderID:%s userName:%s vendorID:%d failed with error:%v", order.VendorOrderID, userName, courierVendorID, err) - errList = append(errList, fmt.Sprintf("平台:%s,%s", jxutils.GetVendorName(courierVendorID), err.Error())) + errList.AddErr(fmt.Errorf("平台:%s,%s", jxutils.GetVendorName(courierVendorID), err.Error())) } } } } } if len(bills) > 0 { + err = errList.GetErrListAsOne() + if err != nil { + partner.CurOrderManager.OnOrderMsg(order, "创建三方运单部分失败", err.Error()) + } err = nil - } else if len(errList) == 0 { + } else if errList.GetErrListAsOne() == nil { err = fmt.Errorf("orderID:%s没有绑定有效的三方配送门店或没有剩下可用的三方配送", order.VendorOrderID) } else { - err = fmt.Errorf("orderID:%s所有运单失败:\n%s", order.VendorOrderID, utils.Format4Output(errList, false)) + err = fmt.Errorf("orderID:%s所有运单失败:\n%s", order.VendorOrderID, errList.GetErrListAsOne().Error()) } globals.SugarLogger.Infof("CreateWaybillOnProviders orderID:%s userName:%s error:%v", order.VendorOrderID, userName, err) return bills, err diff --git a/business/partner/purchase/ebai/order.go b/business/partner/purchase/ebai/order.go index 06fa9f557..a20cf98ed 100644 --- a/business/partner/purchase/ebai/order.go +++ b/business/partner/purchase/ebai/order.go @@ -316,7 +316,15 @@ func (p *PurchaseHandler) ConfirmReceiveGoods(ctx *jxcontext.Context, order *mod func (p *PurchaseHandler) Swtich2SelfDeliver(order *model.GoodsOrder, userName string) (err error) { globals.SugarLogger.Debugf("ebai Swtich2SelfDeliver orderID:%s", order.VendorOrderID) if globals.EnableEbaiStoreWrite { - err = api.EbaiAPI.OrderSwitchselfdelivery(order.VendorOrderID) + if err = api.EbaiAPI.OrderSwitchselfdelivery(order.VendorOrderID); err != nil { + if utils.IsErrMatch(err, "301251", nil) { + if deliveryStatus, err2 := api.EbaiAPI.OrderDeliveryGet(order.VendorOrderID); err2 == nil { + if utils.Interface2String(deliveryStatus["status"]) == ebaiapi.WaybillStatusSelfDelivery { + err = nil + } + } + } + } } if err == nil { // 饿百不会发送配送中,模拟发送 From f5ec608a1c5c204e8af4c4dcc851dcb5d3f65ba5 Mon Sep 17 00:00:00 2001 From: gazebo Date: Thu, 5 Sep 2019 16:57:28 +0800 Subject: [PATCH 04/10] =?UTF-8?q?-=20=E5=88=9B=E5=BB=BA=E6=88=96=E6=9B=B4?= =?UTF-8?q?=E6=96=B0=E4=BA=AC=E8=A5=BF=E9=97=A8=E5=BA=97=EF=BC=8C=E6=B3=A8?= =?UTF-8?q?=E5=86=8C=E7=94=A8=E6=88=B7=E6=97=B6=EF=BC=8C=E8=87=AA=E5=8A=A8?= =?UTF-8?q?=E6=A0=B9=E6=8D=AE=E9=97=A8=E5=BA=97=E7=9A=84tel1,tel2=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0=E9=97=A8=E5=BA=97=E8=80=81=E6=9D=BF=E8=A7=92=E8=89=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- business/jxstore/cms/cms.go | 2 +- business/jxstore/cms/store.go | 30 +++------------------------ business/jxstore/cms/user2.go | 35 ++++++++++++++++++++++++++++++++ business/model/dao/store.go | 19 ++++++++++++----- business/model/dao/store_test.go | 2 +- 5 files changed, 54 insertions(+), 34 deletions(-) diff --git a/business/jxstore/cms/cms.go b/business/jxstore/cms/cms.go index 06bbfc585..c9f7d5919 100644 --- a/business/jxstore/cms/cms.go +++ b/business/jxstore/cms/cms.go @@ -273,7 +273,7 @@ func DeleteConfig(ctx *jxcontext.Context, key, configType string) (err error) { } } errList.AddErr(err) - storeList, err2 := dao.GetStoreList4Role(db, key) + storeList, err2 := dao.GetStoreList(db, nil, nil, key) if err = err2; err == nil && len(storeList) > 0 { storeIDs := make([]int, len(storeList)) for k, v := range storeList { diff --git a/business/jxstore/cms/store.go b/business/jxstore/cms/store.go index a120392c3..8593152e2 100644 --- a/business/jxstore/cms/store.go +++ b/business/jxstore/cms/store.go @@ -8,10 +8,7 @@ import ( "strings" "time" - "git.rosy.net.cn/jx-callback/business/authz/autils" - "git.rosy.net.cn/jx-callback/business/auth2" - "git.rosy.net.cn/jx-callback/business/authz" "git.rosy.net.cn/baseapi/platformapi/autonavi" "git.rosy.net.cn/baseapi/platformapi/baidunavi" @@ -700,8 +697,8 @@ func UpdateStore(ctx *jxcontext.Context, storeID int, payload map[string]interfa dao.Commit(db) globals.SugarLogger.Debugf("UpdateStore track:%s, before call SyncStore", ctx.GetTrackInfo()) _, err = CurVendorSync.SyncStore(ctx, db, -1, store.ID, false, userName) - if valid["tel1"] != nil { - AddStoreBossByMoble(ctx, utils.Interface2String(valid["tel1"]), storeID) + if valid["tel1"] != nil || valid["tel2"] != nil { + TryAddStoreBossRole4StoreByMobile(ctx, store.ID, []string{utils.Interface2String(valid["tel1"]), utils.Interface2String(valid["tel2"])}) } if syncStatus&model.SyncFlagStoreAddress != 0 || valid["tel1"] != nil || valid["payeeName"] != nil { updateCourierStores(ctx, storeID) @@ -797,7 +794,7 @@ func CreateStore(ctx *jxcontext.Context, storeExt *StoreExt, userName string) (i store.ID = existingID if err = dao.CreateEntity(db, store); err == nil { UpdateOrCreateCourierStores(ctx, store.ID, false, false, false) - AddStoreBossByMoble(ctx, storeExt.Tel1, storeExt.ID) + TryAddStoreBossRole4StoreByMobile(ctx, storeExt.ID, []string{storeExt.Tel1, storeExt.Tel2}) return store.ID, err } return 0, err @@ -1791,24 +1788,3 @@ func SyncStoresQualify(ctx *jxcontext.Context, storeIDs []int, isAsync, isContin } return hint, err } - -func AddStoreBossByMoble(ctx *jxcontext.Context, mobile string, storeID int) (num int64, err error) { - if mobile != "" { - if globals.EnableWXAuth2 { - db := dao.GetDB() - userList, _, err2 := dao.GetUsers(db, 0, "", nil, "", mobile, 0, 0) - globals.SugarLogger.Debugf("AddStoreBossByMoble mobile:%s, userList:%s", mobile, utils.Format4Output(userList, true)) - if err = err2; err == nil && len(userList) > 0 { - if err = AddRoles4User(ctx, userList[0].GetID(), []*authz.RoleInfo{ - autils.NewRole(authz.StoreRoleBoss, storeID), - }); err == nil { - num = 1 - } - } - } - if !globals.DisableWXAuth1 { - num, err = BindMobile2Store(ctx, mobile, storeID) - } - } - return num, err -} diff --git a/business/jxstore/cms/user2.go b/business/jxstore/cms/user2.go index 227807131..5baf7b9b4 100644 --- a/business/jxstore/cms/user2.go +++ b/business/jxstore/cms/user2.go @@ -114,6 +114,7 @@ func RegisterUserWithMobile(ctx *jxcontext.Context, user *model.User, mobileVeri user.Type |= model.UserTypeStoreBoss } if err = CreateUser(user, utils.LimitUTF8StringLen(ctx.GetRealRemoteIP()+","+inAuthInfo.GetAuthID(), 32)); err == nil { + TryAddStoreBossRole4User(ctx, user) if outAuthInfo, err = auth2.BindUser(mobileAuth, user); err == nil && inAuthInfo != nil { err = auth2.AddAuthBind(&outAuthInfo.UserBasic, inAuthInfo) } @@ -124,6 +125,40 @@ func RegisterUserWithMobile(ctx *jxcontext.Context, user *model.User, mobileVeri return outAuthInfo, err } +func TryAddStoreBossRole4User(ctx *jxcontext.Context, user *model.User) (err error) { + if user.Type&model.UserTypeStoreBoss != 0 { + userMobile := user.GetMobile() + if userMobile != "" { + if storeList, err := dao.GetStoreList(dao.GetDB(), nil, []string{userMobile}, ""); err == nil && len(storeList) > 0 { + roleList := make([]*authz.RoleInfo, len(storeList)) + for k, v := range storeList { + roleList[k] = autils.NewRole(authz.StoreRoleBoss, v.ID) + } + err = AddRoles4User(ctx, user.GetID(), roleList) + } + } + } + return err +} + +func TryAddStoreBossRole4StoreByMobile(ctx *jxcontext.Context, storeID int, mobileList []string) (err error) { + if storeID > 0 { + var userIDs []string + for _, v := range mobileList { + if v != "" { + if userList, _, err := dao.GetUsers(dao.GetDB(), model.UserTypeStoreBoss, "", nil, "", v, 0, -1); err == nil && len(userList) > 0 { + userIDs = append(userIDs, userList[0].GetID()) + } + } + } + if len(userIDs) > 0 { + role := autils.NewRole(authz.StoreRoleBoss, storeID) + err = AddUsers4Role(ctx, role, userIDs) + } + } + return err +} + func HandleOrder4Consignee(order *model.GoodsOrder) (err error) { var user *model.User authType := jxutils.GetAuthType4Vendor(order.VendorID) diff --git a/business/model/dao/store.go b/business/model/dao/store.go index b456c5721..179fdc5cd 100644 --- a/business/model/dao/store.go +++ b/business/model/dao/store.go @@ -445,16 +445,25 @@ func GetOpenedStoreCouriersByStoreID(db *DaoDB, storeID, vendorID int) (storeMap return storeMaps, nil } -func GetStoreList4Role(db *DaoDB, shortRoleName string) (storeList []*model.Store, err error) { +func GetStoreList(db *DaoDB, idList []int, mobileList []string, shortRoleName string) (storeList []*model.Store, err error) { sql := ` SELECT t1.* FROM store t1 - WHERE t1.deleted_at = ? AND (t1.market_man_role = ? OR t1.operator_role = ? OR t1.operator_role2 = ?)` + WHERE t1.deleted_at = ?` sqlParams := []interface{}{ utils.DefaultTimeValue, - shortRoleName, - shortRoleName, - shortRoleName, + } + if len(idList) > 0 { + sql += " AND t1.id IN (" + GenQuestionMarks(len(idList)) + ")" + sqlParams = append(sqlParams, idList) + } + if len(mobileList) > 0 { + sql += " AND (t1.tel1 IN (" + GenQuestionMarks(len(mobileList)) + ") OR t1.tel2 IN (" + GenQuestionMarks(len(mobileList)) + ")" + sqlParams = append(sqlParams, mobileList, mobileList) + } + if shortRoleName != "" { + sql += " AND (t1.market_man_role = ? OR t1.operator_role = ? OR t1.operator_role2 = ?)" + sqlParams = append(sqlParams, shortRoleName, shortRoleName, shortRoleName) } err = GetRows(db, &storeList, sql, sqlParams...) return storeList, err diff --git a/business/model/dao/store_test.go b/business/model/dao/store_test.go index 3c58bedba..71e84092b 100644 --- a/business/model/dao/store_test.go +++ b/business/model/dao/store_test.go @@ -32,7 +32,7 @@ func TestFormalizeStoreStatus(t *testing.T) { } func TestGetStoreList4Role(t *testing.T) { - storeList, err := GetStoreList4Role(GetDB(), "NiuBi") + storeList, err := GetStoreList(GetDB(), "NiuBi") t.Log(utils.Format4Output(storeList, false)) if err != nil { t.Fatal(err) From 522c9082ef130d3fa0e0395de9085f7d954405ed Mon Sep 17 00:00:00 2001 From: gazebo Date: Thu, 5 Sep 2019 18:02:53 +0800 Subject: [PATCH 05/10] =?UTF-8?q?-=20=E4=BF=AE=E5=A4=8Ddao.GetUserList?= =?UTF-8?q?=E7=9A=84bug=20-=20QueryActs=E6=B7=BB=E5=8A=A0=E5=8F=82?= =?UTF-8?q?=E6=95=B0syncStatus?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- business/jxstore/act/act.go | 8 ++++---- business/jxstore/cms/user2_test.go | 23 +++++++++++++++++++++++ business/jxutils/jxutils.go | 4 +++- business/model/dao/act.go | 14 +++++++++++--- business/model/dao/store.go | 2 +- controllers/act.go | 6 +++++- 6 files changed, 47 insertions(+), 10 deletions(-) create mode 100644 business/jxstore/cms/user2_test.go diff --git a/business/jxstore/act/act.go b/business/jxstore/act/act.go index 2f12b8483..349890b60 100644 --- a/business/jxstore/act/act.go +++ b/business/jxstore/act/act.go @@ -534,8 +534,8 @@ func (a *ActManager) IsVendorActExist(ctx *jxcontext.Context, vendorActID string return isExist } -func QueryActs(ctx *jxcontext.Context, actID int, offset, pageSize int, keyword string, vendorID int, statusList, actTypeList, createTypeList []int, storeID, skuID, cityCode int, beginAt, endAt, createdAtFrom, createdAtTo time.Time) (pagedInfo *dao.PagedActListInfo, err error) { - return dao.QueryActs(dao.GetDB(), actID, offset, pageSize, keyword, vendorID, statusList, actTypeList, createTypeList, storeID, skuID, cityCode, beginAt, endAt, createdAtFrom, createdAtTo) +func QueryActs(ctx *jxcontext.Context, actID int, offset, pageSize int, syncStatus int, keyword string, vendorID int, statusList, actTypeList, createTypeList []int, storeID, skuID, cityCode int, beginAt, endAt, createdAtFrom, createdAtTo time.Time) (pagedInfo *dao.PagedActListInfo, err error) { + return dao.QueryActs(dao.GetDB(), actID, offset, pageSize, syncStatus, keyword, vendorID, statusList, actTypeList, createTypeList, storeID, skuID, cityCode, beginAt, endAt, createdAtFrom, createdAtTo) } func GetActStoreSkuInfo(ctx *jxcontext.Context, actID int, vendorIDs []int, keyword string, offset, pageSize int) (retVal interface{}, err error) { @@ -733,7 +733,7 @@ func RefreshPageActs(ctx *jxcontext.Context, vendorIDs []int, createdFrom time.T if err = err2; err != nil { return nil, err } - // actInfo, err2 := dao.QueryActs(db, 0, 0, -1, "", vendorID, nil, []int{model.ActCreateTypeSpider}, + // actInfo, err2 := dao.QueryActs(db, 0, 0, -1, -1, "", vendorID, nil, []int{model.ActCreateTypeSpider}, // nil, 0, 0, 0, utils.DefaultTimeValue, utils.DefaultTimeValue, createdFrom, utils.DefaultTimeValue) vendorActIDs, err2 := dao.GetExistVendorActIDs(db, vendorID) if err = err2; err != nil { @@ -821,7 +821,7 @@ func DeleteSkusFromAct(ctx *jxcontext.Context, vendorID int, skuIDs []int, isAsy db := dao.GetDB() actMap := make(map[int]*model.Act) for _, skuID := range skuIDs { - pagedInfo, err2 := dao.QueryActs(db, 0, 0, -1, "", vendorID, []int{model.ActStatusCreated}, []int{model.ActSkuDirectDown, model.ActSkuSecKill}, nil, 0, skuID, 0, + pagedInfo, err2 := dao.QueryActs(db, 0, 0, -1, -1, "", vendorID, []int{model.ActStatusCreated}, []int{model.ActSkuDirectDown, model.ActSkuSecKill}, nil, 0, skuID, 0, utils.DefaultTimeValue, utils.DefaultTimeValue, time.Now().Add(-24*30*3*time.Hour), utils.DefaultTimeValue) if err = err2; err != nil { return "", err diff --git a/business/jxstore/cms/user2_test.go b/business/jxstore/cms/user2_test.go new file mode 100644 index 000000000..3ee432799 --- /dev/null +++ b/business/jxstore/cms/user2_test.go @@ -0,0 +1,23 @@ +package cms + +import ( + "testing" + + "git.rosy.net.cn/baseapi/utils" + + _ "git.rosy.net.cn/jx-callback/globals/api/apimanager" + + "git.rosy.net.cn/jx-callback/business/jxutils/jxcontext" + "git.rosy.net.cn/jx-callback/business/model" +) + +func TestTryAddStoreBossRole4User(t *testing.T) { + err := TryAddStoreBossRole4User(jxcontext.AdminCtx, &model.User{ + Type: model.UserTypeStoreBoss, + UserID: "24058800CD3711E991B2525400E86DC0", + Mobile: utils.String2Pointer("91112345678"), + }) + if err != nil { + t.Fatal(err) + } +} diff --git a/business/jxutils/jxutils.go b/business/jxutils/jxutils.go index 70d3e9141..eb96e823d 100644 --- a/business/jxutils/jxutils.go +++ b/business/jxutils/jxutils.go @@ -474,7 +474,9 @@ func HandleUserWXRemark(db *dao.DaoDB, mobile string, mobileIsUerID bool) (err e } } if err == nil { - err = api.WeixinAPI.CBUpdateRemark(openID, remark) + if globals.EnableStoreWrite { + err = api.WeixinAPI.CBUpdateRemark(openID, remark) + } } } return err diff --git a/business/model/dao/act.go b/business/model/dao/act.go index 1ca1fe5cd..5475f3a8f 100644 --- a/business/model/dao/act.go +++ b/business/model/dao/act.go @@ -173,7 +173,7 @@ func GetActStoreSkuVendorInfo(db *DaoDB, actID int, vendorIDs, storeIDs, skuIDs return actStoreSkuMap, err } -func QueryActs(db *DaoDB, actID int, offset, pageSize int, keyword string, vendorID int, statusList, actTypeList, createTypeList []int, +func QueryActs(db *DaoDB, actID int, offset, pageSize int, syncStatus int, keyword string, vendorID int, statusList, actTypeList, createTypeList []int, storeID, skuID, cityCode int, beginAt, endAt, createdAtFrom, createdAtTo time.Time) (pagedInfo *PagedActListInfo, err error) { if actID == 0 && utils.IsTimeZero(createdAtFrom) && utils.IsTimeZero(beginAt) { return nil, fmt.Errorf("actID,createdAtFrom和beginAt中,至少要指定一个条件") @@ -184,7 +184,7 @@ func QueryActs(db *DaoDB, actID int, offset, pageSize int, keyword string, vendo sql := ` SELECT SQL_CALC_FOUND_ROWS - t1.id + DISTINCT t1.id FROM act t1` sqlParams := []interface{}{} if isGetAll { @@ -195,8 +195,14 @@ func QueryActs(db *DaoDB, actID int, offset, pageSize int, keyword string, vendo FROM act t1 LEFT JOIN act_map t2 ON t2.act_id = t1.id AND t2.deleted_at = ?` sqlParams = []interface{}{utils.DefaultTimeValue} + if syncStatus >= 0 { + sql += " AND (t2.sync_status = ? OR t2.sync_status & ? <> 0)" + sqlParams = append(sqlParams, syncStatus, syncStatus) + } + } else if syncStatus >= 0 { + sql += " JOIN act_map t2 ON t2.act_id = t1.id AND t2.deleted_at = ? AND (t2.sync_status = ? OR t2.sync_status & ? <> 0)" + sqlParams = append(sqlParams, utils.DefaultTimeValue, syncStatus, syncStatus) } - sql += ` WHERE t1.deleted_at = ?` sqlParams = append(sqlParams, utils.DefaultTimeValue) @@ -289,6 +295,7 @@ func QueryActs(db *DaoDB, actID int, offset, pageSize int, keyword string, vendo panic(r) } }() + // globals.SugarLogger.Debug(sql) if err = GetRows(db, &idList, sql, sqlParams...); err != nil || len(idList) == 0 { Rollback(db) return pagedInfo, err @@ -311,6 +318,7 @@ func QueryActs(db *DaoDB, actID int, offset, pageSize int, keyword string, vendo } } var actList []*tActAndMap + // globals.SugarLogger.Debug(sql) if err = GetRows(db, &actList, sql, sqlParams...); err != nil { return nil, err } diff --git a/business/model/dao/store.go b/business/model/dao/store.go index 179fdc5cd..d67c32274 100644 --- a/business/model/dao/store.go +++ b/business/model/dao/store.go @@ -458,7 +458,7 @@ func GetStoreList(db *DaoDB, idList []int, mobileList []string, shortRoleName st sqlParams = append(sqlParams, idList) } if len(mobileList) > 0 { - sql += " AND (t1.tel1 IN (" + GenQuestionMarks(len(mobileList)) + ") OR t1.tel2 IN (" + GenQuestionMarks(len(mobileList)) + ")" + sql += " AND (t1.tel1 IN (" + GenQuestionMarks(len(mobileList)) + ") OR t1.tel2 IN (" + GenQuestionMarks(len(mobileList)) + "))" sqlParams = append(sqlParams, mobileList, mobileList) } if shortRoleName != "" { diff --git a/controllers/act.go b/controllers/act.go index 4204d8552..edf33804d 100644 --- a/controllers/act.go +++ b/controllers/act.go @@ -128,6 +128,7 @@ func (c *ActController) CreateAct() { // @Param createTypeList query string false "创建方式列表" // @Param storeID query int false "包含门店" // @Param skuID query int false "包含sku" +// @Param syncStatus query int false "活动同步标识,缺省不限制" // @Param offset query int false "活动列表起始序号(以0开始,缺省为0)" // @Param pageSize query int false "活动列表页大小(缺省为50,-1表示全部)" // @Success 200 {object} controllers.CallResult @@ -142,7 +143,10 @@ func (c *ActController) QueryActs() { if params.MapData["vendorID"] == nil { params.VendorID = -1 } - retVal, err = act.QueryActs(params.Ctx, params.ActID, params.Offset, params.PageSize, params.Keyword, params.VendorID, + if params.MapData["syncStatus"] == nil { + params.SyncStatus = -1 + } + retVal, err = act.QueryActs(params.Ctx, params.ActID, params.Offset, params.PageSize, params.SyncStatus, params.Keyword, params.VendorID, statusList, typeList, createTypeList, params.StoreID, params.SkuID, params.CityCode, timeList[2], timeList[3], timeList[0], timeList[1]) } } From f3d496ec6094b7f8d872183dc7de30377ddcee04 Mon Sep 17 00:00:00 2001 From: gazebo Date: Thu, 5 Sep 2019 18:44:08 +0800 Subject: [PATCH 06/10] =?UTF-8?q?-=20=E6=9F=A5=E8=AF=A2=E8=AE=A2=E5=8D=95?= =?UTF-8?q?=E8=BF=90=E8=B4=B9=E4=B8=8E=E5=8F=91=E4=B8=89=E6=96=B9=E8=BF=90?= =?UTF-8?q?=E5=8D=95=E6=97=B6=EF=BC=8C=E8=87=AA=E6=8F=90=E5=8D=95=E6=8A=A5?= =?UTF-8?q?=E9=94=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- business/jxcallback/scheduler/defsch/defsch_ext.go | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/business/jxcallback/scheduler/defsch/defsch_ext.go b/business/jxcallback/scheduler/defsch/defsch_ext.go index d6f50c460..8a930124e 100644 --- a/business/jxcallback/scheduler/defsch/defsch_ext.go +++ b/business/jxcallback/scheduler/defsch/defsch_ext.go @@ -152,6 +152,9 @@ func (s *DefScheduler) CreateWaybillOnProvidersEx(ctx *jxcontext.Context, vendor savedOrderInfo := s.loadSavedOrderByID(vendorOrderID, vendorID, true) if savedOrderInfo != nil { order := savedOrderInfo.order + if order.DeliveryType == model.OrderDeliveryTypeSelfTake { + return nil, fmt.Errorf("订单:%s是自提单", vendorOrderID) + } if !forceCreate { err = s.isPossibleSwitch2SelfDelivery(order) } @@ -207,6 +210,9 @@ func (s *DefScheduler) QueryOrderWaybillFeeInfoEx(ctx *jxcontext.Context, vendor if err != nil { return nil, err } + if order.DeliveryType == model.OrderDeliveryTypeSelfTake { + return nil, fmt.Errorf("订单:%s是自提单", vendorOrderID) + } storeCourierList, err := dao.GetStoreCourierList(db, jxutils.GetSaleStoreIDFromOrder(order), model.StoreStatusAll) if err != nil { return nil, err From a393869612637b1daa2261e89c2b322778ff7843 Mon Sep 17 00:00:00 2001 From: gazebo Date: Fri, 6 Sep 2019 09:07:27 +0800 Subject: [PATCH 07/10] + Store.SMSNotify --- business/jxstore/cms/store.go | 5 ++++- business/model/store.go | 16 ++++++++-------- 2 files changed, 12 insertions(+), 9 deletions(-) diff --git a/business/jxstore/cms/store.go b/business/jxstore/cms/store.go index 8593152e2..c29fe6ade 100644 --- a/business/jxstore/cms/store.go +++ b/business/jxstore/cms/store.go @@ -134,6 +134,8 @@ func GetStores(ctx *jxcontext.Context, keyword string, params map[string]interfa t1.delivery_range, t1.status, t1.change_price_type, + t1.sms_notify, + t1.id_card_front, t1.id_card_back, t1.id_card_hand, @@ -330,7 +332,8 @@ func GetStores(ctx *jxcontext.Context, keyword string, params map[string]interfa } sql += sqlWhere + ` - GROUP BY 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31, 32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64 + GROUP BY 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40, + 41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65 ORDER BY t1.id DESC /*LIMIT ? OFFSET ?*/` pageSize = jxutils.FormalizePageSize(pageSize) diff --git a/business/model/store.go b/business/model/store.go index dd8e927d2..cb7fb5bf6 100644 --- a/business/model/store.go +++ b/business/model/store.go @@ -253,14 +253,14 @@ type Store struct { DeliveryRangeType int8 `json:"deliveryRangeType"` // 参见相关常量定义 DeliveryRange string `orm:"type(text)" json:"deliveryRange"` // 如果DeliveryRangeType为DeliveryRangeTypePolygon,则为逗号分隔坐标,分号分隔的坐标点(坐标与Lng和Lat一样,都是整数),比如 121361504,31189308;121420555,31150238。否则为半径,单位为米 Status int `json:"status"` - ChangePriceType int8 `json:"changePriceType"` // 修改价格类型,即是否需要审核 - - PrinterDisabled int8 `orm:"default(0)" json:"printerDisabled"` // 是否禁用网络打印机 - PrinterFontSize int8 `orm:"default(0)" json:"printerFontSize"` // 打印字体-1:小,0:正常,1:大 - PrinterVendorID int `orm:"column(printer_vendor_id);" json:"printerVendorID"` - PrinterSN string `orm:"size(32);column(printer_sn);index" json:"printerSN"` - PrinterKey string `orm:"size(64)" json:"printerKey"` - PrinterBindInfo string `orm:"size(1024)" json:"-"` + ChangePriceType int8 `json:"changePriceType"` // 修改价格类型,即是否需要审核 + SMSNotify int8 `orm:"column(sms_notify);" json:"smsNotify"` // 是否通过短信接收订单消息 + PrinterDisabled int8 `orm:"default(0)" json:"printerDisabled"` // 是否禁用网络打印机 + PrinterFontSize int8 `orm:"default(0)" json:"printerFontSize"` // 打印字体-1:小,0:正常,1:大 + PrinterVendorID int `orm:"column(printer_vendor_id);" json:"printerVendorID"` + PrinterSN string `orm:"size(32);column(printer_sn);index" json:"printerSN"` + PrinterKey string `orm:"size(64)" json:"printerKey"` + PrinterBindInfo string `orm:"size(1024)" json:"-"` IDCardFront string `orm:"size(255);column(id_card_front)" json:"idCardFront"` IDCardBack string `orm:"size(255);column(id_card_back)" json:"idCardBack"` From 0fbe4d7024d6b1f2618bc67d3c999265e784b30f Mon Sep 17 00:00:00 2001 From: gazebo Date: Fri, 6 Sep 2019 10:16:09 +0800 Subject: [PATCH 08/10] =?UTF-8?q?-=20=E6=96=B0=E8=AE=A2=E5=8D=95=E6=97=B6?= =?UTF-8?q?=EF=BC=8C=E5=8F=91=E9=80=81=E7=9F=AD=E4=BF=A1=E6=B6=88=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../jxcallback/scheduler/defsch/defsch.go | 58 +++++++++--------- business/jxutils/smsmsg/smsmsg.go | 61 +++++++++++++++++++ business/jxutils/smsmsg/smsmsg_test.go | 21 +++++++ globals/api/api.go | 7 ++- 4 files changed, 116 insertions(+), 31 deletions(-) create mode 100644 business/jxutils/smsmsg/smsmsg.go create mode 100644 business/jxutils/smsmsg/smsmsg_test.go diff --git a/business/jxcallback/scheduler/defsch/defsch.go b/business/jxcallback/scheduler/defsch/defsch.go index 8f0965732..29e0b84b6 100644 --- a/business/jxcallback/scheduler/defsch/defsch.go +++ b/business/jxcallback/scheduler/defsch/defsch.go @@ -8,6 +8,7 @@ import ( "git.rosy.net.cn/jx-callback/business/jxutils/jxcontext" "git.rosy.net.cn/jx-callback/business/jxutils/netprinter" + "git.rosy.net.cn/jx-callback/business/jxutils/smsmsg" "git.rosy.net.cn/jx-callback/business/msghub" "git.rosy.net.cn/baseapi/utils" @@ -184,10 +185,7 @@ func init() { } } if isAcceptIt { - utils.CallFuncAsync(func() { - netprinter.PrintOrderByOrder(jxcontext.AdminCtx, order) - weixinmsg.NotifyNewOrder(order) - }) + sch.notifyNewOrder(order) msghub.OnNewOrder(order) } else { partner.CurOrderManager.OnOrderMsg(order, "黑名单拒单", "") @@ -307,10 +305,7 @@ func (s *DefScheduler) OnOrderNew(order *model.GoodsOrder, isPending bool) (err if order.Status >= model.OrderStatusNew { s.resetTimer(savedOrderInfo, nil, isPending) if !isPending && order.Status >= model.OrderStatusAccepted { // 有订单消息错序,先收到接单消息,再收到新订单消息,导致接单TIMER不动作,这里补一下 - utils.CallFuncAsync(func() { - netprinter.PrintOrderByOrder(jxcontext.AdminCtx, order) - weixinmsg.NotifyNewOrder(order) - }) + s.notifyNewOrder(order) msghub.OnNewOrder(order) } } @@ -329,13 +324,6 @@ func (s *DefScheduler) OnOrderStatusChanged(order *model.GoodsOrder, status *mod savedOrderInfo := s.loadSavedOrderFromMap(status, false) savedOrderInfo.SetOrder(order) - // if status.Status == model.OrderStatusNew { - // if !isPending { - // utils.CallFuncAsync(func() { - // weixinmsg.NotifyNewOrder(savedOrderInfo.order) - // }) - // } - // } if (model.IsOrderUnlockStatus(status.Status)) || (order.LockStatus == model.OrderStatusUnknown && (status.Status > model.OrderStatusUnknown || status.Status == model.OrderStatusRefuseFailedGetGoods)) { // 只处理状态转换,一般消息不处理 if status.Status == model.OrderStatusRefuseFailedGetGoods && order.Status != model.OrderStatusFinishedPickup && !model.IsOrderFinalStatus(order.Status) { @@ -374,9 +362,7 @@ func (s *DefScheduler) OnOrderStatusChanged(order *model.GoodsOrder, status *mod status.Status == model.OrderStatusAgreeFailedGetGoods || status.Status == model.OrderStatusDeliverFailed { if status.Status == model.OrderStatusApplyCancel { - utils.CallFuncAsync(func() { - weixinmsg.NotifyUserApplyCancel(savedOrderInfo.order, status.Remark) - }) + s.notifyUserApplyCancel(savedOrderInfo.order, status.Remark) } msghub.OnKeyOrderStatusChanged(savedOrderInfo.order) } @@ -483,9 +469,7 @@ func (s *DefScheduler) OnWaybillStatusChanged(bill *model.Waybill, isPending boo if err := s.SelfDeliverDelivering(savedOrderInfo.order, bill.CourierMobile); err != nil { partner.CurOrderManager.OnOrderMsg(order, "自送出设置失败", err.Error()) } - utils.CallFuncAsync(func() { - weixinmsg.NotifyWaybillStatus(bill, order, isBillAlreadyCandidate) - }) + s.notify3rdPartyWaybill(order, bill, isBillAlreadyCandidate) } else { s.swtich2SelfDeliverWithRetry(savedOrderInfo, bill, 2, 10*time.Second) } @@ -496,9 +480,7 @@ func (s *DefScheduler) OnWaybillStatusChanged(bill *model.Waybill, isPending boo globals.SugarLogger.Infof("OnWaybillStatusChanged Accepted orderID:%s got multiple bill:%v", order.VendorOrderID, bill) } if isBillAlreadyCandidate && !s.isWaybillCourierSame(savedOrderInfo, bill) && !model.IsWaybillPlatformOwn(bill) { - utils.CallFuncAsync(func() { - weixinmsg.NotifyWaybillStatus(bill, order, isBillAlreadyCandidate) - }) + s.notify3rdPartyWaybill(order, bill, isBillAlreadyCandidate) } flag2Clear := model.WaybillVendorID2Mask(bill.WaybillVendorID) order.Flag &= ^model.OrderFlagMaskFailedGetGoods @@ -579,9 +561,7 @@ func (s *DefScheduler) OnWaybillStatusChanged(bill *model.Waybill, isPending boo } } if !isPending { - utils.CallFuncAsync(func() { - weixinmsg.NotifyWaybillStatus(bill, order, false) - }) + s.notify3rdPartyWaybill(order, bill, false) } // case model.WaybillStatusNeverSend: // 平台不配送,直接创建三方运单 // s.resetTimer(savedOrderInfo, bill, isPending) @@ -710,9 +690,7 @@ func (s *DefScheduler) swtich2SelfDeliverWithRetry(savedOrderInfo *WatchOrderInf partner.CurOrderManager.OnOrderMsg(order, "转商家自配送失败", errStr) } } else { - utils.CallFuncAsync(func() { - weixinmsg.NotifyWaybillStatus(bill, order, false) - }) + s.notify3rdPartyWaybill(order, bill, false) s.removeWaybillFromMap(savedOrderInfo, order.VendorID) partner.CurOrderManager.OnOrderMsg(order, "转自送成功", "") } @@ -1112,3 +1090,23 @@ func OnDefSchConfChanged(key, value string) { } } } + +func (s *DefScheduler) notifyNewOrder(order *model.GoodsOrder) { + utils.CallFuncAsync(func() { + netprinter.PrintOrderByOrder(jxcontext.AdminCtx, order) + weixinmsg.NotifyNewOrder(order) + smsmsg.NotifyNewOrder(order) + }) +} + +func (s *DefScheduler) notifyUserApplyCancel(order *model.GoodsOrder, cancelReason string) { + utils.CallFuncAsync(func() { + weixinmsg.NotifyUserApplyCancel(order, cancelReason) + }) +} + +func (s *DefScheduler) notify3rdPartyWaybill(order *model.GoodsOrder, bill *model.Waybill, isBillAlreadyCandidate bool) { + utils.CallFuncAsync(func() { + weixinmsg.NotifyWaybillStatus(bill, order, isBillAlreadyCandidate) + }) +} diff --git a/business/jxutils/smsmsg/smsmsg.go b/business/jxutils/smsmsg/smsmsg.go new file mode 100644 index 000000000..4f134ef66 --- /dev/null +++ b/business/jxutils/smsmsg/smsmsg.go @@ -0,0 +1,61 @@ +package smsmsg + +import ( + "fmt" + + aliyunsmsclient "github.com/KenmyZhang/aliyun-communicate" + + "git.rosy.net.cn/baseapi/utils" + "git.rosy.net.cn/baseapi/utils/errlist" + "git.rosy.net.cn/jx-callback/business/jxutils" + "git.rosy.net.cn/jx-callback/business/model" + "git.rosy.net.cn/jx-callback/business/model/dao" + "git.rosy.net.cn/jx-callback/globals" + "git.rosy.net.cn/jx-callback/globals/api" +) + +var ( + warningMap = map[string]int{ + "isv.AMOUNT_NOT_ENOUGH": 1, + "isv.ACCOUNT_ABNORMAL": 1, + "isv.OUT_OF_SERVICE": 1, + "isv.DAY_LIMIT_CONTROL": 1, + } +) + +func SendSMSMsg(mobileList []string, signName, templateCode string, templateParam map[string]interface{}) (err error) { + errList := errlist.New() + for _, mobileNum := range mobileList { + if mobileNum != "" { + globals.SugarLogger.Debugf("SendSMSMsg mobileNum:%s, templateCode:%s", mobileNum, templateCode) + if response, err := api.SMSClient.Execute(globals.AliKey, globals.AliSecret, mobileNum, signName, templateCode, string(utils.MustMarshal(templateParam))); err != nil { + globals.SugarLogger.Warnf("SendSMSMsg mobileNum:%s failed with error:%v", mobileNum, err) + errList.AddErr(err) + } else if response.Code != aliyunsmsclient.ResponseCodeOk { + errMsg := fmt.Sprintf("SendSMSMsg mobileNum:%s failed with response:%s", mobileNum, utils.Format4Output(response, false)) + errList.AddErr(fmt.Errorf(errMsg)) + if warningMap[response.Code] == 1 { + globals.SugarLogger.Warnf(errMsg) + } else { + globals.SugarLogger.Infof(errMsg) + } + } + } + } + return errList.GetErrListAsOne() +} + +func NotifyNewOrder(order *model.GoodsOrder) (err error) { + store := &model.Store{} + store.ID = jxutils.GetSaleStoreIDFromOrder(order) + if err = dao.GetEntity(dao.GetDB(), store); err == nil { + if store.SMSNotify != 0 { + err = SendSMSMsg([]string{store.Tel1, store.Tel2}, "京西菜市", "SMS_173477895", map[string]interface{}{ + "daySeq": order.OrderSeq, + "consigneeName": order.ConsigneeName, + "payMoney": order.ActualPayPrice, + }) + } + } + return err +} diff --git a/business/jxutils/smsmsg/smsmsg_test.go b/business/jxutils/smsmsg/smsmsg_test.go new file mode 100644 index 000000000..2dcf4c371 --- /dev/null +++ b/business/jxutils/smsmsg/smsmsg_test.go @@ -0,0 +1,21 @@ +package smsmsg + +import ( + "testing" + + "git.rosy.net.cn/jx-callback/globals/testinit" +) + +func init() { + testinit.Init() + // api2.Init() +} + +func TestSendSMSMsg(t *testing.T) { + err := SendSMSMsg([]string{"18180948107"}, "京西菜市", "SMS_84655036", map[string]interface{}{ + "code": 123456, + }) + if err != nil { + t.Fatal(err) + } +} diff --git a/globals/api/api.go b/globals/api/api.go index c94f55425..ff4a9529d 100644 --- a/globals/api/api.go +++ b/globals/api/api.go @@ -3,6 +3,8 @@ package api import ( "time" + aliyunsmsclient "github.com/KenmyZhang/aliyun-communicate" + "git.rosy.net.cn/baseapi/platformapi" "git.rosy.net.cn/baseapi/platformapi/autonavi" "git.rosy.net.cn/baseapi/platformapi/baidunavi" @@ -56,7 +58,8 @@ var ( YilianyunAPI2 *yilianyunapi.API ZhongwuAPI *zhongwuapi.API - Cacher cache.ICacher + Cacher cache.ICacher + SMSClient *aliyunsmsclient.SmsClient ) func init() { @@ -153,4 +156,6 @@ func Init() { YilianyunAPI = yilianyunapi.New(beego.AppConfig.DefaultString("yilianyunClientID", ""), beego.AppConfig.DefaultString("yilianyunClientSecret", "")) YilianyunAPI2 = yilianyunapi.New(beego.AppConfig.DefaultString("yilianyunClientID2", ""), beego.AppConfig.DefaultString("yilianyunClientSecret2", "")) ZhongwuAPI = zhongwuapi.New(beego.AppConfig.DefaultInt("zhongwuAppID", 0), beego.AppConfig.DefaultString("zhongwuAppSecret", "")) + + SMSClient = aliyunsmsclient.New("http://dysmsapi.aliyuncs.com/") } From e52f0e260ab82161cb9f2b1e19678c0c37af7b52 Mon Sep 17 00:00:00 2001 From: gazebo Date: Fri, 6 Sep 2019 10:18:09 +0800 Subject: [PATCH 09/10] =?UTF-8?q?-=20=E5=8F=91=E9=80=81=E7=9F=AD=E4=BF=A1?= =?UTF-8?q?=E6=97=B6=E5=88=A4=E6=96=ADEnableStoreWrite?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- business/jxutils/smsmsg/smsmsg.go | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/business/jxutils/smsmsg/smsmsg.go b/business/jxutils/smsmsg/smsmsg.go index 4f134ef66..3d799bc25 100644 --- a/business/jxutils/smsmsg/smsmsg.go +++ b/business/jxutils/smsmsg/smsmsg.go @@ -28,16 +28,18 @@ func SendSMSMsg(mobileList []string, signName, templateCode string, templatePara for _, mobileNum := range mobileList { if mobileNum != "" { globals.SugarLogger.Debugf("SendSMSMsg mobileNum:%s, templateCode:%s", mobileNum, templateCode) - if response, err := api.SMSClient.Execute(globals.AliKey, globals.AliSecret, mobileNum, signName, templateCode, string(utils.MustMarshal(templateParam))); err != nil { - globals.SugarLogger.Warnf("SendSMSMsg mobileNum:%s failed with error:%v", mobileNum, err) - errList.AddErr(err) - } else if response.Code != aliyunsmsclient.ResponseCodeOk { - errMsg := fmt.Sprintf("SendSMSMsg mobileNum:%s failed with response:%s", mobileNum, utils.Format4Output(response, false)) - errList.AddErr(fmt.Errorf(errMsg)) - if warningMap[response.Code] == 1 { - globals.SugarLogger.Warnf(errMsg) - } else { - globals.SugarLogger.Infof(errMsg) + if globals.EnableStoreWrite { + if response, err := api.SMSClient.Execute(globals.AliKey, globals.AliSecret, mobileNum, signName, templateCode, string(utils.MustMarshal(templateParam))); err != nil { + globals.SugarLogger.Warnf("SendSMSMsg mobileNum:%s failed with error:%v", mobileNum, err) + errList.AddErr(err) + } else if response.Code != aliyunsmsclient.ResponseCodeOk { + errMsg := fmt.Sprintf("SendSMSMsg mobileNum:%s failed with response:%s", mobileNum, utils.Format4Output(response, false)) + errList.AddErr(fmt.Errorf(errMsg)) + if warningMap[response.Code] == 1 { + globals.SugarLogger.Warnf(errMsg) + } else { + globals.SugarLogger.Infof(errMsg) + } } } } From 5bc792f3373e133e69f643bb9af7d6b772c7f85c Mon Sep 17 00:00:00 2001 From: gazebo Date: Fri, 6 Sep 2019 10:45:44 +0800 Subject: [PATCH 10/10] =?UTF-8?q?-=20=E4=BF=AE=E6=94=B9NotifyNewOrder?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- business/jxutils/smsmsg/smsmsg.go | 2 +- business/jxutils/smsmsg/smsmsg_test.go | 8 ++++++-- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/business/jxutils/smsmsg/smsmsg.go b/business/jxutils/smsmsg/smsmsg.go index 3d799bc25..d08109ad7 100644 --- a/business/jxutils/smsmsg/smsmsg.go +++ b/business/jxutils/smsmsg/smsmsg.go @@ -55,7 +55,7 @@ func NotifyNewOrder(order *model.GoodsOrder) (err error) { err = SendSMSMsg([]string{store.Tel1, store.Tel2}, "京西菜市", "SMS_173477895", map[string]interface{}{ "daySeq": order.OrderSeq, "consigneeName": order.ConsigneeName, - "payMoney": order.ActualPayPrice, + "payMoney": jxutils.IntPrice2StandardString(order.ActualPayPrice), }) } } diff --git a/business/jxutils/smsmsg/smsmsg_test.go b/business/jxutils/smsmsg/smsmsg_test.go index 2dcf4c371..0c6d7a34e 100644 --- a/business/jxutils/smsmsg/smsmsg_test.go +++ b/business/jxutils/smsmsg/smsmsg_test.go @@ -3,6 +3,8 @@ package smsmsg import ( "testing" + "git.rosy.net.cn/jx-callback/business/jxutils" + "git.rosy.net.cn/jx-callback/globals/testinit" ) @@ -12,8 +14,10 @@ func init() { } func TestSendSMSMsg(t *testing.T) { - err := SendSMSMsg([]string{"18180948107"}, "京西菜市", "SMS_84655036", map[string]interface{}{ - "code": 123456, + err := SendSMSMsg([]string{"18180948107"}, "京西菜市", "SMS_173477895", map[string]interface{}{ + "daySeq": 9, + "consigneeName": "购买者", + "payMoney": jxutils.IntPrice2StandardString(1230), }) if err != nil { t.Fatal(err)