Browse Source

no message

xingzai 11 tháng trước cách đây
mục cha
commit
0c36d520f1

+ 14 - 0
controllers/activity.go

@@ -892,6 +892,20 @@ func (this *ActivityNoLoginController) Detail() {
 		resp.HasPermission = hasPermission
 		resp.SellerName = sellerName
 		resp.SellerMobile = sellerMobile
+
+		if (!activityInfo.IsResearchPoints && activityInfo.IsLimitPeople == 0) || activityInfo.YidongActivityId != "" { //易董的活动 或者(不扣点且不限制人数)走月卡日卡逻辑
+			resp.GoodsList = services.GetUserGoodsCardList() //日卡月卡商品信息
+		} else {
+			resp.GoodsList = services.GetGoodsInfoByActivity(activityInfo) //单场活动信息
+			fmt.Println("activityId", activityId)
+			resp.OrderCode, resp.PayTimeCountdown = services.GetHaverEquallyOrderByUser10MinByActivty(uid, activityId) //截止支付时间倒计时
+		}
+		for _, v := range resp.GoodsList {
+			resp.PopupPriceMsg += v.PopupPriceMsg //价格弹窗信息
+		}
+		resp.IsShowWxPay = utils.IS_SHOW_WX_PAY                                                      //是否展示微信支付按钮
+		resp.IsCompanyApply = services.GetUserApplyRecordCountByCompanyIdPay(user.CompanyId)         //获取客户是否有过历史申请记录
+		resp.IsNeedBusinessCard = services.GetCygxUserBusinessCardCount(user.UserId, user.CompanyId) //是否需要上传名片
 	}
 	// 判断是否属于研选类型的活动
 	if strings.Contains(activityInfo.ChartPermissionName, utils.CHART_PERMISSION_NAME_YANXUAN) {

+ 40 - 252
controllers/article.go

@@ -2,7 +2,6 @@ package controllers
 
 import (
 	"encoding/json"
-	"fmt"
 	"hongze/hongze_web_mfyx/models"
 	"hongze/hongze_web_mfyx/services"
 	"hongze/hongze_web_mfyx/utils"
@@ -51,15 +50,6 @@ func (this *ArticleNoLoginController) Detail() {
 	}
 	detail := new(models.ArticleDetail)
 	hasPermission := 0
-	hasFree := 0
-	var haveResearch bool
-	//判断是否已经申请过
-	applyCount, err := models.GetApplyRecordCount(uid)
-	if err != nil && err.Error() != utils.ErrNoRow() {
-		br.Msg = "获取信息失败"
-		br.ErrMsg = "判断是否已申请过试用失败,Err:" + err.Error()
-		return
-	}
 
 	//resp := new(models.ArticleDetailResp)
 	detail, err = models.GetArticleDetailById(articleId)
@@ -68,208 +58,24 @@ func (this *ArticleNoLoginController) Detail() {
 		br.ErrMsg = "获取信息失败,Err:" + err.Error()
 		return
 	}
+	resp.IsResearch = true
 
-	// 判断是否属于研选类型的报告
-	if strings.Contains(detail.CategoryName, utils.CHART_PERMISSION_NAME_YANXUAN) {
-		resp.IsResearch = true
+	havePower, err := services.GetArticleDetailUserPower(user, detail)
+	if err != nil {
+		br.Msg = "获取信息失败"
+		br.ErrMsg = "校验用户权限失败,Err:" + err.Error()
+		return
 	}
-	// 高毅资产的联系人,有权限的行业也不能查看报告详情页。提示无权限页面
-	if detail.ArticleTypeId == 0 && user.CompanyId == utils.GAO_YI_ZI_CHAN_COMPANY_ID {
-		_, sellerName, sellerMobile, popupMsg, err := services.GetUserHasPermissionArticle(user)
-		if err != nil {
-			br.Msg = "获取信息失败"
-			br.ErrMsg = "判断是否已申请过试用失败,Err:" + err.Error()
-			return
-		}
-		resp.PopupMsg = popupMsg
-		resp.HasPermission = 3
-		resp.SellerName = sellerName
-		resp.SellerMobile = sellerMobile
-		detail.Body = ""
-		detail.Abstract = ""
-		detail.Seller.SellerName = sellerName
-		detail.Seller.SellerMobile = sellerMobile
-		resp.Detail = detail
-		br.Ret = 200
-		br.Success = true
-		br.Msg = "获取成功"
-		br.Data = resp
-		return
-	}
-	//是否属于专项调研报告
-	if detail.SubCategoryName == "专项调研" {
-		detail.IsSpecialArticle = true
-		havePower, err := services.GetSpecialArticleDetailUserPower(user, detail)
-		if err != nil {
-			br.Msg = "获取信息失败"
-			br.ErrMsg = "判断是否已申请过试用失败,Err:" + err.Error()
-			return
-		}
-		resp.IsSpecialArticle = true
-		if !havePower {
-			hasPermission, sellerName, sellerMobile, popupMsg, err := services.GetUserHasPermissionArticle(user)
-			if err != nil {
-				br.Msg = "获取信息失败"
-				br.ErrMsg = "判断是否已申请过试用失败,Err:" + err.Error()
-				return
-			}
-			resp.PopupMsg = popupMsg
-			resp.HasPermission = hasPermission
-			resp.SellerName = sellerName
-			resp.SellerMobile = sellerMobile
-			//detail.Body = ""
-			//detail.Abstract = ""
-			detail.Seller.SellerName = sellerName
-			detail.Seller.SellerMobile = sellerMobile
-			resp.Detail = detail
-			br.Ret = 200
-			br.Success = true
-			br.Msg = "获取成功"
-			br.Data = resp
-			return
+	if havePower {
+		hasPermission = 1
+		go services.ArticleHistory(articleId, user)
+		//30分钟之内阅读同一篇文章不错二次推送
+		key := "CYGX_ARTICLE_READ" + strconv.Itoa(articleId) + "_" + strconv.Itoa(uid)
+		if !utils.Rc.IsExist(key) {
+			go services.ArticleUserRemind(user, detail, 1)
+			utils.Rc.Put(key, 1, 30*time.Second)
 		}
-	}
 
-	//HasPermission int `description:"1:有该行业权限,正常展示,2:无该行业权限,不存在权益客户下(ficc),3:无该品类权限,已提交过申请,4:无该品类权限,未提交过申请,7:潜在客户,未提交过申请,6:潜在客户,已提交过申请"`
-	if user.CompanyId > 1 {
-		companyPermission, err := models.GetCompanyPermission(user.CompanyId)
-		if err != nil {
-			br.Msg = "获取信息失败"
-			br.ErrMsg = "判断是否已申请访谈失败,Err:" + strconv.Itoa(uid) + ";articleId" + strconv.Itoa(articleId)
-			return
-		}
-		//判断用户是否开通了个人研选权限,如果有权限后缀拼接权限名称
-		mfyxUserPermissionTotal := services.GetMfyxUserPermissionTotal(uid)
-		if mfyxUserPermissionTotal == 1 {
-			companyPermission += "," + utils.CHART_PERMISSION_NAME_MF_YANXUAN
-			companyPermission += "," + utils.MAI_FANG_YAN_XUAN_NAME
-			//permissionNameArr = append(permissionNameArr, utils.CHART_PERMISSION_NAME_MF_YANXUAN)
-			//permissionNameArr = append(permissionNameArr, utils.MAI_FANG_YAN_XUAN_NAME)
-		}
-		//如果有研选订阅的权限,那么就拼接一个 买方研选的权限做校验
-		if strings.Contains(companyPermission, utils.CHART_PERMISSION_NAME_MF_YANXUAN) {
-			companyPermission += "," + utils.MAI_FANG_YAN_XUAN_NAME
-		}
-		detail, err = models.GetArticleDetailById(articleId)
-		if err != nil {
-			br.Msg = "获取信息失败"
-			br.ErrMsg = "获取信息失败,Err:" + err.Error()
-			return
-		}
-		detail.Body = services.GetReportContentTextArticleBody(detail.Body)
-		detail.Abstract, _ = services.GetReportContentTextSub(detail.Abstract)
-		if companyPermission == "" {
-			if applyCount > 0 {
-				hasPermission = 2
-			} else {
-				hasPermission = 3
-			}
-			hasFree = 2
-			goto Loop
-		} else {
-			hasPermission = 1
-			hasFree = 1
-			var articlePermissionName string
-			var matchTypeName string //查研观向这边的匹配类型
-			if detail.CategoryId > 0 {
-				articlePermission, err := models.GetArticlePermission(detail.CategoryId)
-				if err != nil {
-					br.Msg = "获取信息失败"
-					br.ErrMsg = "获取报告权限失败,Err:" + err.Error() + strconv.Itoa(uid) + ";articleId" + strconv.Itoa(articleId)
-					return
-				}
-				if articlePermission == nil {
-					br.Msg = "获取信息失败"
-					br.ErrMsg = "报告权限不存在,Err:" + strconv.Itoa(uid) + ";articleId" + strconv.Itoa(articleId)
-					return
-				}
-				articlePermissionName = articlePermission.PermissionName
-				matchTypeName = articlePermission.MatchTypeName
-			} else {
-				articlePermissionName = detail.CategoryName
-			}
-			var hasPersion bool
-			slice := strings.Split(articlePermissionName, ",")
-			for _, v := range slice {
-				if strings.Contains(companyPermission, v) {
-					hasPersion = true
-				}
-			}
-			userType, _, err := services.GetUserType(user.CompanyId)
-			if err != nil {
-				br.Msg = "获取信息失败"
-				br.ErrMsg = "获取用户信息失败,Err:" + err.Error()
-				return
-			}
-			//永续客户,无法查看研选权限,但是下面的联系人,单独开通研选后,也可以查看研选内容
-			if userType == 1 && strings.Contains(detail.CategoryName, "研选") && mfyxUserPermissionTotal == 0 {
-				hasPersion = false
-			}
-
-			if hasPersion && utils.InArrayByStr([]string{utils.YI_YAO_NAME, utils.XIAO_FEI_NAME, utils.KE_JI_NAME, utils.ZHI_ZAO_NAME}, articlePermissionName) && matchTypeName != "热点问答" {
-				hasPersion = services.CheckArticlePermissionType(articleId, user)
-			}
-			if !hasPersion {
-				if applyCount == 0 {
-					hasPermission = 4
-				} else {
-					hasPermission = 3
-				}
-			}
-		}
-		collectCount, err := models.GetArticleCollectCount(uid, articleId)
-		if err != nil && err.Error() != utils.ErrNoRow() {
-			br.Msg = "获取信息失败"
-			br.ErrMsg = "判断是否已收藏失败,Err:" + strconv.Itoa(uid) + ";articleId" + strconv.Itoa(articleId)
-			return
-		}
-		if collectCount > 0 {
-			detail.IsCollect = true
-		}
-		interviewApplyItem, err := models.GetArticleInterviewApply(uid, articleId)
-		if err != nil && err.Error() != utils.ErrNoRow() {
-			br.Msg = "获取信息失败"
-			br.ErrMsg = "判断是否已申请访谈失败,Err:" + strconv.Itoa(uid) + ";articleId" + strconv.Itoa(articleId)
-			return
-		}
-		if interviewApplyItem != nil && interviewApplyItem.InterviewApplyId > 0 {
-			detail.IsInterviewApply = true
-			detail.InterviewApplyStatus = interviewApplyItem.Status
-		}
-		//获取销售手机号
-		sellerItem, err := models.GetSellerByCompanyId(user.CompanyId)
-		if err != nil && err.Error() != utils.ErrNoRow() {
-			br.Msg = "获取信息失败"
-			br.ErrMsg = "获取销售数据失败2,Err:" + err.Error() + strconv.Itoa(uid) + ";articleId" + strconv.Itoa(articleId)
-			return
-		}
-		if sellerItem != nil {
-			detail.Seller.SellerMobile = sellerItem.Mobile
-			detail.Seller.SellerName = sellerItem.RealName
-		}
-		//作者头像
-		if detail.DepartmentId > 0 {
-			departmentDetail, err := models.GetArticleDepartmentDateilById(detail.DepartmentId)
-			if err == nil {
-				detail.DepartmentDetail = departmentDetail
-			}
-		}
-	} else { //潜在客户
-		mfyxUserPermissionTotal := services.GetMfyxUserPermissionTotal(uid)
-		if mfyxUserPermissionTotal == 1 {
-			hasPermission = 1
-		} else {
-			if applyCount > 0 {
-				hasPermission = 6
-			} else {
-				hasPermission = 7
-			}
-		}
-	}
-Loop:
-	if hasPermission != 1 {
-		//detail.Body = ""
-	} else {
 		articleFollowdetail, err := models.GetArticleFollowDetail(articleId, uid)
 		if err != nil {
 			br.Msg = "获取信息失败"
@@ -278,63 +84,45 @@ Loop:
 		}
 		detail.FollowNum = articleFollowdetail.DNum
 		detail.CollectionNum = articleFollowdetail.AcNum
-		detail.Disclaimers = utils.DISCLAIMERS
 		if articleFollowdetail.MdNum > 0 {
 			detail.IsFollow = true
 		}
-		haveResearch = true
-	}
-	if hasPermission == 2 || hasPermission == 4 {
-		//获取销售手机号
-		sellerItem, err := models.GetSellerByCompanyId(user.CompanyId)
+
+	} else {
+		hasPermission, err = services.GetUserDetailPermissionCode(user.UserId, user.CompanyId)
 		if err != nil && err.Error() != utils.ErrNoRow() {
 			br.Msg = "获取信息失败"
-			br.ErrMsg = "获取销售数据失败2,Err:" + err.Error() + strconv.Itoa(uid) + ";articleId" + strconv.Itoa(articleId)
+			br.ErrMsg = "获取信息失败,GetUserDetailPermissionCode Err:" + err.Error()
 			return
 		}
-		if sellerItem != nil {
-			detail.Seller.SellerMobile = sellerItem.Mobile
-			detail.Seller.SellerName = sellerItem.RealName
-		}
-	}
-	if detail.ArticleId < utils.SummaryArticleId {
-		if user.Mobile != "" {
-			chartUserTokenByMobile, _ := services.GetUserTokenByMobile(user.Mobile)
-			detail.HttpUrl = utils.StrategyPlatform + strconv.Itoa(articleId) + "?token=" + chartUserTokenByMobile
-		} else {
-			detail.HttpUrl = utils.StrategyPlatform + strconv.Itoa(articleId)
+		//权益客户对权益销售信息进行展示
+		if hasPermission == 2 || hasPermission == 3 {
+			sellerItemQy, err := models.GetSellerByCompanyIdCheckFicc(user.CompanyId, 2)
+			if err != nil && err.Error() != utils.ErrNoRow() {
+				br.Msg = "获取信息失败"
+				br.ErrMsg = "获取销售信息失败,Err:" + err.Error()
+				return
+			}
+			if sellerItemQy != nil {
+				detail.Seller.SellerMobile = sellerItemQy.Mobile
+				detail.Seller.SellerName = sellerItemQy.RealName
+			}
 		}
-		detail.IsNeedJump = true
-	}
-	//hasFree := 0
-	//var haveResearch bool
-	fmt.Println(hasFree)
-	fmt.Println(haveResearch)
-	if hasPermission == 1 {
-		go services.ArticleHistory(articleId, user)
-		key := "CYGX_ARTICLE_READ" + strconv.Itoa(articleId) + "_" + strconv.Itoa(uid)
-		if !utils.Rc.IsExist(key) {
-			go services.ArticleUserRemind(user, detail, 1)
-			utils.Rc.Put(key, 1, 30*time.Second)
+		detail.Body = ""
+		resp.IsShowWxPay = utils.IS_SHOW_WX_PAY                                                      //是否展示微信支付按钮
+		resp.IsCompanyApply = services.GetUserApplyRecordCountByCompanyIdPay(user.CompanyId)         //获取客户是否有过历史申请记录
+		resp.IsNeedBusinessCard = services.GetCygxUserBusinessCardCount(user.UserId, user.CompanyId) //是否需要上传名片
+		resp.GoodsList = services.GetUserGoodsCardList()                                             //日卡月卡商品信息
+		for _, v := range resp.GoodsList {
+			resp.PopupPriceMsg += v.PopupPriceMsg //价格弹窗信息
 		}
+
 	}
+
 	if detail.ArticleTypeId == 14 {
 		detail.IsApplyAppointmentExpert = true //判断文章类型是否属于专家访谈  查研观向11.0
 	}
-	if detail.SubCategoryName == "专项调研" {
-		detail.IsSpecialArticle = true
-	}
-	if user.UserId == 0 {
-		hasPermission = 1
-	}
-	if hasPermission != 1 {
-		hasPermission, err = services.GetUserPermissionCode(user.UserId, user.CompanyId)
-		if err != nil {
-			br.Msg = "获取信息失败"
-			br.ErrMsg = "获取用户状态信息失败,Err:" + err.Error()
-			return
-		}
-	}
+	detail.Disclaimers = utils.DISCLAIMERS
 	detail.ShareImg = services.GetArticleShareImg(articleId)
 	resp.HasPermission = hasPermission
 	resp.IsSpecialArticle = detail.IsSpecialArticle

+ 421 - 0
controllers/order.go

@@ -0,0 +1,421 @@
+package controllers
+
+import (
+	"encoding/json"
+	"fmt"
+	"github.com/rdlucklib/rdluck_tools/paging"
+	"hongze/hongze_web_mfyx/models"
+	"hongze/hongze_web_mfyx/models/order"
+	"hongze/hongze_web_mfyx/services"
+	"hongze/hongze_web_mfyx/utils"
+	"strings"
+	"time"
+)
+
+// 订单
+type OrderController struct {
+	BaseAuthController
+}
+
+// @Title 通过文章创建订单
+// @Description 通过文章创建订单接口
+// @Param	request	body models.ActivitySingnupRep true "type json string"
+// @Success Ret=200 {object} models.SignupStatus
+// @router /addByArticle [post]
+func (this *OrderController) AddByArticle() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	user := this.User
+	if user == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,用户信息为空"
+		br.Ret = 408
+		return
+	}
+	var req order.CygxOrderAddReq
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+	uid := user.UserId
+	goodsId := req.GoodsId
+	sourceId := req.SourceId
+	if goodsId == 0 {
+		br.Msg = "支付失败"
+		br.ErrMsg = "支付失败,goodsId 信息错误Err:" + err.Error()
+		return
+	}
+
+	goodsDetail, err := order.GetCygxGoodsDetailByGoodsId(goodsId)
+	if err != nil {
+		br.Msg = "获取信息失败"
+		br.ErrMsg = "获取信息失败,Err:" + err.Error()
+		return
+	}
+	var title string
+	oldOrderCode := services.GetHaverEquallyOrderByUser10Min(uid, goodsId) //获取用户十分钟之内是否有相同的订单信息
+	articleDetail, err := models.GetArticleDetailById(sourceId)
+	if err != nil {
+		br.Msg = "获取信息失败"
+		br.ErrMsg = "获取信息失败,Err:" + err.Error()
+		return
+	}
+	title = articleDetail.Title
+	item := new(order.CygxOrder)
+	item.OrderCode = utils.GetOrdernum()
+	item.GoodsName = goodsDetail.GoodsName
+	item.GoodsId = goodsId
+	item.GoodsMoney = goodsDetail.Price
+	item.OrderMoney = goodsDetail.CurrentPrice
+	item.SourceId = sourceId
+	item.Source = utils.CYGX_OBJ_ARTICLE
+	item.SourceTitle = title
+	item.UserId = user.UserId
+	item.Mobile = user.Mobile
+	item.Email = user.Email
+	item.CompanyId = user.CompanyId
+	item.CompanyName = user.CompanyName
+	item.RealName = user.RealName
+	item.SellerName, item.SellerId = services.GetSellerName(user) // 销售姓名
+	item.CreateTime = time.Now()
+	item.ModifyTime = time.Now()
+	item.RegisterPlatform = utils.REGISTER_PLATFORM
+	item.OrderType = 1
+	//如果十分钟之内有相同的订单就修改,没有就新增
+	if oldOrderCode == "" {
+		err = order.AddCygxOrder(item)
+	} else {
+		item.OrderCode = oldOrderCode
+		err = order.UpdateCygxOrder(item, oldOrderCode)
+	}
+	if err != nil {
+		br.Msg = "创建订单信息失败"
+		br.ErrMsg = "创建订单信息失败,Err:" + err.Error()
+		return
+	}
+	JsapiApiResp, err := services.ExampleJsapiApiServicePrepay(item, user.UnionId)
+	if err != nil {
+		br.Msg = "创建订单信息失败"
+		br.ErrMsg = "创建订单信息失败,ExampleJsapiApiServicePrepayErr:" + err.Error()
+		return
+	}
+	resp := new(order.WxJsapiApiResp)
+	resp.Detail = JsapiApiResp
+	resp.OrderCode = item.OrderCode
+	br.Data = resp
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "操作成功"
+}
+
+// @Title 通过活动创建订单
+// @Description 通过活动创建订单接口
+// @Param	request	body models.ActivitySingnupRep true "type json string"
+// @Success Ret=200 {object} models.SignupStatus
+// @router /addByActivity [post]
+func (this *OrderController) AddByActivity() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	user := this.User
+	if user == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,用户信息为空"
+		br.Ret = 408
+		return
+	}
+	var req order.CygxOrderAddReq
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+	uid := user.UserId
+	goodsId := req.GoodsId
+	sourceId := req.SourceId
+	if goodsId == 0 {
+		br.Msg = "支付失败"
+		br.ErrMsg = "支付失败,goodsId 信息错误Err:" + err.Error()
+		return
+	}
+
+	goodsDetail, err := order.GetCygxGoodsDetailByGoodsId(goodsId)
+	if err != nil {
+		br.Msg = "获取信息失败"
+		br.ErrMsg = "获取信息失败,Err:" + err.Error()
+		return
+	}
+	activityDetail, err := models.GetAddActivityInfoById(sourceId)
+	if err != nil {
+		br.Msg = "获取信息失败"
+		br.ErrMsg = "获取信息失败,Err:" + err.Error()
+		return
+	}
+	var title string
+	var oldOrderCode string
+	//var _ int
+	item := new(order.CygxOrder)
+	if (!activityDetail.IsResearchPoints && activityDetail.IsLimitPeople == 0) || activityDetail.YidongActivityId != "" { //易董的活动 或者(不扣点且不限制人数)走月卡日卡逻辑
+		oldOrderCode = services.GetHaverEquallyOrderByUser10Min(uid, goodsId) //获取用户十分钟之内是否有相同的订单信息
+		item.OrderType = 1
+	} else {
+		oldOrderCode, _ = services.GetHaverEquallyOrderByUser10MinByActivty(uid, sourceId)
+		item.OrderType = 2
+	}
+
+	title = activityDetail.ActivityName
+	item.OrderCode = utils.GetOrdernum()
+	if activityDetail.ActivityTypeName == "买方线下交流" {
+		item.GoodsName = "买方交流"
+	}
+	if activityDetail.ActivityTypeName == "专家电话会" || activityDetail.ActivityTypeName == "专家线下沙龙" {
+		item.GoodsName = "专家调研"
+	}
+	if activityDetail.ActivityTypeName == "公司调研电话会" {
+		item.GoodsName = "买方交流"
+	}
+	fmt.Println("item.GoodsName", item.GoodsName)
+	//return
+	item.GoodsId = goodsId
+	item.GoodsMoney = goodsDetail.Price
+	item.OrderMoney = goodsDetail.CurrentPrice
+	item.SourceId = sourceId
+	item.Source = utils.CYGX_OBJ_ACTIVITY
+	item.SourceTitle = title
+	item.UserId = user.UserId
+	item.Mobile = user.Mobile
+	item.Email = user.Email
+	item.CompanyId = user.CompanyId
+	item.CompanyName = user.CompanyName
+	item.RealName = user.RealName
+	item.SellerName, item.SellerId = services.GetSellerName(user) // 销售姓名
+	item.CreateTime = time.Now()
+	item.ModifyTime = time.Now()
+	item.RegisterPlatform = utils.REGISTER_PLATFORM
+
+	//如果十分钟之内有相同的订单就修改,没有就新增
+	if oldOrderCode == "" {
+		err = order.AddCygxOrder(item)
+	} else {
+		item.OrderCode = oldOrderCode
+		err = order.UpdateCygxOrder(item, oldOrderCode)
+	}
+	JsapiApiResp, err := services.ExampleJsapiApiServicePrepay(item, user.UnionId)
+	if err != nil {
+		br.Msg = "创建订单信息失败"
+		br.ErrMsg = "创建订单信息失败,ExampleJsapiApiServicePrepayErr:" + err.Error()
+		return
+	}
+	resp := new(order.WxJsapiApiResp)
+	resp.Detail = JsapiApiResp
+	resp.OrderCode = item.OrderCode
+	if err != nil {
+		br.Msg = "创建订单信息失败"
+		br.ErrMsg = "创建订单信息失败,Err:" + err.Error()
+		return
+	}
+	br.Data = resp
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "操作成功"
+}
+
+// @Title 用户订单列表
+// @Description 用户订单列表接口
+// @Param   PageSize   query   int  true       "每页数据条数"
+// @Param   CurrentIndex   query   int  true       "当前页页码,从1开始"
+// @Param   OrderType   query   int  false       "订单类型 1:畅读卡订单,2:单场付费订单"
+// @Success 200 {object} models.SpecialListResp
+// @router /user/orderList [get]
+func (this *OrderController) UserOrderList() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	user := this.User
+	if user == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,用户信息为空"
+		br.Ret = 408
+		return
+	}
+
+	pageSize, _ := this.GetInt("PageSize")
+	currentIndex, _ := this.GetInt("CurrentIndex")
+	orderType, _ := this.GetInt("OrderType", 1)
+
+	var startSize int
+	if pageSize <= 0 {
+		pageSize = utils.PageSize20
+	}
+	if currentIndex <= 0 {
+		currentIndex = 1
+	}
+	startSize = utils.StartIndex(currentIndex, pageSize)
+	resp := new(order.UserOrderListResp)
+	var condition string
+	var pars []interface{}
+	userId := user.UserId
+
+	if orderType > 0 {
+		condition += `  AND order_type =   ? `
+		pars = append(pars, orderType)
+	}
+	condition += ` AND user_id  =   ? `
+	pars = append(pars, userId)
+
+	total, err := order.GetCygxOrderCount(condition, pars)
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取失败, Err:" + err.Error()
+		return
+	}
+	condition += ` ORDER BY order_id  DESC `
+	list, err := order.GetCygxOrderList(condition, pars, startSize, pageSize)
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取失败, Err:" + err.Error()
+		return
+	}
+	for _, v := range list {
+		item := new(order.OrderListResp)
+		item.OrderCode = v.OrderCode
+		item.OrderMoney = v.OrderMoney
+		item.SourceId = v.SourceId
+		item.Source = v.Source
+		item.SourceTitle = v.SourceTitle
+		item.OrderStatus = v.OrderStatus
+		if v.OrderStatus == 0 {
+			item.OrderStatusText = "已取消"
+		} else if v.OrderStatus == 1 {
+			item.OrderStatusText = "待支付"
+		} else if v.OrderStatus == 2 {
+			item.OrderStatusText = "已支付"
+		}
+		if orderType == 1 {
+			if v.GoodsId == 1 {
+				item.LabelKeywordImgLink = utils.LABEL_ICO_7 //日卡图标
+				item.StartDate = v.StartDate.Format(utils.FormatDateTime)
+				item.EndDate = v.EndDate.Format(utils.FormatDateTime)
+			} else if v.GoodsId == 2 {
+				item.LabelKeywordImgLink = utils.LABEL_ICO_8 // 月卡图标
+				item.StartDate = v.StartDate.Format(utils.FormatDate)
+				item.EndDate = v.EndDate.Format(utils.FormatDate)
+			}
+		} else {
+			item.LabelKeywordImgLink = utils.LABEL_ICO_3
+		}
+		item.CreateTime = v.CreateTime.Format(utils.FormatDateTime)
+		resp.List = append(resp.List, item)
+	}
+
+	page := paging.GetPaging(currentIndex, pageSize, total)
+	resp.Paging = page
+
+	br.Data = resp
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+}
+
+// @Title 订单支付详情
+// @Description 订单支付详情接口
+// @Param   OrderCode   query   string  false       "订单号"
+// @Success 200 {object} models.SpecialListResp
+// @router /orderPay/detail [get]
+func (this *OrderController) OrderDetail() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	user := this.User
+	if user == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,用户信息为空"
+		br.Ret = 408
+		return
+	}
+	resp := new(order.PayEdOrderDetailResp)
+	orderCode := this.GetString("OrderCode")
+	orderDetail, err := order.GetCygxOrderDetailByOrderCode(orderCode)
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取失败, Err:" + err.Error()
+		return
+	}
+
+	if orderDetail.OrderType == 1 && orderDetail.OrderStatus == 2 {
+		cardDetail, err := order.GetCygxOrderUserCardDetailByOrderCode(orderCode)
+		if err != nil {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取失败, Err:" + err.Error()
+			return
+		}
+		resp.EndDate = strings.Replace(cardDetail.EndDate.Format(utils.FormatDateTime), "00:00:00", "", -1)
+	}
+	resp.OrderCode = orderDetail.OrderCode
+	resp.OrderType = orderDetail.OrderType
+	resp.OrderStatus = orderDetail.OrderStatus
+	resp.Source = orderDetail.Source
+	resp.SourceId = orderDetail.SourceId
+	br.Data = resp
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+}
+
+// @Title 通过活动创建订单
+// @Description 通过活动创建订单接口
+// @Param	request	body models.ActivitySingnupRep true "type json string"
+// @Success Ret=200 {object} models.SignupStatus
+// @router /cancel [post]
+func (this *OrderController) Cancel() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	user := this.User
+	if user == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,用户信息为空"
+		br.Ret = 408
+		return
+	}
+	var req order.CygxOrderCancelReq
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+
+	orderCode := req.OrderCode
+	orderDetail, err := order.GetCygxOrderDetailByOrderCode(orderCode)
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取失败, Err:" + err.Error()
+		return
+	}
+
+	err = order.CancelCygxOrder(orderDetail)
+	if err != nil {
+		br.Msg = "取消订单失败"
+		br.ErrMsg = "获取失败, Err:" + err.Error()
+		return
+	}
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "操作成功"
+}

