approvalTaskDetail.vue 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853
  1. <template>
  2. <view class="container">
  3. <view class="status-bar" :style="{ height: statusBarHeight + 'px' }"></view>
  4. <view class="top">
  5. <image class="return" @click="goBack" src="/static/image/back_white.png"></image>
  6. <text>任务详情</text>
  7. </view>
  8. <scroll-view class="content" scroll-y>
  9. <!-- 任务卡片 -->
  10. <view class="task-card" v-if="auditData">
  11. <view class="card-header">
  12. <view class="card-title">{{ auditData.projectVO.projectName||'-' }}</view>
  13. <view class="card-lable" :class="'pending'">待审核</view>
  14. </view>
  15. <view class="card-meta">
  16. <view class="item">
  17. <image src="/static/image/icon_user.png"></image>
  18. {{ auditData.AuditTaskInfoVO.companyUserName||'-' }}</view>
  19. <view class="item">
  20. <image src="/static/image/icon_time.png"></image>
  21. {{ auditData.projectVO.startDate||'-' }}</view>
  22. </view>
  23. </view>
  24. <!-- 任务信息 -->
  25. <view class="info-section" v-if="auditData">
  26. <view class="section-header">
  27. <view class="section-indicator"></view>
  28. <text class="section-title">任务信息</text>
  29. </view>
  30. <view class="info-list">
  31. <view class="info-item">
  32. <text class="info-label">任务名称</text>
  33. <text class="info-value">{{ auditData.audit.projectName }}</text>
  34. </view>
  35. <view class="info-item">
  36. <text class="info-label">任务类型</text>
  37. <text class="info-value">{{ auditData.audit.projectName }}</text>
  38. </view>
  39. <view class="info-item">
  40. <text class="info-label">归属部门</text>
  41. <text class="info-value">{{ auditData.audit.deptName }}</text>
  42. </view>
  43. </view>
  44. </view>
  45. <!-- 项目信息 -->
  46. <view class="info-section" v-if="auditData.projectVO">
  47. <view class="section-header">
  48. <view class="section-indicator"></view>
  49. <text class="section-title">项目信息</text>
  50. </view>
  51. <view class="info-list">
  52. <view class="info-item">
  53. <text class="info-label">项目名称</text>
  54. <text class="info-value">{{ auditData.projectVO.projectName }}</text>
  55. </view>
  56. <view class="info-item">
  57. <text class="info-label">项目活动ID</text>
  58. <text class="info-value">{{ auditData.projectVO.projectTypeId }}</text>
  59. </view>
  60. <!-- <view class="info-item">
  61. <text class="info-label">任务备注</text>
  62. <text class="info-value">{{ auditData.projectVO.thirdPartyCode }}</text>
  63. </view> -->
  64. </view>
  65. </view>
  66. <!-- 客户信息 -->
  67. <view class="info-section" v-if="auditData.docterVO">
  68. <view class="section-header">
  69. <view class="section-indicator"></view>
  70. <text class="section-title">客户信息</text>
  71. </view>
  72. <view class="client-list">
  73. <view class="client-item">
  74. <view class="client-info">
  75. <image class="avatar" src="/static/image/my_heads_icon.png"></image>
  76. <view class="client-txt">
  77. <view class="client-name">
  78. {{ auditData.docterVO.doctorName }}
  79. <text class="client-level">一级</text>
  80. </view>
  81. <view class="client-hospital">
  82. <text>{{ auditData.docterVO.institution }} </text>
  83. <view class="line"></view>
  84. <text>{{ auditData.docterVO.department || '-' }}</text>
  85. </view>
  86. </view>
  87. </view>
  88. <view class="client-stats">
  89. <view class="stat-item"><text class="num">{{ auditData.auditTaskInfoVO.taskCount }} </text>任务</view>
  90. <view class="stat-item"><text class="num">{{ auditData.auditTaskInfoVO.taskIntegral }} </text>积分</view>
  91. </view>
  92. </view>
  93. </view>
  94. </view>
  95. <!-- 审批信息 -->
  96. <view class="info-section" v-if="auditData">
  97. <view class="section-header">
  98. <view class="section-indicator"></view>
  99. <text class="section-title">审批流程</text>
  100. </view>
  101. <view class="approval-list">
  102. <view class="approval-item" v-for="(item, index) in auditData.auditFlows" :key="index">
  103. <view class="left">
  104. <view class="avatar-box">
  105. <image class="avatar" src="/static/image/my_heads_icon.png"></image>
  106. <image class="icon" v-if="item.status==1" src="/static/image/icon_wait.png"></image>
  107. <image class="icon" v-if="item.status==0" src="/static/image/icon_pass.png"></image>
  108. <image class="icon" v-if="item.status==2" src="/static/image/icon_refuse.png"></image>
  109. </view>
  110. <view class="approval-user">
  111. <view class="user-name">{{ item.auditUserName }}</view>
  112. <view class="user-status" :style="{ color: item.status === 0 ? '#4CAF50' : item.status === 1 ? '#FF9800' : '#F44336' }">{{ item.statusName }}</view>
  113. </view>
  114. </view>
  115. <text class="approval-time">{{ item.auditTime || '' }}</text>
  116. <view class="approval-line" v-if="index < auditData.auditFlows.length - 1"></view>
  117. </view>
  118. </view>
  119. </view>
  120. </scroll-view>
  121. <view class="bottom-bar">
  122. <view class="action-buttons">
  123. <view class="btn btn-cancel" @click="openRejectPopup">
  124. <image class="icon" src="/static/image/icon_approval_no.png"></image>
  125. <text>驳回</text>
  126. </view>
  127. <view class="btn btn-submit" @click="handleNext">
  128. <image class="icon" src="/static/image/icon_approval_yes.png"></image>
  129. <text>通过</text>
  130. </view>
  131. </view>
  132. </view>
  133. <!-- 驳回弹窗 -->
  134. <u-popup :show="showRejectPopup" mode="bottom" round="24" z-index="9999999">
  135. <view class="reject-popup-content">
  136. <view class="popup-header">
  137. <text class="popup-title">驳回</text>
  138. <image @click="showRejectPopup = false;" class="close" src="/static/image/icon_close.png"></image>
  139. </view>
  140. <view class="input-area">
  141. <textarea v-model="rejectReason" placeholder="请输入驳回意见" class="reason-input" :auto-height="true"
  142. maxlength="200" />
  143. </view>
  144. <view class="btn-group">
  145. <view class="button reject" @click="showRejectPopup = false">取消</view>
  146. <view class="button confirm" @click="handleConfirmReject ">确认驳回</view>
  147. </view>
  148. </view>
  149. </u-popup>
  150. </view>
  151. </template>
  152. <script>
  153. import { doAudit, getAuditFlows, getTaskFinishAuditInfo ,detail} from '@/api/audit.js'
  154. import image from 'uview-ui/libs/config/props/image';
  155. export default {
  156. data() {
  157. return {
  158. userInfo:JSON.parse(uni.getStorageSync('userInfo')),
  159. // 弹窗默认隐藏
  160. showRejectPopup: false,
  161. // 驳回意见
  162. rejectReason: '',
  163. // 状态栏高度
  164. statusBarHeight: uni.getSystemInfoSync().statusBarHeight,
  165. // 任务ID
  166. taskId: '',
  167. // 接口返回的原始数据
  168. auditData: null,
  169. // 审批信息
  170. approvalInfo: []
  171. }
  172. },
  173. onLoad(options) {
  174. if (options.taskId) {
  175. this.taskId = options.taskId
  176. this.loadData()
  177. }
  178. },
  179. methods: {
  180. // 打开驳回弹窗
  181. openRejectPopup() {
  182. // 直接打开驳回弹窗
  183. this.showRejectPopup = true
  184. },
  185. // 确认驳回
  186. async handleConfirmReject() {
  187. if (!this.rejectReason.trim()) {
  188. uni.showToast({
  189. title: '请输入驳回意见',
  190. icon: 'none'
  191. })
  192. return
  193. }
  194. try {
  195. uni.showLoading({
  196. title: '提交中...'
  197. })
  198. // 调用审核接口,传递action=2表示驳回
  199. const res = await doAudit({
  200. auditId: this.taskId,
  201. userId: this.userInfo.userId,
  202. userType: 0,
  203. action: 2,
  204. comment: this.rejectReason,
  205. companyId: this.userInfo.companyId
  206. })
  207. uni.hideLoading()
  208. if (res.code === 200) {
  209. uni.showToast({
  210. title: res.data.message,
  211. icon: none
  212. })
  213. // 关闭弹窗
  214. this.showRejectPopup = false
  215. // 重置输入
  216. this.rejectReason = ''
  217. // 重新加载数据
  218. this.loadData()
  219. } else {
  220. uni.showToast({
  221. title: res.msg || '驳回失败',
  222. icon: 'none'
  223. })
  224. }
  225. } catch (e) {
  226. uni.hideLoading()
  227. console.error('驳回失败', e)
  228. uni.showToast({
  229. title: '驳回失败,请稍后重试',
  230. icon: 'none'
  231. })
  232. }
  233. },
  234. // 返回上一页
  235. goBack() {
  236. uni.navigateBack()
  237. },
  238. // 加载数据
  239. async loadData() {
  240. try {
  241. uni.showLoading({
  242. title: '加载中...'
  243. })
  244. // 获取审批流程信息
  245. // const auditFlowsRes = await getAuditFlows({
  246. // auditId: this.taskId,
  247. // userId: this.userInfo.userId,
  248. // userType: this.userInfo.userType,
  249. // action: 0,
  250. // comment: "comment_3498cb3111a7",
  251. // companyId: this.userInfo.companyId
  252. // })
  253. // if (auditFlowsRes.code === 200) {
  254. // console.log('审批流程信息:', auditFlowsRes.data)
  255. // this.approvalInfo = auditFlowsRes.data || []
  256. // }
  257. // 获取任务完成审核信息
  258. const taskFinishAuditRes = await detail({ auditId: this.taskId })
  259. if (taskFinishAuditRes.code === 200) {
  260. // 直接保存接口返回的原始数据
  261. console.log('任务完成审核信息:', taskFinishAuditRes.data)
  262. this.auditData = taskFinishAuditRes.data
  263. }
  264. // 实际项目中替换为接口请求:const res = await getTaskDetail({ id: this.taskId })
  265. // 这里模拟接口赋值
  266. uni.hideLoading()
  267. } catch (e) {
  268. uni.hideLoading()
  269. console.error('加载数据失败', e)
  270. }
  271. },
  272. // 复制到剪贴板
  273. copyToClipboard(text) {
  274. uni.setClipboardData({
  275. data: text,
  276. success() {
  277. uni.showToast({
  278. title: '复制成功',
  279. icon: 'success'
  280. })
  281. }
  282. })
  283. },
  284. // 下载附件
  285. downloadAttachment() {
  286. uni.showToast({
  287. title: '开始下载附件',
  288. icon: 'none'
  289. })
  290. // 实际项目中添加下载逻辑:uni.downloadFile + uni.saveFile
  291. },
  292. // 备用方法(实际用openRejectPopup)
  293. handlePrev() {
  294. this.openRejectPopup()
  295. },
  296. // 审批通过
  297. async handleNext() {
  298. try {
  299. uni.showLoading({
  300. title: '提交中...'
  301. })
  302. // 调用审核接口,传递action=1表示通过
  303. const res = await doAudit({
  304. auditId: this.taskId,
  305. userId: this.userInfo.userId,
  306. userType: 0,
  307. action: 1,
  308. comment: "",
  309. companyId: this.userInfo.companyId
  310. })
  311. uni.hideLoading()
  312. if (res.code === 200) {
  313. uni.showToast({
  314. title: res.data.message,
  315. icon: none
  316. })
  317. // 重新加载数据
  318. this.loadData()
  319. } else {
  320. uni.showToast({
  321. title: res.msg || '审批通过失败',
  322. icon: 'none'
  323. })
  324. }
  325. } catch (e) {
  326. uni.hideLoading()
  327. console.error('审批通过失败', e)
  328. uni.showToast({
  329. title: '审批通过失败,请稍后重试',
  330. icon: 'none'
  331. })
  332. }
  333. }
  334. }
  335. }
  336. </script>
  337. <style lang="scss" scoped>
  338. // 弹窗样式
  339. .reject-popup-content {
  340. padding: 32rpx;
  341. box-sizing: border-box;
  342. overflow: hidden;
  343. border-radius: 24rpx 24rpx 0 0;
  344. .popup-header {
  345. display: flex;
  346. justify-content: center;
  347. align-items: center;
  348. margin-bottom: 32rpx;
  349. position: relative;
  350. .popup-title {
  351. font-size: 32rpx;
  352. font-weight: bold;
  353. color: #333;
  354. }
  355. .close {
  356. position: absolute;
  357. right: 0;
  358. width: 44rpx;
  359. height: 44rpx;
  360. }
  361. }
  362. .input-area {
  363. margin-bottom: 40rpx;
  364. .reason-input {
  365. min-height: 120rpx;
  366. padding: 20rpx;
  367. background: #F7F8FA;
  368. border-radius: 12rpx;
  369. font-size: 28rpx;
  370. color: #333;
  371. width: 100%; // 新增:确保输入框宽度100%
  372. box-sizing: border-box;
  373. }
  374. }
  375. .btn-group {
  376. display: flex;
  377. gap: 24rpx;
  378. .button {
  379. width: 332rpx;
  380. height: 80rpx;
  381. flex: 1;
  382. border-radius: 200rpx;
  383. font-size: 28rpx;
  384. text-align: center;
  385. line-height: 80rpx;
  386. }
  387. .reject {
  388. color: #388BFF;
  389. background: #FFFFFF;
  390. border-radius: 200rpx 200rpx 200rpx 200rpx;
  391. border: 2rpx solid #388BFF;
  392. }
  393. .confirm {
  394. background: #388BFF;
  395. color: #FFFFFF;
  396. }
  397. }
  398. }
  399. // 原有样式
  400. .container {
  401. min-height: 100vh;
  402. background: #f5f5f5;
  403. display: flex;
  404. flex-direction: column;
  405. height: auto;
  406. &::before {
  407. content: '';
  408. position: absolute;
  409. top: 0;
  410. left: 0;
  411. right: 0;
  412. width: 100%;
  413. height: 532rpx;
  414. background: linear-gradient(180deg, rgba(56, 139, 255, 0.79) 0%, rgba(56, 139, 255, 0) 100%);
  415. }
  416. }
  417. .top {
  418. display: flex;
  419. justify-content: center;
  420. align-items: center;
  421. height: 88rpx;
  422. position: relative;
  423. font-weight: 600;
  424. font-size: 36rpx;
  425. color: #FFFFFF;
  426. .return {
  427. position: absolute;
  428. left: 32rpx;
  429. width: 40rpx;
  430. height: 40rpx;
  431. }
  432. }
  433. .content {
  434. flex: 1;
  435. padding: 24rpx;
  436. box-sizing: border-box;
  437. padding-bottom: 200rpx;
  438. }
  439. /* 任务卡片样式 */
  440. .task-card {
  441. background: #fff;
  442. border-radius: 16rpx;
  443. padding: 24rpx;
  444. margin-bottom: 24rpx;
  445. .card-header {
  446. display: flex;
  447. justify-content: space-between;
  448. .card-title {
  449. font-weight: 500;
  450. font-size: 36rpx;
  451. color: #333333;
  452. margin-bottom: 24rpx;
  453. }
  454. .card-lable {
  455. height: 40rpx;
  456. box-sizing: border-box;
  457. padding: 4rpx 12rpx;
  458. font-size: 24rpx;
  459. border-radius: 8rpx;
  460. &.pending {
  461. background: #FEF8E3;
  462. color: #DE9B14;
  463. }
  464. &.reject {
  465. background: #FFF4F5;
  466. color: #CF3546;
  467. }
  468. &.pass {
  469. color: #07C160;
  470. background: #E6FAEF;
  471. }
  472. }
  473. }
  474. .card-meta {
  475. display: flex;
  476. align-items: center;
  477. gap: 16rpx;
  478. font-size: 24rpx;
  479. color: #666;
  480. .item{
  481. display: flex;
  482. align-items: center;
  483. image{
  484. width: 32rpx;
  485. height: 32rpx;
  486. margin-right: 16rpx;
  487. }
  488. }
  489. }
  490. }
  491. /* 通用信息区块样式 */
  492. .info-section {
  493. background: #fff;
  494. border-radius: 16rpx;
  495. padding: 24rpx;
  496. margin-bottom: 24rpx;
  497. .section-header {
  498. display: flex;
  499. align-items: center;
  500. margin-bottom: 24rpx;
  501. .section-indicator {
  502. width: 6rpx;
  503. height: 32rpx;
  504. background: #388BFF;
  505. border-radius: 3rpx;
  506. margin-right: 16rpx;
  507. }
  508. .section-title {
  509. font-weight: 600;
  510. font-size: 32rpx;
  511. color: #333333;
  512. }
  513. }
  514. .info-list {
  515. .info-item {
  516. display: flex;
  517. margin-bottom: 24rpx;
  518. &:last-child {
  519. margin-bottom: 0;
  520. }
  521. .info-label {
  522. width: 50%;
  523. font-size: 28rpx;
  524. color: #666;
  525. flex-shrink: 0;
  526. }
  527. .info-value {
  528. flex: 1;
  529. text-align: end;
  530. font-size: 28rpx;
  531. color: #333;
  532. }
  533. .copy-btn {
  534. margin-left: 16rpx;
  535. color: #2196F3;
  536. font-size: 24rpx;
  537. cursor: pointer;
  538. }
  539. .column {
  540. flex-direction: column;
  541. }
  542. .attachment-item {
  543. margin-top: 24rpx;
  544. display: flex;
  545. justify-content: space-between;
  546. align-items: center;
  547. gap: 16rpx;
  548. background: #F7F8FA;
  549. border-radius: 16rpx 16rpx 16rpx 16rpx;
  550. .left {
  551. display: flex;
  552. align-items: center;
  553. .img {
  554. width: 72rpx;
  555. height: 72rpx;
  556. margin-right: 24rpx;
  557. }
  558. .txt-item {
  559. .attachment-name {
  560. font-size: 28rpx;
  561. color: #333;
  562. }
  563. .attachment-size {
  564. font-size: 24rpx;
  565. color: #999;
  566. }
  567. }
  568. }
  569. .download-btn {
  570. width: 32rpx;
  571. height: 32rpx;
  572. }
  573. }
  574. }
  575. }
  576. }
  577. /* 客户信息样式 */
  578. .client-list {
  579. .client-item {
  580. display: flex;
  581. justify-content: space-between;
  582. align-items: center;
  583. padding: 16rpx 0;
  584. &:last-child {
  585. border-bottom: none;
  586. }
  587. .client-info {
  588. display: flex;
  589. align-items: center;
  590. .avatar {
  591. width: 88rpx;
  592. height: 88rpx;
  593. margin-right: 24rpx;
  594. }
  595. .client-txt {
  596. .client-name {
  597. font-size: 28rpx;
  598. font-weight: 500;
  599. color: #333;
  600. .client-level {
  601. margin-left: 8rpx;
  602. padding: 2rpx 8rpx;
  603. background: #FFF6E5;
  604. color: #C89743;
  605. font-size: 22rpx;
  606. border-radius: 8rpx;
  607. }
  608. }
  609. }
  610. .client-hospital {
  611. font-size: 24rpx;
  612. color: #666;
  613. margin-top: 4rpx;
  614. display: flex;
  615. align-items: center;
  616. .line {
  617. width: 2rpx;
  618. height: 28rpx;
  619. background: #EAEBEE;
  620. margin: 0 24rpx;
  621. }
  622. }
  623. }
  624. .client-stats {
  625. display: flex;
  626. gap: 24rpx;
  627. font-size: 24rpx;
  628. color: #999999;
  629. .stat-item {
  630. display: flex;
  631. flex-direction: column;
  632. align-items: center;
  633. .num {
  634. font-weight: 500;
  635. font-size: 28rpx;
  636. color: #333333;
  637. }
  638. }
  639. }
  640. }
  641. }
  642. /* 审批信息样式 */
  643. .approval-list {
  644. .approval-item {
  645. position: relative;
  646. padding-left: 24rpx;
  647. margin-bottom: 68rpx;
  648. display: flex;
  649. align-items: center;
  650. justify-content: space-between;
  651. &:last-child {
  652. margin-bottom: 0;
  653. }
  654. .left {
  655. display: flex;
  656. align-items: center;
  657. .avatar-box {
  658. width: 80rpx;
  659. height: 80rpx;
  660. margin-right: 32rpx;
  661. position: relative;
  662. .avatar {
  663. width: 100%;
  664. height: 100%;
  665. }
  666. .icon {
  667. position: absolute;
  668. bottom: 0;
  669. right: 0;
  670. width: 32rpx;
  671. height: 32rpx;
  672. }
  673. }
  674. .approval-user {
  675. gap: 12rpx;
  676. .user-name {
  677. font-weight: 500;
  678. font-size: 28rpx;
  679. color: #333;
  680. }
  681. .user-status {
  682. font-size: 24rpx;
  683. }
  684. }
  685. }
  686. .approval-time {
  687. font-size: 24rpx;
  688. color: #999;
  689. margin-top: 4rpx;
  690. }
  691. }
  692. .approval-line {
  693. position: absolute;
  694. left: 64rpx;
  695. bottom: -64rpx;
  696. width: 1rpx;
  697. height: 56rpx;
  698. background: #BFD8FF;
  699. }
  700. }
  701. .reason {
  702. font-size: 28rpx;
  703. color: #666666;
  704. line-height: 40rpx;
  705. margin-left: 136rpx;
  706. background: #F7F8FA;
  707. border-radius: 16rpx;
  708. line-height: 40rpx;
  709. padding: 20rpx;
  710. }
  711. .bottom-bar {
  712. position: fixed;
  713. bottom: 0;
  714. left: 0;
  715. right: 0;
  716. background: #fff;
  717. padding: 24rpx 32rpx;
  718. border-top: 1rpx solid #F2F3F5;
  719. z-index: 100;
  720. display: flex;
  721. align-items: center;
  722. .action-buttons {
  723. display: flex;
  724. flex: 1;
  725. justify-content: space-between;
  726. .btn {
  727. width: 292rpx;
  728. height: 88rpx;
  729. display: flex;
  730. align-items: center;
  731. justify-content: center;
  732. font-size: 32rpx;
  733. font-weight: 500;
  734. border-radius: 200rpx 200rpx 200rpx 200rpx;
  735. cursor: pointer;
  736. display: flex;
  737. align-items: center;
  738. &.btn-cancel {
  739. background: #fff;
  740. border: 2rpx solid #CF3546;
  741. color: #CF3546;
  742. }
  743. &.btn-submit {
  744. background: #388BFF;
  745. color: #fff;
  746. }
  747. .icon {
  748. width: 32rpx;
  749. height: 32rpx;
  750. margin-right: 16rpx;
  751. }
  752. }
  753. }
  754. }
  755. </style>