reimbursementUserList.vue 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331
  1. <template>
  2. <div class="page">
  3. <el-form size="small" :inline="true" class="query-form" ref="searchForm" :model="searchForm" @keyup.enter.native="refreshList()" @submit.native.prevent>
  4. <el-form-item prop="userId" :rules=" [{trigger: 'blur'}]" label="人员">
  5. <SelectUserTree
  6. ref="companyTree"
  7. :props="{
  8. value: 'id', // ID字段名
  9. label: 'name', // 显示名称
  10. children: 'children' // 子级字段名
  11. }"
  12. :url="`/sys/user/treeUserDataByOfficeName?type=2&officeName=中审众环`"
  13. :value="searchForm.userId"
  14. :clearable="true"
  15. :accordion="true"
  16. @getValue="(value) => {searchForm.userId=value}"/>
  17. </el-form-item>
  18. <el-form-item prop="officeId" :rules=" [{trigger: 'blur'}]" label="部门">
  19. <SelectUserTree
  20. ref="companyTree"
  21. :props="{
  22. value: 'id', // ID字段名
  23. label: 'name', // 显示名称
  24. children: 'children' // 子级字段名
  25. }"
  26. :url="`/sys/user/treeUserDataByOfficeList?type=2&officeName=中审众环`"
  27. :value="searchForm.officeId"
  28. :clearable="true"
  29. :accordion="true"
  30. @getValue="(value) => {searchForm.officeId=value}"/>
  31. </el-form-item>
  32. <el-form-item label="年份" prop="year":rules="[{trigger:'blur'}]">
  33. <el-date-picker
  34. v-model="searchForm.year"
  35. type="year"
  36. value-format="yyyy"
  37. placeholder="选择年份">
  38. </el-date-picker>
  39. </el-form-item>
  40. <el-form-item label="报销来源" prop="reimbursementAddress">
  41. <el-select v-model="searchForm.reimbursementAddress" clearable placeholder="请选择">
  42. <el-option
  43. v-for="item in reimbursementAddressList"
  44. :key="item.value"
  45. :label="item.label"
  46. :value="item.value">
  47. </el-option>
  48. </el-select>
  49. </el-form-item>
  50. <el-form-item>
  51. <el-button type="primary" @click="refreshList()" size="small" icon="el-icon-search">查询</el-button>
  52. <el-button @click="resetSearch()" size="small" icon="el-icon-refresh-right">重置</el-button>
  53. </el-form-item>
  54. </el-form>
  55. <div class="bg-white top">
  56. <vxe-toolbar :refresh="{query: refreshList}" export print resizable custom>
  57. <template #buttons>
  58. <el-row>
  59. <el-button v-if="hasPermission('reimbursementUser:add')" type="primary" icon="el-icon-plus" size="small" @click="add()">新增</el-button>
  60. <el-button v-if="hasPermission('reimbursementUser:del')" type="danger" size="small" icon="el-icon-delete" @click="del()" :disabled="$refs.reimbursementUserTable && $refs.reimbursementUserTable.getCheckboxRecords().length === 0" plain>删除</el-button>
  61. <!--<el-button v-if="hasPermission('reimbursementUser:import')" type="default" @click="downloadTpl()" size="small">下载模板</el-button>-->
  62. <el-button v-if="hasPermission('reimbursementUser:add')" type="success" icon="el-icon-success" size="small" @click="initialize()">初始化</el-button>
  63. </el-row>
  64. </template>
  65. </vxe-toolbar>
  66. <div style="height: calc(100% - 80px);">
  67. <vxe-table
  68. border="inner"
  69. auto-resize
  70. resizable
  71. height="auto"
  72. :loading="loading"
  73. size="small"
  74. ref="reimbursementUserTable"
  75. show-header-overflow
  76. show-overflow
  77. highlight-hover-row
  78. :menu-config="{}"
  79. :print-config="{}"
  80. :export-config="{
  81. remote: true,
  82. filename: `中审众环报销人员信息数据${moment(new Date()).format('YYYY-MM-DD')}`,
  83. sheetName: '中审众环报销人员信息数据',
  84. exportMethod: exportMethod,
  85. types: ['xlsx'],
  86. modes: ['current', 'selected', 'all']
  87. }"
  88. @sort-change="sortChangeHandle"
  89. :sort-config="{remote:true}"
  90. :data="dataList"
  91. :checkbox-config="{}">
  92. <vxe-column type="checkbox" width="40px"> </vxe-column>
  93. <vxe-column title="人员" field="user.name">
  94. <template slot-scope="scope">
  95. <el-link type="primary" :underline="false" v-if="hasPermission('reimbursementUser:edit')" @click="view(scope.row.id)">{{scope.row.user.name}}</el-link>
  96. <el-link type="primary" :underline="false" v-else-if="hasPermission('reimbursementUser:view')" @click="view(scope.row.id,)">{{scope.row.user.name}}</el-link>
  97. <span v-else>{{scope.row.user.name}}</span>
  98. </template>
  99. </vxe-column>
  100. <vxe-column title="部门" field="officeName"></vxe-column>
  101. <vxe-column title="报销年份" field="year"></vxe-column>
  102. <vxe-column title="日报销额度" field="reimbursementQuotaDay"></vxe-column>
  103. <vxe-column title="年报销额度" field="reimbursementQuota"></vxe-column>
  104. <vxe-column title="分所已报额度" field="substationAlreadyReimbursementAmount"></vxe-column>
  105. <vxe-column title="总所已报额度" field="headquarterAlreadyReimbursementAmount"></vxe-column>
  106. <vxe-column title="总报销额度" field="alreadyReimbursementAmount"></vxe-column>
  107. <vxe-column title="剩余额度" field="remainReimbursementAmount"></vxe-column>
  108. <vxe-column title="已报天数" field="alreadyReimbursementDay"></vxe-column>
  109. <vxe-column title="剩余天数" field="surplusReimbursementDay"></vxe-column>
  110. <vxe-column title="操作" width="300px" fixed="right" align="center">
  111. <template slot-scope="scope">
  112. <el-button v-if="hasPermission('reimbursementUser:view')" type="text" icon="el-icon-view" size="small" @click="viewBusinessInfo(scope.row.id)">报销详情</el-button>
  113. <el-button v-if="hasPermission('reimbursementUser:edit')" type="text" icon="el-icon-edit" size="small" @click="edit(scope.row.id)">修改</el-button>
  114. <el-button v-if="hasPermission('reimbursementUser:del')" type="text" icon="el-icon-delete" size="small" @click="del(scope.row.id)">删除</el-button>
  115. </template>
  116. </vxe-column>
  117. </vxe-table>
  118. <vxe-pager
  119. background
  120. size="small"
  121. :current-page="tablePage.currentPage"
  122. :page-size="tablePage.pageSize"
  123. :total="tablePage.total"
  124. :page-sizes="[10, 20, 100, 1000, {label: '全量数据', value: 1000000}]"
  125. :layouts="['PrevPage', 'JumpNumber', 'NextPage', 'FullJump', 'Sizes', 'Total']"
  126. @page-change="currentChangeHandle">
  127. </vxe-pager>
  128. </div>
  129. </div>
  130. <!-- 弹窗, 新增 / 修改 -->
  131. <reimbursementUserForm ref="reimbursementUserForm" @refreshDataList="refreshList"></reimbursementUserForm>
  132. </div>
  133. </template>
  134. <script>
  135. import SelectUserTree from '@/views/modules/reimbursementSys/utils/treeReimbursementBuinessUserSelect.vue'
  136. import ReimbursementUser from '@/api/reimbursementSys/user/reimbursementUserService'
  137. import reimbursementUserForm from './reimbursementUserForm'
  138. export default {
  139. data () {
  140. return {
  141. dataList: [],
  142. searchForm: {
  143. year: '',
  144. officeType: '1',
  145. userId: '',
  146. officeId: '',
  147. reimbursementAddress: ''
  148. },
  149. tablePage: {
  150. total: 0,
  151. currentPage: 1,
  152. pageSize: 10,
  153. orders: [{column: 'a.create_date', asc: false}]
  154. },
  155. reimbursementAddressList: [{
  156. value: '0',
  157. label: '分所报销'
  158. }, {
  159. value: '1',
  160. label: '总所报销'
  161. }],
  162. loading: false
  163. }
  164. },
  165. components: {
  166. SelectUserTree,
  167. reimbursementUserForm
  168. },
  169. ReimbursementUser: null,
  170. created () {
  171. this.reimbursementUser = new ReimbursementUser()
  172. },
  173. activated () {
  174. this.refreshList()
  175. },
  176. methods: {
  177. // 获取数据列表
  178. refreshList () {
  179. this.loading = true
  180. this.reimbursementUser.findList({
  181. 'current': this.tablePage.currentPage,
  182. 'size': this.tablePage.pageSize,
  183. 'orders': this.tablePage.orders,
  184. ...this.searchForm
  185. }).then(({data}) => {
  186. this.dataList = data.records
  187. this.tablePage.total = data.total
  188. this.loading = false
  189. })
  190. },
  191. // 当前页
  192. currentChangeHandle ({ currentPage, pageSize }) {
  193. this.tablePage.currentPage = currentPage
  194. this.tablePage.pageSize = pageSize
  195. this.refreshList()
  196. },
  197. resetSearch () {
  198. this.$refs.searchForm.resetFields()
  199. this.$nextTick(() => {
  200. this.refreshList()
  201. })
  202. },
  203. // 排序
  204. sortChangeHandle (column) {
  205. this.tablePage.orders = []
  206. if (column.order != null) {
  207. this.tablePage.orders.push({column: this.$utils.toLine(column.property), asc: column.order === 'asc'})
  208. }
  209. this.refreshList()
  210. },
  211. // 自定义服务端导入
  212. importMethod ({ file }) {
  213. // 处理表单
  214. const formBody = new FormData()
  215. formBody.append('file', file)
  216. this.reimbursementUser.importExcel(formBody).then(result => {
  217. this.$message.success(result.data)
  218. this.refreshList()
  219. })
  220. },
  221. // 下载模板
  222. downloadTpl () {
  223. this.reimbursementUser.exportTemplate().then((res) => {
  224. // 将二进制流文件写入excel表,以下为重要步骤
  225. this.$utils.downloadExcel(res.data, '报销人员导入模板')
  226. }).catch(function (err) {
  227. if (err.response) {
  228. console.log(err.response)
  229. }
  230. })
  231. },
  232. // 新增
  233. add () {
  234. this.$refs.reimbursementUserForm.init('add', {id: '', parent: {id: '', name: ''}})
  235. },
  236. // 修改
  237. edit (id) {
  238. this.$refs.reimbursementUserForm.init('edit', id)
  239. },
  240. // 查看
  241. view (id) {
  242. this.$refs.reimbursementUserForm.init('view', id)
  243. },
  244. // 查看业务报销详情
  245. viewBusinessInfo (id) {
  246. this.$router.push({path: `/reimbursementSys/user/reimbursementUserBusinessList`, query: {userId: id, title: '报销详情'}})
  247. },
  248. // 删除
  249. del (id) {
  250. let ids = id || this.$refs.reimbursementUserTable.getCheckboxRecords().map(item => {
  251. return item.id
  252. }).join(',')
  253. this.$confirm(`确定删除该记录吗?`, '提示', {
  254. confirmButtonText: '确定',
  255. cancelButtonText: '取消',
  256. type: 'warning'
  257. }).then(() => {
  258. this.loading = true
  259. this.reimbursementUser.delete(ids).then(({data}) => {
  260. this.loading = false
  261. this.$message({
  262. message: data,
  263. type: 'success',
  264. duration: 1500
  265. })
  266. this.refreshList()
  267. })
  268. this.refreshList()
  269. })
  270. },
  271. // 初始化按钮
  272. initialize () {
  273. this.$confirm(`确定初始化人员信息吗?`, '提示', {
  274. confirmButtonText: '确定',
  275. cancelButtonText: '取消',
  276. type: 'warning'
  277. }).then(() => {
  278. this.loading = true
  279. this.reimbursementUser.initialize({
  280. 'officeType': this.searchForm.officeType
  281. }).then(({data}) => {
  282. this.loading = false
  283. this.$message({
  284. message: data,
  285. type: 'success',
  286. duration: 1500
  287. })
  288. this.refreshList()
  289. })
  290. this.refreshList()
  291. })
  292. },
  293. // 自定义服务端导出
  294. exportMethod ({ options }) {
  295. // 传给服务端的参数
  296. const params = {
  297. 'current': this.tablePage.currentPage,
  298. 'size': this.tablePage.pageSize,
  299. 'orders': this.tablePage.orders,
  300. ...this.searchForm,
  301. filename: options.filename,
  302. sheetName: options.sheetName,
  303. isHeader: options.isHeader,
  304. original: options.original,
  305. mode: options.mode,
  306. selectIds: options.mode === 'selected' ? options.data.map(item => item.id) : [],
  307. exportFields: options.columns.map(column => column.property)
  308. }
  309. return this.reimbursementUser.exportExcel(params).then((res) => {
  310. // 将二进制流文件写入excel表,以下为重要步骤
  311. this.$utils.downloadExcel(res.data, options.filename)
  312. }).catch(function (err) {
  313. if (err.response) {
  314. console.log(err.response)
  315. }
  316. })
  317. }
  318. }
  319. }
  320. </script>