kaihe-index.vue 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563
  1. <template>
  2. <div>
  3. <!-- 列表页 -->
  4. <div v-if="!showDetail">
  5. <el-form ref="form" :model="form" label-width="80px" v-show="showSearch">
  6. <el-row>
  7. <el-col :span="6">
  8. <el-form-item label="客户名称">
  9. <el-select
  10. v-model="form.fCorpid"
  11. size="small"
  12. placeholder="请选择"
  13. clearable
  14. style="width: 100%"
  15. filterable
  16. >
  17. <el-option
  18. v-for="item in corpList"
  19. :key="item.fId"
  20. :label="item.fName"
  21. :value="item.fId"
  22. />
  23. </el-select>
  24. </el-form-item>
  25. </el-col>
  26. <el-col :span="6">
  27. <el-form-item label="开船日期">
  28. <el-date-picker
  29. v-model="form.date"
  30. type="daterange"
  31. size="small"
  32. placeholder="请选择日期"
  33. format="yyyy-MM-dd"
  34. value-format="yyyy-MM-dd"
  35. style="width: 100%"
  36. />
  37. </el-form-item>
  38. </el-col>
  39. <el-col :span="6">
  40. <el-form-item label="船名">
  41. <el-select
  42. v-model="form.fVslid"
  43. size="small"
  44. placeholder="请选择"
  45. style="width: 100%"
  46. clearable
  47. @change="fvslChange"
  48. @clear="fvslClear"
  49. >
  50. <el-option
  51. v-for="item in TVesselfs"
  52. :key="item.fId"
  53. :label="item.fName"
  54. :value="item.fId"
  55. />
  56. </el-select>
  57. </el-form-item>
  58. </el-col>
  59. <el-col :span="6">
  60. <el-form-item label="航次">
  61. <el-select
  62. v-model="form.fVoyid"
  63. size="small"
  64. placeholder="请选择"
  65. style="width: 100%"
  66. >
  67. <el-option
  68. v-for="item in TVoyagefs"
  69. :key="item.fId"
  70. :label="item.fNo"
  71. :value="item.fId"
  72. />
  73. </el-select>
  74. </el-form-item>
  75. </el-col>
  76. </el-row>
  77. <el-collapse-transition>
  78. <el-row v-if="show">
  79. <el-col :span="6">
  80. <el-form-item label="系统编号">
  81. <el-input
  82. v-model="form.fBillno"
  83. size="small"
  84. placeholder="请输入"
  85. ></el-input>
  86. </el-form-item>
  87. </el-col>
  88. <el-col :span="6">
  89. <el-form-item label="提单号">
  90. <el-input
  91. v-model="form.tMblno"
  92. size="small"
  93. placeholder="请输入"
  94. />
  95. </el-form-item>
  96. </el-col>
  97. <el-col :span="6">
  98. <el-form-item label="起运港">
  99. <el-select
  100. v-model="form.fLoadportid"
  101. size="small"
  102. placeholder="请选择"
  103. style="width: 100%"
  104. >
  105. <el-option
  106. v-for="item in portNames"
  107. :key="item.fId"
  108. :label="item.fName"
  109. :value="item.fId"
  110. />
  111. </el-select>
  112. </el-form-item>
  113. </el-col>
  114. <el-col :span="6">
  115. <el-form-item label="目的港">
  116. <el-select
  117. v-model="form.fDestportid"
  118. size="small"
  119. placeholder="请选择"
  120. style="width: 100%"
  121. >
  122. <el-option
  123. v-for="item in portNames"
  124. :key="item.fId"
  125. :label="item.fName"
  126. :value="item.fId"
  127. />
  128. </el-select>
  129. </el-form-item>
  130. </el-col>
  131. <el-col :span="6">
  132. <el-form-item label="制单日期">
  133. <el-date-picker
  134. v-model="form.applyTime"
  135. type="daterange"
  136. size="small"
  137. placeholder="请选择"
  138. format="yyyy-MM-dd"
  139. value-format="yyyy-MM-dd"
  140. style="width: 100%"
  141. />
  142. </el-form-item>
  143. </el-col>
  144. <el-col :span="6">
  145. <el-form-item label="制单人">
  146. <el-input
  147. v-model="form.createBy"
  148. size="small"
  149. placeholder="请输入"
  150. ></el-input>
  151. </el-form-item>
  152. </el-col>
  153. <el-col :span="6">
  154. <el-form-item label="备注">
  155. <el-input
  156. v-model="form.fRemarks"
  157. size="small"
  158. placeholder="请输入"
  159. ></el-input>
  160. </el-form-item>
  161. </el-col>
  162. </el-row>
  163. </el-collapse-transition>
  164. </el-form>
  165. <div class="head-but">
  166. <div>
  167. <el-button
  168. type="primary"
  169. icon="el-icon-plus"
  170. size="mini"
  171. @click="goDetail(true)"
  172. >
  173. 新增
  174. </el-button>
  175. <el-button
  176. type="success"
  177. icon="el-icon-edit"
  178. size="mini"
  179. :disabled="selectionList.length != 1"
  180. >修改</el-button
  181. >
  182. <el-button
  183. type="warning"
  184. icon="el-icon-download"
  185. size="mini"
  186. @click="handleExport"
  187. >
  188. 导出
  189. </el-button>
  190. <el-button
  191. type="info"
  192. icon="el-icon-download"
  193. size="mini"
  194. :disabled="selectionList.length != 1"
  195. @click="copyData"
  196. >
  197. 复制新增
  198. </el-button>
  199. </div>
  200. <div class="tabSetting">
  201. <el-button
  202. type="cyan"
  203. icon="el-icon-search"
  204. size="mini"
  205. @click="handleQuery"
  206. >
  207. 搜索
  208. </el-button>
  209. <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">
  210. 重置
  211. </el-button>
  212. <el-button
  213. v-show="show"
  214. @click="show = !show"
  215. icon="el-icon-arrow-up"
  216. size="mini"
  217. >
  218. 展开
  219. </el-button>
  220. <el-button
  221. v-show="!show"
  222. @click="show = !show"
  223. icon="el-icon-arrow-down"
  224. size="mini"
  225. >
  226. 展开
  227. </el-button>
  228. <right-toolbar
  229. style="margin-left: 12px"
  230. :showSearch.sync="showSearch"
  231. @queryTable="getList"
  232. ></right-toolbar>
  233. <div style="margin: 0 12px">
  234. <el-button
  235. icon="el-icon-setting"
  236. size="mini"
  237. circle
  238. @click="colSetting"
  239. ></el-button>
  240. </div>
  241. </div>
  242. </div>
  243. <el-table
  244. :data="tableData"
  245. @selection-change="selectionChange"
  246. show-summary
  247. :summary-method="getSummaries"
  248. >
  249. <el-table-column type="selection" width="60" />
  250. <el-table-column label="序号" type="index" width="50" />
  251. <el-table-column
  252. v-for="(item, index) in tableOption"
  253. :key="index"
  254. :label="item.name"
  255. :width="item.width"
  256. :prop="item.label"
  257. header-align="center"
  258. :align="item.align"
  259. :fixed="item.fixed"
  260. :show-overflow-tooltip="true"
  261. />
  262. <el-table-column
  263. label="操作"
  264. align="center"
  265. class-name="small-padding fixed-width"
  266. min-width="200"
  267. fixed="right"
  268. >
  269. <template slot-scope="scope">
  270. <el-button
  271. size="mini"
  272. type="text"
  273. icon="el-icon-view"
  274. @click="rowDetail(scope.row, 0)"
  275. >
  276. 查看
  277. </el-button>
  278. <el-button
  279. size="mini"
  280. type="text"
  281. icon="el-icon-edit"
  282. @click="rowDetail(scope.row, 1)"
  283. :disabled="scope.row.fBillstatus > 3"
  284. >
  285. 修改
  286. </el-button>
  287. <el-button
  288. size="mini"
  289. type="text"
  290. icon="el-icon-delete"
  291. @click="rowDel(scope.row)"
  292. :disabled="scope.row.fBillstatus > 3"
  293. >
  294. 删除
  295. </el-button>
  296. </template>
  297. </el-table-column>
  298. </el-table>
  299. <pagination
  300. v-show="page.total > 0"
  301. :total="page.total"
  302. :page.sync="page.pageNum"
  303. :limit.sync="page.pageSize"
  304. @pagination="getList"
  305. />
  306. </div>
  307. <!-- 详情页 -->
  308. <kaihe-detail
  309. ref="detail"
  310. :showDetail="showDetail"
  311. @goDetail="goDetail"
  312. @goBack="goBack"
  313. @refFresh="refFresh"
  314. />
  315. <column-setting
  316. ref="columnSetting"
  317. @reset="reset"
  318. @getRowdata="getRowdata"
  319. tableName="凯和付费列表"
  320. />
  321. </div>
  322. </template>
  323. <script>
  324. import { tableOption } from "./js/index";
  325. import {
  326. getList,
  327. selectTVesself,
  328. selectTVoyagef,
  329. selectPortName,
  330. listCorps,
  331. remove,
  332. rowRemove,
  333. getExcel,
  334. } from "@/api/finance/kaihe/contrast";
  335. import kaiheDetail from "./kaihe-detail.vue";
  336. import columnSetting from "@/components/ColumnSetting/index";
  337. export default {
  338. data() {
  339. return {
  340. showDetail: false,
  341. form: {
  342. fVoyid: null,
  343. },
  344. show: false,
  345. options: [],
  346. tableData: [],
  347. tableOption: tableOption,
  348. selectionList: [],
  349. page: {
  350. pageNum: 1,
  351. pageSize: 10,
  352. total: 0,
  353. },
  354. TVesselfs: [],
  355. TVoyagefs: [],
  356. portNames: [],
  357. corpList: [],
  358. showSearch: true,
  359. };
  360. },
  361. components: {
  362. kaiheDetail,
  363. columnSetting,
  364. },
  365. created() {
  366. this.getList();
  367. selectTVesself().then((res) => {
  368. this.TVesselfs = res.rows;
  369. });
  370. selectTVoyagef().then((res) => {
  371. this.TVoyagefs = res.rows;
  372. });
  373. selectPortName().then((res) => {
  374. this.portNames = res.rows;
  375. });
  376. listCorps().then((res) => {
  377. this.corpList = res;
  378. });
  379. },
  380. activated() {
  381. if (this.$route.query.data) {
  382. this.Jump();
  383. }
  384. this.$refs.columnSetting.getRow(this.tableOption);
  385. },
  386. methods: {
  387. fvslChange(id) {
  388. selectTVoyagef({ fPid: id }).then((res) => {
  389. this.TVoyagefs = res.rows;
  390. });
  391. this.form.fVoyid = null;
  392. },
  393. fvslClear() {
  394. selectTVoyagef().then((res) => {
  395. this.TVoyagefs = res.rows;
  396. });
  397. this.form.fVoyid = null;
  398. },
  399. /** 导出按钮操作 */
  400. handleExport() {
  401. this.$confirm("是否确认导出所有财务数据主数据项?", "警告", {
  402. confirmButtonText: "确定",
  403. cancelButtonText: "取消",
  404. type: "warning",
  405. })
  406. .then(function () {
  407. return getExcel();
  408. })
  409. .then((response) => {
  410. this.download(response.msg);
  411. });
  412. },
  413. getRowdata(list) {
  414. this.tableOption = list;
  415. },
  416. reset() {
  417. this.tableOption = this.$options.data().tableOption;
  418. },
  419. colSetting() {
  420. this.$refs.columnSetting.init(this.tableOption);
  421. },
  422. getSummaries(param) {
  423. const { columns, data } = param;
  424. const sums = [];
  425. if (data.length > 0) {
  426. columns.forEach((column, index) => {
  427. if (index == 0) {
  428. sums[index] = "合计";
  429. }
  430. if (column.label == "应收金额" || column.label == "付费金额") {
  431. const values = data.map((item) => Number(item[column.property]));
  432. if (!values.every((value) => isNaN(value))) {
  433. sums[index] = values.reduce((prev, curr) => {
  434. const value = Number(curr);
  435. if (!isNaN(value)) {
  436. let sum = Number(prev) + Number(curr);
  437. return Number(sum).toFixed(2);
  438. } else {
  439. return Number(prev).toFixed(2);
  440. }
  441. }, 0);
  442. } else {
  443. sums[index] = "0.00";
  444. }
  445. }
  446. });
  447. }
  448. return sums;
  449. },
  450. selectionChange(list) {
  451. this.selectionList = list;
  452. },
  453. handleQuery() {
  454. this.page.pageNum = 1;
  455. if (this.form.date) {
  456. this.form.fFromDate = this.form.date[0];
  457. this.form.fToDate = this.form.date[1];
  458. }
  459. this.getList();
  460. },
  461. resetQuery() {
  462. this.form = this.$options.data().form;
  463. },
  464. getList() {
  465. const data = {
  466. ...this.form,
  467. pageNum: this.page.pageNum,
  468. pageSize: this.page.pageSize,
  469. };
  470. getList(data).then((response) => {
  471. response.rows.forEach((e) => {
  472. e.createTime = e.createTime ? e.createTime.slice(0, 10) : "";
  473. });
  474. this.tableData = response.rows;
  475. this.page.total = response.total;
  476. this.loading = false;
  477. });
  478. },
  479. refFresh() {
  480. this.getList();
  481. },
  482. copyData() {
  483. let id;
  484. this.selectionList.forEach((e) => {
  485. id = e.fId;
  486. });
  487. this.$refs.detail.copyData(id);
  488. this.showDetail = true;
  489. },
  490. goDetail(bool) {
  491. if (bool) {
  492. this.$refs.detail.init();
  493. }
  494. this.showDetail = bool;
  495. },
  496. goBack(bool) {
  497. this.getList();
  498. this.showDetail = bool;
  499. },
  500. rowDetail(row, status) {
  501. this.$refs.detail.info(row, status);
  502. this.showDetail = true;
  503. },
  504. rowDel(row) {
  505. rowRemove(row.fId).then((res) => {
  506. let tips = "";
  507. switch (res.msg) {
  508. case "0": {
  509. this.$message.error("当前数据已被其他操作员操作,请刷新页面");
  510. break;
  511. }
  512. case "1": {
  513. tips = "当前主表有数据,从表无数据,确认是否删除?";
  514. this.delete(row.fId, tips);
  515. break;
  516. }
  517. case "2": {
  518. tips = "当前主表有数据,从表有数据,确认是否删除?";
  519. this.delete(row.fId, tips);
  520. break;
  521. }
  522. default: {
  523. return this.$message.error("未知错误,无状态");
  524. }
  525. }
  526. });
  527. },
  528. delete(fIds, tips) {
  529. this.$confirm(tips, "警告", {
  530. confirmButtonText: "确定",
  531. cancelButtonText: "取消",
  532. type: "warning",
  533. })
  534. .then(function () {
  535. return remove(fIds);
  536. })
  537. .then(() => {
  538. this.getList();
  539. this.$message.success("删除成功");
  540. });
  541. },
  542. Jump() {
  543. let data = JSON.parse(this.$route.query.data);
  544. if (data) {
  545. this.showDetail = true;
  546. this.rowDetail(data.billId, 3);
  547. }
  548. },
  549. },
  550. };
  551. </script>
  552. <style lang="scss" scoped>
  553. .head-but {
  554. display: flex;
  555. justify-content: space-between;
  556. margin-bottom: 8px;
  557. }
  558. .tabSetting {
  559. display: flex;
  560. justify-content: flex-end;
  561. }
  562. </style>