|
@@ -0,0 +1,311 @@
|
|
|
+package order
|
|
|
+
|
|
|
+import (
|
|
|
+ "encoding/json"
|
|
|
+ "errors"
|
|
|
+ "fmt"
|
|
|
+ "github.com/baiy/Cadmin-server-go/admin"
|
|
|
+ "go.mongodb.org/mongo-driver/bson"
|
|
|
+ "log"
|
|
|
+ "mongodb"
|
|
|
+ cm "qfw/util"
|
|
|
+ "strconv"
|
|
|
+ "strings"
|
|
|
+ "time"
|
|
|
+ "util"
|
|
|
+)
|
|
|
+
|
|
|
+func ServiceOpen(context *admin.Context) (interface{}, error) {
|
|
|
+ param := new(struct {
|
|
|
+ OrderCode string `form:"orderCode"`
|
|
|
+ StartTime int64 `form:"startTime"`
|
|
|
+ Phone string `form:"phone"`
|
|
|
+ })
|
|
|
+ err := context.Form(param)
|
|
|
+ if err != nil {
|
|
|
+ return nil, err
|
|
|
+ }
|
|
|
+ //查询订单
|
|
|
+ order := util.JysqlDB.FindOne("dataexport_order", map[string]interface{}{"order_code": param.OrderCode}, "id,order_status,user_phone,product_type,vip_type,vip_endtime,vip_starttime,filter", "")
|
|
|
+ if order == nil {
|
|
|
+ return nil, errors.New("为查询到订单信息")
|
|
|
+ }
|
|
|
+ var productType string
|
|
|
+ var (
|
|
|
+ userId string
|
|
|
+ userData map[string]interface{}
|
|
|
+ entId int
|
|
|
+ userPositionId string
|
|
|
+ )
|
|
|
+ productType = cm.ObjToString((*order)["product_type"])
|
|
|
+ if (*order)["user_phone"] != param.Phone { //开通权益手机号和创建订单手机号不一致
|
|
|
+ userId, userData = FindUserDataByPhone(param.Phone)
|
|
|
+ if userId == "" {
|
|
|
+ //没有用户需要新建用户
|
|
|
+ userId = SaveUserInfo(param.Phone)
|
|
|
+ }
|
|
|
+ if cm.IntAll((*order)["buy_subject"]) == 2 { //购买主体是企业,手机号改变,需要重新创建企业
|
|
|
+ entId, err, userPositionId = AutomaticallyCreatingEnt(cm.ObjToString((*order)["company_name"]), param.Phone, param.OrderCode, cm.IntAll((*order)["order_status"]), userId)
|
|
|
+ if err != nil {
|
|
|
+ log.Printf("AutomaticallyCreatingEnt 自动创建企业信息失败:code:%s,err:%s", cm.IntAll((*order)["order_status"]), err.Error())
|
|
|
+ return nil, err
|
|
|
+ }
|
|
|
+ userId = userPositionId
|
|
|
+ }
|
|
|
+ filterMap := map[string]interface{}{}
|
|
|
+ if err := json.Unmarshal([]byte(cm.ObjToString((*order)["filter"])), &filterMap); err != nil {
|
|
|
+ return nil, err
|
|
|
+ }
|
|
|
+ var set map[string]interface{}
|
|
|
+ if productType == "VIP订阅" { //手机号不一致,需要把新建订单填写的手机号的权益去掉
|
|
|
+ //手机号不一致,需要修改老用户上的订阅信息
|
|
|
+ set = map[string]interface{}{
|
|
|
+ "o_vipjy.i_trial": -1, //已激活试用
|
|
|
+ "o_vipjy.o_area": "", //设置地区
|
|
|
+ "o_vipjy.o_buyset": "", //购买内容 城市、省份、行业数量
|
|
|
+ "l_vip_starttime": time.Now().Unix(), //开始时间
|
|
|
+ "l_vip_endtime": time.Now().Unix(), //结束时间
|
|
|
+ "i_vip_status": 0, //1试用 2正式
|
|
|
+ "i_vip_expire_tip": 0, //消息提示初始化
|
|
|
+ "o_vipjy.a_buyerclass": []interface{}{}, //设置行业
|
|
|
+ }
|
|
|
+ } else if productType == "大会员" {
|
|
|
+ if strings.HasPrefix(cm.ObjToString((*order)["user_phone"]), "9") {
|
|
|
+ util.MQFW.Del("user", map[string]interface{}{"s_phone": cm.ObjToString((*order)["user_phone"])})
|
|
|
+ util.JysqlDB.Delete("user", map[string]interface{}{"user_id": cm.ObjToString((*order)["user_id"])})
|
|
|
+ } else if cm.IntAll((*order)["buy_subject"]) == 1 {
|
|
|
+ sets := map[string]interface{}{
|
|
|
+ "i_member_status": -cm.IntAll(filterMap["level"]),
|
|
|
+ "i_member_starttime": time.Now().Unix(),
|
|
|
+ "i_member_endtime": time.Now().Unix(),
|
|
|
+ "i_mainaccount": 1,
|
|
|
+ "i_pay_sub_num": 0,
|
|
|
+ "i_free_sub_num": 0,
|
|
|
+ }
|
|
|
+ set = map[string]interface{}{
|
|
|
+ "$set": sets,
|
|
|
+ "$unset": map[string]interface{}{ // 修改手机号时,被取消的原手机号也移除省份数量字段
|
|
|
+ "o_member_jy.i_areacount": "",
|
|
|
+ },
|
|
|
+ }
|
|
|
+ sql := "update bigmember_service_user set i_status = -1 where s_userid = ?"
|
|
|
+ util.JysqlDB.UpdateOrDeleteBySql(sql, (*order)["user_id"])
|
|
|
+ ClearBigVipUserPower(cm.ObjToString((*order)["user_id"]))
|
|
|
+ }
|
|
|
+ }
|
|
|
+ util.MQFW.UpdateById("user", cm.ObjToString((*order)["user_id"]), bson.M{
|
|
|
+ "$set": set,
|
|
|
+ })
|
|
|
+ util.JysqlDB.Update("dataexport_order", map[string]interface{}{"order_code": cm.ObjToString(param.OrderCode)}, map[string]interface{}{"user_phone": param.Phone, "user_id": userId})
|
|
|
+ }
|
|
|
+
|
|
|
+ if productType == "VIP订阅" {
|
|
|
+ if cm.IntAll(userData["i_vip_status"]) > 0 {
|
|
|
+ return nil, errors.New(fmt.Sprintf("手机号:%s已有vip订阅权限,无法开通权益!", param.Phone))
|
|
|
+ }
|
|
|
+ if cm.IntAll((*order)["vip_type"]) != 0 { //超级订阅购买
|
|
|
+ return nil, errors.New("此订单不是超级订阅新购订单")
|
|
|
+ }
|
|
|
+ filter := (*order)["filter"]
|
|
|
+ filterData := VipSimpleMsg{}
|
|
|
+ var vipStartTime, vipEndTime time.Time
|
|
|
+ if err := json.Unmarshal([]byte(filter.(string)), &filterData); err != nil {
|
|
|
+ return nil, err
|
|
|
+ }
|
|
|
+ vipStartTime, vipEndTime = GetStartAndEndTime(time.Unix(param.StartTime, 0).Format(cm.Date_Full_Layout), filterData.Cyclecount, filterData.Cycleunit)
|
|
|
+ //log.Println("截止时间:", vipStartTime, endTime)
|
|
|
+ //为用户开通超级订阅权限
|
|
|
+ //处理购买省份
|
|
|
+ areaCount := -1
|
|
|
+ buyArea := map[string]interface{}{}
|
|
|
+ if filterData.Area != nil || len(*filterData.Area) > 0 {
|
|
|
+ for k, _ := range *filterData.Area {
|
|
|
+ buyArea[k] = []interface{}{}
|
|
|
+ }
|
|
|
+ areaCount = len(buyArea)
|
|
|
+ }
|
|
|
+ //新购买简单详情
|
|
|
+ newBuySet := SubvipBuySet{
|
|
|
+ Upgrade: 1,
|
|
|
+ AreaCount: areaCount,
|
|
|
+ NewCitys: []int{},
|
|
|
+ BuyerclassCount: -1,
|
|
|
+ }
|
|
|
+ set := map[string]interface{}{
|
|
|
+ "o_vipjy.i_trial": -1, //已激活试用
|
|
|
+ "o_vipjy.o_area": buyArea, //设置地区
|
|
|
+ "o_vipjy.o_buyset": newBuySet, //购买内容 城市、省份、行业数量
|
|
|
+ "l_vip_starttime": vipStartTime.Unix(), //开始时间
|
|
|
+ "l_vip_endtime": vipEndTime.Unix(), //结束时间
|
|
|
+ "i_vip_status": 2, //1试用 2正式 -2 试用到期
|
|
|
+ "i_vip_expire_tip": 0, //消息提示初始化
|
|
|
+ "o_vipjy.a_buyerclass": []interface{}{}, //设置行业
|
|
|
+ }
|
|
|
+ if cm.IntAll((*order)["buy_subject"]) == 1 {
|
|
|
+ util.MQFW.UpdateById("user", userId, bson.M{
|
|
|
+ "$set": set,
|
|
|
+ })
|
|
|
+ ClearBigVipUserPower(userId)
|
|
|
+ } else {
|
|
|
+ UpdateRule(entId, map[string]interface{}{
|
|
|
+ "$set": set,
|
|
|
+ }, param.Phone)
|
|
|
+ ClearBigVipUserPower(userId)
|
|
|
+ }
|
|
|
+
|
|
|
+ } else if productType == "大会员" {
|
|
|
+ filterMap := map[string]interface{}{}
|
|
|
+ if err := json.Unmarshal([]byte(cm.ObjToString((*order)["filter"])), &filterMap); err != nil {
|
|
|
+ return nil, err
|
|
|
+ }
|
|
|
+ createType := cm.IntAll(filterMap["createType"])
|
|
|
+ if createType == 1 { //1-新建 2-补充 3-延期
|
|
|
+ bigStartTime := time.Unix(param.StartTime, 0)
|
|
|
+ bigEndTime := GetDATE(cm.IntAll(filterMap["cycle"]), cm.IntAll(filterMap["cycleType"]), param.StartTime)
|
|
|
+ if bigEndTime.Unix() > time.Now().Unix() {
|
|
|
+ return nil, errors.New("订单已失效")
|
|
|
+ }
|
|
|
+ status := cm.If(bigStartTime.Unix() > time.Now().Unix(), 0, 1)
|
|
|
+ err := NewBigOpenService(filterMap, userId, bigStartTime, bigEndTime, cm.IntAll(status), cm.IntAll((*order)["buy_count"]))
|
|
|
+ if err != nil {
|
|
|
+ return nil, errors.New(fmt.Sprintf("订单编号:%s,手机号:%s开通大会员权益失败", param.OrderCode, param.Phone))
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return map[string]interface{}{
|
|
|
+ "status": 1,
|
|
|
+ }, nil
|
|
|
+}
|
|
|
+
|
|
|
+func FindUserDataByPhone(phone string) (userId string, userData map[string]interface{}) {
|
|
|
+ userInfo, ok := util.MQFW.FindOne("user", map[string]interface{}{"s_phone": phone})
|
|
|
+ if ok && userInfo != nil && len(*userInfo) > 0 {
|
|
|
+ userId = mongodb.BsonIdToSId((*userInfo)["_id"])
|
|
|
+ userData = *userInfo
|
|
|
+ } else {
|
|
|
+ userInfo, ok = util.MQFW.FindOne("user", map[string]interface{}{"s_m_phone": phone})
|
|
|
+ if ok && userInfo != nil && len(*userInfo) > 0 {
|
|
|
+ userId = mongodb.BsonIdToSId((*userInfo)["_id"])
|
|
|
+ userData = *userInfo
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return userId, userData
|
|
|
+}
|
|
|
+
|
|
|
+func NewBigOpenService(filterMap map[string]interface{}, userId string, startDate, endDate time.Time, i_status, buyCount int) error {
|
|
|
+ serverMap := GetServerPid()
|
|
|
+ if buyCount-1 > 0 { //子账号开通权益
|
|
|
+ sets := map[string]interface{}{
|
|
|
+ "i_pay_sub_num": buyCount - 1,
|
|
|
+ "i_mainaccount": 1,
|
|
|
+ }
|
|
|
+ set := map[string]interface{}{
|
|
|
+ "$set": sets,
|
|
|
+ }
|
|
|
+ ok := util.MQFW.UpdateById("user", userId, set)
|
|
|
+ if !ok {
|
|
|
+ return errors.New("大会员子账号创建订单user表大会员状态更新失败")
|
|
|
+ //return errors.New("大会员子账号创建订单user表大会员状态更新失败")
|
|
|
+ } else {
|
|
|
+ sqls := "select * from bigmember_service_user where s_serviceid = ? and s_userid = ? and i_status != -1"
|
|
|
+ serverData := util.JysqlDB.SelectBySql(sqls, 2, userId)
|
|
|
+ if serverData != nil && len(*serverData) > 0 {
|
|
|
+ sql := "update bigmember_service_user set l_updatetime = ?,l_starttime = ?,l_endtime = ? where s_serviceid = ? and s_userid = ?"
|
|
|
+ status1 := util.JysqlDB.UpdateOrDeleteBySql(sql, cm.NowFormat(cm.Date_Full_Layout), cm.FormatDate(&startDate, cm.Date_Full_Layout), cm.FormatDate(&endDate, cm.Date_Full_Layout), 2, userId)
|
|
|
+ if status1 < 0 {
|
|
|
+ return errors.New("新建服务-更新服务表出错")
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ insert := map[string]interface{}{
|
|
|
+ "s_userid": userId,
|
|
|
+ "s_serviceid": 2,
|
|
|
+ "i_frequency": nil,
|
|
|
+ "l_starttime": cm.FormatDate(&startDate, cm.Date_Full_Layout),
|
|
|
+ "l_endtime": cm.FormatDate(&endDate, cm.Date_Full_Layout),
|
|
|
+ "i_status": i_status,
|
|
|
+ "l_createtime": cm.NowFormat(cm.Date_Full_Layout),
|
|
|
+ "l_updatetime": cm.NowFormat(cm.Date_Full_Layout),
|
|
|
+ }
|
|
|
+ order_id := util.JysqlDB.Insert("bigmember_service_user", insert)
|
|
|
+ if order_id > 0 {
|
|
|
+ log.Println("用户服务表插入成功", userId)
|
|
|
+ } else {
|
|
|
+ //return errors.New("用户服务表插入失败")
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ for _, s := range strings.Split(cm.ObjToString(filterMap["serversId"]), ",") {
|
|
|
+ serverId, _ := strconv.Atoi(s)
|
|
|
+ mainId := serverId
|
|
|
+ if serverMap[serverId] != 0 {
|
|
|
+ serverId = serverMap[serverId]
|
|
|
+ }
|
|
|
+ serverData := util.JysqlDB.FindOne("bigmember_service", map[string]interface{}{"id": mainId}, "", "")
|
|
|
+ frequency := 0
|
|
|
+ if serverData != nil && len(*serverData) > 0 {
|
|
|
+ if serverId == 11 || serverId == 15 {
|
|
|
+ if serverId == 15 {
|
|
|
+ if cm.IntAll(filterMap["cycle"]) >= 12 {
|
|
|
+ frequency = (cm.IntAll(filterMap["cycle"]) / 12 * cm.IntAll((*serverData)["s_count_year"])) + (cm.IntAll(filterMap["cycle"]) % 12 * cm.IntAll((*serverData)["s_count_month"]))
|
|
|
+ } else {
|
|
|
+ frequency = cm.IntAll(filterMap["cycle"]) * cm.IntAll((*serverData)["s_count_month"])
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ frequency = cm.IntAll(filterMap["cycle"]) * cm.IntAll((*serverData)["s_count_month"])
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ frequency = cm.IntAll((*serverData)["s_count_month"])
|
|
|
+ }
|
|
|
+ }
|
|
|
+ sqls := "select * from bigmember_service_user where s_serviceid = ? and s_userid = ? and i_status != -1"
|
|
|
+ serverDatas := util.JysqlDB.SelectBySql(sqls, serverId, userId)
|
|
|
+ if serverDatas != nil && len(*serverDatas) > 0 {
|
|
|
+ //i_status := cm.If(dateType == 1, 0, 1)
|
|
|
+ sql := "update bigmember_service_user set i_frequency = i_frequency + ?,l_updatetime = ?,l_starttime = ?,l_endtime = ?,i_status = ? where s_serviceid = ? and s_userid = ?"
|
|
|
+ status1 := util.JysqlDB.UpdateOrDeleteBySql(sql, fmt.Sprint(frequency), cm.NowFormat(cm.Date_Full_Layout), cm.FormatDate(&startDate, cm.Date_Full_Layout), cm.FormatDate(&endDate, cm.Date_Full_Layout), fmt.Sprint(i_status), serverId, userId)
|
|
|
+ if status1 < 0 {
|
|
|
+ return errors.New("新建服务-更新服务表出错")
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ insert := map[string]interface{}{
|
|
|
+ "s_userid": userId,
|
|
|
+ "s_smainid": mainId,
|
|
|
+ "s_serviceid": serverId,
|
|
|
+ "i_frequency": frequency,
|
|
|
+ "l_starttime": cm.FormatDate(&startDate, cm.Date_Full_Layout),
|
|
|
+ "l_endtime": cm.FormatDate(&endDate, cm.Date_Full_Layout),
|
|
|
+ "i_status": i_status,
|
|
|
+ "l_createtime": cm.NowFormat(cm.Date_Full_Layout),
|
|
|
+ "l_updatetime": cm.NowFormat(cm.Date_Full_Layout),
|
|
|
+ }
|
|
|
+ order_id := util.JysqlDB.Insert("bigmember_service_user", insert)
|
|
|
+ if order_id <= 0 {
|
|
|
+ return errors.New("用户服务表插入失败")
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ ClearBigVipUserPower(userId)
|
|
|
+ return nil
|
|
|
+}
|
|
|
+
|
|
|
+func GetStartAndEndTime(startTime string, cycleCount, cycleUnit int) (vipStartTime, endTime time.Time) {
|
|
|
+ //根据开始时间计算结束时间
|
|
|
+ month := 0
|
|
|
+ if cycleUnit == 1 {
|
|
|
+ month = cycleCount * 12
|
|
|
+ } else if cycleUnit == 2 {
|
|
|
+ month = cycleCount
|
|
|
+ } else if cycleUnit == 4 {
|
|
|
+ month = cycleCount * 3
|
|
|
+ }
|
|
|
+ vipStartTime, _ = time.ParseInLocation(cm.Date_Short_Layout, startTime, time.Local)
|
|
|
+ if cycleUnit == 3 {
|
|
|
+ _endTime := vipStartTime.AddDate(0, 0, cycleCount)
|
|
|
+ t := _endTime.Format(cm.Date_Short_Layout) + " 23:59:59"
|
|
|
+ endTime, _ = time.ParseInLocation(cm.Date_Full_Layout, t, time.Local)
|
|
|
+ } else {
|
|
|
+ endTime = GetDATE1(month, vipStartTime.Unix())
|
|
|
+ }
|
|
|
+ return vipStartTime, endTime
|
|
|
+}
|