+ 134 - 0
controllers/user.go

@@ -5,6 +5,7 @@ import (
 	"fmt"
 	"github.com/rdlucklib/rdluck_tools/paging"
 	"hongze/hongze_web_mfyx/models"
+	"hongze/hongze_web_mfyx/models/order"
 	"hongze/hongze_web_mfyx/services"
 	"hongze/hongze_web_mfyx/utils"
 	"sort"
@@ -290,6 +291,24 @@ func (this *UserController) Detail() {
 		resp.Headimgurl = utils.DefaultHeadimgurl
 	}
 
+	if user.Mobile != "" {
+		userCard, err := order.GetCygxOrderUserCardDetailByMobile(user.Mobile)
+		if err != nil && err.Error() != utils.ErrNoRow() {
+			br.Msg = "获取信息失败"
+			br.ErrMsg = "判断是否已申请过试用失败,Err:" + err.Error()
+			return
+		}
+		if userCard != nil {
+			if userCard.CardType == "日卡" {
+				resp.UserCardType = 1 //权益卡类型
+				resp.UserCardEndDate = userCard.EndDate.Format(utils.FormatDateTime)
+			} else {
+				resp.UserCardType = 2
+				resp.UserCardEndDate = userCard.EndDate.Format(utils.FormatDate)
+			}
+		}
+	}
+
 	specialAuthorCheck := services.GetYanxuanSpecialAuthorInfo(user) //用户是否没开通研选专栏以及,专栏信息是否完善
 	resp.IsAuthor = specialAuthorCheck.IsAuthor
 	resp.SpecialColumnId = specialAuthorCheck.SpecialColumnId
@@ -1692,3 +1711,118 @@ func (this *UserController) Mycollect() {
 	br.Msg = "获取成功"
 	br.Data = resp
 }
+
+// @Title 上传名片信息
+// @Description 上传名片信息接口
+// @Param	request	body order.CygxUserBusinessCardReq true "type json string"
+// @Success Ret=200 {object} models.SignupStatus
+// @router /upload/UserBusinessCard [post]
+func (this *UserController) UploadUserBusinessCard() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	user := this.User
+	if user == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,用户信息为空"
+		br.Ret = 408
+		return
+	}
+	isNeedBusinessCard := services.GetCygxUserBusinessCardCount(user.UserId, user.CompanyId) //是否需要上传名片
+	if !isNeedBusinessCard {
+		br.Msg = "您已上传名片,请勿重复上传"
+		return
+	}
+	var req order.CygxUserBusinessCardReq
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+	uid := user.UserId
+	businessCardUrl := req.BusinessCardUrl
+	if businessCardUrl == "" {
+		br.Msg = "名片信息错误"
+		return
+	}
+	companyName := user.CompanyName
+	if companyName == "" {
+		br.Msg = "请填写公司姓名"
+		return
+	}
+	realName := req.RealName
+	if realName == "" {
+		br.Msg = "请填写姓名"
+		return
+	}
+	mobile := req.Mobile
+	key := "check_ocr_business_card"
+	conf, e := models.GetConfigByCode(key)
+	if e != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取首页头部导航失败, Err: " + e.Error()
+		return
+	}
+	if conf.ConfigValue == "" {
+		br.Msg = "获取失败"
+		br.ErrMsg = "首页头部导航配置值有误"
+		return
+	}
+	checkItem := new(models.CheckOcrBusinessCard)
+	//list := new(*models.BannerUrlYxResp)
+	if e = json.Unmarshal([]byte(conf.ConfigValue), &checkItem); e != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "首页头部导航配置值解析失败, Err: " + e.Error()
+		return
+	}
+
+	if checkItem.CheckMobile || checkItem.CheckCompany {
+		aliyunResult, err := services.AliyunOcrBusinessCard(req.BusinessCardUrl)
+		if err != nil {
+			br.Msg = "识别失败"
+			br.ErrMsg = "识别失败,Err:" + err.Error()
+			return
+		}
+		//校验手机号
+		if checkItem.CheckMobile {
+			mobileStr := strings.Join(aliyunResult.TelCell, ",")
+			if !strings.Contains(mobileStr, mobile) {
+				br.Msg = "名片手机号和绑定手机号不一致,请重新上传"
+				br.ErrMsg = "手机号不一致"
+				return
+			}
+		}
+		//校验公司
+		if checkItem.CheckCompany {
+			companyNameStr := strings.Join(aliyunResult.Company, ",")
+			if !strings.Contains(companyNameStr, companyName) {
+				br.Msg = "名片手机号和绑定手机号不一致,请重新上传"
+				br.ErrMsg = "公司信息不一致"
+				return
+			}
+		}
+	}
+
+	item := new(order.CygxUserBusinessCard)
+	item.BusinessCardUrl = businessCardUrl
+	item.UserId = uid
+	item.RealName = realName
+	item.Mobile = req.Mobile
+	item.CompanyName = companyName
+	item.RegisterPlatform = utils.REGISTER_PLATFORM
+	item.CreateTime = time.Now()
+	item.ModifyTime = time.Now()
+	item.InviteName = req.InviteName
+	err = order.AddCygxUserBusinessCard(item)
+	if err != nil {
+		br.Msg = "操作失败"
+		br.ErrMsg = "操作失败,Err:" + err.Error()
+		return
+	}
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "操作成功"
+}

