初次对接

This commit is contained in:
刘晓鹏 2025-04-08 00:14:08 +08:00
parent b7f32b6f09
commit 5465099c77
7 changed files with 275 additions and 316 deletions

7
package-lock.json generated
View File

@ -3546,8 +3546,9 @@
},
"node_modules/print-js": {
"version": "1.6.0",
"resolved": "https://registry.npmjs.org/print-js/-/print-js-1.6.0.tgz",
"integrity": "sha512-BfnOIzSKbqGRtO4o0rnj/K3681BSd2QUrsIZy/+WdCIugjIswjmx3lDEZpXB2ruGf9d4b3YNINri81+J0FsBWg=="
"resolved": "https://registry.npmmirror.com/print-js/-/print-js-1.6.0.tgz",
"integrity": "sha512-BfnOIzSKbqGRtO4o0rnj/K3681BSd2QUrsIZy/+WdCIugjIswjmx3lDEZpXB2ruGf9d4b3YNINri81+J0FsBWg==",
"license": "MIT"
},
"node_modules/prismjs": {
"version": "1.29.0",
@ -6784,7 +6785,7 @@
},
"print-js": {
"version": "1.6.0",
"resolved": "https://registry.npmjs.org/print-js/-/print-js-1.6.0.tgz",
"resolved": "https://registry.npmmirror.com/print-js/-/print-js-1.6.0.tgz",
"integrity": "sha512-BfnOIzSKbqGRtO4o0rnj/K3681BSd2QUrsIZy/+WdCIugjIswjmx3lDEZpXB2ruGf9d4b3YNINri81+J0FsBWg=="
},
"prismjs": {

View File

@ -1,187 +1,131 @@
<template>
<div class="purchase-delivery-page">
<!-- 标题 -->
<h2 class="page-title">采购送货单</h2>
<!-- 上方两列区域含二维码和基本信息 -->
<table class="header-table">
<tr>
<!-- 左侧列 -->
<td class="qr-col">
<!-- 如果有二维码图片可替换为实际图片地址 -->
<img
class="qr-image"
:src="qrCodeLeft"
alt="二维码"
/>
</td>
<td class="info-col">
<div>
<label>收料通知单编号送货单号</label>
<span>{{ receivingNoticeNumberLeft }}</span>
</div>
<div>
<label>供应商名称</label>
<span>{{ supplierNameLeft }}</span>
</div>
<div>
<label>送货日期</label>
<span>{{ deliveryDateLeft }}</span>
</div>
<div>
<label>发票号</label>
<span>{{ invoiceNumberLeft }}</span>
</div>
</td>
<!-- 右侧列 -->
<td class="qr-col">
<img
class="qr-image"
:src="qrCodeRight"
alt="二维码"
/>
</td>
</tr>
</table>
<!-- 明细表格 -->
<table class="detail-table">
<thead>
<tr>
<th>序号</th>
<th>PO号</th>
<th>物料代码</th>
<th>物料名称</th>
<th>单位</th>
<th>PO数量</th>
<th>实收数量</th>
<th>美金单价</th>
<th>供应商批号</th>
</tr>
</thead>
<tbody>
<tr v-for="(row, index) in tableData" :key="index">
<td>{{ index + 1 }}</td>
<td>{{ row.poNumber }}</td>
<td>{{ row.materialCode }}</td>
<td>{{ row.materialName }}</td>
<td>{{ row.unit }}</td>
<td>{{ row.poQuantity }}</td>
<td>{{ row.receivedQuantity }}</td>
<td>{{ row.usdPrice }}</td>
<td>{{ row.supplierBatchNumber }}</td>
</tr>
</tbody>
</table>
</div>
<div class="orderPrinting" ref="orderPrintingRef">
<div class="title">采购送货单</div>
<div class="orderPrintingTop">
<div class="item item1"></div>
<div class="item item2">
<div class="dataText">
<span class="span1">收料通知单编号送货单号</span>
<span class="span2">123465</span>
</div>
<div class="dataText">
<span class="span1">供应商名称</span>
<span class="span2">123465</span>
</div>
<div class="dataText">
<span class="span1">送货日期</span>
<span class="span2">123465</span>
</div>
<div class="dataText">
<span class="span1">发票号</span>
<span class="span2">123465</span>
</div>
</div>
<div class="item item3"></div>
</div>
<avue-crud ref="crudRef" :data="state.data" :option="state.option"> </avue-crud>
</div>
</template>
<script setup lang="ts">
import { ref } from 'vue'
// ---------------------
//
// ---------------------
//
const qrCodeLeft = ref('https://via.placeholder.com/100?text=QR-Left')
const receivingNoticeNumberLeft = ref('RN-LEFT-123')
const supplierNameLeft = ref('供应商A')
const deliveryDateLeft = ref('2025-03-20')
const invoiceNumberLeft = ref('INV-LEFT-001')
//
const qrCodeRight = ref('https://via.placeholder.com/100?text=QR-Right')
//
const tableData = ref([
{
poNumber: 'PO-001',
materialCode: 'M-001',
materialName: '物料名称1',
unit: 'PCS',
poQuantity: 100,
receivedQuantity: 95,
usdPrice: 1.25,
supplierBatchNumber: 'BATCH-001'
},
{
poNumber: 'PO-002',
materialCode: 'M-002',
materialName: '物料名称2',
unit: 'PCS',
poQuantity: 200,
receivedQuantity: 190,
usdPrice: 0.75,
supplierBatchNumber: 'BATCH-002'
}
])
import { reactive,ref } from 'vue';
const orderPrintingRef = ref()
const state = reactive({
option: {
tip: false,
index: false,
menuWidth: 120,
border: true,
delBtn: false,
editBtn: false,
align: 'center',
// searchLabelWidth:100,
selection: false,
searchMenuSpan: 3,
addBtn: false,
menu: false,
column: [
{ label: 'PO号', prop: 'purchaseOrderFBillNo' },
{ label: '物料代码', prop: 'sheet' },
{ label: '物料名称', prop: 'fBillNo' },
{ label: '单位', prop: 'mssSupplierLot' },
{ label: 'PO数量', prop: 'fSupplierLot' },
{ label: '实收数量', prop: 'materialCode' },
{ label: '美金单价', prop: 'materialName' },
{ label: '供应商批号', prop: 'sendedQty' },
],
},
data: [
{
purchaseOrderFBillNo: 1,
sheet: 1,
fBillNo: 1,
mssSupplierLot: 1,
fSupplierLot: 1,
materialCode: 1,
materialName: 1,
sendedQty: 1,
}
],
});
defineExpose({
orderPrintingRef
});
</script>
<style scoped lang="scss">
.purchase-delivery-page {
width: 100%;
margin: 0 auto;
font-family: sans-serif;
:deep(.avue-crud__header) {
display: none;
}
/* 标题样式 */
.page-title {
text-align: center;
padding: 1em 0;
border: 1px solid #ccc;
background-color: #DEEAF6;
:deep(.avue-crud__body) {
padding: 0 !important;
}
/* 头部表格 */
.header-table {
width: 100%;
border-collapse: collapse;
}
.orderPrinting {
width: 100%;
.header-table td {
border: 1px solid #ccc;
vertical-align: top;
padding: 8px;
/* 可根据需要调整宽度分配 */
width: 30%;
}
.title {
width: 100%;
height: 50px;
background-color: #deeaf6;
display: flex;
align-items: center;
justify-content: center;
font-size: 22px;
letter-spacing: 10px;
}
.qr-col {
text-align: center;
height: 200px;
width: 33.33%;
}
.info-col>*{
margin-top: 20px;
}
.qr-image {
width: 80px;
height: 80px;
display: block;
margin: 0 auto;
}
.orderPrintingTop {
height: 200px;
border: 1px solid #c2c4ca;
box-sizing: border-box;
display: flex;
.info-col label {
font-weight: bold;
}
.item1 {
width: 33.33%;
height: 199px;
border-right: 1px solid #c2c4ca;
}
/* 明细表格 */
.detail-table {
width: 100%;
border-collapse: collapse;
}
.item2 {
width: 33.33%;
height: 199px;
border-right: 1px solid #c2c4ca;
box-sizing: border-box;
padding: 16px;
.detail-table th,
.detail-table td {
border: 1px solid #ccc;
padding: 8px;
text-align: center;
}
.dataText {
font-size: 16px;
margin-bottom: 16px;
}
}
.detail-table th {
background-color: #f5f5f5;
.item2 {
width: 33.33%;
height: 199px;
//border-right: 1px solid black;
}
}
}
</style>

View File

@ -126,7 +126,7 @@ const state = reactive({
selectedData: [],
chengNuoJiaoQiP: '',
newChengNuoJiaoQiP: '',
selectedDataShow: false,
selectedDataShow: true,
loading: false,
});
const selectionChange = (list: any) => {

View File

@ -1,32 +1,56 @@
<template>
<el-dialog :model-value="props.showes" width="70%" >
<ceshi></ceshi>
<div class="btnList">
<el-button type="primary">打印</el-button>
</div>
</el-dialog>
<el-dialog :model-value="props.showes" width="70%">
<ceshi ref="ceshiRef"></ceshi>
<div class="btnList">
<el-button type="primary" @click="printElement">打印</el-button>
</div>
</el-dialog>
</template>
<script setup lang="ts">
import {defineProps, reactive} from 'vue';
import ceshi from './ceshi.vue'
import { defineProps, reactive, ref, nextTick } from 'vue';
import ceshi from './ceshi.vue';
import printJS from 'print-js';
const ceshiRef = ref(null);
const props = defineProps({
listData:{
type: Array,
default: () => []
},
showes:{
type: Boolean,
default: true
}
listData: {
type: Array,
default: () => [],
},
showes: {
type: Boolean,
default: true,
},
});
const state = reactive({
dialogVisible: true,
dialogVisible: true,
});
const printElement = () => {
// DOM HTML
nextTick(() => {
console.log(ceshiRef.value.orderPrintingRef);
// // 使 print-js
printJS({
printable: ceshiRef.value.orderPrintingRef,
type: 'html', // HTML
style: `
@page {
margin: 0;
size: auto;
}
@page :header, @page :footer {
display: none;
}
`,
});
});
};
</script>
<style scoped lang="scss">
.btnList{
margin-top: 26px;
display: flex;
justify-content: center;
.btnList {
margin-top: 26px;
display: flex;
justify-content: center;
}
</style>
</style>

View File

@ -1,6 +1,57 @@
<template>
<div class="system-user-container layout-padding">
<el-card class="layout-padding-auto" shadow="hover">
<div class="selectBoxes">
<div class="selectItem">
<el-input v-model="state.formData.fBillNo" style="width: 12vw" placeholder="单据编号" size="default" />
</div>
<div class="selectItem">
<el-select placeholder="业务状态" size="default" style="width: 12vw" v-model="state.formData.fmrpCloseStatus">
<el-option v-for="item in state.option.column[2].dicData" :key="item.value" :label="item.label" :value="item.value" />
</el-select>
</div>
<div class="selectItem">
<el-date-picker
v-model="state.elDatePicker"
style="width: 25vw"
type="daterange"
range-separator="-"
start-placeholder="开始采购日期"
end-placeholder="采购结束日期"
size="default"
format="YYYY-MM-DD"
value-format="YYYY-MM-DD"
@change="elDatePickerFun"
/>
</div>
<div class="selectItem" style="margin-right: 0">
<el-button type="primary" size="default" @click="selectFun">搜索</el-button>
<el-button size="default" @click="resetFun">重置</el-button>
</div>
<div class="selectItem" style="flex: 1;margin-right: 0">
<div class="piliang">
<el-button type="primary" size="small" @click="state.selectedDataShow = true">
<span>已选中 {{ state.selectedData.length }} 条数据去查看</span>
</el-button>
<el-date-picker
v-model="state.chengNuoJiaoQiP"
type="date"
placeholder="批量修改选中承诺日期"
size="small"
style="width: 45%; margin-left: 12px"
@change="chengNuoJiaoQiPFun('0')"
/>
<el-date-picker
v-model="state.newChengNuoJiaoQiP"
type="date"
placeholder="批量修改选中承诺最新交期"
size="small"
style="width: 45%; margin-left: 12px"
@change="chengNuoJiaoQiPFun('1')"
/>
</div>
</div>
</div>
<avue-crud
ref="crudRef"
:data="state.data"
@ -45,59 +96,11 @@
/>
</template>
<template #menu-left>
<div class="selectBoxes">
<div class="selectItem">
<el-input v-model="state.formData.fBillNo" style="width: 240px" placeholder="单据编号" size="default" />
</div>
<div class="selectItem">
<el-select placeholder="业务状态" size="default" style="width: 240px" v-model="state.formData.fmrpCloseStatus">
<el-option v-for="item in state.option.column[2].dicData" :key="item.value" :label="item.label" :value="item.value" />
</el-select>
</div>
<div class="selectItem">
<el-date-picker
v-model="state.elDatePicker"
style="width: 560px"
type="daterange"
range-separator="-"
start-placeholder="开始采购日期"
end-placeholder="采购结束日期"
size="default"
format="YYYY-MM-DD"
value-format="YYYY-MM-DD"
@change="elDatePickerFun"
/>
</div>
<div class="selectItem" style="flex: 1">
<el-button type="primary" size="default" @click="selectFun">搜索</el-button>
<el-button size="default" @click="resetFun">重置</el-button>
<div class="piliang">
<el-button type="primary" size="small" @click="state.selectedDataShow = true">
<span>已选中 {{ state.selectedData.length }} 条数据去查看</span>
</el-button>
<el-date-picker
v-model="state.chengNuoJiaoQiP"
type="date"
placeholder="批量修改选中承诺日期"
size="small"
style="width: 190px; margin-left: 12px"
@change="chengNuoJiaoQiPFun('0')"
/>
<el-date-picker
v-model="state.newChengNuoJiaoQiP"
type="date"
placeholder="批量修改选中承诺最新交期"
size="small"
style="width: 190px; margin-left: 12px"
@change="chengNuoJiaoQiPFun('1')"
/>
</div>
</div>
</div>
</template>
<template #menu="{ row }">
<el-button type="text" icon="el-icon-pie-chart" @click="toPurchaseDetails(row)">查看</el-button>
</template>
<!-- <template #menu="{ row }">-->
<!-- <el-button type="text" icon="el-icon-pie-chart" @click="toPurchaseDetails(row)">查看</el-button>-->
<!-- </template>-->
</avue-crud>
</el-card>
<selectedData
@ -105,7 +108,12 @@
:showes="state.selectedDataShow"
:listData="state.selectedData"
@generateDocuments="generateDocumentsFun"
@close="() => {state.selectedDataShow = false;getList()}"
@close="
() => {
state.selectedDataShow = false;
getList();
}
"
/>
</div>
</template>
@ -129,10 +137,10 @@ const state = reactive({
pageSize: 30,
},
option: {
height: '720',
height: '730',
tip: false,
index: false,
menu: false,
index: true,
menu: true,
menuWidth: 120,
border: true,
delBtn: false,
@ -140,6 +148,7 @@ const state = reactive({
align: 'center',
// searchLabelWidth:100,
selection: true,
reserveSelection: true,
searchMenuSpan: 3,
addBtn: false,
column: [
@ -291,17 +300,35 @@ const getList = () => {
})
.then((res: any) => {
state.loading = false;
if (res.resultCode === 0) {
state.data = res.data.dataList;
state.page.total = res.data.total;
setTimeout(() => {
console.log(document.querySelector('.avue-crud__body').scrollHeight)
},1000)
}
});
};
//
onMounted(() => {});
onMounted(() => {
});
</script>
<style lang="scss" scoped>
:deep(.avue-crud__header) {
display: none;
}
:deep(.el-button--text){
padding: 0 !important;
height: auto !important;
}
:deep(.avue-crud__pagination) {
padding: 0 12px !important;
}
:deep(.cell) {
padding: 0 !important;
}
@ -344,8 +371,7 @@ onMounted(() => {});
.selectBoxes {
display: flex;
flex: 1;
flex-wrap: wrap;
.selectItem {
margin-right: 16px;
display: flex;

View File

@ -22,7 +22,7 @@
type="date"
placeholder="日期"
size="small"
style="width: 115px"
style="width: 220px"
format="YYYY-MM-DD"
value-format="YYYY-MM-DD"
@change="batchSetChengNuoJiaoQiFun([{id:row.id,newTime:row.chengNuoJiaoQi}])"
@ -34,66 +34,12 @@
type="date"
placeholder="日期"
size="small"
style="width: 130px"
style="width: 220px"
format="YYYY-MM-DD"
value-format="YYYY-MM-DD"
@change="batchSetNewChengNuoJiaoQiFun([{id:row.id,newTime:row.newChengNuoJiaoQi}])"
/>
</template>
<template #menu-left>
<div class="selectBoxes">
<div class="selectItem">
<el-input v-model="state.formData.fBillNo" style="width: 240px" placeholder="单据编号" size="default" />
</div>
<div class="selectItem">
<el-select placeholder="业务状态" size="default" style="width: 240px" v-model="state.formData.fmrpCloseStatus">
<el-option v-for="item in state.option.column[2].dicData" :key="item.value" :label="item.label" :value="item.value" />
</el-select>
</div>
<div class="selectItem">
<el-date-picker
v-model="state.elDatePicker"
style="width: 560px"
type="daterange"
range-separator="-"
start-placeholder="开始采购日期"
end-placeholder="采购结束日期"
size="default"
format="YYYY-MM-DD"
value-format="YYYY-MM-DD"
@change="elDatePickerFun"
/>
</div>
<div class="selectItem" style="flex: 1">
<el-button type="primary" size="default" @click="selectFun">搜索</el-button>
<el-button size="default" @click="resetFun">重置</el-button>
<div class="piliang">
<el-button type="primary" size="small" @click="state.selectedDataShow = true">
<span>已选中 {{ state.selectedData.length }} 条数据去查看</span>
</el-button>
<el-date-picker
v-model="state.chengNuoJiaoQiP"
type="date"
placeholder="批量修改选中承诺日期"
size="small"
style="width: 190px; margin-left: 12px"
@change="chengNuoJiaoQiPFun('0')"
/>
<el-date-picker
v-model="state.newChengNuoJiaoQiP"
type="date"
placeholder="批量修改选中承诺最新交期"
size="small"
style="width: 190px; margin-left: 12px"
@change="chengNuoJiaoQiPFun('1')"
/>
</div>
</div>
</div>
</template>
<template #menu="{ row }">
<el-button type="text" icon="el-icon-pie-chart" @click="toPurchaseDetails(row)">查看</el-button>
</template>
</avue-crud>
</el-card>
<selectedData ref="selectedDataRef" :showes="state.selectedDataShow" :listData="state.selectedData" @generateDocuments="generateDocumentsFun" @close="state.selectedDataShow = false"/>
@ -119,9 +65,9 @@ const state = reactive({
pageSize: 25,
},
option: {
height: '720',
height: '790',
tip: false,
index: false,
index: true,
menuWidth: 120,
border: true,
delBtn: false,
@ -131,6 +77,7 @@ const state = reactive({
selection: true,
searchMenuSpan: 3,
addBtn: false,
menu: false,
column: [
{ label: 'PO号', prop: 'fBillNo', /*search: true,*/ searchSpan: 3, width: '125' },
{ label: '采购日期', prop: 'fDate', /*search: true,*/ type: 'datetime', searchSpan: 6, searchRange: true },
@ -160,8 +107,8 @@ const state = reactive({
},
{ label: '累计收料数量', prop: 'sendedQty', width: '110' },
{ label: '剩余收料数量', prop: 'notSendQty' },
{ label: '供应商承诺交期', prop: 'chengNuoJiaoQi', width: '140' },
{ label: '供应商承诺最新交期', prop: 'newChengNuoJiaoQi', width: '160' },
{ label: '供应商承诺交期', prop: 'chengNuoJiaoQi', width: '220' },
{ label: '供应商承诺最新交期', prop: 'newChengNuoJiaoQi', width: '220' },
],
},
data: [],
@ -266,6 +213,7 @@ const getList = () => {
listApi().getPurchaseOrderItemList({
fid:state.topId
}).then((res:any) => {
state.loading = false
if(res.resultCode === 0){
state.data = res.data
}
@ -279,6 +227,21 @@ onMounted(() => {
</script>
<style lang="scss" scoped>
:deep(.avue-crud__header) {
display: none;
}
:deep(.el-button--text){
padding: 0 !important;
height: auto !important;
}
:deep(.avue-crud__pagination) {
padding: 0 12px !important;
}
:deep(.cell) {
padding: 0 !important;
}
:deep(.avue-crud__left) {
flex: 1;
}
@ -317,8 +280,7 @@ onMounted(() => {
.selectBoxes {
display: flex;
flex: 1;
flex-wrap: wrap;
.selectItem {
margin-right: 16px;
display: flex;

View File

@ -137,7 +137,9 @@ const xiugaizhanghao = (row:any) => {
}
//
onMounted(() => {});
onMounted(() => {
});
</script>
<style lang="scss" scoped>