智慧食堂
選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。

svc_pay.go 22 KiB

1年前
1年前
1年前
1年前
1年前
1年前
1年前
1年前
1年前
1年前
1年前
1年前
1年前
1年前
1年前
1年前
1年前
1年前
1年前
1年前
1年前
1年前
1年前
9ヶ月前
1年前
1年前
1年前
1年前
8ヶ月前
8ヶ月前
8ヶ月前
1年前
1年前
1年前
9ヶ月前
1年前
1年前
1年前
8ヶ月前
1年前
1年前
1年前
1年前
1年前
9ヶ月前
1年前
1年前
1年前
1年前
1年前
1年前
1年前
1年前
1年前
9ヶ月前
1年前
9ヶ月前
1年前
1年前
9ヶ月前
1年前
9ヶ月前
1年前
1年前
9ヶ月前
1年前
1年前
9ヶ月前
1年前
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649
  1. package svc
  2. import (
  3. "applet/app/customer/enum"
  4. "applet/app/customer/md"
  5. "applet/app/db"
  6. "applet/app/db/model"
  7. enum2 "applet/app/enum"
  8. svc3 "applet/app/svc"
  9. "applet/app/utils"
  10. "applet/app/utils/logx"
  11. "encoding/json"
  12. "errors"
  13. "fmt"
  14. "github.com/gin-gonic/gin"
  15. "github.com/wechatpay-apiv3/wechatpay-go/core"
  16. "github.com/wechatpay-apiv3/wechatpay-go/services/partnerpayments/jsapi"
  17. jsapi2 "github.com/wechatpay-apiv3/wechatpay-go/services/payments/jsapi"
  18. utils2 "github.com/wechatpay-apiv3/wechatpay-go/utils"
  19. "io/ioutil"
  20. "math"
  21. "net/url"
  22. "strconv"
  23. "time"
  24. )
  25. func BuyPackageForAli(c *gin.Context, req md.BuyPackageReq) (outTradeNo, tradeNo, total string, err error) {
  26. user := GetUser(c)
  27. session := db.Db.NewSession()
  28. defer session.Close()
  29. session.Begin()
  30. if err != nil {
  31. _ = session.Rollback()
  32. return
  33. }
  34. //1、判断是否为教师
  35. isTeacher := false
  36. userIdentityDb := db.UserIdentityDb{}
  37. userIdentityDb.Set(0)
  38. userIdentity, err := userIdentityDb.GetUserIdentity(req.UserIdentityId)
  39. if err != nil {
  40. return
  41. }
  42. if userIdentity == nil {
  43. err = errors.New("未查询到对应身份记录")
  44. return
  45. }
  46. if userIdentity.Identity == enum2.UserIdentityForCentralKitchenForTeacher {
  47. isTeacher = true
  48. }
  49. //2、计算数据(1:按学期购买 2:按月购买 3:按天购买 4:补餐)
  50. var totalPrice float64
  51. var data []*model.CentralKitchenForSchoolUserWithDay
  52. if req.Kind == 1 {
  53. totalPrice, data, err = CalcBySchoolTerm(user.Id, isTeacher, req)
  54. if err != nil {
  55. return
  56. }
  57. }
  58. if req.Kind == 2 {
  59. totalPrice, data, err = CalcByMonth(user.Id, isTeacher, req)
  60. if err != nil {
  61. return
  62. }
  63. }
  64. if req.Kind == 3 {
  65. totalPrice, data, err = CalcByDay(user.Id, isTeacher, req)
  66. if err != nil {
  67. return
  68. }
  69. }
  70. if req.Kind == 4 {
  71. totalPrice, data, err = CalcSupplementaryByDay(user.Id, isTeacher, req)
  72. if err != nil {
  73. return
  74. }
  75. }
  76. total = utils.Float64ToStr(totalPrice)
  77. //3、生成订单号
  78. outTradeNo = utils.OrderUUID(user.Id)
  79. //4、请求 alipay.trade.create(统一收单交易创建接口)
  80. sysCfgDb := db.SysCfgDb{}
  81. sysCfgDb.Set()
  82. sysCfg := sysCfgDb.SysCfgFindWithDb(enum2.OpenAppletAppid, enum2.OpenAlipayAppid, enum2.OpenAlipayAppPrivateKey, enum2.OpenAlipayPublicKey, enum2.JsapiPayAppAutToken, enum2.JsapiPayNotifyUrl)
  83. err, resp := CurlAlipayTradeCreate(md.CurlAlipayTradeCreateReq{
  84. Config: struct {
  85. PayAliAppId string `json:"pay_ali_app_id" label:"支付宝开放平台-第三方应用-appid"`
  86. PayAliPrivateKey string `json:"pay_ali_private_key" label:"支付宝开放平台-第三方应用-接口加签-应用私钥"`
  87. PayAliPublicKey string `json:"pay_ali_public_key" label:"支付宝开放平台-第三方应用-接口加签-支付宝公钥"`
  88. }{
  89. PayAliAppId: sysCfg[enum2.OpenAlipayAppid],
  90. PayAliPrivateKey: sysCfg[enum2.OpenAlipayAppPrivateKey],
  91. PayAliPublicKey: sysCfg[enum2.OpenAlipayPublicKey],
  92. },
  93. OpAppId: sysCfg[enum2.OpenAppletAppid],
  94. BuyerId: user.UserId,
  95. TotalAmount: total,
  96. OutTradeNo: outTradeNo,
  97. Subject: "购买食堂套餐",
  98. AppAuthToken: sysCfg[enum2.JsapiPayAppAutToken],
  99. NotifyUrl: sysCfg[enum2.JsapiPayNotifyUrl],
  100. })
  101. if err != nil {
  102. return
  103. }
  104. //5、插入订单记录
  105. now := time.Now()
  106. centralKitchenForSchoolPackageOrd := db.CentralKitchenForSchoolPackageOrd{}
  107. centralKitchenForSchoolPackageOrd.Set(outTradeNo)
  108. _, err = centralKitchenForSchoolPackageOrd.CentralKitchenForSchoolPackageOrdInsertBySession(session, &model.CentralKitchenForSchoolPackageOrd{
  109. EnterpriseId: req.EnterpriseId,
  110. Uid: user.Id,
  111. UserIdentityId: req.UserIdentityId,
  112. UserIdentityName: userIdentity.Name,
  113. TotalPrice: total,
  114. Kind: req.Kind,
  115. OutTradeNo: outTradeNo,
  116. TradeNo: resp.TradeNo,
  117. State: enum2.CentralKitchenForSchoolPackageOrdStateForWait,
  118. OrdState: enum2.CentralKitchenForSchoolPackageOrdOrdStateForWait,
  119. ReqContent: string(utils.Serialize(req)),
  120. WithDayData: string(utils.Serialize(data)),
  121. PayWay: enum.PayWayForAli,
  122. CreateAt: now.Format("2006-01-02 15:04:05"),
  123. UpdateAt: now.Format("2006-01-02 15:04:05"),
  124. PayAt: "2006-01-02 15:04:05",
  125. })
  126. if err != nil {
  127. _ = session.Rollback()
  128. return
  129. }
  130. session.Commit()
  131. tradeNo = resp.TradeNo
  132. return
  133. }
  134. func BuyPackageForWx(c *gin.Context, req md.BuyPackageReq) (outTradeNo, total string, resp *jsapi2.PrepayWithRequestPaymentResponse, err error) {
  135. user := GetUser(c)
  136. session := db.Db.NewSession()
  137. defer session.Close()
  138. session.Begin()
  139. if err != nil {
  140. _ = session.Rollback()
  141. return
  142. }
  143. //1、判断是否为教师
  144. isTeacher := false
  145. userIdentityDb := db.UserIdentityDb{}
  146. userIdentityDb.Set(0)
  147. userIdentity, err := userIdentityDb.GetUserIdentity(req.UserIdentityId)
  148. if err != nil {
  149. return
  150. }
  151. if userIdentity == nil {
  152. err = errors.New("未查询到对应身份记录")
  153. return
  154. }
  155. if userIdentity.Identity == enum2.UserIdentityForCentralKitchenForTeacher {
  156. isTeacher = true
  157. }
  158. //2、计算数据(1:按学期购买 2:按月购买 3:按天购买 4:补餐)
  159. var totalPrice float64
  160. var data []*model.CentralKitchenForSchoolUserWithDay
  161. if req.Kind == 1 {
  162. totalPrice, data, err = CalcBySchoolTerm(user.Id, isTeacher, req)
  163. if err != nil {
  164. return
  165. }
  166. }
  167. if req.Kind == 2 {
  168. totalPrice, data, err = CalcByMonth(user.Id, isTeacher, req)
  169. if err != nil {
  170. return
  171. }
  172. }
  173. if req.Kind == 3 {
  174. totalPrice, data, err = CalcByDay(user.Id, isTeacher, req)
  175. if err != nil {
  176. return
  177. }
  178. }
  179. if req.Kind == 4 {
  180. totalPrice, data, err = CalcSupplementaryByDay(user.Id, isTeacher, req)
  181. if err != nil {
  182. return
  183. }
  184. }
  185. total = utils.Float64ToStr(totalPrice)
  186. //3、生成订单号
  187. outTradeNo = utils.OrderUUID(user.Id)
  188. //4、请求 /v3/pay/partner/transactions/jsapi (生成预支付交易单)
  189. sysCfgDb := db.SysCfgDb{}
  190. sysCfgDb.Set()
  191. client, err := svc3.NewWxPayClient(c)
  192. if err != nil {
  193. return
  194. }
  195. wxSvc := jsapi.JsapiApiService{Client: client}
  196. companyWithWxpayInfoDb := db.CompanyWithWxpayInfoDb{}
  197. companyWithWxpayInfoDb.Set()
  198. wxMchId, err := companyWithWxpayInfoDb.GetCompanyWithWxpayInfoByEnterprise(req.EnterpriseId)
  199. if err != nil {
  200. return "", "", nil, err
  201. }
  202. sysCfg := sysCfgDb.SysCfgFindWithDb(enum2.WxAppletAppId, enum2.WxSpAppId, enum2.WxSpMchId, enum2.WxAppletAppId, enum2.WxJsapiPayNotifyUrl)
  203. fmt.Println(int64(math.Round(totalPrice * 100)))
  204. openId := c.GetHeader("openid") //TODO::实时获取用户的openId
  205. if openId == "" {
  206. openId = user.OpenId
  207. }
  208. result, _, err := wxSvc.Prepay(c,
  209. jsapi.PrepayRequest{
  210. SpAppid: core.String(sysCfg[enum2.WxSpAppId]),
  211. SpMchid: core.String(sysCfg[enum2.WxSpMchId]),
  212. SubAppid: core.String(sysCfg[enum2.WxAppletAppId]),
  213. SubMchid: core.String(wxMchId),
  214. Description: core.String("购买食堂套餐"),
  215. OutTradeNo: core.String(outTradeNo),
  216. TimeExpire: core.Time(time.Now().Add(20 * time.Minute)),
  217. //Attach: core.String("自定义数据说明"),
  218. NotifyUrl: core.String(sysCfg[enum2.WxJsapiPayNotifyUrl]),
  219. Amount: &jsapi.Amount{
  220. Currency: core.String("CNY"),
  221. Total: core.Int64(int64(math.Round(totalPrice * 100))),
  222. },
  223. Payer: &jsapi.Payer{
  224. //SpOpenid: core.String("oUpF8uMuAJO_M2pxb1Q9zNjWeS6o"),
  225. SubOpenid: core.String(openId),
  226. },
  227. },
  228. )
  229. fmt.Println(">>>>>>>>>>>", core.Int64(utils.StrToInt64(total)*100))
  230. if err != nil {
  231. _ = session.Rollback()
  232. return
  233. }
  234. //5、插入订单记录
  235. now := time.Now()
  236. centralKitchenForSchoolPackageOrd := db.CentralKitchenForSchoolPackageOrd{}
  237. centralKitchenForSchoolPackageOrd.Set(outTradeNo)
  238. _, err = centralKitchenForSchoolPackageOrd.CentralKitchenForSchoolPackageOrdInsertBySession(session, &model.CentralKitchenForSchoolPackageOrd{
  239. EnterpriseId: req.EnterpriseId,
  240. Uid: user.Id,
  241. UserIdentityId: req.UserIdentityId,
  242. UserIdentityName: userIdentity.Name,
  243. TotalPrice: total,
  244. Kind: req.Kind,
  245. OutTradeNo: outTradeNo,
  246. TradeNo: "",
  247. State: enum2.CentralKitchenForSchoolPackageOrdStateForWait,
  248. OrdState: enum2.CentralKitchenForSchoolPackageOrdOrdStateForWait,
  249. ReqContent: string(utils.Serialize(req)),
  250. WithDayData: string(utils.Serialize(data)),
  251. PayWay: enum.PayWayForWx,
  252. PrepayId: *result.PrepayId,
  253. CreateAt: now.Format("2006-01-02 15:04:05"),
  254. UpdateAt: now.Format("2006-01-02 15:04:05"),
  255. PayAt: "2006-01-02 15:04:05",
  256. })
  257. if err != nil {
  258. _ = session.Rollback()
  259. return
  260. }
  261. session.Commit()
  262. //prepayId = *resp.PrepayId
  263. resp = new(jsapi2.PrepayWithRequestPaymentResponse)
  264. resp.PrepayId = result.PrepayId
  265. resp.SignType = core.String("RSA")
  266. appid := sysCfg[enum2.WxAppletAppId]
  267. resp.Appid = &appid
  268. resp.TimeStamp = core.String(strconv.FormatInt(time.Now().Unix(), 10))
  269. nonce, err := utils2.GenerateNonce()
  270. if err != nil {
  271. _ = session.Rollback()
  272. return
  273. }
  274. resp.NonceStr = core.String(nonce)
  275. resp.Package = core.String("prepay_id=" + *result.PrepayId)
  276. message := fmt.Sprintf("%s\n%s\n%s\n%s\n", *resp.Appid, *resp.TimeStamp, *resp.NonceStr, *resp.Package)
  277. signatureResult, err := wxSvc.Client.Sign(c, message)
  278. if err != nil {
  279. _ = session.Rollback()
  280. return
  281. }
  282. resp.PaySign = core.String(signatureResult.Signature)
  283. return
  284. }
  285. func NursingHomeBuyPackageReq(c *gin.Context, req md.NursingHomeBuyPackageReq) (outTradeNo, tradeNo, total string, err error) {
  286. user := GetUser(c)
  287. session := db.Db.NewSession()
  288. defer session.Close()
  289. session.Begin()
  290. if err != nil {
  291. _ = session.Rollback()
  292. return
  293. }
  294. userIdentityDb := db.UserIdentityDb{}
  295. userIdentityDb.Set(0)
  296. userIdentity, err := userIdentityDb.GetUserIdentity(req.UserIdentityId)
  297. if err != nil {
  298. return
  299. }
  300. if userIdentity == nil {
  301. err = errors.New("未查询到对应身份记录")
  302. return
  303. }
  304. //1、计算数据(1:按年购买 2:按月购买 3:按天购买 4:补餐)
  305. var totalPrice float64
  306. var data []*model.NursingHomeUserWithDay
  307. if req.Kind == 1 {
  308. totalPrice, data, err = CalcByYearForNursingHome(user.Id, req)
  309. if err != nil {
  310. return
  311. }
  312. }
  313. if req.Kind == 2 {
  314. totalPrice, data, err = CalcByMonthForNursingHome(user.Id, req)
  315. if err != nil {
  316. return
  317. }
  318. }
  319. if req.Kind == 3 {
  320. totalPrice, data, err = CalcByDayForNursingHome(user.Id, req)
  321. if err != nil {
  322. return
  323. }
  324. }
  325. if req.Kind == 4 {
  326. totalPrice, data, err = CalcByDayForNursingHome(user.Id, req)
  327. if err != nil {
  328. return
  329. }
  330. }
  331. total = utils.Float64ToStr(totalPrice)
  332. //3、生成订单号
  333. outTradeNo = utils.OrderUUID(user.Id)
  334. //4、请求 alipay.trade.create(统一收单交易创建接口)
  335. sysCfgDb := db.SysCfgDb{}
  336. sysCfgDb.Set()
  337. sysCfg := sysCfgDb.SysCfgFindWithDb(enum2.OpenAppletAppid, enum2.OpenAlipayAppid, enum2.OpenAlipayAppPrivateKey, enum2.OpenAlipayPublicKey, enum2.JsapiPayAppAutToken)
  338. err, resp := CurlAlipayTradeCreate(md.CurlAlipayTradeCreateReq{
  339. Config: struct {
  340. PayAliAppId string `json:"pay_ali_app_id" label:"支付宝开放平台-第三方应用-appid"`
  341. PayAliPrivateKey string `json:"pay_ali_private_key" label:"支付宝开放平台-第三方应用-接口加签-应用私钥"`
  342. PayAliPublicKey string `json:"pay_ali_public_key" label:"支付宝开放平台-第三方应用-接口加签-支付宝公钥"`
  343. }{
  344. PayAliAppId: sysCfg[enum2.OpenAlipayAppid],
  345. PayAliPrivateKey: sysCfg[enum2.OpenAlipayAppPrivateKey],
  346. PayAliPublicKey: sysCfg[enum2.OpenAlipayPublicKey],
  347. },
  348. OpAppId: sysCfg[enum2.OpenAppletAppid],
  349. BuyerId: user.UserId,
  350. TotalAmount: total,
  351. OutTradeNo: outTradeNo,
  352. Subject: "购买食堂套餐",
  353. AppAuthToken: sysCfg[enum2.JsapiPayAppAutToken],
  354. })
  355. if err != nil {
  356. return
  357. }
  358. //5、插入订单记录
  359. now := time.Now()
  360. NursingHomePackageOrd := db.NursingHomePackageOrd{}
  361. NursingHomePackageOrd.Set(outTradeNo)
  362. _, err = NursingHomePackageOrd.NursingHomePackageOrdInsertBySession(session, &model.NursingHomePackageOrd{
  363. EnterpriseId: req.EnterpriseId,
  364. Uid: user.Id,
  365. UserIdentityId: req.UserIdentityId,
  366. UserIdentityName: userIdentity.Name,
  367. TotalPrice: total,
  368. Kind: req.Kind,
  369. OutTradeNo: outTradeNo,
  370. TradeNo: resp.TradeNo,
  371. State: enum2.NursingHomePackageOrdStateForWait,
  372. OrdState: enum2.NursingHomePackageOrdOrdStateForWait,
  373. ReqContent: string(utils.Serialize(req)),
  374. WithDayData: string(utils.Serialize(data)),
  375. CreateAt: now.Format("2006-01-02 15:04:05"),
  376. UpdateAt: now.Format("2006-01-02 15:04:05"),
  377. })
  378. if err != nil {
  379. _ = session.Rollback()
  380. return
  381. }
  382. session.Commit()
  383. tradeNo = resp.TradeNo
  384. return
  385. }
  386. func DealCentralKitchenForSchoolOrderCallBack(outTradeNo, tradeStatus, successTime string) (state int, err error) {
  387. centralKitchenForSchoolPackageOrd := db.CentralKitchenForSchoolPackageOrd{}
  388. centralKitchenForSchoolPackageOrd.Set(outTradeNo)
  389. ord, err := centralKitchenForSchoolPackageOrd.GetCentralKitchenForSchoolPackageOrd()
  390. if err != nil {
  391. return
  392. }
  393. if ord == nil {
  394. err = errors.New("未查询到对应订单记录")
  395. return
  396. }
  397. if ord.State == enum2.CentralKitchenForSchoolPackageOrdStateForWait {
  398. if tradeStatus == "TRADE_CLOSED" {
  399. ord.State = enum2.CentralKitchenForSchoolPackageOrdStateForFail
  400. }
  401. if tradeStatus == "TRADE_SUCCESS" {
  402. ord.State = enum2.CentralKitchenForSchoolPackageOrdStateForSuccess
  403. ord.OrdState = enum2.CentralKitchenForSchoolPackageOrdOrdStateForSuccess
  404. ord.PayAt = successTime
  405. //TODO::将预留数据插入到 `central_kitchen_for_school_user_with_day`
  406. var data []*model.CentralKitchenForSchoolUserWithDay
  407. err = json.Unmarshal([]byte(ord.WithDayData), &data)
  408. if err != nil {
  409. return
  410. }
  411. var hasMonths = map[string]map[string]interface{}{}
  412. var hasKinds = map[string]map[string]string{}
  413. var hasTotalPrice = map[string]map[string]float64{}
  414. for _, v := range data {
  415. date, _ := time.ParseInLocation("2006-01-02", v.Date, time.Local)
  416. if hasMonths[utils.TimeParseStd(v.Date).Month().String()] == nil {
  417. hasMonths[utils.TimeParseStd(v.Date).Month().String()] = make(map[string]interface{})
  418. hasMonths[utils.TimeParseStd(v.Date).Month().String()]["meal_time_start"] = date.Format("2006-01-02")
  419. hasMonths[utils.TimeParseStd(v.Date).Month().String()]["meal_time_end"] = date.Format("2006-01-02")
  420. } else {
  421. startTime, _ := time.ParseInLocation("2006-01-02", utils.AnyToString(hasMonths[utils.TimeParseStd(v.Date).Month().String()]["meal_time_start"]), time.Local)
  422. if startTime.After(date) {
  423. hasMonths[utils.TimeParseStd(v.Date).Month().String()]["meal_time_start"] = date.Format("2006-01-02")
  424. }
  425. endTime, _ := time.ParseInLocation("2006-01-02", utils.AnyToString(hasMonths[utils.TimeParseStd(v.Date).Month().String()]["meal_time_end"]), time.Local)
  426. if endTime.Before(date) {
  427. hasMonths[utils.TimeParseStd(v.Date).Month().String()]["meal_time_end"] = date.Format("2006-01-02")
  428. }
  429. }
  430. if hasTotalPrice[utils.TimeParseStd(v.Date).Month().String()] == nil {
  431. hasTotalPrice[utils.TimeParseStd(v.Date).Month().String()] = make(map[string]float64)
  432. }
  433. if hasKinds[utils.TimeParseStd(v.Date).Month().String()] == nil {
  434. hasKinds[utils.TimeParseStd(v.Date).Month().String()] = make(map[string]string)
  435. }
  436. hasMonths[utils.TimeParseStd(v.Date).Month().String()]["month"] = int(utils.TimeParseStd(v.Date).Month())
  437. hasKinds[utils.TimeParseStd(v.Date).Month().String()][utils.IntToStr(v.Kind)] = utils.IntToStr(v.Kind)
  438. hasTotalPrice[utils.TimeParseStd(v.Date).Month().String()][utils.IntToStr(v.Kind)] += utils.StrToFloat64(v.Amount)
  439. v.OrdNo = outTradeNo
  440. }
  441. centralKitchenForSchoolUserWithDayDb := db.CentralKitchenForSchoolUserWithDayDb{}
  442. centralKitchenForSchoolUserWithDayDb.Set(0)
  443. _, err = centralKitchenForSchoolUserWithDayDb.BatchAddCentralKitchenForSchoolUserWithDays(data)
  444. if err != nil {
  445. return
  446. }
  447. //TODO::插入数据至 `central_kitchen_for_school_package_ord_for_reserve`
  448. centralKitchenForSchoolPackageOrdForReserve := db.CentralKitchenForSchoolPackageOrdForReserve{}
  449. centralKitchenForSchoolPackageOrdForReserve.Set(outTradeNo)
  450. for k, v := range hasMonths {
  451. for _, v1 := range hasKinds[k] {
  452. _, err = centralKitchenForSchoolPackageOrdForReserve.CentralKitchenForSchoolPackageOrdForReserveInsert(&model.CentralKitchenForSchoolPackageOrdForReserve{
  453. EnterpriseId: ord.EnterpriseId,
  454. Uid: ord.Uid,
  455. UserIdentityName: ord.UserIdentityName,
  456. UserIdentityId: ord.UserIdentityId,
  457. Kind: utils.StrToInt(v1),
  458. OutTradeNo: ord.OutTradeNo,
  459. ReserveMonth: utils.AnyToString(v["month"]),
  460. MealTimeStart: utils.AnyToString(v["meal_time_start"]),
  461. MealTimeEnd: utils.AnyToString(v["meal_time_end"]),
  462. TotalPrice: utils.Float64ToStr(hasTotalPrice[k][v1]),
  463. CreateAt: time.Now().Format("2006-01-02 15:04:05"),
  464. UpdateAt: time.Now().Format("2006-01-02 15:04:05"),
  465. })
  466. if err != nil {
  467. return
  468. }
  469. }
  470. }
  471. }
  472. _, err = centralKitchenForSchoolPackageOrd.CentralKitchenForSchoolPackageOrdUpdate(ord, "state", "ord_state", "pay_at")
  473. if err != nil {
  474. return
  475. }
  476. }
  477. state = ord.State
  478. return
  479. }
  480. func DealCentralKitchenForSchoolOrderCallBackForWx(outTradeNo, transactionId, tradeStatus, successTime string) (state int, err error) {
  481. centralKitchenForSchoolPackageOrd := db.CentralKitchenForSchoolPackageOrd{}
  482. centralKitchenForSchoolPackageOrd.Set(outTradeNo)
  483. ord, err := centralKitchenForSchoolPackageOrd.GetCentralKitchenForSchoolPackageOrd()
  484. if err != nil {
  485. return
  486. }
  487. if ord == nil {
  488. err = errors.New("未查询到对应订单记录")
  489. return
  490. }
  491. if ord.State == enum2.CentralKitchenForSchoolPackageOrdStateForWait {
  492. if tradeStatus == "CLOSED" || tradeStatus == "PAYERROR" {
  493. ord.State = enum2.CentralKitchenForSchoolPackageOrdStateForFail
  494. }
  495. if tradeStatus == "SUCCESS" {
  496. ord.State = enum2.CentralKitchenForSchoolPackageOrdStateForSuccess
  497. ord.OrdState = enum2.CentralKitchenForSchoolPackageOrdOrdStateForSuccess
  498. ord.TradeNo = transactionId
  499. ord.PayAt = successTime
  500. //TODO::将预留数据插入到 `central_kitchen_for_school_user_with_day`
  501. var data []*model.CentralKitchenForSchoolUserWithDay
  502. err = json.Unmarshal([]byte(ord.WithDayData), &data)
  503. if err != nil {
  504. return
  505. }
  506. var hasMonths = map[string]map[string]interface{}{}
  507. var hasKinds = map[string]map[string]string{}
  508. var hasTotalPrice = map[string]map[string]float64{}
  509. for _, v := range data {
  510. date, _ := time.ParseInLocation("2006-01-02", v.Date, time.Local)
  511. if hasMonths[utils.TimeParseStd(v.Date).Month().String()] == nil {
  512. hasMonths[utils.TimeParseStd(v.Date).Month().String()] = make(map[string]interface{})
  513. hasMonths[utils.TimeParseStd(v.Date).Month().String()]["meal_time_start"] = date.Format("2006-01-02")
  514. hasMonths[utils.TimeParseStd(v.Date).Month().String()]["meal_time_end"] = date.Format("2006-01-02")
  515. } else {
  516. startTime, _ := time.ParseInLocation("2006-01-02", utils.AnyToString(hasMonths[utils.TimeParseStd(v.Date).Month().String()]["meal_time_start"]), time.Local)
  517. if startTime.After(date) {
  518. hasMonths[utils.TimeParseStd(v.Date).Month().String()]["meal_time_start"] = date.Format("2006-01-02")
  519. }
  520. endTime, _ := time.ParseInLocation("2006-01-02", utils.AnyToString(hasMonths[utils.TimeParseStd(v.Date).Month().String()]["meal_time_end"]), time.Local)
  521. if endTime.Before(date) {
  522. hasMonths[utils.TimeParseStd(v.Date).Month().String()]["meal_time_end"] = date.Format("2006-01-02")
  523. }
  524. }
  525. if hasTotalPrice[utils.TimeParseStd(v.Date).Month().String()] == nil {
  526. hasTotalPrice[utils.TimeParseStd(v.Date).Month().String()] = make(map[string]float64)
  527. }
  528. if hasKinds[utils.TimeParseStd(v.Date).Month().String()] == nil {
  529. hasKinds[utils.TimeParseStd(v.Date).Month().String()] = make(map[string]string)
  530. }
  531. hasMonths[utils.TimeParseStd(v.Date).Month().String()]["month"] = int(utils.TimeParseStd(v.Date).Month())
  532. hasKinds[utils.TimeParseStd(v.Date).Month().String()][utils.IntToStr(v.Kind)] = utils.IntToStr(v.Kind)
  533. hasTotalPrice[utils.TimeParseStd(v.Date).Month().String()][utils.IntToStr(v.Kind)] += utils.StrToFloat64(v.Amount)
  534. v.OrdNo = outTradeNo
  535. }
  536. centralKitchenForSchoolUserWithDayDb := db.CentralKitchenForSchoolUserWithDayDb{}
  537. centralKitchenForSchoolUserWithDayDb.Set(0)
  538. _, err = centralKitchenForSchoolUserWithDayDb.BatchAddCentralKitchenForSchoolUserWithDays(data)
  539. if err != nil {
  540. return
  541. }
  542. //TODO::插入数据至 `central_kitchen_for_school_package_ord_for_reserve`
  543. centralKitchenForSchoolPackageOrdForReserve := db.CentralKitchenForSchoolPackageOrdForReserve{}
  544. centralKitchenForSchoolPackageOrdForReserve.Set(outTradeNo)
  545. for k, v := range hasMonths {
  546. for _, v1 := range hasKinds[k] {
  547. _, err = centralKitchenForSchoolPackageOrdForReserve.CentralKitchenForSchoolPackageOrdForReserveInsert(&model.CentralKitchenForSchoolPackageOrdForReserve{
  548. EnterpriseId: ord.EnterpriseId,
  549. Uid: ord.Uid,
  550. UserIdentityName: ord.UserIdentityName,
  551. UserIdentityId: ord.UserIdentityId,
  552. Kind: utils.StrToInt(v1),
  553. OutTradeNo: ord.OutTradeNo,
  554. ReserveMonth: utils.AnyToString(v["month"]),
  555. MealTimeStart: utils.AnyToString(v["meal_time_start"]),
  556. MealTimeEnd: utils.AnyToString(v["meal_time_end"]),
  557. TotalPrice: utils.Float64ToStr(hasTotalPrice[k][v1]),
  558. CreateAt: time.Now().Format("2006-01-02 15:04:05"),
  559. UpdateAt: time.Now().Format("2006-01-02 15:04:05"),
  560. })
  561. if err != nil {
  562. return
  563. }
  564. }
  565. }
  566. }
  567. _, err = centralKitchenForSchoolPackageOrd.CentralKitchenForSchoolPackageOrdUpdate(ord, "state", "ord_state", "trade_no", "pay_at")
  568. if err != nil {
  569. return
  570. }
  571. }
  572. state = ord.State
  573. return
  574. }
  575. func CheckAllCallbackParams(c *gin.Context) interface{} {
  576. body, _ := ioutil.ReadAll(c.Request.Body)
  577. utils.FilePutContents("CheckAllCallbackParams", utils.SerializeStr(string(body)))
  578. dataAlipay, _ := GetAlipayCallbackParams(body)
  579. if dataAlipay != nil {
  580. return dataAlipay
  581. }
  582. return nil
  583. }
  584. // GetAlipayCallbackParams 支付宝参数解析
  585. func GetAlipayCallbackParams(body []byte) (*md.AliPayCallback, error) {
  586. decodeArgs, err := url.QueryUnescape(string(body))
  587. if err != nil {
  588. _ = logx.Warn(err)
  589. return nil, logx.Warn("回调参数解码错误")
  590. }
  591. data, err := url.ParseQuery(decodeArgs)
  592. if err != nil {
  593. return nil, err
  594. }
  595. dataMap := make(map[string]interface{})
  596. for k := range data {
  597. dataMap[k] = data.Get(k)
  598. }
  599. callbackStr := utils.Serialize(dataMap)
  600. fmt.Println("支付宝回调数据", string(callbackStr))
  601. var args md.AliPayCallback
  602. if err := json.Unmarshal(callbackStr, &args); err != nil {
  603. return nil, logx.Warn(err)
  604. }
  605. return &args, nil
  606. }