diff --git a/app/admin/hdl/hdl_audit_center.go b/app/admin/hdl/hdl_audit_center.go index 4600bec..dba8b14 100644 --- a/app/admin/hdl/hdl_audit_center.go +++ b/app/admin/hdl/hdl_audit_center.go @@ -9,6 +9,7 @@ import ( "applet/app/e" "applet/app/enum" "applet/app/utils" + "applet/app/utils/cache" "applet/app/utils/logx" "errors" "github.com/gin-gonic/gin" @@ -119,7 +120,15 @@ func CentralKitchenForSchoolOrderRefundAudit(c *gin.Context) { return } - //TODO::先将所有申请单改成 审核通过 状态 + //TODO:: 加锁 Redis 锁,防并发 + getString, _ := cache.GetString(md.AuditLockKeyForCentralKitchenLockKey) + if getString != "" { + e.OutErr(c, e.ERR, "请稍等,存在其他退款处理中!") + return + } + cache.Set(md.AuditLockKeyForCentralKitchenLockKey, "running") + + //先将所有申请单改成 审核通过 状态 session := db.Db.NewSession() defer session.Close() session.Begin() @@ -208,6 +217,7 @@ func CentralKitchenForSchoolOrderRefundAudit(c *gin.Context) { logx.Error(err1) println("<<<>>>>Error:::", err1.Error()) } + cache.Del(md.AuditLockKeyForCentralKitchenLockKey) }() e.OutSuc(c, "success", nil) diff --git a/app/admin/md/md_app_redis_key.go b/app/admin/md/md_app_redis_key.go index 7bf0e27..93a4cab 100644 --- a/app/admin/md/md_app_redis_key.go +++ b/app/admin/md/md_app_redis_key.go @@ -2,13 +2,14 @@ package md // 缓存key统一管理 const ( - AdminJwtTokenKey = "%s:smart_canteen_admin_jwt_token:%s" // jwt, 占位符:ip, admin:id - JwtTokenCacheTime = 3600 * 24 - AdminRolePermissionKey = "%s:smart_canteen_admin_role_permission:%s" // 占位符:ip, admin:id - AdminRolePermissionCacheTime = 3600 * 24 * 0.5 - AdminHomePageDataKey = "%s:smart_canteen_admin_home_data:%s" // 占位符:ip, admin:id - AdminHomePageDataCacheTime = 60 * 10 - CfgCacheTime = 86400 - AppCfgCacheKey = "smart_canteen:%s" // 占位符: key的第一个字母 - WxOfficialAccountCacheKey = "wx_official_account" // 占位符: key的第一个字母 + AdminJwtTokenKey = "%s:smart_canteen_admin_jwt_token:%s" // jwt, 占位符:ip, admin:id + JwtTokenCacheTime = 3600 * 24 + AdminRolePermissionKey = "%s:smart_canteen_admin_role_permission:%s" // 占位符:ip, admin:id + AdminRolePermissionCacheTime = 3600 * 24 * 0.5 + AdminHomePageDataKey = "%s:smart_canteen_admin_home_data:%s" // 占位符:ip, admin:id + AdminHomePageDataCacheTime = 60 * 10 + CfgCacheTime = 86400 + AppCfgCacheKey = "smart_canteen:%s" // 占位符: key的第一个字母 + WxOfficialAccountCacheKey = "wx_official_account" // 占位符: key的第一个字母 + AuditLockKeyForCentralKitchenLockKey = "audit_lock_key_for_central_kitchen_lock_key" ) diff --git a/app/customer/md/md_curl_smart_pay.go b/app/customer/md/md_curl_smart_pay.go index 4e8fda2..697b23c 100644 --- a/app/customer/md/md_curl_smart_pay.go +++ b/app/customer/md/md_curl_smart_pay.go @@ -70,6 +70,17 @@ type CurlAlipayTradeRefundReq struct { AppAuthToken string `json:"app_auth_token" binding:"required" label:"应用授权token"` } +type CurlAlipayTradeRefundQueryReq struct { + Config struct { + PayAliAppId string `json:"pay_ali_app_id" label:"支付宝开放平台-第三方应用-appid"` + PayAliPrivateKey string `json:"pay_ali_private_key" label:"支付宝开放平台-第三方应用-接口加签-应用私钥"` + PayAliPublicKey string `json:"pay_ali_public_key" label:"支付宝开放平台-第三方应用-接口加签-支付宝公钥"` + } `json:"config" label:"配置信息"` + OutTradeNo string `json:"out_trade_no" label:"商户订单号"` + OutRequestNo string `json:"out_request_no" label:"退款订单号"` + AppAuthToken string `json:"app_auth_token" binding:"required" label:"应用授权token"` +} + type CurlEducateSceneTokenReq struct { Config struct { AliAppId string `json:"ali_app_id" label:"支付宝开放平台-小程序-appid"` diff --git a/app/customer/svc/svc_curl_smart_pay.go b/app/customer/svc/svc_curl_smart_pay.go index 8c27dfe..4c182f6 100644 --- a/app/customer/svc/svc_curl_smart_pay.go +++ b/app/customer/svc/svc_curl_smart_pay.go @@ -165,6 +165,36 @@ func CurlAlipayTradeRefund(args md.CurlAlipayTradeRefundReq) (err error, resp in return nil, result.Data } +func CurlAlipayTradeRefundQuery(args md.CurlAlipayTradeRefundQueryReq) (err error, resp interface{}) { + url := cfg.SmartCanteenPay + "/alipay/pay/tradeRefundQuery" + utils.FilePutContents("CurlAlipayTradeRefundQuery", utils.SerializeStr(map[string]interface{}{ + "args": args, + })) + bytes, err := utils.CurlPost(url, utils.Serialize(args), nil) + if err != nil { + return + } + var result struct { + Code int `json:"code"` + Msg string `json:"msg"` + Data interface{} `json:"data"` + } + utils.FilePutContents("CurlAlipayTradeRefundQuery", utils.SerializeStr(result)) + err = json.Unmarshal(bytes, &result) + if err != nil { + return + } + if result.Code != 0 { + if result.Msg != "" { + err = errors.New(result.Msg) + return + } + err = errors.New("请求智慧餐厅支付 异常/失败") + return + } + return nil, result.Data +} + func CurlEducateSceneTokenQuery(args md.CurlEducateSceneTokenReq, userIdentity *model.UserIdentity, userToken, schoolName string) (err error, resp interface{}) { utils.FilePutContents("CurlEducateSceneTokenQuery", utils.SerializeStr(map[string]interface{}{ "args": args, diff --git a/app/task/svc/svc_alipay_trade_fastpay_refund_query.go b/app/task/svc/svc_alipay_trade_fastpay_refund_query.go new file mode 100644 index 0000000..6470459 --- /dev/null +++ b/app/task/svc/svc_alipay_trade_fastpay_refund_query.go @@ -0,0 +1,94 @@ +package svc + +import ( + md2 "applet/app/customer/md" + svc2 "applet/app/customer/svc" + "applet/app/db" + "applet/app/db/model" + "applet/app/enum" + "applet/app/utils" + "encoding/json" + "fmt" + "xorm.io/xorm" +) + +func CentralKitchenForSchoolAlipayTradeFastpayRefundQuery(eg *xorm.Engine) { + var list []model.CentralKitchenForSchoolUserRefundDay + if err := db.Db.Where("refund_date >= '2024-01-17 12:00:00' AND state = 3").Desc("id").Find(&list); err != nil { + fmt.Println(err) + } + sysCfgDb := db.SysCfgDb{} + sysCfgDb.Set() + sysCfg := sysCfgDb.SysCfgFindWithDb(enum.JsapiPayAppAutToken, enum.OpenAlipayAppid, enum.OpenAlipayAppPrivateKey, enum.OpenAlipayPublicKey, enum.WxJsapiRefundPayNotifyUrl) + + for _, v := range list { + affected1, err := db.Db.Where("id=?", v.RecordsId).Cols("state").Update(&model.CentralKitchenForSchoolUserWithDay{ + State: 3, + }) + if err != nil { + fmt.Println(err) + } + fmt.Println(">>>>>>>>>>>>>>>>>affected1<<<<<<<<<<<<<<<<<<<", affected1) + continue + + err, data := svc2.CurlAlipayTradeRefundQuery(md2.CurlAlipayTradeRefundQueryReq{ + Config: struct { + PayAliAppId string `json:"pay_ali_app_id" label:"支付宝开放平台-第三方应用-appid"` + PayAliPrivateKey string `json:"pay_ali_private_key" label:"支付宝开放平台-第三方应用-接口加签-应用私钥"` + PayAliPublicKey string `json:"pay_ali_public_key" label:"支付宝开放平台-第三方应用-接口加签-支付宝公钥"` + }{ + PayAliAppId: sysCfg[enum.OpenAlipayAppid], + PayAliPrivateKey: sysCfg[enum.OpenAlipayAppPrivateKey], + PayAliPublicKey: sysCfg[enum.OpenAlipayPublicKey], + }, + OutTradeNo: v.OutTradeNo, + OutRequestNo: v.OutRequestNo, + AppAuthToken: sysCfg[enum.JsapiPayAppAutToken], + }) + + if err != nil { + fmt.Println("err:::::", err.Error()) + } + var dataMap map[string]string + err = json.Unmarshal([]byte(utils.SerializeStr(data)), &dataMap) + if dataMap["out_request_no"] == "" && dataMap["refund_status"] != "REFUND_SUCCESS" { + + var mm []model.CentralKitchenForSchoolUserRefundDay + if err1 := db.Db.Where("out_request_no = ?", v.OutRequestNo).Desc("id").Find(&mm); err != nil { + fmt.Println(err1) + } + + //var amount float64 + for _, vv := range mm { + //amount += utils.StrToFloat64(vv.Amount) + vv.State = 3 + affected1, err := db.Db.Where("id=?", vv.Id).Cols("state").Update(&vv) + if err != nil { + fmt.Println(err) + } + fmt.Println(">>>>>>>>>>>>>>>>>affected1<<<<<<<<<<<<<<<<<<<", affected1) + } + + //err6, _ := svc2.CurlAlipayTradeRefund(md2.CurlAlipayTradeRefundReq{ + // Config: struct { + // PayAliAppId string `json:"pay_ali_app_id" label:"支付宝开放平台-第三方应用-appid"` + // PayAliPrivateKey string `json:"pay_ali_private_key" label:"支付宝开放平台-第三方应用-接口加签-应用私钥"` + // PayAliPublicKey string `json:"pay_ali_public_key" label:"支付宝开放平台-第三方应用-接口加签-支付宝公钥"` + // }{ + // PayAliAppId: sysCfg[enum.OpenAlipayAppid], + // PayAliPrivateKey: sysCfg[enum.OpenAlipayAppPrivateKey], + // PayAliPublicKey: sysCfg[enum.OpenAlipayPublicKey], + // }, + // OutTradeNo: v.OutTradeNo, + // RefundAmount: utils.Float64ToStr(amount), + // RefundReason: "央厨订餐退款", + // OutRequestNo: v.OutRequestNo, + // AppAuthToken: sysCfg[enum.JsapiPayAppAutToken], + //}) + //if err6 != nil { + // fmt.Println(err6) + //} + } + fmt.Println(dataMap) + } +} diff --git a/app/task/task_central_kitchen_for_school_alipay.trade.fastpay.refund.query.go b/app/task/task_central_kitchen_for_school_alipay.trade.fastpay.refund.query.go new file mode 100644 index 0000000..1a9ac5d --- /dev/null +++ b/app/task/task_central_kitchen_for_school_alipay.trade.fastpay.refund.query.go @@ -0,0 +1,23 @@ +package task + +import ( + "applet/app/task/svc" + "math/rand" + "time" + "xorm.io/xorm" +) + +// 查询支付宝退款 +func taskCentralKitchenForSchoolAlipayTradeFastpayRefundQuery(eg *xorm.Engine) { + for { + if len(ch) > workerNum { + time.Sleep(time.Millisecond * time.Duration(rand.Intn(1000))) + } else { + goto START + } + } +START: + ch <- 1 + svc.CentralKitchenForSchoolAlipayTradeFastpayRefundQuery(eg) + <-ch +}