+ 2 - 0
go.mod

@@ -1,4 +1,5 @@
 module hongze/hongze_web_mfyx
+
 go 1.16
 
 require (
@@ -9,5 +10,6 @@ require (
 	github.com/go-sql-driver/mysql v1.6.0
 	github.com/olivere/elastic/v7 v7.0.32
 	github.com/rdlucklib/rdluck_tools v1.0.3
+	github.com/wechatpay-apiv3/wechatpay-go v0.2.18 // indirect
 	gopkg.in/gomail.v2 v2.0.0-20160411212932-81ebce5c23df
 )

+ 5 - 0
go.sum

@@ -41,6 +41,7 @@ github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWX
 github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI=
 github.com/VividCortex/gohistogram v1.0.0/go.mod h1:Pf5mBqqDxYaXu3hDrrU+w6nw50o/4+TcAqDqk/vUH7g=
 github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5/go.mod h1:SkGFH1ia65gfNATL8TAiHDNxPzPdmEL5uirI2Uyuz6c=
+github.com/agiledragon/gomonkey v2.0.2+incompatible/go.mod h1:2NGfXu1a80LLr2cmWXGBDaHEjb1idR6+FVlX5T3D9hw=
 github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
 github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
 github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
@@ -447,6 +448,7 @@ github.com/streadway/handy v0.0.0-20190108123426-d5acb3125c2a/go.mod h1:qNTQ5P5J
 github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
 github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
 github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
+github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
 github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
 github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
 github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
@@ -456,12 +458,15 @@ github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/
 github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
 github.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk=
 github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
+github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
 github.com/syndtr/goleveldb v0.0.0-20160425020131-cfa635847112/go.mod h1:Z4AUp2Km+PwemOoO/VB5AOx9XSsIItzFjoJlOSiYmn0=
 github.com/syndtr/goleveldb v0.0.0-20181127023241-353a9fca669c/go.mod h1:Z4AUp2Km+PwemOoO/VB5AOx9XSsIItzFjoJlOSiYmn0=
 github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U=
 github.com/ugorji/go v0.0.0-20171122102828-84cb69a8af83/go.mod h1:hnLbHMwcvSihnDhEfx2/BzKp2xb0Y+ErdfYcrs9tkJQ=
 github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA=
 github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0=
+github.com/wechatpay-apiv3/wechatpay-go v0.2.18 h1:vj5tvSmnEIz3ZsnFNNUzg+3Z46xgNMJbrO4aD4wP15w=
+github.com/wechatpay-apiv3/wechatpay-go v0.2.18/go.mod h1:A254AUBVB6R+EqQFo3yTgeh7HtyqRRtN2w9hQSOrd4Q=
 github.com/wendal/errors v0.0.0-20130201093226-f66c77a7882b/go.mod h1:Q12BUT7DqIlHRmgv3RskH+UCM/4eqVMgI0EMmlSpAXc=
 github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU=
 github.com/ylywyn/jpush-api-go-client v0.0.0-20190906031852-8c4466c6e369/go.mod h1:Nv7wKD2/bCdKUFNKcJRa99a+1+aSLlCRJFriFYdjz/I=

+ 15 - 7
models/activity.go

@@ -3,6 +3,7 @@ package models
 import (
 	"github.com/beego/beego/v2/client/orm"
 	"github.com/rdlucklib/rdluck_tools/paging"
+	"hongze/hongze_web_mfyx/models/order"
 	"strings"
 	"time"
 )
@@ -263,13 +264,20 @@ type ActivityArticleResp struct {
 }
 
 type CygxActivityResp struct {
-	HasPermission     int    `description:"1:有该行业权限,正常展示,2:无该行业权限,不存在权益客户下(ficc),3:无该品类权限,已提交过申请,4:无该品类权限,未提交过申请,5:潜在客户,未提交过申请,6:潜在客户,已提交过申请"`
-	PopupMsg          string `description:"权限弹窗信息"`
-	SellerMobile      string `description:"销售电话"`
-	SellerName        string `description:"销售姓名"`
-	IsResearch        bool   `description:"是否属于研选"`
-	IsResearchSpecial bool   `description:"是否属于特殊的研选"`
-	Detail            *ActivityListResp
+	HasPermission      int    `description:"1:有该行业权限,正常展示,2:无该行业权限,不存在权益客户下(ficc),3:无该品类权限,已提交过申请,4:无该品类权限,未提交过申请,5:潜在客户,未提交过申请,6:潜在客户,已提交过申请"`
+	PopupMsg           string `description:"权限弹窗信息"`
+	SellerMobile       string `description:"销售电话"`
+	SellerName         string `description:"销售姓名"`
+	IsResearch         bool   `description:"是否属于研选"`
+	IsResearchSpecial  bool   `description:"是否属于特殊的研选"`
+	Detail             *ActivityListResp
+	PopupPriceMsg      string                 `description:"价格弹窗信息"`
+	IsShowWxPay        bool                   `description:"是否展示微信支付"`
+	IsCompanyApply     bool                   `description:"机构是否申请过试用"`
+	IsNeedBusinessCard bool                   `description:"是否需要上传名片"`
+	PayTimeCountdown   int                    `description:"支付时间倒计时"`
+	OrderCode          string                 `comment:"订单编号"`
+	GoodsList          []*order.CygxGoodsResp `description:"商品信息"`
 }
 
 type CygxYidongActivityUrlResp struct {

+ 8 - 0
models/apply_record.go

@@ -67,3 +67,11 @@ func GetCygxApplyRecordByMobile(mobile string) (item *CygxApplyRecord, err error
 	err = o.Raw(sql, mobile).QueryRow(&item)
 	return
 }
+
+// 获取客户的试用申请次数
+func GetApplyRecordCountByCompanyIdPay(companyIdPay int) (count int, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT COUNT(1) AS count FROM cygx_apply_record WHERE user_id=?  AND company_id_pay = ?  `
+	err = o.Raw(sql, companyIdPay).QueryRow(&count)
+	return
+}

+ 14 - 8
models/article.go

@@ -2,6 +2,7 @@ package models
 
 import (
 	"github.com/beego/beego/v2/client/orm"
+	"hongze/hongze_web_mfyx/models/order"
 	"strings"
 )
 
@@ -92,14 +93,19 @@ type SellerResp struct {
 }
 
 type ArticleDetailResp struct {
-	IsResearch       bool   `description:"是否属于研选"`
-	Mobile           string `description:"用户手机号"`
-	PopupMsg         string `description:"权限弹窗信息"`
-	SellerMobile     string `description:"销售电话"`
-	SellerName       string `description:"销售姓名"`
-	Detail           *ArticleDetail
-	IsSpecialArticle bool `description:"是否属于专项调研报告"`
-	HasPermission    int  `description:"1:有该行业权限,正常展示,2:无该行业权限,不存在权益客户下,3:无该品类权限,已提交过申请,4:无该行业权限,未提交过申请,5:潜在客户,未提交过申请,6:潜在客户,已提交过申请"`
+	IsResearch         bool   `description:"是否属于研选"`
+	Mobile             string `description:"用户手机号"`
+	PopupMsg           string `description:"权限弹窗信息"`
+	SellerMobile       string `description:"销售电话"`
+	SellerName         string `description:"销售姓名"`
+	Detail             *ArticleDetail
+	IsSpecialArticle   bool                   `description:"是否属于专项调研报告"`
+	HasPermission      int                    `description:"1:有该行业权限,正常展示,2:无该行业权限,不存在权益客户下,3:无该品类权限,已提交过申请,4:无该行业权限,未提交过申请,5:潜在客户,未提交过申请,6:潜在客户,已提交过申请"`
+	PopupPriceMsg      string                 `description:"价格弹窗信息"`
+	IsShowWxPay        bool                   `description:"是否展示微信支付"`
+	IsCompanyApply     bool                   `description:"机构是否申请过试用"`
+	IsNeedBusinessCard bool                   `description:"是否需要上传名片"`
+	GoodsList          []*order.CygxGoodsResp `description:"商品信息"`
 }
 
 func GetArticleDetailById(articleId int) (item *ArticleDetail, err error) {

+ 60 - 0
models/company_product.go

@@ -0,0 +1,60 @@
+package models
+
+import (
+	"github.com/beego/beego/v2/client/orm"
+	"time"
+)
+
+type CompanyProduct struct {
+	CompanyProductId    int       `orm:"column(company_product_id);pk" description:"客户产品id"`
+	CompanyId           int       `description:"客户id"`
+	ProductId           int       `description:"产品id"`
+	ProductName         string    `description:"产品名称"`
+	CompanyName         string    `description:"客户名称"`
+	Source              string    `description:"来源"`
+	Reasons             string    `description:"新增理由"`
+	Status              string    `description:"客户状态"`
+	IndustryId          int       `description:"行业id"`
+	IndustryName        string    `description:"行业名称"`
+	SellerId            int       `description:"销售id"`
+	SellerName          string    `description:"销售名称"`
+	GroupId             int       `description:"销售分组id"`
+	DepartmentId        int       `description:"销售部门id"`
+	IsSuspend           int       `description:"1:暂停,0:启用"`
+	SuspendTime         time.Time `description:"暂停启用时间"`
+	TryOutTime          time.Time `description:"正式转试用时间"`
+	RenewalReason       string    `description:"正式转试用后的续约情况说明"`
+	LastDescriptionTime time.Time `description:"上次添加说明时间"`
+	RenewalIntention    int       `description:"是否勾选无续约意向,1:确认,0:未确认"`
+	ApproveStatus       string    `description:"审批状态:'审批中','通过','驳回'"`
+	FreezeTime          time.Time `description:"冻结时间"`
+	FreezeReason        time.Time `description:"冻结理由"`
+	Remark              string    `description:"备注信息"`
+	CreateTime          time.Time `description:"创建时间"`
+	ModifyTime          time.Time `description:"修改时间"`
+	StartDate           string    `description:"开始日期"`
+	EndDate             string    `description:"结束日期"`
+	ContractEndDate     time.Time `description:"合同结束日期"`
+	LoseReason          string    `description:"流失原因"`
+	LossTime            time.Time `description:"流失时间"`
+	CompanyType         string    `description:"客户类型"`
+	OpenCode            string    `description:"开放给第三方的编码,不让第三方定位我们的客户信息"`
+}
+
+// 获取列表
+func GetCompanyProductList(condition string, pars []interface{}) (items []*CompanyProduct, err error) {
+	o := orm.NewOrmUsingDB("weekly_report")
+	sql := `SELECT *  FROM company_product WHERE 1= 1 `
+	if condition != "" {
+		sql += condition
+	}
+	_, err = o.Raw(sql, pars).QueryRows(&items)
+	return
+}
+
+func GetCompanyProductDetailByCompanyId(companyId, productId int) (item *CompanyProduct, err error) {
+	sql := ` SELECT * FROM company_product WHERE company_id = ? AND product_id = ?; `
+	o := orm.NewOrmUsingDB("weekly_report")
+	err = o.Raw(sql, companyId, productId).QueryRow(&item)
+	return
+}

+ 19 - 0
models/config.go

@@ -109,3 +109,22 @@ type ConfigImgHbResp struct {
 	HbImg     string `description:"海报"`
 	ButtonImg string `description:"按钮图片"`
 }
+
+// CheckOcrBusinessCard  OCR 名片校验
+type CheckOcrBusinessCard struct {
+	CheckMobile  bool `description:"是否校验手机号"`
+	CheckCompany bool `description:"是否校验公司名称"`
+}
+
+type AliyunOcrLog struct {
+	Id         int       `orm:"column(id);pk"`
+	ImgUrl     string    `description:"图片地址"`
+	Result     string    `description:"返回内容"`
+	CreateTime time.Time `description:"创建时间"`
+}
+
+func AddAliyunOcrLog(item *AliyunOcrLog) (err error) {
+	o := orm.NewOrm()
+	_, err = o.Insert(item)
+	return
+}

+ 17 - 0
models/db.go

@@ -2,6 +2,7 @@ package models
 
 import (
 	_ "github.com/go-sql-driver/mysql"
+	"hongze/hongze_web_mfyx/models/order"
 	"hongze/hongze_web_mfyx/utils"
 	"time"
 
@@ -105,8 +106,24 @@ func init() {
 		new(CygxVoiceAndVideoHistory),
 		new(CygxActivityVideoHistory),
 	)
+
+	initOrder() // 订单模块
+
 	// 记录ORM查询日志
 	orm.Debug = true
 	orm.DebugLog = orm.NewLog(utils.BinLog)
 
 }
+
+// initOrder 买方研选订单模块
+func initOrder() {
+	orm.RegisterModel(
+		new(order.CygxUserBusinessCard),  //用户上传名片
+		new(order.CygxOrder),             //订单表
+		new(order.CygxOrderAction),       //订单操表
+		new(order.CygxOrderUserCard),     //用户持卡表
+		new(order.CygxOrderUserCardLog),  //用户持卡日志表
+		new(order.CygxOrderPayment),      //支付记录表
+		new(order.CygxOrderVirtualAsset), //用户虚拟资产表(所购买的单篇报告,活动等)
+	)
+}

+ 38 - 0
models/order/goods.go

@@ -0,0 +1,38 @@
+package order
+
+import (
+	"github.com/beego/beego/v2/client/orm"
+	//"time"
+)
+
+type CygxGoods struct {
+	GoodsId      int     `description:"商品ID"`
+	GoodsName    string  `description:"商品名称"`
+	Price        float64 `description:"商品原价格"`
+	CurrentPrice float64 `description:"商品现价(当时出售的价格)"`
+}
+
+type CygxGoodsResp struct {
+	GoodsId       int    `description:"商品ID"`
+	GoodsName     string `description:"商品名称"`
+	Price         string `description:"商品原价格"`
+	CurrentPrice  string `description:"商品现价(当时出售的价格)"`
+	PopupPriceMsg string `description:"价格弹窗信息"`
+}
+
+func GetCygxGoodsList(condition string, pars []interface{}) (item []*CygxGoodsResp, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT *
+			FROM
+			cygx_goods
+			WHERE 1 = 1 ` + condition
+	_, err = o.Raw(sql, pars).QueryRows(&item)
+	return
+}
+
+func GetCygxGoodsDetailByGoodsId(goodsId int) (item *CygxGoods, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT * FROM cygx_goods WHERE goods_id = ?  `
+	err = o.Raw(sql, goodsId).QueryRow(&item)
+	return
+}

+ 296 - 0
models/order/order.go

@@ -0,0 +1,296 @@
+package order
+
+import (
+	"fmt"
+	"github.com/beego/beego/v2/client/orm"
+	"github.com/rdlucklib/rdluck_tools/paging"
+	"time"
+)
+
+type WxJsapiApiResp struct {
+	Detail    PrepayWithRequestPaymentResponse
+	OrderCode string `comment:"订单编号"`
+}
+
+// PrepayWithRequestPaymentResponse 预下单ID,并包含了调起支付的请求参数
+type PrepayWithRequestPaymentResponse struct {
+	PrepayId  string // 预支付交易会话标识
+	Appid     string // 应用ID
+	TimeStamp string // 时间戳
+	NonceStr  string // 随机字符串
+	Package   string // 订单详情扩展字符串
+	SignType  string // 签名方式
+	PaySign   string // 签名
+}
+
+type CygxOrderAddReq struct {
+	GoodsId int `description:"商品ID"`
+	//Source   string `description:"资源(文章、活动)"`
+	SourceId int `description:"资源ID"`
+}
+
+type CygxOrderCancelReq struct {
+	OrderCode string `comment:"订单编号"`
+}
+
+type CygxOrder struct {
+	OrderId          int       `orm:"column(order_id);pk";comment:"订单id"`
+	OrderCode        string    `comment:"订单编号"`
+	OutTradeCode     string    `comment:"外部交易号"`
+	PaymentType      int       `comment:"支付类型。取值范围:1微信支付,2支付宝支付。"`
+	GoodsName        string    `comment:"商品名称"`
+	GoodsId          int       `comment:"商品ID"`
+	BuyerInvoice     string    `comment:"买家发票信息"`
+	GoodsMoney       float64   `comment:"商品总价"`
+	OrderMoney       float64   `comment:"订单总价"`
+	Point            int       `comment:"订单消耗积分"`
+	PointMoney       float64   `comment:"订单消耗积分抵多少钱"`
+	PayMoney         float64   `comment:"订单实付金额"`
+	RefundTime       time.Time `comment:"订单退款时间"`
+	RefundMoney      float64   `comment:"订单退款金额"`
+	OrderStatus      int       `comment:"订单状态,0:已取消、1:待支付、2:已支付、3:已退款"`
+	PayTime          time.Time `comment:"订单付款时间"`
+	SourceId         int       `comment:"来源ID"`
+	Source           string    `comment:"来源\n报告 :article\n活动 :activity"`
+	SourceTitle      string    `comment:"来源名称,活动或者报告标题"`
+	UserId           int       `comment:"用户ID"`
+	Mobile           string    `comment:"手机号"`
+	Email            string    `comment:"邮箱"`
+	CompanyId        int       `comment:"公司ID"`
+	CompanyName      string    `comment:"公司名称"`
+	RealName         string    `comment:"用户实际名称"`
+	SellerName       string    `comment:"所属销售"`
+	SellerId         int       `comment:"所属销售Id"`
+	CreateTime       time.Time `comment:"创建时间"`
+	ModifyTime       time.Time `comment:"修改时间"`
+	RegisterPlatform int       `comment:"来源 1小程序,2:网页"`
+	OrderType        int       `comment:"订单类型,1:畅读卡订单,2:单场付费订单"`
+	StartDate        time.Time `comment:"开始时间"`
+	EndDate          time.Time `comment:"结束时间"`
+}
+
+type CygxOrderResp struct {
+	OrderId          int       `orm:"column(order_id);pk";comment:"订单id"`
+	OrderCode        string    `comment:"订单编号"`
+	OutTradeCode     string    `comment:"外部交易号"`
+	PaymentType      int       `comment:"支付类型。取值范围:1微信支付,2支付宝支付。"`
+	GoodsName        string    `comment:"商品名称"`
+	GoodsId          int       `comment:"商品ID"`
+	BuyerInvoice     string    `comment:"买家发票信息"`
+	GoodsMoney       float64   `comment:"商品总价"`
+	OrderMoney       float64   `comment:"订单总价"`
+	Point            int       `comment:"订单消耗积分"`
+	PointMoney       float64   `comment:"订单消耗积分抵多少钱"`
+	PayMoney         float64   `comment:"订单实付金额"`
+	RefundMoney      float64   `comment:"订单退款金额"`
+	OrderStatus      int       `comment:"订单状态,0:已取消、1:待支付、2:已支付、3:已退款"`
+	PayTime          time.Time `comment:"订单付款时间"`
+	SourceId         int       `comment:"来源ID"`
+	Source           string    `comment:"来源\n报告 :article\n活动 :activity"`
+	SourceTitle      string    `comment:"来源名称,活动或者报告标题"`
+	UserId           int       `comment:"用户ID"`
+	Mobile           string    `comment:"手机号"`
+	Email            string    `comment:"邮箱"`
+	CompanyId        int       `comment:"公司ID"`
+	CompanyName      string    `comment:"公司名称"`
+	RealName         string    `comment:"用户实际名称"`
+	SellerName       string    `comment:"所属销售"`
+	CreateTime       time.Time `comment:"创建时间"`
+	ModifyTime       time.Time `comment:"修改时间"`
+	RegisterPlatform int       `comment:"来源 1小程序,2:网页"`
+	StartDate        time.Time `comment:"开始时间"`
+	EndDate          time.Time `comment:"结束时间"`
+}
+
+type CygxOrderAction struct {
+	ActionId         int64     `orm:"column(action_id);pk"` // 动作id
+	Action           string    // 动作内容
+	OrderStatus      int       // 订单状态,0:已取消、1:待支付、2:已支付、3:已退款
+	OrderStatusText  string    // 订单状态名称
+	OrderCode        string    // 订单编号
+	UserId           int       // 用户ID
+	Mobile           string    // 手机号
+	Email            string    // 邮箱
+	CompanyId        int       // 公司ID
+	CompanyName      string    // 公司名称
+	RealName         string    // 用户实际名称
+	SellerName       string    // 所属销售
+	CreateTime       time.Time // 创建时间
+	ModifyTime       time.Time // 修改时间
+	RegisterPlatform int       // 来源 1小程序,2:网页
+	AdminId          int       // 管理员ID
+	AdminName        string    // 管理员姓名
+}
+
+type OrderListResp struct {
+	OrderCode           string  `comment:"订单编号"`
+	OrderMoney          float64 `comment:"订单总价"`
+	CreateTime          string  `comment:"创建时间"`
+	SourceId            int     `comment:"来源ID"`
+	Source              string  `comment:"来源\n报告 :article\n活动 :activity"`
+	SourceTitle         string  `comment:"来源名称,活动或者报告标题"`
+	OrderStatus         int     `comment:"订单状态码"`
+	OrderStatusText     string  `comment:"订单状态描述"`
+	LabelKeywordImgLink string  `comment:"标签关键词ico"`
+	StartDate           string  `comment:"开始日期"`
+	EndDate             string  `comment:"结束日期"`
+}
+
+type UserOrderListResp struct {
+	Paging *paging.PagingItem `description:"分页数据"`
+	List   []*OrderListResp
+}
+
+type PayEdOrderDetailResp struct {
+	OrderCode   string `comment:"订单编号"`
+	OrderType   int    `comment:"订单类型,1:畅读卡订单,2:单场付费订单"`
+	EndDate     string `comment:"结束日期"`
+	OrderStatus int    `comment:"订单状态,0:已取消、1:待支付、2:已支付、3:已退款"`
+	SourceId    int    `comment:"来源ID"`
+	Source      string `comment:"来源\n报告 :article\n活动 :activity"`
+}
+
+// 添加
+func AddCygxOrder(item *CygxOrder) (err error) {
+	o, err := orm.NewOrm().Begin()
+	if err != nil {
+		return
+	}
+	defer func() {
+		fmt.Println(err)
+		if err == nil {
+			o.Commit()
+		} else {
+			o.Rollback()
+		}
+	}()
+
+	item.OrderStatus = 1 // 初始状态待支付
+
+	itemOrderAction := new(CygxOrderAction)
+
+	itemOrderAction.Action = "创建订单"
+	itemOrderAction.OrderStatus = 1
+	itemOrderAction.OrderStatusText = "待支付"
+	itemOrderAction.OrderCode = item.OrderCode
+	itemOrderAction.UserId = item.UserId
+	itemOrderAction.Mobile = item.Mobile
+	itemOrderAction.Email = item.Email
+	itemOrderAction.CompanyId = item.CompanyId
+	itemOrderAction.CompanyName = item.CompanyName
+	itemOrderAction.RealName = item.RealName
+	itemOrderAction.SellerName = item.SellerName
+	itemOrderAction.CreateTime = time.Now()
+	itemOrderAction.ModifyTime = time.Now()
+	itemOrderAction.RegisterPlatform = item.RegisterPlatform
+
+	_, err = o.Insert(item) //写入订单信息
+	if err != nil {
+		return
+	}
+
+	_, err = o.Insert(itemOrderAction) // 写入订单操作信息
+	if err != nil {
+		return
+	}
+	return
+}
+
+// 添加
+func CancelCygxOrder(item *CygxOrder) (err error) {
+	o, err := orm.NewOrm().Begin()
+	if err != nil {
+		return
+	}
+	defer func() {
+		fmt.Println(err)
+		if err == nil {
+			o.Commit()
+		} else {
+			o.Rollback()
+		}
+	}()
+	itemOrderAction := new(CygxOrderAction)
+	itemOrderAction.Action = "取消订单"
+	itemOrderAction.OrderStatus = 0
+	itemOrderAction.OrderStatusText = "已取消"
+	itemOrderAction.OrderCode = item.OrderCode
+	itemOrderAction.UserId = item.UserId
+	itemOrderAction.Mobile = item.Mobile
+	itemOrderAction.Email = item.Email
+	itemOrderAction.CompanyId = item.CompanyId
+	itemOrderAction.CompanyName = item.CompanyName
+	itemOrderAction.RealName = item.RealName
+	itemOrderAction.SellerName = item.SellerName
+	itemOrderAction.CreateTime = time.Now()
+	itemOrderAction.ModifyTime = time.Now()
+	itemOrderAction.RegisterPlatform = item.RegisterPlatform
+
+	_, err = o.Insert(itemOrderAction) // 写入订单操作信息
+	if err != nil {
+		return
+	}
+
+	updateParams := make(map[string]interface{})
+	updateParams["OrderStatus"] = 0
+	updateParams["ModifyTime"] = item.ModifyTime
+	ptrStructOrTableName := "cygx_order"
+	whereParam := map[string]interface{}{"order_code": item.OrderCode}
+	qs := o.QueryTable(ptrStructOrTableName)
+	for expr, exprV := range whereParam {
+		qs = qs.Filter(expr, exprV)
+	}
+	_, err = qs.Update(updateParams)
+	if err != nil {
+		return
+	}
+	return
+}
+
+// 根据订单编号修改
+func UpdateCygxOrder(item *CygxOrder, oldOrderCode string) (err error) {
+	o := orm.NewOrm()
+	updateParams := make(map[string]interface{})
+	updateParams["SourceId"] = item.SourceId
+	updateParams["Source"] = item.Source
+	updateParams["SourceTitle"] = item.SourceTitle
+	updateParams["ModifyTime"] = item.ModifyTime
+	ptrStructOrTableName := "cygx_order"
+	whereParam := map[string]interface{}{"order_code": oldOrderCode}
+	qs := o.QueryTable(ptrStructOrTableName)
+	for expr, exprV := range whereParam {
+		qs = qs.Filter(expr, exprV)
+	}
+	_, err = qs.Update(updateParams)
+	if err != nil {
+		return
+	}
+	return
+}
+
+func GetCygxOrderList(condition string, pars []interface{}, startSize, pageSize int) (items []*CygxOrderResp, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT *
+			FROM
+			cygx_order
+			WHERE 1 = 1 ` + condition
+	sql += ` LIMIT ?,?  `
+	_, err = o.Raw(sql, pars, startSize, pageSize).QueryRows(&items)
+	return
+}
+
+// 根据订单编号获取订单详情
+func GetCygxOrderDetailByOrderCode(orderCode string) (item *CygxOrder, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT * FROM cygx_order WHERE order_code = ? `
+	err = o.Raw(sql, orderCode).QueryRow(&item)
+	return
+}
+
+// 获取数量
+func GetCygxOrderCount(condition string, pars []interface{}) (count int, err error) {
+	o := orm.NewOrm()
+	sqlCount := ` SELECT COUNT(1) AS count  FROM cygx_order WHERE   1= 1  ` + condition
+	err = o.Raw(sqlCount, pars).QueryRow(&count)
+	return
+}

+ 25 - 0
models/order/order_payment.go

@@ -0,0 +1,25 @@
+package order
+
+import (
+	"github.com/beego/beego/v2/client/orm"
+	"time"
+)
+
+type CygxOrderPayment struct {
+	OrderPaymentID int       `orm:"column(order_payment_id);pk";comment:"订单支付ID"`
+	OrderCode      string    `comment:"订单编号"`
+	OutTradeCode   string    `comment:"外部交易号退款使用"`
+	PayBody        string    `comment:"订单支付简介"`
+	PayDetail      string    `comment:"订单支付详情"`
+	PayMoney       float64   `comment:"支付金额"`
+	PayStatus      string    `comment:"支付状态"`
+	CreateTime     time.Time `comment:"创建时间"`
+	PaymentType    int       `comment:"支付类型。取值范围:1微信支付,2支付宝支付。"`
+}
+
+// 添加
+func AddCygxOrderPayment(item *CygxOrderPayment) (err error) {
+	o := orm.NewOrm()
+	_, err = o.Insert(item) //回调支付信息
+	return
+}

+ 244 - 0
models/order/order_user_card.go

@@ -0,0 +1,244 @@
+package order
+
+import (
+	"fmt"
+	"github.com/beego/beego/v2/client/orm"
+	"time"
+)
+
+// 用户持卡表 CygxOrderUserCard 结构体对应 cygx_order_user_card 数据表
+type CygxOrderUserCard struct {
+	UserCardId       int       `orm:"column(user_card_id);pk";comment:"订单id"`
+	OrderCode        string    `comment:"订单编号"`
+	UserId           int       `comment:"用户ID"`
+	Mobile           string    `comment:"手机号"`
+	Email            string    `comment:"邮箱"`
+	CompanyId        int       `comment:"公司ID"`
+	CompanyName      string    `comment:"公司名称"`
+	RealName         string    `comment:"用户实际名称"`
+	SellerName       string    `comment:"所属销售"`
+	CreateTime       time.Time `comment:"创建时间"`
+	ModifyTime       time.Time `comment:"修改时间"`
+	RegisterPlatform int       `comment:"来源"`
+	CardType         string    `comment:"会员卡类型"`
+	StartDate        time.Time `comment:"开始时间"`
+	EndDate          time.Time `comment:"结束时间"`
+	IsSuspend        int       `comment:"是否暂停"`
+}
+
+// 用户持卡日志表 CygxOrderUserCardLog 结构体对应 cygx_order_user_card_log 数据表
+type CygxOrderUserCardLog struct {
+	UserCardId       int       `orm:"column(user_card_log_id);pk";comment:"订单id"`
+	OrderCode        string    `comment:"订单编号"`
+	UserId           int       `comment:"用户ID"`
+	Mobile           string    `comment:"手机号"`
+	Email            string    `comment:"邮箱"`
+	CompanyId        int       `comment:"公司ID"`
+	CompanyName      string    `comment:"公司名称"`
+	RealName         string    `comment:"用户实际名称"`
+	SellerName       string    `comment:"所属销售"`
+	CreateTime       time.Time `comment:"创建时间"`
+	ModifyTime       time.Time `comment:"修改时间"`
+	RegisterPlatform int       `comment:"来源"`
+	CardType         string    `comment:"会员卡类型"`
+	StartDate        time.Time `comment:"开始时间"`
+	EndDate          time.Time `comment:"结束时间"`
+	IsSuspend        int       `comment:"是否暂停"`
+}
+
+// 添加
+func AddCygxOrderUserCard(item *CygxOrderUserCard, itemOrder *CygxOrder) (err error) {
+	o, err := orm.NewOrm().Begin()
+	if err != nil {
+		return
+	}
+	defer func() {
+		fmt.Println(err)
+		if err == nil {
+			o.Commit()
+		} else {
+			o.Rollback()
+		}
+	}()
+
+	itemOrderAction := new(CygxOrderAction)
+
+	itemOrderAction.Action = "微信小程序已支付"
+	itemOrderAction.OrderStatus = 2
+	itemOrderAction.OrderStatusText = "已支付"
+	itemOrderAction.OrderCode = item.OrderCode
+	itemOrderAction.UserId = item.UserId
+	itemOrderAction.Mobile = item.Mobile
+	itemOrderAction.Email = item.Email
+	itemOrderAction.CompanyId = item.CompanyId
+	itemOrderAction.CompanyName = item.CompanyName
+	itemOrderAction.RealName = item.RealName
+	itemOrderAction.SellerName = item.SellerName
+	itemOrderAction.CreateTime = time.Now()
+	itemOrderAction.ModifyTime = time.Now()
+	itemOrderAction.RegisterPlatform = item.RegisterPlatform
+
+	updateParams := make(map[string]interface{})
+	updateParams["PayTime"] = itemOrder.PayTime
+	updateParams["PayMoney"] = itemOrder.PayMoney
+	updateParams["OrderStatus"] = itemOrder.OrderStatus
+	updateParams["OutTradeCode"] = itemOrder.OutTradeCode
+	updateParams["ModifyTime"] = item.ModifyTime
+	updateParams["StartDate"] = item.StartDate
+	updateParams["EndDate"] = item.EndDate
+	updateParams["PaymentType"] = 1
+	ptrStructOrTableName := "cygx_order"
+	whereParam := map[string]interface{}{"order_code": itemOrder.OrderCode}
+	qs := o.QueryTable(ptrStructOrTableName)
+	for expr, exprV := range whereParam {
+		qs = qs.Filter(expr, exprV)
+	}
+	_, err = qs.Update(updateParams) // 修改订单状态
+	if err != nil {
+		return
+	}
+
+	_, err = o.Insert(itemOrderAction) // 写入订单操作信息
+	if err != nil {
+		return
+	}
+
+	sql := ` DELETE FROM cygx_order_user_card  WHERE mobile=? ` // 删除原有的持卡信息
+	_, err = o.Raw(sql, item.Mobile).Exec()
+	if err != nil {
+		return
+	}
+
+	itemLog := new(CygxOrderUserCardLog)
+	itemLog.OrderCode = item.OrderCode
+	itemLog.UserId = item.UserId
+	itemLog.Mobile = item.Mobile
+	itemLog.Email = item.Email
+	itemLog.CompanyId = item.CompanyId
+	itemLog.CompanyName = item.CompanyName
+	itemLog.RealName = item.RealName
+	itemLog.SellerName = item.SellerName
+	itemLog.CreateTime = time.Now()
+	itemLog.ModifyTime = time.Now()
+	itemLog.RegisterPlatform = item.RegisterPlatform
+	itemLog.CardType = item.CardType
+	itemLog.StartDate = item.StartDate
+	itemLog.EndDate = item.EndDate
+	itemLog.IsSuspend = item.IsSuspend
+
+	_, err = o.Insert(item) //写入用户持卡表
+	if err != nil {
+		return
+	}
+
+	_, err = o.Insert(itemLog) // 写入用户持卡日志表
+	if err != nil {
+		return
+	}
+	return
+}
+
+// 根据订单编号获取用户持卡详情
+func GetCygxOrderUserCardDetailByOrderCode(orderCode string) (item *CygxOrderUserCard, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT * FROM cygx_order_user_card WHERE order_code = ? `
+	err = o.Raw(sql, orderCode).QueryRow(&item)
+	return
+}
+
+// 根据手机号获取用户持卡详情
+func GetCygxOrderUserCardDetailByMobile(mobile string) (item *CygxOrderUserCard, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT * FROM cygx_order_user_card WHERE mobile = ? `
+	err = o.Raw(sql, mobile).QueryRow(&item)
+	return
+}
+
+// 获取数量
+func GetCygxOrderUserCardCount(condition string, pars []interface{}) (count int, err error) {
+	o := orm.NewOrm()
+	sqlCount := ` SELECT COUNT(1) AS  count  FROM cygx_order_user_card WHERE   1= 1  ` + condition
+	err = o.Raw(sqlCount, pars).QueryRow(&count)
+	return
+}
+
+// 删除
+func RemoveCygxOrderUserCard(item *CygxOrderUserCard, itemOrder *CygxOrder) (err error) {
+	o, err := orm.NewOrm().Begin()
+	if err != nil {
+		return
+	}
+	defer func() {
+		fmt.Println(err)
+		if err == nil {
+			o.Commit()
+		} else {
+			o.Rollback()
+		}
+	}()
+
+	itemOrderAction := new(CygxOrderAction)
+
+	itemOrderAction.Action = "退款成功"
+	itemOrderAction.OrderStatus = 3
+	itemOrderAction.OrderStatusText = "已退款"
+	itemOrderAction.OrderCode = item.OrderCode
+	itemOrderAction.UserId = item.UserId
+	itemOrderAction.Mobile = item.Mobile
+	itemOrderAction.Email = item.Email
+	itemOrderAction.CompanyId = item.CompanyId
+	itemOrderAction.CompanyName = item.CompanyName
+	itemOrderAction.RealName = item.RealName
+	itemOrderAction.SellerName = item.SellerName
+	itemOrderAction.CreateTime = time.Now()
+	itemOrderAction.ModifyTime = time.Now()
+	itemOrderAction.RegisterPlatform = item.RegisterPlatform
+
+	updateParams := make(map[string]interface{})
+	updateParams["OrderStatus"] = itemOrder.OrderStatus
+	updateParams["ModifyTime"] = item.ModifyTime
+	ptrStructOrTableName := "cygx_order"
+	whereParam := map[string]interface{}{"order_code": itemOrder.OrderCode}
+	qs := o.QueryTable(ptrStructOrTableName)
+	for expr, exprV := range whereParam {
+		qs = qs.Filter(expr, exprV)
+	}
+	_, err = qs.Update(updateParams) // 修改订单状态
+	if err != nil {
+		return
+	}
+
+	_, err = o.Insert(itemOrderAction) // 写入订单操作信息
+	if err != nil {
+		return
+	}
+
+	sql := ` DELETE FROM cygx_order_user_card  WHERE mobile=? ` // 删除原有的持卡信息
+	_, err = o.Raw(sql, item.Mobile).Exec()
+	if err != nil {
+		return
+	}
+
+	itemLog := new(CygxOrderUserCardLog)
+	itemLog.OrderCode = item.OrderCode
+	itemLog.UserId = item.UserId
+	itemLog.Mobile = item.Mobile
+	itemLog.Email = item.Email
+	itemLog.CompanyId = item.CompanyId
+	itemLog.CompanyName = item.CompanyName
+	itemLog.RealName = item.RealName
+	itemLog.SellerName = item.SellerName
+	itemLog.CreateTime = time.Now()
+	itemLog.ModifyTime = time.Now()
+	itemLog.RegisterPlatform = item.RegisterPlatform
+	itemLog.CardType = item.CardType
+	itemLog.StartDate = item.StartDate
+	itemLog.EndDate = item.EndDate
+	itemLog.IsSuspend = 1
+
+	_, err = o.Insert(itemLog) // 写入用户持卡日志表
+	if err != nil {
+		return
+	}
+	return
+}

+ 157 - 0
models/order/order_virtual_asset.go

@@ -0,0 +1,157 @@
+package order
+
+//用户虚拟资产表
+
+import (
+	"fmt"
+	"github.com/beego/beego/v2/client/orm"
+	"hongze/hongze_web_mfyx/utils"
+	"time"
+)
+
+type CygxOrderVirtualAsset struct {
+	OrderVirtualAssetsId int       `orm:"column(order_virtual_assets_id);pk";comment:"订单支付ID"`
+	OrderCode            string    `comment:"订单编号"`
+	UserId               int       `comment:"用户ID"`
+	Mobile               string    `comment:"手机号"`
+	Email                string    `comment:"邮箱"`
+	CompanyId            int       `comment:"公司ID"`
+	CompanyName          string    `comment:"公司名称"`
+	RealName             string    `comment:"用户实际名称"`
+	SellerName           string    `comment:"所属销售"`
+	CreateTime           time.Time `comment:"创建时间"`
+	ModifyTime           time.Time `comment:"修改时间"`
+	SourceId             int       `comment:"来源ID"`
+	Source               string    `comment:"来源\n报告 :article\n活动 :activity"`
+}
+
+// 添加
+func AddCygxOrderVirtualAsset(item *CygxOrderVirtualAsset, itemOrder *CygxOrder) (err error) {
+	o, err := orm.NewOrm().Begin()
+	if err != nil {
+		return
+	}
+	defer func() {
+		fmt.Println(err)
+		if err == nil {
+			o.Commit()
+		} else {
+			o.Rollback()
+		}
+	}()
+
+	itemOrderAction := new(CygxOrderAction)
+
+	itemOrderAction.Action = "微信小程序已支付"
+	itemOrderAction.OrderStatus = 2
+	itemOrderAction.OrderStatusText = "已支付"
+	itemOrderAction.OrderCode = item.OrderCode
+	itemOrderAction.UserId = item.UserId
+	itemOrderAction.Mobile = item.Mobile
+	itemOrderAction.Email = item.Email
+	itemOrderAction.CompanyId = item.CompanyId
+	itemOrderAction.CompanyName = item.CompanyName
+	itemOrderAction.RealName = item.RealName
+	itemOrderAction.SellerName = item.SellerName
+	itemOrderAction.CreateTime = time.Now()
+	itemOrderAction.ModifyTime = time.Now()
+	itemOrderAction.RegisterPlatform = utils.REGISTER_PLATFORM
+
+	updateParams := make(map[string]interface{})
+	updateParams["PayTime"] = itemOrder.PayTime
+	updateParams["PayMoney"] = itemOrder.PayMoney
+	updateParams["OrderStatus"] = itemOrder.OrderStatus
+	updateParams["OutTradeCode"] = itemOrder.OutTradeCode
+	updateParams["ModifyTime"] = item.ModifyTime
+	updateParams["PaymentType"] = 1
+	ptrStructOrTableName := "cygx_order"
+	whereParam := map[string]interface{}{"order_code": itemOrder.OrderCode}
+	qs := o.QueryTable(ptrStructOrTableName)
+	for expr, exprV := range whereParam {
+		qs = qs.Filter(expr, exprV)
+	}
+	_, err = qs.Update(updateParams) // 修改订单状态
+	if err != nil {
+		return
+	}
+
+	_, err = o.Insert(itemOrderAction) // 写入订单操作信息
+	if err != nil {
+		return
+	}
+
+	_, err = o.Insert(item) //写入用户用户虚拟资产表
+	if err != nil {
+		return
+	}
+
+	return
+}
+
+// 获取数量
+func GetCygxOrderVirtualAssetdCount(condition string, pars []interface{}) (count int, err error) {
+	o := orm.NewOrm()
+	sqlCount := ` SELECT COUNT(1) AS  count  FROM cygx_order_virtual_asset WHERE   1= 1  ` + condition
+	err = o.Raw(sqlCount, pars).QueryRow(&count)
+	return
+}
+
+// 移除用户活动权限记录
+func RemoveCygxOrderVirtualAsset(item *CygxOrderVirtualAsset, itemOrder *CygxOrder) (err error) {
+	o, err := orm.NewOrm().Begin()
+	if err != nil {
+		return
+	}
+	defer func() {
+		fmt.Println(err)
+		if err == nil {
+			o.Commit()
+		} else {
+			o.Rollback()
+		}
+	}()
+
+	itemOrderAction := new(CygxOrderAction)
+
+	itemOrderAction.Action = "退款成功"
+	itemOrderAction.OrderStatus = 3
+	itemOrderAction.OrderStatusText = "已退款"
+	itemOrderAction.OrderCode = item.OrderCode
+	itemOrderAction.UserId = item.UserId
+	itemOrderAction.Mobile = item.Mobile
+	itemOrderAction.Email = item.Email
+	itemOrderAction.CompanyId = item.CompanyId
+	itemOrderAction.CompanyName = item.CompanyName
+	itemOrderAction.RealName = item.RealName
+	itemOrderAction.SellerName = item.SellerName
+	itemOrderAction.CreateTime = time.Now()
+	itemOrderAction.ModifyTime = time.Now()
+	itemOrderAction.RegisterPlatform = utils.REGISTER_PLATFORM
+
+	updateParams := make(map[string]interface{})
+	updateParams["OrderStatus"] = itemOrder.OrderStatus
+	updateParams["ModifyTime"] = item.ModifyTime
+	ptrStructOrTableName := "cygx_order"
+	whereParam := map[string]interface{}{"order_code": itemOrder.OrderCode}
+	qs := o.QueryTable(ptrStructOrTableName)
+	for expr, exprV := range whereParam {
+		qs = qs.Filter(expr, exprV)
+	}
+	_, err = qs.Update(updateParams) // 修改订单状态
+	if err != nil {
+		return
+	}
+
+	_, err = o.Insert(itemOrderAction) // 写入订单操作信息
+	if err != nil {
+		return
+	}
+
+	sql := ` DELETE FROM cygx_order_virtual_asset  WHERE order_code =? ` // 删除原有的持卡信息
+	_, err = o.Raw(sql, item.OrderCode).Exec()
+	if err != nil {
+		return
+	}
+
+	return
+}

+ 42 - 0
models/order/user_business_card.go

@@ -0,0 +1,42 @@
+package order
+
+import (
+	"github.com/beego/beego/v2/client/orm"
+	"time"
+	//"time"
+)
+
+type CygxUserBusinessCard struct {
+	Id               int    `orm:"column(id);pk"`
+	BusinessCardUrl  string `description:"名片地址"`
+	UserId           int    `description:"用户ID"`
+	RealName         string `description:"用户实际名称"`
+	Mobile           string `description:"手机号"`
+	CompanyName      string `description:"公司名称"`
+	CreateTime       time.Time
+	ModifyTime       time.Time `description:"修改时间"`
+	RegisterPlatform int       `description:"来源"`
+	InviteName       string    `description:"邀请人"`
+}
+
+type CygxUserBusinessCardReq struct {
+	BusinessCardUrl string `description:"名片地址"`
+	RealName        string `description:"用户实际名称"`
+	Mobile          string `description:"手机号"`
+	CompanyName     string `description:"公司名称"`
+	InviteName      string `description:"邀请人"`
+}
+
+func GetCygxUserBusinessCardCount(userId int) (count int, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT COUNT(1) AS count FROM cygx_user_business_card WHERE user_id=?  `
+	err = o.Raw(sql, userId).QueryRow(&count)
+	return
+}
+
+// 新增
+func AddCygxUserBusinessCard(item *CygxUserBusinessCard) (err error) {
+	o := orm.NewOrm()
+	_, err = o.Insert(item)
+	return
+}

+ 17 - 0
models/seller.go

@@ -90,3 +90,20 @@ func GetAdminListByGroupId(groupId int) (items []*Admin, err error) {
 	_, err = o.Raw(sql, groupId).QueryRows(&items)
 	return
 }
+
+// 获取权益销售信息
+func GetRaiSellerByCompanyId(companyId int) (item *AdminItem, err error) {
+	o := orm.NewOrmUsingDB("weekly_report")
+	sql := ` SELECT
+     		b.admin_id,
+			b.real_name,
+			b.mobile 
+		FROM
+			company_product AS a
+			INNER JOIN admin AS b ON a.seller_id = b.admin_id 
+		WHERE
+			a.product_id = 2 
+			AND a.company_id = ?`
+	err = o.Raw(sql, companyId).QueryRow(&item)
+	return
+}

+ 2 - 0
models/user.go

@@ -154,6 +154,8 @@ type UserDetailResp struct {
 	IsAuthor             bool     `description:"是否开通了研选专栏"`
 	SpecialColumnId      int      // 专栏栏目ID
 	IsImproveInformation bool     `description:"作者信息是否完善"`
+	UserCardType         int      `description:"权益卡类型,0:未开通、1日卡、2月卡"`
+	UserCardEndDate      string   `description:"权益卡有效期"`
 }
 
 type CheckStatusResp struct {

+ 54 - 0
routers/commentsRouter.go

@@ -673,6 +673,51 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["hongze/hongze_web_mfyx/controllers:OrderController"] = append(beego.GlobalControllerRouter["hongze/hongze_web_mfyx/controllers:OrderController"],
+        beego.ControllerComments{
+            Method: "AddByActivity",
+            Router: `/addByActivity`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hongze_web_mfyx/controllers:OrderController"] = append(beego.GlobalControllerRouter["hongze/hongze_web_mfyx/controllers:OrderController"],
+        beego.ControllerComments{
+            Method: "AddByArticle",
+            Router: `/addByArticle`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hongze_web_mfyx/controllers:OrderController"] = append(beego.GlobalControllerRouter["hongze/hongze_web_mfyx/controllers:OrderController"],
+        beego.ControllerComments{
+            Method: "Cancel",
+            Router: `/cancel`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hongze_web_mfyx/controllers:OrderController"] = append(beego.GlobalControllerRouter["hongze/hongze_web_mfyx/controllers:OrderController"],
+        beego.ControllerComments{
+            Method: "OrderDetail",
+            Router: `/orderPay/detail`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hongze_web_mfyx/controllers:OrderController"] = append(beego.GlobalControllerRouter["hongze/hongze_web_mfyx/controllers:OrderController"],
+        beego.ControllerComments{
+            Method: "UserOrderList",
+            Router: `/user/orderList`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["hongze/hongze_web_mfyx/controllers:ReportCommonController"] = append(beego.GlobalControllerRouter["hongze/hongze_web_mfyx/controllers:ReportCommonController"],
         beego.ControllerComments{
             Method: "CompanyList",
@@ -880,6 +925,15 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["hongze/hongze_web_mfyx/controllers:UserController"] = append(beego.GlobalControllerRouter["hongze/hongze_web_mfyx/controllers:UserController"],
+        beego.ControllerComments{
+            Method: "UploadUserBusinessCard",
+            Router: `/upload/UserBusinessCard`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["hongze/hongze_web_mfyx/controllers:WechatCommonController"] = append(beego.GlobalControllerRouter["hongze/hongze_web_mfyx/controllers:WechatCommonController"],
         beego.ControllerComments{
             Method: "GetWxSign",

+ 5 - 0
routers/router.go

@@ -137,6 +137,11 @@ func init() {
 				&controllers.YanxuanSpecialNoLoginController{},
 			),
 		),
+		web.NSNamespace("/order",
+			web.NSInclude(
+				&controllers.OrderController{},
+			),
+		),
 	)
 	web.AddNamespace(ns)
 }

+ 82 - 1
services/aliyun.go

@@ -5,9 +5,13 @@ import (
 	"encoding/base64"
 	"encoding/json"
 	"fmt"
+	"hongze/hongze_web_mfyx/models"
+	"hongze/hongze_web_mfyx/utils"
+	"io"
 	"io/ioutil"
 	"net/http"
 	"strings"
+	"time"
 
 	rhttp "github.com/rdlucklib/rdluck_tools/http"
 )
@@ -18,6 +22,11 @@ const (
 	AlAppCode   = "22553c4ba74545568aba70ac6cfd441d"
 )
 
+var (
+	//文档 https://market.aliyun.com/apimarket/detail/cmapi013591?spm=5176.product-detail.detail.4.6d4f3dcaS0qPFI&endpoint=a3dd145f3865492ba6f02d0c09dd00a1
+	AliyunOcrBusinessCardCode = "22553c4ba74545568aba70ac6cfd441d" // 阿里云OCR名片识别的code
+)
+
 type OcrItem struct {
 	Image string `json:"image"`
 }
@@ -29,7 +38,7 @@ type OcrResult struct {
 	TelCell []string `json:"tel_cell"`
 }
 
-///ocr_business_card.json
+// /ocr_business_card.json
 func AliyunBusinessCard(imgUrl string) (result *OcrResult, err error) {
 	postUrl := `https://dm-57.data.aliyun.com/rest/160601/ocr/ocr_business_card.json`
 
@@ -74,3 +83,75 @@ func AliyunBusinessCard(imgUrl string) (result *OcrResult, err error) {
 	err = json.Unmarshal(body, &result)
 	return
 }
+
+// 阿里云名片识别返回类
+type OcrBusinessCardResult struct {
+	TelCell    []string `json:"tel_cell"`
+	Success    bool     `json:"success"`
+	Name       string   `json:"name"`
+	Company    []string `json:"company"`
+	Addr       []string `json:"addr"`
+	Department []string `json:"department"`
+	Title      []string `json:"title"`
+	RequestID  string   `json:"request_id"`
+	Email      []string `json:"email"`
+	TelWork    []string `json:"tel_work"`
+}
+
+// 阿里云名片识别更换2024-01-02
+func AliyunOcrBusinessCard(imageurl string) (result *OcrBusinessCardResult, err error) {
+	postUrl := "https://bizcard.market.alicloudapi.com/rest/160601/ocr/ocr_business_card.json"
+	//method := "POST"
+
+	item := new(OcrItem)
+	item.Image = imageurl
+	jsonBody, err := json.Marshal(item)
+	if err != nil {
+		fmt.Println("json.Marshal Err:" + err.Error())
+		return
+	}
+	tr := &http.Transport{
+		TLSClientConfig: &tls.Config{InsecureSkipVerify: true},
+	}
+	client := &http.Client{Transport: tr}
+	req, err := http.NewRequest("POST", postUrl, strings.NewReader(string(jsonBody)))
+	req.Header.Add("Authorization", "APPCODE "+AliyunOcrBusinessCardCode)
+	req.Header.Add("Content-Type", "application/json")
+
+	res, err := client.Do(req)
+	if err != nil {
+		fmt.Println(err)
+		return
+	}
+	defer res.Body.Close()
+
+	body, err := io.ReadAll(res.Body)
+	if err != nil {
+		fmt.Println(err)
+		return
+	}
+	err = json.Unmarshal(body, &result)
+	if err != nil {
+		fmt.Println(err)
+		return
+	}
+
+	//处理返回的手机号格式,并进行数据合并
+	var telCell []string
+	if len(result.TelCell) > 0 {
+		for _, v := range result.TelCell {
+			telCell = append(telCell, utils.GetArabicNumbers(v))
+		}
+	}
+	if len(result.TelWork) > 0 {
+		for _, v := range result.TelWork {
+			telCell = append(telCell, utils.GetArabicNumbers(v))
+		}
+	}
+	logItem := new(models.AliyunOcrLog)
+	logItem.ImgUrl = imageurl
+	logItem.Result = string(body)
+	logItem.CreateTime = time.Now()
+	err = models.AddAliyunOcrLog(logItem)
+	return
+}

+ 51 - 184
services/article.go

@@ -11,8 +11,6 @@ import (
 	"sort"
 	"strconv"
 	"strings"
-	"time"
-	"unicode/utf8"
 )
 
 func FixArticleImgUrl(body string) (contentSub string, err error) {
@@ -31,31 +29,6 @@ func FixArticleImgUrl(body string) (contentSub string, err error) {
 	return
 }
 
-// GetReportContentTextSubByarticle 解析文章内容
-func GetReportContentTextSubByarticle(content, abstract string, articleId int) (contentSub string, err error) {
-	var lenabstract int
-	//如果不是研选就这么展示
-	if articleId < utils.SummaryArticleId {
-		abstract = html.UnescapeString(abstract)
-		doc, errdoc := goquery.NewDocumentFromReader(strings.NewReader(abstract))
-		if errdoc != nil {
-			err = errdoc
-			return
-		}
-		docabstract := doc.Text()
-		lenabstract = utf8.RuneCountInString(docabstract)
-		if lenabstract >= 20 {
-			contentSub = docabstract
-			return
-		} else {
-			contentSub, err = GetReportContentTextSub(content)
-		}
-	} else {
-		contentSub, err = GetReportContentTextSub(content)
-	}
-	return
-}
-
 func GetReportContentTextSub(content string) (contentSub string, err error) {
 	content = html.UnescapeString(content)
 	doc, errdoc := goquery.NewDocumentFromReader(strings.NewReader(content))
@@ -259,54 +232,6 @@ func HandleArticleStock(stock string) (items []*models.ComapnyNameResp) {
 	return
 }
 
-// 弘则报告发布日期在三个月以内的
-func GetArticNewLabelWhithActivity3Month() (labelMap map[int]bool, err error) {
-	var condition string
-	var pars []interface{}
-	condition += ` AND publish_date  <= ?  AND article_id < ? `
-	pars = append(pars, time.Now().AddDate(0, -3, 0), utils.SummaryArticleId)
-	articleList, e := models.GetArticleList(condition, pars)
-	if e != nil {
-		err = errors.New("GetArticleList, Err: " + e.Error())
-		return
-	}
-	var articleIds []int
-	for _, v := range articleList {
-		articleIds = append(articleIds, v.ArticleId)
-	}
-	if len(articleIds) == 0 {
-		return
-	}
-
-	pars = make([]interface{}, 0)
-	condition = ` AND article_id IN (` + utils.GetOrmInReplace(len(articleIds)) + `)`
-	pars = append(pars, articleIds)
-	industrialList, e := models.GetIndustrialArticleGroupManagementList(condition, pars)
-	if e != nil {
-		err = errors.New("GetIndustrialArticleGroupManagementList, Err: " + e.Error())
-		return
-	}
-	labelMap = make(map[int]bool, 0)
-	var industrialIds []int
-	for _, v := range industrialList {
-		industrialIds = append(industrialIds, v.IndustrialManagementId)
-	}
-	// 获取活动关联的产业
-	var groupCond string
-	var groupPars []interface{}
-	groupCond += ` AND b.industrial_management_id IN (` + utils.GetOrmInReplace(len(industrialIds)) + `)  AND b.source = 1  `
-	groupPars = append(groupPars, industrialIds)
-	groups, e := models.GetActivityIndustryRelationList(groupCond, groupPars)
-	if e != nil {
-		err = errors.New("获取活动产业关联列表失败, Err: " + e.Error())
-		return
-	}
-	for _, v := range groups {
-		labelMap[v.ActivityId] = true
-	}
-	return
-}
-
 // GetSpecialArticleDetailUserPower 处理用户查看专项调研文章详情的权限
 func GetSpecialArticleDetailUserPower(user *models.WxUserItem, articleInfo *models.ArticleDetail) (havePower bool, err error) {
 	userType, _, e := GetUserType(user.CompanyId)
@@ -342,14 +267,6 @@ func GetSpecialArticleDetailUserPower(user *models.WxUserItem, articleInfo *mode
 	return
 }
 
-//处理核心观点的展示规则
-//func ArticleAnnotation(item *models.ArticleListResp) (annotation string) {
-//	if item.Annotation != "" {
-//		annotation = strings.Replace(item.Annotation, "<br>", "", -1)
-//	}
-//	return
-//}
-
 func GetReportContentTextSubNew(content string) (contentSub string, err error) {
 	content = html.UnescapeString(content)
 	doc, errdoc := goquery.NewDocumentFromReader(strings.NewReader(content))
@@ -514,16 +431,6 @@ func AnnotationHtml(bodyText string) (annotation string) {
 	return
 }
 
-// 处理产品内测展示规则
-func ProductInteriorHtml(bodyText string) (annotation string) {
-	if bodyText == "" {
-		return
-	}
-	sliceBody := strings.Split(bodyText, "</p>")
-	annotation, _ = GetReportContentTextSub(sliceBody[0])
-	return
-}
-
 // 解析研选内容中的核心观点
 func YxArticleAnnotation(article *models.ArticleListResp) (annotation string) {
 	//如果不规范,就获取内容主体
@@ -596,97 +503,6 @@ func GetYanXuanArticleTypeIds() (articleTypeIds string, err error) {
 	return
 }
 
-// GetUserAticleCollectMap 获取用户收藏的文章ID
-func GetUserAticleCollectMap(user *models.WxUserItem) (respMap map[int]int, err error) {
-	list, e := models.GetCygxArticleCollectListByUser(user.UserId)
-	if e != nil {
-		err = errors.New("GetCygxArticleCollectListByUser, Err: " + e.Error())
-		return
-	}
-	articleMap := make(map[int]int)
-	for _, v := range list {
-		articleMap[v.ArticleId] = v.ArticleId
-	}
-	respMap = articleMap
-	return
-}
-
-// 通过接解析带有Md5的文章链接获取文章ID
-func GetReportLinkToArticleid(reportLink string) (articleId int, err error) {
-	defer func() {
-		if err != nil {
-			go utils.SendAlarmMsg("通过接解析带有Md5的文章链接获取文章ID失败"+err.Error(), 2)
-		}
-	}()
-	var artMd5 string
-	//处理Md5的
-	strnum1 := strings.Index(reportLink, "id=")
-	if strnum1 > 0 {
-		sliceId := strings.Split(reportLink, "id=")
-		if len(sliceId) > 1 {
-			reportLink = sliceId[1]
-			sliceMd5Id := strings.Split(reportLink, "&")
-			artMd5 = sliceMd5Id[0]
-		}
-		if artMd5 != "" {
-			detail, errArt := models.GetArticleDetailByIdMd5(artMd5)
-			if errArt != nil && errArt.Error() != utils.ErrNoRow() {
-				err = errArt
-				return
-			}
-			if detail != nil {
-				articleId = detail.ArticleId
-			}
-		}
-	} else {
-		//处理活动的
-		linkList := strings.Split(reportLink, "/")
-		if linkList[len(linkList)-1] != "" {
-			linkArticleId, _ := strconv.Atoi(linkList[len(linkList)-1])
-			if linkArticleId > 0 {
-				articleInfo, errArt := models.GetArticleDetailById(linkArticleId)
-				if errArt != nil && errArt.Error() != utils.ErrNoRow() {
-					err = errArt
-					return
-				}
-				if articleInfo != nil {
-					articleId = articleInfo.ArticleId
-				}
-			}
-		}
-	}
-	return
-}
-
-// GetArticleStockMap 获取个股标签所对应的文章ID
-func GetArticleStockMap() (mapResp map[string]int, err error) {
-	defer func() {
-		if err != nil {
-			go utils.SendAlarmMsg("获取个股标签所对应的文章ID失败"+err.Error(), 2)
-		}
-	}()
-	list, err := models.GetArticleStock()
-	if err != nil && err.Error() != utils.ErrNoRow() {
-		return
-	}
-	mapResp = make(map[string]int, 0)
-	if len(list) > 0 {
-		//一对一精准匹配
-		for _, v := range list {
-			sliceSubjects := strings.Split(v.Stock, "/")
-			if len(sliceSubjects) > 0 {
-				for _, vSubject := range sliceSubjects {
-					sliceKuohao := strings.Split(vSubject, "(")           //过滤括号
-					sliceXiahuaxian := strings.Split(sliceKuohao[0], "-") //过滤下划线
-					subject := sliceXiahuaxian[0]
-					mapResp[subject] = v.ArticleId
-				}
-			}
-		}
-	}
-	return
-}
-
 // 用户报告操作行为,模板消息推送
 func ArticleUserRemind(user *models.WxUserItem, articleDetail *models.ArticleDetail, source int) (err error) {
 	defer func() {
@@ -834,3 +650,54 @@ func GetArticleShareImg(articleId int) (shareImg string) {
 	}
 	return
 }
+
+// GetArticleDetailUserPower 处理用户查看报告详情的权限
+func GetArticleDetailUserPower(user *models.WxUserItem, articleInfo *models.ArticleDetail) (havePower bool, err error) {
+	userId := user.UserId
+	companyId := user.CompanyId
+	//判断用户是否开通了个人研选权限
+	mfyxUserPermissionTotal := GetMfyxUserPermissionTotal(userId)
+
+	if mfyxUserPermissionTotal == 1 {
+		havePower = true
+		return
+	}
+
+	//用户是否持有有效卡片
+	userCardTotal := GetCygxOrderUserCardTotal(user.Mobile)
+	fmt.Println("userCardTotal", userCardTotal)
+	if userCardTotal == 1 {
+		havePower = true
+		return
+	}
+
+	//是否是权益客户
+	raiCount, e := models.GetCompanyProductCount(companyId, utils.COMPANY_PRODUCT_RAI_ID)
+	if e != nil {
+		err = errors.New("GetCompanyProductCount, Err: " + e.Error())
+		return
+	}
+	if raiCount == 0 {
+		return
+	}
+
+	productDetail, e := models.GetCompanyProductDetailByCompanyId(companyId, 2)
+	if e != nil {
+		err = errors.New("GetCompanyProductDetailByCompanyId, Err: " + e.Error())
+		return
+	}
+	// 永续客户无法查看研选权限
+	if productDetail.Status == utils.COMPANY_STATUS_FOREVER {
+		return
+	}
+	permissionStr, e := models.GetCompanyPermission(companyId)
+	if e != nil {
+		err = errors.New("GetCompanyPermission, Err: " + e.Error())
+		return
+	}
+	if strings.Contains(permissionStr, utils.CHART_PERMISSION_NAME_MF_YANXUAN) {
+		havePower = true
+		return
+	}
+	return
+}

+ 325 - 0
services/order.go

@@ -0,0 +1,325 @@
+package services
+
+import (
+	"encoding/json"
+	"errors"
+	"fmt"
+	"hongze/hongze_web_mfyx/models"
+	"hongze/hongze_web_mfyx/models/order"
+	"hongze/hongze_web_mfyx/utils"
+	"time"
+)
+
+// 获取日卡、月卡商品配置信息
+func GetUserGoodsCardList() (goodsListResp []*order.CygxGoodsResp) {
+	var err error
+	defer func() {
+		if err != nil {
+			fmt.Println(err)
+			go utils.SendAlarmMsg(fmt.Sprint("判断用户是否开通了个人研选权限失败 GetCygxGoodsList, err:", err.Error()), 2)
+		}
+	}()
+	var condition string
+	var pars []interface{}
+	condition = ` AND  goods_id IN  (1,2) `
+	goodsList, e := order.GetCygxGoodsList(condition, pars)
+	if e != nil {
+		err = errors.New("GetCygxGoodsList, Err: " + e.Error())
+		return
+	}
+	goodsListResp = goodsList
+	return
+}
+
+// 获取单场活动关联的商品配置信息
+func GetGoodsInfoByActivity(item *models.ActivityDetail) (goodsListResp []*order.CygxGoodsResp) {
+	var err error
+	defer func() {
+		if err != nil {
+			fmt.Println(err)
+			go utils.SendAlarmMsg(fmt.Sprint("判断用户是否开通了个人研选权限失败 GetCygxGoodsList, err:", err.Error()), 2)
+		}
+	}()
+	//var goodsList []*order.CygxGoodsResp
+	//var e error
+	var condition string
+	var pars []interface{}
+
+	if item.ActivityTypeId == 1 && item.IsLimitPeople == 1 { //专家电话会。限制人数,
+		condition = ` AND  goods_id IN  (3) `
+	} else if (item.ActivityTypeId == 5 || item.ActivityTypeId == 8) && item.IsResearchPoints { //买方线下交流/专家线下沙龙。参会人扣点,
+		condition = ` AND  goods_id IN  (4) `
+	} else if (item.ActivityTypeId == 5 || item.ActivityTypeId == 8) && !item.IsResearchPoints { //买方线下交流/专家线下沙龙。参会人扣点,
+		condition = ` AND  goods_id IN  (5) `
+	} else if item.ActivityTypeId == 3 && item.IsResearchPoints { //非易董。公司调研电话会参会人扣点
+		condition = ` AND  goods_id IN  (6) `
+	} else if item.ActivityTypeId == 3 && !item.IsResearchPoints { //非易董。公司调研电话会参会人扣点
+		condition = ` AND  goods_id IN  (7) `
+	} else if item.ActivityTypeId == 1 && item.IsResearchPoints { //专家电话会,不限制人数,研选扣点(1299元)
+		condition = ` AND  goods_id IN  (8) `
+	}
+	goodsList, e := order.GetCygxGoodsList(condition, pars)
+	if e != nil {
+		err = errors.New("GetCygxGoodsList, Err: " + e.Error())
+		return
+	}
+	goodsListResp = goodsList
+	return
+}
+
+// 获取用户十分钟之内是否有相同的订单信息
+func GetHaverEquallyOrderByUser10Min(userId, goodsId int) (orderCode string) {
+	var err error
+	defer func() {
+		if err != nil {
+			fmt.Println(err)
+			go utils.SendAlarmMsg(fmt.Sprint("获取用户十分钟之内是否有相同的订单信息失败 GetHaverEquallyOrderByUser10Min, err:", err.Error()), 2)
+		}
+	}()
+	var condition string
+	var pars []interface{}
+	endTime := time.Now().Add(-10 * time.Minute)
+	condition = ` AND order_status = 1 AND  user_id = ? AND  goods_id = ? AND create_time > ?  ORDER BY order_id DESC  `
+	pars = append(pars, userId, goodsId, endTime)
+	orderList, e := order.GetCygxOrderList(condition, pars, 0, 1)
+	if e != nil && e.Error() != utils.ErrNoRow() {
+		err = errors.New("GetCygxOrderList, Err: " + e.Error())
+		return
+	}
+	if len(orderList) == 0 {
+		return
+	} else {
+		for _, v := range orderList {
+			orderCode = v.OrderCode
+		}
+	}
+	return
+}
+
+// 获取用户十分钟之内是否有相同的订单信息
+func GetHaverEquallyOrderByUser10MinByActivty(userId, sourceId int) (orderCode string, seconds int) {
+	var err error
+	defer func() {
+		if err != nil {
+			fmt.Println(err)
+			go utils.SendAlarmMsg(fmt.Sprint("获取用户十分钟之内是否有相同的订单信息失败 GetHaverEquallyOrderByUser10Min, err:", err.Error()), 2)
+		}
+	}()
+	var condition string
+	var pars []interface{}
+	endTime := time.Now().Add(-10 * time.Minute)
+	condition = `  AND order_status = 1  AND source = 'activity' AND  user_id = ? AND  source_id = ? AND create_time > ?  ORDER BY order_id DESC  `
+	pars = append(pars, userId, sourceId, endTime)
+	orderList, e := order.GetCygxOrderList(condition, pars, 0, 1)
+	if e != nil && e.Error() != utils.ErrNoRow() {
+		err = errors.New("GetCygxOrderList, Err: " + e.Error())
+		return
+	}
+	if len(orderList) == 0 {
+		return
+	} else {
+		for _, v := range orderList {
+			orderCode = v.OrderCode
+			duration := time.Now().Sub(v.CreateTime)
+			// 将时间差转换为秒数
+			seconds = 600 - int(duration.Seconds())
+		}
+	}
+	return
+}
+
+// 处理支付订单回调
+func HandleOrderHandle(itemCallback *WechatPayCallback) {
+	var err error
+	defer func() {
+		if err != nil {
+			fmt.Println(err)
+			go utils.SendAlarmMsg(fmt.Sprint("处理订单回调信息失败 HandleOrderHandle, err:", err.Error()), 2)
+		}
+	}()
+	outTradeNo := itemCallback.OutTradeNo
+	orderDetail, e := order.GetCygxOrderDetailByOrderCode(outTradeNo)
+	if e != nil {
+		err = errors.New("GetCygxOrderDetailByOrderCode, Err: " + e.Error())
+		return
+	}
+
+	go AddCygxOrderPayment(itemCallback) // 记录支付交易信息
+
+	if itemCallback.TradeState != "SUCCESS" { // 回调显示支付不成功,模版消息推送
+		if e != nil {
+			err = errors.New("支付失败,  OrderCode: " + outTradeNo)
+			return
+		}
+	}
+	//修改过状态的不再二次处理
+	if orderDetail.OrderStatus == 2 {
+		return
+	}
+
+	itemOrder := new(order.CygxOrder)
+	itemOrder.OrderCode = itemCallback.OutTradeNo
+	itemOrder.PayTime = itemCallback.SuccessTime
+	itemOrder.PayMoney = float64(float64(itemCallback.Amount.PayerTotal) / 100) // 金额分转换处理
+	itemOrder.OrderStatus = 2
+	itemOrder.OutTradeCode = itemCallback.TransactionID
+
+	//文章处理逻辑  	OrderType        int       `comment:"订单类型,1:畅读卡订单,2:单场付费订单"`
+	if orderDetail.OrderType == 1 {
+		itemUserCard := new(order.CygxOrderUserCard)
+		itemUserCard.OrderCode = orderDetail.OrderCode
+		itemUserCard.UserId = orderDetail.UserId
+		itemUserCard.Mobile = orderDetail.Mobile
+		itemUserCard.Email = orderDetail.Email
+		itemUserCard.CompanyId = orderDetail.CompanyId
+		itemUserCard.CompanyName = orderDetail.CompanyName
+		itemUserCard.RealName = orderDetail.RealName
+		itemUserCard.SellerName = orderDetail.SellerName
+		itemUserCard.CreateTime = time.Now()
+		itemUserCard.ModifyTime = time.Now()
+		itemUserCard.RegisterPlatform = orderDetail.RegisterPlatform
+
+		if orderDetail.GoodsId == 1 {
+			itemUserCard.StartDate = itemOrder.PayTime
+			itemUserCard.EndDate = itemOrder.PayTime.AddDate(0, 0, 1)
+			itemUserCard.CardType = "日卡"
+		} else {
+			now := time.Now()
+			itemUserCard.StartDate = time.Date(now.Year(), now.Month(), now.Day(), 0, 0, 0, 0, time.Local)
+			itemUserCard.EndDate = itemUserCard.StartDate.AddDate(0, 1, 0)
+			itemUserCard.CardType = "月卡"
+		}
+		e = order.AddCygxOrderUserCard(itemUserCard, itemOrder)
+		if e != nil {
+			err = errors.New("AddCygxOrderUserCard, Err: " + e.Error())
+			return
+		}
+	} else if orderDetail.OrderType == 2 {
+		//如果是活动,把单场付费信息的活动写入 用户虚拟资产表
+		itemOrderVirtualAsset := new(order.CygxOrderVirtualAsset)
+		itemOrderVirtualAsset.OrderCode = orderDetail.OrderCode
+		itemOrderVirtualAsset.UserId = orderDetail.UserId
+		itemOrderVirtualAsset.Mobile = orderDetail.Mobile
+		itemOrderVirtualAsset.Email = orderDetail.Email
+		itemOrderVirtualAsset.CompanyId = orderDetail.CompanyId
+		itemOrderVirtualAsset.CompanyName = orderDetail.CompanyName
+		itemOrderVirtualAsset.RealName = orderDetail.RealName
+		itemOrderVirtualAsset.SellerName = orderDetail.SellerName
+		itemOrderVirtualAsset.Source = orderDetail.Source
+		itemOrderVirtualAsset.SourceId = orderDetail.SourceId
+		itemOrderVirtualAsset.CreateTime = time.Now()
+		itemOrderVirtualAsset.ModifyTime = time.Now()
+		e = order.AddCygxOrderVirtualAsset(itemOrderVirtualAsset, itemOrder)
+		if e != nil {
+			err = errors.New("AddCygxOrderVirtualAsset, Err: " + e.Error())
+			return
+		}
+	}
+	fmt.Println(orderDetail.Source)
+	return
+}
+
+func AddCygxOrderPayment(itemCallback *WechatPayCallback) {
+	var err error
+	defer func() {
+		if err != nil {
+			fmt.Println(err)
+			go utils.SendAlarmMsg(fmt.Sprint("处理订单回调信息失败 HandleOrderHandle, err:", err.Error()), 2)
+		}
+	}()
+	itemPay := new(order.CygxOrderPayment)
+	itemPay.OrderCode = itemCallback.OutTradeNo
+	itemPay.OutTradeCode = itemCallback.TransactionID
+	itemPay.PayBody = itemCallback.TradeStateDesc
+	jsonData, _ := json.Marshal(itemCallback)
+	itemPay.PayDetail = string(jsonData)
+	itemPay.PayMoney = float64(float64(itemCallback.Amount.PayerTotal) / 100) // 金额分转换处理
+	itemPay.PayStatus = itemCallback.TradeState
+	itemPay.CreateTime = time.Now()
+	itemPay.PaymentType = 1
+	e := order.AddCygxOrderPayment(itemPay)
+	if e != nil {
+		err = errors.New("AddCygxOrderPayment, Err: " + e.Error())
+		return
+	}
+	return
+}
+
+// 处理退款订单回调
+func HandleOrderRefundHandle(itemCallback *WechatPayCallback) {
+	var err error
+	defer func() {
+		if err != nil {
+			fmt.Println(err)
+			go utils.SendAlarmMsg(fmt.Sprint("处理退款订单回调信息失败 HandleOrderRefundHandle, err:", err.Error()), 2)
+		}
+	}()
+	outTradeNo := itemCallback.OutTradeNo
+	orderDetail, e := order.GetCygxOrderDetailByOrderCode(outTradeNo)
+	if e != nil {
+		err = errors.New("GetCygxOrderDetailByOrderCode, Err: " + e.Error())
+		return
+	}
+
+	//go AddCygxOrderPayment(itemCallback) // 记录支付交易信息
+
+	//修改过状态的不再二次处理
+	if orderDetail.OrderStatus == 3 {
+		return
+	}
+
+	itemOrder := new(order.CygxOrder)
+	itemOrder.OrderCode = itemCallback.OutTradeNo
+	itemOrder.RefundTime = itemCallback.SuccessTime
+	itemOrder.RefundMoney = float64(float64(itemCallback.Amount.PayerTotal) / 100) // 金额分转换处理
+	itemOrder.OrderStatus = 3
+
+	//文章处理逻辑  	OrderType        int       `comment:"订单类型,1:畅读卡订单,2:单场付费订单"`
+	if orderDetail.OrderType == 1 {
+		itemUserCard := new(order.CygxOrderUserCard)
+		itemUserCard.OrderCode = orderDetail.OrderCode
+		itemUserCard.UserId = orderDetail.UserId
+		itemUserCard.Mobile = orderDetail.Mobile
+		itemUserCard.Email = orderDetail.Email
+		itemUserCard.CompanyId = orderDetail.CompanyId
+		itemUserCard.CompanyName = orderDetail.CompanyName
+		itemUserCard.RealName = orderDetail.RealName
+		itemUserCard.SellerName = orderDetail.SellerName
+		itemUserCard.CreateTime = time.Now()
+		itemUserCard.ModifyTime = time.Now()
+		itemUserCard.RegisterPlatform = orderDetail.RegisterPlatform
+
+		if orderDetail.GoodsId == 1 {
+			itemUserCard.CardType = "日卡"
+		} else {
+			itemUserCard.CardType = "月卡"
+		}
+		e = order.RemoveCygxOrderUserCard(itemUserCard, itemOrder) // 移除用户
+		if e != nil {
+			err = errors.New("RemoveCygxOrderUserCard, Err: " + e.Error())
+			return
+		}
+	} else if orderDetail.OrderType == 2 {
+		//如果是活动,把单场付费信息的活动写入 用户虚拟资产表
+		itemOrderVirtualAsset := new(order.CygxOrderVirtualAsset)
+		itemOrderVirtualAsset.OrderCode = orderDetail.OrderCode
+		itemOrderVirtualAsset.UserId = orderDetail.UserId
+		itemOrderVirtualAsset.Mobile = orderDetail.Mobile
+		itemOrderVirtualAsset.Email = orderDetail.Email
+		itemOrderVirtualAsset.CompanyId = orderDetail.CompanyId
+		itemOrderVirtualAsset.CompanyName = orderDetail.CompanyName
+		itemOrderVirtualAsset.RealName = orderDetail.RealName
+		itemOrderVirtualAsset.SellerName = orderDetail.SellerName
+		itemOrderVirtualAsset.Source = orderDetail.Source
+		itemOrderVirtualAsset.SourceId = orderDetail.SourceId
+		itemOrderVirtualAsset.CreateTime = time.Now()
+		itemOrderVirtualAsset.ModifyTime = time.Now()
+		e = order.RemoveCygxOrderVirtualAsset(itemOrderVirtualAsset, itemOrder)
+		if e != nil {
+			err = errors.New("AddCygxOrderVirtualAsset, Err: " + e.Error())
+			return
+		}
+	}
+	fmt.Println(orderDetail.Source)
+	return
+}

+ 94 - 0
services/user_permission.go

@@ -4,6 +4,7 @@ import (
 	"errors"
 	"fmt"
 	"hongze/hongze_web_mfyx/models"
+	"hongze/hongze_web_mfyx/models/order"
 	"hongze/hongze_web_mfyx/utils"
 	"strings"
 )
@@ -200,6 +201,64 @@ func GetUserRaiPermissionYanXuanInfo(user *models.WxUserItem) (hasPermission int
 	return
 }
 
+func GetUserApplyRecordCount(userId int) (applyCount int, err error) {
+	// 用户申请记录
+	applyCount, e := models.GetApplyRecordCount(userId)
+	if e != nil && e.Error() != utils.ErrNoRow() {
+		err = errors.New("获取用户申请信息失败, Err: " + e.Error())
+		return
+	}
+	return
+}
+
+// 是否需要上传名片
+func GetCygxUserBusinessCardCount(userId, companyId int) (isNeedBusinessCard bool) {
+	if companyId > 1 {
+		return
+	}
+	var err error
+	defer func() {
+		if err != nil {
+			fmt.Println(err)
+			go utils.SendAlarmMsg(fmt.Sprint("判断用户是否开通了个人研选权限失败 GetCygxGoodsList, err:", err.Error()), 2)
+		}
+	}()
+	businessCardCount, e := order.GetCygxUserBusinessCardCount(userId)
+	if e != nil && e.Error() != utils.ErrNoRow() {
+		err = errors.New("GetCygxUserBusinessCardCount, Err: " + e.Error())
+		return
+	}
+	if businessCardCount > 0 {
+		return
+	}
+	isNeedBusinessCard = true
+	return
+}
+
+// 获取客户是否有过历史申请记录
+func GetUserApplyRecordCountByCompanyIdPay(companyIdPay int) (isCompanyApply bool) {
+	var err error
+	defer func() {
+		if err != nil {
+			fmt.Println(err)
+			go utils.SendAlarmMsg(fmt.Sprint("判断用户是否开通了个人研选权限失败 GetCygxGoodsList, err:", err.Error()), 2)
+		}
+	}()
+	if companyIdPay >= 1 {
+		return
+	}
+	// 客户申请
+	applyCount, e := models.GetApplyRecordCountByCompanyIdPay(companyIdPay)
+	if e != nil && e.Error() != utils.ErrNoRow() {
+		err = errors.New("获取用户申请信息失败, Err: " + e.Error())
+		return
+	}
+	if applyCount > 0 {
+		isCompanyApply = true
+	}
+	return
+}
+
 // 获取用户权限状态  https://hzstatic.hzinsights.com/static/images/202402/20240205/LpE6dspJCLzfQoCoE8SFMDiLuxXk.png(状态码说明)
 func GetUserPermissionCode(userId, companyId int) (permission int, err error) {
 	// 用户申请记录
@@ -297,3 +356,38 @@ func GetUserDetailPermissionCode(userId, companyId int) (permission int, err err
 	fmt.Println("permission", permission)
 	return
 }
+
+// 获取权益销售姓名
+func GetSellerName(user *models.WxUserItem) (sellerName string, sellerId int) {
+	var err error
+	defer func() {
+		if err != nil {
+			fmt.Println(err)
+			go utils.SendAlarmMsg(fmt.Sprint("获取权益销售姓名失败 GetSellerName, err:", err.Error()), 2)
+		}
+	}()
+	companyId := user.CompanyId
+	//潜在客户没有销售
+	if user.CompanyId <= 1 {
+		return
+	}
+	//权益客户
+	raiCount, e := models.GetCompanyProductCount(companyId, utils.COMPANY_PRODUCT_RAI_ID)
+	if e != nil {
+		err = errors.New("GetCompanyProductCount, Err: " + e.Error())
+		return
+	}
+	//仅开通FICC的客户不展示销售姓名
+	if raiCount == 0 {
+		return
+	}
+	sealldetail, e := models.GetRaiSellerByCompanyId(companyId)
+	if e != nil {
+		err = errors.New("GetRaiSellerByCompanyId, Err: " + e.Error())
+		return
+	}
+	sellerName = sealldetail.RealName
+	sellerId = sealldetail.AdminId
+	return
+
+}

+ 46 - 0
services/user_yanxuan_permission.go

@@ -4,7 +4,9 @@ import (
 	"errors"
 	"fmt"
 	"hongze/hongze_web_mfyx/models"
+	"hongze/hongze_web_mfyx/models/order"
 	"hongze/hongze_web_mfyx/utils"
+	"time"
 )
 
 // 判断用户是否开通了个人研选权限
@@ -24,3 +26,47 @@ func GetMfyxUserPermissionTotal(userId int) (toatal int) {
 	}
 	return
 }
+
+// 判断用户是否持有阅读卡
+func GetCygxOrderUserCardTotal(mobile string) (total int) {
+	var err error
+	defer func() {
+		if err != nil {
+			fmt.Println(err)
+			go utils.SendAlarmMsg(fmt.Sprint("判断用户是否持有阅读卡失败 GetCygxOrderUserCardTotal mobile", mobile, ",err:", err.Error()), 2)
+		}
+	}()
+	var condition string
+	var pars []interface{}
+	condition += ` AND mobile  =   ?  AND is_suspend  = 0  AND  start_date < ? AND  end_date > ? `
+	pars = append(pars, mobile, time.Now(), time.Now())
+
+	total, e := order.GetCygxOrderUserCardCount(condition, pars)
+	if e != nil {
+		err = errors.New("GetCygxUserYanxuanPermissionCountByUserId, Err: " + e.Error())
+		return
+	}
+	return
+}
+
+// 判断用户是购买了单场付费活动
+func GetCygxOrderVirtualAssetdCountTotal(mobile string, activityId int) (total int) {
+	var err error
+	defer func() {
+		if err != nil {
+			fmt.Println(err)
+			go utils.SendAlarmMsg(fmt.Sprint("判断用户是购买了单场付费活动失败 GetCygxOrderUserCardTotal mobile", mobile, "activityId:", activityId, ",err:", err.Error()), 2)
+		}
+	}()
+	var condition string
+	var pars []interface{}
+	condition += ` AND mobile  =   ?  AND source  = 'activity'  AND  source_id =  ? `
+	pars = append(pars, mobile, activityId)
+
+	total, e := order.GetCygxOrderVirtualAssetdCount(condition, pars)
+	if e != nil {
+		err = errors.New("GetCygxOrderVirtualAssetdCount, Err: " + e.Error())
+		return
+	}
+	return
+}

+ 148 - 0
services/wx_pay.go

@@ -0,0 +1,148 @@
+package services
+
+import (
+	"context"
+	"encoding/json"
+	"errors"
+	"fmt"
+	"github.com/wechatpay-apiv3/wechatpay-go/core"
+	"github.com/wechatpay-apiv3/wechatpay-go/core/option"
+	"github.com/wechatpay-apiv3/wechatpay-go/services/payments/jsapi"
+	payUtils "github.com/wechatpay-apiv3/wechatpay-go/utils"
+	"hongze/hongze_web_mfyx/models"
+	"hongze/hongze_web_mfyx/models/order"
+	"hongze/hongze_web_mfyx/utils"
+	"log"
+	"time"
+)
+
+const (
+	MchPKFileName              = "./utils/cert/apiclient_key.pem"
+	Mchid                      = "1624495680"
+	MchCertificateSerialNumber = "5ED2719CFAE5205763034AD80BF4B8A33533C418"
+	MchAPIv3Key                = "W1tbnzQrzQ7yRRNuQCIHjis8dgdasKVX"
+)
+
+// 微信商户建立连接
+func getWechatClient() (context.Context, *core.Client, error) {
+	// 使用 utils 提供的函数从本地文件中加载商户私钥,商户私钥会用来生成请求的签名
+	mchPrivateKey, err := payUtils.LoadPrivateKeyWithPath(MchPKFileName)
+	if err != nil {
+		log.Print("load merchant private key error")
+		return nil, nil, err
+	}
+	ctx := context.Background()
+	// 使用商户私钥等初始化 client,并使它具有自动定时获取微信支付平台证书的能力
+	opts := []core.ClientOption{
+		option.WithWechatPayAutoAuthCipher(Mchid, MchCertificateSerialNumber, mchPrivateKey, MchAPIv3Key),
+	}
+	client, err := core.NewClient(ctx, opts...)
+	if err != nil {
+		log.Printf("new wechat pay client err:%s", err)
+		return nil, nil, err
+	}
+	return ctx, client, nil
+}
+
+// 生成预支付交易单
+func ExampleJsapiApiServicePrepay(orderDetail *order.CygxOrder, unionId string) (JsapiApiResp order.PrepayWithRequestPaymentResponse, err error) {
+	//var err error
+	defer func() {
+		if err != nil {
+			fmt.Println(err)
+			go utils.SendAlarmMsg(fmt.Sprint("生成预支付交易单失败 ExampleJsapiApiServicePrepay, err:", err.Error(), "unionId:", unionId), 2)
+		}
+	}()
+
+	userRecord, e := models.GetUserRecordByUnionId(unionId)
+	if e != nil && e.Error() != utils.ErrNoRow() {
+		err = errors.New("GetUserRecordByUnionId, Err: " + e.Error())
+		return
+	}
+	ctx, client, err := getWechatClient()
+	if err != nil {
+		log.Printf("getWechatClientt err:%s", err)
+		return
+	}
+	svc := jsapi.JsapiApiService{Client: client}
+	// 得到prepay_id,以及调起支付所需的参数和签名
+	resp, _, err := svc.PrepayWithRequestPayment(ctx,
+		jsapi.PrepayRequest{
+			Appid:       core.String(utils.WxAppId),
+			Mchid:       core.String(Mchid),
+			Description: core.String(orderDetail.SourceTitle),
+			OutTradeNo:  core.String(orderDetail.OrderCode),
+			Attach:      core.String(""),
+			NotifyUrl:   core.String(utils.WxPayJsapiNotifyUrl),
+			Amount: &jsapi.Amount{
+				Total: core.Int64(int64(orderDetail.OrderMoney * 100)), // 分
+			},
+			Payer: &jsapi.Payer{
+				Openid: core.String(userRecord.OpenId),
+			},
+		},
+	)
+	JsapiApiResp.PrepayId = *resp.PrepayId
+	JsapiApiResp.Appid = *resp.Appid
+	JsapiApiResp.TimeStamp = *resp.TimeStamp
+	JsapiApiResp.NonceStr = *resp.NonceStr
+	JsapiApiResp.Package = *resp.Package
+	JsapiApiResp.SignType = *resp.SignType
+	JsapiApiResp.PaySign = *resp.PaySign
+	return
+}
+
+type WechatPayCallback struct {
+	MchID          string    `json:"mchid"`
+	AppID          string    `json:"appid"`
+	OutTradeNo     string    `json:"out_trade_no"`
+	TransactionID  string    `json:"transaction_id"`
+	TradeType      string    `json:"trade_type"`
+	TradeState     string    `json:"trade_state"`
+	TradeStateDesc string    `json:"trade_state_desc"`
+	BankType       string    `json:"bank_type"`
+	Attach         string    `json:"attach"`
+	SuccessTime    time.Time `json:"success_time"`
+	Payer          struct {
+		OpenID string `json:"openid"`
+	} `json:"payer"`
+	Amount struct {
+		Total         int    `json:"total"`
+		PayerTotal    int    `json:"payer_total"`
+		Currency      string `json:"currency"`
+		PayerCurrency string `json:"payer_currency"`
+	} `json:"amount"`
+}
+
+// 微信支付回调内容解密
+func WxDecodeNotify(body []byte) (wechatPayCallback *WechatPayCallback) {
+	var err error
+	defer func() {
+		if err != nil {
+			fmt.Println(err)
+			go utils.SendAlarmMsg(fmt.Sprint("微信支付回调内容解密失败 WxDecodeNotify, err:", err.Error()), 2)
+		}
+	}()
+
+	var prepaymap map[string]interface{}
+	_ = json.Unmarshal(body, &prepaymap)
+
+	var prepaymap2 = prepaymap["resource"].(map[string]interface{})
+	nonce := prepaymap2["nonce"].(string)
+	associatedData := prepaymap2["associated_data"].(string)
+	ciphertext := prepaymap2["ciphertext"].(string)
+
+	tx, e := payUtils.DecryptAES256GCM(MchAPIv3Key, associatedData, nonce, ciphertext)
+	if e != nil {
+		log.Println(err)
+		return
+	}
+	if e != nil {
+		err = errors.New("DecryptAES256GCM, Err: " + e.Error())
+		return
+	}
+	var datamap *WechatPayCallback
+	_ = json.Unmarshal([]byte(tx), &datamap)
+	wechatPayCallback = datamap
+	return
+}

+ 22 - 0
utils/common.go

@@ -20,6 +20,7 @@ import (
 	"strconv"
 	"strings"
 	"time"
+	"unicode"
 )
 
 // 随机数种子
@@ -844,3 +845,24 @@ func StrDateToDate(strTime string) time.Time {
 	resultTime, _ := time.ParseInLocation(timeLayout, strTime, loc)
 	return resultTime
 }
+
+func GetOrdernum() string {
+	now := time.Now().UnixNano()
+	// 生成4位随机数
+	rand.Seed(now)
+	randomPart := rand.Intn(10000)
+	// 拼接订单号
+	orderSn := "OD" + time.Now().Format(FormatDateTimeUnSpace) + fmt.Sprintf("%04d", randomPart)
+	return orderSn
+}
+
+// 获取字符串中的阿拉伯数字,并返回字符串
+func GetArabicNumbers(str string) string {
+	var numbers []rune
+	for _, char := range str {
+		if unicode.IsDigit(char) {
+			numbers = append(numbers, char)
+		}
+	}
+	return string(numbers)
+}

+ 4 - 1
utils/config.go

@@ -54,7 +54,8 @@ var (
 // 模板消息推送
 var (
 	SendWxTemplateMsgUrl string
-	WxPlatform           = 11 //注册平台,1:日度点评公众号,2:管理后台,3:pc端网站,4:查研观向小程序 ,11:买方研选网页版
+	WxPlatform           = 11   //注册平台,1:日度点评公众号,2:管理后台,3:pc端网站,4:查研观向小程序 ,11:买方研选网页版
+	WxPayJsapiNotifyUrl  string //微信小程序支付下单回调接口
 )
 
 func init() {
@@ -115,6 +116,7 @@ func init() {
 		IndexName = "cygx_article_v03_23"
 		IndexNameComprehensive = "cygx_comprehensive"
 		ActSendMsgMobile = "15618524605"
+		WxPayJsapiNotifyUrl = "https://mfyx.hzinsights.com/api/wechat/wxpay/notify"
 		SendWxTemplateMsgUrl = "http://127.0.0.1:8086/v1/wechat/send_template_msg"
 	} else {
 		WxPublicAppId = "wx9b5d7291e581233a"                                          //弘则投研公众号 开发者ID(AppID)
@@ -132,6 +134,7 @@ func init() {
 		IndexName = "cygx_article_v1"
 		IndexNameComprehensive = "cygx_comprehensive_test"
 		ActSendMsgMobile = "17634786714"
+		WxPayJsapiNotifyUrl = "https://testmfyx.hzinsights.com/api/wechat/wxpay/notify"
 		SendWxTemplateMsgUrl = "http://127.0.0.1:8086/v1/wechat/send_template_msg"
 	}
 	HeadimgurlDefault = "https://hongze.oss-cn-shanghai.aliyuncs.com/static/images/202202/20220225/XFBBOUmDC5AXkfxnHiuqKpPtoofH.png"

+ 4 - 1
utils/constants.go

@@ -29,7 +29,8 @@ const (
 	CHART_INFO_HTTP_URL                 = "https://vmp.hzinsights.com/v2/charts/"
 	DISCLAIMERS                         = "本文为用户投稿,用户在平台中发表的所有资料、言论等仅代表个人观点,与本平台立场无关,不对您构成任何投资建议。本平台对文中陈述、观点判断保持中立,不对所包含内容及数据的真实性、准确性、可靠性或完整性提供任何明示或暗示的保证。请读者仅作参考,并请自行承担全部责任。"
 	DISCLAIMERS_PRODUCT_INTERIOR string = "<pstyle=\"text-align: center;\">免责声明</p><p>本报告仅供弘则弥道(上海)投资咨询有限公司正式签约的机构客户使用,不会因接收人/接收机构收到本报告而将其视为客户。本报告根据国际和行业通行的准则,以合法渠道获得这些信息,尽可能保证可靠、准确和完整,但并不保证报告所述信息的准确性和完整性,也不保证本报告所包含的信息或建议在本报告发出后不会发生任何变更。本报告中所提供的信息仅供参考。报告中的内容不对投资者做出的最终操作建议做任何的担保,也没有任何形式的分享投资收益或者分担投资损失的书面或口头承诺。不作为客户在投资、法律、会计或税务等方面的最终操作建议,也不作为道义的、责任的和法律的依据或者凭证,无论是否已经明示或者暗示。在任何情况下,本公司不对客户/接收人/接收机构因使用报告中内容所引致的一切损失负责任,客户/接收人/接收机构需自行承担全部风险。</p><p><br/></p>" // 产品内测免责声明
-	REGISTER_PLATFORM                   = 6                                                                                                                                                                                                                                                                                                                                                                                                                            //  来源 1小程序,2:网页 6:买方研选网页版
+	REGISTER_PLATFORM                   = 6
+	IS_SHOW_WX_PAY                      = true // 是否展示微信支付//  来源 1小程序,2:网页 6:买方研选网页版
 )
 
 // 手机号,电子邮箱正则
@@ -295,6 +296,8 @@ const (
 	LABEL_ICO_4 string = "https://hzstatic.hzinsights.com/cygx_web/config/zhuanlan.png"                 // 专栏
 	LABEL_ICO_5 string = "https://hzstatic.hzinsights.com/cygx_web/config/jiyao.png"                    // 纪要
 	LABEL_ICO_6 string = "https://hzstatic.hzinsights.com/cygx_web/config/maifangshalong.png"           // 买方沙龙
+	LABEL_ICO_7 string = "https://hzstatic.hzinsights.com/mfyx/config/rika.png"                         // 日卡图标
+	LABEL_ICO_8 string = "https://hzstatic.hzinsights.com/mfyx/config/yueka.png"                        // 月卡图标
 )
 
 const (