饿百平台运单取消后给运营发报警消息

This commit is contained in:
gazebo
2020-01-17 14:14:36 +08:00
parent da904d307e
commit a27f261ca4
9 changed files with 296 additions and 368 deletions

View File

@@ -57,8 +57,10 @@ const (
addWaybillTipGap = 15 // 加一元小费间隔的分钟数 addWaybillTipGap = 15 // 加一元小费间隔的分钟数
maxWaybillTipMoney = 400 // 最大小费 maxWaybillTipMoney = 400 // 最大小费
baseWaybillFee = 600 // 基本运费 baseWaybillFee = 600 // 基本运费
ebaiCancelWaybillMaxFee = 1000 // 饿百取消运单最高运费 ebaiCancelWaybillMaxFee = 1000 // 饿百取消运单最高运费,门店自送最高运费
maxJxStoreDeliveryFee = 2000 maxJxStoreDeliveryFee = 2000
ebaiCancelWaybillWarningMinute = 8
) )
const ( const (
@@ -323,7 +325,8 @@ func init() {
Timeout: 1 * time.Second, Timeout: 1 * time.Second,
}, },
TimeoutAction: func(savedOrderInfo *WatchOrderInfo, bill *model.Waybill) (err error) { TimeoutAction: func(savedOrderInfo *WatchOrderInfo, bill *model.Waybill) (err error) {
return sch.createWaybillOn3rdProviders(savedOrderInfo, ebaiCancelWaybillMaxFee, nil) return sch.onEbaiWaybillCanceled(savedOrderInfo, nil)
// return sch.createWaybillOn3rdProviders(savedOrderInfo, 0, nil)
}, },
ShouldSetTimer: func(savedOrderInfo *WatchOrderInfo, bill *model.Waybill) bool { ShouldSetTimer: func(savedOrderInfo *WatchOrderInfo, bill *model.Waybill) bool {
order := savedOrderInfo.order order := savedOrderInfo.order
@@ -665,6 +668,24 @@ func (s *DefScheduler) removeWaybillFromMap(savedOrderInfo *WatchOrderInfo, wayb
} }
} }
func (s *DefScheduler) onEbaiWaybillCanceled(savedOrderInfo *WatchOrderInfo, excludeBill *model.Waybill) (err error) {
order := savedOrderInfo.order
timeout := time.Duration(ebaiCancelWaybillWarningMinute) * time.Minute
utils.AfterFuncWithRecover(timeout, func() {
jxutils.CallMsgHandlerAsync(func() {
ts := s.loadSavedOrderFromMap(model.Order2Status(order), true)
order := ts.order
globals.SugarLogger.Debugf("fire timer ebai waybill cancled, orderID:%s, status:%d", order.VendorOrderID, order.Status)
if order.Status < model.OrderStatusDelivering && order.LockStatus == model.OrderStatusLocked {
msgContent := fmt.Sprintf("门店:%d,订单:%s的平台运单被取消了可能导致订单被取消请重点关注必要的话可以先手动转自送", jxutils.GetSaleStoreIDFromOrder(order), order.VendorOrderID)
s.notifyOrderStakeHolder(order, "", msgContent)
}
}, jxutils.ComposeUniversalOrderID(order.VendorOrderID, order.VendorID))
})
err = s.createWaybillOn3rdProviders(savedOrderInfo, 0, excludeBill)
return err
}
func (s *DefScheduler) createWaybillOn3rdProviders(savedOrderInfo *WatchOrderInfo, maxDeliveryFee int64, excludeBill *model.Waybill) (err error) { func (s *DefScheduler) createWaybillOn3rdProviders(savedOrderInfo *WatchOrderInfo, maxDeliveryFee int64, excludeBill *model.Waybill) (err error) {
order := savedOrderInfo.order order := savedOrderInfo.order
if order.VendorID == model.VendorIDELM { if order.VendorID == model.VendorIDELM {
@@ -682,7 +703,9 @@ func (s *DefScheduler) createWaybillOn3rdProviders(savedOrderInfo *WatchOrderInf
savedOrderInfo.retryCount++ savedOrderInfo.retryCount++
} }
} else { } else {
err = fmt.Errorf("订单:%s已经自动创建过了%d次运单请人工处理", order.VendorOrderID, savedOrderInfo.retryCount) errMsg := fmt.Sprintf("订单:%s已经自动创建过了%d次运单仍然无法配送,请关注!", order.VendorOrderID, savedOrderInfo.retryCount)
err = fmt.Errorf(errMsg)
s.notifyOrderStakeHolder(order, "", errMsg)
globals.SugarLogger.Infof("createWaybillOn3rdProviders [运营2]同一订单orderID:%s尝试了%d次创建运单失败, 停止调度,如果还需要发单,请人工处理", order.VendorOrderID, savedOrderInfo.retryCount) globals.SugarLogger.Infof("createWaybillOn3rdProviders [运营2]同一订单orderID:%s尝试了%d次创建运单失败, 停止调度,如果还需要发单,请人工处理", order.VendorOrderID, savedOrderInfo.retryCount)
} }
} else { } else {
@@ -1160,12 +1183,12 @@ func getMaxDeliveryFee(order *model.GoodsOrder) (maxDeliveryFee int64) {
orderBaseFreightMoney = baseWaybillFee orderBaseFreightMoney = baseWaybillFee
} }
maxDeliveryFee = orderBaseFreightMoney + order.DistanceFreightMoney + getWaybillTip(order) maxDeliveryFee = orderBaseFreightMoney + order.DistanceFreightMoney + getWaybillTip(order)
}
if maxDeliveryFee < ebaiCancelWaybillMaxFee && if maxDeliveryFee < ebaiCancelWaybillMaxFee &&
order.VendorID == model.VendorIDEBAI && (order.VendorID == model.VendorIDEBAI ||
order.DeliveryType == model.OrderDeliveryTypeStoreSelf { order.DeliveryType == model.OrderDeliveryTypeStoreSelf) {
maxDeliveryFee = ebaiCancelWaybillMaxFee maxDeliveryFee = ebaiCancelWaybillMaxFee
} }
}
return maxDeliveryFee return maxDeliveryFee
} }
@@ -1396,3 +1419,28 @@ func OrderProfitWarning(order *model.GoodsOrder) {
} }
} }
} }
func (s *DefScheduler) notifyOrderStakeHolder(order *model.GoodsOrder, msgTitle, msgContent string) (err error) {
userMobiles := []string{
"18180948107",
}
db := dao.GetDB()
storeDetail, err := dao.GetStoreDetail(db, jxutils.GetSaleStoreIDFromOrder(order), order.VendorID)
if err == nil && storeDetail.OperatorPhone != "" {
userMobiles = append(userMobiles, storeDetail.OperatorPhone)
}
if len(userMobiles) > 0 {
if msgTitle == "" {
msgTitle = fmt.Sprintf("%s平台订单%s异常", model.VendorChineseNames[order.VendorID], order.VendorOrderID)
}
users, _, err := dao.GetUsers(db, 0, "", nil, nil, userMobiles, 0, 0)
if err == nil && len(users) > 0 {
var userIDs []string
for _, v := range users {
userIDs = append(userIDs, v.UserID)
}
ddmsg.SendUsersMessage(dingdingapi.MsgTyeText, userIDs, msgTitle, msgContent)
}
}
return err
}

