物流页面重构

This commit is contained in:
胥林川 2025-08-15 16:13:54 +08:00
parent 9cc9c90d95
commit 6c4a2cb0e8
6 changed files with 339 additions and 342 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

View File

@ -157,7 +157,7 @@
<img :src="getAssetsFile('images/warehouseLogistics/优先级.png')" alt="" style="width: 20px" /> --> <img :src="getAssetsFile('images/warehouseLogistics/优先级.png')" alt="" style="width: 20px" /> -->
</div> </div>
<div class="storage-tags"> <div class="storage-tags">
<el-tag effect="plain" round style="background-color: rgba(37, 191, 130, 0.2); color: #25bf82">{{ item.type }}</el-tag> <!-- <el-tag effect="plain" round style="background-color: rgba(37, 191, 130, 0.2); color: #25bf82">{{ item.type }}</el-tag> -->
<el-tag effect="plain" round style="background-color: rgba(37, 191, 130, 0.2); color: #25bf82">{{ item.monitor }}</el-tag> <el-tag effect="plain" round style="background-color: rgba(37, 191, 130, 0.2); color: #25bf82">{{ item.monitor }}</el-tag>
<!-- <el-tag effect="plain" round style="background-color: rgba(37, 191, 130, 0.2); color: #25bf82">绿色</el-tag> --> <!-- <el-tag effect="plain" round style="background-color: rgba(37, 191, 130, 0.2); color: #25bf82">绿色</el-tag> -->
</div> </div>
@ -227,7 +227,7 @@ const state = reactive({
data0: [], data0: [],
data: [ data: [
{ {
title: '云南农泰数字农业科技有限公司', title: '自动化分拣',
description: '根茎类 ', description: '根茎类 ',
location: '临沧市·耿马县', location: '临沧市·耿马县',
locationUrl: 'https://gov-cloud.oss-cn-chengdu.aliyuncs.com/frontend/chanye/dz.png', locationUrl: 'https://gov-cloud.oss-cn-chengdu.aliyuncs.com/frontend/chanye/dz.png',
@ -246,7 +246,7 @@ const state = reactive({
'云南绿源生态农业有限公司专注耿马高原根茎类作物拥有5000㎡无尘车间自动滚轴分选线可精准区分大小、糖度全程冷链+云端监控客户手机即可查看货位温湿度3-5元/kg为当季地头价量大可议价支持京东冷链直发、边贸自提。', '云南绿源生态农业有限公司专注耿马高原根茎类作物拥有5000㎡无尘车间自动滚轴分选线可精准区分大小、糖度全程冷链+云端监控客户手机即可查看货位温湿度3-5元/kg为当季地头价量大可议价支持京东冷链直发、边贸自提。',
}, },
{ {
title: '云南农泰数字农业科技有限公司', title: '人工分拣',
description: '豆类 ', description: '豆类 ',
location: '临沧市·耿马县', location: '临沧市·耿马县',
locationUrl: 'https://gov-cloud.oss-cn-chengdu.aliyuncs.com/frontend/chanye/dz.png', locationUrl: 'https://gov-cloud.oss-cn-chengdu.aliyuncs.com/frontend/chanye/dz.png',
@ -621,7 +621,7 @@ $border-color: #dcdfe6; // 边框颜色
margin: 10px 0; margin: 10px 0;
width: 100%; width: 100%;
text-align: left; text-align: left;
display: flex; // display: flex;
align-items: center; align-items: center;
justify-content: flex-start; justify-content: flex-start;
} }

View File

@ -1,398 +1,395 @@
<template> <template>
<!-- <page-layout :menus="state.menus"> </page-layout>--> <div>
<section>
<common> <common>
<template #main> <template #main>
<el-card shadow="never" style="border-radius: 14px"> <el-card style="border-radius: 16px; margin-bottom: 20px" shadow="hover">
<div class="tabs tabs0"> <div class="choose" style="margin-bottom: 5px">
<div class="tab cursor"> <div class="searchType">车长</div>
<div <div
v-for="(item, index) in tab0" v-for="(item, index) in listCC"
:key="index" :key="index"
class="tab_list_li" :class="{ active: chooseMoney === index }"
style="margin-left: 20px; margin-bottom: 10px" class="chooseItem"
:class="{ active: currentTab0 === index, tab_list_li0: currentTab0 === index }" @click="changeChoose('cc', index)"
> >
{{ item }} {{ item.name }}
</div>
</div> </div>
</div> </div>
<div style="display: flex"> <div class="choose" style="margin-bottom: 10px">
<div style="flex: 1; text-align: left"> <div style="margin-left: 70px; background: #f5f5f5; color: #999; font-size: 14px; padding: 4px 15px; border-radius: 5px">
<el-cascader <span style="margin-right: 30px">载重{{ activeCC.weight }}</span>
v-model="state.query.selectedAddress" <span>载方{{ activeCC.volume }}</span>
:options="addressOptions"
:props="cascaderProps"
placeholder="请选择省市区"
:size="formSize"
style="width: 500px; margin-bottom: 20px"
/>
<el-input v-model="state.query.detailAddress" :size="formSize" placeholder="详细位置(如街道、门牌号等)" style="width: 500px" />
</div> </div>
<div style="width: 150px; text-align: right"> </div>
<el-button type="primary" size="large" style="width: 100px">查询</el-button>
<el-button type="primary" size="large" style="width: 100px; margin-top: 20px" @click="shippingGoods">在线寄货</el-button> <div class="choose">
<div class="searchType">车型</div>
<div
v-for="(item, index) in listCx"
:key="index"
:class="{ active: chooseDate === index }"
class="chooseItem"
@click="changeChoose('cx', index)"
>
{{ item }}
</div> </div>
</div> </div>
</el-card> </el-card>
<el-card style="border-radius: 16px; margin-bottom: 20px" shadow="hover">
<div v-if="state.data == 0" class="warehouse-content-box no-data">暂无数据</div> <div class="content-box">
<div v-else style="padding-bottom: 20px"> <div class="content-item">
<div v-for="(item, index) in state.data" :key="index" class="warehouse-content-box"> <div class="icon"><img src="@/assets/images/zhuan.png" alt="" /></div>
<div class="warehouse-content-box-left"> <div class="title">装货地址</div>
<img :src="item.imageUrl" fit="cover" draggable="false" /> <div class="content"><el-input v-model="input" style="width: 400px" placeholder="请输入详细地址(可跨城)" clearable /></div>
</div> </div>
<div class="warehouse-content-box-center"> <div class="content-item">
<p class="center-title"> <div class="icon"><img src="@/assets/images/qiehuan.png" alt="" /></div>
{{ item.title }} </div>
</p> <div class="content-item">
<div class="center-text"> <div class="icon"><img src="@/assets/images/xie.png" alt="" /></div>
<div class="center-text-lable">车牌</div> <div class="title">卸货地址</div>
<div class="flex-1">{{ item.licensePlate }}</div> <div class="content">
<div class="center-text-lable">车长</div> <el-input v-model="input1" style="width: 400px" placeholder="请输入详细地址(可跨城)" clearable />
<div class="flex-1">{{ item.conductor }}</div>
</div>
<div class="center-text">
<div class="center-text-lable">车辆性质</div>
<div class="flex-1">{{ item.vehicleNature }}</div>
<div class="center-text-lable">车型</div>
<div class="flex-1">{{ item.vehicleModel }}</div>
</div>
<div class="center-text">
<div class="center-text-lable">最大载重</div>
<div class="flex-1">{{ item.maximumPayload }}</div>
<div class="center-text-lable">空闲时间</div>
<div class="flex-1">{{ item.freeTime }}</div>
</div> </div>
</div> </div>
<div class="warehouse-content-box-right"> <div class="content-item1" @click="reservation()">
<p class="top-text">{{ item.price }}</p> <span v-if="!isReservation" class="iconY"></span>
<el-button size="large" type="primary" class="right-button" @click="toLink(item)">预约</el-button> <el-icon v-else style="margin-right: 5px" size="17" color="#25BF82"><SuccessFilled /></el-icon>
<span>预约用车</span>
</div>
<el-form v-if="isReservation" :model="form" label-width="auto" style="max-width: 600px">
<el-form-item label="预约时间">
<el-col :span="11">
<el-date-picker v-model="form.date" type="date" placeholder="请选择预约时间" style="width: 100%" />
</el-col>
</el-form-item>
</el-form>
</div>
</el-card>
<el-card v-if="input != '' && input1 != ''" style="border-radius: 16px; margin-bottom: 20px" shadow="hover">
<div class="content-box1">
<div class="title">用户出价</div>
<div class="bid">
<div class="bid-left">
<p style="color: #999; font-size: 14px">灵活出价 价钱可谈</p>
</div>
<div class="bid-right" @click="openEt('bid')">
<span>预估价</span>
<span style="color: #000; font-size: 22px; font-weight: bold; margin: 0 10px">{{ form1.money }}</span>
<span style="padding-right: 10px; border-right: 1px solid #999; margin-right: 10px"></span>
<span style="cursor: pointer">
<span style="margin-right: 4px">改价</span>
<el-icon><EditPen /></el-icon>
</span>
</div>
</div> </div>
</div> </div>
</el-card>
<el-card v-if="input != '' && input1 != ''" style="border-radius: 16px; margin-bottom: 20px" shadow="hover">
<div class="content-box1">
<div class="bid">
<div class="bid-left">
<p style="font-size: 16px">货物资料</p>
</div>
<div class="bid-right" @click="openEt('hwzl')">
<span style="color: #999">{{ form1.goodsInformation }}</span>
<span> ></span>
</div>
</div>
<div class="bid">
<div class="bid-left">
<p style="font-size: 16px">订单备注</p>
</div>
<div class="bid-right" @click="openEt('bz')">
<span style="color: #999">{{ form1.remarks }}</span>
<span> ></span>
</div>
</div>
<div class="bid" style="margin-bottom: 0">
<div class="bid-left">
<p style="font-size: 16px">联系方式</p>
</div>
<div class="bid-right" @click="openEt('lxfs')">
<span style="color: #000">{{ form1.Telephone }}</span>
<span style="color: #000"> ></span>
</div>
</div>
</div>
</el-card>
<div>
<el-button style="padding: 10px 50px" size="large" type="primary" @click="handleApply">现在发货</el-button>
</div> </div>
<!-- <el-pagination
:size="'large'"
:page-size="paginations.size"
:current-page="paginations.page"
:total="paginations.total"
background
layout="prev, pager, next"
@current-change="currentChange"
/> -->
</template> </template>
</common> </common>
</section> <el-dialog v-model="dialogVisible" :title="title" width="500" align-center @close="handleClose">
<el-form v-if="isipt == 1" :model="form1" label-width="auto" style="max-width: 600px">
<el-form-item label="预估价">
<el-input v-model="form1.money" style="width: 400px" placeholder="请输入预估价" clearable />
</el-form-item>
<el-form-item label="系统底价:">
<span style="font-size: 20px">{{ form1.money1 }}</span>
<el-icon style="margin-left: 10px; margin-right: 3px; color: chocolate"><WarningFilled /></el-icon>
<span style="color: chocolate">预估价不能低于系统底价</span></el-form-item
>
</el-form>
<el-form v-if="isipt == 2" :model="form1" label-width="auto" style="max-width: 600px">
<el-form-item label="货物信息">
<el-input v-model="form1.goodsInformation" type="textarea" style="width: 400px" placeholder="请填写货物信息" clearable />
</el-form-item>
</el-form>
<el-form v-if="isipt == 3" :model="form1" label-width="auto" style="max-width: 600px">
<el-form-item label="备注">
<el-input v-model="form1.remarks" type="textarea" style="width: 400px" placeholder="请填写备注" clearable />
</el-form-item>
</el-form>
<el-form v-if="isipt == 4" :model="form1" label-width="auto" style="max-width: 600px">
<el-form-item label="联系方式">
<el-input v-model="form1.Telephone" style="width: 400px" placeholder="请输入联系方式" clearable />
</el-form-item>
</el-form>
<template #footer>
<div class="dialog-footer">
<el-button @click="dialogVisible = false">取消</el-button>
<el-button type="primary" @click="sbSure()"> 确定 </el-button>
</div>
</template>
</el-dialog>
</div>
</template> </template>
<script setup> <script setup>
import { ref, reactive, watch, onMounted } from 'vue'; import { ref, onMounted, reactive } from 'vue';
import { getAssetsFile } from '@/utils'; import common from '../components/common.vue';
import { useRoute, useRouter } from 'vue-router'; import { getAssetsFile } from '@/utils/index.js';
import { getWarehouseInfo, warehouseList } from '@/apis/warehouseLogistics.js'; import { useRouter } from 'vue-router';
import warehouseLogisticsRoutes from '@/router/modules/warehouseLogistics'; import { informationList } from '@/apis/farmingService.js';
import Common from '../components/common.vue';
import { useGetCommonData } from '@/store/modules/common.js';
import { storeToRefs } from 'pinia';
import { ElMessage } from 'element-plus'; import { ElMessage } from 'element-plus';
import { getRegion } from '@/apis/common'; import { ElMessageBox } from 'element-plus';
const store = useGetCommonData();
const { data } = storeToRefs(store);
const route = useRoute();
const router = useRouter(); const router = useRouter();
const tab0 = reactive(['选择位置']); const dialogVisible = ref(false);
const currentTab0 = ref(0); const title = ref('');
const isipt = ref(null);
const formSize = 'large'; const chooseMoney = ref(0);
const chooseDate = ref();
import img1 from './images/xiangshi.png'; // const listCC = ref(['52', '68', '76', '86', '96', '117', '13', '137', '15', '157']);
import img2 from './images/gaolan.png'; const activeCC = ref({ name: '5米2', weight: '2~5吨', volume: '15~25方' });
const state = reactive({ const listCC = ref([
menus: warehouseLogisticsRoutes[0].children, {
query: { name: '5米2',
current: {}, weight: '2~5吨',
selectedAddress: [], volume: '15~25方',
detailAddress: '',
}, },
data: [ {
{ name: '6米8',
imageUrl: img1, weight: '5~10吨',
title: '长途大车', volume: '30~45方',
licensePlate: '云AL6AB7', },
conductor: '15m', {
vehicleNature: '物流公司', name: '7米6',
vehicleModel: '厢式', weight: '8~12吨',
maximumPayload: '1000吨', volume: '40~55方',
freeTime: '2025.05.05', },
price: '¥20元/吨/公里', {
}, name: '8米6',
{ weight: '10~15吨',
imageUrl: img2, volume: '50~65方',
title: '长途大车', },
licensePlate: '云AL5B15', {
conductor: '13m', name: '9米6',
vehicleNature: '个人', weight: '12~20吨',
vehicleModel: '高栏', volume: '60~80方',
maximumPayload: '800吨', },
freeTime: '2025.05.08', {
price: '¥20元/吨/公里', name: '11米7',
}, weight: '18~30吨',
], volume: '80~100方',
},
{
name: '13米',
weight: '25~35吨',
volume: '90~110方',
},
{
name: '13米7',
weight: '30~40吨',
volume: '100~120方',
},
{
name: '15米',
weight: '35~50吨',
volume: '120~150方',
},
{
name: '15米7',
weight: '40~55吨',
volume: '130~160方',
},
]);
const listCx = ref(['厢式', '平板', '高栏', '飞翼车', '侧板可拆']);
const input = ref('');
const input1 = ref('');
const isReservation = ref(false);
const form = reactive({
date: '',
}); });
const formData = reactive({}); const form1 = reactive({
const paginations = reactive({ money: '3488',
page: 1, money1: '3466',
size: 2, goodsInformation: '补全货物信息,司机接单更快',
total: 0, remarks: '请输入备注',
Telephone: '15687067900',
}); });
const dialogFormVisible = ref(false); // #endregion
const formLabelWidth = ref('120px');
const currentTab = ref(0);
const currentChange = (current) => {
paginations.page = current;
getWarehouseList(currentTab.value + 1);
};
const getWarehouseList = (type) => { /* --------------- methods --------------- */
warehouseList({ type: type, current: paginations.page, size: paginations.size }).then((res) => { // #region
state.data = []; onMounted(() => {
paginations.total = res.total; // queryList();
if (res.code === 200) { });
state.data = res.data.records;
for (let i in state.data) {
state.data[i].tag = state.data[i].tags.split(',');
}
}
});
};
const toLink = (row) => { const changeChoose = (type, index) => {
router.push({ if (type === 'cc') {
name: 'logistics-detail', chooseMoney.value = index;
query: { id: row?.id ?? '100' }, activeCC.value = listCC.value[index];
}); } else {
}; chooseDate.value = index;
const shippingGoods = () => {
router.push({
name: 'logistics-shipping',
});
};
const contact = (id) => {
for (let i in state.data) {
if (state.data[i].id === id) {
state.query.current = state.data[i];
state.query.current.contactName = state.query.current.contactName.substring(0, 1);
}
} }
formData.value = {
warehouseId: state.query.current.id,
type: 1,
demand: '',
surname: '',
sex: '',
phoneNum: '',
};
dialogFormVisible.value = true;
}; };
const reservation = () => {
const priceConfirm = () => { isReservation.value = !isReservation.value;
// formData };
for (const key of Object.keys(formData.value)) { const handleApply = () => {
if (formData.value[key] === '') { //
ElMessage({ if (input.value == '') {
message: '请完整填写信息!', ElMessage.error('请填写装货地址');
type: 'warning',
});
return; // return 退
}
}
if (!/^1[3-9]\d{9}$/.test(formData.value.phoneNum)) {
ElMessage.warning('请填写正确的11位手机号码');
return; return;
} }
getWarehouseInfo(formData.value).then((res) => { if (input1.value == '') {
if (res.code === 200) { ElMessage.error('请填写卸货地址');
ElMessage.success('询价成功,后续请关注手机信息,我们将第一时间联系您'); return;
} else { }
ElMessage.error(res.errmsg); if (form.date === '') {
} ElMessage.error('请选择预约用车时间');
return;
}
router.push({
name: 'logistics-dispatch',
}); });
}; };
const openEt = (type) => {
// dialogVisible.value = true;
const cascaderProps = ref({ if (type === 'bid') {
label: 'areaName', // title.value = '改价';
value: 'areaCode', // isipt.value = 1;
children: 'areaChildVOS', // } else if (type === 'hwzl') {
emitPath: true, title.value = '货物信息';
expandTrigger: 'hover', isipt.value = 2;
}); } else if (type === 'lxfs') {
// title.value = '联系方式';
const addressOptions = ref([]); isipt.value = 4;
const getArea = async () => {
const res = await getRegion();
if (res.code === 200) {
addressOptions.value = res.data;
} else { } else {
ElMessage.error(res.message); title.value = '备注';
isipt.value = 3;
} }
}; };
const handleClose = () => {
onMounted(() => { dialogVisible.value = false;
// getWarehouseList('1'); };
getArea(); const sbSure = () => {
}); //
if (isipt.value == 1 && Number(form1.money) < Number(form1.money1)) {
ElMessage.error('预估价不能低于系统底价');
return;
}
dialogVisible.value = false;
};
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
.el-form-item--large { .choose {
--font-size: 20px;
}
.tabs {
//height: 160px;
line-height: 50px;
display: flex; display: flex;
flex-direction: column;
font-size: 18px;
align-items: flex-start;
justify-content: space-between;
// padding: 0 20px;
}
.tabs0 {
padding: 0;
}
.tab {
// height: 100px;
width: 850px;
display: flex;
align-items: center;
justify-content: flex-start; justify-content: flex-start;
overflow-x: auto; font-size: 18px;
overflow: auto; /* 启用滚动 */ font-weight: 400;
white-space: nowrap; /* 强制单行显示 */ margin-bottom: 20px;
-ms-overflow-style: none; /* IE/Edge 兼容 */ &:last-child {
scrollbar-width: none; /* 隐藏滚动条 */ margin-bottom: 0;
.tab_list { }
.searchType {
color: #999999; color: #999999;
font-size: 20px; margin: 0 30px;
font-weight: 400; margin-left: 0;
} }
.tab_list_li { .chooseAll {
margin-left: 40px; cursor: pointer;
color: #000000;
font-size: 20px;
font-weight: 400;
transition: color 0.3s ease;
} }
.tab_list_li:first-child { .chooseItem {
margin-left: 20px; cursor: pointer;
margin-right: 20px;
} }
.tab_list_li.active {
color: rgba(37, 191, 130, 1);
}
.tab_list_li0 {
position: relative;
transition: color 0.3s ease;
}
.tab_list_li0::after {
content: '';
position: absolute;
left: 25%;
bottom: 0;
width: 50%;
height: 4px;
background: rgba(37, 191, 130, 1);
border-radius: 4px;
transition: all 0.3s ease;
}
}
.cursor {
cursor: pointer;
} }
.active { .active {
color: rgba(37, 191, 130, 1); color: #25bf82;
font-weight: bold;
} }
.content-box {
.warehouse-content-box {
min-height: 150px;
margin-top: 20px;
padding: 20px;
border-radius: 14px;
background-color: #fff;
display: flex;
gap: 20px;
}
.no-data {
flex-direction: row;
justify-content: center;
align-items: center;
font-size: 14px;
}
.warehouse-content-box-left {
height: 120px;
width: 120px;
border-radius: 14px;
position: relative;
overflow: hidden;
img {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
min-width: 100%;
min-height: 100%;
object-fit: cover;
}
}
.warehouse-content-box-center {
flex: 1;
text-align: left; text-align: left;
.center-title { .content-item {
font-size: 22px;
font-weight: bold;
text-align: left;
margin-bottom: 10px;
}
.center-text {
font-size: 14px;
display: flex; display: flex;
margin-bottom: 10px; justify-content: flex-start;
.center-text-lable { align-items: center;
color: #666; margin-bottom: 20px;
width: 70px; .icon {
margin-right: 20px;
width: 40px;
height: 40px;
img {
width: 100%;
height: 100%;
}
} }
.flex-1 { .title {
flex: 1; font-size: 16px;
color: #999;
} }
.center-text-cont { .content {
width: 120px; font-size: 18px;
margin-left: 6px;
} }
} }
.center-location { .content-item1 {
font-size: 14px; display: flex;
line-height: 20px; justify-content: flex-start;
.el-icon { align-items: center;
vertical-align: bottom; cursor: pointer;
margin-bottom: 20px;
.iconY {
width: 14px;
height: 14px;
border: 1px solid #999;
border-radius: 50%;
margin-right: 6px;
} }
} }
} }
.warehouse-content-box-right { .content-box1 {
width: 160px; text-align: left;
font-size: 20px; .title {
display: flex; font-size: 20px;
flex-direction: column; margin-bottom: 6px;
align-items: flex-end;
justify-content: space-between;
.top-text {
font-size: 22px;
color: #25bf82;
font-weight: bold;
} }
.right-button { .bid {
width: 100%; display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 10px;
cursor: pointer;
.bid-right {
font-size: 14px;
}
} }
} }
</style> </style>

View File

@ -160,11 +160,11 @@ const state = reactive({
typeName: '高标准冷库', typeName: '高标准冷库',
title: '孟定果蔬冷链中心', title: '孟定果蔬冷链中心',
operationUnit: '临沧边境合作区管委会 ', operationUnit: '临沧边境合作区管委会 ',
pricingUnit: '元/·天', pricingUnit: '元/·天',
storageArea: '5,000㎡', storageArea: '5,000㎡',
usableArea: '1,200㎡', usableArea: '1,200㎡',
location: '孟定海关监管区旁', location: '孟定海关监管区旁',
price: '¥2.8元//月', price: '¥2.8元//月',
rank: '4', rank: '4',
}, },
], ],