Commit 05f6e30f authored by huhaiqing's avatar huhaiqing

出货详情功能开发

parent fe877479
......@@ -355,14 +355,14 @@ export function abnormalCreate(data) {
* 获得已预装部分列表
*
* @export
* @param {*} params
* @param {*} data
* @return {*}
*/
export function secGoodsList(params) {
export function secGoodsList(data) {
return request({
url: "/ecw/box-preload-goods/secGoodsList",
method: "get",
params,
method: "post",
data,
});
}
......@@ -370,14 +370,14 @@ export function secGoodsList(params) {
* 获得预装分页
*
* @export
* @param {*} params
* @param {*} data
* @return {*}
*/
export function preloadPage(params) {
export function preloadPage(data) {
return request({
url: "/ecw/box-preload-goods/preloadPage",
method: "get",
params,
method: "post",
data,
});
}
......@@ -396,6 +396,37 @@ export function createSection(data) {
});
}
/**
* 查询出货单下的所有部分列表
*
* @export
* @param {*} data
* @return {*}
*/
export function getSectionList(params) {
return request({
url: "/ecw/box-preload-section/list",
method: "get",
params,
});
}
/**
* 装柜订单明细
*
* @export
* @param {*} data
* @return {*}
*/
export function boxGoodsDetail(data) {
return request({
url: "/ecw/box-preload-goods/boxGoodsDetail",
method: "post",
headers: { "Content-Type": "application/x-www-form-urlencoded" },
data: jsonToFormData(data),
});
}
/**
* 删除预装部分
*
......
......@@ -387,13 +387,13 @@ export const constantRoutes = [
hidden: true,
redirect: 'noredirect',
children: [
/* {
path: 'query/:boxId(\\d+)',
{
path: 'query/:shipmentId(\\d+)',
component: (resolve) => import('@/views/ecw/box/query'),
props: true,
name: 'boxQuery',
meta: {title: '出货详情', icon: '', activeMenu: '/shipment/box'}
}, */
name: 'shippingDetail',
meta: {title: '出货详情', icon: '', activeMenu: '/shipment/boxDetail'}
},
{
path: 'shippingSea/:shipmentId(\\d+)',
component: (resolve) => import('@/views/ecw/box/shippingSea/shippingSea'),
......
......@@ -20,7 +20,7 @@
</el-select>
</el-form-item>
<el-row class="two-element">
<el-row class="two-element-formItem">
<el-form-item label="金额">
<el-input-number v-model="costObj.price" controls-position="right" :min="1"></el-input-number>
</el-form-item>
......@@ -36,7 +36,7 @@
</el-form-item>
</el-form>
<div slot="footer" class="operate-button">
<div class="operate-button">
<el-button type="primary" @click="submit">确定</el-button>
<el-button @click="$emit('closeDialog')">取消</el-button>
</div>
......@@ -84,25 +84,3 @@ export default {
},
};
</script>
<style lang="scss">
// 海运操作统一弹窗样式
.app-costForm {
// 页面内元素弹窗form控件宽度设置
.el-form-item__content {
> div:not(.el-input-number) {
width: 100%;
}
}
.operate-button {
text-align: center;
}
.two-element {
display: flex;
> :last-child {
width: 100%;
margin-left: 10px;
}
}
}
</style>
<template>
<div class="app-container">
<div class="app-container shipping-sea">
<!-- 搜索工作栏 -->
<el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
......@@ -45,8 +45,8 @@
:key="dict.value" :label="dict.label" :value="dict.value"/>
</el-select>
</el-form-item>
<el-form-item label="运输方式" prop="transportType">
<el-select v-model="queryParams.transportType" placeholder="请选择运输方式" clearable size="small">
<el-option v-for="dict in transportTypes"
......@@ -54,7 +54,7 @@
</el-select>
</el-form-item>
<el-form-item>
<el-button type="primary" icon="el-icon-search" @click="handleQuery">搜索</el-button>
<el-button icon="el-icon-refresh" @click="resetQuery">重置</el-button>
......@@ -79,7 +79,11 @@
<!-- 列表 -->
<el-table v-loading="loading" :data="list">
<el-table-column label="自编号" align="center" prop="selfNo"/>
<el-table-column label="自编号" align="center" prop="selfNo">
<template slot-scope="scope">
<el-button type="text" @click="handleCommand(scope.row, 'detail')">{{ scope.row.selfNo }}</el-button>
</template>
</el-table-column>
<el-table-column label="柜号" align="center" prop="cubNo"/>
<el-table-column label="柜型" align="center" prop="cabinetId">
<template slot-scope="scope">
......@@ -100,15 +104,15 @@
<dict-tag :type="DICT_TYPE.BOX_SHIPMENT_STATUS" :value="scope.row.boxStatus"/>
</template>
</el-table-column>
<el-table-column label="日期" align="center" prop="createTime" width="180">
<template slot-scope="scope">
<span>{{ new Date(scope.row.createTime).format('yyyy-MM-dd') }}</span>
</template>
</el-table-column>
<el-table-column label="操作" align="center" class-name="small-padding fixed-width">
<el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="200px">
<template slot-scope="scope">
<el-dropdown trigger="click" @command="(command)=>handleCommand(scope.row, command)">
<el-dropdown trigger="click" @command="(command)=>handleCommand(scope.row, command)" style="marginRight:10px;">
<el-button type="primary">
操作<i class="el-icon-arrow-down el-icon--right"></i>
</el-button>
......@@ -120,6 +124,20 @@
<el-dropdown-item command="delete">删除</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown>
<el-dropdown trigger="click">
<el-button type="primary">
下载<i class="el-icon-arrow-down el-icon--right"></i>
</el-button>
<el-dropdown-menu slot="dropdown">
<el-dropdown-item command="">预装单</el-dropdown-item>
<el-dropdown-item command="">已装单</el-dropdown-item>
<el-dropdown-item command="">应收汇总表</el-dropdown-item>
<el-dropdown-item command="">agent list</el-dropdown-item>
<el-dropdown-item command="">son cap</el-dropdown-item>
<el-dropdown-item command="">提货单</el-dropdown-item>
<el-dropdown-item command="">提单Copy</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown>
</template>
</el-table-column>
</el-table>
......@@ -128,7 +146,7 @@
@pagination="getList"/>
<!-- 对话框(添加 / 修改) -->
<el-dialog :title="title" :visible.sync="open" width="600px" append-to-body>
<el-dialog :title="title" :visible.sync="open" width="600px" append-to-body class="shippingSea-dialog">
<template v-if="dialogType === 'edit' || dialogType === 'add'">
<el-form ref="form" :model="form" :rules="rules" label-width="80px">
......@@ -155,9 +173,9 @@
<el-option v-for="item in importWarehouseList" :label="item.titleZh" :value="item.id" :key="item.id"></el-option>
</el-select>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<div class="operate-button">
<el-button type="primary" @click="submitForm">确 定</el-button>
<el-button @click="cancel">取 消</el-button>
</div>
......@@ -165,6 +183,9 @@
<template v-if="dialogType === 'cost'">
<costForm v-if="open" @closeDialog="closeDialog" :currRow="currRow"/>
</template>
<template v-if="dialogType === 'error'">
<regError v-if="open" @closeDialog="closeDialog" :shipmentObj="currRow"/>
</template>
</el-dialog>
</div>
</template>
......@@ -173,13 +194,15 @@
import {createbox, updatebox, deletebox, getbox, getboxPage, exportboxExcel} from "@/api/ecw/box";
import {getCabinetPage} from "@/api/ecw/cabinet";
import { getWarehouseList } from "@/api/ecw/warehouse"
import { getDictDatas, DICT_TYPE } from '@/utils/dict';
import { DICT_TYPE } from '@/utils/dict';
import costForm from './costForm.vue'
import regError from './regError.vue'
export default {
name: "box",
components: {
costForm
costForm,
regError
},
data() {
return {
......@@ -266,7 +289,7 @@
created() {
this.transportTypes = this.transportTypes.filter(item => item.value == '1' || item.value == '2');
getWarehouseList().then(res => this.warehouseList = res.data);
getCabinetPage(null).then(response => {
......@@ -275,7 +298,6 @@
this.getList();
},
methods: {
/** 查询列表 */
getList() {
this.loading = true;
......@@ -390,13 +412,6 @@
closeDialog() {
this.open = false;
},
/* 费用登记 */
createCost(row) {
this.title = '费用登记'
this.dialogType = 'cost';
this.open = true;
this.currRow = row;
},
/** 查看按钮操作 */
handleCommand(row, command) {
switch (command) {
......@@ -413,10 +428,53 @@
break;
case 'cost':
this.createCost(row);
this.title = '费用登记'
this.dialogType = 'cost';
this.open = true;
this.currRow = row;
break;
case 'error':
this.title = '异常登记'
this.dialogType = 'error';
this.open = true;
this.currRow = row;
break;
case 'detail':
this.$router.push('/boxSea/query/' + row.id)
break;
}
},
}
};
</script>
<style lang="scss">
// 海运操作统一弹窗样式
.shippingSea-dialog {
// 页面内元素弹窗form控件宽度设置
.el-form-item__content {
> div:not(.el-input-number) {
width: 100%;
}
}
.operate-button {
text-align: center;
}
.two-element-formItem {
display: flex;
> :last-child {
width: 100%;
margin-left: 10px;
}
}
.two-element {
.el-form-item__content {
display: flex;
> :last-child {
margin-left: 10px;
}
}
}
}
</style>
This diff is collapsed.
......@@ -18,6 +18,7 @@
<el-date-picker type="date" placeholder="请选择日期" v-model="errorObj.abnStartTime" value-format="yyyy-MM-dd"></el-date-picker>
<el-date-picker type="date" placeholder="请选择日期" v-model="errorObj.abnEndTime" value-format="yyyy-MM-dd"></el-date-picker>
</el-form-item>
<el-form-item label="是否更新订单状态">
<el-radio-group v-model="errorObj.orderStatus">
<el-radio v-for="item in status" :key="item.value" :label="item.value">{{item.label}}</el-radio>
......@@ -65,7 +66,7 @@ export default {
},
created() {
const { currNode } = this.$attrs;
this.errorObj = { opStep: currNode.dataKey };
this.errorObj = { opStep: currNode?.dataKey ?? undefined };
},
methods: {
/** 提交 */
......
......@@ -73,7 +73,7 @@
<section class="table-goodList">
<div>合计:{{calcSum(row.goodsList)}}</div>
<div v-for="(item, index) in row.goodsList" :key="index" class="goodList-div">
{{item.volume}}{{item.weight}}kg
{{getTotlContent(item,['volume','weight'])}}
</div>
</section>
</template>
......@@ -90,7 +90,11 @@
<script>
import { approvalDetail } from "@/api/ecw/box";
import { getSeaStatus, getStatusName } from "./shippingSea/utils";
import {
getSeaStatus,
getStatusName,
getTotlContent,
} from "./shippingSea/utils";
import { getCabinetPage } from "@/api/ecw/cabinet";
import { getChannelList } from "@/api/ecw/channel";
......@@ -123,6 +127,7 @@ export default {
getChannelList().then((res) => (this.channelList = res.data));
},
methods: {
getTotlContent,
/* 获取详情 */
getApprovalDetail(processId) {
approvalDetail({ approvalId: processId }).then((res) => {
......@@ -144,7 +149,11 @@ export default {
},
/* 打开订单列表 */
showOrder() {
this.$set(this.dialogConfig, "title", `${this.boxBackVO.selfNo} 订单列表`);
this.$set(
this.dialogConfig,
"title",
`${this.boxBackVO.selfNo} 订单列表`
);
this.$set(this.dialogConfig, "visible", true);
},
/* 合计 */
......@@ -190,9 +199,7 @@ export default {
/* 体积重量 */
getVolumeWeight() {
return (total) => {
return `${total?.num ?? 0} ${total?.volume ?? 0}m³ ${
total?.weight ?? 0
}kg`;
return this.getTotlContent(total);
};
},
/* 是否显示卸柜箱数 */
......
......@@ -30,7 +30,7 @@
</template>
<script>
import regError from "./regError";
import regError from "../../regError";
import dayjs from "dayjs";
import { arrivalCreate, serviceMsg } from "@/api/ecw/boxSea";
import { formatDateStr } from "../utils";
......
......@@ -11,9 +11,7 @@
</div>
<div>
<template v-if="item.secStatistics">
<p>{{item.secStatistics.num}}</p>
<p>{{item.secStatistics.volume}}</p>
<p>{{item.secStatistics.weight}}Kg</p>
{{getTotlContent(item.secStatistics)}}
</template>
</div>
</el-row>
......@@ -54,29 +52,29 @@
<dict-tag :type="DICT_TYPE.PRODUCT_RECORD_ATTRIBUTE" :value="item.productRecord" />
</p>
<p>其他:<span>{{item.num}}</span><span>{{item.volume}}</span><span>{{item.weight}}Kg</span></p>
<p>其他:{{getTotlContent(item)}}</p>
</div>
</section>
</template>
</el-table-column>
<el-table-column label="计划箱数" align="center" prop="num">
<template slot-scope="scope">
{{ scope.row.num }}
{{getTotlContent(scope.row,['num'])}}
</template>
</el-table-column>
<el-table-column label="实装箱数" align="center" prop="installNum">
<template slot-scope="scope">
{{ scope.row.installNum }}
{{ scope.row.installNum }}
</template>
</el-table-column>
<el-table-column label="体积" align="center" prop="volume">
<template slot-scope="scope">
{{ scope.row.volume }}
{{getTotlContent(scope.row,['volume'])}}
</template>
</el-table-column>
<el-table-column label="重量" align="center" prop="weight">
<template slot-scope="scope">
{{ scope.row.weight }} Kg
{{getTotlContent(scope.row,['weight'])}}
</template>
</el-table-column>
<el-table-column label="操作" align="center" class-name="small-padding fixed-width">
......@@ -97,14 +95,15 @@
<el-col :span="6" class="totle-info">
<div class="count-info">
<p>总计:
<!-- <span>{{sumData.count.num}}箱</span><span>{{sumData.count.volume}}m³</span><span>{{sumData.count.weight}}Kg</span> -->111
无返回
<!-- <span>{{sumData.count.num}}箱</span><span>{{sumData.count.volume}}m³</span><span>{{sumData.count.weight}}Kg</span> -->
</p>
</div>
<div>
<p>容量:</p>
<p>111</p>
<p>无返回</p>
</div>
<div>已装0</div>
<div>已装 无返回 </div>
</el-col>
</el-row>
......@@ -204,6 +203,7 @@ import {
boxUpdate,
approvalCreate,
} from "@/api/ecw/boxSea";
import { getTotlContent } from "../../utils";
/**
* 开始装柜
......@@ -268,6 +268,7 @@ export default {
});
},
methods: {
getTotlContent,
/* 装柜部分列表 */
getLoadSecGoodsList() {
loadSecGoodsList({ shipmentId: this.shipmentObj.id }).then((res) => {
......@@ -275,7 +276,7 @@ export default {
this.listData = data.map((item, index) => {
return {
...item,
title: `第 ${++index} 部分`,
title: `第${++index}部分`,
};
});
if (this.listData.length) {
......
......@@ -28,9 +28,7 @@
</el-collapse-transition>
<div class="part-secGoog">
<template>
<p>{{item.secStatistics ? item.secStatistics.num : 0}}</p>
<p>{{item.secStatistics ? item.secStatistics.volume : 0}}</p>
<p>{{item.secStatistics ? item.secStatistics.weight : 0}}Kg</p>
{{getTotlContent(item.secStatistics)}}
</template>
</div>
</el-row>
......@@ -95,12 +93,12 @@
<el-table-column label="箱数" align="center" prop="num" width="120" />
<el-table-column label="体积" align="center" prop="volume" width="120">
<template slot-scope="scope">
<p v-if="scope.row.volume">{{scope.row.volume}}</p>
<p v-if="scope.row.volume">{{getTotlContent(scope.row,['volume'])}}</p>
</template>
</el-table-column>
<el-table-column label="重量" align="center" prop="weight" width="120">
<template slot-scope="scope">
<p v-if="scope.row.weight">{{scope.row.weight}}kg</p>
<p v-if="scope.row.weight">{{getTotlContent(scope.row,['weight'])}}</p>
</template>
</el-table-column>
<el-table-column label="预装柜" align="center" prop="" width="120">
......@@ -151,7 +149,7 @@ import {
createGoods,
remove,
} from "@/api/ecw/boxSea";
import { formatDate } from "../../utils";
import { formatDate, getTotlContent } from "../../utils";
/**
* 补单
*/
......@@ -197,7 +195,7 @@ export default {
}
return {
...item,
title: `第 ${++index} 部分`,
title: `第${++index}部分`,
};
});
......@@ -324,6 +322,7 @@ export default {
.catch((_) => {});
},
formatDate,
getTotlContent,
},
computed: {
/** 目的地 */
......
......@@ -26,7 +26,7 @@
</template>
<script>
import regError from "./regError";
import regError from "../../regError";
import dayjs from "dayjs";
import { clearanceCreate, serviceMsg } from "@/api/ecw/boxSea";
import { formatDateStr } from "../utils";
......
......@@ -30,7 +30,7 @@
</template>
<script>
import regError from "./regError";
import regError from "../../regError";
import { shippingCreate, serviceMsg } from "@/api/ecw/boxSea";
import dayjs from "dayjs";
import { formatDateStr } from "../utils";
......
......@@ -11,7 +11,7 @@
</el-select>
</el-form-item>
<el-form-item label="目的地" prop="destWarehouseIdList">
<el-select v-model="queryParams.destWarehouseIdList" placeholder="请选择目的地" multiple>
<el-select v-model="queryParams.destWarehouseIdList" placeholder="请选择目的地" multiple clearable>
<el-option v-for="item in importWarehouseList" :label="item.titleZh" :value="item.id" :key="item.id"></el-option>
</el-select>
</el-form-item>
......@@ -108,11 +108,7 @@
<el-row class="preinstall-title">
<div class="pre-part-info">
<p>{{index+1}}部分</p>
<p>
<span>{{part.secStatistics ? part.secStatistics.num : 0}}</span>
<span>{{part.secStatistics ? part.secStatistics.volume : 0}}</span>
<span>{{part.secStatistics ? part.secStatistics.weight : 0}}kg</span>
</p>
<p>{{getTotlContent(part.secStatistics)}}</p>
</div>
<div class="table-button">
<el-button type="danger" size="small" @click="deletePart(part)">删除部分</el-button>
......@@ -131,8 +127,8 @@
<el-table-column label="箱数" align="center" prop="num" />
<el-table-column label="体积/重量/重货比" align="center" width="140" prop="volumeWeight">
<template slot-scope="scope">
<p v-if="scope.row.volume">{{scope.row.volume}}</p>
<p v-if="scope.row.weight">{{scope.row.weight}}kg</p>
<p v-if="scope.row.volume">{{getTotlContent(scope.row,['volume'])}}</p>
<p v-if="scope.row.weight">{{getTotlContent(scope.row,['weight'])}}</p>
</template>
</el-table-column>
<el-table-column label="报关方式" align="center" prop="customsType" width="120">
......@@ -169,15 +165,15 @@
<div class="preinstall-title preinstalled">
<div class="red-label">
<p>筛选后待预装数量:</p>
<p>{{unloadStatistics.num}}箱</p>
<p>{{getTotlContent(unloadStatistics,['num'])}}</p>
</div>
<div class="red-label">
<p>方数:</p>
<p>{{unloadStatistics.volume}}m³</p>
<p>{{getTotlContent(unloadStatistics,['volume'])}}</p>
</div>
<div class="red-label">
<p>重量:</p>
<p>{{unloadStatistics.weight}}kg</p>
<p>{{getTotlContent(unloadStatistics,['weight'])}}</p>
</div>
</div>
</el-row>
......@@ -225,8 +221,8 @@
<el-table-column label="箱数" align="center" prop="num" />
<el-table-column label="体积/重量" align="center" prop="volumeWeight">
<template slot-scope="scope">
<p v-if="scope.row.volume">{{scope.row.volume}}</p>
<p v-if="scope.row.weight">{{scope.row.weight}}kg</p>
<p v-if="scope.row.volume">{{getTotlContent(scope.row,['volume'])}}</p>
<p v-if="scope.row.weight">{{getTotlContent(scope.row,['weight'])}}</p>
</template>
</el-table-column>
<el-table-column label="报关方式" align="center" prop="">
......@@ -284,7 +280,8 @@ import {
approvalCreate,
} from "@/api/ecw/boxSea";
import userSelect from "./common/userSelect.vue";
import { formatDate } from "../utils";
import { formatDate, getTotlContent } from "../utils";
import dayjs from "dayjs";
/**
* 预装
......@@ -354,6 +351,7 @@ export default {
},
methods: {
formatDate,
getTotlContent,
/* 获取城市 */
importCityName(id) {
var arr = this.$attrs.warehouseList.filter((item) => item.id == id);
......@@ -370,7 +368,6 @@ export default {
let params = this.getParams();
// 已预装单号
params.orderNo = params.preOrderNo;
delete params.preOrderNo;
params.shipmentId = this.shipmentObj.id;
secGoodsList(params).then((res) => {
this.preList = res.data;
......@@ -384,7 +381,6 @@ export default {
let params = this.getParams();
// 订单号
params.orderNo = params.toBePreOrderNo;
delete params.toBePreOrderNo;
preloadPage({ ...params, ...this.pageParam }).then((res) => {
const { data } = res;
this.toBePreList = data.dataList?.list ?? [];
......@@ -438,7 +434,10 @@ export default {
if (column.property === "volumeWeight") {
const volume = this.calcSum("volume", data);
const weight = this.calcSum("weight", data);
sums[index] = `${volume ?? 0}m³ ${weight ?? 0}kg`;
sums[index] = getTotlContent({ volume, weight }, [
"volume",
"weight",
]);
}
});
......@@ -540,11 +539,14 @@ export default {
},
getParams() {
const { rucangtime = [] } = this.queryParams;
delete this.queryParams.rucangtime;
return {
...this.queryParams,
rucangTimeStart: rucangtime[0],
rucangTimeEnd: rucangtime[1],
rucangTimeStart: rucangtime[0]
? dayjs(rucangtime[0]).format("YYYY-MM-DD 00:00:00")
: rucangtime[0],
rucangTimeEnd: rucangtime[1]
? dayjs(rucangtime[1]).format("YYYY-MM-DD 23:59:59")
: rucangtime[1],
};
},
},
......
......@@ -859,11 +859,24 @@ function formatDateStr(obj, keys, format = "YYYY-MM-DD") {
return obj;
}
/**
* 格式化日期
*
* @param {*} date
* @param {string} [format="YYYY-MM-DD"]
* @return {*}
*/
function formatDate(date, format = "YYYY-MM-DD") {
if (!date) return date;
return dayjs(date).format(format);
}
/**
* 获取海运流程状态
*
* @param {*} val
* @return {*}
*/
function getSeaStatus(val) {
let currNodeStatus = 11,
isBreak = false,
......@@ -896,6 +909,29 @@ function getSeaStatus(val) {
return currNodeStatus;
}
/**
* 组装统计信息文字
*
* @param {*} total
* @param {string} [keys=["num", "volume", "weight"]]
* @return {*}
*/
function getTotlContent(total, keys = ["num", "volume", "weight"]) {
let content = [];
for (const key of keys) {
if (key === "num") {
content.push(`${total?.num ?? 0}`);
}
if (key === "volume") {
content.push(`${total?.volume ?? 0}m³`);
}
if (key === "weight") {
content.push(`${total?.weight ?? 0}kg`);
}
}
return content.join(" ");
}
export const fileTypes = [
"doc",
"xls",
......@@ -917,4 +953,5 @@ export {
formatDateStr,
formatNumberString,
formatDate,
getTotlContent,
};
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment