package controllers

import (
	"fmt"
	"git.rosy.net.cn/baseapi/platformapi/weixinapi"
	"git.rosy.net.cn/baseapi/utils"
	"git.rosy.net.cn/jx-callback/business/auth2"
	"git.rosy.net.cn/jx-callback/business/auth2/authprovider/weixin"
	"git.rosy.net.cn/jx-callback/business/authz"
	"git.rosy.net.cn/jx-callback/business/authz/autils"
	"git.rosy.net.cn/jx-callback/business/jxstore/cms"
	"git.rosy.net.cn/jx-callback/business/jxutils"
	"git.rosy.net.cn/jx-callback/business/jxutils/jsonerr"
	"git.rosy.net.cn/jx-callback/business/model"
	"git.rosy.net.cn/jx-callback/business/model/dao"
	"git.rosy.net.cn/jx-callback/business/partner/purchase/jx/localjx"
	"github.com/astaxie/beego/server/web"
)

type User2Controller struct {
	web.Controller
}

// @Title 用户注册
// @Description 用户注册
// @Param	token				header		string	false	"管理员token"
// @Param	payload				formData	string	true	"json数据，User对象(手机号必填)"
// @Param	mobileVerifyCode	formData	string	false	"手机验证码（通过auth2.SendVerifyCode获得）（mobileVerifyCode与authToken不能同时为空）"
// @Param	authToken			formData	string	false	"之前通过login得到的认证TOKEN（mobileVerifyCode与authToken不能同时为空）"
// @Param	version				formData	string	false	"当app登录时，需要传版本号"
// @Success 200 {object} controllers.CallResult
// @Failure 200 {object} controllers.CallResult
// @router /RegisterUser [post]
func (c *User2Controller) RegisterUser() {
	c.callRegisterUser(func(params *tUser2RegisterUserParams) (retVal interface{}, errCode string, err error) {
		var (
			user                     model.User
			inAuthInfo, manTokenInfo *auth2.AuthInfo
		)
		if params.AuthToken != "" {
			inAuthInfo, err = auth2.GetTokenInfo(params.AuthToken)
			if inAuthInfo.AuthBindInfo.Type == weixin.AuthTypeWxApp || inAuthInfo.AuthBindInfo.Type == weixin.AuthTypeWxAppCaishi {
				if configs, _ := dao.QueryConfigs(dao.GetDB(), "checkversion", model.ConfigTypeSys, ""); len(configs) > 0 {
					if params.Version == "" || configs[0].Value != params.Version {
						return nil, "", fmt.Errorf("当前APP版本过旧，数据显示有错误，请到'京西菜市'公众号下载最新版本APP！")
					}
				}
			}
		} else if params.Token != "" {
			manTokenInfo, err = auth2.GetTokenInfo(params.Token)
		}
		if err == nil {
			if err = jxutils.Strings2Objs(params.Payload, &user); err == nil {
				user.Type = 0
				retVal, err = cms.RegisterUserWithMobile(params.Ctx, &user, params.MobileVerifyCode, inAuthInfo, manTokenInfo)
			}
		}
		return retVal, errCode, err
	})
}

// @Title 得到用户已经成功绑定的认证信息
// @Description 得到用户已经成功绑定的认证信息
// @Param	token		header		string	true	"认证token"
// @Success 200 {object} controllers.CallResult
// @Failure 200 {object} controllers.CallResult
// @router /GetBindAuthInfo [get]
func (c *User2Controller) GetBindAuthInfo() {
	c.callGetBindAuthInfo(func(params *tUser2GetBindAuthInfoParams) (retVal interface{}, errCode string, err error) {
		retVal, err = cms.GetUserBindAuthInfo(params.Ctx)
		return retVal, "", err
	})
}

// @Title 得到用户列表
// @Description 得到用户列表
// @Param	token		header		string	true	"认证token"
// @Param	userType	query		int		true	"用户类型（0表示全部）"
// @Param	keyword		query		string	faslse	"关键字，可以部分匹配"
// @Param	userIDs		query		string	faslse	"用户id列表"
// @Param	userID2		query		string	faslse	"用户id2，必须全匹配（外部唯一标识）"
// @Param	mobile		query		string	faslse	"用户手机，必须全匹配"
// @Param	offset		query		int		false	"门店列表起始序号（以0开始，缺省为0）"
// @Param	pageSize	query		int		false	"门店列表页大小（缺省为50，-1表示全部）"
// @Success 200 {object} controllers.CallResult
// @Failure 200 {object} controllers.CallResult
// @router /GetUsers [get]
func (c *User2Controller) GetUsers() {
	c.callGetUsers(func(params *tUser2GetUsersParams) (retVal interface{}, errCode string, err error) {
		var userIDs []string
		if err = jxutils.Strings2Objs(params.UserIDs, &userIDs); err == nil {
			retVal, err = cms.GetUsers(params.Ctx, params.UserType, params.Keyword, userIDs, params.UserID2, params.Mobile, params.Offset, params.PageSize)
		}
		return retVal, "", err
	})
}

