crmDoneList.vue 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462
  1. <template>
  2. <div class="todo-list">
  3. <Header />
  4. <div class="content-wrapper mt-15 max-w-[1200px] mx-auto">
  5. <div class="flex gap-5 items-center mb-4 bg-[#fff] py-2 pl-4 rounded-sm">
  6. <p class="flex items-center">
  7. <Icon
  8. icon="mynaui:arrow-up-down"
  9. class="icon pr-1 h-6 w-6"
  10. color="#014099"
  11. />CRM已办任务列表
  12. </p>
  13. <el-button
  14. type="primary"
  15. round
  16. size="small"
  17. color="#02409b"
  18. @click="router.back()"
  19. ><Icon
  20. icon="mynaui:corner-up-left"
  21. class="icon pr-1"
  22. width="20"
  23. height="20"
  24. />返回</el-button
  25. >
  26. </div>
  27. <div v-loading="loading" class="table-wrapper">
  28. <el-table
  29. v-loading="loading"
  30. :data="oaTasks"
  31. style="width: 100%"
  32. height="70vh"
  33. element-loading-text="加载中..."
  34. :empty-text="loading ? '' : '暂无数据'"
  35. :header-cell-style="{
  36. backgroundColor: '#e9f7ff',
  37. color: 'black',
  38. fontWeight: '400',
  39. }"
  40. :cell-style="{
  41. color: 'black',
  42. }"
  43. >
  44. <el-table-column
  45. type="index"
  46. label="序号"
  47. width="80"
  48. fixed="left"
  49. align="center"
  50. />
  51. <el-table-column
  52. prop="instTitle"
  53. label="流程标题"
  54. min-width="220"
  55. fixed="left"
  56. align="center"
  57. />
  58. <el-table-column
  59. prop="entityTypeId"
  60. label="业务类型"
  61. width="140"
  62. align="center"
  63. />
  64. <el-table-column
  65. prop="priority"
  66. label="优先级别"
  67. width="100"
  68. align="center"
  69. >
  70. <template #default="scope">
  71. <el-tag v-if="scope.row.priority == 50" type="warning" size="mini"
  72. >一般</el-tag
  73. >
  74. <el-tag
  75. v-else-if="scope.row.priority === 90"
  76. type="danger"
  77. size="mini"
  78. >
  79. 紧急
  80. </el-tag>
  81. <span v-else></span>
  82. </template>
  83. </el-table-column>
  84. <el-table-column
  85. prop="createAt"
  86. label="任务提交时间"
  87. width="180"
  88. align="center"
  89. >
  90. <template #default="scope">
  91. {{ timestampToDateTime(scope.row.submitAt) }}
  92. </template>
  93. </el-table-column>
  94. <el-table-column
  95. prop="createAt"
  96. label="任务创建时间"
  97. width="180"
  98. align="center"
  99. >
  100. <template #default="scope">
  101. {{ timestampToDateTime(scope.row.createdAt) }}
  102. </template>
  103. </el-table-column>
  104. <el-table-column
  105. prop="endAt"
  106. label="任务完成时间"
  107. width="180"
  108. align="center"
  109. >
  110. <template #default="scope">
  111. {{ timestampToDateTime(scope.row.endAt) }}
  112. </template>
  113. </el-table-column>
  114. <el-table-column
  115. prop="userName"
  116. label="任务提交人"
  117. width="120"
  118. align="center"
  119. />
  120. <el-table-column
  121. prop="status"
  122. label="任务状态"
  123. width="100"
  124. align="center"
  125. >
  126. <template #default="scope">
  127. <el-tag v-if="scope.row.status === 1" type="info" size="mini"
  128. >待提交</el-tag
  129. >
  130. <el-tag
  131. v-else-if="scope.row.status === 2"
  132. type="info"
  133. size="mini"
  134. >
  135. 待重新提交
  136. </el-tag>
  137. <el-tag
  138. v-else-if="scope.row.status === 3"
  139. type="info"
  140. size="mini"
  141. >
  142. 待提交到退回节点
  143. </el-tag>
  144. <el-tag
  145. v-else-if="scope.row.status === 4"
  146. type="primary"
  147. size="mini"
  148. >
  149. 已提交
  150. </el-tag>
  151. <el-tag
  152. v-else-if="scope.row.status === 5"
  153. type="info"
  154. size="mini"
  155. >
  156. 待办理
  157. </el-tag>
  158. <el-tag
  159. v-else-if="scope.row.status === 6"
  160. type="success"
  161. size="mini"
  162. >
  163. 已同意
  164. </el-tag>
  165. <el-tag
  166. v-else-if="scope.row.status === 7"
  167. type="danger"
  168. size="mini"
  169. >
  170. 已拒绝
  171. </el-tag>
  172. <el-tag
  173. v-else-if="scope.row.status === 8"
  174. type="danger"
  175. size="mini"
  176. >
  177. 已转办
  178. </el-tag>
  179. <el-tag
  180. v-else-if="scope.row.status === 9"
  181. type="primary"
  182. size="mini"
  183. >
  184. 已抄送
  185. </el-tag>
  186. <el-tag
  187. v-else-if="scope.row.status === 10"
  188. type="warning"
  189. size="mini"
  190. >
  191. 加签挂起
  192. </el-tag>
  193. <el-tag
  194. v-else-if="scope.row.status === 11"
  195. type="warning"
  196. size="mini"
  197. >
  198. 任务挂起
  199. </el-tag>
  200. <el-tag
  201. v-else-if="scope.row.status === 12"
  202. type="warning"
  203. size="mini"
  204. >
  205. 已收回
  206. </el-tag>
  207. <el-tag
  208. v-else-if="scope.row.status === 13"
  209. type="warning"
  210. size="mini"
  211. >
  212. 已移交
  213. </el-tag>
  214. <el-tag
  215. v-else-if="scope.row.status === 14"
  216. type="warning"
  217. size="mini"
  218. >
  219. 已委托
  220. </el-tag>
  221. <el-tag
  222. v-else-if="scope.row.status === 99"
  223. type="success"
  224. size="mini"
  225. >
  226. 无需办理
  227. </el-tag>
  228. <span v-else></span>
  229. </template>
  230. </el-table-column>
  231. <el-table-column
  232. label="操作"
  233. width="120"
  234. fixed="right"
  235. align="center"
  236. >
  237. <template #default="scope">
  238. <span
  239. class="text-[#02409b] cursor-pointer"
  240. @click="goBackPage(scope.row)"
  241. >处理</span
  242. >
  243. </template>
  244. </el-table-column>
  245. </el-table>
  246. </div>
  247. <div class="pagination-container">
  248. <el-pagination
  249. v-model:current-page="pagination.pageNum"
  250. v-model:page-size="pagination.pageSize"
  251. :total="pagination.total"
  252. :page-sizes="[10, 20, 50, 100]"
  253. layout="total, sizes, prev, pager, next"
  254. background
  255. @current-change="handleCurrentChange"
  256. @size-change="handleSizeChange"
  257. />
  258. </div>
  259. </div>
  260. <Footer />
  261. </div>
  262. </template>
  263. <script setup>
  264. import Header from "@components/home/header.vue";
  265. import { ref, onMounted } from "vue";
  266. import { getCRMTasks, ssoLogin } from "@/api/user";
  267. import { useUserStore } from "@/stores/useUserStore";
  268. import { Icon } from "@iconify/vue";
  269. import router from "@/router";
  270. const userStore = useUserStore();
  271. const oaTasks = ref([]);
  272. const loading = ref(false);
  273. const pagination = ref({
  274. pageNum: 1,
  275. pageSize: 10,
  276. total: 0,
  277. });
  278. const goBackPage = async (row) => {
  279. // const res = await ssoLogin({
  280. // username: userStore.getUser.username,
  281. // });
  282. // if (res) {
  283. // const newTab = window.open("", "_blank");
  284. // newTab.location.href =
  285. // "https://yfoa.keruioil.com/wui/index.html" +
  286. // "?ssoToken=" +
  287. // res +
  288. // "#/main";
  289. // setTimeout(function () {
  290. // newTab.location.href = `https://yfoa.keruioil.com/spa/workflow/static4form/index.html?_rdm=1776063595284#/main/workflow/req?requestid=${row.requestId}`;
  291. // }, 50);
  292. // }
  293. };
  294. const handleCurrentChange = async (page) => {
  295. pagination.value.pageNum = page;
  296. loading.value = true;
  297. try {
  298. const res = await getCRMTasks({
  299. id: userStore.getUser.username,
  300. type: "approved",
  301. pageNum: pagination.value.pageNum,
  302. pageSize: pagination.value.pageSize,
  303. });
  304. oaTasks.value = res.todoList;
  305. pagination.value.total = res.todoCount;
  306. } finally {
  307. loading.value = false;
  308. }
  309. };
  310. const handleSizeChange = async (size) => {
  311. pagination.value.pageSize = size;
  312. pagination.value.pageNum = 1;
  313. loading.value = true;
  314. try {
  315. const res = await getCRMTasks({
  316. id: userStore.getUser.username,
  317. type: "approved",
  318. pageNum: pagination.value.pageNum,
  319. pageSize: pagination.value.pageSize,
  320. });
  321. oaTasks.value = res.todoList;
  322. pagination.value.total = res.todoCount;
  323. } finally {
  324. loading.value = false;
  325. }
  326. };
  327. function timestampToDateTime(timestamp) {
  328. // 兼容 10位(秒) / 13位(毫秒)
  329. const len = String(timestamp).length;
  330. const date = new Date(Number(timestamp) * (len === 10 ? 1000 : 1));
  331. // 年
  332. const year = date.getFullYear();
  333. // 月(0~11 → +1)
  334. const month = String(date.getMonth() + 1).padStart(2, "0");
  335. // 日
  336. const day = String(date.getDate()).padStart(2, "0");
  337. // 时
  338. const hours = String(date.getHours()).padStart(2, "0");
  339. // 分
  340. const minutes = String(date.getMinutes()).padStart(2, "0");
  341. // 秒
  342. const seconds = String(date.getSeconds()).padStart(2, "0");
  343. return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
  344. }
  345. onMounted(async () => {
  346. if (userStore.getUser.username) {
  347. loading.value = true;
  348. try {
  349. const res = await getCRMTasks({
  350. id: userStore.getUser.username,
  351. type: "approved",
  352. pageNum: pagination.value.pageNum,
  353. pageSize: pagination.value.pageSize,
  354. });
  355. oaTasks.value = res.todoList;
  356. pagination.value.total = res.todoCount;
  357. } finally {
  358. loading.value = false;
  359. }
  360. }
  361. });
  362. </script>
  363. <style scoped>
  364. .todo-list {
  365. min-height: 100vh;
  366. display: flex;
  367. flex-direction: column;
  368. background-color: #f5f7fa;
  369. }
  370. .content {
  371. padding: 16px 20px;
  372. margin-top: 100px;
  373. }
  374. .pagination-wrap {
  375. display: flex;
  376. justify-content: flex-end;
  377. margin-top: 16px;
  378. }
  379. .news-container {
  380. min-height: 100vh;
  381. display: flex;
  382. flex-direction: column;
  383. background-color: #f5f7fa;
  384. }
  385. .content-wrapper {
  386. flex: 1;
  387. max-width: 1200px;
  388. /* margin: 0 auto; */
  389. padding: 20px;
  390. width: 100%;
  391. box-sizing: border-box;
  392. }
  393. .page-title {
  394. margin-bottom: 20px;
  395. color: #303133;
  396. border-left: 5px solid #409eff;
  397. padding-left: 10px;
  398. }
  399. .table-wrapper {
  400. min-height: 400px;
  401. background: #fff;
  402. padding: 20px;
  403. border-radius: 4px;
  404. }
  405. .table-title {
  406. font-weight: 500;
  407. color: #303133;
  408. }
  409. .table-summary {
  410. color: #606266;
  411. font-size: 13px;
  412. }
  413. .pagination-container {
  414. display: flex;
  415. justify-content: center;
  416. margin-top: 0px;
  417. padding: 20px 0;
  418. }
  419. </style>