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 UserDeliveryAddressEx struct { model.UserDeliveryAddress UserName string `json:"userName"` CityName string `json:"cityName"` DistrictName string `json:"districtName"` ParentCode int `json:"parentCode"` } type GetSelfInfoResult struct { model.User model.UserBill WaitCashPrice int `json:"waitCashPrice"` WaitRealCashPrice int `json:"waitRealCashPrice"` UserMembers []*model.UserMember `json:"userMembers"` PopedUserName string `json:"popedUserName"` UnReadMessageCount int `json:"unReadMessageCount"` } 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 GetUserByIDWithMembers(db *DaoDB, fieldName, fieldValue string) (getSelfInfoResult *GetSelfInfoResult, err error) { sql := fmt.Sprintf(` SELECT t1.*, t2.bill_id, t2.account_balance, t3.name pop_user_name FROM user t1 JOIN user_bill t2 ON t2.user_id = t1.user_id AND t2.deleted_at = ? LEFT JOIN user t3 ON t3.user_id = t1.pop_user WHERE t1.deleted_at = ? AND t1.status = ? AND t1.%s = ? `, fieldName) sqlParams := []interface{}{ utils.DefaultTimeValue, utils.DefaultTimeValue, model.UserStatusNormal, fieldValue, } // globals.SugarLogger.Debugf("GetUserByID sql:%s, sqlParams:%s", sql, utils.Format4Output(sqlParams, false)) err = GetRow(db, &getSelfInfoResult, sql, sqlParams...) if messageGroupReads, err := GetMessageGroupRead(db, getSelfInfoResult.User.UserID, 0); err == nil { var unReadCount int for _, v := range messageGroupReads { unReadCount += v.UnReadCount } getSelfInfoResult.UnReadMessageCount = unReadCount } return getSelfInfoResult, err } func GetUsers(db *DaoDB, userType int, keyword, popUser 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 } sqlParams := []interface{}{} sql := ` SELECT SQL_CALC_FOUND_ROWS t1.* FROM user t1 WHERE t1.status = 1 AND t1.deleted_at = ?` sqlParams = append(sqlParams, utils.DefaultTimeValue) 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 popUser != "" { sql += " AND t1.pop_user = ?" sqlParams = append(sqlParams, popUser) } 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) txDB, _ := Begin(db) defer Commit(db, txDB) if err = GetRowsTx(txDB, &userList, sql, sqlParams...); err == nil { totalCount = GetLastTotalRowCountTx(txDB) } return userList, totalCount, err } func GetUsers2(db *DaoDB, keyword string, userID string, pop int, mobile string, fromTime, toTime time.Time, timeType int, cityCodes, consumeTypes []int, offset, pageSize int) (pageInfo *model.PagedInfo, err error) { var ( userList []*model.User ) offset = jxutils.FormalizePageOffset(offset) pageSize = jxutils.FormalizePageSize(pageSize) sqlParams := []interface{}{} sql := ` SELECT SQL_CALC_FOUND_ROWS DISTINCT a.* FROM user a` for _, v := range consumeTypes { switch v { case model.ConsumeTypePublishJob: sql += " JOIN job b ON b.user_id = a.user_id" if fromTime != utils.ZeroTimeValue { if timeType == 2 { sql += " AND b.created_at > ?" sqlParams = append(sqlParams, fromTime) } } if toTime != utils.ZeroTimeValue { if timeType == 2 { sql += " AND b.created_at < ?" sqlParams = append(sqlParams, toTime) } } case model.ConsumeTypeMember: sql += " JOIN user_member c ON c.user_id = a.user_id" if fromTime != utils.ZeroTimeValue { if timeType == 2 { sql += " AND c.created_at > ?" sqlParams = append(sqlParams, fromTime) } } if toTime != utils.ZeroTimeValue { if timeType == 2 { sql += " AND c.created_at < ?" sqlParams = append(sqlParams, toTime) } } case model.ConsumeTypeDelivery: sql += " JOIN delivery_order d ON d.user_id = a.user_id" if fromTime != utils.ZeroTimeValue { if timeType == 2 { sql += " AND d.created_at > ?" sqlParams = append(sqlParams, fromTime) } } if toTime != utils.ZeroTimeValue { if timeType == 2 { sql += " AND d.created_at < ?" sqlParams = append(sqlParams, toTime) } } } } sql += ` WHERE a.status = 1 AND a.deleted_at = ?` sqlParams = append(sqlParams, utils.DefaultTimeValue) if userID != "" { if pop == 1 { sql += " AND a.pop_user = ?" sqlParams = append(sqlParams, userID) } else { sql += " AND a.user_id = ?" sqlParams = append(sqlParams, userID) } } if len(cityCodes) > 0 { sql += " AND a.city_code IN (" + GenQuestionMarks(len(cityCodes)) + ")" sqlParams = append(sqlParams, cityCodes) } if mobile != "" { sql += " AND a.mobile = ?" sqlParams = append(sqlParams, mobile) } if keyword != "" { keywordLike := "%" + keyword + "%" sql += " AND (a.user_id LIKE ? OR a.mobile LIKE ? OR a.email LIKE ? OR a.name LIKE ?)" sqlParams = append(sqlParams, keywordLike, keywordLike, keywordLike, keywordLike) } if fromTime != utils.ZeroTimeValue { if timeType == 1 { sql += " AND a.created_at > ?" sqlParams = append(sqlParams, fromTime) } } if toTime != utils.ZeroTimeValue { if timeType == 1 { sql += " AND a.created_at < ?" sqlParams = append(sqlParams, toTime) } } sql += " LIMIT ? OFFSET ?" sqlParams = append(sqlParams, pageSize, offset) txDB, _ := Begin(db) defer Commit(db, txDB) if err = GetRowsTx(txDB, &userList, sql, sqlParams...); err == nil { pageInfo = &model.PagedInfo{ TotalCount: GetLastTotalRowCountTx(txDB), Data: userList, } } return pageInfo, err } func GetUser(db *DaoDB, userID string) (user *model.GetUserResult, err error) { sqlParams := []interface{}{} sql := ` SELECT t1.*, IF(t2.accept_order_count is NULL, 0, t2.accept_order_count) accept_order_count, IF(t3.finished_order_count is NULL, 0, t3.finished_order_count) finished_order_count FROM user t1 LEFT JOIN (SELECT user_id, COUNT(user_id) accept_order_count FROM job_order WHERE user_id = ? GROUP BY 1)t2 ON t2.user_id = t1.user_id LEFT JOIN (SELECT user_id, COUNT(user_id) finished_order_count FROM job_order WHERE user_id = ? AND status = ? GROUP BY 1)t3 ON t3.user_id = t1.user_id WHERE t1.status = ? AND t1.deleted_at = ? AND t1.user_id = ? ` sqlParams = append(sqlParams, userID, userID, model.JobOrderStatusFinish, model.YES, utils.DefaultTimeValue, userID) err = GetRow(db, &user, sql, sqlParams...) return user, 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 QueryUserDeliveryAddress(db *DaoDB, addressID int64, userIDs []string, addType int, 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, cp.code parent_code 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 LEFT JOIN place cp ON cp.code = city.parent_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) } if addType != 0 { sql += " AND t1.type = ? " sqlParams = append(sqlParams, addType) } 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) txDB, _ := Begin(db) defer Commit(db, txDB) if err = GetRowsTx(txDB, &addressList, sql, sqlParams...); err == nil { totalCount = GetLastTotalRowCountTx(txDB) } 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 } func GetUserOrderSMS(db *DaoDB, mobile, name string) (userOrderSms *model.UserOrderSms, err error) { sql := ` SELECT * FROM user_order_sms WHERE 1=1 ` sqlParams := []interface{}{} if mobile != "" { sql += " AND mobile = ?" sqlParams = append(sqlParams, mobile) } if name != "" { sql += " AND name like ?" sqlParams = append(sqlParams, "%"+name+"%") } err = GetRow(db, &userOrderSms, sql, sqlParams) return userOrderSms, err } func GetUserMember(db *DaoDB, userID string, memberType int) (userMembers []*model.UserMember, err error) { sql := ` SELECT a.* FROM user_member a WHERE a.deleted_at = ? ` sqlParams := []interface{}{utils.DefaultTimeValue} if userID != "" { sql += " AND a.user_id = ?" sqlParams = append(sqlParams, userID) } if memberType != 0 { sql += " AND a.member_type = ?" sqlParams = append(sqlParams, memberType) } err = GetRows(db, &userMembers, sql, sqlParams) return userMembers, err } type GetUserAllWaitCashPriceResult struct { UserID string `orm:"column(user_id)" json:"userID"` Price int `json:"price"` } func GetUserAllWaitCashPrice(db *DaoDB, userID string) (price int, err error) { var result = &GetUserAllWaitCashPriceResult{} sql := ` SELECT SUM(IF(d.id IS NOT NULL, IF(d.divide_percentage = 0, b.avg_price, b.avg_price*(100-d.divide_percentage)/100),b.avg_price)) price, a.user_id FROM job_order a JOIN job b ON a.job_id = b.id LEFT JOIN message_group_member c ON a.user_id = c.member_user_id LEFT JOIN message_group d ON d.group_id = c.group_id AND d.type = ? WHERE a.user_id = ? AND a.status = ? ` sqlParams := []interface{}{ model.GroupTypeMulit, userID, model.JobOrderStatusWaitAudit, } err = GetRow(db, &result, sql, sqlParams) return result.Price, err } func GetUserAllWaitRealCashPrice(db *DaoDB, userID string) (price int, err error) { var result = &GetUserAllWaitCashPriceResult{} sql := ` SELECT SUM(pay_price) price FROM ` + "`order`" + ` WHERE user_id = ? AND status = ? AND type = ? ` sqlParams := []interface{}{ userID, model.OrderStatusWait4Pay, model.OrderTypeCash, } err = GetRow(db, &result, sql, sqlParams) return result.Price, err } func GetUserUnionBind(db *DaoDB, userID string, vendorID int, unionID string) (userBinds []*model.UserUnionBind, err error) { sql := ` SELECT * FROM user_union_bind WHERE deleted_at = ? ` sqlParams := []interface{}{ utils.DefaultTimeValue, } if userID != "" { sql += " AND user_id = ?" sqlParams = append(sqlParams, userID) } if vendorID != -1 { sql += " AND vendor_id = ?" sqlParams = append(sqlParams, vendorID) } if unionID != "" { sql += " AND union_id = ?" sqlParams = append(sqlParams, unionID) } err = GetRows(db, &userBinds, sql, sqlParams) return userBinds, err } func GetUserUnionBindImg(db *DaoDB, unionID, actID string) (userBinds *model.UserUnionBindImg, err error) { sql := ` SELECT * FROM user_union_bind_img WHERE deleted_at = ? ` sqlParams := []interface{}{ utils.DefaultTimeValue, } if unionID != "" { sql += " AND union_id = ?" sqlParams = append(sqlParams, unionID) } if actID != "" { sql += " AND act_id = ?" sqlParams = append(sqlParams, actID) } err = GetRow(db, &userBinds, sql, sqlParams) return userBinds, err }