// @Title 得到用户自己的门店列表
// @Description 得到用户自己的门店列表
// @Param	token		header		string		true	"认证token"
// @Param	version		query		string		false	"当app登录时，需要传版本号"
// @Success 200 {object} controllers.CallResult
// @Failure 200 {object} controllers.CallResult
// @router /GetMyStoreList [get]
func (c *User2Controller) GetMyStoreList() {
	c.callGetMyStoreList(func(params *tUser2GetMyStoreListParams) (retVal interface{}, errCode string, err error) {
		retVal, errCode, err = cms.GetMyStoreListNew(params.Ctx, params.Version)
		return retVal, errCode, err
	})
}

// @Title 用户手机号为空，不行
// @Description 用户手机号为空，不行
// @Param	token			header		string	true	"认证token"
// @Success 200 {object} controllers.CallResult
// @Failure 200 {object} controllers.CallResult
// @router /SolveNullMobileUser [post]
func (c *User2Controller) SolveNullMobileUser() {
	c.callSolveNullMobileUser(func(params *tUser2SolveNullMobileUserParams) (retVal interface{}, errCode string, err error) {
		err = cms.SolveNullMobileUser(params.Ctx)
		return retVal, "", err
	})
}

// @Title 得到可用的门店角色列表
// @Description 得到可用的门店角色列表
// @Param	token			header		string	true	"认证token"
// @Success 200 {object} controllers.CallResult
// @Failure 200 {object} controllers.CallResult
// @router /GetStoreRoleList [get]
func (c *User2Controller) GetStoreRoleList() {
	c.callGetStoreRoleList(func(params *tUser2GetStoreRoleListParams) (retVal interface{}, errCode string, err error) {
		retVal, err = cms.GetStoreRoleList(params.Ctx)
		return retVal, "", err
	})
}

// @Title 得到用户所具有的角色列表
// @Description 得到用户所具有的角色列表
// @Param	token			header		string	true	"认证token"
// @Param	userID			query		string	true	"用户i"
// @Success 200 {object} controllers.CallResult
// @Failure 200 {object} controllers.CallResult
// @router /GetUserRoleList [get]
func (c *User2Controller) GetUserRoleList() {
	c.callGetUserRoleList(func(params *tUser2GetUserRoleListParams) (retVal interface{}, errCode string, err error) {
		retVal, err = cms.GetUserRoleList(params.Ctx, params.UserID)
		return retVal, "", err
	})
}

// @Title 得到角色包括的用户列表
// @Description 得到角色包括的用户列表
// @Param	token			header		string	true	"认证token"
// @Param	roleName		query		string	true	"角色名"
// @Param	storeID			query		int		false	"门店ID（如果是全局角色不用填）"
// @Success 200 {object} controllers.CallResult
// @Failure 200 {object} controllers.CallResult
// @router /GetRoleUserList [get]
func (c *User2Controller) GetRoleUserList() {
	c.callGetRoleUserList(func(params *tUser2GetRoleUserListParams) (retVal interface{}, errCode string, err error) {
		retVal, err = cms.GetRoleUserList(params.Ctx, autils.NewRole(params.RoleName, params.StoreID))
		return retVal, "", err
	})
}

