kaihe-index.vue 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562
  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. align="center"
  258. :fixed="item.fixed"
  259. :show-overflow-tooltip="true"
  260. />
  261. <el-table-column
  262. label="操作"
  263. align="center"
  264. class-name="small-padding fixed-width"
  265. min-width="200"
  266. fixed="right"
  267. >
  268. <template slot-scope="scope">
  269. <el-button
  270. size="mini"
  271. type="text"
  272. icon="el-icon-view"
  273. @click="rowDetail(scope.row, 0)"
  274. >
  275. 查看
  276. </el-button>
  277. <el-button
  278. size="mini"
  279. type="text"
  280. icon="el-icon-edit"
  281. @click="rowDetail(scope.row, 1)"
  282. :disabled="scope.row.fBillstatus > 3"
  283. >
  284. 修改
  285. </el-button>
  286. <el-button
  287. size="mini"
  288. type="text"
  289. icon="el-icon-delete"
  290. @click="rowDel(scope.row)"
  291. :disabled="scope.row.fBillstatus > 3"
  292. >
  293. 删除
  294. </el-button>
  295. </template>
  296. </el-table-column>
  297. </el-table>
  298. <pagination
  299. v-show="page.total > 0"
  300. :total="page.total"
  301. :page.sync="page.pageNum"
  302. :limit.sync="page.pageSize"
  303. @pagination="getList"
  304. />
  305. </div>
  306. <!-- 详情页 -->
  307. <kaihe-detail
  308. ref="detail"
  309. :showDetail="showDetail"
  310. @goDetail="goDetail"
  311. @goBack="goBack"
  312. @refFresh="refFresh"
  313. />
  314. <column-setting
  315. ref="columnSetting"
  316. @reset="reset"
  317. @getRowdata="getRowdata"
  318. tableName="凯和付费列表"
  319. />
  320. </div>
  321. </template>
  322. <script>
  323. import { tableOption } from "./js/index";
  324. import {
  325. getList,
  326. selectTVesself,
  327. selectTVoyagef,
  328. selectPortName,
  329. listCorps,
  330. remove,
  331. rowRemove,
  332. getExcel,
  333. } from "@/api/finance/kaihe/contrast";
  334. import kaiheDetail from "./kaihe-detail.vue";
  335. import columnSetting from "@/components/ColumnSetting/index";
  336. export default {
  337. data() {
  338. return {
  339. showDetail: false,
  340. form: {
  341. fVoyid: null,
  342. },
  343. show: false,
  344. options: [],
  345. tableData: [],
  346. tableOption: tableOption,
  347. selectionList: [],
  348. page: {
  349. pageNum: 1,
  350. pageSize: 10,
  351. total: 0,
  352. },
  353. TVesselfs: [],
  354. TVoyagefs: [],
  355. portNames: [],
  356. corpList: [],
  357. showSearch: true,
  358. };
  359. },
  360. components: {
  361. kaiheDetail,
  362. columnSetting,
  363. },
  364. created() {
  365. this.getList();
  366. selectTVesself().then((res) => {
  367. this.TVesselfs = res.rows;
  368. });
  369. selectTVoyagef().then((res) => {
  370. this.TVoyagefs = res.rows;
  371. });
  372. selectPortName().then((res) => {
  373. this.portNames = res.rows;
  374. });
  375. listCorps().then((res) => {
  376. this.corpList = res;
  377. });
  378. },
  379. activated() {
  380. if (this.$route.query.data) {
  381. this.Jump();
  382. }
  383. this.$refs.columnSetting.getRow(this.tableOption);
  384. },
  385. methods: {
  386. fvslChange(id) {
  387. selectTVoyagef({ fPid: id }).then((res) => {
  388. this.TVoyagefs = res.rows;
  389. });
  390. this.form.fVoyid = null;
  391. },
  392. fvslClear() {
  393. selectTVoyagef().then((res) => {
  394. this.TVoyagefs = res.rows;
  395. });
  396. this.form.fVoyid = null;
  397. },
  398. /** 导出按钮操作 */
  399. handleExport() {
  400. this.$confirm("是否确认导出所有财务数据主数据项?", "警告", {
  401. confirmButtonText: "确定",
  402. cancelButtonText: "取消",
  403. type: "warning",
  404. })
  405. .then(function () {
  406. return getExcel();
  407. })
  408. .then((response) => {
  409. this.download(response.msg);
  410. });
  411. },
  412. getRowdata(list) {
  413. this.tableOption = list;
  414. },
  415. reset() {
  416. this.tableOption = this.$options.data().tableOption;
  417. },
  418. colSetting() {
  419. this.$refs.columnSetting.init(this.tableOption);
  420. },
  421. getSummaries(param) {
  422. const { columns, data } = param;
  423. const sums = [];
  424. if (data.length > 0) {
  425. columns.forEach((column, index) => {
  426. if (index == 0) {
  427. sums[index] = "合计";
  428. }
  429. if (column.label == "应收金额" || column.label == "付费金额") {
  430. const values = data.map((item) => Number(item[column.property]));
  431. if (!values.every((value) => isNaN(value))) {
  432. sums[index] = values.reduce((prev, curr) => {
  433. const value = Number(curr);
  434. if (!isNaN(value)) {
  435. let sum = Number(prev) + Number(curr);
  436. return Number(sum).toFixed(2);
  437. } else {
  438. return Number(prev).toFixed(2);
  439. }
  440. }, 0);
  441. } else {
  442. sums[index] = "0.00";
  443. }
  444. }
  445. });
  446. }
  447. return sums;
  448. },
  449. selectionChange(list) {
  450. this.selectionList = list;
  451. },
  452. handleQuery() {
  453. this.page.pageNum = 1;
  454. if (this.form.date) {
  455. this.form.fFromDate = this.form.date[0];
  456. this.form.fToDate = this.form.date[1];
  457. }
  458. this.getList();
  459. },
  460. resetQuery() {
  461. this.form = this.$options.data().form;
  462. },
  463. getList() {
  464. const data = {
  465. ...this.form,
  466. pageNum: this.page.pageNum,
  467. pageSize: this.page.pageSize,
  468. };
  469. getList(data).then((response) => {
  470. response.rows.forEach((e) => {
  471. e.createTime = e.createTime ? e.createTime.slice(0, 10) : "";
  472. });
  473. this.tableData = response.rows;
  474. this.page.total = response.total;
  475. this.loading = false;
  476. });
  477. },
  478. refFresh() {
  479. this.getList();
  480. },
  481. copyData() {
  482. let id;
  483. this.selectionList.forEach((e) => {
  484. id = e.fId;
  485. });
  486. this.$refs.detail.copyData(id);
  487. this.showDetail = true;
  488. },
  489. goDetail(bool) {
  490. if (bool) {
  491. this.$refs.detail.init();
  492. }
  493. this.showDetail = bool;
  494. },
  495. goBack(bool) {
  496. this.getList();
  497. this.showDetail = bool;
  498. },
  499. rowDetail(row, status) {
  500. this.$refs.detail.info(row, status);
  501. this.showDetail = true;
  502. },
  503. rowDel(row) {
  504. rowRemove(row.fId).then((res) => {
  505. let tips = "";
  506. switch (res.msg) {
  507. case "0": {
  508. this.$message.error("当前数据已被其他操作员操作,请刷新页面");
  509. break;
  510. }
  511. case "1": {
  512. tips = "当前主表有数据,从表无数据,确认是否删除?";
  513. this.delete(row.fId, tips);
  514. break;
  515. }
  516. case "2": {
  517. tips = "当前主表有数据,从表有数据,确认是否删除?";
  518. this.delete(row.fId, tips);
  519. break;
  520. }
  521. default: {
  522. return this.$message.error("未知错误,无状态");
  523. }
  524. }
  525. });
  526. },
  527. delete(fIds, tips) {
  528. this.$confirm(tips, "警告", {
  529. confirmButtonText: "确定",
  530. cancelButtonText: "取消",
  531. type: "warning",
  532. })
  533. .then(function () {
  534. return remove(fIds);
  535. })
  536. .then(() => {
  537. this.getList();
  538. this.$message.success("删除成功");
  539. });
  540. },
  541. Jump() {
  542. let data = JSON.parse(this.$route.query.data);
  543. if (data) {
  544. this.showDetail = true;
  545. this.rowDetail(data.billId, 3);
  546. }
  547. },
  548. },
  549. };
  550. </script>
  551. <style lang="scss" scoped>
  552. .head-but {
  553. display: flex;
  554. justify-content: space-between;
  555. margin-bottom: 8px;
  556. }
  557. .tabSetting {
  558. display: flex;
  559. justify-content: flex-end;
  560. }
  561. </style>