ViewExpenseReport.vue 13 KB

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