// @Title 批量得到角色包括的用户列表
// @Description 批量得到角色包括的用户列表
// @Param	token			header		string	true	"认证token"
// @Param	roleNames		query		string	true	"角色名"
// @Param	storeIDs		query		string	false	"门店ID（如果是全局角色不用填）"
// @Success 200 {object} controllers.CallResult
// @Failure 200 {object} controllers.CallResult
// @router /GetRolesUserList [get]
func (c *User2Controller) GetRolesUserList() {
	c.callGetRolesUserList(func(params *tUser2GetRolesUserListParams) (retVal interface{}, errCode string, err error) {
		var roleNames []string
		var storeIDs []int
		if err = jxutils.Strings2Objs(params.RoleNames, &roleNames, params.StoreIDs, &storeIDs); err == nil {
			var roleList []*authz.RoleInfo
			for _, roleName := range roleNames {
				if roleName == authz.StoreRoleBoss {
					for _, storeID := range storeIDs {
						roleList = append(roleList, autils.NewRole(roleName, storeID))
					}
				} else {
					roleList = append(roleList, autils.NewRole(roleName, 0))
				}
			}
			retVal, err = cms.GetRolesUserList(params.Ctx, roleList)
		}
		return retVal, "", err
	})
}

// @Title 给指定用户添加角色列表
// @Description 给指定用户添加角色列表
// @Param	token			header		string	true	"认证token"
// @Param	userID			formData	string	true	"用户ID"
// @Param	roleList		formData	string	true	"角色列表"
// @Success 200 {object} controllers.CallResult
// @Failure 200 {object} controllers.CallResult
// @router /AddRoles4User [post]
func (c *User2Controller) AddRoles4User() {
	c.callAddRoles4User(func(params *tUser2AddRoles4UserParams) (retVal interface{}, errCode string, err error) {
		var roleList []*authz.RoleInfo
		if err = jxutils.Strings2Objs(params.RoleList, &roleList); err == nil {
			err = cms.AddRoles4User(params.Ctx, params.UserID, roleList)
		}
		return retVal, "", err
	})
}

// @Title 给指定用户删除角色列表
// @Description 给指定用户删除角色列表
// @Param	token			header		string	true	"认证token"
// @Param	userID			query		string	true	"用户ID"
// @Param	roleList		query		string	true	"角色列表"
// @Success 200 {object} controllers.CallResult
// @Failure 200 {object} controllers.CallResult
// @router /DeleteRoles4User [delete]
func (c *User2Controller) DeleteRoles4User() {
	c.callDeleteRoles4User(func(params *tUser2DeleteRoles4UserParams) (retVal interface{}, errCode string, err error) {
		var roleList []*authz.RoleInfo
		if err = jxutils.Strings2Objs(params.RoleList, &roleList); err == nil {
			err = cms.DeleteRoles4User(params.Ctx, params.UserID, roleList)
		}
		return retVal, "", err
	})
}

// @Title 给指定角色添加用户列表
// @Description 给指定角色添加用户列表
// @Param	token			header		string	true	"认证token"
// @Param	roleName		formData	string	true	"角色名"
// @Param	storeID			formData	int		false	"门店ID"
// @Param	userIDs			formData	string	true	"用户ID列表"
// @Success 200 {object} controllers.CallResult
// @Failure 200 {object} controllers.CallResult
// @router /AddUsers4Role [post]
func (c *User2Controller) AddUsers4Role() {
	c.callAddUsers4Role(func(params *tUser2AddUsers4RoleParams) (retVal interface{}, errCode string, err error) {
		var userIDs []string
		if err = jxutils.Strings2Objs(params.UserIDs, &userIDs); err == nil {
			err = cms.AddUsers4Role(params.Ctx, autils.NewRole(params.RoleName, params.StoreID), userIDs)
		}
		return retVal, "", err
	})
}

// @Title 给指定角色删除用户列表
// @Description 给指定角色删除用户列表
// @Param	token			header		string	true	"认证token"
// @Param	roleName		query		string	true	"角色名"
// @Param	storeID			query		int		false	"门店ID"
// @Param	userIDs			query		string	true	"用户ID列表"
// @Success 200 {object} controllers.CallResult
// @Failure 200 {object} controllers.CallResult
// @router /DeleteUsers4Role [delete]
func (c *User2Controller) DeleteUsers4Role() {
	c.callDeleteUsers4Role(func(params *tUser2DeleteUsers4RoleParams) (retVal interface{}, errCode string, err error) {
		var userIDs []string
		if err = jxutils.Strings2Objs(params.UserIDs, &userIDs); err == nil {
			err = cms.DeleteUsers4Role(params.Ctx, autils.NewRole(params.RoleName, params.StoreID), userIDs)
		}
		return retVal, "", err
	})
}