View File

@@ -71,7 +71,7 @@ func TransferLegacyWeixins(mobile string) (err error) {
if user.Name == "" { if user.Name == "" {
user.Name = user.GetMobile() user.Name = user.GetMobile()
} }
userList, _, err2 := dao.GetUsers(db, 0, "", nil, "", v.Tel, 0, -1) userList, _, err2 := dao.GetUsers(db, 0, "", nil, nil, []string{v.Tel}, 0, -1)
if err = err2; err != nil { if err = err2; err != nil {
return err return err
} }

View File

@@ -358,7 +358,7 @@ func DeleteConfig(ctx *jxcontext.Context, key, configType string) (err error) {
errList := errlist.New() errList := errlist.New()
userIDs, err2 := api2.RoleMan.GetRoleUserList(autils.NewRole(key, 0)) userIDs, err2 := api2.RoleMan.GetRoleUserList(autils.NewRole(key, 0))
if err = err2; err == nil && len(userIDs) > 0 { if err = err2; err == nil && len(userIDs) > 0 {
userList, totalCount, err2 := dao.GetUsers(dao.GetDB(), 0, "", userIDs, "", "", 0, -1) userList, totalCount, err2 := dao.GetUsers(dao.GetDB(), 0, "", userIDs, nil, nil, 0, -1)
if err = err2; err == nil && totalCount > 0 { if err = err2; err == nil && totalCount > 0 {
// todo // todo
// err = fmt.Errorf("还有人员在使用角色:%s人员信息:%s", key, utils.MustMarshal(utils.Struct2Map(userList, "compact"))) // err = fmt.Errorf("还有人员在使用角色:%s人员信息:%s", key, utils.MustMarshal(utils.Struct2Map(userList, "compact")))

View File

@@ -1866,7 +1866,7 @@ func getAllUsers4Store(ctx *jxcontext.Context, db *dao.DaoDB, store *model.Store
} }
if len(userIDs) > 0 { if len(userIDs) > 0 {
userList, _, _ = dao.GetUsers(db, 0, "", userIDs, "", "", 0, -1) userList, _, _ = dao.GetUsers(db, 0, "", userIDs, nil, nil, 0, -1)
for _, v := range userList { for _, v := range userList {
userMap[v.GetID()] = 1 userMap[v.GetID()] = 1
} }

View File

@@ -236,7 +236,7 @@ func TryAddStoreBossRole4StoreByMobile(ctx *jxcontext.Context, storeID int, mobi
var userIDs []string var userIDs []string
for _, v := range mobileList { for _, v := range mobileList {
if v != "" { if v != "" {
if userList, _, err := dao.GetUsers(dao.GetDB(), model.UserTypeStoreBoss, "", nil, "", v, 0, -1); err == nil && len(userList) > 0 { if userList, _, err := dao.GetUsers(dao.GetDB(), model.UserTypeStoreBoss, "", nil, nil, []string{v}, 0, -1); err == nil && len(userList) > 0 {
userIDs = append(userIDs, userList[0].GetID()) userIDs = append(userIDs, userList[0].GetID())
} }
} }
@@ -265,7 +265,7 @@ func HandleOrder4Consignee(order *model.GoodsOrder) (err error) {
oeratorName := order.VendorOrderID oeratorName := order.VendorOrderID
db := dao.GetDB() db := dao.GetDB()
if mobileNumber != "" { if mobileNumber != "" {
userList, _, err2 := dao.GetUsers(db, 0, "", nil, "", mobileNumber, 0, 0) userList, _, err2 := dao.GetUsers(db, 0, "", nil, nil, []string{mobileNumber}, 0, 0)
if err = err2; err != nil { if err = err2; err != nil {
return err return err
} }
@@ -416,7 +416,7 @@ func OnDingDingMsg(msg map[string]interface{}) (callbackResponse *dingdingapi.Ca
} }
func GetUsers(ctx *jxcontext.Context, userType int, keyword string, userIDs []string, userID2, mobile string, offset, pageSize int) (pagedInfo *model.PagedInfo, err error) { func GetUsers(ctx *jxcontext.Context, userType int, keyword string, userIDs []string, userID2, mobile string, offset, pageSize int) (pagedInfo *model.PagedInfo, err error) {
userList, totalCount, err := dao.GetUsers(dao.GetDB(), userType, keyword, userIDs, userID2, mobile, offset, pageSize) userList, totalCount, err := dao.GetUsers(dao.GetDB(), userType, keyword, userIDs, jxutils.BatchString2Slice(userID2), jxutils.BatchString2Slice(mobile), offset, pageSize)
if err == nil { if err == nil {
pagedInfo = &model.PagedInfo{ pagedInfo = &model.PagedInfo{
TotalCount: totalCount, TotalCount: totalCount,
@@ -501,7 +501,7 @@ func GetRolesUserList(ctx *jxcontext.Context, rList []*authz.RoleInfo) (userIDMa
} }
func checkUserType(userID string, userType int8) (err error) { func checkUserType(userID string, userType int8) (err error) {
userList, _, err := dao.GetUsers(dao.GetDB(), 0, "", []string{userID}, "", "", 0, 0) userList, _, err := dao.GetUsers(dao.GetDB(), 0, "", []string{userID}, nil, nil, 0, 0)
if err != nil { if err != nil {
return err return err
} }
@@ -790,7 +790,7 @@ func HandleUserWXRemark(db *dao.DaoDB, mobile string, mobileIsUerID bool) (err e
if mobileIsUerID { if mobileIsUerID {
userID = mobile userID = mobile
} else { } else {
userList, _, err2 := dao.GetUsers(db, model.UserTypeStoreBoss, "", nil, "", mobile, 0, -1) userList, _, err2 := dao.GetUsers(db, model.UserTypeStoreBoss, "", nil, nil, []string{mobile}, 0, -1)
if err = err2; len(userList) > 0 { if err = err2; len(userList) > 0 {
userID = userList[0].GetID() userID = userList[0].GetID()
} }

View File

@@ -4,9 +4,9 @@ import (
"fmt" "fmt"
"git.rosy.net.cn/baseapi/platformapi/dingdingapi" "git.rosy.net.cn/baseapi/platformapi/dingdingapi"
"git.rosy.net.cn/baseapi/utils/errlist"
"git.rosy.net.cn/jx-callback/business/auth2" "git.rosy.net.cn/jx-callback/business/auth2"
"git.rosy.net.cn/jx-callback/business/auth2/authprovider/dingding" "git.rosy.net.cn/jx-callback/business/auth2/authprovider/dingding"
"git.rosy.net.cn/jx-callback/business/auth2/authprovider/weixin"
"git.rosy.net.cn/jx-callback/globals" "git.rosy.net.cn/jx-callback/globals"
"git.rosy.net.cn/jx-callback/globals/api" "git.rosy.net.cn/jx-callback/globals/api"
) )
@@ -29,7 +29,7 @@ func SendUserMessage(msgType, userID, title, content string) (err error) {
findOneMethod := false findOneMethod := false
if err == nil { if err == nil {
for _, auth := range authList { for _, auth := range authList {
if auth.Type == dingding.AuthTypeStaff || auth.Type == weixin.AuthTypeMP { if auth.Type == dingding.AuthTypeStaff /*|| auth.Type == weixin.AuthTypeMP*/ {
findOneMethod = true findOneMethod = true
if len(content) > dingdingapi.MaxWorkContentLen { if len(content) > dingdingapi.MaxWorkContentLen {
content = content[:dingdingapi.MaxWorkContentLen-4] + "..." content = content[:dingdingapi.MaxWorkContentLen-4] + "..."
@@ -47,3 +47,12 @@ func SendUserMessage(msgType, userID, title, content string) (err error) {
} }
return err return err
} }
func SendUsersMessage(msgType string, userIDs []string, title, content string) (err error) {
errList := errlist.New()
for _, userID := range userIDs {
errList.AddErr(SendUserMessage(msgType, userID, title, content))
}
err = errList.GetErrListAsOne()
return err
}

View File

@@ -1,111 +1,217 @@
package dao package dao
// type StoreUserInfo struct { import (
// legacymodel.WeiXins "fmt"
// ParentMobile string `json:"parentMobile"` "time"
// Members []*legacymodel.WeiXins `orm:"-" json:"members"`
// MembersStr string `json:"-"`
// }
// func CreateWeiXins(db *DaoDB, user *legacymodel.WeiXins) (err error) { "git.rosy.net.cn/baseapi/utils"
// Begin(db) "git.rosy.net.cn/jx-callback/business/jxutils"
// if err = CreateEntity(db, user); err != nil { "git.rosy.net.cn/jx-callback/business/model"
// Rollback(db) )
// return err
// }
// if err = SetWeiXinsEmpty2Null(db, user); err != nil {
// Rollback(db)
// return err
// }
// Commit(db)
// return err
// }
// func SetWeiXinsEmpty2Null(db *DaoDB, user *legacymodel.WeiXins) (err error) { type StoreWithCityName struct {
// _, err = ExecuteSQL(db, ` model.Store
// UPDATE weixins CityName string `json:"cityName"`
// SET }
// openid = IF(openid = '', NULL, openid),
// openid_mini = IF(openid_mini = '', NULL, openid_mini),
// openid_union = IF(openid_union = '', NULL, openid_union),
// tel = IF(tel = '', NULL, tel),
// parentid = IF(parentid = 0, -1, parentid)
// WHERE id = ?
// `, user.ID)
// return err
// }
// func GetWeiXinUserByIDs(db *DaoDB, tel, unionID, openID, miniOpenID string) (user *legacymodel.WeiXins, err error) { type UserDeliveryAddressEx struct {
// fieldList := []string{ model.UserDeliveryAddress
// "Tel",
// "OpenIDUnion",
// "OpenID",
// "OpenIDMini",
// }
// valueList := []string{
// tel,
// unionID,
// openID,
// miniOpenID,
// }
// user = &legacymodel.WeiXins{
// Tel: tel,
// OpenIDUnion: unionID,
// OpenID: openID,
// OpenIDMini: miniOpenID,
// }
// for index := range valueList {
// if valueList[index] != "" {
// if err = GetEntity(db, user, fieldList[index]); err == nil {
// return user, nil
// }
// }
// }
// return nil, err
// }
// func UpdateWeiXinUser(db *DaoDB, tel, nickname, unionID, openID, miniOpenID string) (err error) { UserName string `json:"userName"`
// user := &legacymodel.WeiXins{ CityName string `json:"cityName"`
// Tel: tel, DistrictName string `json:"districtName"`
// } }
// if err = GetEntity(db, user, "Tel"); err == nil {
// updateFields := []string{}
// if openID != "" {
// user.OpenID = openID
// updateFields = append(updateFields, "OpenID")
// }
// if unionID != "" {
// user.OpenIDUnion = unionID
// updateFields = append(updateFields, "OpenIDUnion")
// }
// if miniOpenID != "" {
// user.OpenIDMini = miniOpenID
// updateFields = append(updateFields, "OpenIDMini")
// }
// if nickname != "" {
// user.NickName = nickname
// updateFields = append(updateFields, "NickName")
// }
// _, err = UpdateEntity(db, user, updateFields...)
// }
// return err
// }
// func GetUserStoreInfo(db *DaoDB, fieldName, fieldValue string) (storeUserInfo *StoreUserInfo, err error) { func GetUserByID(db *DaoDB, fieldName, fieldValue string) (user *model.User, err error) {
// sql := fmt.Sprintf(` sql := fmt.Sprintf(`
// SELECT t1.id, IF(t3.id IS NULL, t1.jxstoreid, t3.jxstoreid) jxstoreid, t1.openid, t1.tel, t1.nickname, t1.parentid, t3.tel parent_mobile, SELECT *
// CONCAT("[", GROUP_CONCAT(CONCAT('{"id":', t2.id, ',"tel":"', t2.tel, '","nickname":"', IF(t2.nickname IS NULL, "", t2.nickname), '"}')), "]") members_str FROM user t1
// FROM weixins t1 WHERE t1.deleted_at = ? AND t1.status = ? AND t1.%s = ?
// LEFT JOIN weixins t2 ON t2.parentid = t1.id `, fieldName)
// LEFT JOIN weixins t3 ON t1.parentid = t3.id sqlParams := []interface{}{
// WHERE t1.%s = ? utils.DefaultTimeValue,
// GROUP BY 1,2,3,4,5,6,7; model.UserStatusNormal,
// `, fieldName) fieldValue,
// if err = GetRow(db, &storeUserInfo, sql, fieldValue); err == nil { // todo }
// err = nil // globals.SugarLogger.Debugf("GetUserByID sql:%s, sqlParams:%s", sql, utils.Format4Output(sqlParams, false))
// if storeUserInfo.MembersStr != "" { err = GetRow(db, &user, sql, sqlParams...)
// err = utils.UnmarshalUseNumber([]byte(storeUserInfo.MembersStr), &storeUserInfo.Members) return user, err
// } }
// }
// return storeUserInfo, err func GetUsers(db *DaoDB, userType int, keyword string, userIDs, userID2s, mobiles []string, offset, pageSize int) (userList []*model.User, totalCount int, err error) {
// } offset = jxutils.FormalizePageOffset(offset)
pageSize = jxutils.FormalizePageSize(pageSize)
if userType == 0 {
userType = 255
}
sql := `
SELECT SQL_CALC_FOUND_ROWS
t1.*
FROM user t1
WHERE t1.status = 1 AND t1.deleted_at = ? AND t1.type & ? <> 0`
sqlParams := []interface{}{
utils.DefaultTimeValue,
userType,
}
if len(userIDs) > 0 {
sql += " AND t1.user_id IN (" + GenQuestionMarks(len(userIDs)) + ")"
sqlParams = append(sqlParams, userIDs)
}
if len(userID2s) > 0 {
sql += " AND t1.user_id2 IN (" + GenQuestionMarks(len(userID2s)) + ")"
sqlParams = append(sqlParams, userID2s)
}
if len(mobiles) > 0 {
sql += " AND t1.mobile IN (" + GenQuestionMarks(len(mobiles)) + ")"
sqlParams = append(sqlParams, mobiles)
}
if keyword != "" {
keywordLike := "%" + keyword + "%"
sql += " AND (t1.user_id LIKE ? OR t1.user_id2 LIKE ? OR t1.mobile LIKE ? OR t1.email LIKE ? OR t1.name LIKE ?)"
sqlParams = append(sqlParams, keywordLike, keywordLike, keywordLike, keywordLike, keywordLike)
}
sql += " LIMIT ? OFFSET ?"
sqlParams = append(sqlParams, pageSize, offset)
Begin(db)
defer Commit(db)
if err = GetRows(db, &userList, sql, sqlParams...); err == nil {
totalCount = GetLastTotalRowCount(db)
}
return userList, totalCount, err
}
func DeleteUsers(db *DaoDB, userIDs []string) (num int64, err error) {
if len(userIDs) > 0 {
sql := `
UPDATE user t1
JOIN auth_bind t2 ON t2.user_id = t1.user_id
SET
t1.deleted_at = ?,
t2.deleted_at = ?
WHERE t1.user_id IN (` + GenQuestionMarks(len(userIDs)) + ");"
now := time.Now()
sqlParams := []interface{}{
now,
now,
userIDs,
}
num, err = ExecuteSQL(db, sql, sqlParams...)
}
return num, err
}
func GetStoreListByMobile(db *DaoDB, mobile string) (storeList []*StoreWithCityName, err error) {
if mobile != "" {
sql := `
SELECT
DISTINCT t1.*, t2.name city_name
FROM (
SELECT *
FROM store t1
WHERE (t1.market_man_phone = ? OR t1.operator_phone = ? OR t1.operator_phone2 = ?)
UNION DISTINCT
SELECT t1.*
FROM store t1
JOIN weixins t2 ON t2.jxstoreid = t1.id AND t2.parentid = -1
LEFT JOIN weixins t3 ON t3.parentid = t2.id
WHERE (t2.tel = ? OR t3.tel = ?)
) t1
LEFT JOIN place t2 ON t2.code = t1.city_code
WHERE t1.deleted_at = ?
ORDER BY t1.name`
sqlParams := []interface{}{
mobile,
mobile,
mobile,
mobile,
mobile,
utils.DefaultTimeValue,
}
err = GetRows(db, &storeList, sql, sqlParams...)
}
return storeList, err
}
func GetStoreListByMobileOrStoreIDs(db *DaoDB, mobile string, shortRoleNameList []string, storeIDs []int) (storeList []*StoreWithCityName, err error) {
sql := `
SELECT t1.*, t2.name city_name
FROM store t1
LEFT JOIN place t2 ON t2.code = t1.city_code
WHERE t1.deleted_at = ? AND ( 1 = 0`
sqlParams := []interface{}{
utils.DefaultTimeValue,
}
if mobile != "" {
sql += " OR t1.market_man_phone = ? OR t1.operator_phone = ? OR t1.operator_phone2 = ?"
sqlParams = append(sqlParams, mobile, mobile, mobile)
}
if len(shortRoleNameList) > 0 {
questionMarks := GenQuestionMarks(len(shortRoleNameList))
sql += " OR t1.market_man_role IN (" + questionMarks + ") OR t1.operator_role IN (" + questionMarks + ") OR t1.operator_role2 IN (" + questionMarks + ")"
sqlParams = append(sqlParams, shortRoleNameList, shortRoleNameList, shortRoleNameList)
}
if len(storeIDs) > 0 {
sql += " OR t1.id IN (" + GenQuestionMarks(len(storeIDs)) + ")"
sqlParams = append(sqlParams, storeIDs)
}
sql += ")"
err = GetRows(db, &storeList, sql, sqlParams...)
return storeList, err
}
func QueryUserDeliveryAddress(db *DaoDB, addressID int64, userIDs []string, offset, pageSize int) (addressList []*UserDeliveryAddressEx, totalCount int, err error) {
sql := `
SELECT SQL_CALC_FOUND_ROWS
t1.*,
t2.name user_name,
district.name district_name,
city.name city_name
FROM user_delivery_address t1
LEFT JOIN user t2 ON t2.user_id = t1.user_id
LEFT JOIN place district ON district.code = t1.district_code
LEFT JOIN place city ON city.code = t1.city_code
WHERE t1.deleted_at = ?
`
sqlParams := []interface{}{
utils.DefaultTimeValue,
}
if addressID > 0 {
sql += " AND t1.id = ? "
sqlParams = append(sqlParams, addressID)
}
if len(userIDs) > 0 {
sql += " AND t1.user_id IN (" + GenQuestionMarks(len(userIDs)) + ")"
sqlParams = append(sqlParams, userIDs)
}
offset = jxutils.FormalizePageOffset(offset)
pageSize = jxutils.FormalizePageSize(pageSize)
sql += `
ORDER BY t1.is_default DESC, t1.consignee_name
LIMIT ? OFFSET ?`
sqlParams = append(sqlParams, pageSize, offset)
Begin(db)
defer Commit(db)
if err = GetRows(db, &addressList, sql, sqlParams...); err == nil {
totalCount = GetLastTotalRowCount(db)
}
return addressList, totalCount, err
}
func ClearUserDeliveryAddressDefault(db *DaoDB, userID string, defAddressID int) (err error) {
sql := `
UPDATE user_delivery_address t1
SET t1.is_default = 0
WHERE t1.deleted_at = ? AND t1.user_id = ?
`
sqlParams := []interface{}{
utils.DefaultTimeValue,
userID,
}
if defAddressID > 0 {
sql += " AND t1.id <> ?"
sqlParams = append(sqlParams, defAddressID)
}
_, err = ExecuteSQL(db, sql, sqlParams...)
return err
}

View File

@@ -1,217 +0,0 @@
package dao
import (
"fmt"
"time"
"git.rosy.net.cn/baseapi/utils"
"git.rosy.net.cn/jx-callback/business/jxutils"
"git.rosy.net.cn/jx-callback/business/model"
)
type StoreWithCityName struct {
model.Store
CityName string `json:"cityName"`
}
type UserDeliveryAddressEx struct {
model.UserDeliveryAddress
UserName string `json:"userName"`
CityName string `json:"cityName"`
DistrictName string `json:"districtName"`
}
func GetUserByID(db *DaoDB, fieldName, fieldValue string) (user *model.User, err error) {
sql := fmt.Sprintf(`
SELECT *
FROM user t1
WHERE t1.deleted_at = ? AND t1.status = ? AND t1.%s = ?
`, fieldName)
sqlParams := []interface{}{
utils.DefaultTimeValue,
model.UserStatusNormal,
fieldValue,
}
// globals.SugarLogger.Debugf("GetUserByID sql:%s, sqlParams:%s", sql, utils.Format4Output(sqlParams, false))
err = GetRow(db, &user, sql, sqlParams...)
return user, err
}
func GetUsers(db *DaoDB, userType int, keyword string, userIDs []string, userID2, mobile string, offset, pageSize int) (userList []*model.User, totalCount int, err error) {
offset = jxutils.FormalizePageOffset(offset)
pageSize = jxutils.FormalizePageSize(pageSize)
if userType == 0 {
userType = 255
}
sql := `
SELECT SQL_CALC_FOUND_ROWS
t1.*
FROM user t1
WHERE t1.status = 1 AND t1.deleted_at = ? AND t1.type & ? <> 0`
sqlParams := []interface{}{
utils.DefaultTimeValue,
userType,
}
if len(userIDs) > 0 {
sql += " AND t1.user_id IN (" + GenQuestionMarks(len(userIDs)) + ")"
sqlParams = append(sqlParams, userIDs)
}
if userID2 != "" {
sql += " AND t1.user_id2 = ?"
sqlParams = append(sqlParams, userID2)
}
if mobile != "" {
sql += " AND t1.mobile = ?"
sqlParams = append(sqlParams, mobile)
}
if keyword != "" {
keywordLike := "%" + keyword + "%"
sql += " AND (t1.user_id LIKE ? OR t1.user_id2 LIKE ? OR t1.mobile LIKE ? OR t1.email LIKE ? OR t1.name LIKE ?)"
sqlParams = append(sqlParams, keywordLike, keywordLike, keywordLike, keywordLike, keywordLike)
}
sql += " LIMIT ? OFFSET ?"
sqlParams = append(sqlParams, pageSize, offset)
Begin(db)
defer Commit(db)
if err = GetRows(db, &userList, sql, sqlParams...); err == nil {
totalCount = GetLastTotalRowCount(db)
}
return userList, totalCount, err
}
func DeleteUsers(db *DaoDB, userIDs []string) (num int64, err error) {
if len(userIDs) > 0 {
sql := `
UPDATE user t1
JOIN auth_bind t2 ON t2.user_id = t1.user_id
SET
t1.deleted_at = ?,
t2.deleted_at = ?
WHERE t1.user_id IN (` + GenQuestionMarks(len(userIDs)) + ");"
now := time.Now()
sqlParams := []interface{}{
now,
now,
userIDs,
}
num, err = ExecuteSQL(db, sql, sqlParams...)
}
return num, err
}
func GetStoreListByMobile(db *DaoDB, mobile string) (storeList []*StoreWithCityName, err error) {
if mobile != "" {
sql := `
SELECT
DISTINCT t1.*, t2.name city_name
FROM (
SELECT *
FROM store t1
WHERE (t1.market_man_phone = ? OR t1.operator_phone = ? OR t1.operator_phone2 = ?)
UNION DISTINCT
SELECT t1.*
FROM store t1
JOIN weixins t2 ON t2.jxstoreid = t1.id AND t2.parentid = -1
LEFT JOIN weixins t3 ON t3.parentid = t2.id
WHERE (t2.tel = ? OR t3.tel = ?)
) t1
LEFT JOIN place t2 ON t2.code = t1.city_code
WHERE t1.deleted_at = ?
ORDER BY t1.name`
sqlParams := []interface{}{
mobile,
mobile,
mobile,
mobile,
mobile,
utils.DefaultTimeValue,
}
err = GetRows(db, &storeList, sql, sqlParams...)
}
return storeList, err
}
func GetStoreListByMobileOrStoreIDs(db *DaoDB, mobile string, shortRoleNameList []string, storeIDs []int) (storeList []*StoreWithCityName, err error) {
sql := `
SELECT t1.*, t2.name city_name
FROM store t1
LEFT JOIN place t2 ON t2.code = t1.city_code
WHERE t1.deleted_at = ? AND ( 1 = 0`
sqlParams := []interface{}{
utils.DefaultTimeValue,
}
if mobile != "" {
sql += " OR t1.market_man_phone = ? OR t1.operator_phone = ? OR t1.operator_phone2 = ?"
sqlParams = append(sqlParams, mobile, mobile, mobile)
}
if len(shortRoleNameList) > 0 {
questionMarks := GenQuestionMarks(len(shortRoleNameList))
sql += " OR t1.market_man_role IN (" + questionMarks + ") OR t1.operator_role IN (" + questionMarks + ") OR t1.operator_role2 IN (" + questionMarks + ")"
sqlParams = append(sqlParams, shortRoleNameList, shortRoleNameList, shortRoleNameList)
}
if len(storeIDs) > 0 {
sql += " OR t1.id IN (" + GenQuestionMarks(len(storeIDs)) + ")"
sqlParams = append(sqlParams, storeIDs)
}
sql += ")"
err = GetRows(db, &storeList, sql, sqlParams...)
return storeList, err
}
func QueryUserDeliveryAddress(db *DaoDB, addressID int64, userIDs []string, offset, pageSize int) (addressList []*UserDeliveryAddressEx, totalCount int, err error) {
sql := `
SELECT SQL_CALC_FOUND_ROWS
t1.*,
t2.name user_name,
district.name district_name,
city.name city_name
FROM user_delivery_address t1
LEFT JOIN user t2 ON t2.user_id = t1.user_id
LEFT JOIN place district ON district.code = t1.district_code
LEFT JOIN place city ON city.code = t1.city_code
WHERE t1.deleted_at = ?
`
sqlParams := []interface{}{
utils.DefaultTimeValue,
}
if addressID > 0 {
sql += " AND t1.id = ? "
sqlParams = append(sqlParams, addressID)
}
if len(userIDs) > 0 {
sql += " AND t1.user_id IN (" + GenQuestionMarks(len(userIDs)) + ")"
sqlParams = append(sqlParams, userIDs)
}
offset = jxutils.FormalizePageOffset(offset)
pageSize = jxutils.FormalizePageSize(pageSize)
sql += `
ORDER BY t1.is_default DESC, t1.consignee_name
LIMIT ? OFFSET ?`
sqlParams = append(sqlParams, pageSize, offset)
Begin(db)
defer Commit(db)
if err = GetRows(db, &addressList, sql, sqlParams...); err == nil {
totalCount = GetLastTotalRowCount(db)
}
return addressList, totalCount, err
}
func ClearUserDeliveryAddressDefault(db *DaoDB, userID string, defAddressID int) (err error) {
sql := `
UPDATE user_delivery_address t1
SET t1.is_default = 0
WHERE t1.deleted_at = ? AND t1.user_id = ?
`
sqlParams := []interface{}{
utils.DefaultTimeValue,
userID,
}
if defAddressID > 0 {
sql += " AND t1.id <> ?"
sqlParams = append(sqlParams, defAddressID)
}
_, err = ExecuteSQL(db, sql, sqlParams...)
return err
}

View File

@@ -1,33 +1,15 @@
package dao package dao
// func TestCreateWeiXins(t *testing.T) { import (
// err := CreateWeiXins(GetDB(), &legacymodel.WeiXins{ "testing"
// Tel: "12345",
// })
// if err != nil {
// t.Fatal(err)
// }
// }
// func TestGetWeiXinUserByIDs(t *testing.T) { "git.rosy.net.cn/baseapi/utils"
// user, err := GetWeiXinUserByIDs(GetDB(), "", "unionid", "", "") )
// if err != nil {
// t.Fatal(err)
// }
// globals.SugarLogger.Debug(utils.Format4Output(user, false))
// }
// func TestUpdateWeiXinUser(t *testing.T) { func TestGetUsers(t *testing.T) {
// err := UpdateWeiXinUser(GetDB(), "12345", "nickname", "unionid", "openid", "miniid") userList, _, err := GetUsers(GetDB(), 0, "", nil, nil, []string{"18180948107"}, 0, 0)
// if err != nil { if err != nil {
// t.Fatal(err) t.Fatal(err)
// } }
// } t.Log(utils.Format4Output(userList, false))
}
// func TestGetUserStoreInfo(t *testing.T) {
// user, err := GetUserStoreInfo(GetDB(), "tel", "18180948107")
// if err != nil {
// t.Fatal(err)
// }
// globals.SugarLogger.Debug(utils.Format4Output(user, false))
// }