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.

820 lines
18 KiB

2 weeks ago
<template>
<view class="container">
<!-- 车牌号输入区域 -->
<view class="section">
<view class="input-group">
<text class="label">车牌号</text>
<view class="input-container">
<input
v-model="licensePlate"
class="input-field"
placeholder="请输入车牌号"
maxlength="8"
@input="onLicenseInput"
/>
<view class="scan-btn" @click="scanLicense">
<uni-icons type="scan" size="20" color="#007AFF"></uni-icons>
</view>
</view>
<!-- <text class="hint">例如京A12345</text> -->
</view>
</view>
<!-- 车牌号输入区域 -->
<view class="section">
<view class="input-group">
<text class="label">车牌号: {{licensePlate}}</text>
</view>
</view>
<!-- 配送单扫描区域 -->
<view class="section">
<view class="scan-area" @click="scanDeliveryOrder">
<view class="scan-icon">
<uni-icons type="scan" size="40" color="#007AFF"></uni-icons>
</view>
<text class="scan-title">扫描配送单二维码</text>
<text class="scan-desc">请将摄像头对准配送单二维码</text>
</view>
<!-- 配送单详情区域 -->
<view v-if="deliveryOrderInfo" class="order-details">
<view class="detail-header">
<text class="detail-title">配送单详情</text>
</view>
<view class="detail-item">
<text class="item-label">配送单号</text>
<text class="item-value">{{ deliveryOrderInfo.orderNumber }}</text>
</view>
<view class="detail-item">
<text class="item-label">配送地址</text>
<text class="item-value">{{ deliveryOrderInfo.deliveryAddress }}</text>
</view>
<view class="detail-item">
<text class="item-label">预计送达</text>
<text class="item-value">{{ deliveryOrderInfo.estimatedTime }}</text>
</view>
<!-- 托盘清单 -->
<!-- <view class="list-section">
<text class="list-title">托盘清单</text>
<view v-for="(item, index) in deliveryOrderInfo.palletList" :key="index" class="list-item">
<text class="item-text">{{ item.palletNumber }} - {{ item.materialType }} (数量{{ item.quantity }})</text>
</view>
</view> -->
<!-- 散装管件清单 -->
<view class="list-section">
<text class="list-title">散装管件清单</text>
<view v-for="(item, index) in deliveryOrderInfo.looseMaterials" :key="index" class="list-item">
<text class="item-text">{{ item.name }} - {{ item.quantity }}{{ item.specification }} </text>
</view>
</view>
</view>
</view>
<!-- 托盘管理区域 -->
<view class="section">
<view class="section-header">
<text class="section-title">已添加工装托盘</text>
<text class="section-count">({{ palletList.length }})</text>
</view>
<uni-collapse v-if="palletList.length > 0" class="pallet-list" :border="true">
<uni-collapse-item titleBorder="none" v-for="(pallet, index) in palletList" :key="index" :open="pallet.isOpen" class="pallet-card">
<template v-slot:title>
<view class="pallet-info">
<text class="pallet-number">{{ pallet.number }}</text>
<text class="pallet-status" :class="{ 'status-completed': pallet.status === 'completed' }">
{{ pallet.status === 'completed' ? '已完成' : '待确认' }}
</text>
<uni-icons type="closeempty" size="16" color="#ff0000"></uni-icons>
</view>
</template>
<view class="pallet-materials">
<text class="material-text" v-for="(material, mIndex) in pallet.materials" :key="mIndex">
{{ material.name }} ({{ material.quantity }})
</text>
</view>
<UploadzcFile class="upload"
@picIds="palletpics($event,index)"
:deletable="true"
:count="3"
:sourceType="sourceType"
:width="100"
:height="100"
:fileidList="pallet.imgs"
>
</UploadzcFile>
</uni-collapse-item>
</uni-collapse>
<!-- <view v-if="palletList.length > 0" class="pallet-list">
<view v-for="(pallet, index) in palletList" :key="index" class="pallet-card">
<view class="pallet-info">
<text class="pallet-number">{{ pallet.number }}</text>
<text class="pallet-status" :class="{ 'status-completed': pallet.status === 'completed' }">
{{ pallet.status === 'completed' ? '已完成' : '待确认' }}
</text>
</view>
<view class="pallet-materials">
<text class="material-text" v-for="(material, mIndex) in pallet.materials" :key="mIndex">
{{ material.name }} ({{ material.quantity }})
</text>
</view>
</view>
</view> -->
<view class="add-pallet-btn" @click="scanPallet">
<uni-icons type="plusempty" size="20" color="#fff"></uni-icons>
<text class="btn-text">扫描添加托盘</text>
</view>
</view>
<!-- 底部操作栏 -->
<view class="bottom-actions">
<!-- <button class="action-btn continue-btn" @click="continueScan"></button> -->
<button class="action-btn complete-btn" @click="finishLoading"></button>
</view>
</view>
</template>
<script>
import utils from "@/common/utils.js";
import tkiTree from "@/components/areaTree/Linktree.vue";
import UploadzcFile from "@/components/UploadzcFile.vue";
export default {
components: {
tkiTree,
UploadzcFile
},
data() {
return {
sourceType:['album', 'camera'], // 选择图片的来源album-从相册选图camera-使用相机,默认二者都有(默认['album', 'camera']
licensePlate:'',// 车牌号
deliveryOrderInfo:{
orderNumber: '',
deliveryAddress: '',
estimatedTime: '',
palletList: [
{
palletNumber:'托盘1',
materialType:'材料类型1',
quantity:'10'
}
],
looseMaterials: [
{
name:'物料1',
specification:'箱',
quantity:'5',
}
]
}, // 配送单信息
palletList:[
{
number: 'TP001',
status: 'completed',
materials: [
{ name: '螺栓', quantity: 100 },
{ name: '垫圈', quantity: 200 },
],
imgs:[],
imgurls:'',
isOpen:true,
},
],// 托盘列表
itemList:{},
};
},
onLoad(options) {
// 默认日期
this.itemList.psrq = this.getDay(0);
// var user= JSON.parse(uni.getStorageSync("user"));
// var yhms=user.yhms?user.yhms:"";
// this.itemList.psry = yhms;
// 获取操作数据
// this.getTypes();
},
onReady() {
// this.$refs.uForm.setRules(this.rules);
},
methods: {
// 托盘照片
palletpics(val,index) {
console.log(val,index);
this.palletList[index].imgurls=val.join(",");
this.$forceUpdate();
console.log(this.palletList);
},
// 折叠
change(e) {
console.log(e);
},
// 处理完成
handleComplete(){
console.log('完成装车');
},
// 车牌号输入处理
onLicenseInput(e){
// 实时校验车牌格式
const value = e.detail.value;
if (value && !/^[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领][A-Z][A-Z0-9]{4,5}[A-Z0-9挂学警港澳]$/.test(value)) {
console.log('车牌格式不正确');
}
},
// 扫描车牌
scanLicense(){
uni.showModal({
title: '提示',
content: '模拟扫描车牌',
success: (res) => {
if (res.confirm) {
licensePlate.value = '京A12345';
}
},
});
},
// 扫描配送单
scanDeliveryOrder(){
uni.showModal({
title: '提示',
content: '模拟扫描配送单二维码',
success: (res) => {
if (res.confirm) {
deliveryOrderInfo.value = {
orderNumber: 'DD20231201001',
deliveryAddress: '北京市朝阳区某某仓库',
estimatedTime: '2023-12-01 15:00',
palletList: [
{ palletNumber: 'TP001', materialType: '五金工具', quantity: 5 },
{ palletNumber: 'TP002', materialType: '建筑材料', quantity: 3 },
],
looseMaterials: [
{ name: '螺丝刀', specification: '十字型', quantity: 10 },
{ name: '扳手', specification: '12mm', quantity: 5 },
],
};
}
},
});
},
// 扫描托盘
scanPallet(){
var that = this;
uni.showModal({
title: '提示',
content: '模拟扫描托盘二维码',
success: (res) => {
if (res.confirm) {
const newPallet = {
number: `TP${String(that.palletList.length + 1).padStart(3, '0')}`,
status: 'pending',
materials: [
{ name: '零件A', quantity: 50 },
{ name: '零件B', quantity: 30 },
],
isOpen:true,
};
that.palletList.push(newPallet);
this.$forceUpdate();
}
},
});
},
// 继续扫描
continueScan(){
console.log('继续扫描');
},
// 完成装车
finishLoading(){
console.log('完成装车');
},
getDay(day){
var today = new Date();
var targetday_milliseconds=today.getTime() + 1000*60*60*24*day;
today.setTime(targetday_milliseconds); //注意,这行是关键代码
var tYear = today.getFullYear();
var tMonth = today.getMonth();
tMonth = this.doHandleMonth(tMonth + 1);
var tDate = today.getDate();
tDate = this.doHandleMonth(tDate);
return tYear+"/"+tMonth+"/"+tDate;
},
doHandleMonth(month) {
var m = month;
if (month.toString().length == 1) {
m = "0" + month;
}
return m;
},
showgsmld() {
// 选择转运去向
this.$refs.gsmldtree._show();
},
gsmldtreeConfirm(val) {
// 转运去向
if (val && val.length > 0) {
this.itemList.bm = val[val.length - 1].bm;
this.itemList.psdd = val[val.length - 1].bm;
this.itemList.bmsm = val[val.length - 1].bmsm;
}
else{
this.itemList.bm = "";
this.itemList.psdd = "";
this.itemList.bmsm = "";
}
this.$forceUpdate();
this.$refs.uForm.validate();
},
// 转运日期
timeConfirm0(e) {
let selectTime=`${e.year}/${e.month}/${e.day}`;
this.itemList.psrq = selectTime;
this.$forceUpdate();
this.$refs.uForm.validate();
},
del(index){
this.itemList.tpbhList.splice(index,1);
this.$forceUpdate();
},
saoma(){
var _that=this,rmbm="";
// #ifdef H5
// 去接收添加
rmbm="38393939393";
_that.addCode(rmbm);
// #endif
// #ifdef APP-PLUS
// 允许从相机和相册扫码
//qrCode,barCode
uni.scanCode({
scanType: ['qrCode', 'barCode'],
success: function(res) {
console.log('条码类型:' + res.scanType);
console.log('条码内容:' + res.result);
// 扫码接收添加
rmbm=res.result;
console.log(rmbm);
if(rmbm){
_that.addCode(rmbm);
}
else{
_that.$refs.uToast.show({
title: "扫码失败,请重试!",
type: "warning",
duration: 2000,
});
}
}
});
// #endif
},
addCode(qrcode){
var ifhave=false;
this.itemList.tpbhList.forEach(cell=>{
if(qrcode==cell){
ifhave=true;
return;
}
});
if(ifhave){
this.$refs.uToast.show({
title: "条码已存在,请重新扫码!",
type: "warning",
duration: 2000,
});
}
else{
this.itemList.tpbhList.push(qrcode);
this.$forceUpdate();
}
},
save() {
console.log(this.itemList)
this.isSubmit = true;
this.subtext="提交中..";
this.$refs.uForm.validate((valid) => {
if (valid) {
if(this.itemList.tpbhList.length<1){
this.$refs.uToast.show({
title: "请扫码添加工装托盘!",
type: "warning",
duration: 2000,
});
this.isSubmit = false;
this.subtext="提交中..";
return false;
}
// 添加
this.adddo();
}
else {
this.isSubmit = false;
this.subtext="提交中..";
this.$refs.uToast.show({
title: "请填写完数据后再提交!",
type: "warning",
duration: 2000,
});
}
});
},
async adddo(){
uni.showLoading({
title: '提交中...'
});
const {data: res} = await uni.$http.post('/api/gjPstpsyjlb/tpbsAdd',this.itemList);
if(res.success){
this.subtext="提交完成";
this.$refs.uToast.show({
title: "工装托盘转运新增成功!",
type: "success",
duration: 2000,
});
setTimeout(() => {
uni.navigateBack({
//返回
delta: 1,
});
}, 3000);
}
else{
this.subtext="提交失败";
this.isSubmit = false;
this.$refs.uToast.show({
title: res.message? res.message:"工装托盘转运新增失败!",
type: "warning",
duration: 3000,
});
}
},
async getTypes() {
//获取数据字典
var _this = this;
// 转运去向
const {data: res} = await uni.$http.post('/api/gjPstpsyjlb/getGztpBase');
if(res.success){
if(res.data){
this.psdds=res.data;
}
}
else{
this.psdds=[];
}
},
retType(type,str) {
var rets = '';
if(str==1){
// 转运去向
this.psdds.forEach((cell,idx)=>{
if(type==cell.bmlb){
rets=cell.bmsm;
return;
}
});
}
else if(str==2){
var depts=JSON.parse(uni.getStorageSync("bmbms"));
// 部门
depts.forEach((cell,idx)=>{
if(type==cell.dwbm){
rets=cell.dwmc;
return;
}
});
}
return rets;
}
}
};
</script>
<style lang="scss" scoped>
page {
height: 100%;
background-color: #f5f5f5;
}
::v-deep .uni-collapse-item__wrap{
background-color: #f9f9f9 !important;
}
::v-deep .uni-collapse-item__wrap-content.uni-collapse-item--border{
border-bottom-width:0 !important;
}
::v-deep .uni-collapse-item__title-arrow{
margin-right: 0 !important;
}
::v-deep .u-list-item{
background-color: #ffffff !important;
}
::v-deep .uni-icons{
font-size: 32rpx !important;
}
.container {
min-height: 100%;
padding-bottom: 120rpx;
box-sizing: border-box;
}
.navbar {
display: flex;
align-items: center;
justify-content: space-between;
height: 88rpx;
padding: 0 30rpx;
background-color: #fff;
position: relative;
box-shadow: 0 2rpx 10rpx rgba(0, 0, 0, 0.05);
}
.nav-left {
width: 60rpx;
height: 60rpx;
display: flex;
align-items: center;
justify-content: center;
}
.nav-title {
font-size: 36rpx;
font-weight: bold;
color: #333;
}
.nav-right .complete-btn {
font-size: 30rpx;
color: #007aff;
}
.section {
margin: 20rpx;
background-color: #fff;
border-radius: 16rpx;
padding: 30rpx;
box-shadow: 0 2rpx 10rpx rgba(0, 0, 0, 0.05);
}
.input-group {
margin-bottom: 20rpx;
}
.label {
display: block;
font-size: 30rpx;
color: #333;
margin-bottom: 15rpx;
}
.input-container {
display: flex;
align-items: center;
border: 2rpx solid #ddd;
border-radius: 12rpx;
padding: 15rpx;
}
.input-field {
flex: 1;
font-size: 30rpx;
color: #333;
}
.scan-btn {
width: 60rpx;
height: 60rpx;
display: flex;
align-items: center;
justify-content: center;
}
.hint {
display: block;
font-size: 24rpx;
color: #999;
margin-top: 10rpx;
}
.scan-area {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
padding: 60rpx 30rpx;
border: 4rpx dashed #ddd;
border-radius: 16rpx;
cursor: pointer;
}
.scan-icon {
margin-bottom: 20rpx;
}
.scan-title {
font-size: 32rpx;
color: #333;
margin-bottom: 10rpx;
}
.scan-desc {
font-size: 26rpx;
color: #999;
}
.order-details {
margin-top: 30rpx;
}
.detail-header {
padding-bottom: 20rpx;
border-bottom: 2rpx solid #eee;
margin-bottom: 20rpx;
}
.detail-title {
font-size: 32rpx;
font-weight: bold;
color: #333;
}
.detail-item {
display: flex;
margin-bottom: 15rpx;
}
.item-label {
font-size: 28rpx;
color: #666;
width: 180rpx;
}
.item-value {
font-size: 28rpx;
color: #333;
flex: 1;
}
.list-section {
margin-top: 25rpx;
}
.list-title {
font-size: 30rpx;
font-weight: bold;
color: #333;
margin-bottom: 15rpx;
}
.list-item {
padding: 15rpx 0;
border-bottom: 1rpx solid #f0f0f0;
}
.item-text {
font-size: 28rpx;
color: #555;
}
.section-header {
display: flex;
align-items: center;
margin-bottom: 25rpx;
}
.section-title {
font-size: 32rpx;
font-weight: bold;
color: #333;
}
.section-count {
font-size: 28rpx;
color: #999;
margin-left: 10rpx;
}
.pallet-list {
margin-bottom: 30rpx;
}
.pallet-card {
background-color: #f9f9f9;
border-radius: 12rpx;
padding: 20rpx;
margin-bottom: 20rpx;
}
.pallet-info {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 10rpx;
margin-right: 10rpx;
}
.pallet-number {
font-size: 30rpx;
font-weight: bold;
color: #333;
display: flex;
flex: 1;
}
.pallet-status {
font-size: 24rpx;
color: #999;
padding: 5rpx 15rpx;
border-radius: 20rpx;
background-color: #f0f0f0;
margin-right: 10rpx;
}
.pallet-status.status-completed {
color: #4cd964;
background-color: #f0faf4;
}
.pallet-materials {
margin-bottom: 10rpx;
}
.material-text {
display: block;
font-size: 26rpx;
color: #666;
margin-bottom: 5rpx;
}
.pallet-time {
text-align: right;
}
.time-text {
font-size: 24rpx;
color: #999;
}
.add-pallet-btn {
display: flex;
align-items: center;
justify-content: center;
height: 80rpx;
background-color: #007aff;
border-radius: 12rpx;
color: #fff;
font-size: 30rpx;
cursor: pointer;
}
.btn-text {
margin-left: 10rpx;
}
.bottom-actions {
position: fixed;
bottom: 0;
left: 0;
right: 0;
display: flex;
padding: 20rpx 30rpx;
background-color: #fff;
border-top: 2rpx solid #eee;
box-sizing: border-box;
}
.action-btn {
flex: 1;
height: 80rpx;
border-radius: 12rpx;
font-size: 32rpx;
font-weight: bold;
display: flex;
align-items: center;
justify-content: center;
}
.continue-btn {
background-color: #007aff;
color: #fff;
margin-right: 20rpx;
}
.complete-btn {
background-color: #4cd964;
color: #fff;
}
</style>