// @Title 给指定角色添加用户列表
// @Description 给指定角色添加用户列表
// @Param	token			header		string	true	"认证token"
// @Param	mobile			formData	string	false	"手机号"
// @Success 200 {object} controllers.CallResult
// @Failure 200 {object} controllers.CallResult
// @router /TransferLegacyWeixins [post]
func (c *User2Controller) TransferLegacyWeixins() {
	c.callTransferLegacyWeixins(func(params *tUser2TransferLegacyWeixinsParams) (retVal interface{}, errCode string, err error) {
		err = cms.TransferLegacyWeixins(params.Mobile)
		return retVal, "", err
	})
}

// @Title 用户自己增加配送地址
// @Description 用户自己增加配送地址
// @Param	token			header		string	true	"认证token"
// @Param	consigneeName	formData	string	true	"收货人"
// @Param	consigneeMobile	formData	string	true	"收货人手机"
// @Param	address			formData	string	false	"地址(区县以下，门牌号以上的地址信息)"
// @Param	detailAddress	formData	string	false	"门牌号"
// @Param	lng				formData	float64	true	"经度"
// @Param	lat				formData	float64	true	"纬度"
// @Param	tag				formData	string	false	"标签"
// @Param	remark			formData	string	false	"备注"
// @Param	isDefault		formData	int		false	"是否是默认"
// @Param	cityCode		formData	int		false	"省code"
// @Param	districtCode	formData	int		false	"市code"
// @Success 200 {object} controllers.CallResult
// @Failure 200 {object} controllers.CallResult
// @router /AddMyDeliveryAddress [post]
func (c *User2Controller) AddMyDeliveryAddress() {
	c.callAddMyDeliveryAddress(func(params *tUser2AddMyDeliveryAddressParams) (retVal interface{}, errCode string, err error) {
		// var address *model.UserDeliveryAddress
		// if err = utils.Map2StructByJson(params.MapData, &address, true); err == nil {
		// 	retVal, err = cms.AddMyDeliveryAddress(params.Ctx, address)
		// }
		address := &model.UserDeliveryAddress{
			ConsigneeName:   params.ConsigneeName,
			ConsigneeMobile: params.ConsigneeMobile,
			Address:         params.Address,
			DetailAddress:   params.DetailAddress,
			Lng:             params.Lng,
			Lat:             params.Lat,
			Tag:             params.Tag,
			Remark:          params.Remark,
			IsDefault:       int8(params.IsDefault),
			CityCode:        params.CityCode,
			DistrictCode:    params.DistrictCode,
		}
		retVal, err = cms.AddMyDeliveryAddress(params.Ctx, address)
		return retVal, "", err
	})
}

// @Title 用户自己删除配送地址
// @Description 用户自己删除送地址
// @Param	token			header		string	true	"认证token"
// @Param	id				query		int		true	"地址ID"
// @Success 200 {object} controllers.CallResult
// @Failure 200 {object} controllers.CallResult
// @router /DeleteMyDeliveryAddress [delete]
func (c *User2Controller) DeleteMyDeliveryAddress() {
	c.callDeleteMyDeliveryAddress(func(params *tUser2DeleteMyDeliveryAddressParams) (retVal interface{}, errCode string, err error) {
		err = cms.DeleteMyDeliveryAddress(params.Ctx, params.Id)
		return retVal, "", err
	})
}

// @Title 用户自己修改配送地址
// @Description 用户自己修改配送地址
// @Param	token			header		string	true	"认证token"
// @Param	id				formData	int		true	"地址ID"
// @Param	consigneeName	formData	string	false	"收货人"
// @Param	consigneeMobile	formData	string	false	"收货人手机"
// @Param	address			formData	string	false	"地址(区县以下，门牌号以上的地址信息)"
// @Param	detailAddress	formData	string	false	"门牌号"
// @Param	lng				formData	float64	false	"经度"
// @Param	lat				formData	float64	false	"纬度"
// @Param	tag				formData	string	false	"标签"
// @Param	remark			formData	string	false	"备注"
// @Param	isDefault		formData	int		false	"是否是默认（0：否，1：是）"
// @Param	cityCode		formData	int		false	"省code"
// @Param	districtCode	formData	int		false	"市code"
// @Success 200 {object} controllers.CallResult
// @Failure 200 {object} controllers.CallResult
// @router /UpdateMyDeliveryAddress [put]
func (c *User2Controller) UpdateMyDeliveryAddress() {
	c.callUpdateMyDeliveryAddress(func(params *tUser2UpdateMyDeliveryAddressParams) (retVal interface{}, errCode string, err error) {
		err = cms.UpdateMyDeliveryAddress(params.Ctx, params.Id, params.MapData)
		return retVal, "", err
	})
}

