From a27f261ca498ba4906ee66f8ef2a1301d8eb847a Mon Sep 17 00:00:00 2001 From: gazebo Date: Fri, 17 Jan 2020 14:14:36 +0800 Subject: [PATCH] =?UTF-8?q?=E9=A5=BF=E7=99=BE=E5=B9=B3=E5=8F=B0=E8=BF=90?= =?UTF-8?q?=E5=8D=95=E5=8F=96=E6=B6=88=E5=90=8E=E7=BB=99=E8=BF=90=E8=90=A5?= =?UTF-8?q?=E5=8F=91=E6=8A=A5=E8=AD=A6=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 | 64 +++- business/jxstore/cms/authz.go | 2 +- business/jxstore/cms/cms.go | 2 +- business/jxstore/cms/store.go | 2 +- business/jxstore/cms/user2.go | 10 +- business/jxutils/ddmsg/ddmsg.go | 13 +- business/model/dao/dao_user.go | 314 ++++++++++++------ business/model/dao/dao_user2.go | 217 ------------ business/model/dao/dao_user_test.go | 40 +-- 9 files changed, 296 insertions(+), 368 deletions(-) delete mode 100644 business/model/dao/dao_user2.go diff --git a/business/jxcallback/scheduler/defsch/defsch.go b/business/jxcallback/scheduler/defsch/defsch.go index a4ee3ac0c..f5a41ba56 100644 --- a/business/jxcallback/scheduler/defsch/defsch.go +++ b/business/jxcallback/scheduler/defsch/defsch.go @@ -57,8 +57,10 @@ const ( addWaybillTipGap = 15 // 加一元小费间隔的分钟数 maxWaybillTipMoney = 400 // 最大小费 baseWaybillFee = 600 // 基本运费 - ebaiCancelWaybillMaxFee = 1000 // 饿百取消运单最高运费 + ebaiCancelWaybillMaxFee = 1000 // 饿百取消运单最高运费,门店自送最高运费 maxJxStoreDeliveryFee = 2000 + + ebaiCancelWaybillWarningMinute = 8 ) const ( @@ -323,7 +325,8 @@ func init() { Timeout: 1 * time.Second, }, 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 { 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) { order := savedOrderInfo.order if order.VendorID == model.VendorIDELM { @@ -682,7 +703,9 @@ func (s *DefScheduler) createWaybillOn3rdProviders(savedOrderInfo *WatchOrderInf savedOrderInfo.retryCount++ } } 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) } } else { @@ -1160,11 +1183,11 @@ func getMaxDeliveryFee(order *model.GoodsOrder) (maxDeliveryFee int64) { orderBaseFreightMoney = baseWaybillFee } maxDeliveryFee = orderBaseFreightMoney + order.DistanceFreightMoney + getWaybillTip(order) - } - if maxDeliveryFee < ebaiCancelWaybillMaxFee && - order.VendorID == model.VendorIDEBAI && - order.DeliveryType == model.OrderDeliveryTypeStoreSelf { - maxDeliveryFee = ebaiCancelWaybillMaxFee + if maxDeliveryFee < ebaiCancelWaybillMaxFee && + (order.VendorID == model.VendorIDEBAI || + order.DeliveryType == model.OrderDeliveryTypeStoreSelf) { + maxDeliveryFee = ebaiCancelWaybillMaxFee + } } 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 +} diff --git a/business/jxstore/cms/authz.go b/business/jxstore/cms/authz.go index 6e938398f..09b1643f5 100644 --- a/business/jxstore/cms/authz.go +++ b/business/jxstore/cms/authz.go @@ -71,7 +71,7 @@ func TransferLegacyWeixins(mobile string) (err error) { if user.Name == "" { 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 { return err } diff --git a/business/jxstore/cms/cms.go b/business/jxstore/cms/cms.go index 55acc3114..c1e92411a 100644 --- a/business/jxstore/cms/cms.go +++ b/business/jxstore/cms/cms.go @@ -358,7 +358,7 @@ func DeleteConfig(ctx *jxcontext.Context, key, configType string) (err error) { errList := errlist.New() userIDs, err2 := api2.RoleMan.GetRoleUserList(autils.NewRole(key, 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 { // todo // err = fmt.Errorf("还有人员在使用角色:%s,人员信息:%s", key, utils.MustMarshal(utils.Struct2Map(userList, "compact"))) diff --git a/business/jxstore/cms/store.go b/business/jxstore/cms/store.go index 1071d9435..f1f80ccf0 100644 --- a/business/jxstore/cms/store.go +++ b/business/jxstore/cms/store.go @@ -1866,7 +1866,7 @@ func getAllUsers4Store(ctx *jxcontext.Context, db *dao.DaoDB, store *model.Store } 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 { userMap[v.GetID()] = 1 } diff --git a/business/jxstore/cms/user2.go b/business/jxstore/cms/user2.go index 34bcfa798..e9141370a 100644 --- a/business/jxstore/cms/user2.go +++ b/business/jxstore/cms/user2.go @@ -236,7 +236,7 @@ func TryAddStoreBossRole4StoreByMobile(ctx *jxcontext.Context, storeID int, mobi 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 { + 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()) } } @@ -265,7 +265,7 @@ func HandleOrder4Consignee(order *model.GoodsOrder) (err error) { oeratorName := order.VendorOrderID db := dao.GetDB() 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 { 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) { - 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 { pagedInfo = &model.PagedInfo{ TotalCount: totalCount, @@ -501,7 +501,7 @@ func GetRolesUserList(ctx *jxcontext.Context, rList []*authz.RoleInfo) (userIDMa } 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 { return err } @@ -790,7 +790,7 @@ func HandleUserWXRemark(db *dao.DaoDB, mobile string, mobileIsUerID bool) (err e if mobileIsUerID { userID = mobile } 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 { userID = userList[0].GetID() } diff --git a/business/jxutils/ddmsg/ddmsg.go b/business/jxutils/ddmsg/ddmsg.go index 5b855ab90..9ab3da3e0 100644 --- a/business/jxutils/ddmsg/ddmsg.go +++ b/business/jxutils/ddmsg/ddmsg.go @@ -4,9 +4,9 @@ import ( "fmt" "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/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/api" ) @@ -29,7 +29,7 @@ func SendUserMessage(msgType, userID, title, content string) (err error) { findOneMethod := false if err == nil { for _, auth := range authList { - if auth.Type == dingding.AuthTypeStaff || auth.Type == weixin.AuthTypeMP { + if auth.Type == dingding.AuthTypeStaff /*|| auth.Type == weixin.AuthTypeMP*/ { findOneMethod = true if len(content) > dingdingapi.MaxWorkContentLen { content = content[:dingdingapi.MaxWorkContentLen-4] + "..." @@ -47,3 +47,12 @@ func SendUserMessage(msgType, userID, title, content string) (err error) { } 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 +} diff --git a/business/model/dao/dao_user.go b/business/model/dao/dao_user.go index f80bc899e..ee380c5a2 100644 --- a/business/model/dao/dao_user.go +++ b/business/model/dao/dao_user.go @@ -1,111 +1,217 @@ package dao -// type StoreUserInfo struct { -// legacymodel.WeiXins -// ParentMobile string `json:"parentMobile"` -// Members []*legacymodel.WeiXins `orm:"-" json:"members"` -// MembersStr string `json:"-"` -// } +import ( + "fmt" + "time" -// func CreateWeiXins(db *DaoDB, user *legacymodel.WeiXins) (err error) { -// Begin(db) -// if err = CreateEntity(db, user); err != nil { -// Rollback(db) -// return err -// } -// if err = SetWeiXinsEmpty2Null(db, user); err != nil { -// Rollback(db) -// return err -// } -// Commit(db) -// return err -// } + "git.rosy.net.cn/baseapi/utils" + "git.rosy.net.cn/jx-callback/business/jxutils" + "git.rosy.net.cn/jx-callback/business/model" +) -// func SetWeiXinsEmpty2Null(db *DaoDB, user *legacymodel.WeiXins) (err error) { -// _, err = ExecuteSQL(db, ` -// UPDATE weixins -// 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 -// } +type StoreWithCityName struct { + model.Store + CityName string `json:"cityName"` +} -// func GetWeiXinUserByIDs(db *DaoDB, tel, unionID, openID, miniOpenID string) (user *legacymodel.WeiXins, err error) { -// fieldList := []string{ -// "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 -// } +type UserDeliveryAddressEx struct { + model.UserDeliveryAddress -// func UpdateWeiXinUser(db *DaoDB, tel, nickname, unionID, openID, miniOpenID string) (err error) { -// user := &legacymodel.WeiXins{ -// Tel: tel, -// } -// 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 -// } + UserName string `json:"userName"` + CityName string `json:"cityName"` + DistrictName string `json:"districtName"` +} -// func GetUserStoreInfo(db *DaoDB, fieldName, fieldValue string) (storeUserInfo *StoreUserInfo, err error) { -// 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, -// CONCAT("[", GROUP_CONCAT(CONCAT('{"id":', t2.id, ',"tel":"', t2.tel, '","nickname":"', IF(t2.nickname IS NULL, "", t2.nickname), '"}')), "]") members_str -// FROM weixins t1 -// LEFT JOIN weixins t2 ON t2.parentid = t1.id -// LEFT JOIN weixins t3 ON t1.parentid = t3.id -// WHERE t1.%s = ? -// GROUP BY 1,2,3,4,5,6,7; -// `, fieldName) -// if err = GetRow(db, &storeUserInfo, sql, fieldValue); err == nil { // todo -// err = nil -// if storeUserInfo.MembersStr != "" { -// err = utils.UnmarshalUseNumber([]byte(storeUserInfo.MembersStr), &storeUserInfo.Members) -// } -// } -// return storeUserInfo, err -// } +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, 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 +} diff --git a/business/model/dao/dao_user2.go b/business/model/dao/dao_user2.go deleted file mode 100644 index 3a4ee6b66..000000000 --- a/business/model/dao/dao_user2.go +++ /dev/null @@ -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 -} diff --git a/business/model/dao/dao_user_test.go b/business/model/dao/dao_user_test.go index 7658ce9e9..2db0af3d7 100644 --- a/business/model/dao/dao_user_test.go +++ b/business/model/dao/dao_user_test.go @@ -1,33 +1,15 @@ package dao -// func TestCreateWeiXins(t *testing.T) { -// err := CreateWeiXins(GetDB(), &legacymodel.WeiXins{ -// Tel: "12345", -// }) -// if err != nil { -// t.Fatal(err) -// } -// } +import ( + "testing" -// func TestGetWeiXinUserByIDs(t *testing.T) { -// user, err := GetWeiXinUserByIDs(GetDB(), "", "unionid", "", "") -// if err != nil { -// t.Fatal(err) -// } -// globals.SugarLogger.Debug(utils.Format4Output(user, false)) -// } + "git.rosy.net.cn/baseapi/utils" +) -// func TestUpdateWeiXinUser(t *testing.T) { -// err := UpdateWeiXinUser(GetDB(), "12345", "nickname", "unionid", "openid", "miniid") -// if err != nil { -// t.Fatal(err) -// } -// } - -// func TestGetUserStoreInfo(t *testing.T) { -// user, err := GetUserStoreInfo(GetDB(), "tel", "18180948107") -// if err != nil { -// t.Fatal(err) -// } -// globals.SugarLogger.Debug(utils.Format4Output(user, false)) -// } +func TestGetUsers(t *testing.T) { + userList, _, err := GetUsers(GetDB(), 0, "", nil, nil, []string{"18180948107"}, 0, 0) + if err != nil { + t.Fatal(err) + } + t.Log(utils.Format4Output(userList, false)) +}