ViewExpenseReport.vue 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415
  1. <template>
  2. <div class="table_btnbox">
  3. <!-- 搜索 -->
  4. <el-row class="top">
  5. <el-form v-model="queryFrom" size="small" label-width="120px" class="query-form">
  6. <el-form-item label="部门" prop="applySector">
  7. <el-input v-model="queryFrom.applySector" placeholder="请输入部门" class="widths" clearable></el-input>
  8. </el-form-item>
  9. <el-form-item label="支出账户" prop="company">
  10. <el-input v-model="queryFrom.company" placeholder="请输入支出账户" class="widths" clearable></el-input>
  11. </el-form-item>
  12. <el-form-item label="转账日期" prop="createTime">
  13. <el-date-picker v-model="createdate" type="daterange" range-separator="至" start-placeholder="开始日期"
  14. end-placeholder="结束日期" value-format="yyyy-MM-dd" @change="createTimeChange">
  15. </el-date-picker>
  16. </el-form-item>
  17. <el-form-item label="收款账户" prop="collectionMessage">
  18. <el-select v-model="queryFrom.collectionMessage" filterable clearable placeholder="收款账户">
  19. <el-option v-for="(item, index) in collectionData" :key="item.accountId + 'aa' + index" :label="item.name"
  20. :value="item.name">
  21. </el-option>
  22. </el-select>
  23. </el-form-item>
  24. <el-form-item label="费用类型" prop="fundUse">
  25. <el-select v-model="queryFrom.fundUse" filterable clearable placeholder="费用类型">
  26. <el-option v-for="(item, index) in fundFlowData" :key="index" :label="item.category" :value="item.category">
  27. </el-option>
  28. </el-select>
  29. <!-- <el-cascader
  30. v-model="queryFrom.fundUse"
  31. :show-all-levels="true"
  32. :clearable="true"
  33. :checkStrictly="true"
  34. :emitPath="false"
  35. placeholder="费用类型"
  36. :options="fundFlowData"
  37. filterable
  38. :props="{
  39. children: 'child',
  40. label: 'category',
  41. value: 'category',
  42. checkStrictly: false,
  43. }"
  44. ></el-cascader> -->
  45. </el-form-item>
  46. <el-form-item label="支出金额" prop="applyAmount">
  47. <el-input v-model="queryFrom.applyAmount" placeholder="请输入支出金额" class="widths" clearable></el-input>
  48. </el-form-item>
  49. <el-form-item>
  50. <kt-button label="查询" type="primary" @click="queryStaffInfo" />
  51. <kt-button label="批量导出" type="primary" :disabled="!this.expentList.length" @click="expendDataup" />
  52. </el-form-item>
  53. </el-form>
  54. </el-row>
  55. <!-- 表格 -->
  56. <kt-common-table :operationWidth="operationWidth" class="ktTable" :showBatchPrint="true" ref="dataTable"
  57. :data="pageResult" :columns="columns" :showOperation="false" @findPage="findPage"
  58. @selectionChange="selectionChange"></kt-common-table>
  59. </div>
  60. </template>
  61. <script>
  62. import ExpenseComponent from "./ExpenseComponent.vue"; //新增账户信息弹框
  63. // import ExpenseManagement from "./ExpenseManagement.vue"; //新增账户信息
  64. import KtButton from "@/views/Core/KtButton"; // 按钮权限组件
  65. import KtCommonTable from "@/views/Core/KtCommonTable.vue"; //表格组件
  66. import { toChies, convertPositive } from "../../../utils/moneyTransition";
  67. export default {
  68. name: "ExpenseApplyFor",
  69. components: { KtCommonTable, ExpenseComponent, KtButton },
  70. data() {
  71. //开票金额自定义校验
  72. let applyAmountRules = (rule, value, callback) => {
  73. if (value == 0) {
  74. callback(new Error("申请金额不能小于0"));
  75. } else {
  76. callback();
  77. }
  78. };
  79. return {
  80. createdate: [],
  81. formDisable: false, //资金申请form表单是否可选状态
  82. expentList: [], //批量导出数据
  83. expenseaaa: true,
  84. expendTitle: "新增资金使用申请单", //弹框标题
  85. operationWidth: 250, //操作单元格宽度
  86. queryFrom: {}, //查询form表单
  87. pageRequest: {
  88. // 列表查询条件
  89. pageNum: 1,
  90. pageSize: 10,
  91. },
  92. dialogFormVisible: false, //账户信息弹出框状态
  93. title: "新增账户信息", //账户信息弹框标题
  94. expenseDialog: false, //申请单显示状态
  95. pageResult: {
  96. //表格参数
  97. pageNum: 1,
  98. pageSize: 10,
  99. content: [],
  100. },
  101. columns: [
  102. // 申请列表表格头部
  103. {
  104. prop: "createTime",
  105. label: "转账日期",
  106. sortable: false,
  107. },
  108. {
  109. prop: "fundUse",
  110. label: "费用类型",
  111. sortable: false,
  112. },
  113. {
  114. prop: "remark",
  115. label: "摘要",
  116. sortable: false,
  117. },
  118. {
  119. prop: "applyAmount",
  120. label: "支出金额",
  121. sortable: false,
  122. },
  123. {
  124. prop: "applySector",
  125. label: "支出部门",
  126. sortable: false,
  127. },
  128. {
  129. prop: "company",
  130. label: "支出账户",
  131. sortable: false,
  132. },
  133. {
  134. prop: "collectionMessage",
  135. label: "收款方",
  136. sortable: false,
  137. },
  138. ],
  139. pickerOptions: {
  140. //日期快捷键
  141. disabledDate(time) {
  142. return time.getTime() > Date.now();
  143. },
  144. shortcuts: [
  145. {
  146. text: "今天",
  147. onClick(picker) {
  148. picker.$emit("pick", new Date());
  149. },
  150. },
  151. {
  152. text: "昨天",
  153. onClick(picker) {
  154. const date = new Date();
  155. date.setTime(date.getTime() - 3600 * 1000 * 24);
  156. picker.$emit("pick", date);
  157. },
  158. },
  159. {
  160. text: "一周前",
  161. onClick(picker) {
  162. const date = new Date();
  163. date.setTime(date.getTime() - 3600 * 1000 * 24 * 7);
  164. picker.$emit("pick", date);
  165. },
  166. },
  167. ],
  168. },
  169. payment_methodsData: [], //支付方式字典数据
  170. affiliationData: [], //归属字典数据
  171. affiliationData2: [], //归属字典数据
  172. collectionData: [], //收款单位信息数据
  173. innerCollectionData: [], //内部账户单位信息数据
  174. account_qualityData: [], //账户性质字典
  175. fundFlowData: [], //资金用途字典数据
  176. companyItem: {}, //选择单位整条数据
  177. collectionMessageItem: {}, //选择收款单位整条数据
  178. expendDataId: "", //修改时该条数据id
  179. buttonValue: "导 出", //弹框提交按钮内容
  180. collectionData: [], //收款单位信息数据
  181. };
  182. },
  183. created() {
  184. this.getAllUser(); //获取所有银行账户信息
  185. this.getTreeList()
  186. },
  187. mounted() { },
  188. methods: {
  189. createTimeChange(e) {
  190. if (e) {
  191. this.queryFrom.createTimeStart = e[0];
  192. this.queryFrom.createTimeEnd = e[1];
  193. } else {
  194. this.queryFrom.createTimeStart = "";
  195. this.queryFrom.createTimeEnd = "";
  196. }
  197. },
  198. //获取资金用途树数据
  199. getTreeList() {
  200. this.$api.expense.getAccountExpensesTreeList().then((res) => {
  201. if (res.code == 200) {
  202. this.fundFlowData = res.data;
  203. this.fundFlowSet();
  204. } else {
  205. this.$message.error(res.msg);
  206. }
  207. });
  208. },
  209. //资金用途数据转换 如果最后一项child数组长度为0把值变为null
  210. fundFlowSet(data) {
  211. data = data || this.fundFlowData;
  212. for (var i = 0; i < data.length; i++) {
  213. if (data[i].child.length) {
  214. this.fundFlowSet(data[i].child);
  215. } else {
  216. data[i].child = null;
  217. }
  218. }
  219. },
  220. //获取所有账户信息
  221. getAllUser() {
  222. this.$api.expense.getAccountByAccountName().then((res) => {
  223. if (res.code == 200) {
  224. let arr = [];
  225. let filteredData = res.data.filter(item => item.outerFlag == "1");
  226. filteredData.map(item => {
  227. if (item.invAccountCardList != null) {
  228. item.invAccountCardList.forEach((it) => {
  229. it.name =
  230. (item.outerFlag == 0 ? "内部用户" : "外部用户") +
  231. " " +
  232. (it.accountQuality == 0 ? "公户" : "私户") +
  233. " " +
  234. item.accountName +
  235. " " +
  236. it.bankCardNum +
  237. " " +
  238. it.bank;
  239. arr.push(...item.invAccountCardList);
  240. });
  241. }
  242. })
  243. this.collectionData = arr;
  244. }
  245. });
  246. },
  247. //表格多选事件
  248. selectionChange(e) {
  249. this.expentList = e.selections.map((item) => item.excelAccountOperateId);
  250. },
  251. //获取归属数据
  252. getAffiliationData() {
  253. this.$api.expense.getList().then((res) => {
  254. if (res.code == 200) {
  255. res.data.map((item) => {
  256. item.profit = 0;
  257. return item;
  258. });
  259. this.affiliationData = JSON.parse(JSON.stringify(res.data));
  260. this.affiliationData2 = JSON.parse(JSON.stringify(res.data));
  261. } else {
  262. this.$message.error(res.msg);
  263. }
  264. });
  265. },
  266. //导出公共方法
  267. expendDataup(e, idList) {
  268. idList = idList || this.expentList;
  269. this.$api.expense.deriveReport(idList).then((response) => {
  270. if (response.code == 200) {
  271. if (response.data == null) {
  272. this.$message.error("暂无导出数据,请重试!");
  273. return;
  274. }
  275. let url = process.env.BASE_URL + response.data; // 3.创建一个临时的url指向blob对象
  276. let a = document.createElement("a");
  277. a.href = url;
  278. a.click();
  279. window.URL.revokeObjectURL(url);
  280. document.body.removeChild(a); //移除a标签
  281. this.findPage();
  282. } else {
  283. this.$message.error(response.msg);
  284. }
  285. });
  286. },
  287. //搜索列表功能
  288. queryStaffInfo() {
  289. this.pageRequest.pageNum = 1;
  290. this.pageRequest.pageSize = 20;
  291. this.findPage();
  292. },
  293. //查询列表
  294. findPage(data) {
  295. if (data && data.pageRequest) {
  296. this.pageRequest.pageNum = data.pageRequest.pageNum;
  297. this.pageRequest.pageSize = data.pageRequest.pageSize;
  298. }
  299. let obj = JSON.parse(
  300. JSON.stringify({ ...this.queryFrom, ...this.pageRequest })
  301. );
  302. if (obj.applyTime != null && obj.applyTime.length > 0) {
  303. obj.applyTimeStart = obj.applyTime[0];
  304. obj.applyTimeEnd = obj.applyTime[1];
  305. }
  306. delete obj.applyTime;
  307. this.$api.expense
  308. .getDisburse(obj)
  309. .then((res) => {
  310. if (res.code == 200) {
  311. this.pageResult = {
  312. content: res.data.records,
  313. pageNum: res.data.current,
  314. pageSize: res.data.size,
  315. totalPages: res.data.pages,
  316. totalSize: res.data.total,
  317. };
  318. }
  319. else {
  320. this.$message.error(res.msg)
  321. }
  322. })
  323. .then(data != null ? data.callback : "");
  324. },
  325. //数据字典
  326. business(typeName) {
  327. this.$api.dict.findByLableName(typeName).then((res) => {
  328. this[typeName + "Data"] = res.data;
  329. if (typeName == "payment_methods") {
  330. this.tableForm.payMethod = [
  331. this[typeName + "Data"].find((item) => item.value == 2).label,
  332. ];
  333. }
  334. });
  335. },
  336. //支付方式转换
  337. toPayment(list) {
  338. let newList = [];
  339. list.forEach((item) => {
  340. let newItem = this.payment_methodsData.find(
  341. (payItem) => payItem.label == item
  342. );
  343. if (newItem) {
  344. newList.push(newItem.value);
  345. }
  346. });
  347. newList.sort();
  348. newList = newList.join(",");
  349. return newList;
  350. },
  351. },
  352. };
  353. </script>
  354. <style scoped>
  355. .query-form {
  356. display: flex;
  357. align-items: center;
  358. margin-top: 14px;
  359. flex-wrap: wrap;
  360. }
  361. .expense-table>>>.el-textarea__inner,
  362. .expense-table>>>.el-input__inner {
  363. border: none;
  364. padding: 0;
  365. text-align: center;
  366. }
  367. .expense-table>>>.el-form-item {
  368. margin: 0;
  369. padding: 0;
  370. }
  371. .el-icon-right {
  372. font-size: 20px;
  373. }
  374. .operation {
  375. margin-bottom: 15px;
  376. }
  377. .paymethod>>>.el-form-item__content {
  378. display: flex;
  379. align-items: center;
  380. }
  381. .el-icon-right {
  382. margin: 0 10px;
  383. }
  384. .table_btnbox {
  385. position: relative;
  386. }
  387. .dialog-body {
  388. overflow-y: auto;
  389. height: 500px;
  390. }
  391. </style>