// @Title 用户查询自己的配送地址
// @Description 用户查询自己的配送地址
// @Param	token			header		string	true	"认证token"
// @Success 200 {object} controllers.CallResult
// @Failure 200 {object} controllers.CallResult
// @router /QueryMyDeliveryAddress [get]
func (c *User2Controller) QueryMyDeliveryAddress() {
	c.callQueryMyDeliveryAddress(func(params *tUser2QueryMyDeliveryAddressParams) (retVal interface{}, errCode string, err error) {
		retVal, err = cms.QueryMyDeliveryAddress(params.Ctx)
		return retVal, "", err
	})
}

// @Title 得到用户指定门店的购物车信息
// @Description 得到用户指定门店的购物车信息
// @Param	token			header		string	true	"认证token"
// @Param	storeIDs		query		string	true	"门店ID"
// @Success 200 {object} controllers.CallResult
// @Failure 200 {object} controllers.CallResult
// @router /LoadMyCart [get]
func (c *User2Controller) LoadMyCart() {
	c.callLoadMyCart(func(params *tUser2LoadMyCartParams) (retVal interface{}, errCode string, err error) {
		_, userID := params.Ctx.GetMobileAndUserID()
		var storeIDs []int
		if err = jxutils.Strings2Objs(params.StoreIDs, &storeIDs); err == nil {
			retVal, err = cms.LoadUserCart(params.Ctx, userID, storeIDs)
		}
		return retVal, "", err
	})
}

// @Title 存储用户指定门店的购物车信息
// @Description 存储用户指定门店的购物车信息
// @Param	token			header		string	true	"认证token"
// @Param	storeID			formData		int		true	"门店ID"
// @Param	payload			formData		string	false	"完整的购物车商品列表"
// @Success 200 {object} controllers.CallResult
// @Failure 200 {object} controllers.CallResult
// @router /SaveMyCart [post]
func (c *User2Controller) SaveMyCart() {
	c.callSaveMyCart(func(params *tUser2SaveMyCartParams) (retVal interface{}, errCode string, err error) {
		var cartItems []*model.UserCartItem
		_, userID := params.Ctx.GetMobileAndUserID()
		if err = jxutils.Strings2Objs(params.Payload, &cartItems); err == nil {
			err = cms.SaveUserCart(params.Ctx, userID, params.StoreID, cartItems)
		}
		return retVal, "", err
	})
}

// @Title 得到用户自己的信息
// @Description 得到用户自己的信息
// @Param	token			header		string	true	"认证token"
// @Success 200 {object} controllers.CallResult
// @Failure 200 {object} controllers.CallResult
// @router /GetSelfInfo [get]
func (c *User2Controller) GetSelfInfo() {
	c.callGetSelfInfo(func(params *tUser2GetSelfInfoParams) (retVal interface{}, errCode string, err error) {
		retVal, err = cms.GetSelfInfo(params.Ctx)
		return retVal, "", err
	})
}

// @Title 根据小程序jsCode修改用户信息
// @Description 根据小程序jsCode修改用户信息
// @Param	token			header		string		true	"认证token"
// @Param	data			query		string		true	"加密数据"
// @Param	iv				query		string		true	"iv"
// @Param	jsCode			query		string		false	"小程序jsCode"
// @Success 200 {object} controllers.CallResult
// @Failure 200 {object} controllers.CallResult
// @router /UpdateUserByMiniInfo [put]
func (c *Auth2Controller) UpdateUserByMiniInfo() {
	c.callUpdateUserByMiniInfo(func(params *tAuth2UpdateUserByMiniInfoParams) (retVal interface{}, errCode string, err error) {
		authInfo, err := params.Ctx.GetV2AuthInfo()
		if err == nil {
			decryptedDataBase64, err2 := weixin.AutherObjMini.DecryptData(authInfo, GetComposedCode(&c.Controller, params.JsCode), params.Data, params.Iv)
			if err = err2; err == nil {
				var userInfo *weixinapi.MiniUserInfo
				if err = utils.UnmarshalUseNumber([]byte(decryptedDataBase64), &userInfo); err == nil {
					retVal = userInfo
					if user := params.Ctx.GetFullUser(); user != nil {
						if userInfo.AvatarURL != "" {
							user.Avatar = userInfo.AvatarURL
						}
						if userInfo.PurePhoneNumber != "" {
							user.Mobile = utils.String2Pointer(userInfo.PurePhoneNumber)
						}
						_, err = dao.UpdateEntity(dao.GetDB(), user)
						if err != nil && dao.IsDuplicateError(err) {
							if mobileAuth, err2 := auth2.LoginInternal(params.Ctx.Context, auth2.AuthTypeMobile, userInfo.PurePhoneNumber, auth2.UserIDMobile, auth2.InternalAuthSecret); err2 == nil {
								err = jsonerr.New(mobileAuth, model.ErrCodeJsonUserAlreadyExist)
							}
						} else if err == nil && userInfo.PurePhoneNumber != "" {
							if tokenInfo, err := auth2.GetTokenInfo(params.Token); err == nil {
								tokenInfo.Mobile = userInfo.PurePhoneNumber
								auth2.SetUserInfo(params.Token, tokenInfo, auth2.DefTokenDuration)
							}
						}
					}
				}
			}
		}
		return retVal, "", err
	})
}

