todoList.vue 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539
  1. <template>
  2. <div class="app-container">
  3. <div class="title-container">
  4. <breadcrumb id="breadcrumb-container" class="breadcrumb-container" />
  5. </div>
  6. <y-page-list-layout :page-list="pageData" :page-para="listQuery" :get-page-list="getPage">
  7. <template slot="left">
  8. <MoreSearchBar business="MAJOR_BUSINESS" @fliterSearch="fliterSearch" @resetParams="resetParams"
  9. :listQuery="listQuery" :nodes="majorNodes">
  10. <template v-slot:otherButton>
  11. <el-button class="filter-item" round @click="showAllLabel()">显示全部列</el-button>
  12. <PermissionButton menu-code="_views_major_batch_commit_bookbinding_stamp" class-name="filter-item"
  13. type="danger" icon="el-icon-paperclip" :page-jump="false" round
  14. @click="openBatchCommitDialog('BOOKBINDING_STAMP')" />
  15. <PermissionButton menu-code="_views_major_batch_commit_recheck_archiving" class-name="filter-item"
  16. type="danger" icon="el-icon-paperclip" :page-jump="false" round
  17. @click="openBatchCommitDialog('RECHECK_ARCHIVING')" />
  18. <PermissionButton menu-code="_views_major_batch_commit_check_archiving" class-name="filter-item"
  19. type="danger" icon="el-icon-paperclip" :page-jump="false" round
  20. @click="openBatchCommitDialog('CHECK_ARCHIVING')" />
  21. </template>
  22. </MoreSearchBar>
  23. </template>
  24. <parentTable :data="pageData.records" slot="table" style="width: 100%;" @sortTable="sortTable"
  25. @headerClick="switchHeader">
  26. <el-table-column label="项目名称" align="center" width="250" v-if="!hiddenLabels.includes('productionName')"
  27. prop="productionName" show-overflow-tooltip>
  28. <template slot-scope="{row}">
  29. <span class="enableClick" @click="toDetail(row)">{{ row.productionName == null ? row.orderName :
  30. row.productionName
  31. }}</span>
  32. </template>
  33. </el-table-column>
  34. <el-table-column label="订单号" align="center" width="150" v-if="!hiddenLabels.includes('orderId')" prop="orderId">
  35. <template slot-scope="{row}">
  36. <span class="enableClick" @click="toDetail(row)" @contextmenu.prevent="$doCopy(row.orderId)">{{ row.orderId
  37. }}</span>
  38. </template>
  39. </el-table-column>
  40. <el-table-column label="价值意见书号" align="center" width="200" v-if="!hiddenLabels.includes('statementNo')"
  41. prop="statementNo" sortable>
  42. <template slot-scope="{row}">
  43. <span @contextmenu.prevent="$doCopy(row.statementNo)">{{ row.statementNo == null ? '-' : row.statementNo
  44. }}</span>
  45. </template>
  46. </el-table-column>
  47. <el-table-column label="报告号/复评函号" align="center" width="200" v-if="!hiddenLabels.includes('reportNo')"
  48. prop="reportNo" sortable>
  49. <template slot-scope="{row}">
  50. <span @contextmenu.prevent="$doCopy(row.reportNo)">{{ row.reportNo == null ? '-' : row.reportNo }}</span>
  51. </template>
  52. </el-table-column>
  53. <el-table-column label="评估对象类型" align="center" width="120" v-if="!hiddenLabels.includes('businessObjectType')"
  54. prop="businessObjectType">
  55. <template slot-scope="{row}">
  56. <span>{{ row.businessObjectType }}</span>
  57. </template>
  58. </el-table-column>
  59. <el-table-column label="待办人" align="center" v-if="!hiddenLabels.includes('handler')" prop="handler">
  60. <template slot-scope="{row}">
  61. <span>{{ row.handler }}</span>
  62. </template>
  63. </el-table-column>
  64. <el-table-column label="当前节点" align="center" width="140" v-if="!hiddenLabels.includes('nodeName')" prop="nodeName"
  65. sortable>
  66. <template slot-scope="{row}">
  67. <span>{{ row.nodeName }}</span>
  68. </template>
  69. </el-table-column>
  70. <el-table-column label="客户经理" align="center" v-if="!hiddenLabels.includes('clientManager')" prop="clientManager">
  71. <template slot-scope="{row}">
  72. <span>{{ row.clientManager }}</span>
  73. </template>
  74. </el-table-column>
  75. <el-table-column label="负责人" align="center" v-if="!hiddenLabels.includes('principal')" prop="principal">
  76. <template slot-scope="{row}">
  77. <span>{{ row.principal == null ? '-' : row.principal }}</span>
  78. </template>
  79. </el-table-column>
  80. <el-table-column label="评估对象类型" align="center" width="130" v-if="!hiddenLabels.includes('businessObjectType')"
  81. prop="businessObjectType">
  82. <template slot-scope="{row}">
  83. <span>{{ row.businessObjectType }}</span>
  84. </template>
  85. </el-table-column>
  86. <el-table-column label="客户名称" align="center" width="130" v-if="!hiddenLabels.includes('cclienteleName')"
  87. prop="cclienteleName">
  88. <template slot-scope="{row}">
  89. <span>{{ row.cclienteleName }}</span>
  90. </template>
  91. </el-table-column>
  92. <el-table-column label="业务来源" align="center" width="130" v-if="!hiddenLabels.includes('cclienteleSubName')"
  93. prop="cclienteleSubName">
  94. <template slot-scope="{row}">
  95. <span>{{ row.cclienteleSubName }}</span>
  96. </template>
  97. </el-table-column>
  98. <el-table-column label="客户联系人" align="center" width="130" v-if="!hiddenLabels.includes('cclienteleContactName')"
  99. prop="cclienteleContactName">
  100. <template slot-scope="{row}">
  101. <span>{{ row.cclienteleContactName }}</span>
  102. </template>
  103. </el-table-column>
  104. <el-table-column label="客户联系人电话" align="center" width="130" v-if="!hiddenLabels.includes('cmobile')"
  105. prop="cmobile">
  106. <template slot-scope="{row}">
  107. {{ row.cmobile }}
  108. </template>
  109. </el-table-column>
  110. <el-table-column label="下单时间" align="center" width="160" v-if="!hiddenLabels.includes('created')" prop="created">
  111. <template slot-scope="{row}">
  112. <span>{{ row.created }}</span>
  113. </template>
  114. </el-table-column>
  115. <el-table-column label="任务创建时间" align="center" width="160" v-if="!hiddenLabels.includes('taskCreated')"
  116. prop="taskCreated" sortable>
  117. <template slot-scope="{row}">
  118. <span>{{ row.taskCreated }}</span>
  119. </template>
  120. </el-table-column>
  121. <el-table-column label="操作" align="center" width="100" fixed="right">
  122. <template slot-scope="{row}">
  123. <el-button type="text" @click="toDetail(row)">办理</el-button>
  124. <el-button type="text" @click="transfer(row.taskId)">转交</el-button>
  125. </template>
  126. </el-table-column>
  127. </parentTable>
  128. </y-page-list-layout>
  129. <TransferDialog :transferDialogVisible="visible" @parentFalse="parentFalse()" @getPage="getPage()"
  130. :recordId="recordId"></TransferDialog>
  131. <el-dialog :visible.sync="batchCommitDialog" width="70%">
  132. <y-page-list-layout :page-list="batchCommitPageData" :page-para="batchCommitListQuery"
  133. :get-page-list="selectBatchCommitPage">
  134. <template slot="left">
  135. <el-input style="margin-left: 20px;width: 300px;float: left;" class="filter-item"
  136. v-model="batchCommitListQuery.keyWord" placeholder="项目编号/报告号/项目名称/业务来源" clearable>
  137. </el-input>
  138. <el-button class="filter-item" style="margin-left: 10px;float: left;" type="primary"
  139. @click="searchBatchCommitList()" round>搜索
  140. </el-button>
  141. <el-button class="filter-item" style="margin-left: 10px;float: left;" type="danger" @click="batchCommitNode()"
  142. round>提交选中流程
  143. </el-button>
  144. </template>
  145. <parentTable :clickRowToPick="true" ref="table" :data="batchCommitPageData.records" slot="table"
  146. style="width: 100%;height: 800px;" :selectionChange="handleSelectionChange">
  147. <el-table-column align="center" type="selection" claimOrders width="50" border="true">
  148. </el-table-column>
  149. <el-table-column label="项目名称" align="center" width="250" v-if="!hiddenLabels.includes('productionName')"
  150. prop="productionName" show-overflow-tooltip>
  151. <template slot-scope="{row}">
  152. <span class="enableClick" @click="toDetail(row)">{{ row.productionName == null ? row.orderName :
  153. row.productionName
  154. }}</span>
  155. </template>
  156. </el-table-column>
  157. <el-table-column label="订单号" align="center" width="150" v-if="!hiddenLabels.includes('orderId')" prop="orderId">
  158. <template slot-scope="{row}">
  159. <span class="enableClick" @click="toDetail(row)" @contextmenu.prevent="$doCopy(row.orderId)">{{ row.orderId
  160. }}</span>
  161. </template>
  162. </el-table-column>
  163. <el-table-column label="价值意见书号" align="center" width="200" v-if="!hiddenLabels.includes('statementNo')"
  164. prop="statementNo" sortable>
  165. <template slot-scope="{row}">
  166. <span @contextmenu.prevent="$doCopy(row.statementNo)">{{ row.statementNo == null ? '-' : row.statementNo
  167. }}</span>
  168. </template>
  169. </el-table-column>
  170. <el-table-column label="报告号/复评函号" align="center" width="200" v-if="!hiddenLabels.includes('reportNo')"
  171. prop="reportNo" sortable>
  172. <template slot-scope="{row}">
  173. <span @contextmenu.prevent="$doCopy(row.reportNo)">{{ row.reportNo == null ? '-' : row.reportNo }}</span>
  174. </template>
  175. </el-table-column>
  176. <el-table-column label="评估对象类型" align="center" width="120" v-if="!hiddenLabels.includes('businessObjectType')"
  177. prop="businessObjectType">
  178. <template slot-scope="{row}">
  179. <span>{{ row.businessObjectType }}</span>
  180. </template>
  181. </el-table-column>
  182. <el-table-column label="待办人" align="center" v-if="!hiddenLabels.includes('handler')" prop="handler">
  183. <template slot-scope="{row}">
  184. <span>{{ row.handler }}</span>
  185. </template>
  186. </el-table-column>
  187. <el-table-column label="当前节点" align="center" width="140" v-if="!hiddenLabels.includes('nodeName')"
  188. prop="nodeName" sortable>
  189. <template slot-scope="{row}">
  190. <span>{{ row.nodeName }}</span>
  191. </template>
  192. </el-table-column>
  193. <el-table-column label="客户经理" align="center" v-if="!hiddenLabels.includes('clientManager')"
  194. prop="clientManager">
  195. <template slot-scope="{row}">
  196. <span>{{ row.clientManager }}</span>
  197. </template>
  198. </el-table-column>
  199. <el-table-column label="负责人" align="center" v-if="!hiddenLabels.includes('principal')" prop="principal">
  200. <template slot-scope="{row}">
  201. <span>{{ row.principal == null ? '-' : row.principal }}</span>
  202. </template>
  203. </el-table-column>
  204. </parentTable>
  205. </y-page-list-layout>
  206. </el-dialog>
  207. </div>
  208. </template>
  209. <script>
  210. import YPageListLayout from '@/components/YPageListLayout'
  211. import Breadcrumb from '@/components/Breadcrumb'
  212. import TransferDialog from '@/components/TaskTransferDialog'
  213. import { getCookie, setCookie, removeCookie } from '@/utils/auth'
  214. import MoreSearchBar from '@/components/MoreSearchBar'
  215. export default {
  216. name: 'MajorTaskTodoList',
  217. components: {
  218. Breadcrumb,
  219. YPageListLayout,
  220. TransferDialog,
  221. MoreSearchBar
  222. },
  223. data() {
  224. return {
  225. pageData: { records: [] },
  226. listQuery: {
  227. page: 1,
  228. size: 10,
  229. keyword: null,
  230. descs: null,
  231. ascs: null
  232. },
  233. majorNodes: [],
  234. orderDate: '',
  235. pickerOptions: {
  236. shortcuts: [{
  237. text: '最近一周',
  238. onClick(picker) {
  239. const end = new Date();
  240. const start = new Date();
  241. start.setTime(start.getTime() - 3600 * 1000 * 24 * 7);
  242. picker.$emit('pick', [start, end]);
  243. }
  244. }, {
  245. text: '最近一个月',
  246. onClick(picker) {
  247. const end = new Date();
  248. const start = new Date();
  249. start.setTime(start.getTime() - 3600 * 1000 * 24 * 30);
  250. picker.$emit('pick', [start, end]);
  251. }
  252. }, {
  253. text: '最近三个月',
  254. onClick(picker) {
  255. const end = new Date();
  256. const start = new Date();
  257. start.setTime(start.getTime() - 3600 * 1000 * 24 * 90);
  258. picker.$emit('pick', [start, end]);
  259. }
  260. }]
  261. },
  262. visible: false,
  263. recordId: null,
  264. hiddenLabels: [],
  265. batchCommitDialog: false,
  266. workNodeCommits: [],
  267. batchCommitListQuery: {
  268. page: 1,
  269. size: 10,
  270. current: 1,
  271. keyWord: null,
  272. handlerId: this.$store.getters.userInfo.id,
  273. getNodeIsBookbindingStamp: false,
  274. getNodeIsRecheckArchiving: false,
  275. getNodeIsCheckArchiving: false
  276. },
  277. batchCommitPageData: { records: [] }
  278. }
  279. },
  280. created() {
  281. if (getCookie("MajorTodoList-hiddenLabels") != undefined) {
  282. this.hiddenLabels = JSON.parse(getCookie("MajorTodoList-hiddenLabels"))
  283. }
  284. this.getPage();
  285. this.getMajorNodes();
  286. },
  287. methods: {
  288. resetSearch() {
  289. this.$router.push({ query: {} });
  290. this.orderDate = '';
  291. this.listQuery = {
  292. current: 1,
  293. size: 10,
  294. descs: 'taskCreated',
  295. }
  296. this.getPage()
  297. },
  298. removeHandle(row) {
  299. // console.log(data)
  300. this.$confirm('确认删除当前记录吗?', '警告', {
  301. confirmButtonText: '确认',
  302. cancelButtonText: '取消',
  303. type: 'warning',
  304. })
  305. .then(async () => {
  306. this.$api.term.delete(row.id).then((res) => {
  307. if (res.code === 200) {
  308. this.$message({
  309. type: 'success',
  310. message: '删除成功',
  311. })
  312. this.getPage()
  313. }
  314. })
  315. })
  316. .catch((err) => {
  317. console.error(err)
  318. })
  319. },
  320. searchList() {
  321. // 重置分页
  322. this.listQuery.page = 1
  323. this.listQuery.size = 10
  324. if (this.orderDate) {
  325. this.listQuery.startDate = this.orderDate[0] + ' 00:00:00';
  326. this.listQuery.endDate = this.orderDate[1] + ' 23:59:59';
  327. }
  328. this.getPage()
  329. },
  330. getPage() {
  331. this.$api.workNodeTaskRecord.majorTaskTodoList(this.listQuery).then(res => {
  332. if (res.code === 200) {
  333. this.pageData = res.data;
  334. }
  335. })
  336. },
  337. // 当前用户待办分页查询
  338. selectBatchCommitPage() {
  339. this.$api.workNodeTaskRecord.majorTaskTodoList(this.batchCommitListQuery).then(res => {
  340. if (res.code === 200) {
  341. this.batchCommitPageData = res.data;
  342. }
  343. })
  344. },
  345. // 条件查询
  346. searchBatchCommitList() {
  347. // 重置分页
  348. this.batchCommitListQuery.page = 1
  349. this.batchCommitListQuery.size = 10
  350. this.selectBatchCommitPage()
  351. },
  352. openBatchCommitDialog(node) {
  353. if (node === 'BOOKBINDING_STAMP') {
  354. this.batchCommitListQuery.getNodeIsBookbindingStamp = true;
  355. }
  356. if (node === 'RECHECK_ARCHIVING') {
  357. this.batchCommitListQuery.getNodeIsRecheckArchiving = true;
  358. }
  359. if (node === 'CHECK_ARCHIVING') {
  360. this.batchCommitListQuery.getNodeIsCheckArchiving = true;
  361. }
  362. this.selectBatchCommitPage();
  363. this.batchCommitDialog = true;
  364. },
  365. handleSelectionChange(val) {
  366. let pickedCommits = [];
  367. for (let i in val) {
  368. let commit = new Object();
  369. commit.instanceNodeId = val[i].currentNodeId;
  370. commit.state = "PASS";
  371. commit.comments = "批量提交装订盖章节点";
  372. commit.businessSubId = val[i].statementNo;
  373. commit.businessMinId = val[i].reportNo;
  374. pickedCommits.push(commit);
  375. }
  376. this.workNodeCommits = pickedCommits;
  377. },
  378. deleteInfo(id) {
  379. const that = this
  380. that.$confirm('请确认是否删除该数据?', '提示', {
  381. confirmButtonText: '确定',
  382. cancelButtonText: '取消',
  383. type: 'warning',
  384. center: true
  385. }).then(() => {
  386. that.$api.item.delete(id).then(data => {
  387. that.loading = false
  388. if (data.code === 200) {
  389. that.getPage()
  390. } else {
  391. this.$message({
  392. type: 'error',
  393. message: data.msg
  394. })
  395. }
  396. })
  397. }).catch(() => {
  398. })
  399. },
  400. getMajorNodes() {
  401. this.$api.workNode.nodesByBusiness('MAJOR_BUSINESS').then(res => {
  402. if (res.code === 200) {
  403. this.majorNodes = res.data
  404. }
  405. })
  406. },
  407. parentFalse() {
  408. this.visible = false;
  409. },
  410. transfer(recordId) {
  411. this.visible = true;
  412. this.recordId = recordId;
  413. },
  414. toDetail(row) {
  415. let reportNo = row.reportNo;
  416. let statementNo = row.statementNo;
  417. if (row.nodeCode === 'REPORT_OUT_APPLY' || row.nodeCode === 'LETTER_OUT_APPLY') {
  418. this.$router.push(`/major/my/order?todoBusinessId=${row.businessId}&sNo=${statementNo}&rNo=${reportNo}&tId=${row.taskId}&cId=${row.currentNodeId}`)
  419. return;
  420. }
  421. if (row.nodeCode === 'REPORT_OUT_FINANCE_CHECK' || row.nodeCode === 'REPORT_OUT_DEPARTMENT_CHECK' || row.nodeCode === 'LETTER_OUT_FINANCE_CHECK' || row.nodeCode === 'LETTER_OUT_DEPARTMENT_CHECK') {
  422. this.$router.push(`/out/warehouse/check?todoBusinessId=${row.businessId}&sNo=${statementNo}&rNo=${reportNo}&tId=${row.taskId}&cId=${row.currentNodeId}&nCode=${row.nodeCode}&businessType=MAJOR_BUSINESS`)
  423. return;
  424. }
  425. if (row.nodeCode === 'BUSINESS_ARCHIVING') {
  426. this.$router.push(`/major/saveFile/waiting`)
  427. return;
  428. }
  429. if (row.nodeCode === 'STATEMENT_DELIVERY') {
  430. this.$router.push(`/major/my/order?todoBusinessId=${row.businessId}&sNo=${statementNo}&tId=${row.taskId}&cId=${row.currentNodeId}`)
  431. return;
  432. }
  433. if (row.nodeCode === 'STATEMENT_IN' || row.nodeCode === 'STATEMENT_OUT' ||
  434. row.nodeCode === 'REPORT_IN' || row.nodeCode === 'REPORT_OUT' ||
  435. row.nodeCode === 'LETTER_IN' || row.nodeCode === 'LETTER_OUT') {
  436. this.$router.push(`/major/production/in?openDialog=${true}`)
  437. return;
  438. }
  439. if (reportNo && statementNo) {
  440. this.$router.push(`/major/todo/detail?id=${row.businessId}&orderId=${row.orderId}&reportNo=${reportNo}&statementNo=${row.statementNo}&doWorkflow=${true}&currentNodeId=${row.currentNodeId}&currentNodeCode=${row.nodeCode}&back=${'/major/todo'}`)
  441. } else if (!reportNo && statementNo) {
  442. this.$router.push(`/major/todo/detail?id=${row.businessId}&orderId=${row.orderId}&statementNo=${row.statementNo}&doWorkflow=${true}&currentNodeId=${row.currentNodeId}&currentNodeCode=${row.nodeCode}&back=${'/major/todo'}`)
  443. } else if (reportNo && !statementNo) {
  444. this.$router.push(`/major/todo/detail?id=${row.businessId}&orderId=${row.orderId}&reportNo=${reportNo}&doWorkflow=${true}&currentNodeId=${row.currentNodeId}&currentNodeCode=${row.nodeCode}&back=${'/major/todo'}`)
  445. } else {
  446. this.$router.push(`/major/todo/detail?id=${row.businessId}&orderId=${row.orderId}&doWorkflow=${true}&currentNodeId=${row.currentNodeId}&currentNodeCode=${row.nodeCode}&back=${'/major/todo'}`)
  447. }
  448. },
  449. sortTable(sortParams) {
  450. this.listQuery.ascs = sortParams.ascs;
  451. this.listQuery.descs = sortParams.descs;
  452. this.$api.workNodeTaskRecord.majorTaskTodoList(this.listQuery).then(res => {
  453. if (res.code === 200) {
  454. this.pageData = res.data;
  455. }
  456. })
  457. },
  458. switchHeader(data) {
  459. this.hiddenLabels.push(data);
  460. setCookie("MajorTodoList-hiddenLabels", this.hiddenLabels);
  461. },
  462. showAllLabel() {
  463. removeCookie("MajorTodoList-hiddenLabels");
  464. location.reload();
  465. },
  466. fliterSearch(params) {
  467. this.$api.workNodeTaskRecord.majorTaskTodoList(this.listQuery).then(res => {
  468. if (res.code === 200) {
  469. this.pageData = res.data;
  470. }
  471. })
  472. },
  473. resetParams() {
  474. this.$router.push({ query: {} });
  475. this.listQuery = {
  476. current: 1,
  477. size: 10,
  478. descs: 'created',
  479. }
  480. this.getPage();
  481. },
  482. // 批量提交流程节点
  483. batchCommitNode() {
  484. if (this.workNodeCommits.length > 0) {
  485. this.$confirm('确认批量提交已选中流程?', '提示', {
  486. confirmButtonText: '确定',
  487. cancelButtonText: '取消',
  488. type: 'warning'
  489. }).then(() => {
  490. this.$api.workflow.batchCommit(this.workNodeCommits).then(res => {
  491. if (res.code === 200 && res.data) {
  492. this.$notify({
  493. title: '成功',
  494. message: '工作流节点批量提交成功。',
  495. type: 'success',
  496. duration: 2000
  497. });
  498. this.getPage();
  499. this.selectBatchCommitPage();
  500. } else {
  501. this.$notify({
  502. title: '失败',
  503. message: res.message,
  504. type: 'error',
  505. duration: 2000
  506. });
  507. }
  508. })
  509. }).catch(() => {
  510. this.$message({
  511. type: 'info',
  512. message: '已取消批量提交'
  513. });
  514. });
  515. } else {
  516. this.$notify.error({
  517. title: '错误',
  518. message: '请选择至少一条流程再提交!'
  519. });
  520. }
  521. }
  522. },
  523. }
  524. </script>
  525. <style lang="scss" scoped>
  526. .enableClick:hover {
  527. color: #1890ff;
  528. cursor: pointer;
  529. }</style>