删一些东西
This commit is contained in:
@@ -340,18 +340,6 @@ func AddAuthBind(user IUser, newAuthInfo *AuthInfo) (err error) {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
func AddAuthBindWithMobile(authInfo *AuthInfo, mobile string) (err error) {
|
|
||||||
if handler := authers[authInfo.AuthBindInfo.Type]; handler != nil {
|
|
||||||
user, _ := dao.GetUserByID(dao.GetDB(), "mobile", mobile)
|
|
||||||
authInfo.AuthBindInfo.UserID = user.UserID
|
|
||||||
//handler.UnbindAuth(user.GetID(), newAuthInfo.GetAuthType(), newAuthInfo.GetAuthTypeID(), user.GetName())
|
|
||||||
err = handler.AddAuthBind(authInfo.AuthBindInfo, user.GetName())
|
|
||||||
} else {
|
|
||||||
err = ErrIllegalAuthType
|
|
||||||
}
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
func UnbindAuth(userID, authType, authTypeID, userName string) (err error) {
|
func UnbindAuth(userID, authType, authTypeID, userName string) (err error) {
|
||||||
globals.SugarLogger.Debugf("UnbindAuth userID:%s, authType:%s, authTypeID:%s, userName:%s", userID, authType, authTypeID, userName)
|
globals.SugarLogger.Debugf("UnbindAuth userID:%s, authType:%s, authTypeID:%s, userName:%s", userID, authType, authTypeID, userName)
|
||||||
if handler := authers[authType]; handler != nil {
|
if handler := authers[authType]; handler != nil {
|
||||||
|
|||||||
@@ -1,171 +0,0 @@
|
|||||||
package casbinauth
|
|
||||||
|
|
||||||
import (
|
|
||||||
jxmodel "git.rosy.net.cn/jx-callback/business/model"
|
|
||||||
"git.rosy.net.cn/jx-callback/globals"
|
|
||||||
"github.com/astaxie/beego/client/orm"
|
|
||||||
"github.com/casbin/casbin/model"
|
|
||||||
"github.com/casbin/casbin/persist"
|
|
||||||
)
|
|
||||||
|
|
||||||
type Adapter struct {
|
|
||||||
}
|
|
||||||
|
|
||||||
// finalizer is the destructor for Adapter.
|
|
||||||
func finalizer(a *Adapter) {
|
|
||||||
}
|
|
||||||
|
|
||||||
func NewAdapter() *Adapter {
|
|
||||||
return &Adapter{}
|
|
||||||
}
|
|
||||||
|
|
||||||
func loadPolicyLine(line jxmodel.CasbinRule, model model.Model) {
|
|
||||||
lineText := line.PType
|
|
||||||
if line.V0 != "" {
|
|
||||||
lineText += ", " + line.V0
|
|
||||||
}
|
|
||||||
if line.V1 != "" {
|
|
||||||
lineText += ", " + line.V1
|
|
||||||
}
|
|
||||||
if line.V2 != "" {
|
|
||||||
lineText += ", " + line.V2
|
|
||||||
}
|
|
||||||
if line.V3 != "" {
|
|
||||||
lineText += ", " + line.V3
|
|
||||||
}
|
|
||||||
if line.V4 != "" {
|
|
||||||
lineText += ", " + line.V4
|
|
||||||
}
|
|
||||||
if line.V5 != "" {
|
|
||||||
lineText += ", " + line.V5
|
|
||||||
}
|
|
||||||
|
|
||||||
persist.LoadPolicyLine(lineText, model)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (a *Adapter) LoadPolicy(model model.Model) error {
|
|
||||||
var lines []jxmodel.CasbinRule
|
|
||||||
o := orm.NewOrm()
|
|
||||||
_, err := o.QueryTable("casbin_rule").Limit(-1).All(&lines)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
for _, line := range lines {
|
|
||||||
loadPolicyLine(line, model)
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func savePolicyLine(ptype string, rule []string) jxmodel.CasbinRule {
|
|
||||||
line := jxmodel.CasbinRule{}
|
|
||||||
|
|
||||||
line.PType = ptype
|
|
||||||
if len(rule) > 0 {
|
|
||||||
line.V0 = rule[0]
|
|
||||||
}
|
|
||||||
if len(rule) > 1 {
|
|
||||||
line.V1 = rule[1]
|
|
||||||
}
|
|
||||||
if len(rule) > 2 {
|
|
||||||
line.V2 = rule[2]
|
|
||||||
}
|
|
||||||
if len(rule) > 3 {
|
|
||||||
line.V3 = rule[3]
|
|
||||||
}
|
|
||||||
if len(rule) > 4 {
|
|
||||||
line.V4 = rule[4]
|
|
||||||
}
|
|
||||||
if len(rule) > 5 {
|
|
||||||
line.V5 = rule[5]
|
|
||||||
}
|
|
||||||
|
|
||||||
return line
|
|
||||||
}
|
|
||||||
|
|
||||||
func (a *Adapter) clearAll(o orm.Ormer) (err error) {
|
|
||||||
_, err = o.Raw(`
|
|
||||||
DELETE t1
|
|
||||||
FROM casbin_rule t1
|
|
||||||
`).Exec()
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
// SavePolicy saves policy to database.
|
|
||||||
func (a *Adapter) SavePolicy(model model.Model) error {
|
|
||||||
globals.SugarLogger.Debugf("SavePolicy")
|
|
||||||
o := orm.NewOrm()
|
|
||||||
|
|
||||||
a.clearAll(o)
|
|
||||||
var lines []jxmodel.CasbinRule
|
|
||||||
|
|
||||||
for ptype, ast := range model["p"] {
|
|
||||||
for _, rule := range ast.Policy {
|
|
||||||
line := savePolicyLine(ptype, rule)
|
|
||||||
lines = append(lines, line)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
for ptype, ast := range model["g"] {
|
|
||||||
for _, rule := range ast.Policy {
|
|
||||||
line := savePolicyLine(ptype, rule)
|
|
||||||
lines = append(lines, line)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
_, err := o.InsertMulti(len(lines), lines)
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
// AddPolicy adds a policy rule to the storage.
|
|
||||||
func (a *Adapter) AddPolicy(sec string, ptype string, rule []string) error {
|
|
||||||
o := orm.NewOrm()
|
|
||||||
line := savePolicyLine(ptype, rule)
|
|
||||||
_, err := o.Insert(&line)
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
// RemovePolicy removes a policy rule from the storage.
|
|
||||||
func (a *Adapter) RemovePolicy(sec string, ptype string, rule []string) error {
|
|
||||||
o := orm.NewOrm()
|
|
||||||
line := savePolicyLine(ptype, rule)
|
|
||||||
_, err := o.Delete(&line, "p_type", "v0", "v1", "v2", "v3", "v4", "v5")
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
// RemoveFilteredPolicy removes policy rules that match the filter from the storage.
|
|
||||||
func (a *Adapter) RemoveFilteredPolicy(sec string, ptype string, fieldIndex int, fieldValues ...string) error {
|
|
||||||
line := jxmodel.CasbinRule{}
|
|
||||||
|
|
||||||
line.PType = ptype
|
|
||||||
filter := []string{}
|
|
||||||
filter = append(filter, "p_type")
|
|
||||||
if fieldIndex <= 0 && 0 < fieldIndex+len(fieldValues) {
|
|
||||||
line.V0 = fieldValues[0-fieldIndex]
|
|
||||||
filter = append(filter, "v0")
|
|
||||||
}
|
|
||||||
if fieldIndex <= 1 && 1 < fieldIndex+len(fieldValues) {
|
|
||||||
line.V1 = fieldValues[1-fieldIndex]
|
|
||||||
filter = append(filter, "v1")
|
|
||||||
}
|
|
||||||
if fieldIndex <= 2 && 2 < fieldIndex+len(fieldValues) {
|
|
||||||
line.V2 = fieldValues[2-fieldIndex]
|
|
||||||
filter = append(filter, "v2")
|
|
||||||
}
|
|
||||||
if fieldIndex <= 3 && 3 < fieldIndex+len(fieldValues) {
|
|
||||||
line.V3 = fieldValues[3-fieldIndex]
|
|
||||||
filter = append(filter, "v3")
|
|
||||||
}
|
|
||||||
if fieldIndex <= 4 && 4 < fieldIndex+len(fieldValues) {
|
|
||||||
line.V4 = fieldValues[4-fieldIndex]
|
|
||||||
filter = append(filter, "v4")
|
|
||||||
}
|
|
||||||
if fieldIndex <= 5 && 5 < fieldIndex+len(fieldValues) {
|
|
||||||
line.V5 = fieldValues[5-fieldIndex]
|
|
||||||
filter = append(filter, "v5")
|
|
||||||
}
|
|
||||||
|
|
||||||
o := orm.NewOrm()
|
|
||||||
_, err := o.Delete(&line, filter...)
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
@@ -1,49 +0,0 @@
|
|||||||
package casbinauth
|
|
||||||
|
|
||||||
import (
|
|
||||||
"git.rosy.net.cn/jx-callback/business/authz"
|
|
||||||
"git.rosy.net.cn/jx-callback/business/authz/autils"
|
|
||||||
"github.com/casbin/casbin"
|
|
||||||
"github.com/casbin/casbin/errors"
|
|
||||||
)
|
|
||||||
|
|
||||||
type CasbinAuthz struct {
|
|
||||||
enforcer *casbin.SyncedEnforcer
|
|
||||||
}
|
|
||||||
|
|
||||||
func New(modelFile string) (authObj authz.IAuthz, err error) {
|
|
||||||
obj := &CasbinAuthz{}
|
|
||||||
obj.enforcer, err = casbin.NewSyncedEnforcer(modelFile, NewAdapter())
|
|
||||||
return obj, err
|
|
||||||
}
|
|
||||||
|
|
||||||
func (c *CasbinAuthz) AddRole4User(userID string, r *authz.RoleInfo) (err error) {
|
|
||||||
_, err = c.enforcer.AddRoleForUser(userID, r.GetFullName())
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
func (c *CasbinAuthz) DeleteRole4User(userID string, r *authz.RoleInfo) (err error) {
|
|
||||||
_, err = c.enforcer.DeleteRoleForUser(userID, r.GetFullName())
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
func (c *CasbinAuthz) GetUserRoleList(userID string) (roleList []*authz.RoleInfo, err error) {
|
|
||||||
roleNameList, err := c.enforcer.GetRolesForUser(userID)
|
|
||||||
if err == nil && len(roleNameList) > 0 {
|
|
||||||
roleList = autils.FullRoleName2RoleList(roleNameList)
|
|
||||||
}
|
|
||||||
return roleList, err
|
|
||||||
}
|
|
||||||
|
|
||||||
func (c *CasbinAuthz) GetRoleUserList(r *authz.RoleInfo) (userIDList []string, err error) {
|
|
||||||
// globals.SugarLogger.Debug(roleFullName)
|
|
||||||
userIDList, err = c.enforcer.GetUsersForRole(r.GetFullName())
|
|
||||||
if err == errors.ERR_NAME_NOT_FOUND {
|
|
||||||
err = nil
|
|
||||||
}
|
|
||||||
return userIDList, err
|
|
||||||
}
|
|
||||||
|
|
||||||
// func (c *CasbinAuthz) GetAllRoleList() (roleList []*authz.RoleInfo) {
|
|
||||||
// return authz.FullRoleName2RoleList(c.enforcer.GetAllRoles())
|
|
||||||
// }
|
|
||||||
@@ -1,7 +1,6 @@
|
|||||||
package cms
|
package cms
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"encoding/json"
|
|
||||||
"fmt"
|
"fmt"
|
||||||
"git.rosy.net.cn/baseapi/platformapi/mtunionapi"
|
"git.rosy.net.cn/baseapi/platformapi/mtunionapi"
|
||||||
"git.rosy.net.cn/baseapi/platformapi/tbunionapi"
|
"git.rosy.net.cn/baseapi/platformapi/tbunionapi"
|
||||||
@@ -10,8 +9,6 @@ import (
|
|||||||
"strconv"
|
"strconv"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"git.rosy.net.cn/baseapi/platformapi/ejyapi"
|
|
||||||
|
|
||||||
"git.rosy.net.cn/baseapi/utils"
|
"git.rosy.net.cn/baseapi/utils"
|
||||||
"git.rosy.net.cn/jx-callback/business/jxutils/jxcontext"
|
"git.rosy.net.cn/jx-callback/business/jxutils/jxcontext"
|
||||||
"git.rosy.net.cn/jx-callback/business/jxutils/tasksch"
|
"git.rosy.net.cn/jx-callback/business/jxutils/tasksch"
|
||||||
@@ -67,24 +64,6 @@ func InitServiceInfo(version string, buildTime time.Time, gitCommit string) {
|
|||||||
"operateType": model.OperateTypeName,
|
"operateType": model.OperateTypeName,
|
||||||
"apiFunctionName": model.ApiFunctionName,
|
"apiFunctionName": model.ApiFunctionName,
|
||||||
"vendorStatus": model.VendorStatus,
|
"vendorStatus": model.VendorStatus,
|
||||||
"jobLimitCountType": `[{
|
|
||||||
"id":` + utils.Int2Str(model.JobLimitCountTypePO) +
|
|
||||||
`,"value": "每人一次"
|
|
||||||
},{
|
|
||||||
"id":` + utils.Int2Str(model.JobLimitCountTypePDO) +
|
|
||||||
`,"value": "每人每天一次"
|
|
||||||
},{
|
|
||||||
"id":` + utils.Int2Str(model.JobLimitCountTypePWO) +
|
|
||||||
`,"value": "每人每周一次"
|
|
||||||
},{
|
|
||||||
"id":` + utils.Int2Str(model.JobLimitCountTypeNoLimit) +
|
|
||||||
`,"value": "不限次"
|
|
||||||
}]`,
|
|
||||||
"billTypeNames": model.BillTypeNames,
|
|
||||||
"deliveryStatusName": model.DeliveryStatusName,
|
|
||||||
"cashbackName": model.CashbackName,
|
|
||||||
"consumeName": model.ConsumeName,
|
|
||||||
"txWaybillNames": model.TxWaybillNames,
|
|
||||||
"unionActTypeNames": map[int]map[int]interface{}{
|
"unionActTypeNames": map[int]map[int]interface{}{
|
||||||
model.VendorIDMTWM: map[int]interface{}{
|
model.VendorIDMTWM: map[int]interface{}{
|
||||||
mtunionapi.ActTypeQB: "券包推广",
|
mtunionapi.ActTypeQB: "券包推广",
|
||||||
@@ -205,38 +184,3 @@ func UpdateConfig(ctx *jxcontext.Context, key, configType, value string) (hint s
|
|||||||
func QueryConfigs(key, configType, keyword string) (configList []*model.NewConfig, err error) {
|
func QueryConfigs(key, configType, keyword string) (configList []*model.NewConfig, err error) {
|
||||||
return dao.QueryConfigs(dao.GetDB(), key, configType, keyword)
|
return dao.QueryConfigs(dao.GetDB(), key, configType, keyword)
|
||||||
}
|
}
|
||||||
|
|
||||||
func EjyStationToStationInfo(station *ejyapi.GetStationListResult) (stationInfo *model.StationInfo) {
|
|
||||||
stationInfo = &model.StationInfo{
|
|
||||||
StationID: station.StationID,
|
|
||||||
StationName: station.StationName,
|
|
||||||
ProvinceName: station.ProvinceName,
|
|
||||||
ProvinceID: station.ProvinceID,
|
|
||||||
CityName: station.CityName,
|
|
||||||
Latitude: utils.Str2Float64(station.Latitude),
|
|
||||||
Longitude: utils.Str2Float64(station.Longitude),
|
|
||||||
Location: station.Location,
|
|
||||||
StarNum: station.StarNum,
|
|
||||||
Phone: station.Phone,
|
|
||||||
StationPic: station.StationPic,
|
|
||||||
StationBannerPic: station.StationBannerPic,
|
|
||||||
District: station.District,
|
|
||||||
CityID: station.CityID,
|
|
||||||
StationType: station.StationType,
|
|
||||||
}
|
|
||||||
if station.Prices != nil {
|
|
||||||
if data, err := json.Marshal(station.Prices); err == nil {
|
|
||||||
stationInfo.Prices = string(data)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if station.Adverts != nil {
|
|
||||||
if data, err := json.Marshal(station.Adverts); err == nil {
|
|
||||||
stationInfo.Adverts = string(data)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return stationInfo
|
|
||||||
}
|
|
||||||
|
|
||||||
func GetStationList(ctx *jxcontext.Context, stationName string, cityCode int, lat, lng float64, oilCode string, sortType, offset, pageSize int) (pageInfo *model.PagedInfo, err error) {
|
|
||||||
return dao.GetStationInfoList(dao.GetDB(), stationName, cityCode, lat, lng, oilCode, sortType, offset, pageSize)
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -1,287 +0,0 @@
|
|||||||
package cms
|
|
||||||
|
|
||||||
import (
|
|
||||||
"fmt"
|
|
||||||
"time"
|
|
||||||
|
|
||||||
"git.rosy.net.cn/jx-callback/business/jxutils/jxcontext"
|
|
||||||
"git.rosy.net.cn/jx-callback/business/model"
|
|
||||||
"git.rosy.net.cn/jx-callback/business/model/dao"
|
|
||||||
)
|
|
||||||
|
|
||||||
func GetMenu(ctx *jxcontext.Context, userID string) (menus []*model.Menu, err error) {
|
|
||||||
if userID == "" {
|
|
||||||
return dao.GetMenu(dao.GetDB(), "", 0, userID)
|
|
||||||
} else {
|
|
||||||
return dao.GetMenuWithUser(dao.GetDB(), "", 0, userID)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func AddMenu(ctx *jxcontext.Context, menu *model.Menu) (err error) {
|
|
||||||
var (
|
|
||||||
db = dao.GetDB()
|
|
||||||
)
|
|
||||||
if menu == nil {
|
|
||||||
return fmt.Errorf("添加失败!menu nil")
|
|
||||||
}
|
|
||||||
if menu.Name == "" || menu.Level == 0 {
|
|
||||||
return fmt.Errorf("添加失败!menu 名称和等级必须有值!")
|
|
||||||
}
|
|
||||||
menus, err := dao.GetMenu(db, menu.Name, menu.Level, "")
|
|
||||||
if len(menus) > 0 {
|
|
||||||
return fmt.Errorf("添加失败!已存在相同名称的 menu name : %v", menu.Name)
|
|
||||||
}
|
|
||||||
txDB, _ := dao.Begin(db)
|
|
||||||
defer func() {
|
|
||||||
if r := recover(); r != nil {
|
|
||||||
dao.Rollback(db, txDB)
|
|
||||||
panic(r)
|
|
||||||
}
|
|
||||||
}()
|
|
||||||
dao.WrapAddIDCULDEntity(menu, ctx.GetUserName())
|
|
||||||
err = dao.CreateEntity(db, menu)
|
|
||||||
dao.Commit(db, txDB)
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
func UpdateMenu(ctx *jxcontext.Context, menuID int, payload map[string]interface{}, isDelete bool) (num int64, err error) {
|
|
||||||
var (
|
|
||||||
db = dao.GetDB()
|
|
||||||
)
|
|
||||||
menu := &model.Menu{}
|
|
||||||
menu.ID = menuID
|
|
||||||
err = dao.GetEntity(db, menu)
|
|
||||||
if err != nil {
|
|
||||||
return 0, err
|
|
||||||
}
|
|
||||||
txDB, _ := dao.Begin(db)
|
|
||||||
defer func() {
|
|
||||||
if r := recover(); r != nil {
|
|
||||||
dao.Rollback(db, txDB)
|
|
||||||
panic(r)
|
|
||||||
}
|
|
||||||
}()
|
|
||||||
if !isDelete {
|
|
||||||
valid := dao.StrictMakeMapByStructObject(payload, menu, ctx.GetUserName())
|
|
||||||
if len(valid) > 0 {
|
|
||||||
if num, err = dao.UpdateEntityLogically(db, menu, valid, ctx.GetUserName(), nil); err != nil {
|
|
||||||
dao.Rollback(db, txDB)
|
|
||||||
return 0, err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
menu.DeletedAt = time.Now()
|
|
||||||
num, err = dao.UpdateEntity(db, menu, "DeletedAt")
|
|
||||||
}
|
|
||||||
dao.Commit(db, txDB)
|
|
||||||
return num, err
|
|
||||||
}
|
|
||||||
|
|
||||||
func GetRole(ctx *jxcontext.Context) (roles []*model.Role, err error) {
|
|
||||||
return dao.GetRole(dao.GetDB(), "")
|
|
||||||
}
|
|
||||||
|
|
||||||
func AddRole(ctx *jxcontext.Context, name string) (err error) {
|
|
||||||
var (
|
|
||||||
db = dao.GetDB()
|
|
||||||
)
|
|
||||||
roles, err := dao.GetRole(db, name)
|
|
||||||
if len(roles) > 0 {
|
|
||||||
return fmt.Errorf("添加失败!已存在相同名称的 role name : %v", name)
|
|
||||||
}
|
|
||||||
role := &model.Role{
|
|
||||||
Name: name,
|
|
||||||
}
|
|
||||||
txDB, _ := dao.Begin(db)
|
|
||||||
defer func() {
|
|
||||||
if r := recover(); r != nil {
|
|
||||||
dao.Rollback(db, txDB)
|
|
||||||
panic(r)
|
|
||||||
}
|
|
||||||
}()
|
|
||||||
dao.WrapAddIDCULDEntity(role, ctx.GetUserName())
|
|
||||||
err = dao.CreateEntity(db, role)
|
|
||||||
dao.Commit(db, txDB)
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
func UpdateRole(ctx *jxcontext.Context, roleID int, name string, isDelete bool) (num int64, err error) {
|
|
||||||
var (
|
|
||||||
db = dao.GetDB()
|
|
||||||
)
|
|
||||||
if roleID == 1 {
|
|
||||||
return 0, fmt.Errorf("管理员不允许修改!")
|
|
||||||
}
|
|
||||||
role := &model.Role{}
|
|
||||||
role.ID = roleID
|
|
||||||
err = dao.GetEntity(db, role)
|
|
||||||
if err != nil {
|
|
||||||
return 0, err
|
|
||||||
}
|
|
||||||
txDB, _ := dao.Begin(db)
|
|
||||||
defer func() {
|
|
||||||
if r := recover(); r != nil {
|
|
||||||
dao.Rollback(db, txDB)
|
|
||||||
panic(r)
|
|
||||||
}
|
|
||||||
}()
|
|
||||||
if !isDelete {
|
|
||||||
role.Name = name
|
|
||||||
role.UpdatedAt = time.Now()
|
|
||||||
role.LastOperator = ctx.GetUserName()
|
|
||||||
num, err = dao.UpdateEntity(db, role, "Name", "UpdatedAt", "LastOperator")
|
|
||||||
} else {
|
|
||||||
role.DeletedAt = time.Now()
|
|
||||||
num, err = dao.UpdateEntity(db, role, "DeletedAt")
|
|
||||||
}
|
|
||||||
dao.Commit(db, txDB)
|
|
||||||
return num, err
|
|
||||||
}
|
|
||||||
|
|
||||||
func GetUserRole(ctx *jxcontext.Context, userID string) (userRoles []*model.UserRole, err error) {
|
|
||||||
return dao.GetUserRole(dao.GetDB(), []string{userID}, nil)
|
|
||||||
}
|
|
||||||
|
|
||||||
func UpdateUserRole(ctx *jxcontext.Context, userIDs []string, roleIDs []int) (err error) {
|
|
||||||
var (
|
|
||||||
db = dao.GetDB()
|
|
||||||
roleIDMap = make(map[int]int)
|
|
||||||
nowRoleIDMap = make(map[int]int)
|
|
||||||
userRoleMap = make(map[string][]int)
|
|
||||||
addUserRoleMap = make(map[string][]int)
|
|
||||||
deleteUserRoleMap = make(map[string][]int)
|
|
||||||
)
|
|
||||||
for _, v := range roleIDs {
|
|
||||||
roleIDMap[v] = 1
|
|
||||||
}
|
|
||||||
userRoles, err := dao.GetUserRole(db, userIDs, nil)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
if len(userRoles) > 0 {
|
|
||||||
for _, v := range userRoles {
|
|
||||||
userRoleMap[v.UserID] = append(userRoleMap[v.UserID], v.RoleID)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
for _, userID := range userIDs {
|
|
||||||
nowRoleIDs := userRoleMap[userID]
|
|
||||||
for _, nowRoleID := range nowRoleIDs {
|
|
||||||
if roleIDMap[nowRoleID] == 0 {
|
|
||||||
deleteUserRoleMap[userID] = append(deleteUserRoleMap[userID], nowRoleID)
|
|
||||||
}
|
|
||||||
nowRoleIDMap[nowRoleID] = 1
|
|
||||||
}
|
|
||||||
for _, roleID := range roleIDMap {
|
|
||||||
if nowRoleIDMap[roleID] == 0 {
|
|
||||||
addUserRoleMap[userID] = append(addUserRoleMap[userID], roleID)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
txDB, _ := dao.Begin(db)
|
|
||||||
defer func() {
|
|
||||||
if r := recover(); r != nil {
|
|
||||||
dao.Rollback(db, txDB)
|
|
||||||
panic(r)
|
|
||||||
}
|
|
||||||
}()
|
|
||||||
if len(addUserRoleMap) > 0 {
|
|
||||||
for userID, roleIDs := range addUserRoleMap {
|
|
||||||
for _, roleID := range roleIDs {
|
|
||||||
userRole := &model.UserRole{
|
|
||||||
UserID: userID,
|
|
||||||
RoleID: roleID,
|
|
||||||
}
|
|
||||||
dao.WrapAddIDCULDEntity(userRole, ctx.GetUserName())
|
|
||||||
err = dao.CreateEntity(db, userRole)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if len(deleteUserRoleMap) > 0 {
|
|
||||||
for userID, roleIDs := range deleteUserRoleMap {
|
|
||||||
for _, roleID := range roleIDs {
|
|
||||||
userRoles, _ := dao.GetUserRole(db, []string{userID}, []int{roleID})
|
|
||||||
if len(userRoles) > 0 {
|
|
||||||
userRoles[0].DeletedAt = time.Now()
|
|
||||||
userRoles[0].LastOperator = ctx.GetUserName()
|
|
||||||
_, err = dao.UpdateEntity(db, userRoles[0], "DeletedAt", "LastOperator")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
dao.Commit(db, txDB)
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
func GetRoleMenu(ctx *jxcontext.Context, roleID int) (roleMenus []*model.RoleMenu, err error) {
|
|
||||||
return dao.GetRoleMenu(dao.GetDB(), []int{roleID}, nil)
|
|
||||||
}
|
|
||||||
|
|
||||||
func UpdateRoleMenu(ctx *jxcontext.Context, roleIDs, menuIDs []int) (err error) {
|
|
||||||
var (
|
|
||||||
db = dao.GetDB()
|
|
||||||
menuIDMap = make(map[int]int)
|
|
||||||
nowMenuIDMap = make(map[int]int)
|
|
||||||
roleMenuMap = make(map[int][]int)
|
|
||||||
addRoleMenuMap = make(map[int][]int)
|
|
||||||
deleteRoleMenuMap = make(map[int][]int)
|
|
||||||
)
|
|
||||||
for _, v := range menuIDs {
|
|
||||||
menuIDMap[v] = 1
|
|
||||||
}
|
|
||||||
roleMenus, err := dao.GetRoleMenu(db, roleIDs, nil)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
if len(roleMenus) > 0 {
|
|
||||||
for _, v := range roleMenus {
|
|
||||||
roleMenuMap[v.RoleID] = append(roleMenuMap[v.RoleID], v.MenuID)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
for _, roleID := range roleIDs {
|
|
||||||
nowMenuIDs := roleMenuMap[roleID]
|
|
||||||
for _, nowMenuID := range nowMenuIDs {
|
|
||||||
if menuIDMap[nowMenuID] == 0 {
|
|
||||||
deleteRoleMenuMap[roleID] = append(deleteRoleMenuMap[roleID], nowMenuID)
|
|
||||||
}
|
|
||||||
nowMenuIDMap[nowMenuID] = 1
|
|
||||||
}
|
|
||||||
for _, menuID := range menuIDMap {
|
|
||||||
if nowMenuIDMap[menuID] == 0 {
|
|
||||||
addRoleMenuMap[menuID] = append(addRoleMenuMap[menuID], menuID)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
txDB, _ := dao.Begin(db)
|
|
||||||
defer func() {
|
|
||||||
if r := recover(); r != nil {
|
|
||||||
dao.Rollback(db, txDB)
|
|
||||||
panic(r)
|
|
||||||
}
|
|
||||||
}()
|
|
||||||
if len(addRoleMenuMap) > 0 {
|
|
||||||
for roleID, menuIDs := range addRoleMenuMap {
|
|
||||||
for _, menuID := range menuIDs {
|
|
||||||
roleMenu := &model.RoleMenu{
|
|
||||||
RoleID: roleID,
|
|
||||||
MenuID: menuID,
|
|
||||||
}
|
|
||||||
dao.WrapAddIDCULDEntity(roleMenu, ctx.GetUserName())
|
|
||||||
err = dao.CreateEntity(db, roleMenu)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if len(deleteRoleMenuMap) > 0 {
|
|
||||||
for roleID, menuIDs := range deleteRoleMenuMap {
|
|
||||||
for _, menuID := range menuIDs {
|
|
||||||
roleMenus, _ := dao.GetRoleMenu(db, []int{roleID}, []int{menuID})
|
|
||||||
if len(roleMenus) > 0 {
|
|
||||||
roleMenus[0].DeletedAt = time.Now()
|
|
||||||
roleMenus[0].LastOperator = ctx.GetUserName()
|
|
||||||
_, err = dao.UpdateEntity(db, roleMenus[0], "DeletedAt", "LastOperator")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
dao.Commit(db, txDB)
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
@@ -92,6 +92,7 @@ func DoPrint(appID int, msgID, printNo, content string, orderNo int) (err error)
|
|||||||
var (
|
var (
|
||||||
db = dao.GetDB()
|
db = dao.GetDB()
|
||||||
)
|
)
|
||||||
|
//打印机必须绑定在该应用下才能打印
|
||||||
|
|
||||||
printMsg := &model.PrintMsg{
|
printMsg := &model.PrintMsg{
|
||||||
PrintNo: printNo,
|
PrintNo: printNo,
|
||||||
|
|||||||
@@ -1,9 +0,0 @@
|
|||||||
package cms
|
|
||||||
|
|
||||||
var (
|
|
||||||
textChan chan string
|
|
||||||
)
|
|
||||||
|
|
||||||
func TestTemp() {
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -11,7 +11,6 @@ import (
|
|||||||
"git.rosy.net.cn/jx-callback/business/jxutils/jxcontext"
|
"git.rosy.net.cn/jx-callback/business/jxutils/jxcontext"
|
||||||
"git.rosy.net.cn/jx-callback/business/model"
|
"git.rosy.net.cn/jx-callback/business/model"
|
||||||
"git.rosy.net.cn/jx-callback/business/model/dao"
|
"git.rosy.net.cn/jx-callback/business/model/dao"
|
||||||
"git.rosy.net.cn/jx-callback/globals"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
@@ -50,18 +49,6 @@ type JdUserStruct struct {
|
|||||||
type UserProvider struct {
|
type UserProvider struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (*UserProvider) GetUser(authID, authIDType string) (user auth2.IUser) {
|
|
||||||
globals.SugarLogger.Debugf("GetUser, authID:%s, authIDType:%s", authID, authIDType)
|
|
||||||
fieldName := authTypeFieldMap[authIDType]
|
|
||||||
if fieldName != "" {
|
|
||||||
user2, err := dao.GetUserByID(dao.GetDB(), fieldName, authID)
|
|
||||||
if err == nil {
|
|
||||||
user = user2 // 这样写的原因是golang nil的比较问题
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return user
|
|
||||||
}
|
|
||||||
|
|
||||||
func (*UserProvider) UpdateUserMobile(userID string, mobile string) (err error) {
|
func (*UserProvider) UpdateUserMobile(userID string, mobile string) (err error) {
|
||||||
_, err = dao.UpdateEntityLogically(dao.GetDB(), &model.User{}, map[string]interface{}{
|
_, err = dao.UpdateEntityLogically(dao.GetDB(), &model.User{}, map[string]interface{}{
|
||||||
"Mobile": mobile,
|
"Mobile": mobile,
|
||||||
@@ -110,10 +97,6 @@ func (*UserProvider) UpdateLastLogin(userID string, lastLoginType, fromIP string
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
func init() {
|
|
||||||
auth2.Init(userProvider)
|
|
||||||
}
|
|
||||||
|
|
||||||
func GetUserBindAuthInfo(ctx *jxcontext.Context) (authList []*model.AuthBind, err error) {
|
func GetUserBindAuthInfo(ctx *jxcontext.Context) (authList []*model.AuthBind, err error) {
|
||||||
authInfo, err := ctx.GetV2AuthInfo()
|
authInfo, err := ctx.GetV2AuthInfo()
|
||||||
if err == nil {
|
if err == nil {
|
||||||
@@ -134,28 +117,6 @@ func DisableUser(ctx *jxcontext.Context, userID string) (err error) {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
func GetUsers(ctx *jxcontext.Context, keyword string, userID string, pop int, mobile string, fromTime, toTime string, timeType int, cityCodes, consumeTypes []int, offset, pageSize int) (pagedInfo *model.PagedInfo, err error) {
|
|
||||||
return dao.GetUsers2(dao.GetDB(), keyword, userID, pop, mobile, utils.Str2Time(fromTime), utils.Str2Time(toTime), timeType, cityCodes, consumeTypes, offset, pageSize)
|
|
||||||
}
|
|
||||||
|
|
||||||
func GetUser(ctx *jxcontext.Context, userID string) (user *model.GetUserResult, err error) {
|
|
||||||
return dao.GetUser(dao.GetDB(), userID)
|
|
||||||
}
|
|
||||||
|
|
||||||
func checkUserType(userID string, userType int8) (err error) {
|
|
||||||
userList, _, err := dao.GetUsers(dao.GetDB(), 0, "", "", []string{userID}, nil, nil, 0, 0)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
if len(userList) == 0 {
|
|
||||||
return fmt.Errorf("找不到用户:%s", userID)
|
|
||||||
}
|
|
||||||
if userList[0].Type&userType == 0 {
|
|
||||||
return fmt.Errorf("用户:%s不能用于当前操作", userID)
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func DeleteUserDeliveryAddress(ctx *jxcontext.Context, userID string, addressID int) (err error) {
|
func DeleteUserDeliveryAddress(ctx *jxcontext.Context, userID string, addressID int) (err error) {
|
||||||
num, err := dao.DeleteEntityLogically(dao.GetDB(), &model.UserDeliveryAddress{}, nil, ctx.GetUserName(), map[string]interface{}{
|
num, err := dao.DeleteEntityLogically(dao.GetDB(), &model.UserDeliveryAddress{}, nil, ctx.GetUserName(), map[string]interface{}{
|
||||||
model.FieldID: addressID,
|
model.FieldID: addressID,
|
||||||
@@ -169,28 +130,6 @@ func DeleteUserDeliveryAddress(ctx *jxcontext.Context, userID string, addressID
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
func DeleteMyDeliveryAddress(ctx *jxcontext.Context, addressID int) (err error) {
|
|
||||||
_, userID := ctx.GetMobileAndUserID()
|
|
||||||
return DeleteUserDeliveryAddress(ctx, userID, addressID)
|
|
||||||
}
|
|
||||||
|
|
||||||
func QueryUserDeliveryAddress(ctx *jxcontext.Context, userIDs []string, offset, pageSize int) (pagedInfo *model.PagedInfo, err error) {
|
|
||||||
addressList, totalCount, err := dao.QueryUserDeliveryAddress(dao.GetDB(), 0, userIDs, 0, offset, pageSize)
|
|
||||||
if err == nil {
|
|
||||||
pagedInfo = &model.PagedInfo{
|
|
||||||
TotalCount: totalCount,
|
|
||||||
Data: addressList,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return pagedInfo, err
|
|
||||||
}
|
|
||||||
|
|
||||||
func QueryMyDeliveryAddress(ctx *jxcontext.Context, addType int) (addressList []*dao.UserDeliveryAddressEx, err error) {
|
|
||||||
_, userID := ctx.GetMobileAndUserID()
|
|
||||||
addressList, _, err = dao.QueryUserDeliveryAddress(dao.GetDB(), 0, []string{userID}, addType, 0, model.UnlimitedPageSize)
|
|
||||||
return addressList, err
|
|
||||||
}
|
|
||||||
|
|
||||||
func SaveUserCart(ctx *jxcontext.Context, userID string, storeID int, cartItems []*model.UserCartItem) (err error) {
|
func SaveUserCart(ctx *jxcontext.Context, userID string, storeID int, cartItems []*model.UserCartItem) (err error) {
|
||||||
if userID == "" || storeID == 0 {
|
if userID == "" || storeID == 0 {
|
||||||
return fmt.Errorf("用户与门店必须要指定")
|
return fmt.Errorf("用户与门店必须要指定")
|
||||||
@@ -241,20 +180,6 @@ func LoadUserCart(ctx *jxcontext.Context, userID string, storeIDs []int) (cartIt
|
|||||||
return cartItems, err
|
return cartItems, err
|
||||||
}
|
}
|
||||||
|
|
||||||
func RefreshUserMemberStatus(ctx *jxcontext.Context) (err error) {
|
|
||||||
var (
|
|
||||||
db = dao.GetDB()
|
|
||||||
)
|
|
||||||
userMembers, err := dao.GetUserMember(db, "", 0)
|
|
||||||
for _, userMember := range userMembers {
|
|
||||||
if time.Now().Sub(userMember.EndAt) > 0 {
|
|
||||||
userMember.DeletedAt = time.Now()
|
|
||||||
dao.UpdateEntity(db, userMember, "DeletedAt")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
type GetUserSerachKeywordResult struct {
|
type GetUserSerachKeywordResult struct {
|
||||||
AllSpan []*model.UserSearch `json:"allSpan"`
|
AllSpan []*model.UserSearch `json:"allSpan"`
|
||||||
UserSpan []*model.UserSearch `json:"userSpan"`
|
UserSpan []*model.UserSearch `json:"userSpan"`
|
||||||
|
|||||||
@@ -1,10 +1,8 @@
|
|||||||
package event
|
package event
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
|
||||||
"regexp"
|
"regexp"
|
||||||
"strings"
|
"strings"
|
||||||
"sync"
|
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"git.rosy.net.cn/baseapi/utils"
|
"git.rosy.net.cn/baseapi/utils"
|
||||||
@@ -12,8 +10,6 @@ import (
|
|||||||
"git.rosy.net.cn/jx-callback/business/jxutils/jxcontext"
|
"git.rosy.net.cn/jx-callback/business/jxutils/jxcontext"
|
||||||
"git.rosy.net.cn/jx-callback/business/model"
|
"git.rosy.net.cn/jx-callback/business/model"
|
||||||
"git.rosy.net.cn/jx-callback/business/model/dao"
|
"git.rosy.net.cn/jx-callback/business/model/dao"
|
||||||
"git.rosy.net.cn/jx-callback/globals"
|
|
||||||
"github.com/gorilla/websocket"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
@@ -23,161 +19,12 @@ var (
|
|||||||
"UpdateUser": "UpdateUser",
|
"UpdateUser": "UpdateUser",
|
||||||
}
|
}
|
||||||
regexpToken = regexp.MustCompile(`,"token":".*"`)
|
regexpToken = regexp.MustCompile(`,"token":".*"`)
|
||||||
wsClient = &WSClient{}
|
|
||||||
//广播频道(通道)
|
|
||||||
broadcast = make(chan *model.ImMessageRecord)
|
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
sysMessageTitle = ""
|
sysMessageTitle = ""
|
||||||
)
|
)
|
||||||
|
|
||||||
//连接的客户端,吧每个客户端都放进来
|
|
||||||
type WSClient struct {
|
|
||||||
Clients map[int]map[string]*websocket.Conn
|
|
||||||
ClientsHeart map[string]*websocket.Conn
|
|
||||||
s *sync.RWMutex
|
|
||||||
}
|
|
||||||
|
|
||||||
func init() {
|
|
||||||
clients := make(map[int]map[string]*websocket.Conn)
|
|
||||||
clientsHeart := make(map[string]*websocket.Conn)
|
|
||||||
wsClient.Clients = clients
|
|
||||||
wsClient.ClientsHeart = clientsHeart
|
|
||||||
wsClient.s = new(sync.RWMutex)
|
|
||||||
go handleMessages()
|
|
||||||
}
|
|
||||||
|
|
||||||
//广播推送消息
|
|
||||||
func handleMessages() {
|
|
||||||
for {
|
|
||||||
//读取通道中的消息
|
|
||||||
msg := <-broadcast
|
|
||||||
if msg.GroupID == 0 {
|
|
||||||
// globals.SugarLogger.Debugf("heart %v", utils.Format4Output(msg, false))
|
|
||||||
if wsClient.ClientsHeart[msg.UserID] != nil {
|
|
||||||
if err := wsClient.ClientsHeart[msg.UserID].WriteJSON(&model.ImMessageRecord{
|
|
||||||
Key: "pang",
|
|
||||||
}); err != nil {
|
|
||||||
globals.SugarLogger.Debugf("heart client.WriteJSON error: %v", err)
|
|
||||||
wsClient.ClientsHeart[msg.UserID].Close() //关闭
|
|
||||||
delete(wsClient.ClientsHeart, msg.UserID)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
globals.SugarLogger.Debugf("clients len %v", len(wsClient.Clients))
|
|
||||||
//循环map客户端
|
|
||||||
for userID, client := range wsClient.Clients[msg.GroupID] {
|
|
||||||
//把通道中的消息发送给客户端
|
|
||||||
user, err := dao.GetUser(dao.GetDB(), msg.UserID)
|
|
||||||
if err == nil {
|
|
||||||
msg.UserInfo = user
|
|
||||||
}
|
|
||||||
globals.SugarLogger.Debugf("msg %v", utils.Format4Output(msg, false))
|
|
||||||
if msg.CreatedAt == utils.ZeroTimeValue {
|
|
||||||
msg.CreatedAt = time.Now()
|
|
||||||
}
|
|
||||||
err = client.WriteJSON(msg)
|
|
||||||
if err != nil {
|
|
||||||
globals.SugarLogger.Debugf("client.WriteJSON error: %v", err)
|
|
||||||
client.Close() //关闭
|
|
||||||
delete(wsClient.Clients[msg.GroupID], userID)
|
|
||||||
// delete(clients, client) //删除map中的客户端
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func ImMessage(userID string, ws *websocket.Conn) (err error) {
|
|
||||||
var (
|
|
||||||
clientUser = make(map[string]*websocket.Conn)
|
|
||||||
db = dao.GetDB()
|
|
||||||
)
|
|
||||||
//将当前客户端放入map中
|
|
||||||
messageGroups, _ := dao.GetUserMessageGroups(dao.GetDB(), userID)
|
|
||||||
if len(messageGroups) == 0 {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
wsClient.s.Lock()
|
|
||||||
clientUser[userID] = ws
|
|
||||||
wsClient.ClientsHeart[userID] = ws
|
|
||||||
for _, v := range messageGroups {
|
|
||||||
if len(wsClient.Clients[v.GroupID]) > 0 {
|
|
||||||
wsClient.Clients[v.GroupID][userID] = ws
|
|
||||||
} else {
|
|
||||||
wsClient.Clients[v.GroupID] = clientUser
|
|
||||||
}
|
|
||||||
}
|
|
||||||
wsClient.s.Unlock()
|
|
||||||
globals.SugarLogger.Debugf("userID :%v ,clients :%v", userID, utils.Format4Output(wsClient.Clients, false))
|
|
||||||
|
|
||||||
var s *model.ImMessageRecord
|
|
||||||
for {
|
|
||||||
//接收客户端的消息
|
|
||||||
err := ws.ReadJSON(&s)
|
|
||||||
if err != nil {
|
|
||||||
globals.SugarLogger.Debugf("页面可能断开啦 ws.ReadJSON error: %v", err.Error())
|
|
||||||
for k, _ := range wsClient.Clients {
|
|
||||||
delete(wsClient.Clients[k], userID)
|
|
||||||
}
|
|
||||||
delete(wsClient.ClientsHeart, userID)
|
|
||||||
// delete(clients, ws) //删除map中的客户端
|
|
||||||
break //结束循环
|
|
||||||
} else {
|
|
||||||
//接受消息 业务逻辑
|
|
||||||
broadcast <- s
|
|
||||||
if s.GroupID != 0 {
|
|
||||||
if s.GroupID != model.SysGroupID {
|
|
||||||
//发聊天消息时,这个组所有的成员包括创建者都在userIDs里
|
|
||||||
userIDs := []string{}
|
|
||||||
if results, err := dao.GetMessageGroups(db, "", s.GroupID, 0, true, ""); err == nil {
|
|
||||||
for _, v := range results {
|
|
||||||
userIDs = append(userIDs, v.UserID)
|
|
||||||
for _, vv := range v.MessageGroupMembers {
|
|
||||||
userIDs = append(userIDs, vv.UserID)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
//如果这些人不在这个组的ws池子里就打上未读标记
|
|
||||||
for _, v := range userIDs {
|
|
||||||
if wsClient.ClientsHeart[v] == nil {
|
|
||||||
messageGroupReads, _ := dao.GetMessageGroupRead(db, v, s.GroupID)
|
|
||||||
for _, vv := range messageGroupReads {
|
|
||||||
vv.UnReadCount++
|
|
||||||
dao.UpdateEntity(db, vv, "UnReadCount")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if wsClient.ClientsHeart[s.ToUserID] == nil {
|
|
||||||
messageGroupReads, _ := dao.GetMessageGroupRead(db, s.ToUserID, s.GroupID)
|
|
||||||
for _, vv := range messageGroupReads {
|
|
||||||
vv.UnReadCount++
|
|
||||||
dao.UpdateEntity(db, vv, "UnReadCount")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
utils.CallFuncAsync(func() {
|
|
||||||
if s.GroupID != 0 {
|
|
||||||
dao.WrapAddIDCULDEntity(s, "")
|
|
||||||
dao.CreateEntity(db, s)
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
ws.Close()
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
func GetOnlineUserCount() (count int) {
|
|
||||||
wsClient.s.RLock()
|
|
||||||
count = len(wsClient.ClientsHeart)
|
|
||||||
wsClient.s.RUnlock()
|
|
||||||
return count
|
|
||||||
}
|
|
||||||
|
|
||||||
func AddOperateEvent(ctx *jxcontext.Context, accessUUID, jsonData string, errCode, errMsg string, useTime int, apiFunctionSpec string) (err error) {
|
func AddOperateEvent(ctx *jxcontext.Context, accessUUID, jsonData string, errCode, errMsg string, useTime int, apiFunctionSpec string) (err error) {
|
||||||
var (
|
var (
|
||||||
apiFunction string
|
apiFunction string
|
||||||
@@ -282,430 +129,3 @@ func GetOperateEvents(ctx *jxcontext.Context, name string, apiFunctions []string
|
|||||||
}
|
}
|
||||||
return pageInfo, err
|
return pageInfo, err
|
||||||
}
|
}
|
||||||
|
|
||||||
func CreateMessageGroup(ctx *jxcontext.Context, userID, userID2, groupName string, dividePercentage, quitPrice int) (messageGroupResult *dao.GetMessageGroupsResult, err error) {
|
|
||||||
var (
|
|
||||||
db = dao.GetDB()
|
|
||||||
groupID int
|
|
||||||
)
|
|
||||||
for {
|
|
||||||
groupID = jxutils.GenRand6()
|
|
||||||
temp := &model.MessageGroup{
|
|
||||||
GroupID: groupID,
|
|
||||||
}
|
|
||||||
dao.GetEntity(db, temp, "GroupID")
|
|
||||||
if temp.UserID == "" {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if userID2 != "" {
|
|
||||||
messageGroups, err := dao.GetMessageGroups(db, userID, 0, model.GroupTypeSingle, true, userID2)
|
|
||||||
if len(messageGroups) > 0 && len(messageGroups[0].MessageGroupMembers) > 0 {
|
|
||||||
return messageGroups[0], err
|
|
||||||
}
|
|
||||||
user, err := dao.GetUserByID(db, "user_id", userID2)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
if user == nil {
|
|
||||||
return nil, fmt.Errorf("无法找到要联系的用户!")
|
|
||||||
}
|
|
||||||
messageGroup := &model.MessageGroup{
|
|
||||||
GroupID: groupID,
|
|
||||||
UserID: userID,
|
|
||||||
// Name: user.Name,
|
|
||||||
Type: model.GroupTypeSingle,
|
|
||||||
MaxCount: 2,
|
|
||||||
}
|
|
||||||
messageGroupMember := &model.MessageGroupMember{
|
|
||||||
GroupID: groupID,
|
|
||||||
MemberUserID: userID2,
|
|
||||||
Type: model.GroupMemberTypeNormal,
|
|
||||||
}
|
|
||||||
dao.WrapAddIDCULDEntity(messageGroup, ctx.GetUserName())
|
|
||||||
dao.WrapAddIDCULDEntity(messageGroupMember, ctx.GetUserName())
|
|
||||||
err = dao.CreateEntity(db, messageGroup)
|
|
||||||
err = dao.CreateEntity(db, messageGroupMember)
|
|
||||||
if err == nil {
|
|
||||||
messageGroupRead := &model.MessageGroupRead{
|
|
||||||
GroupID: groupID,
|
|
||||||
UserID: userID,
|
|
||||||
}
|
|
||||||
dao.WrapAddIDCULEntity(messageGroupRead, ctx.GetUserName())
|
|
||||||
messageGroupRead2 := messageGroupRead
|
|
||||||
messageGroupRead2.UserID = userID2
|
|
||||||
dao.CreateEntity(db, messageGroupRead)
|
|
||||||
if err = dao.CreateEntity(db, messageGroupRead2); err == nil {
|
|
||||||
if messageGroupReads, err := dao.GetMessageGroupRead(db, userID2, model.SysGroupID); len(messageGroupReads) == 0 && err == nil {
|
|
||||||
messageGroupRead := &model.MessageGroupRead{
|
|
||||||
GroupID: model.SysGroupID,
|
|
||||||
UserID: userID2,
|
|
||||||
}
|
|
||||||
dao.WrapAddIDCULEntity(messageGroupRead, ctx.GetUserName())
|
|
||||||
dao.CreateEntity(db, messageGroupRead)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
userMembers, err := dao.GetUserMember(db, userID, model.MemberTypeNormal)
|
|
||||||
messageGroupsResult, err := dao.GetMessageGroups(db, userID, 0, model.GroupTypeMulit, false, "")
|
|
||||||
messageGroupMembers, err := dao.GetMessageGroupMembers(db, 0, model.GroupTypeMulit, userID)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
if len(userMembers) == 0 {
|
|
||||||
return nil, fmt.Errorf("抱歉,只有会员才能创建群聊!")
|
|
||||||
}
|
|
||||||
if len(messageGroupsResult) > 0 {
|
|
||||||
return nil, fmt.Errorf("您已经有群组了,请勿重复创建!群号为:%d", messageGroupsResult[0].GroupID)
|
|
||||||
}
|
|
||||||
if len(messageGroupMembers) > 0 {
|
|
||||||
return nil, fmt.Errorf("您已加入了[%v]群,请先退出后再创建!", messageGroupMembers[0].GroupID)
|
|
||||||
}
|
|
||||||
messageGroup := &model.MessageGroup{
|
|
||||||
GroupID: groupID,
|
|
||||||
UserID: userID,
|
|
||||||
Name: groupName,
|
|
||||||
Type: model.GroupTypeMulit,
|
|
||||||
MaxCount: 2000,
|
|
||||||
DividePercentage: dividePercentage,
|
|
||||||
QuitPrice: quitPrice,
|
|
||||||
}
|
|
||||||
user, err := dao.GetUserByID(db, "user_id", userID)
|
|
||||||
if groupName == "" {
|
|
||||||
messageGroup.Name = user.Name + "的集团"
|
|
||||||
}
|
|
||||||
dao.WrapAddIDCULDEntity(messageGroup, ctx.GetUserName())
|
|
||||||
if err = dao.CreateEntity(db, messageGroup); err == nil {
|
|
||||||
messageGroupRead := &model.MessageGroupRead{
|
|
||||||
GroupID: groupID,
|
|
||||||
UserID: userID,
|
|
||||||
}
|
|
||||||
dao.WrapAddIDCULEntity(messageGroupRead, ctx.GetUserName())
|
|
||||||
dao.CreateEntity(db, messageGroupRead)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if err == nil {
|
|
||||||
if messageGroupReads, err := dao.GetMessageGroupRead(db, userID, model.SysGroupID); len(messageGroupReads) == 0 && err == nil {
|
|
||||||
messageGroupRead := &model.MessageGroupRead{
|
|
||||||
GroupID: model.SysGroupID,
|
|
||||||
UserID: userID,
|
|
||||||
}
|
|
||||||
dao.WrapAddIDCULEntity(messageGroupRead, ctx.GetUserName())
|
|
||||||
dao.CreateEntity(db, messageGroupRead)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return messageGroupResult, err
|
|
||||||
}
|
|
||||||
|
|
||||||
func GetMessageGroupByUser(ctx *jxcontext.Context, userID string) (messageGroupResult []*dao.GetMessageGroupsResult, err error) {
|
|
||||||
var (
|
|
||||||
db = dao.GetDB()
|
|
||||||
)
|
|
||||||
messageGroups, err := dao.GetMessageGroups(db, "", model.SysGroupID, 0, false, "")
|
|
||||||
messageGroups2, err := dao.GetMessageGroups(db, userID, 0, 0, true, "")
|
|
||||||
messageGroups = append(messageGroups, messageGroups2...)
|
|
||||||
messageGroupMembers, err := dao.GetMessageGroupMembers(db, 0, 0, userID)
|
|
||||||
for _, v := range messageGroupMembers {
|
|
||||||
if messageGroupList, err := dao.GetMessageGroups(db, "", v.GroupID, 0, false, ""); err == nil {
|
|
||||||
messageGroups = append(messageGroups, messageGroupList...)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
for _, v := range messageGroups {
|
|
||||||
//是这个人创建的群聊,如果是单聊就返回对方的头像
|
|
||||||
if v.Type == model.GroupTypeSingle {
|
|
||||||
var userID2 string
|
|
||||||
if v.UserID == userID {
|
|
||||||
userID2 = v.MessageGroupMembers[0].MemberUserID
|
|
||||||
} else {
|
|
||||||
userID2 = userID
|
|
||||||
}
|
|
||||||
if user, err := dao.GetUserByID(db, "user_id", userID2); err == nil {
|
|
||||||
v.Avatar = user.Avatar
|
|
||||||
v.Name = user.Name
|
|
||||||
}
|
|
||||||
}
|
|
||||||
var (
|
|
||||||
imMessageRecord *model.ImMessageRecord
|
|
||||||
sql string
|
|
||||||
sqlParams = []interface{}{}
|
|
||||||
)
|
|
||||||
if v.GroupID != model.SysGroupID {
|
|
||||||
//最后一条记录和时间和人
|
|
||||||
sql = `
|
|
||||||
SELECT * FROM im_message_record WHERE group_id = ? ORDER BY created_at DESC LIMIT 1
|
|
||||||
`
|
|
||||||
sqlParams = append(sqlParams, v.GroupID)
|
|
||||||
} else {
|
|
||||||
//最后一条记录和时间和人
|
|
||||||
sql = `
|
|
||||||
SELECT * FROM im_message_record WHERE group_id = ? AND to_user_id = ? ORDER BY created_at DESC LIMIT 1
|
|
||||||
`
|
|
||||||
sqlParams = append(sqlParams, v.GroupID, userID)
|
|
||||||
}
|
|
||||||
if err = dao.GetRow(db, &imMessageRecord, sql, sqlParams); err == nil {
|
|
||||||
v.LastTime = imMessageRecord.CreatedAt
|
|
||||||
v.LastContent = imMessageRecord.Content
|
|
||||||
v.LastMessageType = imMessageRecord.MessageType
|
|
||||||
if user3, err := dao.GetUserByID(db, "user_id", imMessageRecord.UserID); err == nil {
|
|
||||||
v.LastUserName = user3.Name
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
err = nil
|
|
||||||
}
|
|
||||||
//该用户各组的未读消息数
|
|
||||||
var unReadCount int
|
|
||||||
if messageGroupReads, err := dao.GetMessageGroupRead(db, userID, v.GroupID); err == nil && len(messageGroupReads) > 0 {
|
|
||||||
for _, vv := range messageGroupReads {
|
|
||||||
unReadCount += vv.UnReadCount
|
|
||||||
}
|
|
||||||
}
|
|
||||||
v.UnReadMessageCount = unReadCount
|
|
||||||
}
|
|
||||||
return messageGroups, err
|
|
||||||
}
|
|
||||||
|
|
||||||
func AddMessageGroup(ctx *jxcontext.Context, groupID int, userID string) (err error) {
|
|
||||||
var (
|
|
||||||
db = dao.GetDB()
|
|
||||||
)
|
|
||||||
messageGroupMembers, err := dao.GetMessageGroupMembers(db, groupID, 0, userID)
|
|
||||||
messageGroupMembers3, err := dao.GetMessageGroupMembers(db, 0, 0, userID)
|
|
||||||
messageGroupsResult, err := dao.GetMessageGroups(db, userID, groupID, model.GroupTypeMulit, false, "")
|
|
||||||
messageGroupsResult2, err := dao.GetMessageGroups(db, "", groupID, model.GroupTypeMulit, false, "")
|
|
||||||
messageGroupsResult3, err := dao.GetMessageGroups(db, userID, 0, model.GroupTypeMulit, false, "")
|
|
||||||
messageGroupMembers2, err := dao.GetMessageGroupMembers(db, groupID, 0, "")
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
if len(messageGroupMembers) > 0 {
|
|
||||||
return fmt.Errorf("此用户已经在该群组中了!")
|
|
||||||
}
|
|
||||||
if len(messageGroupMembers3) > 0 {
|
|
||||||
return fmt.Errorf("您已经有群组[%v]了,不能申请加入其它群!", messageGroupMembers3[0].GroupID)
|
|
||||||
}
|
|
||||||
if len(messageGroupsResult) > 0 {
|
|
||||||
return fmt.Errorf("请不要加入自己创建的群!")
|
|
||||||
}
|
|
||||||
if len(messageGroupsResult2) > 0 && len(messageGroupMembers2) > 0 {
|
|
||||||
if len(messageGroupMembers2)+1 > messageGroupsResult2[0].MaxCount {
|
|
||||||
return fmt.Errorf("抱歉该群组已经满员了!")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if len(messageGroupsResult3) > 0 {
|
|
||||||
return fmt.Errorf("您已经拥有[%v]群了,不能再加入其它群!", messageGroupsResult3[0].GroupID)
|
|
||||||
}
|
|
||||||
|
|
||||||
messageGroupMember := &model.MessageGroupMember{
|
|
||||||
GroupID: groupID,
|
|
||||||
MemberUserID: userID,
|
|
||||||
Type: model.GroupMemberTypeNormal,
|
|
||||||
}
|
|
||||||
dao.WrapAddIDCULDEntity(messageGroupMember, ctx.GetUserName())
|
|
||||||
if err = dao.CreateEntity(db, messageGroupMember); err == nil {
|
|
||||||
messageGroupRead := &model.MessageGroupRead{
|
|
||||||
GroupID: groupID,
|
|
||||||
UserID: userID,
|
|
||||||
}
|
|
||||||
dao.WrapAddIDCULEntity(messageGroupRead, ctx.GetUserName())
|
|
||||||
if err = dao.CreateEntity(db, messageGroupRead); err == nil {
|
|
||||||
if messageGroupReads, err := dao.GetMessageGroupRead(db, userID, model.SysGroupID); len(messageGroupReads) == 0 && err == nil {
|
|
||||||
messageGroupRead := &model.MessageGroupRead{
|
|
||||||
GroupID: model.SysGroupID,
|
|
||||||
UserID: userID,
|
|
||||||
}
|
|
||||||
dao.WrapAddIDCULEntity(messageGroupRead, ctx.GetUserName())
|
|
||||||
dao.CreateEntity(db, messageGroupRead)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
func UpdateMessageGroup(ctx *jxcontext.Context, groupID int, payload map[string]interface{}) (num int64, err error) {
|
|
||||||
var (
|
|
||||||
db = dao.GetDB()
|
|
||||||
messageGroup = &model.MessageGroup{
|
|
||||||
GroupID: groupID,
|
|
||||||
}
|
|
||||||
)
|
|
||||||
if err = dao.GetEntity(db, messageGroup, "GroupID"); err != nil {
|
|
||||||
return 0, err
|
|
||||||
}
|
|
||||||
if messageGroup.UserID != ctx.GetUserID() {
|
|
||||||
return 0, fmt.Errorf("只有群主才能修改群信息!")
|
|
||||||
}
|
|
||||||
valid := dao.StrictMakeMapByStructObject(payload, messageGroup, ctx.GetUserName())
|
|
||||||
if len(valid) > 0 {
|
|
||||||
txDB, _ := dao.Begin(db)
|
|
||||||
defer func() {
|
|
||||||
if r := recover(); r != nil {
|
|
||||||
dao.Rollback(db, txDB)
|
|
||||||
panic(r)
|
|
||||||
}
|
|
||||||
}()
|
|
||||||
if num, err = dao.UpdateEntityLogically(db, messageGroup, valid, ctx.GetUserName(), nil); err != nil {
|
|
||||||
dao.Rollback(db, txDB)
|
|
||||||
return 0, err
|
|
||||||
}
|
|
||||||
dao.Commit(db, txDB)
|
|
||||||
}
|
|
||||||
return num, err
|
|
||||||
}
|
|
||||||
|
|
||||||
func TransferMessageGroupMaster(ctx *jxcontext.Context, groupID int, userID string) (err error) {
|
|
||||||
var (
|
|
||||||
db = dao.GetDB()
|
|
||||||
messageGroup = &model.MessageGroup{
|
|
||||||
GroupID: groupID,
|
|
||||||
}
|
|
||||||
)
|
|
||||||
if err = dao.GetEntity(db, messageGroup, "GroupID"); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
if messageGroup.UserID != ctx.GetUserID() {
|
|
||||||
return fmt.Errorf("只有群主才能转让群主!")
|
|
||||||
}
|
|
||||||
//群主换成选的那个人
|
|
||||||
messageGroup.UserID = userID
|
|
||||||
messageGroup.LastOperator = ctx.GetUserName()
|
|
||||||
//之前那个群成员换成之前的群主
|
|
||||||
messageGroupMembers, err := dao.GetMessageGroupMembers(db, groupID, 0, userID)
|
|
||||||
if err != nil && len(messageGroupMembers) == 0 {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
messageGroupMember := messageGroupMembers[0]
|
|
||||||
messageGroupMember.MemberUserID = ctx.GetUserID()
|
|
||||||
messageGroupMember.LastOperator = ctx.GetUserName()
|
|
||||||
txDB, _ := dao.Begin(db)
|
|
||||||
defer func() {
|
|
||||||
if r := recover(); r != nil {
|
|
||||||
dao.Rollback(db, txDB)
|
|
||||||
panic(r)
|
|
||||||
}
|
|
||||||
}()
|
|
||||||
if _, err = dao.UpdateEntity(db, messageGroup, "UserID", "LastOperator"); err != nil {
|
|
||||||
dao.Rollback(db, txDB)
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
if _, err = dao.UpdateEntity(db, messageGroupMember, "MemberUserID", "LastOperator"); err != nil {
|
|
||||||
dao.Rollback(db, txDB)
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
dao.Commit(db, txDB)
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
func SendSysMessageSimple(content, toUserID string) (err error) {
|
|
||||||
return SendSysMessage(jxcontext.AdminCtx, &model.ImMessageRecord{
|
|
||||||
Content: sysMessageTitle + " " + content,
|
|
||||||
ToUserID: toUserID,
|
|
||||||
GroupID: model.SysGroupID,
|
|
||||||
MessageType: 1, // 普通文字消息
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
func SendSysMessage(ctx *jxcontext.Context, imMessageRecord *model.ImMessageRecord) (err error) {
|
|
||||||
var (
|
|
||||||
db = dao.GetDB()
|
|
||||||
userID = imMessageRecord.ToUserID
|
|
||||||
groupID = imMessageRecord.GroupID
|
|
||||||
)
|
|
||||||
if groupID != model.SysGroupID {
|
|
||||||
return fmt.Errorf("只能给系统组发消息!")
|
|
||||||
}
|
|
||||||
imMessageRecord.CreatedAt = time.Now()
|
|
||||||
imMessageRecord.LastOperator = ctx.GetUserName()
|
|
||||||
imMessageRecord.DeletedAt = utils.DefaultTimeValue
|
|
||||||
imMessageRecord.UpdatedAt = utils.DefaultTimeValue
|
|
||||||
imMessageRecord.Seq = time.Now().Unix()
|
|
||||||
err = dao.CreateEntity(db, imMessageRecord)
|
|
||||||
if userID == "" {
|
|
||||||
//循环map客户端
|
|
||||||
for _, client := range wsClient.Clients[groupID] {
|
|
||||||
globals.SugarLogger.Debugf("msg %v", utils.Format4Output(imMessageRecord, false))
|
|
||||||
err = client.WriteJSON(imMessageRecord)
|
|
||||||
if err != nil {
|
|
||||||
globals.SugarLogger.Debugf("client.WriteJSON error: %v", err)
|
|
||||||
client.Close() //关闭
|
|
||||||
// delete(wsClient.Clients[msg.GroupID], userID)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
client := wsClient.Clients[groupID][userID]
|
|
||||||
globals.SugarLogger.Debugf("msg %v", utils.Format4Output(imMessageRecord, false))
|
|
||||||
if client == nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
err = client.WriteJSON(imMessageRecord)
|
|
||||||
if err != nil {
|
|
||||||
globals.SugarLogger.Debugf("client.WriteJSON error: %v", err)
|
|
||||||
client.Close() //关闭
|
|
||||||
// delete(wsClient.Clients[msg.GroupID], userID)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
func DeleteMessageRecord(ctx *jxcontext.Context) (err error) {
|
|
||||||
var (
|
|
||||||
db = dao.GetDB()
|
|
||||||
)
|
|
||||||
sql := `
|
|
||||||
DELETE FROM im_message_record WHERE created_at < ? AND group_id <> ?
|
|
||||||
`
|
|
||||||
sqlParams := []interface{}{
|
|
||||||
time.Now().AddDate(0, 0, -3), model.SysGroupID,
|
|
||||||
}
|
|
||||||
_, err = dao.ExecuteSQL(db, sql, sqlParams)
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
func UpdateUserMessageGroupRead(ctx *jxcontext.Context, reads []*model.MessageGroupRead) (err error) {
|
|
||||||
var (
|
|
||||||
db = dao.GetDB()
|
|
||||||
userID = ctx.GetUserID()
|
|
||||||
)
|
|
||||||
for _, v := range reads {
|
|
||||||
if messageReads, err := dao.GetMessageGroupRead(db, userID, v.GroupID); err == nil {
|
|
||||||
if len(messageReads) > 0 {
|
|
||||||
messageReads[0].UnReadCount += v.UnReadCount
|
|
||||||
dao.UpdateEntity(db, messageReads[0], "UnReadCount")
|
|
||||||
} else {
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
type GetUserStatisticsResult struct {
|
|
||||||
RegisterUserCount int `json:"registerUserCount"` //注册数
|
|
||||||
OnlineUserCount int `json:"onlineUserCount"` //在线用户数
|
|
||||||
ConsumeUserCount int `json:"consumeUserCount"` //消费用户数
|
|
||||||
MemberUserCount int `json:"memberUserCount"` //会员用户数
|
|
||||||
}
|
|
||||||
|
|
||||||
func GetUserStatistics(ctx *jxcontext.Context) (getUserStatisticsResult *GetUserStatisticsResult, err error) {
|
|
||||||
var (
|
|
||||||
db = dao.GetDB()
|
|
||||||
)
|
|
||||||
getUserStatisticsResult = &GetUserStatisticsResult{}
|
|
||||||
sql := `
|
|
||||||
SELECT a.member_user_count, b.consume_user_count FROM
|
|
||||||
( SELECT DISTINCT COUNT(a.user_id) member_user_count
|
|
||||||
FROM user a
|
|
||||||
JOIN user_member b ON a.user_id = b.user_id AND b.deleted_at = ? )a,
|
|
||||||
( SELECT DISTINCT COUNT(a.user_id) consume_user_count
|
|
||||||
FROM user a
|
|
||||||
JOIN ` + "`order`" + `b ON a.user_id = b.user_id AND b.status = ?)b
|
|
||||||
`
|
|
||||||
sqlParams := []interface{}{
|
|
||||||
utils.DefaultTimeValue, model.OrderStatusFinished,
|
|
||||||
}
|
|
||||||
err = dao.GetRow(db, &getUserStatisticsResult, sql, sqlParams)
|
|
||||||
paged, _ := dao.GetUsers2(db, "", "", 0, "", utils.ZeroTimeValue, utils.ZeroTimeValue, 0, nil, nil, 0, -1)
|
|
||||||
getUserStatisticsResult.RegisterUserCount = paged.TotalCount
|
|
||||||
getUserStatisticsResult.OnlineUserCount = GetOnlineUserCount()
|
|
||||||
return getUserStatisticsResult, err
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -1 +0,0 @@
|
|||||||
package financial
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
package financial
|
|
||||||
@@ -1,162 +0,0 @@
|
|||||||
package initdata
|
|
||||||
|
|
||||||
import (
|
|
||||||
"fmt"
|
|
||||||
|
|
||||||
"git.rosy.net.cn/baseapi/platformapi/autonavi"
|
|
||||||
"git.rosy.net.cn/baseapi/utils"
|
|
||||||
"git.rosy.net.cn/jx-callback/business/jxutils/jxcontext"
|
|
||||||
"git.rosy.net.cn/jx-callback/business/model"
|
|
||||||
"git.rosy.net.cn/jx-callback/business/model/dao"
|
|
||||||
"git.rosy.net.cn/jx-callback/globals/api"
|
|
||||||
)
|
|
||||||
|
|
||||||
func TruncateTable(db *dao.DaoDB, tableName string) (err error) {
|
|
||||||
_, err = dao.ExecuteSQL(db, "TRUNCATE TABLE "+tableName)
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
func insertPlace(ctx *jxcontext.Context, db *dao.DaoDB, parent *autonavi.District, placeList []*autonavi.District) (err error) {
|
|
||||||
for _, v := range placeList {
|
|
||||||
if v.Level <= autonavi.DistrictLevelDistrict {
|
|
||||||
place := &model.Place{
|
|
||||||
Code: int(utils.Str2Int64(v.Adcode)),
|
|
||||||
Name: v.Name,
|
|
||||||
Level: int8(v.Level),
|
|
||||||
TelCode: v.CityCode,
|
|
||||||
Enabled: 1,
|
|
||||||
}
|
|
||||||
if parent != nil {
|
|
||||||
place.ParentCode = int(utils.Str2Int64(parent.Adcode))
|
|
||||||
}
|
|
||||||
dao.WrapAddIDCULEntity(place, ctx.GetUserName())
|
|
||||||
if err = dao.CreateEntity(db, place); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
if err = insertPlace(ctx, db, v, v.Districts); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func InitPlace(ctx *jxcontext.Context) (err error) {
|
|
||||||
placeList, err2 := api.AutonaviAPI.GetDistricts(autonavi.DistrictLevelDistrict, "")
|
|
||||||
if err = err2; err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
placeList = placeList[0].Districts
|
|
||||||
db := dao.GetDB()
|
|
||||||
txDB, _ := dao.Begin(db)
|
|
||||||
defer func() {
|
|
||||||
if r := recover(); r != nil || err != nil {
|
|
||||||
dao.Rollback(db, txDB)
|
|
||||||
if r != nil {
|
|
||||||
panic(r)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}()
|
|
||||||
if _, err = dao.ExecuteSQL(db, `
|
|
||||||
DELETE t1
|
|
||||||
FROM place t1
|
|
||||||
WHERE code < 9000000;
|
|
||||||
`); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
if err = insertPlace(ctx, db, nil, placeList); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
dao.Commit(db, txDB)
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
func UploadImg4Vendors(ctx *jxcontext.Context, isAsync, isContinueWhenError bool) (hint string, err error) {
|
|
||||||
// db := dao.GetDB()
|
|
||||||
// rootTask := tasksch.NewSeqTask("合并SkuName图片至DataResource", ctx,
|
|
||||||
// func(task *tasksch.SeqTask, step int, params ...interface{}) (result interface{}, err error) {
|
|
||||||
// switch step {
|
|
||||||
// case 0: // 计算SkuName中缺失的hashCode(注意是DescImg不是Img)
|
|
||||||
// var skuNameList []*model.SkuName
|
|
||||||
// if err = dao.GetRows(db, &skuNameList, `
|
|
||||||
// SELECT t1.*
|
|
||||||
// FROM sku_name t1
|
|
||||||
// WHERE t1.desc_img <> '' AND t1.img_hash_code = ''
|
|
||||||
// `); err == nil && len(skuNameList) > 0 {
|
|
||||||
// calcTask := tasksch.NewParallelTask("UploadImg4Vendors calc hashCode",
|
|
||||||
// tasksch.NewParallelConfig().SetIsContinueWhenError(isContinueWhenError).SetParallelCount(5), ctx,
|
|
||||||
// func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) {
|
|
||||||
// skuName := batchItemList[0].(*model.SkuName)
|
|
||||||
// _, skuName.ImgHashCode, err = jxutils.DownloadFileByURL(skuName.DescImg)
|
|
||||||
// if err == nil {
|
|
||||||
// dao.UpdateEntity(db, skuName, "ImgHashCode")
|
|
||||||
// }
|
|
||||||
// return retVal, err
|
|
||||||
// }, skuNameList)
|
|
||||||
// tasksch.HandleTask(calcTask, task, false).Run()
|
|
||||||
// _, err = calcTask.GetResult(0)
|
|
||||||
// }
|
|
||||||
// case 1: // 从SkuName添加缺失的图片至DataResource
|
|
||||||
// _, err = dao.ExecuteSQL(db, `
|
|
||||||
// INSERT INTO data_resource(created_at, updated_at, last_operator, hash_code,
|
|
||||||
// resource_type, name, main_url, ebai_url, qiniu_url, use_type)
|
|
||||||
// SELECT t1.created_at, t1.created_at, t1.last_operator, t1.img_hash_code,
|
|
||||||
// CASE
|
|
||||||
// WHEN INSTR(t1.desc_img, ".jpg") > 0 OR INSTR(t1.desc_img, ".jpeg") > 0 THEN
|
|
||||||
// 'image/jpeg'
|
|
||||||
// WHEN INSTR(t1.desc_img, ".png") > 0 OR INSTR(t1.desc_img, ".peg") > 0 THEN
|
|
||||||
// 'image/png'
|
|
||||||
// WHEN INSTR(t1.desc_img, ".gif") THEN
|
|
||||||
// 'image/gif'
|
|
||||||
// ELSE
|
|
||||||
// ''
|
|
||||||
// END resource_type,
|
|
||||||
// CONCAT(t1.name, '_desc'), desc_img main_url, t1.desc_img_ebai ebai_url,
|
|
||||||
// IF(INSTR(t1.desc_img, "image.jxc4.com") > 0, t1.desc_img, '') qiniu_url, 2
|
|
||||||
// FROM sku_name t1
|
|
||||||
// JOIN (
|
|
||||||
// SELECT img_hash_code, MAX(id) id, COUNT(*) ct
|
|
||||||
// FROM sku_name
|
|
||||||
// WHERE img_hash_code <> '' AND desc_img <> ''
|
|
||||||
// GROUP BY 1
|
|
||||||
// ) t3 ON t3.id = t1.id
|
|
||||||
// LEFT JOIN data_resource t2 ON (t2.main_url <> '' AND t2.main_url = t1.desc_img)
|
|
||||||
// WHERE t1.desc_img <> '' AND t1.img_hash_code <> '' AND t2.id IS NULL;
|
|
||||||
// `)
|
|
||||||
// case 2: // 统一SkuName中同hashCode,不同图片地址至同一地址
|
|
||||||
// _, err = dao.ExecuteSQL(db, `
|
|
||||||
// UPDATE sku_name t1
|
|
||||||
// JOIN data_resource t2 ON t2.hash_code = t1.img_hash_code AND t2.main_url <> ''
|
|
||||||
// SET t1.desc_img = t2.main_url
|
|
||||||
// WHERE t1.img_hash_code <> '' AND t1.desc_img <> t2.main_url;
|
|
||||||
// `)
|
|
||||||
// case 3: // 上传DataResource中缺失的平台图片
|
|
||||||
// dataResList, err2 := dao.GetNeedUploadDataResource(db)
|
|
||||||
// if err = err2; err == nil && len(dataResList) > 0 {
|
|
||||||
// uploadTask := tasksch.NewParallelTask("批量上传图片至平台",
|
|
||||||
// tasksch.NewParallelConfig().SetIsContinueWhenError(isContinueWhenError).SetParallelCount(2), ctx,
|
|
||||||
// func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) {
|
|
||||||
// dataRes := batchItemList[0].(*model.DataResource)
|
|
||||||
// _, err = datares.UploadImage2Vendors(ctx, task, dataRes, nil, false)
|
|
||||||
// return nil, err
|
|
||||||
// }, dataResList)
|
|
||||||
// tasksch.HandleTask(uploadTask, task, true).Run()
|
|
||||||
// _, err = uploadTask.GetResult(0)
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// return result, err
|
|
||||||
// }, 4)
|
|
||||||
// tasksch.HandleTask(rootTask, nil, true).Run()
|
|
||||||
// if !isAsync {
|
|
||||||
// if _, err = rootTask.GetResult(0); err == nil {
|
|
||||||
// hint = "1"
|
|
||||||
// }
|
|
||||||
// } else {
|
|
||||||
// hint = rootTask.ID
|
|
||||||
// }
|
|
||||||
return hint, err
|
|
||||||
}
|
|
||||||
|
|
||||||
func getSkuNameKey(prefix, name, comment, specUnit, unit string, specQuality float32) string {
|
|
||||||
return fmt.Sprintf("%s-%s-%f-%s-%s", prefix, name, specQuality, specUnit, unit)
|
|
||||||
}
|
|
||||||
@@ -7,7 +7,6 @@ import (
|
|||||||
"git.rosy.net.cn/baseapi/utils"
|
"git.rosy.net.cn/baseapi/utils"
|
||||||
"git.rosy.net.cn/jx-callback/business/auth2"
|
"git.rosy.net.cn/jx-callback/business/auth2"
|
||||||
"git.rosy.net.cn/jx-callback/business/model"
|
"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"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -163,14 +162,3 @@ func (ctx *Context) GetUserID() (userID string) {
|
|||||||
}
|
}
|
||||||
return userID
|
return userID
|
||||||
}
|
}
|
||||||
|
|
||||||
func (ctx *Context) GetFullUser() (user *model.User) {
|
|
||||||
token := ctx.GetToken()
|
|
||||||
authInfo, err2 := auth2.GetTokenInfo(token)
|
|
||||||
if err2 == nil {
|
|
||||||
if authInfo.TokenType == auth2.TokenTypeNormal {
|
|
||||||
user, _ = dao.GetUserByID(dao.GetDB(), "user_id", authInfo.GetID())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return user
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -1,95 +0,0 @@
|
|||||||
package push
|
|
||||||
|
|
||||||
import (
|
|
||||||
"fmt"
|
|
||||||
"strings"
|
|
||||||
|
|
||||||
"git.rosy.net.cn/baseapi/platformapi/unipushapi"
|
|
||||||
"git.rosy.net.cn/baseapi/utils"
|
|
||||||
"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"
|
|
||||||
"github.com/astaxie/beego"
|
|
||||||
)
|
|
||||||
|
|
||||||
func pushToSingle(content, title string, storeID int) {
|
|
||||||
var (
|
|
||||||
db = dao.GetDB()
|
|
||||||
)
|
|
||||||
if !globals.IsProductEnv() {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
storePushs, err := dao.GetStorePushClient(db, storeID, "")
|
|
||||||
if err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
for _, v := range storePushs {
|
|
||||||
|
|
||||||
status, err2 := api.PushAPI.PushToSingle(v.ClientID, false, &unipushapi.Notification{
|
|
||||||
Title: title,
|
|
||||||
Body: content,
|
|
||||||
})
|
|
||||||
if err = err2; err != nil {
|
|
||||||
globals.SugarLogger.Debugf("NotifyNewOrder push error: [%v]", err)
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
if status == unipushapi.SuccessOffLine {
|
|
||||||
_, err = api.PushAPI.PushToSingle(v.ClientID, true, &unipushapi.Notification{
|
|
||||||
Body: content,
|
|
||||||
})
|
|
||||||
if err != nil {
|
|
||||||
globals.SugarLogger.Debugf("NotifyNewOrder push2 error: [%v]", err)
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func NotifyNewOrder(order *model.GoodsOrder) {
|
|
||||||
globals.SugarLogger.Debugf("NotifyNewOrder push begin orderID :[%v]", order.VendorOrderID)
|
|
||||||
sb := new(strings.Builder)
|
|
||||||
sb.WriteString("老板,")
|
|
||||||
sb.WriteString(order.ConsigneeName)
|
|
||||||
sb.WriteString("购买了商品")
|
|
||||||
sb.WriteString(getOrderDetailBrief(order))
|
|
||||||
pushToSingle(sb.String(), "京西菜市新订单推送", jxutils.GetSaleStoreIDFromOrder(order))
|
|
||||||
}
|
|
||||||
|
|
||||||
func getOrderDetailBrief(order *model.GoodsOrder) (brief string) {
|
|
||||||
sb := new(strings.Builder)
|
|
||||||
sb.WriteString(order.Skus[0].SkuName)
|
|
||||||
sb.WriteString("等共")
|
|
||||||
sb.WriteString(utils.Int2Str(order.Skus[0].Count))
|
|
||||||
sb.WriteString("份(")
|
|
||||||
sb.WriteString(jxutils.IntPrice2StandardString(order.Skus[0].SalePrice))
|
|
||||||
sb.WriteString("元/份)等,预计收入")
|
|
||||||
//TODO 2020-07-20 果园和菜市不同
|
|
||||||
var price int64
|
|
||||||
if beego.BConfig.RunMode == "jxgy" {
|
|
||||||
price = order.EarningPrice
|
|
||||||
} else {
|
|
||||||
if order.EarningType == model.EarningTypePoints {
|
|
||||||
price = order.ActualPayPrice
|
|
||||||
} else {
|
|
||||||
price = order.ShopPrice
|
|
||||||
}
|
|
||||||
}
|
|
||||||
sb.WriteString(jxutils.IntPrice2StandardString(price))
|
|
||||||
sb.WriteString("元")
|
|
||||||
return sb.String()
|
|
||||||
}
|
|
||||||
|
|
||||||
func NotifyAfsOrder(afsOrder *model.AfsOrder) (err error) {
|
|
||||||
globals.SugarLogger.Debugf("NotifyAfsOrder push begin orderID :[%v]", afsOrder.VendorOrderID)
|
|
||||||
pushToSingle("老板,您有新的售后单,请尽快处理!", "京西菜市售后单推送", jxutils.GetSaleStoreIDFromAfsOrder(afsOrder))
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
func NotifyOrderCanceled(order *model.GoodsOrder) (err error) {
|
|
||||||
title := fmt.Sprintf("老板,您的订单%s第%d号订单, %s被取消了!", model.VendorChineseNames[order.VendorID], order.OrderSeq, order.VendorOrderID)
|
|
||||||
pushToSingle(title, "京西菜市取消单推送", jxutils.GetSaleStoreIDFromOrder(order))
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
@@ -1,122 +0,0 @@
|
|||||||
package weixinmsg
|
|
||||||
|
|
||||||
import (
|
|
||||||
"fmt"
|
|
||||||
|
|
||||||
"git.rosy.net.cn/baseapi/utils"
|
|
||||||
"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"
|
|
||||||
)
|
|
||||||
|
|
||||||
const (
|
|
||||||
WX_TO_ORDER_PAGE_URL = "/#/?jxStoreId="
|
|
||||||
WX_TO_STORE_SKU_PAGE_URL = "/#/shop?jxStoreId="
|
|
||||||
WX_TO_SHOW_COMMENTS_DETAIL_URL = "/#/assess-list?jxStoreId=" //展示差评详情的页面
|
|
||||||
WX_TO_SHOW_MSG = "/#/message-detail?msgID=%d&msgStatusID=%d"
|
|
||||||
|
|
||||||
WX_MINI_TO_ORDER_PAGE_URL = "pages/order-manager/main"
|
|
||||||
WX_MINI_TO_STORE_SKU_PAGE_URL = "pages/goods-manager/main"
|
|
||||||
WX_MINI_TO_SHOW_COMMENTS_DETAIL_URL = "pages/pagesStore/store-comment/main"
|
|
||||||
WX_MINI_TO_SHOW_MSG = "pages/pagesStore/msg-page/main?msgID=%d&msgStatusID=%d"
|
|
||||||
|
|
||||||
//新订单模板消息文字颜色
|
|
||||||
WX_NEW_ORDER_TEMPLATE_COLOR = "#173177"
|
|
||||||
WX_HIGHLEVEL_TEMPLATE_COLOR = "#FF0000" //红色
|
|
||||||
WX_HIGHLEVEL_TEMPLATE_COLOR2 = "#333333" //黑色
|
|
||||||
WX_TEMPLATE_VENDERCOLOR_JDDJ = "#47B34F"
|
|
||||||
WX_TEMPLATE_VENDERCOLOR_MT = "#F4A800"
|
|
||||||
WX_TEMPLATE_VENDERCOLOR_ELM = "#0191EA" //蓝色
|
|
||||||
WX_TEMPLATE_VENDERCOLOR_BAD_COMMENTS = "#4F4DA0"
|
|
||||||
|
|
||||||
WX_NEWORDER_TEMPLATE_ID = "_DtNGwmOeR6TkkTVUblxLIlkV2MAPOX57TkvfdqG6nY" //微信新订单推送
|
|
||||||
WX_ADJUSTORDER_TEMPLATE_ID = "N5rmV2-PDf3opjkv23IdLc76VnFThr_uOKSh5FzT13M" //微信调整订单推送
|
|
||||||
WX_MTPS_DELIVERY_GRABDONE_TEMPLATE_ID = "h4dkON6AgnHz1XmaksEUB_8Bcir4V8MSexUhC149pPE" //微信美团配送员接单推送
|
|
||||||
WX_MTPS_DELIVERY_DONE_TEMPLATE_ID = "YXdCrQAHZlcZX1htYUiarrLmtkmKAjp7rynjwObgODo" //微信美团配送员配送完成推送
|
|
||||||
WX_MTPS_UNABLE_DELIVER_TEMPLATE_ID = "ZFph5Hp7oLlrzVRXbsKIC_StmaBeB9Dlp4tlHeAmUQ8" //微信美团配送配送能力不足推送
|
|
||||||
WX_MTPS_DELIVERY_EXCEPTION_TEMPLATE_ID = "RkfOFHgR1N75L4-a6Gv0DljpCsVfOHhLm_vyXh8MR-w" //微信美团配送异常推送
|
|
||||||
WX_BAD_COMMENT_PUSH_TEMPLATE_ID = "NaMEzjctvVPQ9ishTI1dKpp5QSYV2FWcWftSSjDrpN8" //微信中差评消息推送
|
|
||||||
|
|
||||||
WX_DADA_DELIVERY_GRABDONE_TEMPLATE_ID = "h4dkON6AgnHz1XmaksEUB_8Bcir4V8MSexUhC149pPE" //微信达达众包配送员接单推送
|
|
||||||
WX_DADA_DELIVERY_DONE_TEMPLATE_ID = "YXdCrQAHZlcZX1htYUiarrLmtkmKAjp7rynjwObgODo" //微信达达众包配送员配送完成推送
|
|
||||||
|
|
||||||
WX_SALE_BILL_TEMPLATE_ID = "eTUuFZMWH7IsVBfcxNMpmaHYaxRkUaD6zG8wSGJDcic"
|
|
||||||
|
|
||||||
WX_NORMAL_STORE_MSG_TEMPLATE_ID = "EUeIJEz2TLUAn4TU2EffOGYLd3dEaYndD_y6Sw9FcSU"
|
|
||||||
WX_CHANGE_APPROVED_TEMPLATE_ID = "gIG2olBZtQbjXmp6doNB_dESu60By5xuXYOGxksLv3Y"
|
|
||||||
WX_CHANGE_REJECTED_TEMPLATE_ID = "OBF4-d5inK95epHcUltpdb1zq9boVp2HESpASVRh1Oo"
|
|
||||||
WX_ORDER_APPLY_CANCEL_TEMPLATE_ID = "e6urTtcm4PL0rgDMG_1qWNOwrE3Qxqcm_dx0kWWCmEI"
|
|
||||||
WX_ORDER_ORDER_CANCELED_TEMPLATE_ID = "HXjuSAbIk77Xh18hjgwoxHzbciR9jX3Rn2CpLJz9dZw"
|
|
||||||
WX_ORDER_CHANGE_INFO_TEMPLATE_ID = "cjmEQFEpvcOuBNqQpTfMU5FeBpGRbQh_gWKz-WPW8Ro"
|
|
||||||
|
|
||||||
WX_AFS_ORDER_WAIT4APPROVE_TEMPLATE_ID = "X29udtANvhX6x1Lyh-T40NGNjRXBbUj5oSBTfDhZAqU"
|
|
||||||
WX_AFS_ORDER_STATUS_CHANGED_TEMPLATE_ID = "99T33rrXX0VboO1hljs4x8dDoLiSj3QX_rOikPHIXkg"
|
|
||||||
|
|
||||||
WS_NOTIFY_STORE_STATUS_CHHANGED_TEMPLATE_ID = "Fl0vOnBKTQqRFx3-shGKxdCnxMdQXNeODzgkuwd7oxw"
|
|
||||||
|
|
||||||
WX_STORE_ALERT_TEMPLATE_ID = "0AjzVl1wPl6iO4nFOS4IEsJYSzBymlT37DciIvcCOxE"
|
|
||||||
)
|
|
||||||
|
|
||||||
var (
|
|
||||||
VendorColors = map[int]string{
|
|
||||||
model.VendorIDJD: WX_TEMPLATE_VENDERCOLOR_JDDJ,
|
|
||||||
model.VendorIDMTWM: WX_TEMPLATE_VENDERCOLOR_MT,
|
|
||||||
model.VendorIDELM: WX_TEMPLATE_VENDERCOLOR_ELM,
|
|
||||||
model.VendorIDEBAI: WX_TEMPLATE_VENDERCOLOR_ELM,
|
|
||||||
}
|
|
||||||
testMiniProgramStoreMap = map[int]int{
|
|
||||||
101089: 1,
|
|
||||||
100888: 1,
|
|
||||||
100204: 1,
|
|
||||||
100205: 1,
|
|
||||||
100147: 1,
|
|
||||||
}
|
|
||||||
debugOpenIDMap = map[string]int{
|
|
||||||
"oYN_usk0AeGc_C6VEZfmFQP5VHMQ": 1, // 周小扬
|
|
||||||
"oYN_ust9hXKEvEv0X6Mq6nlAWs_E": 1, // me
|
|
||||||
"oYN_usqnpGVQ4xxlao_yybsbYJh4": 1, // 朱丹
|
|
||||||
}
|
|
||||||
)
|
|
||||||
|
|
||||||
func SmartMessageTemplateSend(userOpenID, templateID, downloadURL, miniPageURL string, data interface{}) (err error) {
|
|
||||||
var miniProgram map[string]interface{}
|
|
||||||
if miniPageURL != "" {
|
|
||||||
miniProgram = map[string]interface{}{
|
|
||||||
"appid": api.WeixinMiniAPI.GetAppID(),
|
|
||||||
"pagepath": miniPageURL,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
globals.SugarLogger.Debugf("SmartMessageTemplateSend openID:%s, templateID:%s, downloadURL:%s, miniProgram:%s", userOpenID, templateID, downloadURL, utils.Format4Output(miniProgram, true))
|
|
||||||
if globals.ReallySendWeixinMsg || debugOpenIDMap[userOpenID] == 1 {
|
|
||||||
if err = api.WeixinAPI.CBMessageTemplateSend(userOpenID, templateID, downloadURL, miniProgram, data); err != nil {
|
|
||||||
globals.SugarLogger.Debugf("SmartMessageTemplateSend openID:%s, templateID:%s, downloadURL:%s, miniProgram:%s, failed with error:%v", userOpenID, templateID, downloadURL, utils.Format4Output(miniProgram, true), err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
func SendMsgToUser(userID string, templateID string, data interface{}) (err error) {
|
|
||||||
globals.SugarLogger.Debugf("SendMsgToUser userID:%d, templateID:%s", userID, templateID)
|
|
||||||
authBinds, err := dao.GetUserBindAuthInfo(dao.GetDB(), userID, model.AuthBindTypeAuth, []string{"weixinsns"}, "", "", "wx2bb99eb5d2c9b82c")
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
successCount := 0
|
|
||||||
if len(authBinds) == 0 {
|
|
||||||
return fmt.Errorf("此用户未找到微信认证方式!userID: %v", userID)
|
|
||||||
}
|
|
||||||
globals.SugarLogger.Debugf("SendMsgToUser userID:%d, openID:%s, templateID:%s", userID, authBinds[0].AuthID, templateID)
|
|
||||||
if err2 := SmartMessageTemplateSend(authBinds[0].AuthID, templateID, "", "", data); err2 == nil {
|
|
||||||
successCount++
|
|
||||||
} else {
|
|
||||||
err = err2
|
|
||||||
}
|
|
||||||
if successCount > 0 {
|
|
||||||
err = nil // 只要成功一个都当成成功
|
|
||||||
}
|
|
||||||
if err != nil {
|
|
||||||
globals.SugarLogger.Debugf("SendMsgToUser all failed userID:%d, templateID:%s, error:%v", userID, templateID, err)
|
|
||||||
}
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
@@ -1,28 +0,0 @@
|
|||||||
package weixinmsg
|
|
||||||
|
|
||||||
import (
|
|
||||||
"testing"
|
|
||||||
|
|
||||||
"git.rosy.net.cn/jx-callback/business/jxutils/jxcontext"
|
|
||||||
"git.rosy.net.cn/jx-callback/globals/api2"
|
|
||||||
|
|
||||||
"git.rosy.net.cn/baseapi/utils"
|
|
||||||
"git.rosy.net.cn/jx-callback/globals/testinit"
|
|
||||||
)
|
|
||||||
|
|
||||||
func init() {
|
|
||||||
testinit.Init()
|
|
||||||
api2.Init()
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestGetWeixinOpenIDsFromStoreID(t *testing.T) {
|
|
||||||
openIDs := GetWeixinOpenIDsFromStoreID(100118)
|
|
||||||
t.Log(utils.Format4Output(openIDs, false))
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestSendStoreMessage(t *testing.T) {
|
|
||||||
_, err := SendStoreMessage(jxcontext.AdminCtx, "title", "content", []int{1}, false, true)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatal(err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,116 +0,0 @@
|
|||||||
package model
|
|
||||||
|
|
||||||
const (
|
|
||||||
BillTypeDeposit = 10 //发布任务
|
|
||||||
BillTypeJob = 11 //做任务实得
|
|
||||||
BillTypeJobCancelOverdue = 12 //任务过期或取消
|
|
||||||
BillTypeJobAuditUnPassWithCancelOverdue = 13 //任务不通过时,任务已取消或过期
|
|
||||||
BillTypeSpJob = 14 //特殊任务扣除
|
|
||||||
BillTypeDivide = 15 //群员做任务分成
|
|
||||||
BillTypeJobDivide = 16 //做任务实得(被扣除分成后)
|
|
||||||
BillTypeDropShipping = 17 //一件代发订单扣除
|
|
||||||
BillTypeDropShippingDeposit = 18 //一件代发保证金
|
|
||||||
BillTypeUnionShare = 19 //联盟任务分成
|
|
||||||
|
|
||||||
BillTypeMember = 20 //开通会员
|
|
||||||
|
|
||||||
BillTypeQuitGroup = 30 //退群
|
|
||||||
|
|
||||||
BillTypeJdWaybillOverWeight = 40 //京东物流超重扣款
|
|
||||||
|
|
||||||
BillTypeCash = 8 //提现
|
|
||||||
BillTypeInvest = 6 //充值
|
|
||||||
)
|
|
||||||
|
|
||||||
var (
|
|
||||||
BillTypeNames = map[int]string{
|
|
||||||
BillTypeDeposit: "发布任务",
|
|
||||||
BillTypeJob: "做任务实得",
|
|
||||||
BillTypeJobCancelOverdue: "任务过期或取消",
|
|
||||||
BillTypeJobAuditUnPassWithCancelOverdue: "任务不通过时,任务已取消或过期",
|
|
||||||
BillTypeSpJob: "特殊任务扣除",
|
|
||||||
BillTypeDivide: "群员做任务分成",
|
|
||||||
BillTypeJobDivide: "做任务实得(被扣除分成后)",
|
|
||||||
BillTypeDropShipping: "一件代发订单收入/扣除",
|
|
||||||
BillTypeDropShippingDeposit: "一件代发保证金",
|
|
||||||
BillTypeMember: "开通会员",
|
|
||||||
BillTypeQuitGroup: "退群",
|
|
||||||
BillTypeJdWaybillOverWeight: "京东物流超重扣款",
|
|
||||||
BillTypeCash: "提现",
|
|
||||||
BillTypeInvest: "充值",
|
|
||||||
}
|
|
||||||
)
|
|
||||||
|
|
||||||
//账单收入表
|
|
||||||
type BillIncome struct {
|
|
||||||
ModelIDCUL
|
|
||||||
|
|
||||||
BillID int64 `orm:"column(bill_id)" json:"billID"` //账单ID
|
|
||||||
JobID int `orm:"column(job_id)" json:"jobID"` //任务ID
|
|
||||||
Type int `json:"type"` //收入类型
|
|
||||||
IncomePrice int `json:"incomePrice"` //收入金额
|
|
||||||
}
|
|
||||||
|
|
||||||
func (v *BillIncome) TableIndex() [][]string {
|
|
||||||
return [][]string{
|
|
||||||
[]string{"BillID"},
|
|
||||||
[]string{"CreatedAt"},
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//账单支出表
|
|
||||||
type BillExpend struct {
|
|
||||||
ModelIDCUL
|
|
||||||
|
|
||||||
BillID int64 `orm:"column(bill_id)" json:"billID"` //账单ID
|
|
||||||
JobID int `orm:"column(job_id)" json:"jobID"` //任务ID
|
|
||||||
Type int `json:"type"` //支出类型
|
|
||||||
ExpendPrice int `json:"expendPrice"` //支出金额
|
|
||||||
}
|
|
||||||
|
|
||||||
func (v *BillExpend) TableIndex() [][]string {
|
|
||||||
return [][]string{
|
|
||||||
[]string{"BillID"},
|
|
||||||
[]string{"CreatedAt"},
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//用户账单表
|
|
||||||
type UserBill struct {
|
|
||||||
ModelIDCULD
|
|
||||||
|
|
||||||
BillID int64 `orm:"column(bill_id)" json:"billID"` //账单ID
|
|
||||||
UserID string `orm:"column(user_id)" json:"userID"` //用户ID
|
|
||||||
AccountBalance int `json:"accountBalance"` //账户余额
|
|
||||||
}
|
|
||||||
|
|
||||||
func (v *UserBill) TableUnique() [][]string {
|
|
||||||
return [][]string{
|
|
||||||
[]string{"UserID"},
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (v *UserBill) TableIndex() [][]string {
|
|
||||||
return [][]string{
|
|
||||||
[]string{"BillID"},
|
|
||||||
[]string{"CreatedAt"},
|
|
||||||
[]string{"AccountBalance"},
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
type UnionOrderSettle struct {
|
|
||||||
ModelIDCUL
|
|
||||||
|
|
||||||
BillID int64 `orm:"column(bill_id)" json:"billID"` //账单ID
|
|
||||||
VendorID int `orm:"column(vendor_id)" json:"vendorID"` //平台ID
|
|
||||||
Issue int `json:"issue"` //期数
|
|
||||||
EarningPrice int `json:"earningPrice"` //结算金额
|
|
||||||
OrderCount int `json:"orderCount"` //当期有效推广订单数量
|
|
||||||
Comment string `json:"comment"` //备注
|
|
||||||
}
|
|
||||||
|
|
||||||
func (v *UnionOrderSettle) TableUnique() [][]string {
|
|
||||||
return [][]string{
|
|
||||||
[]string{"BillID", "VendorID", "Issue"},
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -194,12 +194,6 @@ var (
|
|||||||
0: "休息",
|
0: "休息",
|
||||||
1: "营业",
|
1: "营业",
|
||||||
}
|
}
|
||||||
JobLimitCountType = map[int]string{
|
|
||||||
JobLimitCountTypePO: "每人一次",
|
|
||||||
JobLimitCountTypePDO: "每人一天一次",
|
|
||||||
JobLimitCountTypePWO: "每人一周一次",
|
|
||||||
JobLimitCountTypeNoLimit: "不限次",
|
|
||||||
}
|
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
|
|||||||
@@ -1,131 +0,0 @@
|
|||||||
package dao
|
|
||||||
|
|
||||||
import (
|
|
||||||
"time"
|
|
||||||
|
|
||||||
"git.rosy.net.cn/baseapi/utils"
|
|
||||||
"git.rosy.net.cn/jx-callback/business/jxutils"
|
|
||||||
"git.rosy.net.cn/jx-callback/business/model"
|
|
||||||
)
|
|
||||||
|
|
||||||
func GetUserBill(db *DaoDB, userID, billID string) (userBill *model.UserBill, err error) {
|
|
||||||
sql := `
|
|
||||||
SELECT * FROM user_bill WHERE deleted_at = ?
|
|
||||||
`
|
|
||||||
sqlParams := []interface{}{utils.DefaultTimeValue}
|
|
||||||
if userID != "" {
|
|
||||||
sql += ` AND user_id = ?`
|
|
||||||
sqlParams = append(sqlParams, userID)
|
|
||||||
}
|
|
||||||
if billID != "" {
|
|
||||||
sql += ` AND bill_id = ?`
|
|
||||||
sqlParams = append(sqlParams, billID)
|
|
||||||
}
|
|
||||||
err = GetRow(db, &userBill, sql, sqlParams)
|
|
||||||
return userBill, err
|
|
||||||
}
|
|
||||||
|
|
||||||
func GetBillExpend(db *DaoDB, userID string, billType int, fromTime, toTime time.Time) (billExpends []*model.BillExpend, err error) {
|
|
||||||
sql := `
|
|
||||||
SELECT b.*
|
|
||||||
FROM user_bill a
|
|
||||||
LEFT JOIN bill_expend b ON b.bill_id = a.bill_id
|
|
||||||
WHERE a.deleted_at = ?
|
|
||||||
`
|
|
||||||
sqlParams := []interface{}{utils.DefaultTimeValue}
|
|
||||||
if userID != "" {
|
|
||||||
sql += ` AND a.user_id = ?`
|
|
||||||
sqlParams = append(sqlParams, userID)
|
|
||||||
}
|
|
||||||
if billType != 0 {
|
|
||||||
sql += ` AND b.type = ?`
|
|
||||||
sqlParams = append(sqlParams, billType)
|
|
||||||
}
|
|
||||||
if fromTime != utils.ZeroTimeValue {
|
|
||||||
sql += ` AND b.created_at >= ?`
|
|
||||||
sqlParams = append(sqlParams, fromTime)
|
|
||||||
}
|
|
||||||
if toTime != utils.ZeroTimeValue {
|
|
||||||
sql += ` AND b.created_at <= ?`
|
|
||||||
sqlParams = append(sqlParams, toTime)
|
|
||||||
}
|
|
||||||
err = GetRows(db, &billExpends, sql, sqlParams)
|
|
||||||
return billExpends, err
|
|
||||||
}
|
|
||||||
|
|
||||||
func GetBillIncome(db *DaoDB, jobID int, billID int64) (billIncomes []*model.BillIncome, err error) {
|
|
||||||
sql := `
|
|
||||||
SELECT b.*
|
|
||||||
FROM user_bill a
|
|
||||||
LEFT JOIN bill_income b ON b.bill_id = a.bill_id
|
|
||||||
WHERE a.deleted_at = ?
|
|
||||||
`
|
|
||||||
sqlParams := []interface{}{utils.DefaultTimeValue}
|
|
||||||
if jobID != 0 {
|
|
||||||
sql += ` AND b.job_id = ?`
|
|
||||||
sqlParams = append(sqlParams, jobID)
|
|
||||||
}
|
|
||||||
if billID != 0 {
|
|
||||||
sql += ` AND b.bill_id = ?`
|
|
||||||
sqlParams = append(sqlParams, billID)
|
|
||||||
}
|
|
||||||
err = GetRows(db, &billIncomes, sql, sqlParams)
|
|
||||||
return billIncomes, err
|
|
||||||
}
|
|
||||||
|
|
||||||
type UserBillDetail struct {
|
|
||||||
CreatedAt time.Time `json:"created_at"`
|
|
||||||
LastOperator string `json:"lastOperator"`
|
|
||||||
BillType int `json:"billType"`
|
|
||||||
Price int `json:"price"`
|
|
||||||
Type string `json:"type"`
|
|
||||||
}
|
|
||||||
|
|
||||||
func GetUserBillDetail(db *DaoDB, userID string, fromTime, toTime time.Time, pageSize, offset int) (pagedInfo *model.PagedInfo, err error) {
|
|
||||||
var userBillDetails []*UserBillDetail
|
|
||||||
sql := `
|
|
||||||
SELECT SQL_CALC_FOUND_ROWS k.* FROM (
|
|
||||||
SELECT a.created_at, a.last_operator, a.type bill_type, a.income_price price, 'income' type
|
|
||||||
FROM bill_income a
|
|
||||||
JOIN user_bill b ON a.bill_id = b.bill_id AND b.user_id = ?
|
|
||||||
`
|
|
||||||
sqlParams := []interface{}{userID}
|
|
||||||
if fromTime != utils.ZeroTimeValue {
|
|
||||||
sql += ` AND a.created_at >= ?`
|
|
||||||
sqlParams = append(sqlParams, fromTime)
|
|
||||||
}
|
|
||||||
if toTime != utils.ZeroTimeValue {
|
|
||||||
sql += ` AND a.created_at <= ?`
|
|
||||||
sqlParams = append(sqlParams, toTime)
|
|
||||||
}
|
|
||||||
sql += `
|
|
||||||
UNION ALL
|
|
||||||
SELECT a.created_at, a.last_operator, a.type bill_type, a.expend_price price, 'expend' type
|
|
||||||
FROM bill_expend a
|
|
||||||
JOIN user_bill b ON a.bill_id = b.bill_id AND b.user_id = ?
|
|
||||||
`
|
|
||||||
sqlParams = append(sqlParams, userID)
|
|
||||||
if fromTime != utils.ZeroTimeValue {
|
|
||||||
sql += ` AND a.created_at >= ?`
|
|
||||||
sqlParams = append(sqlParams, fromTime)
|
|
||||||
}
|
|
||||||
if toTime != utils.ZeroTimeValue {
|
|
||||||
sql += ` AND a.created_at <= ?`
|
|
||||||
sqlParams = append(sqlParams, toTime)
|
|
||||||
}
|
|
||||||
sql += `
|
|
||||||
)k
|
|
||||||
ORDER BY k.created_at LIMIT ? OFFSET ?
|
|
||||||
`
|
|
||||||
pageSize = jxutils.FormalizePageSize(pageSize)
|
|
||||||
sqlParams = append(sqlParams, pageSize, offset)
|
|
||||||
txDB, _ := Begin(db)
|
|
||||||
defer Commit(db, txDB)
|
|
||||||
if err = GetRowsTx(txDB, &userBillDetails, sql, sqlParams...); err == nil {
|
|
||||||
pagedInfo = &model.PagedInfo{
|
|
||||||
TotalCount: GetLastTotalRowCountTx(txDB),
|
|
||||||
Data: userBillDetails,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return pagedInfo, err
|
|
||||||
}
|
|
||||||
@@ -1,582 +0,0 @@
|
|||||||
package dao
|
|
||||||
|
|
||||||
import (
|
|
||||||
"encoding/json"
|
|
||||||
"fmt"
|
|
||||||
"math"
|
|
||||||
"strings"
|
|
||||||
"time"
|
|
||||||
|
|
||||||
"git.rosy.net.cn/baseapi/utils"
|
|
||||||
"git.rosy.net.cn/jx-callback/business/jxutils"
|
|
||||||
"git.rosy.net.cn/jx-callback/business/model"
|
|
||||||
)
|
|
||||||
|
|
||||||
const (
|
|
||||||
sortTypeDistance = 1 //距离
|
|
||||||
sortTypeTime = 2 //发布时间
|
|
||||||
sortTypeAvgPrice = 4 //奖励高低
|
|
||||||
)
|
|
||||||
|
|
||||||
func GetJobCategories(db *DaoDB, name string) (jobCategories []*model.JobCategory, err error) {
|
|
||||||
sql := `
|
|
||||||
SELECT * FROM job_category WHERE deleted_at = ?
|
|
||||||
`
|
|
||||||
sqlParams := []interface{}{utils.DefaultTimeValue}
|
|
||||||
if name != "" {
|
|
||||||
sql += ` AND name LIKE ?`
|
|
||||||
sqlParams = append(sqlParams, "%"+name+"%")
|
|
||||||
}
|
|
||||||
err = GetRows(db, &jobCategories, sql, sqlParams)
|
|
||||||
return jobCategories, err
|
|
||||||
}
|
|
||||||
|
|
||||||
type GetJobsResult struct {
|
|
||||||
model.JobExt
|
|
||||||
CategoryName string `json:"categoryName"` //分类名
|
|
||||||
IndexImg string `json:"indexImg"` //任务封面
|
|
||||||
Distance float64 `json:"distance"` //距用户距离
|
|
||||||
}
|
|
||||||
|
|
||||||
func GetJobSteps(db *DaoDB, jobID int) (jobSteps []*model.JobStep, err error) {
|
|
||||||
sql := `
|
|
||||||
SELECT *
|
|
||||||
FROM job_step
|
|
||||||
WHERE job_id = ?
|
|
||||||
AND deleted_at = ?
|
|
||||||
`
|
|
||||||
sqlParams := []interface{}{jobID, utils.DefaultTimeValue}
|
|
||||||
err = GetRows(db, &jobSteps, sql, sqlParams)
|
|
||||||
return jobSteps, err
|
|
||||||
}
|
|
||||||
|
|
||||||
func GetJobImgs(db *DaoDB, jobID int) (jobImgs []*model.JobImg, err error) {
|
|
||||||
sql := `
|
|
||||||
SELECT *
|
|
||||||
FROM job_img
|
|
||||||
WHERE job_id = ?
|
|
||||||
`
|
|
||||||
sqlParams := []interface{}{jobID}
|
|
||||||
err = GetRows(db, &jobImgs, sql, sqlParams)
|
|
||||||
return jobImgs, err
|
|
||||||
}
|
|
||||||
|
|
||||||
func GetJobs(db *DaoDB, userIDs []string, categoryIDs, statuss, vendorIDs, types, cityCodes []int, includeStep bool, fromTime, toTime time.Time, lng, lat float64, cityCode, span int, keyword string, sortType, pageSize, offset int) (pagedInfo *model.PagedInfo, err error) {
|
|
||||||
var (
|
|
||||||
jobs []*GetJobsResult
|
|
||||||
sqlParams = []interface{}{lng, lat, utils.DefaultTimeValue, utils.DefaultTimeValue}
|
|
||||||
)
|
|
||||||
sql := `
|
|
||||||
SELECT SQL_CALC_FOUND_ROWS a.*, b.name, getDistance(?, ?, CAST(a.lng AS DECIMAL(15,6))/1000000, CAST(a.lat AS DECIMAL(15,6))/1000000) distance
|
|
||||||
FROM job a
|
|
||||||
JOIN job_category b ON b.id = a.job_category_id AND b.deleted_at = ?
|
|
||||||
WHERE a.deleted_at = ?
|
|
||||||
`
|
|
||||||
if cityCode > 0 {
|
|
||||||
sql += " AND (a.job_city_code = ? OR a.job_city_code = ?)"
|
|
||||||
sqlParams = append(sqlParams, cityCode, model.JobCountrywideCode)
|
|
||||||
}
|
|
||||||
if len(userIDs) > 0 {
|
|
||||||
sql += ` AND a.user_id IN (` + GenQuestionMarks(len(userIDs)) + `)`
|
|
||||||
sqlParams = append(sqlParams, userIDs)
|
|
||||||
}
|
|
||||||
if len(categoryIDs) > 0 {
|
|
||||||
sql += ` AND a.job_category_id IN (` + GenQuestionMarks(len(categoryIDs)) + `)`
|
|
||||||
sqlParams = append(sqlParams, categoryIDs)
|
|
||||||
}
|
|
||||||
if len(statuss) > 0 {
|
|
||||||
sql += ` AND a.status IN (` + GenQuestionMarks(len(statuss)) + `)`
|
|
||||||
sqlParams = append(sqlParams, statuss)
|
|
||||||
}
|
|
||||||
if len(vendorIDs) > 0 {
|
|
||||||
sql += ` AND a.vendor_id IN (` + GenQuestionMarks(len(vendorIDs)) + `)`
|
|
||||||
sqlParams = append(sqlParams, vendorIDs)
|
|
||||||
}
|
|
||||||
if len(types) > 0 {
|
|
||||||
sql += ` AND a.type IN (` + GenQuestionMarks(len(types)) + `)`
|
|
||||||
sqlParams = append(sqlParams, types)
|
|
||||||
}
|
|
||||||
if len(cityCodes) > 0 {
|
|
||||||
sql += ` AND a.job_city_code IN (` + GenQuestionMarks(len(cityCodes)) + `)`
|
|
||||||
sqlParams = append(sqlParams, cityCodes)
|
|
||||||
}
|
|
||||||
if fromTime != utils.ZeroTimeValue {
|
|
||||||
sql += ` AND a.created_at >= ?`
|
|
||||||
sqlParams = append(sqlParams, fromTime)
|
|
||||||
}
|
|
||||||
if toTime != utils.ZeroTimeValue {
|
|
||||||
sql += ` AND a.created_at <= ?`
|
|
||||||
sqlParams = append(sqlParams, toTime)
|
|
||||||
}
|
|
||||||
if span != 0 {
|
|
||||||
if span == model.JobSpanTop {
|
|
||||||
sql += ` AND a.job_span_top = 1`
|
|
||||||
} else {
|
|
||||||
sql += ` AND a.job_span_recmd = 1`
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if keyword != "" {
|
|
||||||
sql += ` AND (a.title LIKE ? OR a.content LIKE ? OR a.address LIKE ? OR b.name LIKE ?)`
|
|
||||||
sqlParams = append(sqlParams, "%"+keyword+"%", "%"+keyword+"%", "%"+keyword+"%", "%"+keyword+"%")
|
|
||||||
}
|
|
||||||
if sortType != 0 {
|
|
||||||
if sortType == sortTypeDistance {
|
|
||||||
sql += ` ORDER BY job_span_top DESC, top_seq, distance`
|
|
||||||
} else if sortType == -sortTypeDistance {
|
|
||||||
sql += ` ORDER BY job_span_top DESC, top_seq, distance DESC`
|
|
||||||
} else if sortType == sortTypeAvgPrice {
|
|
||||||
sql += ` ORDER BY job_span_top DESC, top_seq, a.avg_price`
|
|
||||||
} else if sortType == -sortTypeAvgPrice {
|
|
||||||
sql += ` ORDER BY job_span_top DESC, top_seq, a.avg_price DESC`
|
|
||||||
} else if sortType == sortTypeTime {
|
|
||||||
sql += ` ORDER BY job_span_top DESC, top_seq, a.created_at`
|
|
||||||
} else if sortType == -sortTypeTime {
|
|
||||||
sql += ` ORDER BY status DESC, job_span_top DESC, top_seq, a.created_at DESC`
|
|
||||||
}
|
|
||||||
}
|
|
||||||
sql += " LIMIT ? OFFSET ?"
|
|
||||||
pageSize = jxutils.FormalizePageSize(pageSize)
|
|
||||||
sqlParams = append(sqlParams, pageSize, offset)
|
|
||||||
txDB, _ := Begin(db)
|
|
||||||
defer Commit(db, txDB)
|
|
||||||
if err = GetRowsTx(txDB, &jobs, sql, sqlParams...); err == nil {
|
|
||||||
pagedInfo = &model.PagedInfo{
|
|
||||||
TotalCount: GetLastTotalRowCountTx(txDB),
|
|
||||||
// Data: jobs,
|
|
||||||
}
|
|
||||||
for _, v := range jobs {
|
|
||||||
if includeStep {
|
|
||||||
if jobSteps, err := GetJobSteps(db, v.ID); err == nil && len(jobSteps) > 0 {
|
|
||||||
v.JobSteps = jobSteps
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if jobImgs, err := GetJobImgs(db, v.ID); err == nil && len(jobImgs) > 0 {
|
|
||||||
v.JobImgs = jobImgs
|
|
||||||
v.IndexImg = jobImgs[0].Img
|
|
||||||
}
|
|
||||||
}
|
|
||||||
pagedInfo.Data = jobs
|
|
||||||
}
|
|
||||||
return pagedInfo, err
|
|
||||||
}
|
|
||||||
|
|
||||||
func GetJob(db *DaoDB, userIDs []string, categoryIDs, statuss, types []int, fromTime, toTime time.Time, includeStep bool) (job *model.Job, err error) {
|
|
||||||
jobs, err := GetJobsNoPage(db, userIDs, categoryIDs, statuss, types, fromTime, toTime, 0, includeStep)
|
|
||||||
if err != nil {
|
|
||||||
return job, err
|
|
||||||
}
|
|
||||||
if len(jobs) == 0 {
|
|
||||||
return job, fmt.Errorf("未查询到对应的京东快递任务!")
|
|
||||||
}
|
|
||||||
if data, err := json.Marshal(jobs[0]); err == nil {
|
|
||||||
json.Unmarshal(data, &job)
|
|
||||||
}
|
|
||||||
return job, err
|
|
||||||
}
|
|
||||||
|
|
||||||
func GetJobWithTitle(db *DaoDB, title string) (job *model.Job, err error) {
|
|
||||||
sql := `
|
|
||||||
SELECT * FROM job WHERE title = ? AND deleted_at = ? AND status = ?
|
|
||||||
`
|
|
||||||
sqlParams := []interface{}{title, utils.DefaultTimeValue, model.JobStatusDoing}
|
|
||||||
err = GetRow(db, &job, sql, sqlParams)
|
|
||||||
return job, err
|
|
||||||
}
|
|
||||||
|
|
||||||
func GetJobsNoPage(db *DaoDB, userIDs []string, categoryIDs, statuss, types []int, fromTime, toTime time.Time, span int, includeStep bool) (jobs []*GetJobsResult, err error) {
|
|
||||||
sql := `
|
|
||||||
SELECT a.*, b.name
|
|
||||||
FROM job a
|
|
||||||
JOIN job_category b ON b.id = a.job_category_id AND b.deleted_at = ?
|
|
||||||
WHERE 1 = 1
|
|
||||||
`
|
|
||||||
sqlParams := []interface{}{utils.DefaultTimeValue}
|
|
||||||
if len(userIDs) > 0 {
|
|
||||||
sql += ` AND a.user_id IN (` + GenQuestionMarks(len(userIDs)) + `)`
|
|
||||||
sqlParams = append(sqlParams, userIDs)
|
|
||||||
}
|
|
||||||
if len(categoryIDs) > 0 {
|
|
||||||
sql += ` AND a.job_category_id IN (` + GenQuestionMarks(len(categoryIDs)) + `)`
|
|
||||||
sqlParams = append(sqlParams, categoryIDs)
|
|
||||||
}
|
|
||||||
if len(statuss) > 0 {
|
|
||||||
sql += ` AND a.status IN (` + GenQuestionMarks(len(statuss)) + `)`
|
|
||||||
sqlParams = append(sqlParams, statuss)
|
|
||||||
}
|
|
||||||
if len(types) > 0 {
|
|
||||||
sql += ` AND a.type IN (` + GenQuestionMarks(len(types)) + `)`
|
|
||||||
sqlParams = append(sqlParams, types)
|
|
||||||
}
|
|
||||||
if fromTime != utils.ZeroTimeValue {
|
|
||||||
sql += ` AND a.created_at >= ?`
|
|
||||||
sqlParams = append(sqlParams, fromTime)
|
|
||||||
}
|
|
||||||
if toTime != utils.ZeroTimeValue {
|
|
||||||
sql += ` AND a.created_at <= ?`
|
|
||||||
sqlParams = append(sqlParams, toTime)
|
|
||||||
}
|
|
||||||
if span != 0 {
|
|
||||||
if span == model.JobSpanTop {
|
|
||||||
sql += ` AND a.job_span_top = 1`
|
|
||||||
} else {
|
|
||||||
sql += ` AND a.job_span_recmd = 1`
|
|
||||||
}
|
|
||||||
}
|
|
||||||
err = GetRows(db, &jobs, sql, sqlParams...)
|
|
||||||
for _, v := range jobs {
|
|
||||||
if includeStep {
|
|
||||||
if jobSteps, err := GetJobSteps(db, v.ID); err == nil && len(jobSteps) > 0 {
|
|
||||||
v.JobSteps = jobSteps
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if jobImgs, err := GetJobImgs(db, v.ID); err == nil && len(jobImgs) > 0 {
|
|
||||||
v.JobImgs = jobImgs
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return jobs, err
|
|
||||||
}
|
|
||||||
|
|
||||||
func GetJobDetail(db *DaoDB, jobID int) (job *GetJobsResult, err error) {
|
|
||||||
sql := `
|
|
||||||
SELECT a.*, b.name
|
|
||||||
FROM job a
|
|
||||||
JOIN job_category b ON b.id = a.job_category_id AND b.deleted_at = ?
|
|
||||||
WHERE 1 = 1
|
|
||||||
`
|
|
||||||
sqlParams := []interface{}{utils.DefaultTimeValue}
|
|
||||||
if jobID != 0 {
|
|
||||||
sql += ` AND a.id = ?`
|
|
||||||
sqlParams = append(sqlParams, jobID)
|
|
||||||
}
|
|
||||||
err = GetRow(db, &job, sql, sqlParams...)
|
|
||||||
if job != nil {
|
|
||||||
if jobSteps, err := GetJobSteps(db, job.ID); err == nil && len(jobSteps) > 0 {
|
|
||||||
job.JobSteps = jobSteps
|
|
||||||
}
|
|
||||||
if jobImgs, err := GetJobImgs(db, job.ID); err == nil && len(jobImgs) > 0 {
|
|
||||||
job.JobImgs = jobImgs
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
return job, fmt.Errorf("未查到到该任务!")
|
|
||||||
}
|
|
||||||
return job, err
|
|
||||||
}
|
|
||||||
|
|
||||||
func GetJobOrdersNoPage(db *DaoDB, jobID int, jobOrderID int64, userID string, statusCompareStr string, fromTime, toTime time.Time, statuss []int) (jobOrders []*model.JobOrder, err error) {
|
|
||||||
sql := `
|
|
||||||
SELECT a.*
|
|
||||||
FROM job_order a
|
|
||||||
WHERE 1 = 1
|
|
||||||
`
|
|
||||||
sqlParams := []interface{}{}
|
|
||||||
if jobID != 0 {
|
|
||||||
sql += ` AND a.job_id = ?`
|
|
||||||
sqlParams = append(sqlParams, jobID)
|
|
||||||
}
|
|
||||||
if jobOrderID != 0 {
|
|
||||||
sql += ` AND a.job_order_id = ?`
|
|
||||||
sqlParams = append(sqlParams, jobOrderID)
|
|
||||||
}
|
|
||||||
if userID != "" {
|
|
||||||
sql += ` AND a.user_id = ?`
|
|
||||||
sqlParams = append(sqlParams, userID)
|
|
||||||
}
|
|
||||||
if statusCompareStr != "" {
|
|
||||||
sql += ` AND a.status ` + statusCompareStr
|
|
||||||
}
|
|
||||||
if fromTime != utils.ZeroTimeValue {
|
|
||||||
sql += ` AND a.created_at >= ?`
|
|
||||||
sqlParams = append(sqlParams, fromTime)
|
|
||||||
}
|
|
||||||
if toTime != utils.ZeroTimeValue {
|
|
||||||
sql += ` AND a.created_at <= ?`
|
|
||||||
sqlParams = append(sqlParams, toTime)
|
|
||||||
}
|
|
||||||
if len(statuss) > 0 {
|
|
||||||
sql += ` AND a.status IN (` + GenQuestionMarks(len(statuss)) + `)`
|
|
||||||
sqlParams = append(sqlParams, statuss)
|
|
||||||
}
|
|
||||||
err = GetRows(db, &jobOrders, sql, sqlParams)
|
|
||||||
return jobOrders, err
|
|
||||||
}
|
|
||||||
|
|
||||||
type GetJobOrdersResult struct {
|
|
||||||
model.JobOrder
|
|
||||||
JobLimitAt int `json:"jobLimitAt"` //任务限时完成小时数
|
|
||||||
AuditLimitAt int `json:"auditLimitAt"` //限时审核小时数
|
|
||||||
JobOrderFinishAt time.Time `json:"jobOrderFinishAt"`
|
|
||||||
JobOrderAuditFinishAt time.Time `json:"jobOrderAuditFinishAt"`
|
|
||||||
JobIndexImg string `json:"jobIndexImg"`
|
|
||||||
VendorID int `orm:"column(vendor_id)" json:"vendorID"` //推广平台
|
|
||||||
AvgPrice int `json:"avgPrice"` //单个任务金额
|
|
||||||
Title string `orm:"size(255)" json:"title"` //任务标题
|
|
||||||
JobContent string `orm:"size(500)" json:"jobContent"`
|
|
||||||
JobCategoryID int `orm:"column(job_category_id)" json:"jobCategoryID"`
|
|
||||||
StoreURL string `orm:"column(store_url)" json:"storeURL"`
|
|
||||||
}
|
|
||||||
|
|
||||||
func GetJobOrders(db *DaoDB, jobID int, jobOrderID int64, userID, jobUserID string, statusCompareStr string, fromTime, toTime time.Time, statuss []int, pageSize, offset int) (pagedInfo *model.PagedInfo, err error) {
|
|
||||||
var jobOrders []*GetJobOrdersResult
|
|
||||||
sql := `
|
|
||||||
SELECT SQL_CALC_FOUND_ROWS a.*, b.job_limit_at, b.vendor_id, b.avg_price, b.title, b.content job_content, b.audit_limit_at, b.job_category_id, b.store_url
|
|
||||||
FROM job_order a
|
|
||||||
JOIN job b ON a.job_id = b.id
|
|
||||||
WHERE 1 = 1
|
|
||||||
`
|
|
||||||
sqlParams := []interface{}{}
|
|
||||||
if jobID != 0 {
|
|
||||||
sql += ` AND a.job_id = ?`
|
|
||||||
sqlParams = append(sqlParams, jobID)
|
|
||||||
}
|
|
||||||
if jobOrderID != 0 {
|
|
||||||
sql += ` AND a.job_order_id = ?`
|
|
||||||
sqlParams = append(sqlParams, jobOrderID)
|
|
||||||
}
|
|
||||||
if userID != "" {
|
|
||||||
sql += ` AND a.user_id = ?`
|
|
||||||
sqlParams = append(sqlParams, userID)
|
|
||||||
}
|
|
||||||
if jobUserID != "" {
|
|
||||||
sql += ` AND b.user_id = ?`
|
|
||||||
sqlParams = append(sqlParams, jobUserID)
|
|
||||||
}
|
|
||||||
if statusCompareStr != "" {
|
|
||||||
sql += ` AND a.status ` + statusCompareStr
|
|
||||||
}
|
|
||||||
if fromTime != utils.ZeroTimeValue {
|
|
||||||
sql += ` AND a.created_at >= ?`
|
|
||||||
sqlParams = append(sqlParams, fromTime)
|
|
||||||
}
|
|
||||||
if toTime != utils.ZeroTimeValue {
|
|
||||||
sql += ` AND a.created_at <= ?`
|
|
||||||
sqlParams = append(sqlParams, toTime)
|
|
||||||
}
|
|
||||||
if len(statuss) > 0 {
|
|
||||||
sql += ` AND a.status IN (` + GenQuestionMarks(len(statuss)) + `)`
|
|
||||||
sqlParams = append(sqlParams, statuss)
|
|
||||||
}
|
|
||||||
sql += " LIMIT ? OFFSET ?"
|
|
||||||
pageSize = jxutils.FormalizePageSize(pageSize)
|
|
||||||
sqlParams = append(sqlParams, pageSize, offset)
|
|
||||||
txDB, _ := Begin(db)
|
|
||||||
defer Commit(db, txDB)
|
|
||||||
if err = GetRowsTx(txDB, &jobOrders, sql, sqlParams...); err == nil {
|
|
||||||
pagedInfo = &model.PagedInfo{
|
|
||||||
TotalCount: GetLastTotalRowCountTx(txDB),
|
|
||||||
// Data: jobOrders,
|
|
||||||
}
|
|
||||||
for _, v := range jobOrders {
|
|
||||||
if jobImgs, err := GetJobImgs(db, v.JobID); err == nil && len(jobImgs) > 0 {
|
|
||||||
v.JobIndexImg = jobImgs[0].Img
|
|
||||||
}
|
|
||||||
v.JobOrderFinishAt = v.JobOrder.CreatedAt.Add(time.Duration(v.JobLimitAt) * time.Hour)
|
|
||||||
v.JobOrderAuditFinishAt = v.JobOrder.SubmitAuditAt.Add(time.Duration(v.AuditLimitAt) * time.Hour)
|
|
||||||
}
|
|
||||||
pagedInfo.Data = jobOrders
|
|
||||||
}
|
|
||||||
return pagedInfo, err
|
|
||||||
}
|
|
||||||
|
|
||||||
func GetMtMember(db *DaoDB) (mtMember *model.MtMember, err error) {
|
|
||||||
sql := `
|
|
||||||
SELECT *
|
|
||||||
FROM mt_member
|
|
||||||
WHERE deleted_at = ?
|
|
||||||
LIMIT 1
|
|
||||||
`
|
|
||||||
sqlParams := []interface{}{utils.DefaultTimeValue}
|
|
||||||
err = GetRow(db, &mtMember, sql, sqlParams)
|
|
||||||
return mtMember, err
|
|
||||||
}
|
|
||||||
|
|
||||||
func GetJobTimers(db *DaoDB, status int) (jobTimers []*model.JobTimer, err error) {
|
|
||||||
sql := `
|
|
||||||
SELECT *
|
|
||||||
FROM job_timer
|
|
||||||
WHERE 1 = 1
|
|
||||||
`
|
|
||||||
sqlParams := []interface{}{}
|
|
||||||
if status != -1 {
|
|
||||||
sql += ` AND status = ?`
|
|
||||||
sqlParams = append(sqlParams, status)
|
|
||||||
}
|
|
||||||
err = GetRows(db, &jobTimers, sql, sqlParams)
|
|
||||||
return jobTimers, err
|
|
||||||
}
|
|
||||||
|
|
||||||
func GetMtMembers(db *DaoDB) (num int, err error) {
|
|
||||||
var mtMembers []*model.MtMember
|
|
||||||
sql := `
|
|
||||||
SELECT * FROM mt_member WHERE deleted_at = ?
|
|
||||||
`
|
|
||||||
sqlParams := []interface{}{utils.DefaultTimeValue}
|
|
||||||
err = GetRows(db, &mtMembers, sql, sqlParams)
|
|
||||||
num = len(mtMembers)
|
|
||||||
return num, err
|
|
||||||
}
|
|
||||||
|
|
||||||
func GetUserSearch(db *DaoDB, userID, keyword string) (userSearchs []*model.UserSearch, err error) {
|
|
||||||
sql := `
|
|
||||||
SELECT *
|
|
||||||
FROM user_search
|
|
||||||
WHERE 1 = 1
|
|
||||||
`
|
|
||||||
sqlParams := []interface{}{}
|
|
||||||
if userID != "" {
|
|
||||||
sql += " AND user_id = ?"
|
|
||||||
sqlParams = append(sqlParams, userID)
|
|
||||||
}
|
|
||||||
if keyword != "" {
|
|
||||||
sql += " AND keyword = ?"
|
|
||||||
sqlParams = append(sqlParams, keyword)
|
|
||||||
}
|
|
||||||
err = GetRows(db, &userSearchs, sql, sqlParams)
|
|
||||||
return userSearchs, err
|
|
||||||
}
|
|
||||||
|
|
||||||
func GetStationList(db *DaoDB) (stations []*model.StationInfo, err error) {
|
|
||||||
sql := `
|
|
||||||
SELECT *
|
|
||||||
FROM station_info
|
|
||||||
`
|
|
||||||
sqlParams := []interface{}{}
|
|
||||||
err = GetRows(db, &stations, sql, sqlParams)
|
|
||||||
return stations, err
|
|
||||||
}
|
|
||||||
|
|
||||||
func GetStationInfoList(db *DaoDB, stationName string, cityCode int, lat, lng float64, oilCode string, sortType, offset, pageSize int) (pagedInfo *model.PagedInfo, err error) {
|
|
||||||
var (
|
|
||||||
stations []*model.StationInfo
|
|
||||||
distanceFlag bool
|
|
||||||
sqlParams = []interface{}{}
|
|
||||||
)
|
|
||||||
if lng != 0 && lat != 0 {
|
|
||||||
distanceFlag = true
|
|
||||||
}
|
|
||||||
sql := `
|
|
||||||
SELECT SQL_CALC_FOUND_ROWS *
|
|
||||||
`
|
|
||||||
if distanceFlag {
|
|
||||||
sql += `, getDistance(?, ?, longitude, latitude) distance`
|
|
||||||
sqlParams = append(sqlParams, lng, lat)
|
|
||||||
}
|
|
||||||
sql += `
|
|
||||||
FROM station_info
|
|
||||||
WHERE 1 = 1
|
|
||||||
`
|
|
||||||
if stationName != "" {
|
|
||||||
sql += " AND station_name LIKE ?"
|
|
||||||
sqlParams = append(sqlParams, "%"+stationName+"%")
|
|
||||||
}
|
|
||||||
if cityCode != 0 {
|
|
||||||
sql += " AND city_id = ?"
|
|
||||||
sqlParams = append(sqlParams, cityCode)
|
|
||||||
}
|
|
||||||
if oilCode != "" {
|
|
||||||
sql += " AND POSITION(? IN prices) > 0"
|
|
||||||
sqlParams = append(sqlParams, oilCode)
|
|
||||||
}
|
|
||||||
if sortType != 0 {
|
|
||||||
if sortType == 1 {
|
|
||||||
sql += " ORDER BY distance"
|
|
||||||
} else if sortType == -1 {
|
|
||||||
sql += " ORDER BY distance DESC"
|
|
||||||
} else if sortType == 2 {
|
|
||||||
sql += " ORDER BY star_num"
|
|
||||||
} else if sortType == -2 {
|
|
||||||
sql += " ORDER BY star_num DESC"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
sql += " LIMIT ? OFFSET ?"
|
|
||||||
pageSize = jxutils.FormalizePageSize(pageSize)
|
|
||||||
sqlParams = append(sqlParams, pageSize, offset)
|
|
||||||
txDB, _ := Begin(db)
|
|
||||||
defer Commit(db, txDB)
|
|
||||||
if err = GetRowsTx(txDB, &stations, sql, sqlParams...); err == nil {
|
|
||||||
pagedInfo = &model.PagedInfo{
|
|
||||||
TotalCount: GetLastTotalRowCountTx(txDB),
|
|
||||||
// Data: stations,
|
|
||||||
}
|
|
||||||
for _, v := range stations {
|
|
||||||
var oilInfo []*model.OilInfo
|
|
||||||
json.Unmarshal([]byte(strings.ReplaceAll(v.Prices, "\\", "")), &oilInfo)
|
|
||||||
v.OilInfo = oilInfo
|
|
||||||
}
|
|
||||||
if math.Abs(utils.Int2Float64(sortType)) == 3 {
|
|
||||||
if oilCode != "" {
|
|
||||||
for i := 0; i < len(stations); i++ {
|
|
||||||
for j := 0; j < len(stations)-i-1; j++ {
|
|
||||||
var (
|
|
||||||
index int
|
|
||||||
index2 int
|
|
||||||
)
|
|
||||||
for k, v := range stations[j].OilInfo {
|
|
||||||
if v.OilCode == oilCode {
|
|
||||||
index = k
|
|
||||||
}
|
|
||||||
}
|
|
||||||
for k, v := range stations[j+1].OilInfo {
|
|
||||||
if v.OilCode == oilCode {
|
|
||||||
index2 = k
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if sortType == 3 {
|
|
||||||
if utils.Str2Float64(stations[j].OilInfo[index].DiscountPrice) > utils.Str2Float64(stations[j+1].OilInfo[index2].DiscountPrice) {
|
|
||||||
temp := stations[j]
|
|
||||||
stations[j] = stations[j+1]
|
|
||||||
stations[j+1] = temp
|
|
||||||
}
|
|
||||||
} else if sortType == -3 {
|
|
||||||
if utils.Str2Float64(stations[j].OilInfo[index].DiscountPrice) < utils.Str2Float64(stations[j+1].OilInfo[index2].DiscountPrice) {
|
|
||||||
temp := stations[j]
|
|
||||||
stations[j] = stations[j+1]
|
|
||||||
stations[j+1] = temp
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
pagedInfo.Data = stations
|
|
||||||
}
|
|
||||||
return pagedInfo, err
|
|
||||||
}
|
|
||||||
|
|
||||||
func GetMaxJobTopSeq(db *DaoDB) (maxSeq int, err error) {
|
|
||||||
Seq := &struct {
|
|
||||||
TopSeq int
|
|
||||||
}{}
|
|
||||||
sql := `
|
|
||||||
SELECT MAX(top_seq) top_seq FROM job WHERE deleted_at = ? AND status = ? AND job_span_top = ?
|
|
||||||
`
|
|
||||||
sqlParams := []interface{}{utils.DefaultTimeValue, model.JobStatusDoing, 1}
|
|
||||||
if err = GetRow(db, &Seq, sql, sqlParams); err == nil {
|
|
||||||
return Seq.TopSeq, err
|
|
||||||
}
|
|
||||||
return maxSeq, err
|
|
||||||
}
|
|
||||||
|
|
||||||
func GetMaxJobRecmdSeq(db *DaoDB) (maxSeq int, err error) {
|
|
||||||
Seq := &struct {
|
|
||||||
RecmdSeq int
|
|
||||||
}{}
|
|
||||||
sql := `
|
|
||||||
SELECT MAX(recmd_seq) recmd_seq FROM job WHERE deleted_at = ? AND status = ? AND job_span_recmd = ?
|
|
||||||
`
|
|
||||||
sqlParams := []interface{}{utils.DefaultTimeValue, model.JobStatusDoing, 1}
|
|
||||||
if err = GetRow(db, &Seq, sql, sqlParams); err == nil {
|
|
||||||
return Seq.RecmdSeq, err
|
|
||||||
}
|
|
||||||
return maxSeq, err
|
|
||||||
}
|
|
||||||
|
|
||||||
func GetJobSpans(db *DaoDB) (jobSpans []*model.JobSpan, err error) {
|
|
||||||
sql := `
|
|
||||||
SELECT *
|
|
||||||
FROM job_span
|
|
||||||
WHERE deleted_at = ?
|
|
||||||
`
|
|
||||||
sqlParams := []interface{}{utils.DefaultTimeValue}
|
|
||||||
err = GetRows(db, &jobSpans, sql, sqlParams)
|
|
||||||
return jobSpans, err
|
|
||||||
}
|
|
||||||
@@ -1,15 +0,0 @@
|
|||||||
package dao
|
|
||||||
|
|
||||||
import (
|
|
||||||
"git.rosy.net.cn/baseapi/utils"
|
|
||||||
"git.rosy.net.cn/jx-callback/business/model"
|
|
||||||
)
|
|
||||||
|
|
||||||
func GetVendorMatterCategory(db *DaoDB, vendorID int) (vendorMatterCat []*model.VendorMatterCategory, err error) {
|
|
||||||
sql := `
|
|
||||||
SELECT * FROM vendor_matter_category WHERE deleted_at = ? AND vendor_id = ?
|
|
||||||
`
|
|
||||||
sqlParams := []interface{}{utils.DefaultTimeValue, vendorID}
|
|
||||||
err = GetRows(db, &vendorMatterCat, sql, sqlParams)
|
|
||||||
return vendorMatterCat, err
|
|
||||||
}
|
|
||||||
@@ -1,424 +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 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 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
|
|
||||||
}
|
|
||||||
@@ -142,66 +142,6 @@ func GetOperateEvents(db *DaoDB, name string, apiFunctions []string, operateType
|
|||||||
return operateEventExt, totalCount, err
|
return operateEventExt, totalCount, err
|
||||||
}
|
}
|
||||||
|
|
||||||
func GetImMessageRecord(db *DaoDB, groupID int, userID, toUserID string, storeID, vendorID int, fromTime, toTime time.Time, offset, pageSize int) (pagedInfo *model.PagedInfo, err error) {
|
|
||||||
var msg []*model.ImMessageRecord
|
|
||||||
sql := `
|
|
||||||
SELECT SQL_CALC_FOUND_ROWS *
|
|
||||||
FROM im_message_record
|
|
||||||
WHERE deleted_at = ?
|
|
||||||
`
|
|
||||||
sqlParams := []interface{}{
|
|
||||||
utils.DefaultTimeValue,
|
|
||||||
}
|
|
||||||
if groupID != 0 {
|
|
||||||
sql += " AND group_id = ?"
|
|
||||||
sqlParams = append(sqlParams, groupID)
|
|
||||||
if groupID == model.SysGroupID {
|
|
||||||
sql += " AND to_user_id = ?"
|
|
||||||
sqlParams = append(sqlParams, toUserID)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if userID != "" {
|
|
||||||
sql += " AND user_id = ?"
|
|
||||||
sqlParams = append(sqlParams, userID)
|
|
||||||
}
|
|
||||||
if storeID != 0 {
|
|
||||||
sql += " AND store_id = ?"
|
|
||||||
sqlParams = append(sqlParams, storeID)
|
|
||||||
}
|
|
||||||
if vendorID >= 0 {
|
|
||||||
sql += " AND vendor_id = ?"
|
|
||||||
sqlParams = append(sqlParams, vendorID)
|
|
||||||
}
|
|
||||||
if fromTime != utils.ZeroTimeValue {
|
|
||||||
sql += " AND created_at >= ?"
|
|
||||||
sqlParams = append(sqlParams, fromTime)
|
|
||||||
}
|
|
||||||
if toTime != utils.ZeroTimeValue {
|
|
||||||
sql += " AND created_at <= ?"
|
|
||||||
sqlParams = append(sqlParams, toTime)
|
|
||||||
}
|
|
||||||
sql += `
|
|
||||||
ORDER BY created_at DESC
|
|
||||||
LIMIT ? OFFSET ?
|
|
||||||
`
|
|
||||||
sqlParams = append(sqlParams, pageSize, offset)
|
|
||||||
txDB, _ := Begin(db)
|
|
||||||
defer Commit(db, txDB)
|
|
||||||
if err = GetRowsTx(txDB, &msg, sql, sqlParams); err == nil {
|
|
||||||
pagedInfo = &model.PagedInfo{
|
|
||||||
TotalCount: GetLastTotalRowCountTx(txDB),
|
|
||||||
// Data: msg,
|
|
||||||
}
|
|
||||||
for _, v := range msg {
|
|
||||||
if user, err := GetUser(db, v.UserID); err == nil {
|
|
||||||
v.UserInfo = user
|
|
||||||
}
|
|
||||||
}
|
|
||||||
pagedInfo.Data = msg
|
|
||||||
}
|
|
||||||
return pagedInfo, err
|
|
||||||
}
|
|
||||||
|
|
||||||
type GetMessageGroupsResult struct {
|
type GetMessageGroupsResult struct {
|
||||||
model.MessageGroup
|
model.MessageGroup
|
||||||
Avatar string `json:"avatar"`
|
Avatar string `json:"avatar"`
|
||||||
|
|||||||
@@ -1,340 +0,0 @@
|
|||||||
package model
|
|
||||||
|
|
||||||
import (
|
|
||||||
"time"
|
|
||||||
|
|
||||||
"git.rosy.net.cn/baseapi/platformapi/txcloudapi"
|
|
||||||
)
|
|
||||||
|
|
||||||
const (
|
|
||||||
JobStatusDoing = 0 //正在进行中
|
|
||||||
JobStatusFinished = 1 //任务所有都被完成
|
|
||||||
JobStatusFailed = -1 //任务发布失败
|
|
||||||
JobStatusOverdue = -2 //任务过期
|
|
||||||
|
|
||||||
JobLimitCountTypePO = 1 //每人一次
|
|
||||||
JobLimitCountTypePDO = 2 //每人每天一次
|
|
||||||
JobLimitCountTypePWO = 3 //每人每周一次
|
|
||||||
JobLimitCountTypeNoLimit = 4 //不限制
|
|
||||||
|
|
||||||
JobOrderStatusSpec = 1 //特殊状态(联盟任务)
|
|
||||||
JobOrderStatusAccept = 5
|
|
||||||
JobOrderStatusWaitAudit = 10
|
|
||||||
JobOrderStatusAuditPass = 15
|
|
||||||
JobOrderStatusAuditUnPass = 20
|
|
||||||
JobOrderStatusFinish = 110
|
|
||||||
JobOrderStatusCancel = 115
|
|
||||||
|
|
||||||
JobTimerTypeAccept = 1 //接受任务
|
|
||||||
JobTimerTypeSubmit = 2 //交任务
|
|
||||||
JobTimerTypeDropShipping = 3 //一件代发限时发货
|
|
||||||
|
|
||||||
JobTimerStatusWait = 0 //正在进行
|
|
||||||
JobTimerStatusFinish = 1 //定时任务已完成
|
|
||||||
|
|
||||||
JobTypeNormal = 0 //普通任务
|
|
||||||
JobTypeMtMember = 1 //美团会员任务
|
|
||||||
JobTypeJdDelivery = 2 //京东快递任务
|
|
||||||
JobTypeOther = 3 //其他任务(可能是存储信息用的
|
|
||||||
|
|
||||||
JobCashbackPrice = 1 //返现类型固定返现
|
|
||||||
JobCashbackPercentage = 2 //返现类型比例返现
|
|
||||||
|
|
||||||
JobCategoryIDwmtg = 3 //任务类型外卖推广
|
|
||||||
JobCategoryIDOther = 4 //其他任务类型
|
|
||||||
JobCategoryIDDropShipping = 5 //一件代发
|
|
||||||
JobCategoryIDUnion = 6 //联盟任务
|
|
||||||
|
|
||||||
JobSpanTop = 1 //置顶
|
|
||||||
JobSpanRecommend = 2 //推荐
|
|
||||||
|
|
||||||
JobCountrywideCode = 999
|
|
||||||
)
|
|
||||||
|
|
||||||
const (
|
|
||||||
/*消费类型*/
|
|
||||||
ConsumeTypePublishJob = 1 //发任务
|
|
||||||
ConsumeTypeMember = 2 //充会员
|
|
||||||
ConsumeTypeDelivery = 3 //发快递
|
|
||||||
)
|
|
||||||
|
|
||||||
var (
|
|
||||||
DeliveryStatusName = map[int]string{
|
|
||||||
OrderStatusNew: "上门取件中",
|
|
||||||
OrderStatusDelivering: "配送中",
|
|
||||||
OrderStatusFinished: "已妥投",
|
|
||||||
OrderStatusCanceled: "已取消",
|
|
||||||
}
|
|
||||||
|
|
||||||
CashbackName = map[int]string{
|
|
||||||
JobCashbackPrice: "固定返现",
|
|
||||||
JobCashbackPercentage: "比例返现",
|
|
||||||
}
|
|
||||||
|
|
||||||
ConsumeName = map[int]string{
|
|
||||||
ConsumeTypePublishJob: "发任务",
|
|
||||||
ConsumeTypeMember: "充会员",
|
|
||||||
ConsumeTypeDelivery: "发快递",
|
|
||||||
}
|
|
||||||
|
|
||||||
TxWaybillNames = map[int]string{
|
|
||||||
txcloudapi.StatusErr: "单号或代码错误",
|
|
||||||
txcloudapi.StatusNull: "暂无轨迹",
|
|
||||||
txcloudapi.StatusAccept: "快递收件",
|
|
||||||
txcloudapi.StatusDelivering: "在途中",
|
|
||||||
txcloudapi.StatusFinished: "已签收",
|
|
||||||
txcloudapi.StatusProblem: "问题件 (派件不成功或要求择日派送)",
|
|
||||||
txcloudapi.StatusException: "疑难件(收件人拒绝签收,地址有误或不能送达派送区域,收费等原因无法正常派送)",
|
|
||||||
txcloudapi.StatusFailed: "退件签收",
|
|
||||||
}
|
|
||||||
)
|
|
||||||
|
|
||||||
type Job struct {
|
|
||||||
ModelIDCULD
|
|
||||||
|
|
||||||
UserID string `orm:"column(user_id)" json:"userID"` //发布人ID
|
|
||||||
JobCategoryID int `orm:"column(job_category_id)" json:"jobCategoryID"` //任务类型
|
|
||||||
JobSpanTop int `json:"jobSpanTop"` //置顶标签
|
|
||||||
TopSeq int `json:"topSeq"` //置顶顺序
|
|
||||||
JobSpanRecmd int `json:"jobSpanRecmd"` //推荐标签
|
|
||||||
RecmdSeq int `json:"recmdSeq"` //推荐顺序
|
|
||||||
Title string `orm:"size(255)" json:"title"` //任务标题
|
|
||||||
Content string `orm:"size(500)" json:"content"` //任务内容
|
|
||||||
Count int `json:"count"` //任务数量
|
|
||||||
SurplusCount int `json:"surplusCount"` //剩余数量
|
|
||||||
AvgPrice int `json:"avgPrice"` //单个任务金额或预估金额
|
|
||||||
DropShippingSkuPrice int `json:"dropShippingSkuPrice"` //一件代发任务商品价格
|
|
||||||
Percentage int `json:"percentage"` //如果是比例返现,返现比例
|
|
||||||
CashbackType int `json:"cashbackType"` //返现方式,1为固定返现,2为比例返现
|
|
||||||
TotalPrice int `json:"totalPrice"` //任务总金额
|
|
||||||
Status int `json:"status"` //任务状态
|
|
||||||
Address string `orm:"size(500)" json:"address"` //门店地址
|
|
||||||
Lng int `json:"lng"` //乘了10的6次方
|
|
||||||
Lat int `json:"lat"` //乘了10的6次方
|
|
||||||
JobLng float64 `json:"jobLng"` //任务发布地址
|
|
||||||
JobLat float64 `json:"jobLat"` //任务发布地址
|
|
||||||
JobCityCode int `json:"jobCityCode"` //任务所属城市,999代表全国
|
|
||||||
DropShippingAt int `json:"dropShippingAt"` //承诺一件代发几天内发货,小时数
|
|
||||||
JobLimitAt int `json:"jobLimitAt"` //任务限时完成小时数
|
|
||||||
AuditLimitAt int `json:"auditLimitAt"` //任务审核限时小时数
|
|
||||||
FinishedAt *time.Time `orm:"null" json:"finishedAt"` //接单截止日期
|
|
||||||
LimitCountType int `json:"limitCountType"` //任务限次类型,1为每人一次,2为每人每天一次,3为每人每周一次,4为不限制
|
|
||||||
VendorID int `orm:"column(vendor_id)" json:"vendorID"` //推广平台
|
|
||||||
StoreURL string `orm:"column(store_url)" json:"storeURL"` //门店链接
|
|
||||||
SkuURL string `orm:"column(sku_url)" json:"skuURL"` //商品优惠券链接
|
|
||||||
Type int `json:"type"` //任务类型,0为普通任务,1为特殊任务
|
|
||||||
BrowseCount int `json:"browseCount"` //任务浏览量,点一下加一下
|
|
||||||
UnionImg string `json:"unionImg"` //联盟任务分享链接的背景图
|
|
||||||
UnionQrcodePosition string `json:"unionQrcodePosition"` //联盟任务分享链接的二维码图的方位
|
|
||||||
UnionActID string `orm:"column(union_act_id)" json:"unionActID"` //联盟任务ID
|
|
||||||
// JobSteps []*JobStep `orm:"-" json:"jobSteps"`
|
|
||||||
// JobImgs []*JobImg `orm:"-" json:"jobImgs"`
|
|
||||||
}
|
|
||||||
|
|
||||||
func (v *Job) TableIndex() [][]string {
|
|
||||||
return [][]string{
|
|
||||||
[]string{"UserID"},
|
|
||||||
[]string{"CreatedAt"},
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
type JobExt struct {
|
|
||||||
FinishedAtStr string `json:"finishedAtStr"` //接单截止日期
|
|
||||||
Job
|
|
||||||
JobSteps []*JobStep `orm:"-" json:"jobSteps"`
|
|
||||||
JobImgs []*JobImg `orm:"-" json:"jobImgs"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type JobImg struct {
|
|
||||||
ModelIDCUL
|
|
||||||
|
|
||||||
JobID int `orm:"column(job_id)" json:"jobID"` //任务ID
|
|
||||||
Img string `orm:"size(500)" json:"img"` //图片
|
|
||||||
}
|
|
||||||
|
|
||||||
func (v *JobImg) TableIndex() [][]string {
|
|
||||||
return [][]string{
|
|
||||||
[]string{"JobID"},
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
type JobCategory struct {
|
|
||||||
ModelIDCULD
|
|
||||||
|
|
||||||
Name string `orm:"size(48)" json:"name"` //类型名称
|
|
||||||
Img string `orm:"size(500)" json:"img"` //类型图片
|
|
||||||
}
|
|
||||||
|
|
||||||
func (v *JobCategory) TableUnique() [][]string {
|
|
||||||
return [][]string{
|
|
||||||
[]string{"Name"},
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
type JobStep struct {
|
|
||||||
ModelIDCULD
|
|
||||||
|
|
||||||
JobID int `orm:"column(job_id)" json:"jobID"` //任务ID
|
|
||||||
StepCount int `json:"stepCount"` //步骤数
|
|
||||||
Content string `orm:"size(500)" json:"content"` //步骤内容
|
|
||||||
Img string `orm:"size(500)" json:"img"` //步骤图片
|
|
||||||
Type int `json:"type"` //步骤类型,1为任务步骤,2为收集信息
|
|
||||||
}
|
|
||||||
|
|
||||||
func (v *JobStep) TableIndex() [][]string {
|
|
||||||
return [][]string{
|
|
||||||
[]string{"JobID"},
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
type JobOrder struct {
|
|
||||||
ModelIDCUL
|
|
||||||
|
|
||||||
JobID int `orm:"column(job_id)" json:"jobID"` //任务ID
|
|
||||||
JobOrderID int64 `orm:"column(job_order_id)" json:"jobOrderID"` //任务订单号
|
|
||||||
UserID string `orm:"column(user_id)" json:"userID"` //接任务人ID
|
|
||||||
Status int `json:"status"` //任务订单状态,接单,待审核,已审核,已结算等
|
|
||||||
SubmitAuditAt time.Time `json:"submitAuditTime"` //提交审核日期
|
|
||||||
AuditAt time.Time `json:"auditAt"` //审核日期
|
|
||||||
Content string `josn:"content"` //任务审核内容
|
|
||||||
Imgs string `json:"imgs"` //任务审核图片
|
|
||||||
Comment string `json:"comment"` //审核理由
|
|
||||||
UserActualPrice int `json:"userActualPrice"` //用户订单实际支付(用户自填)
|
|
||||||
|
|
||||||
DropShippingCount int `json:"dropShippingCount"` //一件代发购买商品数量
|
|
||||||
DropShippingDeliveryID int `orm:"column(drop_shipping_delivery_id)" json:"dropShippingDeliveryID"`
|
|
||||||
DropShippingName string `json:"dropShippingName"`
|
|
||||||
DropShippingMobile string `json:"dropShippingMobile"`
|
|
||||||
DropShippingAddress string `json:"dropShippingAddress"`
|
|
||||||
DropShippingDetailAddress string `json:"dropShippingDetailAddress"`
|
|
||||||
DropShippingLng float64 `json:"dropShippingLng"`
|
|
||||||
DropShippingLat float64 `json:"dropShippingLat"`
|
|
||||||
DropShippingAutoAddress string `json:"dropShippingAutoAddress"`
|
|
||||||
DropShippingCityCode int `json:"dropShippingCityCode"`
|
|
||||||
DropShippingDistrictCode int `json:"dropShippingDistrictCode"`
|
|
||||||
VendorWaybillID string `orm:"column(vendor_waybill_id)" json:"vendorWaybillID"` //运单号
|
|
||||||
WaybillInfo string `orm:"type(text)" json:"waybillInfo"` //物流信息
|
|
||||||
WaybillQueryTime time.Time `json:"waybillQueryTime"` //上次查询时间
|
|
||||||
WaybillStatus int `json:"waybillStatus"` //运单状态(一件代发)
|
|
||||||
DropShippingConfirmTime time.Time `orm:"type(datetime);null" json:"dropShippingConfirmTime"` //确认收货时间
|
|
||||||
DropShippingConfirmUser string `json:"dropShippingConfirmUser"` //确认收货人
|
|
||||||
}
|
|
||||||
|
|
||||||
func (v *JobOrder) TableIndex() [][]string {
|
|
||||||
return [][]string{
|
|
||||||
[]string{"JobID"},
|
|
||||||
[]string{"JobOrderID"},
|
|
||||||
[]string{"UserID"},
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
type JobTimer struct {
|
|
||||||
ModelIDCUL
|
|
||||||
|
|
||||||
JobID int `orm:"column(job_id)" json:"jobID"` //任务ID
|
|
||||||
JobOrderID int64 `orm:"column(job_order_id)" json:"jobOrderID"` //任务订单号
|
|
||||||
Type int `json:"type"` //定时任务类型,1为接受任务,2为提交审核
|
|
||||||
Status int `json:"status"` //定时任务的状态,0表示正在进行,1表示已经结束
|
|
||||||
StartAt time.Time `json:"startAt"` //定时任务开始时间
|
|
||||||
LimitAt int `json:"limitAt"` //定时任务时长(小时数)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (v *JobTimer) TableIndex() [][]string {
|
|
||||||
return [][]string{
|
|
||||||
[]string{"JobID"},
|
|
||||||
[]string{"JobOrderID"},
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
type JobSpan struct {
|
|
||||||
ModelIDCULD
|
|
||||||
|
|
||||||
JobID int `orm:"column(job_id)" json:"jobID"` //任务ID
|
|
||||||
EndAt *time.Time `json:"endAt"` //生效时间范围
|
|
||||||
SpanType int `json:"spanType"` //1为置顶,2为推荐
|
|
||||||
}
|
|
||||||
|
|
||||||
func (v *JobSpan) TableIndex() [][]string {
|
|
||||||
return [][]string{
|
|
||||||
[]string{"JobID", "DeletedAt"},
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
type MtMember struct {
|
|
||||||
ModelIDCULD
|
|
||||||
|
|
||||||
URL string `orm:"column(url)" json:"url"` //网址
|
|
||||||
ExpiryDate time.Time `json:"expiryDate"` //有效期
|
|
||||||
ShortLink string `json:"shortLink"` //密钥?
|
|
||||||
}
|
|
||||||
|
|
||||||
func (v *MtMember) TableUnique() [][]string {
|
|
||||||
return [][]string{
|
|
||||||
[]string{"URL"},
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (v *MtMember) TableIndex() [][]string {
|
|
||||||
return [][]string{
|
|
||||||
[]string{"DeletedAt"},
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
type StationInfo struct {
|
|
||||||
ModelIDCUL
|
|
||||||
|
|
||||||
StationID string `orm:"column(station_id)" json:"stationID"`
|
|
||||||
StationName string `json:"stationName"`
|
|
||||||
ProvinceName string `json:"provinceName"`
|
|
||||||
ProvinceID int `orm:"column(province_id)" json:"provinceID"`
|
|
||||||
CityName string `json:"cityName"`
|
|
||||||
Latitude float64 `json:"latitude"`
|
|
||||||
Longitude float64 `json:"longitude"`
|
|
||||||
Location string `json:"location"`
|
|
||||||
StarNum string `json:"starNum"`
|
|
||||||
Phone string `json:"phone"`
|
|
||||||
StationPic string `json:"stationPic"`
|
|
||||||
StationBannerPic string `json:"stationBannerPic"`
|
|
||||||
Prices string `orm:"type(text)" json:"prices"`
|
|
||||||
Adverts string `orm:"type(text)" json:"adverts"`
|
|
||||||
District string `json:"district"`
|
|
||||||
CityID int `orm:"column(city_id)" json:"cityID"`
|
|
||||||
StationType int `json:"stationType"`
|
|
||||||
Distance float64 `json:"distance"`
|
|
||||||
OilInfo []*OilInfo `orm:"-" json:"oilInfo"`
|
|
||||||
}
|
|
||||||
|
|
||||||
func (v *StationInfo) TableUnique() [][]string {
|
|
||||||
return [][]string{
|
|
||||||
[]string{"StationID"},
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (v *StationInfo) TableIndex() [][]string {
|
|
||||||
return [][]string{
|
|
||||||
[]string{"CityID", "ProvinceID"},
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
type OilInfo struct {
|
|
||||||
OilID string `json:"oilId"`
|
|
||||||
StationPrice string `json:"stationPrice"`
|
|
||||||
OilType string `json:"oilType"`
|
|
||||||
DiscountPrice string `json:"discountPrice"`
|
|
||||||
CountryPrice string `json:"countryPrice"`
|
|
||||||
OilgunCodes []string `json:"oilgunCodes"`
|
|
||||||
OilCode string `json:"oilCode"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type AddressDistinguish struct {
|
|
||||||
ModelIDCUL
|
|
||||||
|
|
||||||
Address string `json:"address"`
|
|
||||||
Info string `orm:"type(text)" json:"info"`
|
|
||||||
}
|
|
||||||
|
|
||||||
func (v *AddressDistinguish) TableUnique() [][]string {
|
|
||||||
return [][]string{
|
|
||||||
[]string{"Address"},
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,17 +0,0 @@
|
|||||||
package model
|
|
||||||
|
|
||||||
type VendorMatterCategory struct {
|
|
||||||
ModelIDCULD
|
|
||||||
|
|
||||||
VendorID int `orm:"column(vendor_id)" json:"vendorID"`
|
|
||||||
CategoryID string `orm:"column(category_id)" json:"categoryID"`
|
|
||||||
CategoryName string `json:"categoryName"`
|
|
||||||
ParentID int `orm:"column(parent_id)" json:"parentID"`
|
|
||||||
Level int `json:"level"`
|
|
||||||
}
|
|
||||||
|
|
||||||
func (v *VendorMatterCategory) TableUnique() [][]string {
|
|
||||||
return [][]string{
|
|
||||||
[]string{"VendorID", "CategoryID"},
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,21 +0,0 @@
|
|||||||
package controllers
|
|
||||||
|
|
||||||
import (
|
|
||||||
beego "github.com/astaxie/beego/server/web"
|
|
||||||
)
|
|
||||||
|
|
||||||
type PrintController struct {
|
|
||||||
beego.Controller
|
|
||||||
}
|
|
||||||
|
|
||||||
// @Title 添加打印机
|
|
||||||
// @Description 添加打印机
|
|
||||||
// @Param app_id formData string true "应用ID"
|
|
||||||
// @Param timestamp formData int true "unix时间戳"
|
|
||||||
// @Param sign formData string true "签名"
|
|
||||||
// @Success 200 {object} controllers.CallResult
|
|
||||||
// @Failure 200 {object} controllers.CallResult
|
|
||||||
// @router /AddPrint [post]
|
|
||||||
func (c *PrintController) AddPrint() {
|
|
||||||
|
|
||||||
}
|
|
||||||
Reference in New Issue
Block a user