package shanghu import ( "duoduo/apis/shanghu/models" "duoduo/models/shanghu" "duoduo/tools" "duoduo/tools/app" "encoding/base64" "encoding/json" "errors" "github.com/gin-gonic/gin" "github.com/skip2/go-qrcode" "time" ) // 待核销金额 func PendingCancelAmount(c *gin.Context) { var inData models.PendingCancelAmountRequest var activePayTransSql shanghu.ClientActivePayTrans var outData models.PendingCancelAmountReply err := c.ShouldBindJSON(&inData) if err != nil { app.Error(c, 400, err, err.Error()) return } if inData.Type == 1 { //商家 activePayTransSql.MerchantOpenID = inData.OpenId activeAmount, err := activePayTransSql.GetPendingCancelByMerchant() if err != nil { app.Error(c, 500, err, err.Error()) return } outData.Amount = activeAmount.MerchantAmount.String() } else if inData.Type == 2 { //个人 activePayTransSql.ClientOpenID = inData.OpenId activeAmount, err := activePayTransSql.GetPendingCancelByClient() if err != nil { app.Error(c, 500, err, err.Error()) return } outData.Amount = activeAmount.ClientAmount.String() } else { app.Error(c, 500, errors.New("type 类型错误"), err.Error()) return } app.OK(c, outData, app.Success) } // 拼团购买 func GetGroupBuyPayList(c *gin.Context) { var inData models.GetGroupBuyPayRequest var sqlData shanghu.ClientActivePayTrans var outData []models.GetGroupBuyPayReply err := c.ShouldBindJSON(&inData) if err != nil { app.Error(c, 400, err, err.Error()) return } // 不是商家也不是c端客户 if inData.UserType != 1 && inData.UserType != 2 { app.Error(c, 500, errors.New("用户类型错误"), err.Error()) return } // 核销类型错误 if inData.GroupBuyType != 1 && inData.GroupBuyType != 2 { app.Error(c, 500, errors.New("核销类型错误"), err.Error()) return } var pageSize = 10 var pageIndex = 1 if inData.PageSize != 0 { pageSize = inData.PageSize } if inData.PageIndex != 0 { pageIndex = inData.PageIndex } activeDrawLogList, count, err := sqlData.GetActivePayTransList(pageSize, pageIndex, inData.UserType, inData.GroupBuyType, inData.OpenId) if err != nil { app.Error(c, 500, err, err.Error()) return } for _, v := range activeDrawLogList { var data models.GetGroupBuyPayReply var activeSql shanghu.MerchantActiveConfig var groupBuySql shanghu.MerchantActiveGroupBuy data.MerchantAmount = v.MerchantAmount.String() data.Amount = v.Amount.String() data.ClientAmount = v.ClientAmount.String() data.PayTime = v.PayTime.Format(time.DateTime) activeSql.ID = v.ActiveConfigID activeInfo, err := activeSql.GetConfigInfoById() if err != nil { app.Error(c, 500, err, err.Error()) return } data.ActiveName = activeInfo.ActiveName groupBuySql.ID = v.GroupBuyID groupBuyInfo, err := groupBuySql.GetMerchantActiveGroupBuyById() if err != nil { app.Error(c, 500, err, err.Error()) return } data.GroupBuyName = groupBuyInfo.GroupBuyName data.PayTime = v.PayTime.Format(time.DateTime) data.TradeNo = v.ThirdTradeNo outData = append(outData, data) } app.PageOK(c, outData, count, pageIndex, pageSize, app.Success) } // 拼团核销码 func GroupBuyPayCode(c *gin.Context) { var inData models.GroupBuyPayCodeRequest var outData models.GroupBuyPayCodeReply //var sqlData shanghu.ClientActivePayTrans err := c.ShouldBindJSON(&inData) if err != nil { app.Error(c, 400, err, err.Error()) return } outData.Key = "GROU" + tools.MD5(inData.TradeNo+"zhangkun429@") outData.TradeNo = inData.TradeNo str, err := json.Marshal(&outData) if err != nil { app.Error(c, 500, err, err.Error()) return } qr, err := qrcode.Encode(string(str), qrcode.High, 200) if err != nil { app.Error(c, 500, err, err.Error()) return } encodedData := base64.StdEncoding.EncodeToString(qr) app.OK(c, encodedData, app.Success) } // 拼团核销详情 func GroupBuyCancelInfo(c *gin.Context) { var inData models.GroupBuyCancelInfoRequest var outData models.GroupBuyCancelInfoReply var sqlData shanghu.ClientActivePayTrans var activeConfigSql shanghu.MerchantActiveConfig var groupBuySql shanghu.MerchantActiveGroupBuy var groupBuyProjectSql shanghu.MerchantActiveGroupByProject err := c.ShouldBindJSON(&inData) if err != nil { app.Error(c, 400, err, err.Error()) return } key := "GROU" + tools.MD5(inData.TradeNo+"zhangkun429@") if inData.Key != key { app.Error(c, 500, errors.New("数据错误"), "数据错误") return } sqlData.ThirdTradeNo = inData.TradeNo payTransInfo, err := sqlData.GetPayTransByThirdTradeNo() if err != nil { app.Error(c, 500, err, err.Error()) return } //校验分账类型 //if payTransInfo.AccountStatus != shanghu.ClientActivePayTransAccountStatusUnSettle && payTransInfo.AccountStatus != shanghu.ClientActivePayTransAccountStatusSettleFail { // app.Error(c, 500, errors.New("核销已完成"), "核销已完成") // return //} // 校验支付类型 if payTransInfo.Status != shanghu.ClientActivePayTransStatusPaySuccess { app.Error(c, 500, errors.New("未支付交易不准核销"), "未支付交易不准核销") return } // 返回拼团信息 outData.Amount = payTransInfo.Amount.String() outData.TradeNo = inData.TradeNo outData.PayTime = payTransInfo.PayTime.Format(time.DateTime) outData.MerchantAmount = payTransInfo.MerchantAmount.String() outData.ClientAmount = payTransInfo.ClientAmount.String() activeConfigSql.ID = payTransInfo.ActiveConfigID activeConfigInfo, err := activeConfigSql.GetConfigInfoById() if err != nil { app.Error(c, 500, err, err.Error()) return } outData.ActiveName = activeConfigInfo.ActiveName groupBuySql.ID = payTransInfo.GroupBuyID groupBuyInfo, err := groupBuySql.GetMerchantActiveGroupBuyById() if err != nil { app.Error(c, 500, err, err.Error()) return } outData.GroupBuyName = groupBuyInfo.GroupBuyName groupBuyProjectSql.GroupBuyID = payTransInfo.GroupBuyID project, _, err := groupBuyProjectSql.GetGroupBuyProjectList() if err != nil { app.Error(c, 500, err, err.Error()) return } for _, v := range project { var projectInfo models.CancelGroupBuyProject var activeCancelSql shanghu.ActiveCancelLog activeCancelSql.ClientOpenID = payTransInfo.ClientOpenID activeCancelSql.ActiveConfigID = payTransInfo.ActiveConfigID num := activeCancelSql.GetActiveCancelNum() projectInfo.ProjectName = v.ProjectName projectInfo.TotalCancelNum = v.CancelNum projectInfo.PendingCancelNum = v.CancelNum - num projectInfo.ID = v.ID outData.GroupBuyProject = append(outData.GroupBuyProject, projectInfo) } app.OK(c, outData, app.Success) } // 拼团核销 func GroupBuyCancel(c *gin.Context) { var inData models.GroupBuyCancelRequest var payTrans shanghu.ClientActivePayTrans var activeCancelLogList []shanghu.ActiveCancelLog err := c.ShouldBindJSON(&inData) if err != nil { app.Error(c, 400, err, err.Error()) return } key := "GROU" + tools.MD5(inData.TradeNo+"zhangkun429@") if inData.Key != key { app.Error(c, 500, errors.New("数据错误"), "数据错误") return } //查交易 payTrans.ThirdTradeNo = inData.TradeNo transInfo, err := payTrans.GetPayTransByThirdTradeNo() if err != nil { app.Error(c, 500, err, err.Error()) return } //校验分账类型 //if transInfo.AccountStatus != shanghu.ClientActivePayTransAccountStatusUnSettle && transInfo.AccountStatus != shanghu.ClientActivePayTransAccountStatusSettleFail { // app.Error(c, 500, errors.New("核销已完成"), "核销已完成") // return //} // 校验支付类型 if transInfo.Status != shanghu.ClientActivePayTransStatusPaySuccess { app.Error(c, 500, errors.New("未支付交易不准核销"), "未支付交易不准核销") return } //查看核销次数 //是否可以核销,默认不可以核销,只要有一个可以核销就为true isCancel := false for _, v := range inData.GroupBuyProject { var projectSql shanghu.MerchantActiveGroupByProject var activeCancel shanghu.ActiveCancelLog projectSql.ID = v.ID projectInfo, err := projectSql.GetMerchantActiveGroupBuyProjectByID() if err != nil { app.Error(c, 500, err, err.Error()) return } cancelNum := activeCancel.GetActiveCancelNum() if projectInfo.CancelNum >= cancelNum+v.CancelNum && v.CancelNum > 0 { isCancel = true for i := 0; i < projectInfo.CancelNum; i++ { var activeCancelLogInfo shanghu.ActiveCancelLog activeCancelLogInfo.ActiveConfigID = payTrans.ActiveConfigID activeCancelLogInfo.ClientOpenID = payTrans.ClientOpenID activeCancelLogInfo.MerchantOpenID = inData.OpenId activeCancelLogInfo.GroupByProjectID = v.ID activeCancelLogInfo.CreatedAt = time.Now() activeCancelLogInfo.UpdatedAt = time.Now() activeCancelLogList = append(activeCancelLogList, activeCancelLogInfo) } } } if !isCancel { app.Error(c, 500, errors.New("核销次数不够"), "核销次数不够") return } // 分账 if transInfo.AccountStatus != shanghu.ClientActivePayTransAccountStatusUnSettle && transInfo.AccountStatus != shanghu.ClientActivePayTransAccountStatusSettleFail { //不需要分账 var activeCancel shanghu.ActiveCancelLog err = activeCancel.TXActiveCancelLogCreate(activeCancelLogList) if err != nil { app.Error(c, 500, err, err.Error()) return } } else { // 需要分账 //校验是否被分过,分过后不再分账 var merchantAccountLog shanghu.MerchantAccountLog merchantAccountLog.PayTransId = payTrans.ID merchantAccountLog.TransType = shanghu.MerchantAccountLogTransTypeGroupBuy num := merchantAccountLog.GetAccountLogNum() if num > 0 { //交易已经分过账 app.Error(c, 500, errors.New("交易已分过账"), "交易已分过账") return } //分账校验账号 var merchantAccount shanghu.MerchantAccount merchantAccount.MerchantOpenID = payTrans.MerchantOpenID merchantAccountInfo, err := merchantAccount.GetMerchantAccount() if err != nil && err.Error() != "record not found" { app.Error(c, 500, err, err.Error()) return } if merchantAccountInfo.ID == 0 { //需要创建新账号 merchantAccount.MerchantOpenID = payTrans.MerchantOpenID merchantAccount.Version = 1 merchantAccount.CreatedAt = time.Now() merchantAccount.UpdatedAt = time.Now() _, err = merchantAccount.Create() if err != nil { app.Error(c, 500, err, err.Error()) return } } if payTrans.InvitationCode != shanghu.YuanShiMa { //校验c端客户 var activeUser shanghu.ActiveUser var clientAccount shanghu.ActiveClientAccount activeUser.Code = payTrans.InvitationCode activeUserInfo, err := activeUser.GetUserInfoByCode() if err != nil { app.Error(c, 500, err, err.Error()) return } clientAccount.ClientOpenID = activeUserInfo.OpenID clientAccountInfo, err := clientAccount.GetMerchantAccount() if err != nil && err.Error() != "record not found" { app.Error(c, 500, err, err.Error()) return } if clientAccountInfo.ID == 0 { //需要创建新账号 clientAccount.ClientOpenID = activeUserInfo.OpenID clientAccount.Version = 1 clientAccount.CreatedAt = time.Now() clientAccount.UpdatedAt = time.Now() _, err = clientAccount.Create() if err != nil { app.Error(c, 500, err, err.Error()) return } } } //分账 根据merchant-openid + activeUserInfo.openid 进行分账 } }