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.
721 lines
20 KiB
721 lines
20 KiB
<template> |
|
<basic-container> |
|
<div class="avue-crud"> |
|
<!-- 搜索模块 --> |
|
<el-row v-if="!search"> |
|
<!-- 查询模块 --> |
|
<el-form :inline="true" :model="query" class="el-fr-d"> |
|
<el-form-item label="交期:" class="el-times"> |
|
<!-- <el-input v-model="query.stockupArea" placeholder="请输入备货区"></el-input>--> |
|
<el-date-picker |
|
v-model="stockupDate" |
|
type="daterange" |
|
unlink-panels |
|
range-separator="至" |
|
start-placeholder="开始时间" |
|
end-placeholder="结束时间" |
|
:shortcuts="shortcuts" |
|
clearable |
|
/> |
|
</el-form-item> |
|
<el-form-item label="创建时间:" class="el-times"> |
|
<!-- <el-input v-model="query.stockupArea" placeholder="请输入备货区"></el-input>--> |
|
<el-date-picker |
|
v-model="stockupDate" |
|
type="daterange" |
|
unlink-panels |
|
range-separator="至" |
|
start-placeholder="开始时间" |
|
end-placeholder="结束时间" |
|
:shortcuts="shortcuts" |
|
clearable |
|
/> |
|
</el-form-item> |
|
<!-- 查询按钮 --> |
|
<el-form-item class="el-btn"> |
|
<el-button type="primary" icon="el-icon-search" @click="searchChange">搜 索</el-button> |
|
<el-button icon="el-icon-delete" @click="searchReset()">清 空</el-button> |
|
</el-form-item> |
|
</el-form> |
|
</el-row> |
|
|
|
<!-- 控件模块 --> |
|
<el-row> |
|
<div class="avue-crud__header"> |
|
<!-- 头部左侧按钮模块 --> |
|
<div class="avue-crud__left"> |
|
<el-button type="primary" icon="Edit" @click="editClientInfo">修改客户信息</el-button> |
|
<el-button type="primary" icon="Delete" @click="handleDelete">删除</el-button> |
|
<el-button type="primary" icon="Refresh" @click="searchReset">恢复</el-button> |
|
</div> |
|
<!-- 头部右侧按钮模块 --> |
|
<div class="avue-crud__right"> |
|
<el-button icon="el-icon-refresh" @click="searchChange" circle></el-button> |
|
<el-button icon="Operation" @click="showdrawer(true)" circle></el-button> |
|
<el-button icon="Search" @click="searchHide" circle></el-button> |
|
</div> |
|
</div> |
|
</el-row> |
|
|
|
<!-- 表格 --> |
|
<el-row> |
|
<!-- 列表模块 --> |
|
<tablecmt |
|
:columnList="details.columnList" |
|
:tableData="data" |
|
:loading="loadingObj.list" |
|
@inputTxt="inputsc" |
|
@timeCheck="timesc" |
|
@btnCheck="btnsc" |
|
@selectCheck="selectsc" |
|
@selection="selectionChange" |
|
> |
|
<template #default="slotProps"> |
|
<template v-if="slotProps.scope.column.label === '操作'"> |
|
<el-button type="text" @click="handleShowPackageOrderList(slotProps.scope)"> |
|
包明细 |
|
</el-button> |
|
</template> |
|
</template> |
|
</tablecmt> |
|
</el-row> |
|
|
|
<!-- 统计 --> |
|
<el-row> |
|
<div>选择数: , 运单数: , 件数: , 重量: , 体积: , 提货费: ,</div> |
|
<div>总计: 总数: , 运单数: , 件数: , 重量: , 体积: , 提货费: ,</div> |
|
</el-row> |
|
|
|
<!-- 分页模块 --> |
|
<el-row class="el-fy"> |
|
<div class="avue-crud__pagination flex-c-sb" style="width: 100%"> |
|
<div style="font-size: 14px">勾选数量: {{ selectionList.length }}</div> |
|
<!-- 分页模块 --> |
|
<el-pagination |
|
align="right" |
|
background |
|
@size-change="sizeChange" |
|
@current-change="currentChange" |
|
:current-page="page.currentPage" |
|
:page-sizes="[30, 50, 80, 120]" |
|
:page-size="page.pageSize" |
|
layout="total, sizes, prev, pager, next, jumper" |
|
:total="page.total" |
|
> |
|
</el-pagination> |
|
</div> |
|
</el-row> |
|
</div> |
|
</basic-container> |
|
|
|
<!-- 修改客户信息 --> |
|
<el-dialog |
|
class="el-dialog-QRCode" |
|
title="修改客户信息" |
|
:visible.sync="details.popUpShow.editClientInfoVisible" |
|
width="780px" |
|
v-model="details.popUpShow.editClientInfoVisible" |
|
> |
|
<div> |
|
<el-divider style="font-size: 28px">修改订单自编号()客户信息</el-divider> |
|
</div> |
|
|
|
<el-form> |
|
<el-form-item label="客户姓名"> |
|
<el-input /> |
|
</el-form-item> |
|
|
|
<el-form-item label="联系电话"> |
|
<el-input /> |
|
</el-form-item> |
|
|
|
<el-form-item label="用户地址"> |
|
<el-input /> |
|
</el-form-item> |
|
</el-form> |
|
|
|
<template #footer> |
|
<div class="flex-c-c dialog-footer"> |
|
<el-button icon="Position" type="primary" @click="printTemplate">提 交</el-button> |
|
<el-button icon="Refresh" type="primary" @click="printTemplate">重 置</el-button> |
|
<el-button icon="Close" @click="details.popUpShow.editClientInfoVisible = false"> |
|
取 消 |
|
</el-button> |
|
</div> |
|
</template> |
|
</el-dialog> |
|
|
|
<!-- 包明细 --> |
|
<el-dialog |
|
title="包明细" |
|
v-model="details.popUpShow.packageOrderListlVisited" |
|
width="80%" |
|
:before-close="beforeClose" |
|
append-to-body |
|
:fullscreen="details.fullscreenObj.packageOrderListlVisited" |
|
:show-close="false" |
|
class="packageOrderListlVisited" |
|
> |
|
<template #header="{ close, titleId, titleClass }"> |
|
<div class="my-header flex-c-sb"> |
|
<h4 :id="titleId" :class="titleClass">包明细</h4> |
|
<div class="flex-c-c"> |
|
<!-- 全屏显示按钮 --> |
|
<el-button type="text" v-if="!details.fullscreenObj.packageOrderListlVisited"> |
|
<el-icon class="" @click="handleFullScrean('open', 'packageOrderListlVisited')" |
|
><FullScreen |
|
/></el-icon> |
|
</el-button> |
|
<el-button type="text" v-else> |
|
<el-icon class="" @click="handleFullScrean('close', 'packageOrderListlVisited')" |
|
><CopyDocument |
|
/></el-icon> |
|
</el-button> |
|
|
|
<!-- 弹窗关闭按钮 --> |
|
<el-button type="text"> |
|
<el-icon class="" @click="close"><Close /></el-icon> |
|
</el-button> |
|
</div> |
|
</div> |
|
</template> |
|
<el-form :inline="true" :model="query" class="el-fr-d"> |
|
<div class="fo-fl"> |
|
<!-- <el-form-item label="预计发车:" class="el-times"> |
|
<el-date-picker |
|
v-model="stockupDate" |
|
type="daterange" |
|
unlink-panels |
|
range-separator="-" |
|
start-placeholder="开始时间" |
|
end-placeholder="结束时间" |
|
:shortcuts="shortcuts" |
|
clearable |
|
/> |
|
</el-form-item> |
|
<el-form-item label="实际发车:" class="el-times"> |
|
<el-date-picker |
|
v-model="stockupDate" |
|
type="daterange" |
|
unlink-panels |
|
range-separator="-" |
|
start-placeholder="开始时间" |
|
end-placeholder="结束时间" |
|
:shortcuts="shortcuts" |
|
clearable |
|
/> |
|
</el-form-item> --> |
|
<el-form-item> |
|
<!-- <el-button type="primary" icon="el-icon-van" @click="searchChange">批量卸车</el-button> |
|
<el-button type="primary" icon="el-icon-search" @click="searchReset()">搜 索</el-button> --> |
|
<el-button icon="el-icon-printer" type="primary" @click="batchPrintOrder"> |
|
二维码 |
|
</el-button> |
|
</el-form-item> |
|
</div> |
|
</el-form> |
|
<tablecmt |
|
:columnList="details.packageListColumnList" |
|
:tableData="details.packageListData" |
|
:loading="loadingObj.packageListLoading" |
|
@inputTxt="inputsc" |
|
@timeCheck="timesc" |
|
@btnCheck="btnsc" |
|
@selectCheck="selectsc" |
|
@selection="selectionChange" |
|
> |
|
<template #default="slotProps"> |
|
<template v-if="slotProps.scope.column.label === '操作'"> |
|
<el-button type="text" @click="printOrder(slotProps.scope)"> 包内产品 </el-button> |
|
<el-button type="text" @click="printOrder(slotProps.scope)"> 流转节点 </el-button> |
|
<el-button type="text" @click="printOrder(slotProps.scope)"> 直接入库 </el-button> |
|
<el-button type="text" @click="printOrder(slotProps.scope)"> 查看二维码 </el-button> |
|
</template> |
|
</template> |
|
</tablecmt> |
|
|
|
<!-- 分页模块 --> |
|
<el-pagination |
|
align="right" |
|
background |
|
@size-change="sizeChange" |
|
@current-change="currentChange" |
|
:current-page="details.packageListPage.currentPage" |
|
:page-sizes="[30, 50, 80, 120]" |
|
:page-size="details.packageListPage.pageSize" |
|
layout="total, sizes, prev, pager, next, jumper" |
|
:total="details.packageListPage.total" |
|
> |
|
</el-pagination> |
|
</el-dialog> |
|
|
|
<!-- 打印二维码 --> |
|
<el-dialog |
|
class="el-dialog-QRCode" |
|
title="二维码" |
|
:visible.sync="details.popUpShow.QRCodeVisible" |
|
width="780px" |
|
v-model="details.popUpShow.QRCodeVisible" |
|
> |
|
<div> |
|
<div v-html="html"></div> |
|
</div> |
|
<span slot="footer" class="dialog-footer"> |
|
<!-- <el-button type="primary" @click="ddd">导 出</el-button>--> |
|
<el-button type="primary" @click="printTemplate">打 印</el-button> |
|
<el-button @click="details.popUpShow.QRCodeVisible = false">取 消</el-button> |
|
</span> |
|
</el-dialog> |
|
|
|
<!-- 列表配置显示 --> |
|
<edittablehead |
|
@setcolum="setnewcolum" |
|
@closce="showdrawer" |
|
:drawerShow="drawerShow" |
|
:columnList="details.columnList" |
|
></edittablehead> |
|
</template> |
|
|
|
<script setup lang="ts"> |
|
import { ref, reactive, toRefs, computed, onMounted, nextTick } from 'vue'; |
|
import functions from '@/utils/functions.js'; |
|
import dayjs from 'dayjs'; |
|
import { mapGetters } from 'vuex'; |
|
/** 获取字典 */ |
|
import { getDictionaryBiz } from '@/api/system/dict'; |
|
import { getopenOrderAdvancePageList } from '@/api/waybill/TemporaryStorageList'; |
|
import { showOrderPackgeCode } from '@/api/distribution/distributionStockArticle'; |
|
import { downloadXls, setNodeHeight, getHtmls } from '@/utils/util'; |
|
import { columnList, packageListColumnList } from '@/option/waybill/FreezeOrder'; |
|
import { useRouter } from 'vue-router'; |
|
import print from '@/utils/print'; |
|
import { ElMessage } from 'element-plus'; |
|
|
|
// 获取路由实例 |
|
const $router = useRouter(); |
|
|
|
const details = reactive<any>({ |
|
/** 是否开启搜索 */ |
|
search: true, |
|
/** 表格搜索条件 */ |
|
query: {}, |
|
/** 时间快捷选择设置 */ |
|
shortcuts: [ |
|
{ |
|
text: '最近一周', |
|
value: () => { |
|
const end = new Date(); |
|
const start = new Date(); |
|
start.setTime(start.getTime() - 3600 * 1000 * 24 * 7); |
|
return [start, end]; |
|
}, |
|
}, |
|
{ |
|
text: '最近一个月', |
|
value: () => { |
|
const end = new Date(); |
|
const start = new Date(); |
|
start.setTime(start.getTime() - 3600 * 1000 * 24 * 30); |
|
return [start, end]; |
|
}, |
|
}, |
|
{ |
|
text: '最近三个月', |
|
value: () => { |
|
const end = new Date(); |
|
const start = new Date(); |
|
start.setTime(start.getTime() - 3600 * 1000 * 24 * 90); |
|
return [start, end]; |
|
}, |
|
}, |
|
], |
|
/** 时间选择器数据 */ |
|
stockupDate: [], |
|
/** 列表 */ |
|
columnList, |
|
/** 列表数据 */ |
|
data: [{}], |
|
/** 包明细表头 */ |
|
packageListColumnList, |
|
/** 包明细数据 */ |
|
packageListData: [{}], |
|
/** 页面loading */ |
|
loadingObj: { |
|
/** 列表加载loading */ |
|
list: false, |
|
packageListLoading: false, |
|
}, |
|
/** 列表复选框选中的数据 */ |
|
selectionList: [], |
|
/** 是否显示设置表格 */ |
|
drawerShow: false, |
|
/** 分页参数 */ |
|
page: { |
|
currentPage: 1, |
|
pageSize: 30, |
|
total: 0, |
|
}, |
|
/** 包明细分页参数 */ |
|
packageListPage: { |
|
currentPage: 1, |
|
pageSize: 30, |
|
total: 0, |
|
}, |
|
/** 弹出层显示 */ |
|
popUpShow: { |
|
/** 包件明细 */ |
|
packageOrderListlVisited: false, |
|
/** 二维码 */ |
|
QRCodeVisible: false, |
|
/** 修改客户信息 */ |
|
editClientInfoVisible: false, |
|
}, |
|
/** 列表Dom节点 */ |
|
listNode: '', |
|
form: {}, |
|
/** 全屏 */ |
|
fullscreenObj: { |
|
/** 包明细 */ |
|
packageOrderListlVisited: false, |
|
}, |
|
}); |
|
|
|
const { |
|
search, |
|
query, |
|
shortcuts, |
|
stockupDate, |
|
data, |
|
loadingObj, |
|
selectionList, |
|
drawerShow, |
|
page, |
|
trickleLoadingPage, |
|
zeroAdditionalRecordingInfo, |
|
popUpShow, |
|
} = toRefs(details); |
|
|
|
/** vuex */ |
|
const permission = computed(() => mapGetters(['permission', 'tagWel', 'tagList'])); |
|
console.log('permission :>> ', permission); |
|
|
|
onMounted(() => { |
|
const timer = setTimeout(() => { |
|
details.listNode = document.querySelector('.maboxhi'); |
|
console.log('details.listNode :>> ', details.listNode); |
|
details.listNode.style.transition = 'all .5s ease-out'; |
|
console.log('details.listNode :>> ', details.listNode); |
|
clearTimeout(timer); |
|
}, 100); |
|
}); |
|
|
|
/** 请求页面数据 */ |
|
const onLoad = async (page: any, params = {}) => { |
|
// 获取暂存单列表 |
|
details.data = await getopenOrderAdvancePageList(page, { ...details.query, ...params }); |
|
}; |
|
|
|
onLoad(details.page); |
|
|
|
/** 搜索 */ |
|
const searchChange = () => { |
|
onLoad(details.page); |
|
}; |
|
|
|
/** 清空表单 */ |
|
const searchReset = () => { |
|
details.query = {}; |
|
details.stockupDate = []; |
|
details.page.currentPage = 1; |
|
onLoad(details.page); |
|
}; |
|
|
|
/** 展开列表控件 */ |
|
const showdrawer = (_flag?: boolean) => { |
|
details.drawerShow = _flag; |
|
}; |
|
|
|
/** 是否开启搜索区 */ |
|
const searchHide = () => { |
|
function getWinHight() { |
|
var windowHight = 0; |
|
if (document.body.clientHeight && document.documentElement.clientHeight) { |
|
windowHight = |
|
document.body.clientHeight < document.documentElement.clientHeight |
|
? document.body.clientHeight |
|
: document.documentElement.clientHeight; |
|
} else { |
|
} |
|
return document.documentElement.clientHeight; |
|
} |
|
details.search = !details.search; |
|
const timer = setTimeout(() => { |
|
details.listNode.style.height = |
|
getWinHight() - details.listNode.getBoundingClientRect().top - 70 + 'px'; |
|
clearTimeout(timer); |
|
}, 10); |
|
}; |
|
|
|
/** 表格表头输入框搜索 */ |
|
const inputsc = (index, row) => { |
|
details.query[row.prop] = index; |
|
onLoad(details.page); |
|
}; |
|
|
|
/** 表格表头时间选择 */ |
|
const timesc = (index, row) => { |
|
console.log(index, row); |
|
if (!!index) { |
|
index = dayjs(index).format('YYYY-MM-DD'); |
|
} |
|
details.query[row.prop] = index; |
|
if (!index) { |
|
delete details.query[row.prop]; |
|
} |
|
onLoad(details.page); |
|
}; |
|
|
|
/** 表格表头输入框搜索 */ |
|
const btnsc = () => {}; |
|
|
|
/** 表格表头下拉框选择 */ |
|
const selectsc = (index, row) => { |
|
details.query[row.prop] = index; |
|
if (!index) delete details.query[row.prop]; |
|
if (row.prop === 'certificateTypeName') { |
|
details.query['certificateType'] = index; |
|
if (!index) delete details.query['certificateType']; |
|
} |
|
onLoad(details.page); |
|
}; |
|
|
|
/** 表格表头复选框选择 */ |
|
const selectionChange = (list: any) => { |
|
details.selectionList = list; |
|
}; |
|
|
|
/** 每页数量改变执行的回调 */ |
|
const sizeChange = (pageSize: number) => { |
|
details.page.pageSize = pageSize; |
|
onLoad(details.page); |
|
}; |
|
|
|
/** 页码改变执行的回调 */ |
|
const currentChange = () => {}; |
|
|
|
/** |
|
* 设置列表 -- 固定函数 |
|
* 弹窗的勾选回调,用于更改头部数组 |
|
* 固定搭配,只需要更换 columnList |
|
* */ |
|
const setnewcolum = (newarr, headarr, type) => { |
|
if (type == 1) { |
|
details.columnList = newarr; |
|
functions.setStorage(window.location.pathname + 'checkList', headarr); |
|
} else if (type == 2) { |
|
details.columnList = newarr; |
|
functions.setStorage(window.location.pathname + 'flexList', headarr); |
|
} else if (type == 3) { |
|
details.columnList = newarr; |
|
functions.setStorage(window.location.pathname + 'sortlist', headarr); |
|
} |
|
}; |
|
|
|
/** 弹出层开启前清除数据 */ |
|
const beforeClose = done => { |
|
done(); |
|
details.form = {}; |
|
details.selectionList = []; |
|
details.view = false; |
|
}; |
|
|
|
/** 查看包明细 */ |
|
const handleShowPackageOrderList = ({ row }) => { |
|
details.popUpShow.packageOrderListlVisited = true; |
|
|
|
nextTick(() => { |
|
// 获取弹窗内表格元素节点, 并设置高度 |
|
const _node: any = document.querySelector('.packageOrderListlVisited .maboxhi'); |
|
if (!_node) return; |
|
_node.style.height = '550px'; |
|
console.log('_node :>> ', _node); |
|
}); |
|
}; |
|
|
|
/** 订单转运单 */ |
|
const handleCreateOrder = () => { |
|
$router.push('/distribution/inventory/CreateOrder'); |
|
}; |
|
|
|
/** 修改客户信息 */ |
|
const editClientInfo = () => { |
|
if (details.selectionList.length !== 0) { |
|
return ElMessage({ |
|
type: 'warning', |
|
message: '最少选择一条数据', |
|
}); |
|
} |
|
// editClientInfoVisible; |
|
details.popUpShow.editClientInfoVisible = true; |
|
}; |
|
|
|
/** 批量删除 */ |
|
const handleDelete = () => { |
|
if (details.selectionList.length === 0) { |
|
return ElMessage({ |
|
type: 'warning', |
|
message: '最少选择一条数据', |
|
}); |
|
} |
|
}; |
|
|
|
/** 批量发车 */ |
|
const handleDepart = () => { |
|
if (details.selectionList.length === 0) { |
|
return ElMessage({ |
|
type: 'warning', |
|
message: '最少选择一条数据', |
|
}); |
|
} |
|
}; |
|
|
|
/** 批量冻结 */ |
|
const handleFreeze = () => { |
|
if (details.selectionList.length === 0) { |
|
return ElMessage({ |
|
type: 'warning', |
|
message: '最少选择一条数据', |
|
}); |
|
} |
|
}; |
|
|
|
/** |
|
* 是否开启全屏 |
|
* @params(_type) 开启或关闭 |
|
*/ |
|
const handleFullScrean = (_type: 'open' | 'close', _name: string) => { |
|
let _node = ''; |
|
if (_name) _node = document.querySelector(`.${_name} .maboxhi`); |
|
|
|
switch (_name) { |
|
case 'packageOrderListlVisited': |
|
details.fullscreenObj.packageOrderListlVisited = |
|
!details.fullscreenObj.packageOrderListlVisited; |
|
|
|
if (_type === 'close') { |
|
if (_node) setNodeHeight(_node, '500px'); |
|
} else { |
|
if (_node) setNodeHeight(_node); |
|
} |
|
break; |
|
|
|
default: |
|
break; |
|
} |
|
}; |
|
|
|
/** 单列查看包条码 */ |
|
const printOrder = ({ row }) => { |
|
let qr = { |
|
ids: row.id, |
|
}; |
|
showOrderPackgeCode(qr).then(res => { |
|
// this.orderPackageCode = res.data |
|
if (res.data.code !== 200) return; |
|
console.log(res.data); |
|
this.html = ''; |
|
this.html = getHtmls(res.data.data.dataList, res.data.data.templateHtml); |
|
}); |
|
}; |
|
|
|
/** 单列查看包条码 */ |
|
const batchPrintOrder = ({ row }) => { |
|
let qr = { |
|
ids: row.id, |
|
}; |
|
showOrderPackgeCode(qr).then(res => { |
|
// this.orderPackageCode = res.data |
|
if (res.data.code !== 200) return; |
|
console.log(res.data); |
|
this.html = ''; |
|
this.html = getHtmls(res.data.data.dataList, res.data.data.templateHtml); |
|
}); |
|
}; |
|
|
|
/** 打印包条码 */ |
|
const printTemplate = () => { |
|
const orderNodeList = document.querySelectorAll('.el-dialog-QRCode .el-dialog__body>div>div>div'); |
|
print(orderNodeList); |
|
}; |
|
</script> |
|
|
|
<style scoped lang="scss"> |
|
.fo-fl { |
|
display: flex; |
|
flex-wrap: wrap; |
|
zoom: 0.9; |
|
} |
|
|
|
// 日期选择器 |
|
:deep(.el-date-editor.el-input) { |
|
height: 100% !important; |
|
width: 100% !important; |
|
} |
|
|
|
:deep(.el-range-editor.el-input__wrapper) { |
|
height: 100% !important; |
|
} |
|
|
|
// 新增行 |
|
.add_row { |
|
display: flex; |
|
justify-content: space-between; |
|
} |
|
|
|
.add_row_title { |
|
text-align: center; |
|
margin-bottom: 10px; |
|
font-size: 18px; |
|
font-weight: bold; |
|
} |
|
|
|
// 统计行 |
|
.statistics_row { |
|
margin: 10px 0; |
|
font-size: 14px; |
|
zoom: 0.9; |
|
display: flex; |
|
|
|
> div { |
|
margin-right: 20px; |
|
} |
|
} |
|
|
|
// 卡片容器 |
|
.crad_container { |
|
display: flex; |
|
|
|
.card_container_item { |
|
flex: 1; |
|
// padding: 10px; |
|
border-radius: 5px; |
|
box-shadow: 0 0 5px #ccc; |
|
|
|
&:first-child { |
|
margin-right: 20px; |
|
} |
|
|
|
.card_container_item_title { |
|
padding: 10px; |
|
border-bottom: 1px solid #ccc; |
|
display: flex; |
|
justify-content: space-between; |
|
align-items: center; |
|
} |
|
|
|
.card_container_item_box { |
|
padding: 10px; |
|
} |
|
} |
|
} |
|
</style>
|
|
|