addReportDialog.vue 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760
  1. <template>
  2. <el-dialog
  3. :visible.sync="dialogVisible"
  4. :title="dialogTile"
  5. :before-close="handleClose"
  6. :close-on-click-modal="false"
  7. :close-on-press-escape="false"
  8. v-loading="addDialogLoading"
  9. width="80%"
  10. >
  11. <HeaderTitle title="基本信息" size="16px"></HeaderTitle>
  12. <el-form
  13. :model="addForm"
  14. class="add_form"
  15. ref="addFormRef"
  16. :rules="rules"
  17. label-width="110px"
  18. >
  19. <el-row :gutter="20">
  20. <el-col :span="6">
  21. <el-form-item label="编码" prop="code">
  22. <el-input
  23. v-model="addForm.code"
  24. placeholder="自动生成"
  25. disabled
  26. ></el-input>
  27. </el-form-item>
  28. </el-col>
  29. <el-col :span="6">
  30. <el-form-item label="名称" prop="name">
  31. <el-input
  32. :disabled="isBindPlan"
  33. v-model="addForm.name"
  34. placeholder="请输入"
  35. ></el-input>
  36. </el-form-item>
  37. </el-col>
  38. <!-- <el-col :span="6">
  39. <el-form-item label="审核人" prop="approvalUserId">
  40. <el-select
  41. v-model="addForm.approvalUserId"
  42. size="small"
  43. style="width: 100%"
  44. @change="changeApprovalUser"
  45. :disabled="isBindPlan"
  46. filterable
  47. >
  48. <el-option
  49. v-for="item in uerList"
  50. :key="item.id"
  51. :value="item.id"
  52. :label="item.name"
  53. ></el-option>
  54. </el-select>
  55. </el-form-item>
  56. </el-col> -->
  57. <el-col :span="6">
  58. <el-form-item label="报损报溢部门" prop="executeGroupId">
  59. <deptSelect
  60. :isBindPlan="isBindPlan"
  61. v-model="addForm.executeGroupId"
  62. @changeGroup="searchDeptNodeClick"
  63. />
  64. </el-form-item>
  65. </el-col>
  66. <el-col :span="6">
  67. <el-form-item label="报损报溢人" prop="executorId">
  68. <el-select
  69. v-model="addForm.executorId"
  70. @change="changeExecutor"
  71. :disabled="isBindPlan"
  72. size="small"
  73. style="width: 100%"
  74. filterable
  75. >
  76. <el-option
  77. v-for="item in executorList"
  78. :key="item.id"
  79. :value="item.id"
  80. :label="item.name"
  81. ></el-option>
  82. </el-select>
  83. </el-form-item>
  84. </el-col>
  85. <el-col :span="24">
  86. <el-form-item label="备注" prop="remark">
  87. <el-input
  88. placeholder="请输入"
  89. type="textarea"
  90. :rows="2"
  91. resize="none"
  92. v-model="addForm.remark"
  93. :disabled="isBindPlan"
  94. ></el-input>
  95. </el-form-item>
  96. </el-col>
  97. </el-row>
  98. <HeaderTitle title="报损报溢工单物品信息" size="16px">
  99. <el-button
  100. v-if="!isBindPlan"
  101. style="margin-left: 10px"
  102. type="primary"
  103. @click="addProducts"
  104. >选择工单</el-button
  105. >
  106. </HeaderTitle>
  107. <el-table
  108. ref="table"
  109. :data="productList"
  110. :max-height="500"
  111. row-key="id"
  112. tooltip-effect="dark"
  113. border
  114. >
  115. <el-table-column width="55px" label="序号" type="index">
  116. </el-table-column>
  117. <el-table-column
  118. prop="code"
  119. label="盘点单号"
  120. :show-overflow-tooltip="true"
  121. ></el-table-column>
  122. <el-table-column
  123. prop="planName"
  124. label="计划名称"
  125. :show-overflow-tooltip="true"
  126. ></el-table-column>
  127. <el-table-column label="产品分类" width="180">
  128. <template slot-scope="scope">
  129. <el-popover trigger="hover" placement="right">
  130. <el-table
  131. :data="scope.row.planDetailVOList"
  132. :max-height="500"
  133. border
  134. >
  135. <el-table-column label="序号" type="index" width="50">
  136. </el-table-column>
  137. <el-table-column
  138. label="状态"
  139. prop="status"
  140. :show-overflow-tooltip="true"
  141. >
  142. <template slot-scope="{ row }">
  143. {{
  144. row.status > 0
  145. ? statusOption.filter(
  146. (item) => item.value == row.status
  147. )[0].label
  148. : ''
  149. }}
  150. </template>
  151. </el-table-column>
  152. <el-table-column label="数量" :show-overflow-tooltip="true">
  153. <template slot-scope="{ row }">
  154. {{
  155. row.status > 0
  156. ? row[
  157. statusOption.filter(
  158. (item) => item.value == row.status
  159. )[0].numKey
  160. ]
  161. : 0
  162. }}
  163. </template>
  164. </el-table-column>
  165. <el-table-column
  166. width="150"
  167. label="物品名称"
  168. prop="categoryName"
  169. :show-overflow-tooltip="true"
  170. ></el-table-column>
  171. <el-table-column
  172. label="批次号"
  173. prop="batchNo"
  174. :show-overflow-tooltip="true"
  175. ></el-table-column>
  176. <el-table-column
  177. width="150"
  178. label="包装编码"
  179. prop="packageNo"
  180. :show-overflow-tooltip="true"
  181. ></el-table-column>
  182. <el-table-column
  183. label="包装数量"
  184. prop="info.packingCountBase"
  185. :show-overflow-tooltip="true"
  186. ></el-table-column>
  187. <el-table-column
  188. label="包装单位"
  189. prop="info.packingUnit"
  190. :show-overflow-tooltip="true"
  191. ></el-table-column>
  192. <el-table-column
  193. label="重量"
  194. prop="info.weight"
  195. :show-overflow-tooltip="true"
  196. >
  197. </el-table-column>
  198. <el-table-column
  199. label="重量单位"
  200. prop="info.weightUnit"
  201. :show-overflow-tooltip="true"
  202. >
  203. </el-table-column>
  204. <el-table-column
  205. width="200"
  206. label="仓库"
  207. prop="info.warehouseName"
  208. :show-overflow-tooltip="true"
  209. ></el-table-column>
  210. </el-table>
  211. <div slot="reference" class="name-wrapper">
  212. <el-tag size="medium">{{ scope.row.categoryLevelId }}</el-tag>
  213. </div>
  214. </el-popover>
  215. </template>
  216. </el-table-column>
  217. <el-table-column
  218. prop="warehouseName"
  219. label="盘点仓库"
  220. :show-overflow-tooltip="true"
  221. ></el-table-column>
  222. <el-table-column
  223. prop="executeGroupName"
  224. label="盘点部门"
  225. :show-overflow-tooltip="true"
  226. ></el-table-column>
  227. <el-table-column
  228. prop="executorName"
  229. label="盘点人员"
  230. :show-overflow-tooltip="true"
  231. ></el-table-column>
  232. <el-table-column
  233. prop="surplusQuantity"
  234. label="盘盈数量"
  235. :show-overflow-tooltip="true"
  236. ></el-table-column>
  237. <el-table-column
  238. prop="loseQuantity"
  239. label="盘亏数量"
  240. :show-overflow-tooltip="true"
  241. ></el-table-column>
  242. <el-table-column
  243. prop="wornQuantity"
  244. label="破损数量"
  245. :show-overflow-tooltip="true"
  246. ></el-table-column>
  247. <el-table-column
  248. prop="createTime"
  249. label="盘点审核时间"
  250. :show-overflow-tooltip="true"
  251. ></el-table-column>
  252. <el-table-column v-if="!isBindPlan" label="操作" width="100">
  253. <template slot-scope="{ row, $index }">
  254. <el-button @click="deleted(row, $index)" type="text" size="small"
  255. >删除</el-button
  256. >
  257. </template>
  258. </el-table-column>
  259. </el-table>
  260. <div v-if="addForm.status != 0" style="height: 350px">
  261. <HeaderTitle title="流程图" size="16px"></HeaderTitle>
  262. <div style="height: calc(100% - 40px);">
  263. <my-process-viewer
  264. key="designer"
  265. v-model="bpmnXML"
  266. v-bind="bpmnControlForm"
  267. :activityData="activityList"
  268. :processInstanceData="processInstance"
  269. :taskData="tasks"
  270. />
  271. </div>
  272. </div>
  273. </el-form>
  274. <div v-if="!isBindPlan" slot="footer">
  275. <el-button
  276. v-if="addForm.status == 0"
  277. type="primary"
  278. size="small"
  279. @click="submit"
  280. >提交</el-button
  281. >
  282. <el-button type="primary" size="small" @click="config(false)"
  283. >保存</el-button
  284. >
  285. <el-button size="small" @click="handleClose">关闭</el-button>
  286. </div>
  287. <div v-else slot="footer">
  288. <el-button
  289. v-if="addForm.status == 0"
  290. type="primary"
  291. size="small"
  292. @click="submit"
  293. >提交</el-button
  294. >
  295. <el-button type="primary" size="small" @click="dialogVisible = false"
  296. >确定</el-button
  297. >
  298. <el-button size="small" @click="dialogVisible = false">关闭</el-button>
  299. </div>
  300. <reportProcuts
  301. :visibleDialog.sync="visibleDialog"
  302. :treeIds="productType"
  303. :dimension="dimension"
  304. :statusOption="statusOption"
  305. :warehouseId="addForm.warehouseId"
  306. :selectionIds="selectionIds"
  307. :loadTree.sync="loadTree"
  308. @selectTableData="addGoods"
  309. />
  310. </el-dialog>
  311. </template>
  312. <script>
  313. import {
  314. getProcessInstance,
  315. getTaskListByProcessInstanceId,
  316. getProcessDefinitionBpmnXML,
  317. getActivityList
  318. } from '@/api/bpm/index';
  319. import { getTreeByGroup } from '@/api/classifyManage';
  320. import reportProcuts from './reportProcuts.vue';
  321. import { getCode } from '@/api/codeManagement';
  322. import {
  323. getReportPlanDetailById,
  324. saveReportsList,
  325. updateReportsList
  326. } from '@/api/inventory';
  327. import {
  328. getRule,
  329. getWarehouseList,
  330. getCategoryLevelIdByWarehouseId
  331. } from '@/api/ruleManagement/plan';
  332. import { getUserPage } from '@/api/system/organization';
  333. import deptSelect from '@/components/CommomSelect/new-dept-select.vue';
  334. export default {
  335. props: {
  336. dialogTile: {
  337. type: String,
  338. default: '新增临时盘点计划'
  339. },
  340. isBindPlan: {
  341. type: Boolean,
  342. default: function () {
  343. return false;
  344. }
  345. },
  346. id: {
  347. type: String,
  348. default: ''
  349. }
  350. },
  351. components: {
  352. deptSelect,
  353. reportProcuts
  354. },
  355. data() {
  356. return {
  357. // 流程实例
  358. processId: undefined, // 流程实例的编号
  359. processInstance: {},
  360. // BPMN 数据
  361. bpmnXML: null,
  362. bpmnControlForm: {
  363. prefix: 'flowable'
  364. },
  365. activityList: [],
  366. // 审批记录
  367. tasksLoad: true,
  368. tasks: [],
  369. processInstanceLoading: false,
  370. statusOption: [
  371. {
  372. label: '盘盈',
  373. value: '2',
  374. numKey: 'surplusQuantity'
  375. },
  376. {
  377. label: '丢失',
  378. value: '3',
  379. numKey: 'loseQuantity'
  380. },
  381. {
  382. label: '破损',
  383. value: '4',
  384. numKey: 'wornQuantity'
  385. }
  386. ],
  387. visibleDialog: false,
  388. type: 2, // 盘点类型 2仓储 4资产
  389. dimension: 1, // 盘点维度1物品 2批次
  390. factoryOptions: [],
  391. workshopOptions: [],
  392. productionLineOptions: [],
  393. stationOptions: [],
  394. codeList: [],
  395. addDialogLoading: false,
  396. dialogVisible: false,
  397. wh_checkStatus: [], // 盘点类型
  398. warehouseList: [], // 盘点仓库
  399. uerList: [], // 审核人
  400. executorList: [], // 执行人
  401. assetsType: null,
  402. planRuleInventoryDetailList: [],
  403. tableList: [],
  404. newColumns: [],
  405. selection: [],
  406. keyWord: '',
  407. total: 0,
  408. page: 1,
  409. size: 10,
  410. loadTree: true,
  411. productList: [],
  412. productType: [],
  413. addForm: {
  414. name: '', // 规则名称
  415. code: '', // 计划配置单号
  416. name: '', // 计划配置名称
  417. executeGroupId: '', // 执行部门code
  418. executeGroupName: '', // 执行部门name
  419. executorId: '', // 执行人id
  420. executorName: '', // 执行人name
  421. warehouseId: '', // 盘点仓库Id
  422. remark: '', // 备注
  423. status: 0, // 状态(待审核)
  424. approvalUserId: '', // 审核人Id
  425. approvalUserName: '' // 审核人name
  426. },
  427. rules: {
  428. code: [
  429. { required: true, message: '请输入计划配置单号', trigger: 'blur' }
  430. ],
  431. name: [
  432. { required: true, message: '请输入计划配置名称', trigger: 'blur' }
  433. ],
  434. warehouseId: [
  435. { required: true, message: '请选择盘点仓库', trigger: 'change' }
  436. ],
  437. executeGroupId: [
  438. { required: true, message: '请选择选择执行部门', trigger: 'change' }
  439. ],
  440. executorId: [
  441. { required: true, message: '请选择选择执行人员', trigger: 'change' }
  442. ]
  443. },
  444. ruleNameList: []
  445. };
  446. },
  447. watch: {
  448. dialogVisible(val) {
  449. if (val) {
  450. // 获取审核人列表数据
  451. this.getUserList();
  452. // 获取计划单号
  453. this.getOrderCode();
  454. if (
  455. this.dialogTile === '修改报损报溢' ||
  456. this.dialogTile === '报损报溢详情'
  457. ) {
  458. getReportPlanDetailById(this.id).then(async (res) => {
  459. this.addForm = res;
  460. if (this.addForm.executeGroupId) {
  461. this.getUserList({ groupId: this.addForm.executeGroupId });
  462. }
  463. this.productList = res.info;
  464. if (this.addForm.status != 0) {
  465. this.getDetail(res.flowableId);
  466. }
  467. });
  468. } else {
  469. this.productList = [];
  470. this.addForm = {
  471. name: '', // 规则名称
  472. code: '', // 计划配置单号
  473. executeGroupId: '', // 执行部门code
  474. executeGroupName: '', // 执行部门name
  475. executorId: '', // 执行人id
  476. executorName: '', // 执行人name
  477. warehouseId: '', // 盘点仓库Id
  478. remark: '', // 备注
  479. status: 0, // 状态(待审核)
  480. approvalUserId: '', // 审核人Id
  481. approvalUserName: '' // 审核人name
  482. };
  483. }
  484. }
  485. }
  486. },
  487. computed: {
  488. clientEnvironmentId() {
  489. return this.$store.state.user.info.clientEnvironmentId;
  490. },
  491. selectionIds() {
  492. return this.productList.map((item) => item.categoryId);
  493. }
  494. },
  495. methods: {
  496. /** 获得流程实例 */
  497. getDetail(id) {
  498. // 获得流程实例相关
  499. this.processInstanceLoading = true;
  500. getProcessInstance(id).then((response) => {
  501. if (!response) {
  502. this.$message.error('查询不到流程信息!');
  503. return;
  504. }
  505. // 设置流程信息
  506. this.processInstance = response;
  507. // //将业务表单,注册为动态组件
  508. // const path = this.processInstance.processDefinition.formCustomViewPath;
  509. // Vue.component("async-biz-form-component", function (resolve) {
  510. // require([`@/views${path}`], resolve);
  511. // });
  512. // 加载流程图
  513. getProcessDefinitionBpmnXML(
  514. this.processInstance.processDefinition.id
  515. ).then((response) => {
  516. this.bpmnXML = response;
  517. });
  518. // 加载活动列表
  519. getActivityList({
  520. processInstanceId: this.processInstance.id
  521. }).then((response) => {
  522. console.log(response, 'response');
  523. this.activityList = response;
  524. });
  525. // 取消加载中
  526. this.processInstanceLoading = false;
  527. });
  528. // 获得流程任务列表(审批记录)
  529. this.tasksLoad = true;
  530. getTaskListByProcessInstanceId(id).then((response) => {
  531. // 审批记录
  532. this.tasks = [];
  533. // 移除已取消的审批
  534. response.forEach((task) => {
  535. if (task.result !== 4) {
  536. this.tasks.push(task);
  537. }
  538. });
  539. // 排序,将未完成的排在前面,已完成的排在后面;
  540. this.tasks.sort((a, b) => {
  541. // 有已完成的情况,按照完成时间倒序
  542. if (a.endTime && b.endTime) {
  543. return b.endTime - a.endTime;
  544. } else if (a.endTime) {
  545. return 1;
  546. } else if (b.endTime) {
  547. return -1;
  548. // 都是未完成,按照创建时间倒序
  549. } else {
  550. return b.createTime - a.createTime;
  551. }
  552. });
  553. // 需要审核的记录
  554. const userId = store.getters.userId;
  555. this.tasks.forEach((task) => {
  556. if (task.result !== 1 && task.result !== 6) {
  557. // 只有待处理才需要
  558. return;
  559. }
  560. if (!task.assigneeUser || task.assigneeUser.id !== userId) {
  561. // 自己不是处理人
  562. return;
  563. }
  564. });
  565. // 取消加载中
  566. this.tasksLoad = false;
  567. });
  568. },
  569. // 添加物品明细
  570. async addGoods(data) {
  571. console.log(data);
  572. let productList = data.map((item) => {
  573. return {
  574. ...item
  575. };
  576. });
  577. console.log('productList------', productList);
  578. this.productList = this.productList.concat(productList);
  579. },
  580. addProducts() {
  581. this.visibleDialog = true;
  582. },
  583. deleted(row, index) {
  584. this.productList.splice(index, 1);
  585. },
  586. selecctedRow(val) {
  587. this.selection = val;
  588. },
  589. dimensionChange() {
  590. this.productList = [];
  591. },
  592. checkSelectable(row) {
  593. return true;
  594. },
  595. // 改变规则名称
  596. change_ruleId(val) {
  597. this.addForm.ruleName = this.ruleNameList.filter(
  598. (item) => item.id === val
  599. )[0].name;
  600. },
  601. // 获取物品类型列表
  602. async getGoodsList() {
  603. const { data } = await getTreeByGroup({ type: this.type });
  604. console.log('data------', data);
  605. this.codeList = data;
  606. },
  607. // 获取规则名列表
  608. async _getRuleNameList() {
  609. const res = await getRule({ status: 1, type: 4, pageNum: 1, size: -1 });
  610. if (res.list) {
  611. this.ruleNameList = res.list || [];
  612. }
  613. },
  614. // 获取计划配置单号
  615. async getOrderCode(tips) {
  616. const code = await getCode('plan_profit_loss');
  617. this.$set(this.addForm, 'code', code);
  618. },
  619. // 执行人选择
  620. changeExecutor(val) {
  621. if (val) {
  622. this.addForm.executorId = val;
  623. this.addForm.executorName = this.executorList.filter(
  624. (item) => item.id === val
  625. )[0].name;
  626. }
  627. },
  628. // 仓库选择
  629. changeWarehouse(val) {
  630. if (val) {
  631. this.addForm.warehouseId = val;
  632. this.addForm.warehouseName = this.warehouseList.filter(
  633. (item) => item.id === val
  634. )[0].name;
  635. this.productList = [];
  636. getCategoryLevelIdByWarehouseId({ warehouseId: val }).then((data) => {
  637. console.log(data);
  638. this.productType = Array.from(new Set(data));
  639. });
  640. }
  641. },
  642. // 关闭弹窗
  643. handleClose() {
  644. this.dialogVisible = false;
  645. this.$refs.addFormRef.resetFields();
  646. this.addForm.assetsName = '';
  647. this.assetsType = null;
  648. this.addForm = {
  649. name: '', // 规则名称
  650. code: '', // 计划配置单号
  651. executeGroupId: '', // 执行部门code
  652. executeGroupName: '', // 执行部门name
  653. executorId: '', // 执行人id
  654. executorName: '', // 执行人name
  655. warehouseId: '', // 盘点仓库Id
  656. remark: '', // 备注
  657. status: 0, // 状态(待审核)
  658. approvalUserId: '', // 审核人Id
  659. approvalUserName: '' // 审核人name
  660. };
  661. },
  662. // 封装 - 获取盘点仓库
  663. async _getWarehouse() {
  664. const res = await getWarehouseList({});
  665. console.log(res);
  666. this.warehouseList = res.map((item) => {
  667. return { ...item, name: item.factoryName + '-' + item.name };
  668. });
  669. },
  670. //选择部门(搜索)
  671. searchDeptNodeClick(info, row) {
  672. if (info) {
  673. const params = { groupId: info };
  674. this.getUserList(params);
  675. this.addForm.executeGroupName = row.name;
  676. } else {
  677. this.addForm.executeGroupId = null;
  678. }
  679. },
  680. // 获取审核人列表、巡点检人员
  681. async getUserList(params) {
  682. try {
  683. let data = { pageNum: 1, size: -1 };
  684. // 如果传了参数就是获取巡点检人员数据
  685. if (params) {
  686. data = Object.assign(data, params);
  687. }
  688. const res = await getUserPage(data);
  689. if (params) {
  690. this.executorList = res.list;
  691. } else {
  692. this.uerList = res.list;
  693. }
  694. } catch (error) {}
  695. },
  696. submit() {
  697. this.config(true);
  698. },
  699. config(isProcess) {
  700. console.log(this.addForm);
  701. console.log('isProcess------------', isProcess);
  702. this.$refs.addFormRef.validate(async (valid) => {
  703. let res = null;
  704. if (valid) {
  705. let params = {
  706. ...this.addForm,
  707. info: this.productList
  708. };
  709. if (isProcess) {
  710. params.status = 1;
  711. } else {
  712. params.status = 0;
  713. }
  714. if (this.productList?.length > 0) {
  715. if (this.dialogTile === '修改报损报溢') {
  716. res = await updateReportsList(params);
  717. } else {
  718. res = await saveReportsList(params);
  719. }
  720. } else {
  721. return this.$message.error('请选择报损工单物品信息');
  722. }
  723. if (res.code == 0) {
  724. this.handleClose();
  725. this.$message.success(res.message);
  726. this.$emit('refreshList');
  727. }
  728. }
  729. });
  730. },
  731. handleChangeassetDict(data) {
  732. console.log(data);
  733. }
  734. }
  735. };
  736. </script>
  737. <style lang="scss" scoped>
  738. ::v-deep .el-row {
  739. display: flex;
  740. flex-wrap: wrap;
  741. }
  742. .add_form {
  743. ::v-deep .el-form-item {
  744. margin-bottom: 20px !important;
  745. }
  746. }
  747. .table_search {
  748. margin-bottom: 5px;
  749. }
  750. </style>