You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
217 lines
7.3 KiB
217 lines
7.3 KiB
<template> |
|
<div> |
|
<table |
|
border="1" |
|
style="width: 100%; text-align: center; border-collapse: collapse; border-spacing: 0" |
|
> |
|
<thead> |
|
<tr> |
|
<th colspan="4"> |
|
<img style="height: 40px" src="../../../public/img/htlogo.png" alt="暂无图片" /> |
|
</th> |
|
<th colspan="6" style="font-size: 20px">中转装载清单</th> |
|
<th :colspan="3 + goodsTitleList.length + 1"> |
|
<img id="imgcode" :src="renderInfo.carsNoBase64" /> |
|
<div>{{ renderInfo.carsNo }}</div> |
|
</th> |
|
</tr> |
|
<tr> |
|
<th colspan="4">始发站:{{ renderInfo.startWarehouseName }}</th> |
|
<th colspan="6"> |
|
经停站:{{ |
|
renderInfo.endWarehouseNames.slice(0, renderInfo.endWarehouseNames.length - 1)[0] || |
|
'' |
|
}} |
|
</th> |
|
<th :colspan="3 + goodsTitleList.length + 1"> |
|
目的站:{{ renderInfo.endWarehouseNames.slice(-1)[0] }} |
|
</th> |
|
</tr> |
|
<tr> |
|
<th colspan="4">承运商:{{ renderInfo.carrierName || '' }}</th> |
|
<th colspan="2">承运商联系电话:{{ renderInfo.assistantMobile || '' }}</th> |
|
<th colspan="2">承运单号:{{ renderInfo.carrierOrderCode || '' }}</th> |
|
<th colspan="2">卸车完成时间: {{ renderInfo.unloadDate || '年 月 日' }}</th> |
|
<th :colspan="3 + goodsTitleList.length + 1">卸车人员签字</th> |
|
</tr> |
|
<tr> |
|
<th rowspan="2">序号</th> |
|
<th rowspan="2">发货单位</th> |
|
<th rowspan="2">开单时间</th> |
|
<th rowspan="2">收货单位</th> |
|
<th rowspan="2">收货人</th> |
|
<th rowspan="2">收货电话</th> |
|
<th rowspan="2">物流单号</th> |
|
<th rowspan="2">合同号</th> |
|
<th rowspan="2">计划件数</th> |
|
<th rowspan="2">货位</th> |
|
<th :colspan="goodsTitleList.length + 1">装车产品明细</th> |
|
<th rowspan="2">合计件数</th> |
|
<th rowspan="2">卸车件数</th> |
|
<th rowspan="2">异常备注</th> |
|
</tr> |
|
<tr> |
|
<th v-for="item in goodsTitleList" :key="item">{{ item }}</th> |
|
|
|
<th>小计</th> |
|
</tr> |
|
</thead> |
|
<tbody> |
|
<!-- 值 --> |
|
<template v-if="renderInfo.mainList"> |
|
<tr v-for="(value, index) in renderInfo.mainList" style="word-break: break-all"> |
|
<td>{{ index + 1 }}</td> |
|
<!-- 发货单位 --> |
|
<td v-if="value.mergeColumnIndex" :rowspan="value.mergeColumnIndex" contenteditable> |
|
{{ value.shipper || '' }} |
|
</td> |
|
<!-- 开单时间 --> |
|
<td v-if="value.mergeColumnIndex" :rowspan="value.mergeColumnIndex" contenteditable> |
|
{{ value.createTime || '' }} |
|
</td> |
|
<!-- 收货单位 --> |
|
<td v-if="value.mergeColumnIndex" :rowspan="value.mergeColumnIndex" contenteditable> |
|
{{ value.consignee }} |
|
</td> |
|
<!-- 收货人 --> |
|
<td v-if="value.mergeColumnIndex" :rowspan="value.mergeColumnIndex" contenteditable> |
|
{{ value.consigneeName }} |
|
</td> |
|
<!-- 收货电话 --> |
|
<td v-if="value.mergeColumnIndex" :rowspan="value.mergeColumnIndex" contenteditable> |
|
{{ value.consigneeMobile }} |
|
</td> |
|
<!-- 物流单号 --> |
|
<td v-if="value.mergeColumnIndex" :rowspan="value.mergeColumnIndex"> |
|
{{ value.waybillNo }} |
|
</td> |
|
<!-- 合同号 --> |
|
<td>{{ value.orderCode }}</td> |
|
<!-- 计划件数 --> |
|
<td contenteditable>{{ value.planNum }}</td> |
|
<!-- 货位 --> |
|
<td></td> |
|
<td contenteditable v-for="item in goodsTitleList"> |
|
{{ (value.goodsList.find(val => val.goodsName === item) || {}).num || '' }} |
|
</td> |
|
<!-- 小计 --> |
|
<td contenteditable>{{ value.smallTotal }}</td> |
|
<!-- 合计件数 --> |
|
<td contenteditable>{{ value.smallTotal }}</td> |
|
<!-- 卸车件数 --> |
|
<td contenteditable>{{ value.unloadNum }}</td> |
|
<!-- 异常备注 --> |
|
<td contenteditable></td> |
|
</tr> |
|
</template> |
|
|
|
<!-- 合计行 --> |
|
<tr> |
|
<th colspan="8">合计</th> |
|
<!-- 合计 -- 计划件数 --> |
|
<td contenteditable>{{ totalPlanNum }}</td> |
|
<td></td> |
|
<td contenteditable v-for="item in goodsTitleList"></td> |
|
<td></td> |
|
<!-- 合计件数 --> |
|
<td contenteditable>{{ totalNum }}</td> |
|
<!-- 卸车件数 --> |
|
<td contenteditable>{{ totalUnLoadNum }}</td> |
|
<td></td> |
|
</tr> |
|
<tr> |
|
<td :colspan="5">投诉电话:4000184668</td> |
|
|
|
<td :colspan="5">营业部售后电话:</td> |
|
|
|
<td :colspan="4 + goodsTitleList.length">系统单调度:</td> |
|
</tr> |
|
</tbody> |
|
</table> |
|
</div> |
|
</template> |
|
|
|
<script setup lang="ts"> |
|
import { defineProps, ref, onMounted, reactive } from 'vue'; |
|
|
|
const props = defineProps(['waybillInfo']); |
|
|
|
/** 运单信息 */ |
|
const { waybillInfo } = props; |
|
|
|
/** 渲染数据 */ |
|
const renderInfo = ref<any>({}); |
|
/** 货物名称list */ |
|
const goodsTitleList = reactive([]); |
|
/** 总件数 */ |
|
const totalNum = ref(0); |
|
/** 卸车总数 */ |
|
const totalUnLoadNum = ref(0); |
|
/** 计划中暑 */ |
|
const totalPlanNum = ref(0); |
|
|
|
renderInfo.value = waybillInfo; |
|
|
|
/** 是否显示金额统计 */ |
|
const isShowTotal = ref(false); |
|
|
|
// 合并起始索引 |
|
let mergeStartIndex = 0; |
|
// 比对值 |
|
let comparisonValue = ''; |
|
|
|
const handleMerge = (startIndex: number, endIndex: number, data: {}) => { |
|
for (let index = startIndex; index < endIndex; index++) { |
|
const value = data[index]; |
|
|
|
if (index === startIndex) value.mergeColumnIndex = endIndex - startIndex; |
|
else { |
|
value.mergeColumnIndex = 0; |
|
} |
|
} |
|
}; |
|
|
|
renderInfo.value.endWarehouseNames = renderInfo.value.endWarehouseNames.split(','); |
|
for (let index = 0; index < renderInfo.value.mainList.length; index++) { |
|
const element = renderInfo.value.mainList[index]; |
|
|
|
if (index === 0) { |
|
comparisonValue = element.waybillNo; |
|
element.mergeColumnIndex = 1; |
|
} |
|
|
|
totalNum.value += element.smallTotal || 0; |
|
totalUnLoadNum.value += element.unloadNum || 0; |
|
totalPlanNum.value += element.planNum || 0; |
|
|
|
if (element.waybillNo !== comparisonValue) { |
|
// if (index === 1) mergeStartIndex = 1; |
|
comparisonValue = element.waybillNo; |
|
handleMerge(mergeStartIndex, index, renderInfo.value.mainList); |
|
mergeStartIndex = index; |
|
|
|
if (index === renderInfo.value.mainList.length - 1) { |
|
handleMerge(mergeStartIndex, index + 1, renderInfo.value.mainList); |
|
} |
|
// 最后一位特殊处理 |
|
} else if (index === renderInfo.value.mainList.length - 1) { |
|
handleMerge(mergeStartIndex, index + 1, renderInfo.value.mainList); |
|
} |
|
|
|
if (element.goodsList && element.goodsList.length > 0) { |
|
for (let i = 0; i < element.goodsList.length; i++) { |
|
const item = element.goodsList[i]; |
|
|
|
if (!goodsTitleList.includes(item.goodsName)) goodsTitleList.push(item.goodsName); |
|
} |
|
} |
|
} |
|
|
|
console.log('waybillInfo :>> ', waybillInfo); |
|
</script> |
|
|
|
<style lang="scss" scoped> |
|
.waybillPrintTemplate_container { |
|
width: 100%; |
|
} |
|
</style>
|
|
|