order.go 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565
  1. package cygx
  2. import (
  3. "encoding/json"
  4. "github.com/rdlucklib/rdluck_tools/paging"
  5. "hongze/hz_crm_api/controllers"
  6. "hongze/hz_crm_api/models"
  7. "hongze/hz_crm_api/models/cygx"
  8. cygxService "hongze/hz_crm_api/services/cygx"
  9. "hongze/hz_crm_api/utils"
  10. "strconv"
  11. "time"
  12. )
  13. // 产品内测
  14. type OrderController struct {
  15. controllers.BaseAuthController
  16. }
  17. // @Title 列表
  18. // @Description 列表接口
  19. // @Param PageSize query int true "每页数据条数"
  20. // @Param CurrentIndex query int true "当前页页码,从1开始"
  21. // @Param StartDate query string false "开始时间 ,列如2021-03-06 "
  22. // @Param EndDate query string false "结束时间,列如2021-03-06 "
  23. // @Param AdminId query string false "销售ID "
  24. // @Param ShareId query string false "推荐人ID "
  25. // @Param PaymentType query string false "支付渠道 取值范围:1微信小程序,2微信扫码支付,3微信H5支付。 "
  26. // @Param OrderType query int false "订单类型 1:畅读卡订单,2:单场付费订单"
  27. // @Param OrderStatus query int false "订单状态,0:已取消、1:待支付、2:已支付、3:退款成功、4:退款处理中、5:退款异常、6:退款关闭"
  28. // @Param PaymentProject query string false "付款项目"
  29. // @Param OrderCode query string false "订单编号"
  30. // @Param KeyWord query string false "搜索关键词"
  31. // @Success Ret=200 {object} cygx.GetCygxTacticsTimeLineResp
  32. // @router /order/list [get]
  33. func (this *OrderController) OrderList() {
  34. br := new(models.BaseResponse).Init()
  35. defer func() {
  36. this.Data["json"] = br
  37. this.ServeJSON()
  38. }()
  39. sysUser := this.SysUser
  40. if sysUser == nil {
  41. br.Msg = "请登录"
  42. br.ErrMsg = "请登录,SysUser Is Empty"
  43. br.Ret = 408
  44. return
  45. }
  46. resp := new(cygx.UserOrderListResp)
  47. pageSize, _ := this.GetInt("PageSize")
  48. currentIndex, _ := this.GetInt("CurrentIndex")
  49. orderType, _ := this.GetInt("OrderType", 1)
  50. orderStatus, _ := this.GetInt("OrderStatus", -1)
  51. startDate := this.GetString("StartDate")
  52. endDate := this.GetString("EndDate")
  53. adminId := this.GetString("AdminId")
  54. shareId := this.GetString("ShareId")
  55. paymentType, _ := this.GetInt("PaymentType")
  56. orderCode := this.GetString("OrderCode")
  57. keyWord := this.GetString("KeyWord")
  58. paymentProject := this.GetString("PaymentProject")
  59. var startSize int
  60. if pageSize <= 0 {
  61. pageSize = utils.PageSize20
  62. }
  63. if currentIndex <= 0 {
  64. currentIndex = 1
  65. }
  66. startSize = utils.StartIndex(currentIndex, pageSize)
  67. var condition string
  68. var pars []interface{}
  69. if orderType > 0 { //订单类型 1:畅读卡订单,2:单场付费订单
  70. condition += ` AND order_type = ? `
  71. pars = append(pars, orderType)
  72. }
  73. if startDate != "" && endDate != "" { //时间范围
  74. condition += ` AND create_time BETWEEN ? AND ? `
  75. pars = append(pars, startDate, endDate)
  76. }
  77. if adminId != "" { //所属销售筛选
  78. condition += ` AND seller_id IN (` + adminId + `) `
  79. }
  80. if shareId != "" { //推荐人ID
  81. condition += ` AND share_id IN (` + shareId + `) `
  82. }
  83. if paymentType > 0 { // 支付渠道
  84. var tradeType string
  85. switch paymentType {
  86. case 1:
  87. tradeType = "JSAPI"
  88. case 2:
  89. tradeType = "NATIVE"
  90. case 3:
  91. tradeType = "MWEB"
  92. }
  93. condition += ` AND trade_type = ? `
  94. pars = append(pars, tradeType)
  95. }
  96. if orderStatus > -1 { //订单状态
  97. condition += ` AND order_status = ? `
  98. pars = append(pars, orderStatus)
  99. }
  100. if orderCode != "" { //订单编号
  101. orderCode = "%" + orderCode + "%"
  102. condition += ` AND order_code LIKE ? `
  103. pars = append(pars, orderCode)
  104. }
  105. if paymentProject != "" { //付款项目
  106. condition += ` AND goods_name = ? `
  107. pars = append(pars, paymentProject)
  108. }
  109. if keyWord != "" { //用户姓名,手机号
  110. keyWord = "%" + keyWord + "%"
  111. condition += ` AND (mobile LIKE ? OR real_name LIKE ? ) `
  112. pars = append(pars, keyWord, keyWord)
  113. }
  114. total, err := cygx.GetCygxOrderCount(condition, pars)
  115. if err != nil {
  116. br.Msg = "获取失败"
  117. br.ErrMsg = "获取失败,Err:" + err.Error()
  118. return
  119. }
  120. condition += " ORDER BY order_id DESC "
  121. list, err := cygx.GetCygxOrderList(condition, pars, startSize, pageSize)
  122. if err != nil {
  123. br.Msg = "获取失败"
  124. br.ErrMsg = "获取失败,Err:" + err.Error()
  125. return
  126. }
  127. var mobiles []string
  128. for _, v := range list {
  129. mobiles = append(mobiles, v.Mobile)
  130. }
  131. inviteNameMap := cygxService.GetCygxUserBusinessCardMap(mobiles) // 根据手机号获取邀请人
  132. for _, v := range list {
  133. item := new(cygx.OrderListResp)
  134. item.OrderCode = v.OrderCode
  135. item.OrderMoney = v.OrderMoney
  136. item.SourceId = v.SourceId
  137. item.Source = v.Source
  138. item.SourceTitle = v.SourceTitle
  139. switch v.Source {
  140. case utils.CYGX_OBJ_ARTICLE: //文章详情
  141. item.HttpUrl = utils.CYGX_WEB_URL + "/material/info/" + strconv.Itoa(v.SourceId)
  142. case utils.CYGX_OBJ_ACTIVITY: //活动详情
  143. item.HttpUrl = utils.CYGX_WEB_URL + "/activity/detail/" + strconv.Itoa(v.SourceId)
  144. case utils.CYGX_OBJ_YANXUANSPECIAL: //专栏详情
  145. item.HttpUrl = utils.CYGX_WEB_URL + "/column/detail/" + strconv.Itoa(v.SourceId)
  146. }
  147. item.OrderStatus = v.OrderStatus
  148. switch item.OrderStatus {
  149. case 0:
  150. item.OrderStatusText = "已取消"
  151. case 1:
  152. item.OrderStatusText = "待支付"
  153. case 2:
  154. item.OrderStatusText = "已支付"
  155. case 3:
  156. item.OrderStatusText = "退款成功"
  157. case 4:
  158. item.OrderStatusText = "退款处理中"
  159. case 5:
  160. item.OrderStatusText = "退款异常"
  161. case 6:
  162. item.OrderStatusText = "退款关闭"
  163. }
  164. //TradeType string `comment:"交易类型,枚举值:JSAPI:公众号支付 、 NATIVE:扫码支付 、 App:App支付 、 MICROPAY:付款码支付 、 MWEB:H5支付 、 FACEPAY:刷脸支付"`
  165. switch v.TradeType {
  166. case "JSAPI":
  167. item.PaymentTypeText = "小程序"
  168. case "NATIVE":
  169. item.PaymentTypeText = "PC"
  170. case "MWEB":
  171. item.PaymentTypeText = "H5"
  172. }
  173. item.UserId = v.UserId
  174. item.RealName = v.RealName
  175. item.Mobile = v.Mobile
  176. item.Email = v.Email
  177. item.CompanyId = v.CompanyId
  178. item.CompanyName = v.CompanyName
  179. item.SellerName = v.SellerName
  180. if v.ShareName != "" {
  181. item.InviteName = v.ShareName
  182. } else {
  183. item.InviteName = inviteNameMap[v.Mobile]
  184. }
  185. item.PaymentProject = v.GoodsName
  186. if v.OrderStatus != 0 && v.OrderStatus != 1 {
  187. item.PayTime = v.PayTime.Format(utils.FormatDateTime)
  188. }
  189. if orderType == 1 && v.OrderStatus != 0 && v.OrderStatus != 1 {
  190. if v.GoodsId == 1 {
  191. item.StartDate = v.StartDate.Format(utils.FormatDateTime)
  192. item.EndDate = v.EndDate.Format(utils.FormatDateTime)
  193. } else {
  194. item.StartDate = v.StartDate.Format(utils.FormatDate)
  195. item.EndDate = v.EndDate.Format(utils.FormatDate)
  196. }
  197. }
  198. item.CreateTime = v.CreateTime.Format(utils.FormatDateTime)
  199. resp.List = append(resp.List, item)
  200. }
  201. page := paging.GetPaging(currentIndex, pageSize, total)
  202. resp.Paging = page
  203. br.Ret = 200
  204. br.Success = true
  205. br.Msg = "获取成功"
  206. br.Data = resp
  207. }
  208. // @Title 退款
  209. // @Description 退款接口
  210. // @Param request body cygx.UserRemarAddReq true "type json string"
  211. // @Success 200 操作成功
  212. // @router /order/refund [post]
  213. func (this *UserController) OrderRefund() {
  214. br := new(models.BaseResponse).Init()
  215. defer func() {
  216. this.Data["json"] = br
  217. this.ServeJSON()
  218. }()
  219. sysUser := this.SysUser
  220. if sysUser == nil {
  221. br.Msg = "请登录"
  222. br.ErrMsg = "请登录,SysUser Is Empty"
  223. br.Ret = 408
  224. return
  225. }
  226. var req cygx.CygxOrderRefundReq
  227. err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
  228. if err != nil {
  229. br.Msg = "参数解析异常!"
  230. br.ErrMsg = "参数解析失败,Err:" + err.Error()
  231. return
  232. }
  233. orderCode := req.OrderCode
  234. remark := req.Remark
  235. if remark == "" {
  236. br.Msg = "请填写退款原因"
  237. return
  238. }
  239. orderDetail, err := cygx.GetCygxOrderDetailByOrderCode(orderCode)
  240. if err != nil {
  241. br.Msg = "获取失败"
  242. br.ErrMsg = "获取失败, Err:" + err.Error()
  243. return
  244. }
  245. if orderDetail.OrderStatus != 2 {
  246. br.Msg = "订单状态异常!"
  247. br.ErrMsg = "订单状态异常,orderCode:" + orderCode
  248. return
  249. }
  250. //订单状态,0:已取消、1:待支付、2:已支付、3:退款成功、4:退款处理中、5:退款异常、6:退款关闭
  251. statusCode, err := cygxService.RefundsApiService(orderDetail)
  252. var orderStatus int
  253. if statusCode == 200 && err == nil {
  254. orderStatus = 4
  255. } else {
  256. orderStatus = 5
  257. }
  258. item := new(cygx.CygxOrderRefund)
  259. item.OrderCode = orderCode
  260. item.RefundMoney = orderDetail.OrderMoney
  261. item.RefundWay = 1
  262. item.Remark = remark
  263. item.CreateTime = time.Now()
  264. item.RefundTime = time.Now()
  265. item.AdminId = sysUser.AdminId
  266. item.AdminName = sysUser.RealName
  267. err = cygx.AddCygxOrderRefund(item, orderStatus)
  268. if err != nil {
  269. br.Msg = "新增失败."
  270. br.ErrMsg = "新增失败,Err:" + err.Error()
  271. return
  272. }
  273. br.Ret = 200
  274. br.Success = true
  275. br.Msg = "操作成功"
  276. }
  277. // @Title 退款记录列表
  278. // @Description 退款记录列表接口
  279. // @Param PageSize query int true "每页数据条数"
  280. // @Param CurrentIndex query int true "当前页页码,从1开始"
  281. // @Param StartDate query string false "开始时间 ,列如2021-03-06 "
  282. // @Param EndDate query string false "结束时间,列如2021-03-06 "
  283. // @Param AdminId query string false "销售ID "
  284. // @Param ShareId query string false "推荐人ID "
  285. // @Param PaymentType query string false "支付渠道 取值范围:1微信小程序,2微信扫码支付,3微信H5支付。 "
  286. // @Param OrderType query int false "订单类型 1:畅读卡订单,2:单场付费订单"
  287. // @Param OrderStatus query int false "订单状态,0:已取消、1:待支付、2:已支付、3:退款成功、4:退款处理中、5:退款异常、6:退款关闭"
  288. // @Param PaymentProject query string false "付款项目"
  289. // @Param OrderCode query string false "订单编号"
  290. // @Param KeyWord query string false "搜索关键词"
  291. // @Success Ret=200 {object} cygx.GetCygxTacticsTimeLineResp
  292. // @router /order/refund/list [get]
  293. func (this *OrderController) OrderRefundList() {
  294. br := new(models.BaseResponse).Init()
  295. defer func() {
  296. this.Data["json"] = br
  297. this.ServeJSON()
  298. }()
  299. sysUser := this.SysUser
  300. if sysUser == nil {
  301. br.Msg = "请登录"
  302. br.ErrMsg = "请登录,SysUser Is Empty"
  303. br.Ret = 408
  304. return
  305. }
  306. resp := new(cygx.UserOrderListResp)
  307. pageSize, _ := this.GetInt("PageSize")
  308. currentIndex, _ := this.GetInt("CurrentIndex")
  309. orderType, _ := this.GetInt("OrderType", 1)
  310. orderStatus, _ := this.GetInt("OrderStatus", -1)
  311. startDate := this.GetString("StartDate")
  312. endDate := this.GetString("EndDate")
  313. adminId := this.GetString("AdminId")
  314. shareId := this.GetString("ShareId")
  315. paymentType, _ := this.GetInt("PaymentType")
  316. orderCode := this.GetString("OrderCode")
  317. keyWord := this.GetString("KeyWord")
  318. paymentProject := this.GetString("PaymentProject")
  319. var startSize int
  320. if pageSize <= 0 {
  321. pageSize = utils.PageSize20
  322. }
  323. if currentIndex <= 0 {
  324. currentIndex = 1
  325. }
  326. startSize = utils.StartIndex(currentIndex, pageSize)
  327. var condition string
  328. var pars []interface{}
  329. condition += ` AND order_status IN (3,4,5,6) `
  330. if orderType > 0 { //订单类型 1:畅读卡订单,2:单场付费订单
  331. condition += ` AND order_type = ? `
  332. pars = append(pars, orderType)
  333. }
  334. if startDate != "" && endDate != "" { //时间范围
  335. condition += ` AND create_time BETWEEN ? AND ? `
  336. pars = append(pars, startDate, endDate)
  337. }
  338. if adminId != "" { //所属销售筛选
  339. condition += ` AND seller_id IN (` + adminId + `) `
  340. }
  341. if shareId != "" { //推荐人ID
  342. condition += ` AND share_id IN (` + shareId + `) `
  343. }
  344. if paymentType > 0 { // 支付渠道
  345. var tradeType string
  346. switch paymentType {
  347. case 1:
  348. tradeType = "JSAPI"
  349. case 2:
  350. tradeType = "NATIVE"
  351. case 3:
  352. tradeType = "MWEB"
  353. }
  354. condition += ` AND trade_type = ? `
  355. pars = append(pars, tradeType)
  356. }
  357. if orderStatus > -1 { //订单状态
  358. condition += ` AND order_status = ? `
  359. pars = append(pars, orderStatus)
  360. }
  361. if orderCode != "" { //订单编号
  362. orderCode = "%" + orderCode + "%"
  363. condition += ` AND order_code LIKE ? `
  364. pars = append(pars, orderCode)
  365. }
  366. if paymentProject != "" { //付款项目
  367. condition += ` AND goods_name = ? `
  368. pars = append(pars, paymentProject)
  369. }
  370. if keyWord != "" { //用户姓名,手机号
  371. keyWord = "%" + keyWord + "%"
  372. condition += ` AND (mobile LIKE ? OR real_name LIKE ? ) `
  373. pars = append(pars, keyWord, keyWord)
  374. }
  375. total, err := cygx.GetCygxOrderCount(condition, pars)
  376. if err != nil {
  377. br.Msg = "获取失败"
  378. br.ErrMsg = "获取失败,Err:" + err.Error()
  379. return
  380. }
  381. condition += " ORDER BY order_id DESC "
  382. list, err := cygx.GetCygxOrderList(condition, pars, startSize, pageSize)
  383. if err != nil {
  384. br.Msg = "获取失败"
  385. br.ErrMsg = "获取失败,Err:" + err.Error()
  386. return
  387. }
  388. var mobiles []string
  389. for _, v := range list {
  390. mobiles = append(mobiles, v.Mobile)
  391. }
  392. inviteNameMap := cygxService.GetCygxUserBusinessCardMap(mobiles) // 根据手机号获取邀请人
  393. for _, v := range list {
  394. item := new(cygx.OrderListResp)
  395. item.OrderCode = v.OrderCode
  396. item.OrderMoney = v.OrderMoney
  397. item.SourceId = v.SourceId
  398. item.Source = v.Source
  399. item.SourceTitle = v.SourceTitle
  400. switch v.Source {
  401. case utils.CYGX_OBJ_ARTICLE: //文章详情
  402. item.HttpUrl = utils.CYGX_WEB_URL + "/material/info/" + strconv.Itoa(v.SourceId)
  403. case utils.CYGX_OBJ_ACTIVITY: //活动详情
  404. item.HttpUrl = utils.CYGX_WEB_URL + "/activity/detail/" + strconv.Itoa(v.SourceId)
  405. case utils.CYGX_OBJ_YANXUANSPECIAL: //专栏详情
  406. item.HttpUrl = utils.CYGX_WEB_URL + "/column/detail/" + strconv.Itoa(v.SourceId)
  407. }
  408. //OrderStatus int `comment:"订单状态,0:已取消、1:待支付、2:已支付、3:退款成功、4:退款处理中、5:退款异常、6:退款关闭"`
  409. item.OrderStatus = v.OrderStatus
  410. switch item.OrderStatus {
  411. case 3:
  412. item.OrderStatusText = "退款成功"
  413. case 4:
  414. item.OrderStatusText = "退款处理中"
  415. case 5:
  416. item.OrderStatusText = "退款异常"
  417. case 6:
  418. item.OrderStatusText = "退款关闭"
  419. }
  420. //TradeType string `comment:"交易类型,枚举值:JSAPI:公众号支付 、 NATIVE:扫码支付 、 App:App支付 、 MICROPAY:付款码支付 、 MWEB:H5支付 、 FACEPAY:刷脸支付"`
  421. switch v.TradeType {
  422. case "JSAPI":
  423. item.PaymentTypeText = "小程序"
  424. case "NATIVE":
  425. item.PaymentTypeText = "PC"
  426. case "MWEB":
  427. item.PaymentTypeText = "H5"
  428. }
  429. item.UserId = v.UserId
  430. item.RealName = v.RealName
  431. item.Mobile = v.Mobile
  432. item.Email = v.Email
  433. item.CompanyId = v.CompanyId
  434. item.CompanyName = v.CompanyName
  435. item.SellerName = v.SellerName
  436. if v.ShareName != "" {
  437. item.InviteName = v.ShareName
  438. } else {
  439. item.InviteName = inviteNameMap[v.Mobile]
  440. }
  441. item.PaymentProject = v.GoodsName
  442. item.RefundTime = v.RefundTime.Format(utils.FormatDateTime)
  443. item.RefundRemark = v.RefundRemark
  444. //if v.OrderStatus == 2 {
  445. item.PayTime = v.PayTime.Format(utils.FormatDateTime)
  446. //}
  447. if orderType == 1 {
  448. if v.GoodsId == 1 {
  449. item.StartDate = v.StartDate.Format(utils.FormatDateTime)
  450. item.EndDate = v.EndDate.Format(utils.FormatDateTime)
  451. } else {
  452. item.StartDate = v.StartDate.Format(utils.FormatDate)
  453. item.EndDate = v.EndDate.Format(utils.FormatDate)
  454. }
  455. }
  456. item.CreateTime = v.CreateTime.Format(utils.FormatDateTime)
  457. resp.List = append(resp.List, item)
  458. }
  459. page := paging.GetPaging(currentIndex, pageSize, total)
  460. resp.Paging = page
  461. br.Ret = 200
  462. br.Success = true
  463. br.Msg = "获取成功"
  464. br.Data = resp
  465. }
  466. // @Title 退款撤销
  467. // @Description 退款撤销接口
  468. // @Param request body cygx.UserRemarAddReq true "type json string"
  469. // @Success 200 操作成功
  470. // @router /order/refund_revoke [post]
  471. func (this *UserController) OrderRefundRevoke() {
  472. br := new(models.BaseResponse).Init()
  473. defer func() {
  474. this.Data["json"] = br
  475. this.ServeJSON()
  476. }()
  477. sysUser := this.SysUser
  478. if sysUser == nil {
  479. br.Msg = "请登录"
  480. br.ErrMsg = "请登录,SysUser Is Empty"
  481. br.Ret = 408
  482. return
  483. }
  484. var req cygx.CygxOrderRefundReq
  485. err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
  486. if err != nil {
  487. br.Msg = "参数解析异常!"
  488. br.ErrMsg = "参数解析失败,Err:" + err.Error()
  489. return
  490. }
  491. orderCode := req.OrderCode
  492. orderDetail, err := cygx.GetCygxOrderDetailByOrderCode(orderCode)
  493. if err != nil {
  494. br.Msg = "获取失败"
  495. br.ErrMsg = "获取失败, Err:" + err.Error()
  496. return
  497. }
  498. if orderDetail.OrderStatus != 4 {
  499. br.Msg = "订单状态异常!"
  500. br.ErrMsg = "订单状态异常,orderCode:" + orderCode
  501. return
  502. }
  503. item := new(cygx.CygxOrderAction)
  504. item.Action = "关闭退款"
  505. item.OrderStatus = 6
  506. item.OrderStatusText = "关闭退款"
  507. item.OrderCode = orderDetail.OrderCode
  508. item.UserId = orderDetail.UserId
  509. item.RealName = orderDetail.RealName
  510. item.Mobile = orderDetail.Mobile
  511. item.Email = orderDetail.Email
  512. item.CompanyId = orderDetail.CompanyId
  513. item.CompanyName = orderDetail.CompanyName
  514. item.SellerName = orderDetail.SellerName
  515. item.CreateTime = time.Now()
  516. item.ModifyTime = time.Now()
  517. item.AdminId = sysUser.AdminId
  518. item.AdminName = sysUser.RealName
  519. err = cygx.AddCygxOrderRefundRevoke(item)
  520. if err != nil {
  521. br.Msg = "新增失败."
  522. br.ErrMsg = "新增失败,Err:" + err.Error()
  523. return
  524. }
  525. br.Ret = 200
  526. br.Success = true
  527. br.Msg = "操作成功"
  528. }