index.jsx 17KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457
  1. import React, { useState, useEffect } from "react";
  2. // import { AtSwipeAction } from "taro-ui";
  3. import Taro, { useDidShow, AtSwipeAction } from "@tarojs/taro";
  4. import { getOrderSub, deleteOrder } from "@/services/payOrder";
  5. import formatTime from "@/utils/formatTime";
  6. import food from "@/assets/icons/ProCard/food.png";
  7. import ProCard_hot from "@/assets/icons/ProCard/ProCard_hot.png";
  8. import refund from "@/assets/icons/GuideCheck/refund.png";
  9. import NoData from '@/components/NoData'
  10. import Evaluation from "@/assets/icons/UserCenter/Evaluation.png";
  11. import Null from "@/assets/icons/UserCenter/null_logo.png";
  12. import QRcode from "@/assets/icons/UserCenter/QRcode.png";
  13. import Pay from "@/assets/icons/GuideCheck/Pay_logo.png";
  14. import starOn from "@/assets/icons/GuideCheck/starOn.png";
  15. import starOff from "@/assets/icons/GuideCheck/starOff.png";
  16. import ico_delete from '../../../assets/icons/ProCard/ico_delete.png'
  17. import AlreadyUsed from "../AlreadyUsed";
  18. import TobeWritten from "../TobeWritten";
  19. import "./style.less";
  20. const scoreList = new Array(5).fill(0);
  21. const score = "3.9";
  22. const dict = {
  23. 0: { status: 0, isVerified: 0 },
  24. 1: { status: 1, isVerified: 0 },
  25. 2: { isVerified: 1 },
  26. 3: { status: 9, isVerified: 0 },
  27. };
  28. export default (props) => {
  29. const { type } = props;
  30. const [list, setList] = useState([]);
  31. const [IsPull, setPull] = useState(false);
  32. const [pageNum, setNumber] = useState(1);
  33. const [HasNextPage, setHasNextPage] = useState(true);
  34. useDidShow(() => {
  35. setNumber(1)
  36. })
  37. useEffect(() => {
  38. if (pageNum) {
  39. getList();
  40. }
  41. }, [pageNum]);
  42. const pageRefresh = () => {
  43. // 页面下拉刷新回调
  44. setPull(true);
  45. };
  46. const getList = () => {
  47. setHasNextPage(false);
  48. getOrderSub({
  49. pageNum,
  50. pageSize: 10,
  51. isVerified: '',
  52. ...(type !== undefined ? dict[type] : null),
  53. }).then((res) => {
  54. setList(
  55. pageNum === 1 ? res.records || [] : list.concat(res.records || [])
  56. );
  57. setHasNextPage(res.current < res.pages);
  58. setPull(false);
  59. });
  60. };
  61. const pageLoadMore = () => {
  62. // 页面上拉加载更多
  63. if (HasNextPage) {
  64. setNumber(pageNum + 1);
  65. }
  66. };
  67. const [show, setShow] = useState(false)
  68. const [showCutover, setShowCutover] = useState(false)
  69. const onClose = () => {
  70. setShowCutover(false)
  71. }
  72. //评价
  73. const evaluation = () => {
  74. setShowCutover(true)
  75. }
  76. useEffect(() => {
  77. // 下拉刷新触发
  78. if (IsPull) {
  79. if (pageNum === 1) {
  80. getList();
  81. } else {
  82. setNumber(1);
  83. }
  84. }
  85. }, [IsPull]);
  86. //核销
  87. const onWriteOff = (item) => {
  88. // 本地测试用
  89. // Taro.navigateTo({
  90. // url: `/pages/details/foodDetails/foodDetails?id=${item.shopId}&subOrderId=${item.subOrderId}`,
  91. // });
  92. Taro.scanCode({
  93. onlyFromCamera: true,
  94. success: (res) => {
  95. if (res.path) {
  96. Taro.navigateTo({
  97. url: `/${res.path}&subOrderId=${item.subOrderId}`,
  98. });
  99. } else {
  100. Taro.showToast({
  101. title: "非当前小程序生成二维码",
  102. icon: "none",
  103. duration: 2000,
  104. });
  105. }
  106. },
  107. fail: (err) => {
  108. },
  109. });
  110. };
  111. const slideButtonTap = (e) => {
  112. deleteOrder(e.orderId || '').then(() => {
  113. Taro.showToast({
  114. title: '删除订单成功',
  115. icon: 'none',
  116. })
  117. getList();
  118. })
  119. }
  120. const button = [{
  121. // type: 'warn',
  122. // text: '删除',
  123. extClass: 'test-button',
  124. src: ico_delete
  125. }]
  126. return (
  127. <scroll-view
  128. scrollY
  129. style='height: 90vh;'
  130. refresher-enabled
  131. refresher-triggered={IsPull}
  132. onrefresherrefresh={pageRefresh}
  133. refresher-background='#fff'
  134. onscrolltolower={pageLoadMore}
  135. >
  136. {
  137. list.length == 0 ?
  138. <NoData /> :
  139. <view className='complete-boxs'>
  140. <AlreadyUsed showCutover={showCutover} maskClosable={showCutover} onClose={onClose} list={list} />
  141. {list.map((item, index) => {
  142. /* 待支付 */
  143. if (item.status === 0) {
  144. return (
  145. <mp-slideview buttons={button} onButtontap={() => slideButtonTap(item)} icon >
  146. <view key={`${type}-${item.orderId}`} >
  147. <view className='OrderNumber'>订单编号:{item.orderId}</view>
  148. {/* <TobePaid item={item} /> */}
  149. <view class='wrapper'>
  150. <view class='left-complete-one'>
  151. <image className='left-image-1' src={ProCard_hot}></image>
  152. <view className='left-viewText'>
  153. 返现¥{(item.cashback / 100).toFixed(2)}
  154. </view>
  155. <view className='title-image'>
  156. <image
  157. className='image-1'
  158. mode='scaleToFill'
  159. src={item.poster || []}
  160. ></image>
  161. <image className='image-2' src={food}></image>
  162. </view>
  163. <view className='title-content'>
  164. <view className='Pro-title'>
  165. <view className='title-text'>
  166. {item.packageDescription}
  167. <text className='title-money-2'>
  168. 数量:{item.amount}张
  169. </text>
  170. </view>
  171. </view>
  172. <text className='title-money'>
  173. ¥{(item.unitPrice / 100).toFixed(2)}元
  174. </text>
  175. <view className='title-time'>
  176. 有效期:{formatTime(item?.startTime, "yyyy/MM/dd")}-
  177. {formatTime(item.endTime, "yyyy/MM/dd")}
  178. </view>
  179. </view>
  180. </view>
  181. <view class='right-complete-two'>
  182. <view
  183. className='right-content'
  184. onClick={() => {
  185. Taro.navigateTo({
  186. url: `/pages/PayOrder/index?orderId=${item.orderId}`,
  187. });
  188. }}
  189. >
  190. <image className='right-image' src={Pay} />
  191. <view className='right-title'>支付</view>
  192. </view>
  193. </view>
  194. </view>
  195. </view>
  196. </mp-slideview>
  197. );
  198. }
  199. /* 待核销 */
  200. if (item.status === 1 && item.isVerified == 0) {
  201. return (
  202. <view key={`${type}-${item.orderId}`}>
  203. <view className='OrderNumber'>订单编号:{item.orderId}</view>
  204. {/* <TobeWritten item={item} onWrite={onWriteOff} /> */}
  205. <view class='wrapper'>
  206. <view class='left-complete-one'>
  207. <image className='left-image-1' src={ProCard_hot}></image>
  208. <view className='left-viewText'>
  209. 返现¥{(item.cashback / 100).toFixed(2)}
  210. </view>
  211. <view className='title-image'>
  212. <image
  213. className='image-1'
  214. mode='scaleToFill'
  215. src={item.poster || []}
  216. ></image>
  217. <image className='image-2' src={food}></image>
  218. </view>
  219. <view className='title-content'>
  220. <view className='Pro-title'>
  221. <view className='title-text'>
  222. {item.packageDescription}
  223. <text className='title-money-2'>
  224. 数量:{item.amount}张
  225. </text>
  226. </view>
  227. </view>
  228. <text className='title-money'>
  229. ¥{(item.unitPrice / 100).toFixed(2)}元
  230. </text>
  231. <view className='title-time'>
  232. 有效期:{formatTime(item?.startTime, "yyyy/MM/dd")}-
  233. {formatTime(item.endTime, "yyyy/MM/dd")}
  234. </view>
  235. </view>
  236. </view>
  237. <view class='right-complete-two'>
  238. <view
  239. className='right-content'
  240. onClick={() => onWriteOff(item)}
  241. >
  242. <image className='right-image' src={QRcode} />
  243. <view className='right-title'>扫码核销</view>
  244. </view>
  245. </view>
  246. </view>
  247. </view>
  248. );
  249. }
  250. /* 已退费 */
  251. if (item.status === 2 && item.isVerified == 0) {
  252. return (
  253. <view key={`${type}-${item.orderId}`}>
  254. <view className='OrderNumber'>订单编号:{item.orderId}</view>
  255. <view class='wrapper'>
  256. <view class='left-complete-one'>
  257. <image className='left-image-1' src={ProCard_hot}></image>
  258. <view className='left-viewText'>
  259. 返现¥{(item.cashback / 100).toFixed(2)}
  260. </view>
  261. <view className='title-image'>
  262. <image
  263. className='image-1'
  264. mode='scaleToFill'
  265. src={item.poster || []}
  266. ></image>
  267. <image className='image-2' src={food}></image>
  268. </view>
  269. <view className='title-content'>
  270. <view className='Pro-title'>
  271. <view className='title-text'>
  272. {item.packageDescription}
  273. <text className='title-money-2'>
  274. 数量:{item.amount}张
  275. </text>
  276. </view>
  277. </view>
  278. <text className='title-money'>
  279. ¥{(item.unitPrice / 100).toFixed(2)}元
  280. </text>
  281. <view className='title-time'>
  282. 有效期:{formatTime(item?.startTime, "yyyy/MM/dd")}-
  283. {formatTime(item.endTime, "yyyy/MM/dd")}
  284. </view>
  285. </view>
  286. </view>
  287. <view class='right-complete-two'>
  288. <view className='right-content'>
  289. <image className='right-image-2' src={refund} />
  290. </view>
  291. </view>
  292. </view>
  293. </view>
  294. );
  295. }
  296. /* 已过期 */
  297. if (item.status === 9) {
  298. return (
  299. <view key={`${type}-${item.orderId}`}>
  300. <view className='OrderNumber'>订单编号:{item.orderId}</view>
  301. <view class='wrapper'>
  302. <view class='left-complete-one'>
  303. <image className='left-image-1' src={ProCard_hot}></image>
  304. <view className='left-viewText'>
  305. 返现¥{(item.cashback / 100).toFixed(2)}
  306. </view>
  307. {/* 评分 */}
  308. <view className='card-box-star'>
  309. {scoreList.map((_, index) => {
  310. const src = index + 1 <= item.score ? starOn : starOff;
  311. return (
  312. <image
  313. className='card-star-image'
  314. key={index}
  315. src={src}
  316. />
  317. );
  318. })}
  319. <text className='card-star-text'>{item.score}</text>
  320. </view>
  321. <view className='title-image'>
  322. <image
  323. className='image-1'
  324. mode='scaleToFill'
  325. src={item.poster || []}
  326. ></image>
  327. <image className='image-2' src={food}></image>
  328. </view>
  329. <view className='title-content'>
  330. <view className='Pro-title'>
  331. <view className='title-text'>
  332. {item.packageDescription}
  333. <text className='title-money-2'>
  334. 数量:{item.amount}张
  335. </text>
  336. </view>
  337. </view>
  338. <text className='title-money'>
  339. ¥{(item.unitPrice / 100).toFixed(2)}元
  340. </text>
  341. <view className='title-time'>
  342. 有效期:{formatTime(item?.startTime, "yyyy/MM/dd")}-
  343. {formatTime(item.endTime, "yyyy/MM/dd")}
  344. </view>
  345. </view>
  346. </view>
  347. <view class='right-complete-two'>
  348. <view className='right-content'>
  349. <image className='right-image-2' src={Null} />
  350. </view>
  351. </view>
  352. </view>
  353. </view>
  354. );
  355. }
  356. /* 已使用 */
  357. if (item.isVerified == 1) {
  358. return (
  359. <view key={`${type}-${item.orderId}`}>
  360. <view className='OrderNumber'>订单编号:{item.orderId}</view>
  361. <view class='wrapper'>
  362. <view class='left-complete-one'>
  363. <image className='left-image-1' src={ProCard_hot}></image>
  364. <view className='left-viewText'>
  365. 返现¥{(item.cashback / 100).toFixed(2)}
  366. </view>
  367. {/* 评分 */}
  368. <view className='card-box-star'>
  369. {scoreList.map((_, index) => {
  370. const src = index + 1 <= item.score ? starOn : starOff;
  371. return (
  372. <image
  373. className='card-star-image'
  374. key={index}
  375. src={src}
  376. />
  377. );
  378. })}
  379. <text className='card-star-text'>{item.score}</text>
  380. </view>
  381. <view className='title-image'>
  382. <image
  383. className='image-1'
  384. mode='scaleToFill'
  385. src={item.poster || []}
  386. ></image>
  387. <image className='image-2' src={food}></image>
  388. </view>
  389. <view className='title-content'>
  390. <view className='Pro-title'>
  391. <view className='title-text'>
  392. {item.packageDescription}
  393. <text className='title-money-2'>
  394. 数量:{item.amount}张
  395. </text>
  396. </view>
  397. </view>
  398. <text className='title-money'>
  399. ¥{(item.unitPrice / 100).toFixed(2)}元
  400. </text>
  401. <view className='title-time'>
  402. 核销时间:{" "}
  403. {formatTime(item.verifiedDate, "yyyy/MM/dd hh:mm")}
  404. </view>
  405. </view>
  406. </view>
  407. <view class='right-complete-two' onClick={() => evaluation()} >
  408. <view className='right-content'>
  409. <image className='right-image' src={Evaluation} />
  410. <view className='right-title'>评价</view>
  411. </view>
  412. </view>
  413. </view>
  414. </view>
  415. );
  416. }
  417. })}
  418. <view className='foot'>这是我的底线</view>
  419. </view>
  420. }
  421. </scroll-view>
  422. );
  423. };
  424. // {/* 待核销 */}
  425. // {/* 待支付 */}
  426. // {/* 已过期 */}