payRecord.vue 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532
  1. <template>
  2. <div class="m-container">
  3. <h2>
  4. <div class="squrt"></div>
  5. 支出记录
  6. </h2>
  7. <div class="m-core">
  8. <el-upload
  9. v-permission="'import/downloadTemplate'"
  10. style="display: inline-block"
  11. action="/api-web/import/financialExpenditure"
  12. :show-file-list="false"
  13. :before-upload="beforeUpload"
  14. accept=".xlsx,.xls"
  15. :headers="headers"
  16. :on-error="handleError"
  17. :on-success="handleSuccess"
  18. >
  19. <el-button class="btn-primary">导入</el-button>
  20. </el-upload>
  21. <el-button
  22. @click="downloadFile"
  23. v-permission="'import/downloadTemplate'"
  24. class="btn-primary"
  25. >模版文件下载</el-button
  26. >
  27. <!-- 搜索类型 -->
  28. <save-form
  29. :inline="true"
  30. class="searchForm"
  31. :model="searchForm"
  32. @submit="search"
  33. @reset="onReSet"
  34. >
  35. <el-form-item>
  36. <el-input
  37. v-model.trim="searchForm.search"
  38. clearable
  39. placeholder="批次号、申请人等"
  40. type="text"
  41. ></el-input>
  42. </el-form-item>
  43. <el-form-item>
  44. <el-select
  45. v-model.trim="searchForm.organId"
  46. clearable
  47. filterable
  48. placeholder="请选择所属分部"
  49. >
  50. <el-option
  51. v-for="(item, index) in selects.branchs"
  52. :key="index"
  53. :label="item.name"
  54. :value="item.id"
  55. ></el-option>
  56. </el-select>
  57. </el-form-item>
  58. <el-form-item>
  59. <el-select
  60. clearable
  61. filterable
  62. placeholder="请选择所属学校"
  63. v-model="searchForm.cooperationOrganId"
  64. >
  65. <el-option
  66. v-for="(item, index) in cooperations"
  67. :key="index"
  68. :label="item.name"
  69. :value="item.id"
  70. ></el-option>
  71. </el-select>
  72. </el-form-item>
  73. <!-- <el-form-item>
  74. <el-select clearable filterable placeholder="请选择支出类型" v-model="searchForm.saleType">
  75. <el-option label="1" value="1"></el-option>
  76. </el-select>
  77. </el-form-item>
  78. <el-form-item>
  79. <el-select clearable filterable placeholder="请选择支出类别" v-model="searchForm.saleType">
  80. <el-option label="1" value="1"></el-option>
  81. </el-select>
  82. </el-form-item>
  83. <el-form-item>
  84. <el-select clearable filterable placeholder="请选择收款方式" v-model="searchForm.paymentChannel">
  85. <el-option v-for="item in paymentChannelStatus" :key="item.value" :label="item.label" :value="item.value"></el-option>
  86. </el-select>
  87. </el-form-item> -->
  88. <el-form-item>
  89. <el-date-picker
  90. style="width: 410px"
  91. v-model.trim="searchForm.orderDate"
  92. type="daterange"
  93. value-format="yyyy-MM-dd"
  94. @change="searchOrderDate"
  95. range-separator="至"
  96. start-placeholder="付款开始日期"
  97. end-placeholder="付款结束日期"
  98. :picker-options="{ firstDayOfWeek: 1 }"
  99. >
  100. </el-date-picker>
  101. </el-form-item>
  102. <el-form-item>
  103. <el-button native-type="submit" type="danger">搜索</el-button>
  104. <el-button native-type="reset" type="primary">重置</el-button>
  105. </el-form-item>
  106. </save-form>
  107. <!-- 列表 -->
  108. <el-row>
  109. <el-col :span="24">
  110. <el-button
  111. type="primary"
  112. v-permission="'financialExpenditure/batchDel/4043'"
  113. size="medium"
  114. icon="el-icon-delete"
  115. style="
  116. background-color: #14928a;
  117. border: 1px solid #14928a;
  118. margin-bottom: 15px;
  119. "
  120. @click="onBatchDel"
  121. >批量删除</el-button
  122. >
  123. </el-col>
  124. </el-row>
  125. <div class="tableWrap">
  126. <el-table
  127. :data="tableList"
  128. style="width: 100%"
  129. @selection-change="handleSelectionChange"
  130. :header-cell-style="{ background: '#EDEEF0', color: '#444' }"
  131. >
  132. <el-table-column type="selection" width="50"></el-table-column>
  133. <el-table-column align="center" prop="id" label="批次号">
  134. <template slot-scope="scope">
  135. <div>
  136. <copy-text>{{ scope.row.id }}</copy-text>
  137. </div>
  138. </template>
  139. </el-table-column>
  140. <el-table-column
  141. align="center"
  142. prop="financialProcessNo"
  143. label="流程编号"
  144. >
  145. <template slot-scope="scope">
  146. <div>
  147. <copy-text>{{ scope.row.financialProcessNo }}</copy-text>
  148. </div>
  149. </template>
  150. </el-table-column>
  151. <el-table-column
  152. align="center"
  153. prop="dingtalkProcessNo"
  154. label="钉钉流程编号"
  155. >
  156. <template slot-scope="scope">
  157. <div>
  158. <copy-text>{{ scope.row.dingtalkProcessNo }}</copy-text>
  159. </div>
  160. </template>
  161. </el-table-column>
  162. <el-table-column align="center" prop="organName" label="费用归属分部">
  163. <template slot-scope="scope">
  164. <div>
  165. <copy-text>{{ scope.row.organName }}</copy-text>
  166. </div>
  167. </template>
  168. </el-table-column>
  169. <el-table-column
  170. align="center"
  171. prop="cooperationName"
  172. label="费用归属学校"
  173. >
  174. <template slot-scope="scope">
  175. <div>
  176. <copy-text>{{ scope.row.cooperationName }}</copy-text>
  177. </div>
  178. </template>
  179. </el-table-column>
  180. <el-table-column align="center" prop="applyUser" label="申请人">
  181. <template slot-scope="scope">
  182. <div>
  183. <copy-text>{{ scope.row.applyUser }}</copy-text>
  184. </div>
  185. </template>
  186. </el-table-column>
  187. <!-- <el-table-column align='center' prop="itemDetail" label="费用项目"></el-table-column> -->
  188. <el-table-column align="center" prop="amount" label="付款金额">
  189. <template slot-scope="scope">
  190. <div>
  191. {{ scope.row.amount | moneyFormat }}
  192. </div>
  193. </template>
  194. </el-table-column>
  195. <el-table-column align="center" prop="paymentTime" label="付款时间">
  196. <template slot-scope="scope">
  197. <div>
  198. {{ scope.row.paymentTime | dayjsFormat }}
  199. </div>
  200. </template>
  201. </el-table-column>
  202. <el-table-column align="center" prop="cause" label="事由">
  203. <template slot-scope="scope">
  204. <div>
  205. <el-tooltip
  206. class="item"
  207. effect="dark"
  208. :content="scope.row.cause"
  209. placement="top"
  210. >
  211. <div class="noWrap">{{ scope.row.cause }}</div>
  212. </el-tooltip>
  213. </div>
  214. </template>
  215. </el-table-column>
  216. <el-table-column align="center" label="费用类型">
  217. <template slot-scope="scope">{{
  218. scope.row.type | feeType
  219. }}</template>
  220. </el-table-column>
  221. <el-table-column align="center" label="费用项目">
  222. <template slot-scope="scope">{{
  223. scope.row.feeProject | feeProject
  224. }}</template>
  225. </el-table-column>
  226. <el-table-column
  227. align="center"
  228. prop="itemDetail"
  229. label="备注"
  230. ></el-table-column>
  231. <el-table-column
  232. align="center"
  233. width="120px"
  234. fixed="right"
  235. label="操作"
  236. >
  237. <template slot-scope="scope">
  238. <div>
  239. <el-button type="text" @click="lookDetail(scope.row)"
  240. >详情</el-button
  241. >
  242. <el-popconfirm
  243. title="确定删除该条数据吗?"
  244. @confirm="() => removeRecord(scope.row.id)"
  245. v-permission="'financialExpenditure/batchDel/4042'"
  246. >
  247. <el-button type="text" slot="reference">删除</el-button>
  248. </el-popconfirm>
  249. </div>
  250. </template>
  251. </el-table-column>
  252. </el-table>
  253. <pagination
  254. sync
  255. :total.sync="pageInfo.total"
  256. :page.sync="pageInfo.page"
  257. :limit.sync="pageInfo.limit"
  258. :page-sizes="pageInfo.page_size"
  259. @pagination="getList"
  260. />
  261. </div>
  262. <recorddetail
  263. :show="show"
  264. @closeReset="closeReset"
  265. @getList="getList"
  266. :item="activeRow"
  267. />
  268. </div>
  269. <!-- <el-dialog
  270. title="修改支出记录"
  271. :visible.sync="visible"
  272. >
  273. <el-form :model="updateForm" :rules="updateRules" label-width="100px" ref="updateForm">
  274. <el-form-item label="批次号" prop="batchNo">
  275. <el-input v-model="ruleForm.batchNo"></el-input>
  276. </el-form-item>
  277. <el-form-item label="流程编号" prop="financialProcessNo">
  278. <el-input v-model="ruleForm.batchNo"></el-input>
  279. </el-form-item>
  280. <el-form-item label="钉钉流程编号" prop="dingtalkProcessNo">
  281. <el-input v-model="ruleForm.batchNo"></el-input>
  282. </el-form-item>
  283. <el-form-item label="费用归属分部" prop="organId">
  284. <el-input v-model="ruleForm.batchNo"></el-input>
  285. </el-form-item>
  286. <el-form-item label="费用归属学校" prop="cooperationOrganId">
  287. <el-input v-model="ruleForm.batchNo"></el-input>
  288. </el-form-item>
  289. <el-form-item label="费用归属学校" prop="cooperationOrganId">
  290. <el-input v-model="ruleForm.batchNo"></el-input>
  291. </el-form-item>
  292. </el-form>
  293. <span slot="footer" class="dialog-footer">
  294. <el-button @click="visible = false">取 消</el-button>
  295. <el-button type="primary" @click="visible = false">确 定</el-button>
  296. </span>
  297. </el-dialog> -->
  298. </div>
  299. </template>
  300. <script>
  301. import pagination from "@/components/Pagination/index";
  302. import { Export } from "@/utils/downLoadFile";
  303. import {
  304. getFinancialExpenditure,
  305. applyRefundAudit,
  306. removeFinancialExpenditure,
  307. updateFinancialExpenditure,
  308. } from "@/api/orderManager";
  309. import { getEmployeeOrgan, getCooperation } from "@/api/buildTeam";
  310. import { getToken } from "@/utils/auth";
  311. import { paymentChannelStatus } from "@/utils/searchArray";
  312. import recorddetail from "@/views/businessManager/orderManager/payRecordConponents/payRecordDetail";
  313. import load from "@/utils/loading";
  314. import dayjs from "dayjs";
  315. import { getTimes } from "@/utils";
  316. export default {
  317. components: { pagination, recorddetail },
  318. name: "backMoney",
  319. data() {
  320. return {
  321. show: false,
  322. detail: null,
  323. paymentChannelStatus: paymentChannelStatus,
  324. searchForm: {
  325. startTime: null,
  326. endTime: null,
  327. organId: null,
  328. search: "",
  329. dingtalkProcessNo: "",
  330. financialProcessNo: "",
  331. cooperationOrganId: null,
  332. orderDate: [],
  333. },
  334. headers: {
  335. Authorization: getToken(),
  336. },
  337. tableList: [],
  338. organList: [],
  339. cooperations: [],
  340. pageInfo: {
  341. // 分页规则
  342. limit: 10, // 限制显示条数
  343. page: 1, // 当前页
  344. total: 0, // 总条数
  345. page_size: [10, 20, 40, 50], // 选择限制显示条数
  346. },
  347. passed: [], // 传递的参数
  348. activeRow: null,
  349. };
  350. },
  351. created(){
  352. if (this.searchForm.orderDate?.length < 1) {
  353. var now = new Date();
  354. var startDate = dayjs().format("YYYY-MM-DD");
  355. var endDate = dayjs().format("YYYY-MM-DD");
  356. this.searchForm.orderDate = [];
  357. this.searchForm.orderDate.push(startDate);
  358. this.searchForm.orderDate.push(endDate);
  359. this.searchOrderDate(this.searchForm.orderDate);
  360. }
  361. },
  362. mounted() {
  363. // getEmployeeOrgan().then(res => {
  364. // if (res.code == 200) {
  365. // this.organList = res.data;
  366. // }
  367. // })
  368. this.$store.dispatch("setBranchs");
  369. getCooperation({ rows: 1000 }).then((res) => {
  370. if (res.code == 200) {
  371. this.cooperations = res.data.rows;
  372. }
  373. });
  374. this.getList();
  375. },
  376. methods: {
  377. editRecord(detail) {
  378. this.show = true;
  379. this.detail = detail;
  380. },
  381. removeRecord(id) {
  382. removeFinancialExpenditure({
  383. ids: id,
  384. }).then(() => {
  385. this.getList()
  386. this.$message.success("删除成功");
  387. }).catch((res) => {
  388. this.$message.error(res.msg)
  389. });
  390. },
  391. beforeUpload(file) {
  392. load.startLoading();
  393. },
  394. handleSuccess(response, file, fileList) {
  395. load.endLoading();
  396. console.log(response, file, fileList);
  397. if (response.code == 200) {
  398. this.$message.success("导入成功");
  399. this.getList();
  400. } else {
  401. this.$message.error(response.msg);
  402. }
  403. },
  404. handleError(err, file, fileList) {
  405. load.endLoading();
  406. console.log(err, file, fileList);
  407. },
  408. downloadFile() {
  409. Export(this, {
  410. url: "/api-web/import/downloadTemplate",
  411. fileName: "财务支出导入模板.xlsx",
  412. params: {
  413. templateType: "FINANCIAL_EXPENDITURE",
  414. },
  415. });
  416. },
  417. search() {
  418. this.pageInfo.page = 1;
  419. this.getList();
  420. },
  421. handleSelectionChange(arr) {
  422. this.passed = [];
  423. for (let i in arr) {
  424. // let obj = {};
  425. // obj.id = arr[i].id;
  426. // obj.name = arr[i].name;
  427. this.passed.push(arr[i].id);
  428. }
  429. },
  430. onTeachingSubmit(formName, status) {
  431. // 添加数据
  432. this.$refs[formName].validate((valid) => {
  433. if (valid) {
  434. this.form.status = status;
  435. applyRefundAudit(this.form).then((res) => {
  436. if (res.code == 200) {
  437. this.$message.success("操作成功");
  438. this.backStatus = false;
  439. this.getList();
  440. } else {
  441. this.$message.error(res.msg);
  442. }
  443. });
  444. } else {
  445. return false;
  446. }
  447. });
  448. },
  449. getList() {
  450. let { orderDate, ...ruset } = this.searchForm;
  451. let params = {
  452. ...ruset,
  453. page: this.pageInfo.page,
  454. rows: this.pageInfo.limit,
  455. ...getTimes(orderDate, ["startTime", "endTime"]),
  456. };
  457. getFinancialExpenditure(params).then((res) => {
  458. let result = res.data;
  459. if (res.code == 200) {
  460. this.tableList = result.rows;
  461. this.pageInfo.total = result.total;
  462. }
  463. });
  464. },
  465. searchOrderDate(value) {
  466. if (value) {
  467. this.searchForm.startTime = value[0];
  468. this.searchForm.endTime = value[1];
  469. } else {
  470. this.searchForm.startTime = null;
  471. this.searchForm.endTime = null;
  472. }
  473. },
  474. onReSet() {
  475. // this.orderDate = [];
  476. this.searchForm = {
  477. startTime: null,
  478. endTime: null,
  479. orderDate: [],
  480. };
  481. var now = new Date();
  482. var startDate = dayjs().format("YYYY-MM-DD");
  483. var endDate = dayjs().format("YYYY-MM-DD");
  484. this.searchForm.orderDate = [];
  485. this.searchForm.orderDate.push(startDate);
  486. this.searchForm.orderDate.push(endDate);
  487. this.pageInfo.page = 1;
  488. this.getList();
  489. },
  490. onBatchDel() {
  491. // 批量删除
  492. const passed = this.passed;
  493. if (passed.length <= 0) {
  494. this.$message.error("请至少选择一条数据");
  495. return;
  496. }
  497. this.$confirm("是否删除选择的支出记录?", "提示", {
  498. confirmButtonText: "确定",
  499. cancelButtonText: "取消",
  500. type: "warning",
  501. })
  502. .then(() => {
  503. return removeFinancialExpenditure({
  504. ids: this.passed.join(","),
  505. });
  506. })
  507. .then(() => this.getList())
  508. .catch(() => {});
  509. },
  510. lookDetail(row) {
  511. this.activeRow = row;
  512. this.show = true;
  513. console.log(111);
  514. },
  515. closeReset() {
  516. this.show = false;
  517. },
  518. },
  519. };
  520. </script>
  521. <style lang="scss" scoped>
  522. .newBand {
  523. display: inline-block;
  524. }
  525. .noWrap {
  526. white-space: nowrap;
  527. overflow: hidden;
  528. text-overflow: ellipsis;
  529. }
  530. </style>