index.vue 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246
  1. <template>
  2. <div class="oa-sys-list-view">
  3. <div class="searchBox">
  4. <div class="form">
  5. <span class="formSpan">报销单号:</span>
  6. <el-input v-model="queryParams.travelCostNo" placeholder="请输入报销单号" />
  7. </div>
  8. <div class="form">
  9. <span class="formSpan">报销人:</span>
  10. <UserOrgTree v-model="queryParams.userId" placeholder="请选择报销人" />
  11. </div>
  12. <div class="form">
  13. <span class="formSpan">报销人部门:</span>
  14. <DeptTree v-model="queryParams['deptId']" placeholder="请选择部门" check-strictly />
  15. </div>
  16. <div class="form">
  17. <span class="formSpan">项目部门:</span>
  18. <DeptTree v-model="queryParams['projectDeptId']" placeholder="请选择部门" check-strictly />
  19. </div>
  20. <div class="form" style="width: 380px">
  21. <span class="formSpan">申请时间:</span>
  22. <el-date-picker
  23. v-model="queryParams.applyTime"
  24. value-format="YYYY-MM-DD HH:mm:ss"
  25. type="daterange"
  26. unlink-panels
  27. range-separator="到"
  28. start-placeholder="开始日期"
  29. end-placeholder="结束日期"
  30. />
  31. </div>
  32. <div class="form">
  33. <span class="formSpan">状态:</span>
  34. <el-select v-model="queryParams.status" placeholder="状态" clearable class="!w-240px">
  35. <el-option
  36. v-for="dict in getIntDictOptions(DICT_TYPE.FINANCE_STATUS)"
  37. :key="dict.value"
  38. :label="dict.label"
  39. :value="dict.value"
  40. />
  41. </el-select>
  42. </div>
  43. <div class="form">
  44. <span class="formSpan">报销总金额:</span>
  45. <el-input v-model="queryParams.totalAmount" placeholder="请输入报销总金额" />
  46. </div>
  47. <div class="from">
  48. <div class="btnBox">
  49. <el-button type="primary" style="background: #3485ff" @click="handleQuery">
  50. <img src="@/assets/imgs/OA/search.png" class="mr-8px" alt="" />
  51. 查询</el-button
  52. >
  53. </div>
  54. </div>
  55. </div>
  56. <div class="infoBox">
  57. <ul>
  58. <li v-for="(item, index) in infoList" :key="index" class="mr-40px">
  59. <p>{{ item.name }}:</p>
  60. <h4 class="font-size-18px">{{ item.num.toFixed(2) }}</h4>
  61. </li>
  62. </ul>
  63. </div>
  64. <div class="tableBox">
  65. <TableLayout :is-loading="loading" :data="list">
  66. <el-table-column type="index" />
  67. <el-table-column
  68. show-overflow-tooltip="true"
  69. align="center"
  70. prop="travelCostNo"
  71. label="报销单号"
  72. />
  73. <el-table-column align="center" prop="userNickname" label="报销人" />
  74. <el-table-column
  75. show-overflow-tooltip="true"
  76. align="center"
  77. prop="deptName"
  78. label="报销人部门"
  79. />
  80. <el-table-column
  81. align="center"
  82. prop="applyTime"
  83. :formatter="dateFormatter2"
  84. label="申请时间"
  85. />
  86. <el-table-column align="center" prop="totalAmount" label="报销总金额" />
  87. <el-table-column
  88. show-overflow-tooltip="true"
  89. align="center"
  90. prop="projectNo"
  91. label="项目编号"
  92. />
  93. <el-table-column
  94. show-overflow-tooltip="true"
  95. align="center"
  96. prop="projectName"
  97. label="项目名称"
  98. />
  99. <el-table-column
  100. show-overflow-tooltip="true"
  101. align="center"
  102. prop="projectDeptName"
  103. label="项目部门"
  104. />
  105. <el-table-column align="center" label="差旅起止时间" width="240">
  106. <template #default="scope">
  107. <span>{{ dateFormatter2(null, null, scope.row.startTime) }}</span>
  108. -
  109. <span>{{ dateFormatter2(null, null, scope.row.endTime) }}</span>
  110. </template>
  111. </el-table-column>
  112. <el-table-column align="center" prop="status" label="状态" />
  113. <el-table-column align="center" label="操作" fixed="right" width="80">
  114. <template #default="scope">
  115. <div class="operateBtn" @click="operateClick(scope.row)">
  116. <span>查看</span>
  117. </div>
  118. </template>
  119. </el-table-column>
  120. </TableLayout>
  121. <div class="pageBox">
  122. <el-pagination
  123. v-model:current-page="queryParams.pageNo"
  124. :page-size="10"
  125. background
  126. layout="total, prev, pager, next, jumper"
  127. :total="total"
  128. @current-change="handleCurrentChange"
  129. />
  130. </div>
  131. </div>
  132. </div>
  133. </template>
  134. <script setup lang="ts">
  135. import { DICT_TYPE, getIntDictOptions } from '@/utils/dict'
  136. import * as TravelCostApi from '@/api/oa/travelCost'
  137. import * as DeptApi from '@/api/system/dept'
  138. import { dateFormatter2 } from '@/utils/formatTime'
  139. import { handleTree } from '@/utils/tree'
  140. import TableLayout from '../../oaViews/layout/TableLayout.vue'
  141. import DeptTree from '@/views/OaSystem/components/DeptTree/index.vue'
  142. import UserOrgTree from '@/views/OaSystem/components/UserOrgTree/index.vue'
  143. defineOptions({ name: 'ClfbxPage' })
  144. const queryParams = reactive({
  145. pageNo: 1,
  146. pageSize: 10,
  147. travelCostNo: undefined,
  148. userId: undefined,
  149. deptId: undefined,
  150. applyTime: [],
  151. projectDeptId: undefined,
  152. costType: undefined,
  153. status: undefined,
  154. totalAmount: undefined
  155. })
  156. const infoList: any = ref([
  157. {
  158. name: '报销总金额(元)',
  159. num: 0
  160. },
  161. {
  162. name: '已报销总金额(元)',
  163. num: 0
  164. },
  165. {
  166. name: '办理中总金额(元)',
  167. num: 0
  168. }
  169. ])
  170. const loading = ref(true) // 列表的加载中
  171. const total = ref(0) // 列表的总页数
  172. const list = ref([]) // 列表的数
  173. const deptList = ref<Tree[]>([]) // 树形结构
  174. const userList = ref<Tree[]>([]) // 树形结构
  175. const router = useRouter()
  176. /** 查询列表 */
  177. const getList = async () => {
  178. loading.value = true
  179. try {
  180. const data = await TravelCostApi.getTravelCostPage(queryParams)
  181. list.value = data.list
  182. total.value = data.total
  183. } finally {
  184. loading.value = false
  185. }
  186. }
  187. /** 用户列表 */
  188. const initTreeUsers = async () => {
  189. DeptApi.getSimpleDeptUserAllList().then((res) => {
  190. userList.value = handleTree(res)
  191. })
  192. }
  193. /** 部门列表 */
  194. const initTreeDeps = async () => {
  195. DeptApi.getSimpleDeptList().then((res) => {
  196. deptList.value = handleTree(res)
  197. })
  198. }
  199. /** 查询概况 */
  200. const getOverview = async () => {
  201. const data = await TravelCostApi.getTravelCostOverview(queryParams)
  202. infoList.value[0].num = data.totalAmount
  203. infoList.value[1].num = data.totalUseAmount
  204. infoList.value[2].num = data.totalApplyAmount
  205. }
  206. /** 搜索按钮操作 */
  207. const handleQuery = () => {
  208. queryParams.pageNo = 1
  209. getList()
  210. getOverview()
  211. }
  212. /** 列表查看操作 */
  213. const operateClick = (row: any) => {
  214. router.push({
  215. path: '/processLook',
  216. query: {
  217. url:
  218. `${
  219. import.meta.env.VITE_PROCESS_DETAIL_URI
  220. }/IFlowInstance/redirectFlowPage?flowInstanceId=` + row.instanceId
  221. }
  222. })
  223. }
  224. /** 分页操作 */
  225. const handleCurrentChange = (pageNo: number) => {
  226. queryParams.pageNo = pageNo
  227. getList()
  228. }
  229. /** 初始化 */
  230. onMounted(() => {
  231. initTreeDeps()
  232. initTreeUsers()
  233. getList()
  234. getOverview()
  235. })
  236. </script>