// @Title 查找京东用户
// @Description 查找京东用户
// @Param	token				header		string	true	"认证token"
// @Param	isAsync				formData	bool	false	"是否异步操作"
// @Param	isContinueWhenError	formData	bool	false	"单个同步失败是否继续，缺省false"
// @Success 200 {object} controllers.CallResult
// @Failure 200 {object} controllers.CallResult
// @router /GetJdUsers [post]
func (c *User2Controller) GetJdUsers() {
	c.callGetJdUsers(func(params *tUser2GetJdUsersParams) (retVal interface{}, errCode string, err error) {
		retVal, err = cms.GetJdUsers(params.Ctx, params.IsAsync, params.IsContinueWhenError)
		return retVal, "", err
	})
}

// @Title 更新用户分成比例
// @Description 更新用户分成比例
// @Param	token				header		string	true	"认证token"
// @Param	userID				formData	string	true	"用户userID"
// @Param	dividePercentage	formData	int		fasle	"用户分成比例"
// @Param	isReceiver			formData	bool	true	"是否加入分账接收方,默认是"
// @Success 200 {object} controllers.CallResult
// @Failure 200 {object} controllers.CallResult
// @router /UpdateUserWxNoAndPercent [put]
func (c *User2Controller) UpdateUserWxNoAndPercent() {
	c.callUpdateUserWxNoAndPercent(func(params *tUser2UpdateUserWxNoAndPercentParams) (retVal interface{}, errCode string, err error) {
		retVal, err = cms.UpdateUserWxNoAndPercent(&model.User{
			UserID:           params.UserID,
			DividePercentage: params.DividePercentage,
		}, params.IsReceiver)
		return retVal, "", err
	})
}

// @Title 禁用用户（删除离职用户信息）
// @Description 禁用用户（删除离职用户信息）
// @Param	token				header		string	true	"认证token"
// @Param	userID				query		string	true	"用户userID"
// @Success 200 {object} controllers.CallResult
// @Failure 200 {object} controllers.CallResult
// @router /DeleteUserInfo [delete]
func (c *User2Controller) DeleteUserInfo() {
	c.callDeleteUserInfo(func(params *tUser2DeleteUserInfoParams) (retVal interface{}, errCode string, err error) {
		err = cms.DeleteUserInfo(params.Ctx, params.UserID)
		return retVal, "", err
	})
}

// @Title 得到用户自己的门店列表（商城用）
// @Description 得到用户自己的门店列表（商城用）
// @Param	token			header		string	false	"认证token"
// @Param	mobile			query		string	true	"电话"
// @Success 200 {object} controllers.CallResult
// @Failure 200 {object} controllers.CallResult
// @router /GetMyJxStoreList [get]
func (c *User2Controller) GetMyJxStoreList() {
	c.callGetMyJxStoreList(func(params *tUser2GetMyJxStoreListParams) (retVal interface{}, errCode string, err error) {
		retVal, err = cms.GetMyJxStoreList(params.Ctx, params.Mobile)
		return retVal, "", err
	})
}

