index.vue 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682
  1. <template>
  2. <div class="app-container">
  3. <el-menu
  4. :default-active="activeIndex"
  5. class="el-menu-demo"
  6. mode="horizontal"
  7. @select="handleSelect"
  8. text-color="#000"
  9. active-text-color="#ffd04b">
  10. <el-menu-item index="0">全部</el-menu-item>
  11. <!-- <el-menu-item index="1">新建</el-menu-item>-->
  12. <!-- <el-menu-item index="2">计划暂存</el-menu-item>-->
  13. <!-- <el-menu-item index="3">计划驳回审批</el-menu-item>-->
  14. <el-menu-item index="1">计划提交审批</el-menu-item>
  15. <!-- <el-menu-item index="5">计划审批中</el-menu-item>-->
  16. <el-menu-item index="2">计划审批通过</el-menu-item>
  17. <el-menu-item index="3">配船暂存</el-menu-item>
  18. <!-- <el-menu-item index="8">配船驳回审批</el-menu-item>-->
  19. <el-menu-item index="4">配船提交审批</el-menu-item>
  20. <!-- <el-menu-item index="10">配船审批中</el-menu-item>-->
  21. <el-menu-item index="5">配船审批通过</el-menu-item>
  22. <el-menu-item index="6">运单变更</el-menu-item>
  23. </el-menu>
  24. <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px" style="margin-top:20px">
  25. <el-row>
  26. <el-form-item label="订舱号" prop="fBillno">
  27. <el-input size="small" width="240px" clearable v-model="queryParams.fBillno"/>
  28. </el-form-item>
  29. <el-form-item label="运输条款" prop="fServiceitems">
  30. <el-select size="small" width="240px" clearable v-model="queryParams.fServiceitems">
  31. <el-option
  32. v-for="item in serviceitems"
  33. :key="item.dictValue"
  34. :label="item.dictLabel"
  35. :value="item.dictValue"/>
  36. </el-select>
  37. </el-form-item>
  38. <el-form-item label="收货人" prop="fConsigneername">
  39. <el-input size="small" width="240px" clearable v-model="queryParams.fConsigneername"/>
  40. </el-form-item>
  41. <el-form-item label="箱型" prop="fCntrid">
  42. <el-select size="small" v-model="queryParams.fCntrid" clearable :remote-method="cntrRemoteMethod">
  43. <el-option
  44. v-for="(dict, index) in container"
  45. :key="dict.fId"
  46. :label="dict.fNo"
  47. :value="dict.fId"
  48. ></el-option>
  49. </el-select>
  50. </el-form-item>
  51. <el-form-item label="箱量" prop="fCntrcount">
  52. <el-input size="small" width="240px" clearable v-model="queryParams.fCntrcount"/>
  53. </el-form-item>
  54. <el-form-item label="装货时间" prop="fBsdate">
  55. <el-date-picker
  56. v-model="queryParams.fBsdate"
  57. type="date"
  58. placeholder="选择日期"
  59. format="yyyy-MM-dd">
  60. </el-date-picker>
  61. </el-form-item>
  62. </el-row>
  63. </el-form>
  64. <el-row :gutter="10" class="mb8">
  65. <div style="float: left">
  66. <el-button type="cyan" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
  67. <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
  68. </div>
  69. <div class="tabSetting">
  70. <right-toolbar
  71. :showSearch.sync="showSearch"
  72. @queryTable="getList"
  73. ></right-toolbar>
  74. <div style="margin: 0 12px">
  75. <el-button
  76. icon="el-icon-setting"
  77. size="mini"
  78. circle
  79. @click="showSetting = !showSetting"
  80. ></el-button>
  81. </div>
  82. </div>
  83. </el-row>
  84. <el-dialog title="提示" :visible.sync="showSetting" width="700px" v-dialogDrag>
  85. <template slot="title">
  86. <div class="avue-crud__dialog__header">
  87. <span class="el-dialog__title">
  88. <span style="display:inline-block;width:3px;height:20px;margin-right:5px; float: left;margin-top:2px"></span>
  89. </span>
  90. </div>
  91. </template>
  92. <div>配置排序列数据(拖动调整顺序)</div>
  93. <div style="margin-left: 17px">
  94. <el-checkbox
  95. v-model="allCheck"
  96. label="全选"
  97. @change="allChecked"
  98. ></el-checkbox>
  99. </div>
  100. <div style="padding: 4px; display: flex; justify-content: center">
  101. <draggable
  102. v-model="setRowList"
  103. group="site"
  104. animation="300"
  105. @start="onStart"
  106. @end="onEnd"
  107. handle=".indraggable"
  108. >
  109. <transition-group>
  110. <div
  111. v-for="item in setRowList"
  112. :key="item.surface"
  113. class="listStyle"
  114. >
  115. <div style="width: 500px" class="indraggable">
  116. <div class="progress" :style="{ width: item.width + 'px' }">
  117. <el-checkbox
  118. :label="item.name"
  119. v-model="item.checked"
  120. :true-label="0"
  121. :false-label="1"
  122. >{{ item.name }}
  123. </el-checkbox>
  124. </div>
  125. </div>
  126. <el-input-number
  127. v-model.number="item.width"
  128. controls-position="right"
  129. :min="1"
  130. :max="500"
  131. size="mini"
  132. ></el-input-number>
  133. </div>
  134. </transition-group>
  135. </draggable>
  136. </div>
  137. <span slot="footer" class="dialog-footer">
  138. <el-button @click="showSetting = false">取 消</el-button>
  139. <el-button @click="delRow" type="danger">重 置</el-button>
  140. <el-button type="primary" @click="save()">确 定</el-button>
  141. </span>
  142. </el-dialog>
  143. <el-table v-loading="loading" :data="corpsList" @selection-change="handleSelectionChange">
  144. <el-table-column type="selection" width="55" align="center" />
  145. <el-table-column label="行号" align="center" type="index" fixed/>
  146. <el-table-column
  147. v-for="(item, index) in getRowList"
  148. :key="index"
  149. :label="item.name"
  150. :width="item.width"
  151. :prop="item.label"
  152. align="center"
  153. :fixed="item.fixed"
  154. :show-overflow-tooltip="true"
  155. sortable
  156. >
  157. <template slot-scope="scope">
  158. <span v-if="item.label == 'fBillno'">{{scope.row.fBillno}}</span>
  159. <span v-if="item.label == 'fServiceitems'">{{scope.row.fServiceitems}}</span>
  160. <span v-if="item.label == 'fConsigneername'">{{scope.row.fConsigneername}}</span>
  161. <span v-if="item.label == 'fName'">{{scope.row.fName}}</span>
  162. <span v-if="item.label == 'fNo'">{{scope.row.fNo}}</span>
  163. <span v-if="item.label == 'fCntrcount'">{{scope.row.fCntrcount}}</span>
  164. <span v-if="item.label == 'fBsdate'">{{scope.row.fBsdate}}</span>
  165. <span v-if="item.label == 'fBillstatus'">{{scope.row.fBillstatus}}</span>
  166. <span v-if="item.label == 'vslName'">{{scope.row.vslName}}</span>
  167. <span v-if="item.label == 'voyNo'">{{scope.row.voyNo}}</span>
  168. <span v-if="item.label == 'fMblno'">{{scope.row.fMblno}}</span>
  169. <span v-if="item.label == 'corpName'">{{scope.row.corpName}}</span>
  170. <span v-if="item.label == 'goodsName'">{{scope.row.goodsName}}</span>
  171. <span v-if="item.label == 'createBy'">{{scope.row.createBy}}</span>
  172. <span v-if="item.label == 'createTime'">{{ (scope.row.createTime).slice(0,10) }}</span>
  173. <span v-if="item.label == 'loadportName'">{{scope.row.loadportName}}</span>
  174. <span v-if="item.label == 'destportName'">{{scope.row.destportName}}</span>
  175. </template>
  176. </el-table-column>
  177. <!-- <el-table-column label="订舱号" align="center" prop="fBillno"/>-->
  178. <!-- <el-table-column label="运输条款" align="center" prop="fServiceitems" />-->
  179. <!-- <el-table-column label="收货人" align="center" prop="fConsigneername"/>-->
  180. <!-- <el-table-column label="航线" align="center" prop="fName"/>-->
  181. <!-- <el-table-column label="箱型" align="center" prop="fNo"/>-->
  182. <!-- <el-table-column label="箱量" align="center" prop="fCntrcount"/>-->
  183. <!-- <el-table-column label="装货时间" align="center" prop="fBsdate"/>-->
  184. <el-table-column label="操作" fixed="right" align="center" class-name="small-padding fixed-width" min-width="160px">
  185. <template slot-scope="scope">
  186. <el-button
  187. size="mini"
  188. type="text"
  189. icon="el-icon-edit"
  190. v-hasPermi="['shipping:ctnprice:edit']"
  191. @click="handleUpdate(scope.row)"
  192. >查看</el-button>
  193. <el-button
  194. size="mini"
  195. type="text"
  196. icon="el-icon-delete"
  197. v-hasPermi="['shipping:items:remove']"
  198. @click="handleDelete(scope.row)"
  199. >移除</el-button>
  200. </template>
  201. </el-table-column>
  202. <!-- <el-table-column-->
  203. <!-- class-name="small-padding fixed-width"-->
  204. <!-- v-for="(item,index) in boxDistributionName"-->
  205. <!-- :key="item.index"-->
  206. <!-- :label="item"-->
  207. <!-- :value="item.index"-->
  208. <!-- :prop="item"-->
  209. <!-- >-->
  210. <!-- </el-table-column>-->
  211. </el-table>
  212. <pagination
  213. v-show="total>0"
  214. :total="total"
  215. :page.sync="queryParams.pageNum"
  216. :limit.sync="queryParams.pageSize"
  217. @pagination="getList"
  218. />
  219. </div>
  220. </template>
  221. <script>
  222. import { listCorps, getcntrName, delCorps, changeCorpsStatus,exportCorps } from "@/api/kaihe/domesticTrade/myOrder";
  223. import Cookies from 'js-cookie'
  224. import { addSet, resetModule, select } from '@/api/system/set'
  225. import Vue from 'vue'
  226. Vue.directive('dialogDrag', {
  227. bind(el, binding, vnode, oldVnode) {
  228. const dialogHeaderEl = el.querySelector('.el-dialog__header')
  229. const dragDom = el.querySelector('.el-dialog')
  230. const enlarge = el.querySelector('.enlarge')
  231. dialogHeaderEl.style.cursor = 'move'
  232. // 获取原有属性 ie dom元素.currentStyle 火狐谷歌 window.getComputedStyle(dom元素, null);
  233. const sty = dragDom.currentStyle || window.getComputedStyle(dragDom, null)
  234. if(enlarge){
  235. enlarge.onclick = (e) => {
  236. dragDom.style.top = '0px'
  237. dragDom.style.left = '0px'
  238. }
  239. }
  240. dialogHeaderEl.onmousedown = (e) => {
  241. // 鼠标按下,计算当前元素距离可视区的距离
  242. const disX = e.clientX - dialogHeaderEl.offsetLeft
  243. const disY = e.clientY - dialogHeaderEl.offsetTop
  244. // 获取到的值带px 正则匹配替换
  245. let styL, styT
  246. // 注意在ie中 第一次获取到的值为组件自带50% 移动之后赋值为px
  247. if (sty.left.includes('%')) {
  248. styL = +document.body.clientWidth * (+sty.left.replace(/\%/g, '') / 100)
  249. styT = +document.body.clientHeight * (+sty.top.replace(/\%/g, '') / 100)
  250. } else {
  251. styL = +sty.left.replace(/\px/g, '')
  252. styT = +sty.top.replace(/\px/g, '')
  253. }
  254. document.onmousemove = function(e) {
  255. // 通过事件委托,计算移动的距离
  256. const l = e.clientX - disX
  257. const t = e.clientY - disY
  258. // 移动当前元素
  259. if ((t + styT) >= 0){
  260. dragDom.style.top = `${t + styT}px`
  261. }
  262. dragDom.style.left = `${l + styL}px`
  263. // 将此时的位置传出去
  264. // binding.value({x:e.pageX,y:e.pageY})
  265. }
  266. document.onmouseup = function(e) {
  267. document.onmousemove = null
  268. document.onmouseup = null
  269. }
  270. }
  271. }
  272. })
  273. export default {
  274. name: "myOrder",
  275. components: {
  276. },
  277. data() {
  278. return {
  279. activeIndex: '0',
  280. setRowList: [],
  281. getRowList: [],
  282. tableDate: [
  283. {
  284. surface: "1",
  285. label: "fBillno",
  286. name: "订舱号",
  287. fixed:"left",
  288. checked: 0,
  289. width: 120,
  290. },
  291. {
  292. surface: "2",
  293. label: "fServiceitems",
  294. name: "运输条款",
  295. fixed:"left",
  296. checked: 0,
  297. width: 120,
  298. },
  299. {
  300. surface: "3",
  301. label: "fConsigneername",
  302. name: "收货人",
  303. fixed:"left",
  304. checked: 0,
  305. width: 120,
  306. },
  307. {
  308. surface: "4",
  309. label: "fName",
  310. name: "航线",
  311. fixed:"left",
  312. checked: 0,
  313. width: 120,
  314. },
  315. {
  316. surface: "5",
  317. label: "fNo",
  318. name: "箱型",
  319. fixed:"left",
  320. checked: 0,
  321. width: 120,
  322. },
  323. {
  324. surface: "6",
  325. label: "fCntrcount",
  326. name: "箱量",
  327. fixed:"left",
  328. checked: 0,
  329. width: 120,
  330. },
  331. {
  332. surface: "7",
  333. label: "fBsdate",
  334. name: "装货时间",
  335. checked: 0,
  336. width: 120,
  337. },
  338. {
  339. surface: "8",
  340. label: "fBillstatus",
  341. name: "状态",
  342. checked: 0,
  343. width: 120,
  344. },
  345. {
  346. surface: "9",
  347. label: "vslName",
  348. name: "船名",
  349. checked: 0,
  350. width: 120,
  351. },
  352. {
  353. surface: "10",
  354. label: "voyNo",
  355. name: "航次",
  356. checked: 0,
  357. width: 120,
  358. },
  359. {
  360. surface: "11",
  361. label: "fMblno",
  362. name: "提单号",
  363. checked: 0,
  364. width: 120,
  365. },
  366. {
  367. surface: "12",
  368. label: "corpName",
  369. name: "订舱单位",
  370. checked: 0,
  371. width: 120,
  372. },
  373. {
  374. surface: "13",
  375. label: "goodsName",
  376. name: "货名",
  377. checked: 0,
  378. width: 120,
  379. },
  380. {
  381. surface: "14",
  382. label: "createBy",
  383. name: "订舱人",
  384. checked: 0,
  385. width: 120,
  386. },
  387. {
  388. surface: "15",
  389. label: "createTime",
  390. name: "订舱时间",
  391. checked: 0,
  392. width: 120,
  393. },
  394. {
  395. surface: "16",
  396. label: "loadportName",
  397. name: "起运港",
  398. checked: 0,
  399. width: 120,
  400. },
  401. {
  402. surface: "17",
  403. label: "destportName",
  404. name: "目的港",
  405. checked: 0,
  406. width: 120,
  407. },
  408. ],
  409. //自定义列宽
  410. allCheck: false,
  411. showSetting:false,
  412. serviceitems:[],
  413. container:[],
  414. // 遮罩层
  415. loading: true,
  416. // 选中数组
  417. ids: [],
  418. // 非单个禁用
  419. single: true,
  420. // 非多个禁用
  421. multiple: true,
  422. // 显示搜索条件
  423. showSearch: true,
  424. // 总条数
  425. total: 0,
  426. // 客户详情表格数据
  427. corpsList: [],
  428. // 查询参数
  429. queryParams: {
  430. pageNum: 1,
  431. pageSize: 10,
  432. },
  433. };
  434. },
  435. created() {
  436. this.setRowList = this.tableDate;
  437. this.getRowList = this.tableDate;
  438. this.getList();
  439. this.cntrRemoteMethod()
  440. this.getDicts("f_serviceitems").then((response) => {
  441. if (response.data) {
  442. this.serviceitems = response.data;
  443. }
  444. });
  445. // this.getRow()
  446. },
  447. activated() {
  448. // this.getList()
  449. },
  450. methods: {
  451. handleSelect(key, keyPath) {
  452. console.log(key);
  453. console.log(keyPath);
  454. if(key === '0'){
  455. this.queryParams = {
  456. pageNum: 1,
  457. pageSize: 10,
  458. }
  459. }else if(key === '1'){
  460. this.queryParams.fBillstatus = 4
  461. }else if(key === '2'){
  462. this.queryParams.fBillstatus = 6
  463. }else if(key === '3'){
  464. this.queryParams.fBillstatus = 7
  465. }else if(key === '4'){
  466. this.queryParams.fBillstatus = 9
  467. }else if(key === '5'){
  468. this.queryParams.fBillstatus = 11
  469. }else if(key === '6'){
  470. this.queryParams.fBillstatus = 12
  471. }
  472. listCorps(this.queryParams).then(response => {
  473. console.log(response)
  474. this.corpsList = response.rows;
  475. this.total = response.total;
  476. this.loading = false;
  477. });
  478. },
  479. //重置列表
  480. delRow() {
  481. this.data = {
  482. tableName: "船舶信息",
  483. userId: Cookies.get("userName"),
  484. };
  485. resetModule(this.data).then((res) => {
  486. if (res.code == 200) {
  487. this.showSetting = false;
  488. this.setRowList = this.tableDate;
  489. this.getRowList = this.tableDate;
  490. }
  491. });
  492. },
  493. //列设置全选
  494. allChecked() {
  495. if (this.allCheck == true) {
  496. this.setRowList.map((e) => {
  497. return (e.checked = 0);
  498. });
  499. } else {
  500. this.setRowList.map((e) => {
  501. return (e.checked = 1);
  502. });
  503. }
  504. },
  505. //查询列数据
  506. getRow() {
  507. let that = this;
  508. this.data = {
  509. tableName: "船舶信息",
  510. userId: Cookies.get("userName"),
  511. };
  512. select(this.data).then((res) => {
  513. if (res.data.length != 0) {
  514. this.getRowList = res.data.filter((e) => e.checked == 0);
  515. this.setRowList = res.data;
  516. this.setRowList = this.setRowList.reduce((res, item) => {
  517. res.push({
  518. surface: item.surface,
  519. label: item.label,
  520. name: item.name,
  521. checked: item.checked,
  522. width: item.width,
  523. fixed: item.fixed
  524. });
  525. return res;
  526. }, []);
  527. }
  528. });
  529. },
  530. //保存列设置
  531. save() {
  532. this.showSetting = false;
  533. this.data = {
  534. tableName: "船舶信息",
  535. userId: Cookies.get("userName"),
  536. sysTableSetList: this.setRowList,
  537. };
  538. addSet(this.data).then((res) => {
  539. this.getRowList = this.setRowList.filter((e) => e.checked == 0);
  540. });
  541. },
  542. //开始拖拽事件
  543. onStart() {
  544. this.drag = true;
  545. },
  546. //拖拽结束事件
  547. onEnd() {
  548. this.drag = false;
  549. },
  550. //箱型下拉查询
  551. cntrRemoteMethod() {
  552. let queryParams = { pageNum: 1,};
  553. getcntrName(queryParams).then(response=>{
  554. console.log(response)
  555. this.container = response.rows
  556. })
  557. },
  558. /** 删除按钮操作 */
  559. handleDelete(row) {
  560. const fIds = row.fId || this.ids;
  561. this.$confirm('是否确认删除客户详情编号为"' + fIds + '"的数据项?', "警告", {
  562. confirmButtonText: "确定",
  563. cancelButtonText: "取消",
  564. type: "warning"
  565. }).then(function() {
  566. return delCorps(fIds);
  567. }).then(() => {
  568. this.getList();
  569. this.msgSuccess("删除成功");
  570. })
  571. },
  572. //查看跳转
  573. handleUpdate(row){
  574. console.log(row.fId)
  575. let res = {}
  576. res = {
  577. fId:row.fId
  578. }
  579. this.$router.push({
  580. path: "/domesticTrade/orderInformation",
  581. query: { data: JSON.stringify(res) },
  582. });
  583. },
  584. //模糊查询地点
  585. addressMethod(){
  586. let queryParams = { pageNum: 1,};
  587. getaddress(queryParams).then(response=>{
  588. this.addressOptions = response.rows
  589. })
  590. },
  591. /** 查询客户详情列表 */
  592. getList() {
  593. listCorps(this.queryParams).then(response => {
  594. console.log(response)
  595. this.corpsList = response.rows;
  596. this.total = response.total;
  597. this.loading = false;
  598. });
  599. },
  600. // 从表重置
  601. contList() {
  602. this.contactList = []
  603. },
  604. // 状态修改
  605. handleStatusChange(row) {
  606. let text = row.fStatus === "0" ? "启用" : "停用";
  607. this.$confirm('确认要"' + text + '""' + row.fName + '"吗?', "警告", {
  608. confirmButtonText: "确定",
  609. cancelButtonText: "取消",
  610. type: "warning"
  611. }).then(function() {
  612. return changeCorpsStatus(row.fId, row.fStatus);
  613. }).then(() => {
  614. this.msgSuccess(text + "成功");
  615. }).catch(function() {
  616. row.fStatus = row.fStatus === "0" ? "1" : "0";
  617. });
  618. },
  619. /** 搜索按钮操作 */
  620. handleQuery() {
  621. this.queryParams.pageNum = 1;
  622. this.getList();
  623. },
  624. /** 重置按钮操作 */
  625. resetQuery() {
  626. this.resetForm("queryForm");
  627. this.handleQuery();
  628. },
  629. // 多选框选中数据
  630. handleSelectionChange(selection) {
  631. this.ids = selection.map(item => item.fId)
  632. this.single = selection.length!==1
  633. this.multiple = !selection.length
  634. },
  635. }
  636. };
  637. </script>
  638. <style lang="scss" scoped>
  639. .tabSetting {
  640. display: flex;
  641. justify-content: flex-end;
  642. }
  643. .listStyle {
  644. display: flex;
  645. border-top: 1px solid #dcdfe6;
  646. border-left: 1px solid #dcdfe6;
  647. border-right: 1px solid #dcdfe6;
  648. }
  649. .listStyle:last-child {
  650. border-bottom: 1px solid #dcdfe6;
  651. }
  652. .progress {
  653. display: flex;
  654. align-items: center;
  655. padding: 2px;
  656. background-color: rgba(0, 0, 0, 0.05);
  657. height: 100%;
  658. }
  659. </style>