123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536 |
- package shanghu
- import (
- "duoduo/apis/shanghu/models"
- "duoduo/models/shanghu"
- "duoduo/tools"
- "duoduo/tools/app"
- "encoding/base64"
- "encoding/json"
- "errors"
- "fmt"
- "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.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
- var groupBuyProductSql shanghu.MerchantActiveGroupByProject
- var groupBuyProductCancel shanghu.ActiveCancelLog
- 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
- }
- groupBuyProductSql.GroupBuyID = v.GroupBuyID
- groupBuyProductList, _, err := groupBuyProductSql.GetGroupBuyProjectList()
- if err != nil {
- app.Error(c, 500, err, err.Error())
- return
- }
- totalGroupBuyNum := 0
- for _, v := range groupBuyProductList {
- totalGroupBuyNum = totalGroupBuyNum + v.CancelNum
- }
- groupBuyProductCancel.ClientOpenID = inData.OpenId
- groupBuyProductCancel.ActiveConfigID = v.ActiveConfigID
- cancelNum := groupBuyProductCancel.GetActiveCancelNum()
- data.GroupBuyName = groupBuyInfo.GroupBuyName
- data.PayTime = v.PayTime.Format(time.DateTime)
- data.TradeNo = v.ThirdTradeNo
- data.TotalCancelNum = totalGroupBuyNum
- data.PendingCancelNum = totalGroupBuyNum - cancelNum
- data.Url = groupBuyInfo.GroupBuyUrl
- 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 payTransSql shanghu.ClientActivePayTrans
- var groupBuyProductSql shanghu.MerchantActiveGroupByProject
- var groupBuyProductCancel shanghu.ActiveCancelLog
- err := c.ShouldBindJSON(&inData)
- if err != nil {
- app.Error(c, 400, err, err.Error())
- return
- }
- //校验核销次数
- payTransSql.ThirdTradeNo = inData.TradeNo
- payTransInfo, err := payTransSql.GetPayTransByThirdTradeNo()
- if err != nil {
- app.Error(c, 500, err, err.Error())
- return
- }
- groupBuyProductSql.GroupBuyID = payTransInfo.GroupBuyID
- groupBuyProductList, _, err := groupBuyProductSql.GetGroupBuyProjectList()
- if err != nil {
- app.Error(c, 500, err, err.Error())
- return
- }
- totalGroupBuyNum := 0
- for _, v := range groupBuyProductList {
- totalGroupBuyNum = totalGroupBuyNum + v.CancelNum
- }
- groupBuyProductCancel.ClientOpenID = payTransInfo.ClientOpenID
- groupBuyProductCancel.ActiveConfigID = payTransInfo.ActiveConfigID
- cancelNum := groupBuyProductCancel.GetActiveCancelNum()
- if totalGroupBuyNum <= cancelNum {
- app.Error(c, 500, errors.New("核销次数用完"), "核销次数用完")
- 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
- activeCancelSql.GroupByProjectID = v.ID
- activeCancelSql.TransID = payTransInfo.ID
- num := activeCancelSql.GetActiveCancelNumByProjectID()
- fmt.Println("num = ", num)
- 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
- }
- if transInfo.AccountStatus == shanghu.ClientActivePayTransAccountStatusSettlePending {
- 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
- }
- activeCancel.ClientOpenID = transInfo.ClientOpenID
- activeCancel.ActiveConfigID = transInfo.ActiveConfigID
- activeCancel.GroupByProjectID = v.ID
- activeCancel.TransID = transInfo.ID
- cancelNum := activeCancel.GetActiveCancelNumByProjectID()
- fmt.Println("cancelNum = ", cancelNum)
- fmt.Println("projectInfo.CancelNum = ", projectInfo.CancelNum)
- fmt.Println("v.CancelNum = ", v.CancelNum)
- if v.CancelNum <= 0 {
- continue
- }
- if projectInfo.CancelNum >= cancelNum+v.CancelNum && v.CancelNum > 0 {
- isCancel = true
- for i := 0; i < v.CancelNum; i++ {
- var activeCancelLogInfo shanghu.ActiveCancelLog
- activeCancelLogInfo.ActiveConfigID = transInfo.ActiveConfigID
- activeCancelLogInfo.ClientOpenID = transInfo.ClientOpenID
- activeCancelLogInfo.MerchantOpenID = inData.OpenId
- activeCancelLogInfo.GroupByProjectID = v.ID
- activeCancelLogInfo.TransID = transInfo.ID
- activeCancelLogInfo.CreatedAt = time.Now()
- activeCancelLogInfo.UpdatedAt = time.Now()
- activeCancelLogList = append(activeCancelLogList, activeCancelLogInfo)
- }
- } else {
- app.Error(c, 500, errors.New("核销次数不够"), "核销次数不够")
- return
- }
- }
- if !isCancel {
- app.Error(c, 500, errors.New("核销次数不够"), "核销次数不够")
- return
- }
- // 分账
- if transInfo.AccountStatus == shanghu.ClientActivePayTransAccountStatusSettleSuccess {
- //不需要分账
- var activeCancel shanghu.ActiveCancelLog
- err = activeCancel.TXActiveCancelLogCreate(activeCancelLogList)
- if err != nil {
- app.Error(c, 500, err, err.Error())
- return
- }
- } else { // 需要分账
- // 分账中
- fmt.Println("分账中...")
- payTrans.ID = transInfo.ID
- payTrans.AccountStatus = shanghu.ClientActivePayTransAccountStatusSettlePending
- err = payTrans.UpdateAccountStatusByID()
- if err != nil {
- dataErr := make(map[string]interface{})
- dataErr["account_status"] = shanghu.ClientActivePayTransAccountStatusSettleFail //分账失败
- dataErr["account_err_log"] = "修改分账中失败:" + err.Error() //分账失败日志
- dataErr["updated_at"] = time.Now()
- _ = payTrans.UpdateById(dataErr)
- app.Error(c, 500, err, err.Error())
- return
- }
- //校验是否被分过,分过后不再分账
- var merchantAccountLog shanghu.MerchantAccountLog
- merchantAccountLog.PayTransId = transInfo.ID
- merchantAccountLog.TransType = shanghu.MerchantAccountLogTransTypeGroupBuy
- num := merchantAccountLog.GetAccountLogNum()
- if num > 0 { //交易已经分过账
- dataErr := make(map[string]interface{})
- dataErr["account_status"] = shanghu.ClientActivePayTransAccountStatusSettleFail //分账失败
- dataErr["account_err_log"] = "交易已分过账" //分账失败日志
- dataErr["updated_at"] = time.Now()
- _ = payTrans.UpdateById(dataErr)
- app.Error(c, 500, errors.New("交易已分过账"), "交易已分过账")
- return
- }
- //分账校验账号
- var merchantAccount shanghu.MerchantAccount
- merchantAccount.MerchantOpenID = transInfo.MerchantOpenID
- merchantAccountInfo, err := merchantAccount.GetMerchantAccount()
- if err != nil && err.Error() != "record not found" {
- dataErr := make(map[string]interface{})
- dataErr["account_status"] = shanghu.ClientActivePayTransAccountStatusSettleFail //分账失败
- dataErr["account_err_log"] = "商家分账校验账号:" + err.Error() //分账失败日志
- dataErr["updated_at"] = time.Now()
- _ = payTrans.UpdateById(dataErr)
- app.Error(c, 500, err, err.Error())
- return
- }
- if merchantAccountInfo.ID == 0 { //需要创建新账号
- merchantAccount.MerchantOpenID = transInfo.MerchantOpenID
- merchantAccount.Version = 1
- merchantAccount.CreatedAt = time.Now()
- merchantAccount.UpdatedAt = time.Now()
- merchantAccount, err = merchantAccount.Create()
- if err != nil {
- dataErr := make(map[string]interface{})
- dataErr["account_status"] = shanghu.ClientActivePayTransAccountStatusSettleFail //分账失败
- dataErr["account_err_log"] = "创建新的商家账号:" + err.Error() //分账失败日志
- dataErr["updated_at"] = time.Now()
- _ = payTrans.UpdateById(dataErr)
- app.Error(c, 500, err, err.Error())
- return
- }
- }
- var clientAccount shanghu.ActiveClientAccount
- if transInfo.InvitationCode != shanghu.YuanShiMa { //校验c端客户
- var activeUser shanghu.ActiveUser
- activeUser.Code = transInfo.InvitationCode
- activeUserInfo, err := activeUser.GetUserInfoByCode()
- if err != nil {
- dataErr := make(map[string]interface{})
- dataErr["account_status"] = shanghu.ClientActivePayTransAccountStatusSettleFail //分账失败
- dataErr["account_err_log"] = "根据Code获取c端客户信息:" + transInfo.InvitationCode + err.Error() //分账失败日志
- dataErr["updated_at"] = time.Now()
- _ = payTrans.UpdateById(dataErr)
- app.Error(c, 500, err, err.Error())
- return
- }
- clientAccount.ClientOpenID = activeUserInfo.OpenID
- clientAccountInfo, err := clientAccount.GetActiveAccount()
- if err != nil && err.Error() != "record not found" {
- dataErr := make(map[string]interface{})
- dataErr["account_status"] = shanghu.ClientActivePayTransAccountStatusSettleFail //分账失败
- dataErr["account_err_log"] = "获取c端客户账户:" + err.Error() //分账失败日志
- dataErr["updated_at"] = time.Now()
- _ = payTrans.UpdateById(dataErr)
- 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()
- clientAccount, err = clientAccount.Create()
- if err != nil {
- dataErr := make(map[string]interface{})
- dataErr["account_status"] = shanghu.ClientActivePayTransAccountStatusSettleFail //分账失败
- dataErr["account_err_log"] = "创建c端客户:" + err.Error() //分账失败日志
- dataErr["updated_at"] = time.Now()
- _ = payTrans.UpdateById(dataErr)
- app.Error(c, 500, err, err.Error())
- return
- }
- }
- }
- //分账 根据merchant-openid + activeUserInfo.openid 进行分账
- //商家分多少钱,客户分多少钱
- err = merchantAccount.ActiveCancelSettle(activeCancelLogList, merchantAccount, clientAccount, transInfo)
- if err != nil {
- dataErr := make(map[string]interface{})
- dataErr["account_status"] = shanghu.ClientActivePayTransAccountStatusSettleFail //分账失败
- dataErr["account_err_log"] = "分账失败:" + err.Error() //分账失败日志
- dataErr["updated_at"] = time.Now()
- _ = payTrans.UpdateById(dataErr)
- app.Error(c, 500, err, err.Error())
- return
- }
- }
- app.OK(c, nil, app.Success)
- }
|