// @Title 插入用户协议表
// @Description 插入用户协议表
// @Param	token			header		string	false	"认证token"
// @Param	payload			formData	string	true	"格式数据，UserAgreement"
// @Success 200 {object} controllers.CallResult
// @Failure 200 {object} controllers.CallResult
// @router /CreateUserAgreement [post]
func (c *User2Controller) CreateUserAgreement() {
	c.callCreateUserAgreement(func(params *tUser2CreateUserAgreementParams) (retVal interface{}, errCode string, err error) {
		var userAgrs []*model.UserAgreement
		if err = jxutils.Strings2Objs(params.Payload, &userAgrs); err == nil {
			cms.CreateUserAgreement(params.Ctx, userAgrs)
		}
		return retVal, "", err
	})
}

// @Title 查询用户协议表
// @Description 查询用户协议表
// @Param	token			header	string		false	"认证token"
// @Param	name			query 	string		false	"名字"
// @Param	idNumber		query 	string		false	"身份证号"
// @Param	bankNumber		query	string		false	"银行卡号"
// @Param	mobile			query	string		false	"电话"
// @Success 200 {object} controllers.CallResult
// @Failure 200 {object} controllers.CallResult
// @router /GetUserAgreement [get]
func (c *User2Controller) GetUserAgreement() {
	c.callGetUserAgreement(func(params *tUser2GetUserAgreementParams) (retVal interface{}, errCode string, err error) {
		cms.GetUserAgreement(params.Ctx, params.Name, params.IdNumber, params.BankNumber, params.Mobile)
		return retVal, "", err
	})
}

// @Title 查询京西商城用户信息
// @Description 查询京西商城用户信息
// @Param	token			header	string	true	"认证token"
// @Param	keyword			query	string	false	"关键字"
// @Param	fromTime		query	string	false	"开始时间"
// @Param	toTime			query	string	false	"结束时间"
// @Param	vendorIDs		query	string	false	"平台号"
// @Param	offset			query	int		false	"结果起始序号（以0开始，缺省为0）"
// @Param	pageSize		query	int		false	"结果页大小（缺省为50，-1表示全部）"
// @Success 200 {object} controllers.CallResult
// @Failure 200 {object} controllers.CallResult
// @router /GetJxShopUsers [get]
func (c *User2Controller) GetJxShopUsers() {
	c.callGetJxShopUsers(func(params *tUser2GetJxShopUsersParams) (retVal interface{}, errCode string, err error) {
		var vendorIDs []int
		if err = jxutils.Strings2Objs(params.VendorIDs, &vendorIDs); err == nil {
			retVal, err = localjx.GetJxShopUsers(params.Ctx, params.Keyword, params.FromTime, params.ToTime, vendorIDs, params.Offset, params.PageSize)
		}
		return retVal, "", err
	})
}

// @Title 更新用户上次浏览门店和品牌
// @Description 更新用户上次浏览门店和品牌
// @Param	token			header		string	true	"认证token"
// @Param	storeID			formData	int		false	"门店ID"
// @Param	brandID			formData	int		false	"品牌ID"
// @Success 200 {object} controllers.CallResult
// @Failure 200 {object} controllers.CallResult
// @router /UpdateUserLastInfo [post]
func (c *User2Controller) UpdateUserLastInfo() {
	c.callUpdateUserLastInfo(func(params *tUser2UpdateUserLastInfoParams) (retVal interface{}, errCode string, err error) {
		err = cms.UpdateUserLastInfo(params.Ctx, params.StoreID, params.BrandID)
		return retVal, "", err
	})
}

// @Title 查询用户是否拥有当前店铺权限
// @Description 查询用户是否拥有当前店铺权限
// @Param	token			header		string	true	"认证token"
// @Param	storeID			query		int		true	"门店ID"
// @Success 200 {object} controllers.CallResult
// @Failure 200 {object} controllers.CallResult
// @router /GetUserStoreAuth [get]
func (c *User2Controller) GetUserStoreAuth() {
	c.callGetUserStoreAuth(func(params *tUser2GetUserStoreAuthParams) (retVal interface{}, errCode string, err error) {
		retVal, err = cms.GetUserStoreAuth(params.Ctx, params.StoreID)
		return retVal, "", err
	})
}

// @Title 得到自己登录的信息
// @Description 得到自己登录的信息
// @Param	token		header		string	true	"认证token"
// @Success 200 {object} controllers.CallResult
// @Failure 200 {object} controllers.CallResult
// @router /GetUserInfo [get]
func (c *User2Controller) GetUserInfo() {
	c.callGetUserInfo(func(params *tUser2GetUserInfoParams) (retVal interface{}, errCode string, err error) {
		retVal, err = cms.GetUserInfo(params.Ctx)
		return retVal, "", err
	})
}
