Parcourir la source

Merge branch 'master' of http://8.136.199.33:3000/hongze/hongze_cygx into mfyx_wx_tmp_1.1

xingzai il y a 10 mois
Parent
commit
3064430212

+ 4 - 4
controllers/activity_special.go

@@ -250,8 +250,8 @@ func (this *ActivitySpecialCoAntroller) SpecialTripAdd() {
 			itemBill.ChartPermissionId = activityInfo.ChartPermissionId
 			itemBill.ChartPermissionName = activityInfo.ChartPermissionName
 
-			if activityInfo.ChartPermissionName == utils.CE_LUE_NAME || activityInfo.ChartPermissionName == utils.GU_SHOU_NAME {
-				//如果是策略、固收行业,把代扣行业信息放入流水表,取消报名的时候,返点使用
+			if utils.InArrayByStr(utils.ACTIVITY_SPECIAL_TRIP_PERMISSION_NAME_OTHER, activityInfo.ChartPermissionName) {
+				//如果是策略、固收、周期行业,把代扣行业信息放入流水表,取消报名的时候,返点使用
 				maxChartPermissionId, maxChartPermissionName, err := services.GetSpecialBillMaxChartPermissionId(user)
 				if err != nil {
 					br.Msg = "操作失败"
@@ -478,8 +478,8 @@ func (this *ActivitySpecialCoAntroller) Tripcancel() {
 	itemBill.ChartPermissionName = activityInfo.ChartPermissionName
 	resultTime := utils.StrTimeToTime(activityInfo.ActivityTime)
 
-	if activityInfo.ChartPermissionName == utils.CE_LUE_NAME || activityInfo.ChartPermissionName == utils.GU_SHOU_NAME {
-		//如果是策略、固收行业,把代扣行业信息放入流水表,取消报名的时候,返点使用
+	if utils.InArrayByStr(utils.ACTIVITY_SPECIAL_TRIP_PERMISSION_NAME_OTHER, activityInfo.ChartPermissionName) {
+		//如果是策略、固收、周期行业,把代扣行业信息放入流水表,取消报名的时候,返点使用
 		lastTripBill, err := models.GetCygxActivitySpecialTripBillLastDetialByActivityId(activityInfo.ActivityId, user.UserId)
 		if err != nil {
 			br.Msg = "操作失败"

+ 6 - 2
controllers/chart_permission.go

@@ -73,6 +73,10 @@ func (this *ChartPermissionAuthController) Detail() {
 		if v.ChartPermissionId == utils.GU_SHOU_ID_CHART {
 			continue
 		}
+		//周期不进行展示
+		if v.PermissionName == utils.ZHOU_QI_NAME {
+			continue
+		}
 		if userType == 1 {
 			if v.PermissionName != "研选" {
 				resp.List = append(resp.List, v)
@@ -215,7 +219,7 @@ func (this *ChartPermissionAuthController) StrategyDetail() {
 		return
 	}
 	resp := new(models.ReportMappingHomeResp)
-	if chartPermissionId != utils.GU_SHOU_ID_CHART {
+	if chartPermissionId != utils.GU_SHOU_ID_CHART && chartPermissionId != utils.ZHOU_QI_ID {
 		if cf.ConfigValue == "1" || user.CompanyId == utils.HZ_COMPANY_ID {
 			item := new(models.ReportMappingHome)
 			item.CategoryId = utils.TIME_LINE_ID
@@ -354,7 +358,7 @@ func (this *ChartPermissionAuthController) Noyx() {
 		return
 	}
 	var condition string
-	condition += ` AND permission_name IN ('医药','消费','科技','智造','策略','固收') `
+	condition += ` AND permission_name IN ('医药','消费','科技','智造','策略','固收','周期') `
 	list, err := models.GetChartPermissionReportAll(condition)
 	if err != nil {
 		br.Msg = "获取信息失败"

+ 1 - 1
controllers/tag.go

@@ -72,7 +72,7 @@ func (this *TagController) TagCustomizeList() {
 	}
 
 	//var condition string
-	condition = ` AND permission_name IN ('医药','消费','科技','智造','策略','固收') `
+	condition = ` AND permission_name IN ('医药','消费','科技','智造','策略','固收','周期') `
 	listPermission, err := models.GetChartPermissionReportAll(condition)
 	if err != nil {
 		br.Msg = "获取信息失败"

+ 21 - 0
controllers/yanxuan_special.go

@@ -100,6 +100,7 @@ func (this *YanxuanSpecialController) List() {
 		//}
 		//v.Content, _ = services.GetReportContentTextSubNew(v.Content)
 		v.Content = services.AnnotationHtml(v.Content)
+		v.Content = strings.Replace(v.Content, " <br> <br>", "", -1)
 		if v.DocUrl != "" {
 			var docs []models.Doc
 			err := json.Unmarshal([]byte(v.DocUrl), &docs)
@@ -264,6 +265,26 @@ func (this *YanxuanSpecialController) Detail() {
 		}
 	}
 
+	//校验研选专栏权限,以及无权限的时候的对应状态码
+	havePower, err := services.GetYanxuanSpecialDetailUserPower(sysUser)
+	if err != nil {
+		br.Msg = "获取信息失败"
+		br.ErrMsg = "校验用户权限失败,Err:" + err.Error()
+		return
+	}
+	var hasPermission int
+	if havePower {
+		hasPermission = 1
+	} else {
+		hasPermission, err = services.GetUserDetailPermissionCode(sysUser.UserId, sysUser.CompanyId)
+		if err != nil {
+			br.Msg = "获取信息失败"
+			br.ErrMsg = "获取用户权限状态失败,Err:" + err.Error()
+			return
+		}
+	}
+	resp.HasPermission = hasPermission
+
 	br.Data = resp
 	br.Ret = 200
 	br.Success = true

+ 1 - 0
go.mod

@@ -17,6 +17,7 @@ require (
 	github.com/rdlucklib/rdluck_tools v1.0.3
 	github.com/satori/go.uuid v1.2.0 // indirect
 	github.com/tealeg/xlsx v1.0.5
+	github.com/wechatpay-apiv3/wechatpay-go v0.2.18 // indirect
 	golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd
 	golang.org/x/sys v0.6.0 // indirect
 	golang.org/x/time v0.0.0-20220411224347-583f2d630306 // indirect

+ 10 - 0
go.sum

@@ -9,6 +9,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=
@@ -390,6 +391,8 @@ github.com/streadway/amqp v0.0.0-20190827072141-edfb9018d271/go.mod h1:AZpEONHx3
 github.com/streadway/handy v0.0.0-20190108123426-d5acb3125c2a/go.mod h1:qNTQ5P5JnDBl6z3cMAg/SywNDC5ABu5ApDIw6lUbRmI=
 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=
@@ -397,6 +400,9 @@ github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5
 github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
 github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY=
 github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
+github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
+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/tealeg/xlsx v1.0.5 h1:+f8oFmvY8Gw1iUXzPk+kz+4GpbDZPK1FhPiQRd+ypgE=
@@ -405,6 +411,8 @@ github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1
 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=
@@ -634,6 +642,8 @@ gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
 gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
 gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo=
 gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
+gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
+gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
 honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
 honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
 honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=

+ 7 - 0
models/activity_points_company.go

@@ -40,3 +40,10 @@ func GetCygxActivityPointsCompanyCountByCompanyId(companyId int) (count int, err
 	err = o.Raw(sqlCount, companyId).QueryRow(&count)
 	return
 }
+
+// 添加
+func AddCygxActivityPointsCompany(item *CygxActivityPointsCompany) (err error) {
+	o := orm.NewOrm()
+	_, err = o.Insert(item)
+	return
+}

+ 2 - 1
models/chart_permission.go

@@ -72,7 +72,8 @@ func GetChartPermissionById(chartPermissionId int) (item *ChartPermission, err e
 
 func GetChartPermissionActivity() (items []*ActivityChartPermission, err error) {
 	o := orm.NewOrmUsingDB("weekly_report")
-	sql := `SELECT * FROM chart_permission WHERE chart_permission_id IN (19,20,21,22,23,31,53) ORDER BY sort ASC `
+	//sql := `SELECT * FROM chart_permission WHERE chart_permission_id IN (19,20,21,22,23,31,53) ORDER BY sort ASC `
+	sql := `SELECT * FROM chart_permission WHERE product_id=2 AND is_report=1 AND permission_type!=2   AND permission_name IN ('医药','消费','科技','智造','策略','固收','研选订阅','周期') ORDER BY sort ASC  `
 	_, err = o.Raw(sql).QueryRows(&items)
 	return
 }

+ 14 - 0
models/company/company_product.go

@@ -65,3 +65,17 @@ func GetCompanyProductByCompanyIdAndProductId(companyId, productId int) (item *C
 	err = o.Raw(sql, companyId, productId).QueryRow(&item)
 	return
 }
+
+func GetCompanyProductCount(companyId, productId int) (count int, err error) {
+	sql := ` SELECT COUNT(1) AS count FROM  company_product WHERE company_id = ? AND product_id = ? `
+	o := orm.NewOrmUsingDB("weekly_report")
+	err = o.Raw(sql, companyId, productId).QueryRow(&count)
+	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
+}

+ 16 - 0
models/db.go

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

+ 188 - 0
models/order/order.go

@@ -0,0 +1,188 @@
+package order
+
+import (
+	"fmt"
+	"github.com/beego/beego/v2/client/orm"
+	"time"
+)
+
+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 CygxOrder struct {
+	OrderId          int       `orm:"column(order_id);pk";comment:"订单id"`
+	OrderCode        string    `comment:"订单编号"`
+	OutTradeNo       string    `comment:"【商户订单号】 商户系统内部订单号"`
+	OutTradeCode     string    `comment:"外部交易号"`
+	PaymentType      int       `comment:"支付类型。取值范围:1微信支付,2支付宝支付。"`
+	TradeType        string    `comment:"交易类型,枚举值:JSAPI:公众号支付 、 NATIVE:扫码支付 、 App:App支付 、 MICROPAY:付款码支付 、 MWEB:H5支付 、 FACEPAY:刷脸支付"`
+	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 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    // 管理员姓名
+}
+
+func GetCygxOrderList(condition string, pars []interface{}, startSize, pageSize int) (items []*CygxOrder, 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 GetCygxOrderDetailList(condition string, pars []interface{}) (items []*CygxOrder, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT *
+			FROM
+			cygx_order
+			WHERE 1 = 1 ` + condition
+	_, err = o.Raw(sql, pars).QueryRows(&items)
+	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 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 GetCygxOrderDetailByOutTradeNo(outTradeNo string) (item *CygxOrder, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT * FROM cygx_order WHERE out_trade_no = ? `
+	err = o.Raw(sql, outTradeNo).QueryRow(&item)
+	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
+}

+ 258 - 0
models/order/order_user_card.go

@@ -0,0 +1,258 @@
+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)
+
+	switch itemOrder.TradeType {
+	case "JSAPI":
+		itemOrderAction.Action = "公众号支付"
+	case "NATIVE":
+		itemOrderAction.Action = "扫码支付"
+	case "App":
+		itemOrderAction.Action = "App支付"
+	case "MICROPAY":
+		itemOrderAction.Action = "付款码支付"
+	case "MWEB":
+		itemOrderAction.Action = "H5支付"
+	case "FACEPAY":
+		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
+	updateParams["TradeType"] = itemOrder.TradeType
+	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
+}

+ 171 - 0
models/order/order_virtual_asset.go

@@ -0,0 +1,171 @@
+package order
+
+//用户虚拟资产表
+
+import (
+	"fmt"
+	"github.com/beego/beego/v2/client/orm"
+	"hongze/hongze_cygx/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)
+
+	switch itemOrder.TradeType {
+	case "JSAPI":
+		itemOrderAction.Action = "公众号支付"
+	case "NATIVE":
+		itemOrderAction.Action = "扫码支付"
+	case "App":
+		itemOrderAction.Action = "App支付"
+	case "MICROPAY":
+		itemOrderAction.Action = "付款码支付"
+	case "MWEB":
+		itemOrderAction.Action = "H5支付"
+	case "FACEPAY":
+		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
+	updateParams["TradeType"] = itemOrder.TradeType
+	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
+}

+ 2 - 2
models/send_company_user.go

@@ -136,7 +136,7 @@ func GetSendCompanyPermissionDataList(condition string, pars []interface{}) (ite
 				1 = 1
 				AND cp.STATUS IN ( '正式', '试用', '永续' )
 				AND c.enabled = 1
-				AND c.chart_permission_name IN ( '医药', '消费', '科技', '智造', '策略', '研选扣点包', '专家', '路演服务','固收' ) ` + condition + ` GROUP BY c.permission_name, cp.company_id `
+				AND c.chart_permission_name IN ( '医药', '消费', '科技', '智造', '策略', '研选扣点包', '专家', '路演服务','固收','周期' ) ` + condition + ` GROUP BY c.permission_name, cp.company_id `
 	_, err = o.Raw(sql, pars).QueryRows(&items)
 	return
 }
@@ -156,7 +156,7 @@ func GetSendCompanyPermissionDataListNoChekcStatus(condition string, pars []inte
 			WHERE
 				1 = 1
 				AND cp.STATUS  NOT  IN ( '正式', '试用', '永续' )
-				AND c.chart_permission_name IN ( '医药', '消费', '科技', '智造', '策略', '研选扣点包', '专家', '路演服务' ,'固收' ) ` + condition + ` GROUP BY c.permission_name, cp.company_id `
+				AND c.chart_permission_name IN ( '医药', '消费', '科技', '智造', '策略', '研选扣点包', '专家', '路演服务' ,'固收','周期' ) ` + condition + ` GROUP BY c.permission_name, cp.company_id `
 	_, err = o.Raw(sql, pars).QueryRows(&items)
 	return
 }

+ 39 - 5
services/activity_points.go

@@ -195,6 +195,11 @@ func YanXuanActivityPointsBillSignupAddReduce(log models.YanXuanActivityPointsRe
 	activityId := log.ActivityId
 	userId := log.UserId
 
+	activtyPayTotal := GetCygxOrderVirtualAssetdCountTotal(userId, activityId) // 单场付费活动不处理扣点明细
+	if activtyPayTotal > 0 {
+		return
+	}
+
 	//获取活动是否扣点以及扣点规则明细
 	activityPointsSetDetail, e := models.GetCygxActivityPointsSetDetail(activityId)
 	if e != nil && e.Error() != utils.ErrNoRow() {
@@ -218,13 +223,38 @@ func YanXuanActivityPointsBillSignupAddReduce(log models.YanXuanActivityPointsRe
 		err = errors.New("GetWxUserItemByUserId" + e.Error())
 		return
 	}
-
-	// 获取用户所在公司剩余的点
-	companyPointsNum, e := models.GetCompanyPoints(user.CompanyId)
-	if e != nil && e.Error() != utils.ErrNoRow() {
-		err = errors.New("GetCompanyPoints, Err: " + e.Error())
+	companyId := user.CompanyId
+	//判断公司是不是满足扣点情况,如果是后台超管手动给试用客户报名,就写入一条点数初始化数据
+	total, e := models.GetCygxActivityPointsCompanyCountByCompanyId(companyId)
+	if e != nil {
+		err = errors.New("GetCygxActivityPointsCompanyCountByCompanyId, Err: " + e.Error())
 		return
 	}
+	var companyPointsNum float64
+	if total == 0 {
+		companyPointsNum = 0
+		itemPointsCompany := new(models.CygxActivityPointsCompany)
+
+		itemPointsCompany.CompanyId = companyId
+		itemPointsCompany.CompanyName = user.CompanyName
+		itemPointsCompany.CreateTime = time.Now()
+		itemPointsCompany.ModifyTime = time.Now()
+
+		e = models.AddCygxActivityPointsCompany(itemPointsCompany)
+		if e != nil {
+			err = errors.New("AddCygxActivityPointsCompany, Err: " + e.Error())
+			return
+		}
+	} else {
+		// 获取用户所在公司剩余的点
+		companyPointsNum, e = models.GetCompanyPoints(user.CompanyId)
+		if e != nil && e.Error() != utils.ErrNoRow() {
+			err = errors.New("GetCompanyPoints, Err: " + e.Error())
+			return
+		}
+
+	}
+
 	//获取需要添加的流水信息
 	var items []*models.CygxActivityPointsBill
 	item := new(models.CygxActivityPointsBill)
@@ -270,6 +300,10 @@ func YanXuanActivityPointsBillSignupCancelReduce(log models.YanXuanActivityPoint
 	activityId := log.ActivityId
 	userId := log.UserId
 
+	activtyPayTotal := GetCygxOrderVirtualAssetdCountTotal(userId, activityId) // 单场付费活动不处理扣点明细
+	if activtyPayTotal > 0 {
+		return
+	}
 	//获取活动是否扣点以及扣点规则明细
 	activityPointsSetDetail, e := models.GetCygxActivityPointsSetDetail(activityId)
 	if e != nil && e.Error() != utils.ErrNoRow() {

+ 10 - 7
services/activity_special_trip.go

@@ -189,7 +189,8 @@ func CheckTripRemainingtimesBycompany(user *models.WxUserItem, activityInfo *mod
 	}
 
 	//判断是不是策略行业的活动,策略的任何一个行业有剩余点数都能参加
-	if chartPermissionName == utils.CE_LUE_NAME {
+	//if chartPermissionName == utils.CE_LUE_NAME {
+	if utils.InArrayByStr(utils.ACTIVITY_SPECIAL_TRIP_PERMISSION_NAME_OTHER, activityInfo.ChartPermissionName) {
 		return
 	} else {
 		for _, v := range activitySpecialPermissionPointsList {
@@ -226,7 +227,7 @@ func GetSpecialBillMaxChartPermissionId(user *models.WxUserItem) (maxChartPermis
 func DeductTripRemainingtimesByUser(user *models.WxUserItem, activityInfo *models.CygxActivitySpecialDetail) (err error) {
 	msgTemplate := "您的专项调研次数已用完,如仍想参加,请与您的对口销售商议"
 	companyId := user.CompanyId
-	chartPermissionName := activityInfo.ChartPermissionName
+	//chartPermissionName := activityInfo.ChartPermissionName
 
 	companyProduct, e := company.GetCompanyProductByCompanyIdAndProductId(companyId, utils.COMPANY_PRODUCT_RAI_ID)
 	if e != nil {
@@ -269,8 +270,9 @@ func DeductTripRemainingtimesByUser(user *models.WxUserItem, activityInfo *model
 		condition = " AND  company_id  = ?  AND points  > 0   ORDER BY  points DESC LIMIT 1   "
 		pars = append(pars, companyId)
 
-		//判断是不是策略、固收行业的活动,如果不是策略就获取对应行业的点数 ,策略的任何一个行业有剩余点数都能参加
-		if chartPermissionName != utils.CE_LUE_NAME && chartPermissionName != utils.GU_SHOU_NAME {
+		//判断是不是策略、固收、周期行业的活动,如果不是策略就获取对应行业的点数 ,策略的任何一个行业有剩余点数都能参加
+		//if chartPermissionName != utils.CE_LUE_NAME && chartPermissionName != utils.GU_SHOU_NAME {
+		if !utils.InArrayByStr(utils.ACTIVITY_SPECIAL_TRIP_PERMISSION_NAME_OTHER, activityInfo.ChartPermissionName) {
 			pars = make([]interface{}, 0)
 			condition = " AND  company_id  = ?  AND ( chart_permission_id  = ? OR  chart_permission_id =0 )    AND points  > 0   ORDER BY  points DESC LIMIT 1   "
 			pars = append(pars, companyId, activityInfo.ChartPermissionId)
@@ -302,14 +304,15 @@ func DeductTripRemainingtimesByUser(user *models.WxUserItem, activityInfo *model
 // RebateTripRemainingtimesByUser 返点用户专项调研剩余次数
 func RebateTripRemainingtimesByUser(user *models.WxUserItem, activityInfo *models.CygxActivitySpecialDetail) (err error) {
 	companyId := user.CompanyId
-	chartPermissionName := activityInfo.ChartPermissionName
+	//chartPermissionName := activityInfo.ChartPermissionName
 	var condition string
 	var pars []interface{}
 	condition = " AND  company_id  = ?    ORDER BY  points DESC LIMIT 1   "
 	pars = append(pars, companyId)
 
-	//判断是不是策略、固收行业的活动,如果不是策略就获取对应行业的点数 ,策略的任何一个行业有剩余点数都能参加
-	if chartPermissionName != utils.CE_LUE_NAME && chartPermissionName != utils.GU_SHOU_NAME {
+	//判断是不是策略、固收、周期行业的活动,如果不是策略就获取对应行业的点数 ,策略的任何一个行业有剩余点数都能参加
+	//if chartPermissionName != utils.CE_LUE_NAME && chartPermissionName != utils.GU_SHOU_NAME {
+	if !utils.InArrayByStr(utils.ACTIVITY_SPECIAL_TRIP_PERMISSION_NAME_OTHER, activityInfo.ChartPermissionName) {
 		pars = make([]interface{}, 0)
 		condition = " AND  company_id  = ? AND  (chart_permission_id  = ?   OR chart_permission_id = 0 )    LIMIT 1   "
 		pars = append(pars, companyId, activityInfo.ChartPermissionId)

+ 3 - 5
services/article.go

@@ -730,7 +730,7 @@ func UpdateArticleByRedis() (err error) {
 //	//for i := 8648; i < 9004; i++ {
 //	//	HandleArticleListByApi(9552)
 //	//}
-//	HandleArticleListByApi(10875)
+//	HandleArticleListByApi(10914)
 //	//UpdateArticleResourceData(9551)
 //}
 
@@ -738,8 +738,7 @@ func UpdateArticleByRedis() (err error) {
 func HandleArticleListByApi(artcleId int) (err error) {
 	defer func() {
 		if err != nil {
-			go utils.SendAlarmMsg("处理同步策略平台数据失败"+"GetArticleListByApi ErrMsg:"+err.Error()+"artcleId:"+strconv.Itoa(artcleId), 2)
-			go utils.SendEmail(utils.APPNAME+"【"+utils.RunMode+"】"+"失败提醒", "GetArticleListByApi ErrMsg:"+err.Error()+"artcleId:"+strconv.Itoa(artcleId), utils.EmailSendToUsers)
+			go utils.SendAlarmMsg("处理同步过来的文章失败"+"HandleArticleListByApi ErrMsg:"+err.Error()+"artcleId:"+strconv.Itoa(artcleId), 2)
 		}
 	}()
 	var clueApiUrl string
@@ -1268,8 +1267,7 @@ func DoArticleOnenIdWxTemplateMsg(articleId int) (err error) {
 	var msg string
 	defer func() {
 		if err != nil {
-			go utils.SendAlarmMsg("处理同步策略平台数据失败"+"GetArticleListByApi ErrMsg:"+err.Error(), 2)
-			go utils.SendEmail(utils.APPNAME+"【"+utils.RunMode+"】"+"失败提醒", "GetArticleListByApi ErrMsg:"+err.Error(), utils.EmailSendToUsers)
+			go utils.SendAlarmMsg("过滤策略平台报告,研选报告重复推送,以及权限勾选的推送失败 DoArticleOnenIdWxTemplateMsg  ErrMsg:"+err.Error(), 2)
 			fmt.Println(err)
 		}
 		if msg != "" {

+ 55 - 0
services/cygx_yanxuan_special.go

@@ -5,6 +5,7 @@ import (
 	"errors"
 	"fmt"
 	"hongze/hongze_cygx/models"
+	"hongze/hongze_cygx/models/company"
 	"hongze/hongze_cygx/utils"
 	"strconv"
 	"strings"
@@ -506,3 +507,57 @@ func UpdateYanxuanSpecialAuthoMomentsImg(cont context.Context) (err error) {
 	}
 	return
 }
+
+// GetYanxuanSpecialDetailUserPower 处理用户查看研选专栏详情的权限
+func GetYanxuanSpecialDetailUserPower(user *models.WxUserItem) (havePower bool, err error) {
+	//研选专栏是否需要校验权限
+	detailChart, e := models.GetConfigByCode("yanxuan_special_power_check")
+	if e != nil {
+		err = errors.New("GetConfigByCode, Err: " + e.Error())
+		return
+	}
+	//如果没有开启校验,直接返回true
+	if detailChart.ConfigValue == "0" {
+		havePower = true
+		return
+	}
+	userId := user.UserId
+	companyId := user.CompanyId
+	//判断用户是否开通了个人研选权限
+	mfyxUserPermissionTotal := GetMfyxUserPermissionTotal(userId)
+
+	if mfyxUserPermissionTotal == 1 {
+		havePower = true
+		return
+	}
+
+	//是否是权益客户
+	raiCount, e := company.GetCompanyProductCount(companyId, utils.COMPANY_PRODUCT_RAI_ID)
+	if e != nil {
+		err = errors.New("GetCompanyProductCount, Err: " + e.Error())
+		return
+	}
+	if raiCount == 0 {
+		return
+	}
+
+	productDetail, e := company.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
+}

+ 2 - 11
services/cygx_yanxuan_special_company.go

@@ -77,16 +77,7 @@ func AddSpecialRecord(user *models.WxUserItem, specialId, stopTime int) (err err
 	}()
 	var sellerName string
 	//获取销售信息
-	sellerItem, e := models.GetSellerByCompanyIdCheckFicc(user.CompanyId, 2)
-	if e != nil && e.Error() != utils.ErrNoRow() {
-		err = errors.New("GetSellerByCompanyIdCheckFicc, Err: " + e.Error())
-		return
-	}
-	if sellerItem == nil {
-		return
-	}
-	sellerName = sellerItem.RealName
-
+	sellerName, _ = GetSellerName(user)
 	if stopTime >= 3 {
 
 		//判断一个用户是否阅读过 某一篇研选专栏
@@ -168,7 +159,7 @@ func AddSpecialRecord(user *models.WxUserItem, specialId, stopTime int) (err err
 	itemLog.RegisterPlatform = utils.REGISTER_PLATFORM
 	itemLog.YanxuanSpecialId = specialId
 	itemLog.StopTime = stopTime
-	_, e = models.AddCygxYanxuanSpecialRecordLog(itemLog) // 添加历史记录
+	_, e := models.AddCygxYanxuanSpecialRecordLog(itemLog) // 添加历史记录
 	if e != nil {
 		err = errors.New("AddCygxYanxuanSpecialRecordLog, Err: " + e.Error())
 		return

+ 496 - 0
services/order.go

@@ -0,0 +1,496 @@
+package services
+
+import (
+	"context"
+	"encoding/json"
+	"errors"
+	"fmt"
+	"hongze/hongze_cygx/models"
+	"hongze/hongze_cygx/models/order"
+	"hongze/hongze_cygx/utils"
+	"time"
+)
+
+// CancelCygxOrder 关闭到期个人用户研选权限
+func CancelCygxOrder(cont context.Context) (err error) {
+	defer func() {
+		if err != nil {
+			fmt.Println(err)
+			go utils.SendAlarmMsg(fmt.Sprint("自动取消十分钟之内没有付款的的订单 CancelCygxOrder ,err:", err.Error()), 2)
+		}
+	}()
+	var condition string
+	var pars []interface{}
+	endTime := time.Now().Add(-10 * time.Minute)
+	condition = ` AND order_status = 1   AND create_time < ?   `
+	pars = append(pars, endTime)
+	orderList, e := order.GetCygxOrderList(condition, pars, 0, 999)
+	if e != nil && e.Error() != utils.ErrNoRow() {
+		err = errors.New("GetCygxOrderList, Err: " + e.Error())
+		return
+	}
+	fmt.Println(len(orderList))
+	if len(orderList) == 0 {
+		return
+	}
+	//订单量不大,先这么写吧
+	for _, v := range orderList {
+		fmt.Println(v.OrderCode)
+		e = order.CancelCygxOrder(v)
+		if e != nil && e.Error() != utils.ErrNoRow() {
+			err = errors.New("CancelCygxOrder, Err: " + e.Error())
+			return
+		}
+	}
+	return
+}
+
+//func init() {
+//	HandleOrderRefundHandleask()
+//}
+
+// GetQueryOrderByOutTradeNoTask 定时任务主动获取订单支付状态
+func GetQueryOrderByOutTradeNoTask(cont context.Context) (err error) {
+	//func GetQueryOrderByOutTradeNoTask() (err error) {
+	defer func() {
+		if err != nil {
+			fmt.Println(err)
+			go utils.SendAlarmMsg(fmt.Sprint("自动取消十分钟之内没有付款的的订单 CancelCygxOrder ,err:", err.Error()), 2)
+		}
+	}()
+	var condition string
+	var pars []interface{}
+	endTime := time.Now().Add(-10 * time.Minute)
+	condition = ` AND order_status = 1   AND create_time >  ?   ` //获取十分钟之内待支付的订单
+	pars = append(pars, endTime)
+	orderList, e := order.GetCygxOrderList(condition, pars, 0, 999)
+	if e != nil && e.Error() != utils.ErrNoRow() {
+		err = errors.New("GetCygxOrderList, Err: " + e.Error())
+		return
+	}
+
+	if len(orderList) == 0 {
+		return
+	}
+	//订单量不大,先这么写吧
+	for _, v := range orderList {
+		tradeState, statusCode, itemResp := GetQueryOrderByOutTradeNo(v.OutTradeNo)
+		if tradeState == "SUCCESS" && statusCode == 200 {
+			go HandleOrderHandle(itemResp)
+		}
+	}
+	return
+}
+
+// 手动处理支付订单回调
+func HandleOrderHandle(itemCallback *Transaction) {
+	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.GetCygxOrderDetailByOutTradeNo(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("支付失败,  outTradeNo: " + outTradeNo)
+			return
+		}
+	}
+	//修改过状态的不再二次处理
+	if orderDetail.OrderStatus == 2 {
+		return
+	}
+
+	itemOrder := new(order.CygxOrder)
+	itemOrder.OrderCode = orderDetail.OrderCode
+	itemOrder.PayTime = itemCallback.SuccessTime
+	itemOrder.PayMoney = float64(float64(itemCallback.Amount.PayerTotal) / 100) // 金额分转换处理
+	itemOrder.OrderStatus = 2
+	itemOrder.OutTradeCode = itemCallback.TransactionId
+	itemOrder.TradeType = itemCallback.TradeType
+
+	//文章处理逻辑  	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
+		}
+	}
+	if orderDetail.Source == utils.CYGX_OBJ_ACTIVITY {
+		go AddActivitySignupByWechatPay(orderDetail.SourceId, orderDetail.UserId) //微信付款成功自动添加报名
+	}
+	go CancelOtherOrder(orderDetail) //付款成功之后自动取消其他相同的订单
+
+	return
+}
+
+// 添加操作记录
+func AddCygxOrderPayment(itemCallback *Transaction) {
+	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 HandleOrderRefundHandleask(cont context.Context) (err error) {
+	//func HandleOrderRefundHandleask() (err error) {
+	defer func() {
+		if err != nil {
+			fmt.Println(err)
+			go utils.SendAlarmMsg(fmt.Sprint("自动取消十分钟之内没有付款的的订单 CancelCygxOrder ,err:", err.Error()), 2)
+		}
+	}()
+	var condition string
+	var pars []interface{}
+	//endTime := time.Now().Add(-10 * time.Minute)
+	condition = ` AND order_status = 4    ` //获取十分钟之内待支付的订单
+	//pars = append(pars, endTime)
+	orderList, e := order.GetCygxOrderList(condition, pars, 0, 999)
+	if e != nil && e.Error() != utils.ErrNoRow() {
+		err = errors.New("GetCygxOrderList, Err: " + e.Error())
+		return
+	}
+	fmt.Println(len(orderList))
+	if len(orderList) == 0 {
+		return
+	}
+	//订单量不大,先这么写吧
+	for _, v := range orderList {
+		tradeState, statusCode, itemResp := GetQueryOrderByOutTradeNo(v.OutTradeNo)
+		if tradeState == "REFUND" && statusCode == 200 {
+			go HandleOrderRefundHandle(itemResp)
+		}
+	}
+	return
+}
+
+// 处理退款订单回调
+func HandleOrderRefundHandle(itemCallback *Transaction) {
+	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 = orderDetail.OrderCode
+	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
+		}
+	}
+	//if orderDetail.Source == utils.CYGX_OBJ_ACTIVITY {
+	//	go CancelActivitySignupByWechatPay(orderDetail.SourceId, orderDetail.UserId) //微信退款成功自动取消报名
+	//}
+	return
+}
+
+// 微信付款成功自动添加报名
+func AddActivitySignupByWechatPay(activityId, userId int) {
+	var err error
+	defer func() {
+		if err != nil {
+			fmt.Println(err)
+			go utils.SendAlarmMsg(fmt.Sprint("微信付款成功自动添加报名失败 AddActivitySignupByWechatPay, err:", err.Error(), "activityId:", activityId, "userId:", userId), 2)
+		}
+	}()
+	activityInfo, e := models.GetAddActivityInfoById(activityId)
+	if e != nil {
+		err = errors.New("GetAddActivityInfoById, Err: " + e.Error())
+		return
+	}
+	var userPointsNum float64
+	if activityInfo.IsResearchPoints {
+		//获取活动对用户要扣的点
+		userPointsNum, e = models.GetCygxActivityPointsSetUserNum(activityInfo.ActivityId)
+		if e != nil {
+			err = errors.New("GetCygxActivityPointsSetUserNum, Err: " + e.Error())
+			return
+		}
+	}
+
+	//专家线下沙龙与买方线下交流、扣点的公司调研电话会自动报名
+	if activityInfo.ActivityTypeId != 5 && activityInfo.ActivityTypeId != 8 && userPointsNum == 0 {
+		return
+	}
+
+	user, e := models.GetWxUserItemByUserId(userId)
+	if e != nil {
+		err = errors.New("GetWxUserItemByUserId, Err: " + e.Error())
+		return
+	}
+	var sellerName string
+	sellerName, e = models.GetCompanySellerName(user.CompanyId)
+	if e != nil {
+		err = errors.New("GetCompanySellerName, Err: " + e.Error())
+		return
+	}
+
+	item := new(models.CygxActivitySignup)
+	totalMySuccess, e := models.GetActivitySignupCount(userId, activityId)
+	if e != nil {
+		err = errors.New("AddActivitySignup, Err: " + e.Error())
+		return
+	}
+	if totalMySuccess > 0 { //已报名这个活动
+		return
+	}
+	item.UserId = userId
+	item.RealName = user.RealName
+	item.SellerName = sellerName
+	item.ActivityId = activityId
+	item.CreateTime = time.Now()
+	item.Mobile = user.Mobile
+	item.Email = user.Email
+	item.CompanyId = user.CompanyId
+	item.CompanyName = user.CompanyName
+	item.SignupType = 3
+	item.FailType = 0
+	item.DoFailType = 0
+	item.OutboundMobile = user.Mobile
+	if user.OutboundMobile != "" {
+		item.OutboundMobile = user.OutboundMobile
+		if user.OutboundCountryCode == "" {
+			item.CountryCode = "86"
+		} else {
+			item.CountryCode = user.OutboundCountryCode
+		}
+	} else {
+		item.OutboundMobile = user.Mobile
+		if user.CountryCode == "" {
+			item.CountryCode = "86"
+		} else {
+			item.CountryCode = user.CountryCode
+		}
+	}
+	_, e = models.AddActivitySignup(item)
+	if e != nil {
+		err = errors.New("AddActivitySignup, Err: " + e.Error())
+		return
+	}
+	fmt.Println("报名成功")
+	go ActivityUserRemind(user, activityInfo, 4)
+
+	return
+}
+
+// 微信退款成功自动取消报名
+func CancelActivitySignupByWechatPay(activityId, userId int) {
+	var err error
+	defer func() {
+		if err != nil {
+			fmt.Println(err)
+			go utils.SendAlarmMsg(fmt.Sprint("微信退款成功自动取消报名失败 CancelActivitySignupByWechatPay, err:", err.Error(), "activityId:", activityId, "userId:", userId), 2)
+		}
+	}()
+	activityInfo, e := models.GetAddActivityInfoById(activityId)
+	if e != nil {
+		err = errors.New("GetAddActivityInfoById, Err: " + e.Error())
+		return
+	}
+
+	user, e := models.GetWxUserItemByUserId(userId)
+	if e != nil {
+		err = errors.New("GetWxUserItemByUserId, Err: " + e.Error())
+		return
+	}
+
+	item := new(models.CygxActivitySignup)
+	item.UserId = userId
+	item.ActivityId = activityId
+	item.CreateTime = time.Now()
+	item.Mobile = user.Mobile
+	item.Email = user.Email
+	item.CompanyId = user.CompanyId
+	item.CompanyName = user.CompanyName
+	resp := new(models.SignupStatus)
+	resp.ActivityId = activityId
+	_, e = models.CancelActivitySignup(item)
+	if e != nil {
+		err = errors.New("CancelActivitySignup, Err: " + e.Error())
+		return
+	}
+
+	// 如果是买方研选下的专家沙龙,同时推给内容组四人
+	if activityInfo.ActivityTypeId == 5 {
+		go SendActivitieCancelSignTemplateMsg(user, activityInfo)
+	}
+	go SendResearchActivitiesTemplateMsg(user, activityInfo, "取消报名") //公司线下调研活动客户报名后给建会人,所属销售推送模板信息
+
+	return
+}
+
+// 付款成功之后自动取消其他相同的订单
+func CancelOtherOrder(item *order.CygxOrder) {
+	var err error
+	defer func() {
+		if err != nil {
+			fmt.Println(err)
+			go utils.SendAlarmMsg(fmt.Sprint("付款成功之后自动取消其他相同的订单失败 CancelOtherOrder, err:", err.Error(), "order_id:", item.OrderId), 2)
+		}
+	}()
+
+	var condition string
+	var pars []interface{}
+	userId := item.UserId
+
+	//判断是日卡月卡还是单场付费活动
+	if item.GoodsId == 1 || item.GoodsId == 2 {
+		condition += ` AND user_id  = ?  AND  goods_id IN (1,2)  AND  order_id  != ? AND  order_status = 1  `
+		pars = append(pars, userId, item.OrderId)
+	} else {
+		condition += ` AND user_id  = ?  AND  source_id = ?   AND  source = ?  AND  order_id  != ? AND  order_status = 1  `
+		pars = append(pars, userId, item.SourceId, item.Source, item.OrderId)
+	}
+
+	listOrder, e := order.GetCygxOrderDetailList(condition, pars) // 这里就一条数据
+	if e != nil && e.Error() != utils.ErrNoRow() {
+		err = errors.New("GetCygxOrderDetailList, Err: " + e.Error())
+		return
+	}
+	if len(listOrder) == 0 {
+		err = nil
+		return
+	}
+	for _, v := range listOrder {
+		e = order.CancelCygxOrder(v)
+		if e != nil {
+			return
+		}
+	}
+	return
+}

+ 3 - 0
services/product_interior.go

@@ -250,6 +250,9 @@ func GetCygxProductInteriorHistoryListPvMap(productInteriorIs []int) (mapPv map[
 
 // 用户产品内测阅读,模板消息推送
 func ProductInteriorHistoryUserRmind(user *models.WxUserItem, productInteriorId int) (err error) {
+	if user.UserId == 0 {
+		return
+	}
 	//30秒内阅读同一篇报告不做重复推送
 	key := "CYGX_" + utils.CYGX_OBJ_PRODUCTINTERIOR + "_READ" + strconv.Itoa(productInteriorId) + "_" + strconv.Itoa(user.UserId)
 	if utils.Rc.IsExist(key) {

+ 2 - 2
services/sms.go

@@ -29,7 +29,7 @@ func SendSmsCode(mobile, vcode string) bool {
 		fmt.Printf("接口返回result字段是:\r\n%v", netReturn["result"])
 		flag = true
 	} else {
-		go utils.SendAlarmMsg("短信验证码发送失败err:"+err.Error()+" result"+string(result)+"mobile:"+mobile, 1)
+		go utils.SendAlarmMsg("短信验证码发送失败 result"+string(result)+"mobile:"+mobile, 1)
 		//go utils.SendEmail("短信验证码发送失败", " result"+string(result), utils.EmailSendToUsers)
 		flag = false
 	}
@@ -82,7 +82,7 @@ func SendSmsCodeGj(mobile, vcode, areaNum string) bool {
 		fmt.Printf("接口返回result字段是:\r\n%v", netReturn["result"])
 		flag = true
 	} else {
-		go utils.SendAlarmMsg("国际短信验证码发送失败err:"+err.Error()+" result"+string(result)+"mobile:"+mobile, 1)
+		go utils.SendAlarmMsg("国际短信验证码发送失败 result"+string(result)+"mobile:"+mobile, 1)
 		//go utils.SendEmail("短信验证码发送失败", " result"+string(result), utils.EmailSendToUsers)
 		flag = false
 	}

+ 2 - 2
services/tag.go

@@ -257,8 +257,8 @@ func GetConditionInitByTagIds(tagIds string, chartPermissionId int) (conditionIn
 	case 4: // 语音问答
 		conditionInit = "   AND source = '" + utils.CYGX_OBJ_ASKSERIEVIDEO + "'"
 
-	case 5: //固定标签【跟踪】,包含以下系列:医药-趋势观察 ,科技-产业跟踪 ,智造-产业跟踪 ,消费-月度调研
-		condition = " AND sub_category_name  IN ('趋势观察','产业跟踪','月度调研')  AND category_name IN ('医药行业','智造行业','消费行业','科技行业')  AND publish_status = 1 "
+	case 5: //固定标签【跟踪】,包含以下系列:医药-趋势观察 ,科技-产业跟踪 ,智造-产业跟踪 ,消费-月度调研 ,周期-(周度观点,产业跟踪)
+		condition = " AND sub_category_name  IN ('趋势观察','产业跟踪','月度调研')  AND category_name IN ('医药行业','智造行业','消费行业','科技行业') OR  ( sub_category_name IN  ('周度观点','产业跟踪')  AND  category_name  = '周期' )  AND publish_status = 1 "
 		pars = make([]interface{}, 0)
 		articleList, e := models.GetArticleList(condition, pars)
 		if e != nil {

+ 9 - 0
services/task.go

@@ -142,6 +142,15 @@ func Task() {
 
 		sendMfyxActivityBeginMsg := task.NewTask("sendMfyxActivityBeginMsg", "0 */5 6-23 * * *", SendMfyxActivityBeginMsg) //会议前60分钟的提醒
 		task.AddTask("sendMfyxActivityBeginMsg", sendMfyxActivityBeginMsg)
+
+		//cancelCygxOrder := task.NewTask("CancelCygxOrder", "0 */1 * * * *", CancelCygxOrder)
+		//task.AddTask("十分钟内未付款的订单自动取消", cancelCygxOrder) //十分钟内未付款的订单自动取消
+		//
+		//getQueryOrderByOutTradeNoTask := task.NewTask("getQueryOrderByOutTradeNoTask", "0 */1 * * * *", GetQueryOrderByOutTradeNoTask)
+		//task.AddTask("定时任务主动获取订单支付状态", getQueryOrderByOutTradeNoTask) //定时任务主动获取订单支付状态
+		//
+		//handleOrderRefundHandleask := task.NewTask("HandleOrderRefundHandleask", "0 */1 * * * *", HandleOrderRefundHandleask)
+		//task.AddTask("定时任务处理退款回调", handleOrderRefundHandleask) //定时任务处理退款回调
 	}
 
 	//if utils.RunMode != "release" {

+ 75 - 0
services/user_permission.go

@@ -2,7 +2,9 @@ package services
 
 import (
 	"errors"
+	"fmt"
 	"hongze/hongze_cygx/models"
+	"hongze/hongze_cygx/models/company"
 	"hongze/hongze_cygx/utils"
 	"strings"
 )
@@ -115,3 +117,76 @@ func GetUserRaiPermissionYanXuanInfo(user *models.WxUserItem) (hasPermission int
 	}
 	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
+}
+
+// 用户详情页获取用户权限状态  https://hzstatic.hzinsights.com/static/images/202402/20240205/LpE6dspJCLzfQoCoE8SFMDiLuxXk.png(状态码说明)这一期先不改2024-05-24。
+func GetUserDetailPermissionCode(userId, companyId int) (permission int, err error) {
+	// 用户申请记录
+	applyCount, e := models.GetApplyRecordCount(userId)
+	if e != nil && e.Error() != utils.ErrNoRow() {
+		err = errors.New("获取用户申请信息失败, Err: " + e.Error())
+		return
+	}
+	if companyId == 1 {
+		// 潜在用户
+		if applyCount > 0 {
+			permission = 5
+		} else {
+			permission = 4
+		}
+	} else {
+		//权益客户
+		raiCount, e := company.GetCompanyProductCount(companyId, utils.COMPANY_PRODUCT_RAI_ID)
+		if e != nil {
+			err = errors.New("获取用户申请信息失败, Err: " + e.Error())
+			return
+		}
+		if raiCount == 1 {
+			if applyCount > 0 {
+				permission = 5
+			} else {
+				permission = 3
+			}
+		} else {
+			if applyCount > 0 {
+				permission = 5
+			} else {
+				permission = 2
+			}
+		}
+	}
+	return
+}

+ 23 - 0
services/user_yanxuan_permission.go

@@ -5,6 +5,7 @@ import (
 	"errors"
 	"fmt"
 	"hongze/hongze_cygx/models"
+	"hongze/hongze_cygx/models/order"
 	"hongze/hongze_cygx/utils"
 )
 
@@ -41,3 +42,25 @@ func UpdateCygxUserYanxuanPermissionToClose(cont context.Context) (err error) {
 	}
 	return
 }
+
+// 判断用户是购买了单场付费活动
+func GetCygxOrderVirtualAssetdCountTotal(userId, activityId int) (total int) {
+	var err error
+	defer func() {
+		if err != nil {
+			fmt.Println(err)
+			go utils.SendAlarmMsg(fmt.Sprint("判断用户是购买了单场付费活动失败 GetCygxOrderUserCardTotal userId:", userId, "activityId:", activityId, ",err:", err.Error()), 2)
+		}
+	}()
+	var condition string
+	var pars []interface{}
+	condition += ` AND user_id  =   ?  AND source  = 'activity'  AND  source_id =  ? `
+	pars = append(pars, userId, activityId)
+
+	total, e := order.GetCygxOrderVirtualAssetdCount(condition, pars)
+	if e != nil {
+		err = errors.New("GetCygxOrderVirtualAssetdCount, Err: " + e.Error())
+		return
+	}
+	return
+}

+ 165 - 0
services/wx_pay.go

@@ -0,0 +1,165 @@
+package services
+
+import (
+	"context"
+	"encoding/json"
+	"fmt"
+	"github.com/wechatpay-apiv3/wechatpay-go/core"
+	"github.com/wechatpay-apiv3/wechatpay-go/services/payments/jsapi"
+	"hongze/hongze_cygx/utils"
+	"time"
+)
+
+//const (
+//	MchPKFileName              = "../hongze_mfyx/utils/cert/apiclient_key.pem"
+//	Mchid                      = "1624495680"
+//	MchCertificateSerialNumber = "5ED2719CFAE5205763034AD80BF4B8A33533C418"
+//	MchAPIv3Key                = "W1tbnzQrzQ7yRRNuQCIHjis8dgdasKVX"
+//)
+
+//// 微信商户建立连接
+//func getWechatClient() (context.Context, *core.Client, error) {
+//	var err error
+//	defer func() {
+//		if err != nil {
+//			fmt.Println("err", err)
+//			go utils.SendAlarmMsg(fmt.Sprint("微信商户建立连接失败 getWechatClient, err:", err.Error()), 2)
+//		}
+//	}()
+//	// 使用 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 init() {
+//	GetQueryOrderByOutTradeNo("OD202404081631545174")
+//}
+
+// 根据订单号查询订单状态失败
+func GetQueryOrderByOutTradeNo(outTradeNo string) (tradeState string, statusCode int, itemResp *Transaction) {
+	var err error
+	defer func() {
+		if err != nil {
+			fmt.Println("err", err)
+			go utils.SendAlarmMsg(fmt.Sprint("根据订单号查询订单状态失败 GetQueryOrderByOutTradeNo, err:", err.Error(), "outTradeNo", outTradeNo), 2)
+		}
+	}()
+	//ctx, client, err := getWechatClient()
+	//if err != nil {
+	//	log.Printf("getWechatClientt err:%s", err)
+	//	return
+	//}
+	ctx := context.Background()
+	svc := jsapi.JsapiApiService{Client: utils.WechatCertClient}
+	resp, result, err := svc.QueryOrderByOutTradeNo(ctx,
+		jsapi.QueryOrderByOutTradeNoRequest{
+			OutTradeNo: core.String(outTradeNo),
+			Mchid:      core.String(utils.Mchid),
+		},
+	)
+	statusCode = result.Response.StatusCode
+	//fmt.Println(statusCode)
+	//订单状态码不存在直接返回
+	if statusCode == 404 {
+		err = nil
+		return
+	}
+	tradeState = *resp.TradeState
+	data, err := json.Marshal(resp)
+	if err != nil {
+		return
+	}
+	jsonstr := string(data)
+	//item := new(Transaction)
+	if err = json.Unmarshal([]byte(jsonstr), &itemResp); err != nil {
+		return
+	}
+	//itemResp = item
+	//fmt.Println(itemResp)
+	//fmt.Println(tradeState)
+	//fmt.Println(itemResp.TransactionId)
+	return
+}
+
+// Transaction
+type Transaction struct {
+	Amount          TransactionAmount `json:"amount,omitempty"`
+	Appid           string            `json:"appid,omitempty"`
+	Attach          string            `json:"attach,omitempty"`
+	BankType        string            `json:"bank_type,omitempty"`
+	Mchid           string            `json:"mchid,omitempty"`
+	OutTradeNo      string            `json:"out_trade_no,omitempty"`
+	Payer           TransactionPayer  `json:"payer,omitempty"`
+	PromotionDetail []PromotionDetail `json:"promotion_detail,omitempty"`
+	SuccessTime     time.Time         `json:"success_time,omitempty"`
+	TradeState      string            `json:"trade_state,omitempty"`
+	TradeStateDesc  string            `json:"trade_state_desc,omitempty"`
+	TradeType       string            `json:"trade_type,omitempty"`
+	TransactionId   string            `json:"transaction_id,omitempty"`
+}
+
+// TransactionAmount
+type TransactionAmount struct {
+	Currency      string `json:"currency,omitempty"`
+	PayerCurrency string `json:"payer_currency,omitempty"`
+	PayerTotal    int64  `json:"payer_total,omitempty"`
+	Total         int64  `json:"total,omitempty"`
+}
+
+// TransactionPayer
+type TransactionPayer struct {
+	Openid string `json:"openid,omitempty"`
+}
+
+// PromotionDetail
+type PromotionDetail struct {
+	// 券ID
+	CouponId *string `json:"coupon_id,omitempty"`
+	// 优惠名称
+	Name *string `json:"name,omitempty"`
+	// GLOBAL:全场代金券;SINGLE:单品优惠
+	Scope *string `json:"scope,omitempty"`
+	// CASH:充值;NOCASH:预充值。
+	Type *string `json:"type,omitempty"`
+	// 优惠券面额
+	Amount *int64 `json:"amount,omitempty"`
+	// 活动ID,批次ID
+	StockId *string `json:"stock_id,omitempty"`
+	// 单位为分
+	WechatpayContribute *int64 `json:"wechatpay_contribute,omitempty"`
+	// 单位为分
+	MerchantContribute *int64 `json:"merchant_contribute,omitempty"`
+	// 单位为分
+	OtherContribute *int64 `json:"other_contribute,omitempty"`
+	// CNY:人民币,境内商户号仅支持人民币。
+	Currency    *string                `json:"currency,omitempty"`
+	GoodsDetail []PromotionGoodsDetail `json:"goods_detail,omitempty"`
+}
+
+// PromotionGoodsDetail
+type PromotionGoodsDetail struct {
+	// 商品编码
+	GoodsId *string `json:"goods_id"`
+	// 商品数量
+	Quantity *int64 `json:"quantity"`
+	// 商品价格
+	UnitPrice *int64 `json:"unit_price"`
+	// 商品优惠金额
+	DiscountAmount *int64 `json:"discount_amount"`
+	// 商品备注
+	GoodsRemark *string `json:"goods_remark,omitempty"`
+}

+ 13 - 0
utils/config.go

@@ -99,6 +99,8 @@ var (
 	YiDongHuaWeiYunUrl        string //易董 华为云请求域名
 	YiDonggetOriginalLink     string //易董 短连接转为长链接
 	ShangHaiCrmApiLink        string //上海CRM用户同步api调用地址
+
+	ZHOU_QI_ID int // 行业周期的ID
 )
 
 // 模板消息推送
@@ -205,6 +207,7 @@ func init() {
 		ShangHaiCrmApiLink = "https://crm.hzinsights.com/"
 		SendWxTemplateMsgUrl = "http://127.0.0.1:8086/v1/wechat/send_template_msg"
 		SendWxCategoryTemplateMsgUrl = "http://127.0.0.1:8086/v1/wechat/send_category_template_msg"
+
 	} else {
 		WxAppId = "wxcc32b61f96720d2f"
 		WxAppSecret = "06894933fafb24dafead7eaae09c08e0"
@@ -291,6 +294,7 @@ func init() {
 
 	//易董开放api配置
 	YiDongApiConfig()
+	ChartPermissionId()
 }
 
 // YiDongApiConfig 易董开放api配置
@@ -310,6 +314,15 @@ func YiDongApiConfig() {
 	}
 }
 
+// 行业ID信息 易董开放api配置
+func ChartPermissionId() {
+	if RunMode == "release" {
+		ZHOU_QI_ID = 62
+	} else {
+		ZHOU_QI_ID = 138
+	}
+}
+
 //
 //YiDongZhengTongYunUrl     string //易董 证通云请求域名
 //YiDongZhengTongYunAppid   string //易董 证通云请求appid

+ 11 - 7
utils/constants.go

@@ -79,6 +79,7 @@ const (
 )
 
 const (
+	ZHOU_QI_NAME                     string = "周期"
 	CHART_PERMISSION_NAME_YANXUAN    string = "研选"
 	MAI_FANG_YAN_XUAN_NAME           string = "买方研选"
 	CHART_PERMISSION_NAME_MF_YANXUAN string = "研选订阅"
@@ -189,14 +190,15 @@ const (
 	WX_MSG_PATH_APPLY_DETAIL             = "pages-message/applyFor/applyFor?id="                          //潜在用户试用权限申请
 	WX_MSG_PATH_YX_SURVEY_DETAIL         = "pages-purchaser/survey/surveyDetail?surveyId="                //用户提交研选调研需求
 	WX_MSG_PATH_APPLY_COLLECTION_DETAIL  = "reportPages/bulletinDetail/bulletinDetail?id="                //精选看板申请详情页
-	WX_MSG_PATH_YX_SPECIAL_DETAIL        = "pages-purchaser/noteAndViewpoint/noteAndViewpoint?id="  //研选专栏详情
-	WX_MSG_PATH_YX_SPECIAL_ENABLE_DETAIL = "pages-purchaser/toExamine/toExamine?isMessage=模板&id="   //研选专栏审核详情页面
-	WX_MSG_PATH_YX_SPECIAL_CENTER        = "pages-purchaser/contentAllPage/contentAllPage?Status=4" //研选专栏内容中心
-	WX_MSG_PATH_YX_COMMENT_DETAIL        = "pages-activity/generationAsk/generationAsk?id="         //研选报告留言详情
-	WX_MSG_PATH_YX_ACTIVITY_DETAIL       = "pages-activity/activityDetail/activityDetail?id="       //研选活动详情
-	WX_MSG_PATH_YX_SIGNUP_DETAIL         = "pages-message/activityTemplate/activityTemplate?id="    //研选报名详情
-	WX_MSG_PATH_YX_ARTICLE_DETAIL        = "pages-user/reportDetail/reportDetail?id="               //研选纪要详情
+	WX_MSG_PATH_YX_SPECIAL_DETAIL        = "pages-purchaser/noteAndViewpoint/noteAndViewpoint?id="        //研选专栏详情
+	WX_MSG_PATH_YX_SPECIAL_ENABLE_DETAIL = "pages-purchaser/toExamine/toExamine?isMessage=模板&id="         //研选专栏审核详情页面
+	WX_MSG_PATH_YX_SPECIAL_CENTER        = "pages-purchaser/contentAllPage/contentAllPage?Status=4"       //研选专栏内容中心
+	WX_MSG_PATH_YX_COMMENT_DETAIL        = "pages-activity/generationAsk/generationAsk?id="               //研选报告留言详情
+	WX_MSG_PATH_YX_ACTIVITY_DETAIL       = "pages-activity/activityDetail/activityDetail?id="             //研选活动详情
+	WX_MSG_PATH_YX_SIGNUP_DETAIL         = "pages-message/activityTemplate/activityTemplate?id="          //研选报名详情
+	WX_MSG_PATH_YX_ARTICLE_DETAIL        = "pages-user/reportDetail/reportDetail?id="                     //研选纪要详情
 )
+
 //2:文章详情  https://web.hzinsights.com/material/info/8436  小程序路径:/pageMy/reportDetail/reportDetail?id=
 //3:活动详情  https://web.hzinsights.com/activity/detail/2701  小程序路径:/activityPages/activityDetail/activityDetail?id=
 //4:产业详情  https://web.hzinsights.com/indepth/info/20/79  小程序路径:/reportPages/IndustryReport/IndustryReport?id=
@@ -297,3 +299,5 @@ const (
 	COMPANY_STATUS_POTENTIAL = "潜在"
 	COMPANY_STATUS_CLOSE     = "关闭"
 )
+
+var ACTIVITY_SPECIAL_TRIP_PERMISSION_NAME_OTHER = []string{"策略", "固收", "周期"} //专项调研活动带扣点的行业

+ 49 - 0
utils/wechat_cert.go

@@ -0,0 +1,49 @@
+package utils
+
+import (
+	"context"
+	"fmt"
+	"github.com/beego/beego/v2/core/utils"
+	"github.com/wechatpay-apiv3/wechatpay-go/core"
+	"github.com/wechatpay-apiv3/wechatpay-go/core/option"
+	payUtils "github.com/wechatpay-apiv3/wechatpay-go/utils"
+)
+
+var WechatCertClient *core.Client
+
+const (
+	//MchPKFileName = "../hongze_mfyx/utils/cert/apiclient_key.pem"
+	MchPKFileName              = "/home/code/wechat_cert/cygx/apiclient_key.pem"
+	Mchid                      = "1624495680"
+	MchCertificateSerialNumber = "5ED2719CFAE5205763034AD80BF4B8A33533C418"
+	MchAPIv3Key                = "W1tbnzQrzQ7yRRNuQCIHjis8dgdasKVX"
+)
+
+// 微信商户建立连接
+func init() {
+	if !utils.FileExists(MchPKFileName) {
+		//fmt.Println("商户私钥文件不存在")
+		go SendAlarmMsg("微信商户链接失败 商户私钥文件不存在", 2)
+		return
+	}
+
+	// 使用 utils 提供的函数从本地文件中加载商户私钥,商户私钥会用来生成请求的签名
+	mchPrivateKey, err := payUtils.LoadPrivateKeyWithPath(MchPKFileName)
+	if err != nil {
+		fmt.Println(err)
+		go SendAlarmMsg("微信商户链接失败 LoadPrivateKeyWithPath"+err.Error(), 2)
+	}
+	ctx := context.Background()
+	// 使用商户私钥等初始化 client,并使它具有自动定时获取微信支付平台证书的能力
+	opts := []core.ClientOption{
+		option.WithWechatPayAutoAuthCipher(Mchid, MchCertificateSerialNumber, mchPrivateKey, MchAPIv3Key),
+	}
+
+	client, err := core.NewClient(ctx, opts...)
+	if err != nil {
+		fmt.Println(err)
+		go SendAlarmMsg("微信商户链接失败 NewClient"+err.Error(), 2)
+	}
+	WechatCertClient = client
+	return
+}