financeManager.vue 36 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182
  1. <template>
  2. <div class="m-container">
  3. <h2>
  4. <div class="squrt"></div>
  5. 财务管理
  6. </h2>
  7. <div class="m-core">
  8. <div
  9. class="newBand"
  10. v-permission="{ child: 'routeOrder/add', parent: '/financeManager' }"
  11. @click="
  12. () => {
  13. routeOrderStatus = true;
  14. (isAdd = true), (form.applyType = null);
  15. }
  16. "
  17. >
  18. 添加订单
  19. </div>
  20. <div
  21. class="newBand"
  22. @click="onOrderExport"
  23. v-permission="{
  24. child: 'export/routeOrderList',
  25. parent: '/financeManager',
  26. }"
  27. >
  28. 报表导出
  29. </div>
  30. <div
  31. class="newBand"
  32. v-permission="{ child: 'adapay/exportBill', parent: '/financeManager' }"
  33. @click="onAdaPayExport"
  34. >
  35. 汇付订单导出
  36. </div>
  37. <div
  38. class="newBand"
  39. @click="onDownload"
  40. v-permission="'import/downloadTemplate?financeManager'"
  41. >
  42. 下载模板
  43. </div>
  44. <el-upload
  45. v-permission="'import/routeOrder'"
  46. style="display: inline-block; margin: 0 10px"
  47. action="/api-web/import/routeOrder"
  48. :show-file-list="false"
  49. :before-upload="beforeUpload"
  50. accept=".xlsx,.xls"
  51. :headers="headers"
  52. :on-error="handleError"
  53. :on-success="handleSuccess"
  54. >
  55. <div class="newBand">导入</div>
  56. </el-upload>
  57. <!-- 搜索类型 -->
  58. <save-form
  59. :inline="true"
  60. class="searchForm"
  61. ref="searchForm"
  62. :model.sync="searchForm"
  63. >
  64. <el-form-item>
  65. <el-input
  66. placeholder="学生编号/姓名/手机号"
  67. type="text"
  68. v-model.trim="searchForm.search"
  69. ></el-input>
  70. </el-form-item>
  71. <el-form-item>
  72. <el-input
  73. placeholder="交易流水号"
  74. type="text"
  75. v-model.trim="searchForm.transNo"
  76. ></el-input>
  77. </el-form-item>
  78. <el-form-item>
  79. <el-input
  80. placeholder="订单号"
  81. type="text"
  82. v-model.trim="searchForm.orderNo"
  83. ></el-input>
  84. </el-form-item>
  85. <el-form-item>
  86. <el-input
  87. placeholder="收款账户"
  88. type="text"
  89. v-model.trim="searchForm.merNos"
  90. ></el-input>
  91. </el-form-item>
  92. <el-form-item>
  93. <el-input
  94. placeholder="余额支付大于等于"
  95. type="number"
  96. @mousewheel.native.prevent
  97. v-model.trim="searchForm.balancePaymentAmount"
  98. ></el-input>
  99. </el-form-item>
  100. <el-form-item>
  101. <el-input
  102. placeholder="现金支付大于等于"
  103. type="number"
  104. @mousewheel.native.prevent
  105. v-model.trim="searchForm.actualAmount"
  106. ></el-input>
  107. </el-form-item>
  108. <el-form-item>
  109. <el-input
  110. placeholder="余额支付小于等于"
  111. type="number"
  112. @mousewheel.native.prevent
  113. v-model.trim="searchForm.lessBalancePaymentAmount"
  114. ></el-input>
  115. </el-form-item>
  116. <el-form-item>
  117. <el-input
  118. placeholder="现金支付小于等于"
  119. type="number"
  120. @mousewheel.native.prevent
  121. v-model.trim="searchForm.lessActualAmount"
  122. ></el-input>
  123. </el-form-item>
  124. <el-form-item prop="routingOrganId">
  125. <el-select
  126. class="multiple"
  127. v-model.trim="searchForm.routingOrganId"
  128. filterable
  129. clearable
  130. @clear="onClear('routingOrganId')"
  131. placeholder="请选择分部"
  132. >
  133. <el-option
  134. v-for="(item, index) in organList"
  135. :key="index"
  136. :label="item.name"
  137. :value="item.id"
  138. ></el-option>
  139. </el-select>
  140. </el-form-item>
  141. <el-form-item>
  142. <el-date-picker
  143. v-model.trim="searchForm.orderDate"
  144. style="width: 410px"
  145. type="daterange"
  146. value-format="yyyy-MM-dd"
  147. @change="searchOrderDate"
  148. :picker-options="{
  149. firstDayOfWeek: 1,
  150. }"
  151. range-separator="至"
  152. start-placeholder="订单开始日期"
  153. end-placeholder="订单结束日期"
  154. ></el-date-picker>
  155. </el-form-item>
  156. <el-form-item>
  157. <el-select
  158. v-model.trim="searchForm.paymentType"
  159. clearable
  160. filterable
  161. @clear="onClear('paymentType')"
  162. placeholder="交易类型"
  163. >
  164. <el-option
  165. v-for="(item, index) in orderStatus"
  166. :key="index"
  167. :label="item.label"
  168. :value="item.value"
  169. ></el-option>
  170. </el-select>
  171. </el-form-item>
  172. <el-form-item>
  173. <el-select
  174. v-model.trim="searchForm.paymentStatus"
  175. clearable
  176. filterable
  177. @clear="onClear('paymentStatus')"
  178. placeholder="交易状态"
  179. >
  180. <el-option
  181. v-for="(item, index) in dealStatus"
  182. :key="index"
  183. :label="item.label"
  184. :value="item.value"
  185. ></el-option>
  186. </el-select>
  187. </el-form-item>
  188. <el-form-item>
  189. <el-button @click="search" type="danger">搜索</el-button>
  190. <el-button @click="onReSet" type="primary">重置</el-button>
  191. </el-form-item>
  192. </save-form>
  193. <!-- 列表 -->
  194. <div style="font-size: 14px; color: #f85043; padding-bottom: 10px">
  195. 营收金额:{{ totalRevenueAmount | moneyFormat }}元
  196. <i style="width: 10px; display: inline-block"></i>
  197. 实收金额:{{ totalActualAmount | moneyFormat }}元
  198. <i style="width: 10px; display: inline-block"></i>
  199. 预收金额:{{ totalAdvanceAmount | moneyFormat }}元
  200. <i style="width: 10px; display: inline-block"></i>
  201. 预收余额:{{ totalUserBalance | moneyFormat }}元
  202. </div>
  203. <div class="tableWrap">
  204. <el-table
  205. :data="tableList"
  206. :header-cell-style="{ background: '#EDEEF0', color: '#444' }"
  207. >
  208. <el-table-column
  209. align="center"
  210. prop="transNo"
  211. label="交易流水号"
  212. ></el-table-column>
  213. <el-table-column
  214. align="center"
  215. prop="orderNo"
  216. label="订单号"
  217. ></el-table-column>
  218. <el-table-column
  219. align="center"
  220. width="150"
  221. prop="createTime"
  222. label="订单日期"
  223. >
  224. <template slot-scope="scope">{{
  225. scope.row.createTime | dateForMinFormat
  226. }}</template>
  227. </el-table-column>
  228. <el-table-column align="center" width="100px" label="交易类型">
  229. <template slot-scope="scope">{{
  230. scope.row.type | orderType
  231. }}</template>
  232. </el-table-column>
  233. <el-table-column align="center" prop="expectAmount" label="应付金额">
  234. <template slot-scope="scope">
  235. <div>
  236. {{ scope.row.expectAmount | moneyFormat }}
  237. </div>
  238. </template>
  239. </el-table-column>
  240. <el-table-column
  241. align="center"
  242. prop="balancePaymentAmount"
  243. label="余额支付"
  244. >
  245. <template slot-scope="scope">
  246. <div>
  247. {{ scope.row.balancePaymentAmount | moneyFormat }}
  248. </div>
  249. </template>
  250. </el-table-column>
  251. <el-table-column align="center" prop="actualAmount" label="现金支付">
  252. <template slot-scope="scope">
  253. <div>
  254. {{ scope.row.actualAmount | moneyFormat }}
  255. </div>
  256. </template>
  257. </el-table-column>
  258. <el-table-column align="center" prop="routeAmount" label="分润金额">
  259. <template slot-scope="scope">
  260. <div>
  261. {{ scope.row.routeAmount | moneyFormat }}
  262. </div>
  263. </template>
  264. </el-table-column>
  265. <el-table-column
  266. align="center"
  267. prop="routeBalanceAmount"
  268. label="分润余额"
  269. >
  270. <template slot-scope="scope">
  271. <div>
  272. {{ scope.row.routeBalanceAmount | moneyFormat }}
  273. </div>
  274. </template>
  275. </el-table-column>
  276. <el-table-column align="center" label="学员姓名">
  277. <template slot-scope="scope">
  278. <div>
  279. <!-- v-if="scope.row.type !== 'OUTORDER'" -->
  280. <div>
  281. {{ scope.row.user.username }}
  282. <!-- <span v-if="scope.row.user.username && scope.row.user.phone"
  283. >/</span
  284. > -->
  285. <p>{{ scope.row.user.phone }}</p>
  286. </div>
  287. </div>
  288. </template>
  289. </el-table-column>
  290. <el-table-column
  291. align="center"
  292. prop="paymentChannel"
  293. label="交易方式"
  294. >
  295. <template slot-scope="scope">{{
  296. scope.row.paymentChannel | paymentChannelStatus
  297. }}</template>
  298. </el-table-column>
  299. <!-- <el-table-column align="center"
  300. label="收款账户">
  301. <template slot-scope="scope">{{ scope.row.merNo }}</template>
  302. </el-table-column> -->
  303. <el-table-column align="center" label="交易状态">
  304. <template slot-scope="scope">{{
  305. scope.row.status | dealStatus
  306. }}</template>
  307. </el-table-column>
  308. <el-table-column align="center" label="备注">
  309. <template slot-scope="scope">{{
  310. scope.row.memo ? scope.row.memo : "-"
  311. }}</template>
  312. </el-table-column>
  313. <el-table-column
  314. align="center"
  315. fixed="right"
  316. width="150px"
  317. label="操作"
  318. >
  319. <template slot-scope="scope">
  320. <div v-if="scope.row.groupType == 'OUTORDER'">
  321. <el-button type="text" @click="lookOrderInfo(scope.row)"
  322. >查看</el-button
  323. >
  324. <el-button type="text" @click="removeOrderInfo(scope.row)"
  325. >删除</el-button
  326. >
  327. </div>
  328. </template>
  329. </el-table-column>
  330. </el-table>
  331. <pagination
  332. :total.sync="pageInfo.total"
  333. sync
  334. :page.sync="pageInfo.page"
  335. :limit.sync="pageInfo.limit"
  336. :page-sizes="pageInfo.page_size"
  337. @pagination="getList"
  338. />
  339. </div>
  340. <el-dialog
  341. :title="isAdd ? '添加订单' : '查看'"
  342. destroy-on-close
  343. :visible.sync="routeOrderStatus"
  344. @close="onFormClose('ruleForm')"
  345. width="600px"
  346. >
  347. <el-form :model="form" :rules="rules" ref="ruleForm">
  348. <div class="lookTitle">基本信息</div>
  349. <el-form-item
  350. label="所属分部"
  351. prop="routeOrganId"
  352. :rules="[
  353. { required: true, message: '请选择分部', trigger: 'change' },
  354. ]"
  355. :label-width="formLabelWidth"
  356. >
  357. <el-select
  358. v-model.trim="form.routeOrganId"
  359. :disabled="!isAdd"
  360. @change="changeOrgin"
  361. style="width: 100% !important"
  362. >
  363. <el-option
  364. v-for="(item, index) in organList"
  365. :key="index"
  366. :label="item.name"
  367. :value="item.id"
  368. ></el-option>
  369. </el-select>
  370. </el-form-item>
  371. <el-form-item
  372. label="所属学校"
  373. prop="schoolId"
  374. :label-width="formLabelWidth"
  375. >
  376. <el-select
  377. v-model="form.schoolId"
  378. :disabled="!isAdd"
  379. @change="checkSchool"
  380. style="width: 100% !important"
  381. >
  382. <el-option
  383. v-for="(item, index) in cooperationList"
  384. :key="index"
  385. :label="item.name"
  386. :value="item.id"
  387. ></el-option>
  388. </el-select>
  389. </el-form-item>
  390. <el-form-item
  391. label="学员编号"
  392. prop="userId"
  393. :label-width="formLabelWidth"
  394. >
  395. <el-input
  396. v-model.trim="form.userId"
  397. :disabled="!isAdd"
  398. placeholder="请输入学员编号"
  399. ></el-input>
  400. </el-form-item>
  401. <div class="lookTitle">交易信息</div>
  402. <el-form-item
  403. label="交易流水号"
  404. prop="transNo"
  405. :label-width="formLabelWidth"
  406. >
  407. <el-input
  408. placeholder="请输入交易流水号"
  409. type="text"
  410. :disabled="!isAdd"
  411. v-model.trim="form.transNo"
  412. ></el-input>
  413. </el-form-item>
  414. <el-form-item
  415. label="收款账户"
  416. prop="merNo"
  417. :label-width="formLabelWidth"
  418. >
  419. <el-input
  420. placeholder="请输入收款账户"
  421. type="text"
  422. :disabled="!isAdd"
  423. v-model.trim="form.merNo"
  424. ></el-input>
  425. </el-form-item>
  426. <el-form-item
  427. label="交易日期"
  428. prop="payTime"
  429. :label-width="formLabelWidth"
  430. >
  431. <el-date-picker
  432. style="width: 100%"
  433. :disabled="!isAdd"
  434. v-model="form.payTime"
  435. type="datetime"
  436. format="yyyy-MM-dd HH:mm:ss"
  437. value-format="yyyy-MM-dd HH:mm:ss"
  438. placeholder="选择交易日期"
  439. >
  440. </el-date-picker>
  441. </el-form-item>
  442. <el-form-item
  443. label="收入类型"
  444. v-if="isAdd"
  445. :label-width="formLabelWidth"
  446. prop="applyType"
  447. >
  448. <el-select
  449. class="multiple"
  450. style="width: 100% !important"
  451. v-model.trim="form.applyType"
  452. @change="changeApplyType"
  453. filterable
  454. clearable
  455. :disabled="!isAdd"
  456. placeholder="请选择收入类型"
  457. >
  458. <el-option
  459. v-for="(item, index) in orderServerList"
  460. :key="index"
  461. :label="item.label"
  462. :value="item.value"
  463. ></el-option>
  464. </el-select>
  465. </el-form-item>
  466. <div v-if="form.applyType == 'SELL'">
  467. <div v-for="(goodsList, index) in form.goodsList" :key="index">
  468. <el-form-item
  469. :label="'商品名称' + (index + 1)"
  470. :label-width="formLabelWidth"
  471. class="setWidth"
  472. :prop="'goodsList.' + index + '.id'"
  473. :rules="[
  474. { required: true, message: '请选择商品', trigger: 'change' },
  475. ]"
  476. >
  477. <el-select
  478. v-model.trim="goodsList.id"
  479. filterable
  480. :disabled="!isAdd"
  481. @change="checkgoods"
  482. placeholder="请选择商品"
  483. >
  484. <el-option
  485. v-for="(item, index) in shopList"
  486. :key="index"
  487. :label="item.name"
  488. :value="item.id"
  489. ></el-option>
  490. </el-select>
  491. </el-form-item>
  492. <el-form-item
  493. class="setWidth"
  494. style="margin-right: 10px"
  495. :prop="'goodsList.' + index + '.number'"
  496. :rules="validAmount"
  497. >
  498. <!-- <el-input-number style="width: 160px;" v-model="goodsList.number" placeholder="商品数量"></el-input-number> -->
  499. <el-input
  500. type="age"
  501. style="width: 160px"
  502. :disabled="!isAdd"
  503. clearable
  504. placeholder="请输入商品数量"
  505. @mousewheel.native.prevent
  506. v-model.number="goodsList.number"
  507. ></el-input>
  508. </el-form-item>
  509. <el-button
  510. icon="el-icon-minus"
  511. :disabled="!isAdd"
  512. v-if="form.goodsList.length > 1"
  513. circle
  514. @click.prevent="removeGoodsList(goodsList)"
  515. ></el-button>
  516. <el-button
  517. icon="el-icon-plus"
  518. :disabled="!isAdd"
  519. @click.prevent="addGoodsList"
  520. circle
  521. style="margin-left: 5px"
  522. ></el-button>
  523. </div>
  524. </div>
  525. <el-form-item
  526. label="销售金额"
  527. v-if="form.applyType == 'SELL' || !isAdd"
  528. prop="saleAmount"
  529. :label-width="formLabelWidth"
  530. >
  531. <el-input
  532. v-model="form.saleAmount"
  533. @mousewheel.native.prevent
  534. type="number"
  535. :disabled="!isAdd"
  536. placeholder="请输入销售金额"
  537. />
  538. </el-form-item>
  539. <el-form-item
  540. label="服务金额"
  541. v-if="form.applyType == 'SERVICE' || !isAdd"
  542. prop="serviceAmount"
  543. :label-width="formLabelWidth"
  544. >
  545. <el-input
  546. type="number"
  547. @mousewheel.native.prevent
  548. :disabled="!isAdd"
  549. v-model="form.serviceAmount"
  550. placeholder="请输入收入金额"
  551. />
  552. </el-form-item>
  553. <div class="lookTitle">其它</div>
  554. <el-form-item label="备注" prop="memo" :label-width="formLabelWidth">
  555. <el-input
  556. placeholder="请输入备注"
  557. :disabled="!isAdd"
  558. v-model.trim="form.memo"
  559. type="textarea"
  560. :rows="3"
  561. ></el-input>
  562. </el-form-item>
  563. </el-form>
  564. <span slot="footer" class="dialog-footer">
  565. <el-button @click="routeOrderStatus = false">取 消</el-button>
  566. <el-button
  567. v-if="!isAdd"
  568. @click="routeOrderStatus = false"
  569. type="primary"
  570. >确 定</el-button
  571. >
  572. <el-button v-else @click="onOrderSubmit('ruleForm')" type="primary"
  573. >确 定</el-button
  574. >
  575. </span>
  576. </el-dialog>
  577. </div>
  578. </div>
  579. </template>
  580. <script>
  581. import pagination from "@/components/Pagination/index";
  582. import {
  583. routeOrderFinance,
  584. routeOrderAdd,
  585. getOrderInfo,
  586. orderDelete,
  587. } from "@/api/orderManager";
  588. import { goodsQuery } from "@/api/businessManager";
  589. import { getEmployeeOrgan, getAddress, getCooperation } from "@/api/buildTeam";
  590. // import store from '@/store'
  591. import { orderStatus, dealStatus } from "@/utils/searchArray";
  592. import cleanDeep from "clean-deep";
  593. import axios from "axios";
  594. import qs from "qs";
  595. import { getToken } from "@/utils/auth";
  596. import load from "@/utils/loading";
  597. import { orderServerList } from "@/utils/searchArray";
  598. import { Export } from "@/utils/downLoadFile";
  599. let validAmount = (rule, value, callback) => {
  600. if (!value) {
  601. callback(new Error("请输入商品数量"));
  602. } else if (value < 0) {
  603. callback(new Error("输入商品数量必须大于0"));
  604. } else if (value > 999) {
  605. callback(new Error("输入商品数量必须小于999"));
  606. } else {
  607. callback();
  608. }
  609. };
  610. export default {
  611. components: { pagination },
  612. name: "incomeTwo",
  613. data() {
  614. return {
  615. orderStatus: orderStatus,
  616. dealStatus: dealStatus,
  617. searchForm: {
  618. search: null,
  619. orderStartDate: null,
  620. orderEndDate: null,
  621. paymentStatus: "SUCCESS",
  622. paymentType: null,
  623. routingOrganId: null,
  624. actualAmount: null,
  625. balancePaymentAmount: null,
  626. orderNo: null,
  627. transNo: null,
  628. merNos: null,
  629. lessBalancePaymentAmount: null,
  630. lessActualAmount: null,
  631. orderDate: [],
  632. },
  633. tableList: [],
  634. organList: [],
  635. shopList: [],
  636. cooperationList: [],
  637. orderServerList: orderServerList,
  638. pageInfo: {
  639. // 分页规则
  640. limit: 10, // 限制显示条数
  641. page: 1, // 当前页
  642. total: 0, // 总条数
  643. page_size: [10, 20, 40, 50], // 选择限制显示条数
  644. },
  645. totalUserBalance: 0,
  646. totalActualAmount: 0,
  647. totalAdvanceAmount: 0,
  648. totalRevenueAmount: 0,
  649. formLabelWidth: "100px",
  650. routeOrderStatus: false,
  651. isAdd: true,
  652. form: {
  653. routeOrganId: null,
  654. transNo: null,
  655. type: "OTHER",
  656. merNo: null,
  657. actualAmount: null,
  658. memo: null,
  659. payTime: null,
  660. serviceAmount: null,
  661. saleAmount: null,
  662. schoolId: null,
  663. goodsList: [
  664. {
  665. id: null,
  666. number: null,
  667. },
  668. ],
  669. applyType: null,
  670. userId: "",
  671. },
  672. validAmount: [
  673. { required: true, validator: validAmount, trigger: "blur" },
  674. { type: "number", message: "商品数量必须为数字" },
  675. ],
  676. rules: {
  677. organId: [
  678. { required: true, message: "请选择所属分部", trigger: "change" },
  679. ],
  680. // schoolId: [
  681. // { required: true, message: "请选择学校", trigger: "change" }
  682. // ],
  683. actualAmount: [
  684. { required: true, message: "请输入金额", trigger: "blur" },
  685. ],
  686. transNo: [
  687. { required: true, message: "请输入交易流水号", trigger: "blur" },
  688. ],
  689. merNo: [{ required: true, message: "请输入收款账户", trigger: "blur" }],
  690. payTime: [
  691. { required: true, message: "选择交易日期", trigger: "change" },
  692. ],
  693. applyType: [
  694. { required: true, message: "请选择收入类型", trigger: "change" },
  695. ],
  696. },
  697. headers: {
  698. Authorization: getToken(),
  699. },
  700. };
  701. },
  702. mounted() {
  703. getEmployeeOrgan().then((res) => {
  704. if (res.code == 200) {
  705. this.organList = res.data;
  706. }
  707. });
  708. goodsQuery({ status: 1, rows: 99999 }).then((res) => {
  709. if (res.code === 200) {
  710. this.shopList = res.data.rows;
  711. }
  712. });
  713. if (!(this.searchForm.orderDate?.length > 0)) {
  714. var now = new Date();
  715. var startDate = new Date(
  716. Date.UTC(now.getFullYear(), now.getMonth(), now.getDate())
  717. )
  718. .toISOString()
  719. .slice(0, 10);
  720. var endDate = new Date(
  721. Date.UTC(now.getFullYear(), now.getMonth(), now.getDate())
  722. )
  723. .toISOString()
  724. .slice(0, 10);
  725. this.searchForm.orderDate = [];
  726. this.searchForm.orderDate.push(startDate);
  727. this.searchForm.orderDate.push(endDate);
  728. }
  729. this.getList();
  730. },
  731. methods: {
  732. onClear(type) {
  733. if (type == "paymentType") {
  734. this.searchForm.paymentType = null;
  735. } else if (type == "paymentStatus") {
  736. this.searchForm.paymentStatus = null;
  737. } else if (type == "routingOrganId") {
  738. this.searchForm.routingOrganId = null;
  739. }
  740. },
  741. onOrderSubmit(formName) {
  742. // 添加订单
  743. this.$refs[formName].validate((valid) => {
  744. if (valid) {
  745. let form = this.form;
  746. if (!form.saleAmount && !form.serviceAmount) {
  747. this.$message.error("请输入销售收入或服务收入");
  748. return;
  749. }
  750. if (!form.saleAmount) {
  751. form.goodsList = null;
  752. }
  753. let goodsJson = {};
  754. for (let i in form.goodsList) {
  755. goodsJson[form.goodsList[i]["id"]] = form.goodsList[i]["number"];
  756. }
  757. form.goodsJson =
  758. form.applyType == "SERVICE" ? null : JSON.stringify(goodsJson);
  759. routeOrderAdd(form).then((res) => {
  760. if (res.code == 200) {
  761. this.$message.success("添加成功");
  762. this.routeOrderStatus = false;
  763. this.getList();
  764. } else {
  765. this.$message.error(res.msg);
  766. }
  767. });
  768. } else {
  769. return;
  770. }
  771. });
  772. },
  773. onFormClose(formName) {
  774. // this.form = {
  775. // organId: null,
  776. // transNo: null,
  777. // type: "OTHER",
  778. // merNo: null,
  779. // actualAmount: null,
  780. // memo: null,
  781. // payTime: null,
  782. // goodsList: [{
  783. // id: null,
  784. // number: null
  785. // }]
  786. // }
  787. // 关闭弹窗重置验证
  788. this.$refs[formName].resetFields();
  789. },
  790. onOrderExport() {
  791. // 报表导出
  792. let url = "/api-web/export/routeOrderList";
  793. let searchForm = this.searchForm;
  794. let data = {
  795. orderType: 3,
  796. search: searchForm.search,
  797. orderNo: searchForm.orderNo,
  798. transNo: searchForm.transNo,
  799. merNos: searchForm.merNos,
  800. actualAmount: searchForm.actualAmount,
  801. balancePaymentAmount: searchForm.balancePaymentAmount,
  802. paymentStatus: searchForm.paymentStatus,
  803. paymentType: searchForm.paymentType,
  804. organId: searchForm.organId,
  805. lessBalancePaymentAmount: searchForm.lessBalancePaymentAmount,
  806. lessActualAmount: searchForm.lessActualAmount,
  807. };
  808. if (this.searchForm.orderDate && this.searchForm.orderDate.length > 0) {
  809. data.orderStartDate = this.searchForm.orderDate[0];
  810. data.orderEndDate = this.searchForm.orderDate[1];
  811. } else {
  812. data.orderStartDate = null;
  813. data.orderEndDate = null;
  814. }
  815. const options = {
  816. method: "POST",
  817. headers: {
  818. Authorization: getToken(),
  819. },
  820. data: qs.stringify(cleanDeep(data)),
  821. url,
  822. responseType: "blob",
  823. };
  824. this.$confirm("您确定导出报表", "提示", {
  825. confirmButtonText: "确定",
  826. cancelButtonText: "取消",
  827. type: "warning",
  828. })
  829. .then(() => {
  830. load.startLoading();
  831. axios(options).then((res) => {
  832. let blob = new Blob([res.data], {
  833. // type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8'
  834. type: "application/vnd.ms-excel;charset=utf-8",
  835. //word文档为application/msword,pdf文档为application/pdf,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8
  836. });
  837. let objectUrl = URL.createObjectURL(blob);
  838. let link = document.createElement("a");
  839. let nowTime = new Date();
  840. let ymd =
  841. nowTime.getFullYear() +
  842. "" +
  843. (nowTime.getMonth() + 1) +
  844. "" +
  845. nowTime.getDate() +
  846. "" +
  847. nowTime.getHours() +
  848. "" +
  849. nowTime.getMinutes();
  850. let fname = "报表导出" + new Date().getTime(); //下载文件的名字
  851. link.href = objectUrl;
  852. link.setAttribute("download", fname);
  853. document.body.appendChild(link);
  854. link.click();
  855. load.endLoading();
  856. });
  857. })
  858. .catch(() => {});
  859. },
  860. onAdaPayExport() {
  861. // 报表导出
  862. let url = "/api-web/adapay/exportBill";
  863. let data = {};
  864. if (this.searchForm.orderDate && this.searchForm.orderDate.length > 0) {
  865. data.startTime = this.searchForm.orderDate[0];
  866. data.endTime = this.searchForm.orderDate[1];
  867. } else {
  868. this.$message.error("请选择开始日期和结束日期");
  869. return;
  870. }
  871. const options = {
  872. method: "get",
  873. headers: {
  874. Authorization: getToken(),
  875. },
  876. params: data,
  877. url,
  878. responseType: "blob",
  879. };
  880. this.$confirm("您确定导出汇付订单", "提示", {
  881. confirmButtonText: "确定",
  882. cancelButtonText: "取消",
  883. type: "warning",
  884. })
  885. .then(() => {
  886. load.startLoading();
  887. axios(options).then((res) => {
  888. let blob = new Blob([res.data], {
  889. // type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8'
  890. type: "application/vnd.ms-excel;charset=utf-8",
  891. //word文档为application/msword,pdf文档为application/pdf,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8
  892. });
  893. let objectUrl = URL.createObjectURL(blob);
  894. let link = document.createElement("a");
  895. let fname = "汇付订单" + new Date().getTime(); //下载文件的名字
  896. link.href = objectUrl;
  897. link.setAttribute("download", fname);
  898. document.body.appendChild(link);
  899. link.click();
  900. load.endLoading();
  901. });
  902. })
  903. .catch(() => {});
  904. },
  905. search() {
  906. this.pageInfo.page = 1;
  907. this.$refs.searchForm.save(this.searchForm);
  908. this.$refs.searchForm.save(this.pageInfo, "page");
  909. this.getList();
  910. },
  911. getList() {
  912. // let params = JSON.parse(JSON.stringify(this.searchForm));
  913. let params = Object.assign({}, this.searchForm);
  914. // let params = {...this.searchForm}
  915. console.log(params);
  916. params.rows = this.pageInfo.limit;
  917. params.page = this.pageInfo.page;
  918. params.orderNo = params.orderNo ? params.orderNo : null;
  919. params.transNo = params.transNo ? params.transNo : null;
  920. params.merNos = params.merNos ? params.merNos : null;
  921. params.actualAmount = params.actualAmount ? params.actualAmount : null;
  922. params.balancePaymentAmount = params.balancePaymentAmount
  923. ? params.balancePaymentAmount
  924. : null;
  925. if (this.searchForm.orderDate && this.searchForm.orderDate.length > 0) {
  926. params.orderStartDate = this.searchForm.orderDate[0];
  927. params.orderEndDate = this.searchForm.orderDate[1];
  928. } else {
  929. params.orderStartDate = null;
  930. params.orderEndDate = null;
  931. }
  932. console.log(this.searchForm);
  933. params.orderDate = null;
  934. console.log(this.searchForm);
  935. routeOrderFinance(cleanDeep(params)).then((res) => {
  936. let result = res.data;
  937. if (res.code == 200) {
  938. this.tableList = result.rows;
  939. this.pageInfo.total = result.total;
  940. this.totalUserBalance = result.totalUserBalance
  941. ? result.totalUserBalance
  942. : 0;
  943. this.totalActualAmount = result.totalActualAmount
  944. ? result.totalActualAmount
  945. : 0;
  946. this.totalAdvanceAmount = result.totalAdvanceAmount
  947. ? result.totalAdvanceAmount
  948. : 0;
  949. this.totalRevenueAmount = result.totalRevenueAmount
  950. ? result.totalRevenueAmount
  951. : 0;
  952. }
  953. });
  954. },
  955. searchOrderDate(value) {
  956. if (value) {
  957. this.searchForm.orderStartDate = value[0];
  958. this.searchForm.orderEndDate = value[1];
  959. } else {
  960. this.searchForm.orderStartDate = null;
  961. this.searchForm.orderEndDate = null;
  962. }
  963. },
  964. onReSet() {
  965. // 重置搜索
  966. this.orderDate = null;
  967. this.searchForm = {
  968. search: null,
  969. orderStartDate: null,
  970. orderEndDate: null,
  971. paymentStatus: null,
  972. paymentType: null,
  973. routingOrganId: null,
  974. actualAmount: null,
  975. balancePaymentAmount: null,
  976. orderNo: null,
  977. transNo: null,
  978. merNos: null,
  979. lessBalancePaymentAmount: null,
  980. lessActualAmount: null,
  981. orderDate: [],
  982. };
  983. this.getList();
  984. },
  985. removeGoodsList(item) {
  986. const index = this.form.goodsList.indexOf(item);
  987. if (index !== -1) {
  988. this.form.goodsList.splice(index, 1);
  989. }
  990. },
  991. addGoodsList() {
  992. this.form.goodsList.push({
  993. id: null,
  994. number: null,
  995. });
  996. },
  997. changeOrgin(val) {
  998. this.$set(this.form, "schoolId", null);
  999. if (val) {
  1000. getCooperation({ rows: 9999, organId: val }).then((res) => {
  1001. if (res.code === 200) {
  1002. this.cooperationList = res.data.rows;
  1003. }
  1004. });
  1005. }
  1006. },
  1007. checkSchool(val) {},
  1008. checkgoods(val) {
  1009. for (let i = 0; i <= this.form.goodsList.length - 1; i++) {
  1010. if (
  1011. i != this.form.goodsList.length - 1 &&
  1012. this.form.goodsList[i].id === val
  1013. ) {
  1014. this.form.goodsList[this.form.goodsList.length - 1].id = "";
  1015. }
  1016. }
  1017. },
  1018. lookOrderInfo(row) {
  1019. //orderNo
  1020. this.isAdd = false;
  1021. getOrderInfo({ orderId: row.id }).then((res) => {
  1022. if (res.code === 200) {
  1023. this.$nextTick((some) => {
  1024. let orderInfo = res.data.studentPaymentOrder;
  1025. this.changeOrgin(parseInt(orderInfo.organId));
  1026. (this.form = {
  1027. routeOrganId: orderInfo.organId,
  1028. transNo: orderInfo.transNo,
  1029. userId: orderInfo.userId ? orderInfo.userId : "",
  1030. type: "OTHER",
  1031. merNo: orderInfo.merNos,
  1032. actualAmount: orderInfo.actualAmount,
  1033. memo: orderInfo.memo,
  1034. payTime: orderInfo.payTime,
  1035. serviceAmount: res.data.serviceAmount,
  1036. saleAmount: res.data.goodsAmount,
  1037. schoolId: parseInt(orderInfo.musicGroupId) || " ",
  1038. applyType: "SELL",
  1039. }),
  1040. this.$set(
  1041. this.form,
  1042. "goodsList",
  1043. res.data.sellOrders.map((item) => {
  1044. return { id: item.goodsId, number: item.num };
  1045. })
  1046. );
  1047. this.routeOrderStatus = true;
  1048. });
  1049. }
  1050. });
  1051. },
  1052. removeOrderInfo(row) {
  1053. this.$confirm("确定删除?", "提示", {
  1054. confirmButtonText: "确定",
  1055. cancelButtonText: "取消",
  1056. type: "warning",
  1057. })
  1058. .then(() => {
  1059. orderDelete({ orderId: row.id }).then((res) => {
  1060. if (res.code === 200) {
  1061. this.$message.success("删除成功");
  1062. this.getList();
  1063. // this.routeOrderStatus = false;
  1064. }
  1065. });
  1066. })
  1067. .catch();
  1068. // orderDelete
  1069. },
  1070. onDownload() {
  1071. // 下载模板
  1072. // // 报表导出
  1073. Export(this, {
  1074. url: "/api-web/import/downloadTemplate",
  1075. params: {
  1076. templateType: "ROUTE_ORDER",
  1077. },
  1078. fileName: "财务管理导入模板.xlsx",
  1079. });
  1080. },
  1081. beforeUpload(file) {
  1082. // console.log(file.type)
  1083. // const isJPG = file.type === '.xlsx' || file.type === '.xls';
  1084. // // const isLt2M = file.size / 1024 / 1024 < 2;
  1085. // if (!isJPG) {
  1086. // this.$message.error('上传头像图片只能是 JPG 格式!');
  1087. // }
  1088. // return isJPG;
  1089. // this.goodsLoading = true
  1090. load.startLoading();
  1091. },
  1092. handleSuccess(response, file, fileList) {
  1093. // 导入商品
  1094. // 报表导出
  1095. load.endLoading();
  1096. if (response.code == 200) {
  1097. this.$message.success("导入成功");
  1098. // this.getList()
  1099. } else if (response.code == 0) {
  1100. let str = this.fomatStr(response.msg);
  1101. this.$alert(str, "导入结果", {
  1102. confirmButtonText: "确定",
  1103. dangerouslyUseHTMLString: true,
  1104. callback: (action) => {
  1105. // this.getList()
  1106. },
  1107. });
  1108. } else {
  1109. this.$message.error(response.msg);
  1110. }
  1111. },
  1112. handleError(err, file, fileList) {
  1113. load.endLoading();
  1114. console.log(err, file, fileList);
  1115. },
  1116. fomatStr(str) {
  1117. let arr = str.split(";");
  1118. let newStr = "";
  1119. arr.forEach((item) => {
  1120. newStr += `<p>${item}</p>`;
  1121. });
  1122. return newStr;
  1123. },
  1124. changeApplyType(val) {
  1125. this.form.serviceAmount = null;
  1126. this.form.saleAmount = null;
  1127. },
  1128. },
  1129. watch: {
  1130. routeOrderStatus(val) {
  1131. if (!val) {
  1132. this.form = {
  1133. routeOrganId: null,
  1134. transNo: null,
  1135. type: "OTHER",
  1136. merNo: null,
  1137. actualAmount: null,
  1138. memo: null,
  1139. payTime: null,
  1140. serviceAmount: null,
  1141. saleAmount: null,
  1142. schoolId: null,
  1143. goodsList: [
  1144. {
  1145. id: null,
  1146. number: null,
  1147. },
  1148. ],
  1149. applyType: null,
  1150. userId: "",
  1151. };
  1152. }
  1153. },
  1154. },
  1155. };
  1156. </script>
  1157. <style lang="scss" scoped>
  1158. .newBand {
  1159. display: inline-block;
  1160. }
  1161. /deep/.el-input-number.is-controls-right .el-input__inner {
  1162. text-align: left;
  1163. }
  1164. .setWidth {
  1165. display: inline-block;
  1166. }
  1167. .lookTitle {
  1168. height: 40px;
  1169. line-height: 40px;
  1170. font-weight: bold;
  1171. background-color: rgb(237, 238, 240);
  1172. padding: 0 20px;
  1173. margin-bottom: 20px;
  1174. }
  1175. </style>