123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283 |
- package servers
- import (
- . "app.yhyue.com/moapp/jybase/api"
- "app.yhyue.com/moapp/jybase/common"
- "app.yhyue.com/moapp/jybase/go-xweb/xweb"
- "encoding/json"
- "errors"
- "fmt"
- "jy-docs/config"
- "jy-docs/public"
- "jy-docs/rpc"
- "log"
- "time"
- )
- type UserDoc struct {
- *xweb.Action
- userList xweb.Mapper `xweb:"/user/list"` //用户列表
- collectAdd xweb.Mapper `xweb:"/user/collect/add"` //收藏文库
- collectRemove xweb.Mapper `xweb:"/user/collect/remove"` //取消收藏
- docBuy xweb.Mapper `xweb:"/user/buy"` //文库购买
- info xweb.Mapper `xweb:"/user/info"` //文库会员信息
- }
- // 用户文库列表
- func (userDoc *UserDoc) UserList() {
- userId := common.ObjToString(userDoc.GetSession("userId"))
- rData, errMsg := func() (interface{}, error) {
- pageNumReq, _ := userDoc.GetInt("num")
- pageSizeReq, _ := userDoc.GetInt("size")
- sign, _ := userDoc.GetInt("sign") // 0兑换的 1收藏的 2回收站的
- pageNum, pageSize, _ := public.PageNumParse(pageNumReq, pageSizeReq, -1)
- if sign < 0 || sign > 2 {
- return nil, fmt.Errorf("请求参数异常")
- }
- collectList, total, err := rpc.GetUserDocs(userId, pageNum, pageSize, sign)
- if err != nil {
- return nil, err
- }
- return map[string]interface{}{
- "total": total,
- "list": collectList,
- }, nil
- }()
- if errMsg != nil {
- log.Printf("%s UserDoc collectList err:%s\n", userId, errMsg.Error())
- }
- userDoc.ServeJson(NewResult(rData, errMsg))
- }
- func (userDoc *UserDoc) CollectAdd() {
- userId := common.ObjToString(userDoc.GetSession("userId"))
- rData, errMsg := func() (interface{}, error) {
- docId := userDoc.GetString("docId")
- if docId == "" {
- return nil, fmt.Errorf("参数异常")
- }
- err := rpc.SetUserCollect(userId, docId)
- if err != nil {
- return nil, err
- }
- return "success", nil
- }()
- if errMsg != nil {
- log.Printf("%s UserDoc collectAdd err:%s\n", userId, errMsg.Error())
- }
- userDoc.ServeJson(NewResult(rData, errMsg))
- }
- func (userDoc *UserDoc) CollectRemove() {
- userId := common.ObjToString(userDoc.GetSession("userId"))
- rData, errMsg := func() (interface{}, error) {
- docId := userDoc.GetString("docId")
- if docId == "" {
- return nil, fmt.Errorf("参数异常")
- }
- err := rpc.DelUserCollect(userId, docId)
- if err != nil {
- return nil, err
- }
- return "success", nil
- }()
- if errMsg != nil {
- log.Printf("%s UserDoc collectRemove err:%s\n", userId, errMsg.Error())
- }
- userDoc.ServeJson(NewResult(rData, errMsg))
- }
- func (userDoc *UserDoc) DocBuy() {
- // 加用户锁
- userInfo := public.GetUserBaseInfo(userDoc.Session())
- userId := userInfo.UserId
- pLock := public.GetNewDocBuyLock(fmt.Sprintf("%s", userId))
- pLock.Lock()
- defer pLock.Unlock()
- rData, errMsg := func() (interface{}, error) {
- docId := userDoc.GetString("docId")
- phone := userDoc.GetString("phone")
- payType, _ := userDoc.GetInt("payType") // 0-正常下载 1-原价下载 2-使用一次免费下载机会(会员免费文档 留资)
- if docId == "" {
- return nil, fmt.Errorf("参数异常")
- }
- var userPoint, docPoint int64 = 0, 0
- var err error
- usePoint := true // 是否消耗剑鱼币 会员免费文档且当天100篇以内的或者使用免费下载机会的 不用扣积分
- useSLTimes := false // 使用留资机会的下载次数
- //查询文档所需积分及文档类型
- docInfo, isBuy, _, err := rpc.GetDocDetail(userId, docId)
- if err != nil {
- return nil, err
- }
- if isBuy {
- return nil, fmt.Errorf("已兑换,请勿重复操作")
- }
- // 获取用户身份
- docMember, err := getDocMemberStatus(userId)
- if err != nil {
- return nil, err
- }
- docMemberStatus := docMember["docMemberStatus"].(bool)
- freeDownload := docMember["free_download"].(int)
- if docMemberStatus {
- // 会员
- switch payType {
- case public.PayTypeNormal:
- if docInfo.ProductType == public.ProductTypeMemberFree {
- // 如果是会员免费 判断是否超出进入下载次数
- // 获取今日下载次数
- count, err2 := rpc.TodayCount(userId)
- if err2 != nil {
- return nil, err2
- }
- if int(count) >= config.JyDocsAppConfig.DocMember.Times {
- return map[string]interface{}{
- "status": public.StatusMemberFreeExhaust,
- }, nil
- }
- // 没有超过下载次数 下一步应该到转存 不用扣剑鱼币
- usePoint = false
- } else {
- // 精品文档
- docPoint = docInfo.DocMemberPrice // 会员价
- }
- case public.PayTypeFullPrice:
- docPoint = docInfo.Price
- default:
- return nil, errors.New("payType类型不匹配")
- }
- } else {
- switch payType {
- case public.PayTypeFreeSL:
- if freeDownload != public.FreeDownloadHasFreeTimes || docInfo.ProductType != public.ProductTypeMemberFree {
- return nil, fmt.Errorf("没有免费下载机会")
- }
- usePoint = false // 免费下载的不扣剑鱼币
- useSLTimes = true // 后边要处理该字段
- case public.PayTypeFullPrice:
- docPoint = docInfo.Price // 原价下的
- default:
- return nil, errors.New("payType类型不匹配")
- }
- }
- var serialNumber string
- if usePoint { // 扣积分
- //查询用户剩余积分
- userPoint, err = rpc.GetUserPointValue(userId)
- if err != nil {
- return nil, err
- }
- //积分够调扣积分
- if userPoint < docPoint {
- return nil, fmt.Errorf("剩余积分不足")
- }
- bytes, err := json.Marshal(map[string]interface{}{
- "name": docInfo.DocName,
- "summary": docInfo.DocSummary,
- "img": docInfo.PreviewImgId,
- "fType": docInfo.DocFileType,
- })
- if err != nil {
- return nil, fmt.Errorf("文库异常")
- }
- serialNumber, err = rpc.SpendUserPoint(userId, docInfo.DocId, string(bytes), docPoint)
- if err != nil {
- return nil, err
- }
- }
- // 没有ossdocId 说明是还没有下过的 需要先获得地址
- if docInfo.OssDocId == "" {
- // 如果是精品 则需要先调购买接口
- if docInfo.ProductType == public.ProductTypePremium {
- _, err2 := rpc.PartUserBuy(docId, userInfo.MgoUserId, userInfo.Phone, userInfo.PositionId)
- if err2 != nil {
- return nil, fmt.Errorf("获取失败")
- }
- }
- // 如果是免费则直接调
- _, err := rpc.PartDocDownload(docId, userInfo.MgoUserId, userInfo.Phone, userInfo.PositionId)
- if err != nil {
- return nil, fmt.Errorf("获取失败")
- }
- }
- //转存文库
- err = rpc.PayDoc(userId, docId)
- if err != nil {
- return nil, err
- }
- if useSLTimes {
- public.Compatible.Update(userId, map[string]interface{}{
- "$set": M{
- "i_doc_free_download": 1,
- },
- })
- }
- //手机号采集
- go func() {
- if phone != "" {
- public.MQFW.Save("user_msg", map[string]interface{}{
- "s_userId": userId,
- "s_phone": phone,
- "i_phoneCheck": -1, //未验证
- "i_time": time.Now().Unix(),
- "s_source": "jydoc",
- })
- }
- rpc.DocStatistics(userId, docId, rpc.Down)
- }()
- return map[string]interface{}{
- "code": serialNumber,
- "balance": userPoint - docPoint,
- "payTime": time.Now().Unix(),
- "payWay": "剑鱼币",
- }, nil
- }()
- if errMsg != nil {
- log.Printf("%s UserDoc docBuy err:%s\n", userId, errMsg.Error())
- }
- userDoc.ServeJson(NewResult(rData, errMsg))
- }
- // Info 剑鱼文库会员信息
- func (userDoc *UserDoc) Info() {
- userId := common.ObjToString(userDoc.GetSession("userId"))
- rData, errMsg := func() (interface{}, error) {
- if userId == "" {
- return map[string]interface{}{
- "docMemberStatus": false,
- "startTime": 0,
- "endTime": 0,
- "free_download": public.FreeDownloadNoSL,
- }, nil
- }
- return getDocMemberStatus(userId)
- }()
- if errMsg != nil {
- log.Printf("%s UserDoc Info err:%s\n", userId, errMsg.Error())
- }
- userDoc.ServeJson(NewResult(rData, errMsg))
- }
- func getDocMemberStatus(userId string) (map[string]interface{}, error) {
- mData := public.Compatible.Select(userId, `{"i_doc_status":1,"l_doc_endtime":1,"l_doc_starttime":1,"i_doc_free_download":1}`)
- if mData != nil && len(*mData) > 0 {
- vipStatus := common.IntAll((*mData)["i_doc_status"])
- free_download := common.IntAll((*mData)["i_doc_free_download"])
- if free_download == 0 && vipStatus <= 0 { // 不是文库会员时再查 没有使用过一次免费下载机会
- // 查留资
- count := public.MQFW.Count("saleLeads", map[string]interface{}{"userid": userId, "source": map[string]interface{}{"$in": config.JyDocsAppConfig.DocMember.Source}})
- if count > 0 {
- free_download = public.FreeDownloadHasFreeTimes
- } else {
- free_download = public.FreeDownloadNoSL
- }
- }
- return map[string]interface{}{
- "docMemberStatus": vipStatus > 0,
- "startTime": (*mData)["l_doc_starttime"],
- "endTime": (*mData)["l_doc_endtime"],
- "free_download": free_download,
- }, nil
- }
- return nil, errors.New("获取文库会员状态失败")
- }
|