智慧食堂
25'ten fazla konu seçemezsiniz Konular bir harf veya rakamla başlamalı, kısa çizgiler ('-') içerebilir ve en fazla 35 karakter uzunluğunda olabilir.

svc_pay.go 22 KiB

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