Commit c6689a87 by 杨子

feat(入库管理): 新增入库操作和调整入库明细对话框组件

重构入库管理页面,将入库操作和调整入库明细功能拆分为独立组件
优化状态列显示,使用字典标签组件统一展示
移除冗余代码,简化主页面逻辑
parent 65e91500
export default {
plugins: {
tailwindcss: {},
autoprefixer: {},
},
}
\ No newline at end of file
......@@ -47,7 +47,11 @@
<el-table-column label="温度范围" align="center" prop="temperatureRange" />
<el-table-column label="湿度范围" align="center" prop="humidityRange" />
<el-table-column label="库区容量" align="center" prop="capacity" />
<el-table-column label="状态" align="center" prop="status" />
<el-table-column label="状态" align="center" prop="status" >
<template #default="scope">
<dict-tag :options="sys_normal_disable" :value="scope.row.status" />
</template>
</el-table-column>
</el-table>
<template #footer>
......@@ -63,6 +67,9 @@
import { ref, reactive, watch } from 'vue'
import { listWmsArea } from "@/api/ware/wmsArea"
import { handleTree } from "@/utils/ruoyi"
const { proxy } = getCurrentInstance()
const { sys_normal_disable } = proxy.useDict('sys_normal_disable')
const props = defineProps({
visible: {
......
......@@ -47,7 +47,11 @@
<el-table-column label="联系电话" align="center" prop="contactPhone" />
<el-table-column label="邮箱" align="center" prop="email" />
<el-table-column label="地址" align="center" prop="address" />
<el-table-column label="状态" align="center" prop="status" />
<el-table-column label="状态" align="center" prop="status" >
<template #default="scope">
<dict-tag :options="sys_normal_disable" :value="scope.row.status" />
</template>
</el-table-column>
</el-table>
<pagination
......@@ -70,6 +74,9 @@
<script setup name="CustomerSelectDialog">
import { ref, reactive, watch } from 'vue'
import { listWmsCustomer } from "@/api/ware/wmsCustomer"
const { proxy } = getCurrentInstance()
const { sys_normal_disable } = proxy.useDict('sys_normal_disable')
const props = defineProps({
visible: {
......
......@@ -52,10 +52,11 @@
<el-table-column label="货架编码" align="center" prop="locationCode" />
<el-table-column label="货架名称" align="center" prop="locationName" />
<el-table-column label="所属库区" align="center" prop="areaId" />
<el-table-column label="X坐标" align="center" prop="xCoordinate" />
<el-table-column label="Y坐标" align="center" prop="yCoordinate" />
<el-table-column label="Z坐标" align="center" prop="zCoordinate" />
<el-table-column label="货架状态" align="center" prop="status" />
<el-table-column label="货架状态" align="center" prop="status" >
<template #default="scope">
<dict-tag :options="sys_normal_disable" :value="scope.row.status" />
</template>
</el-table-column>
</el-table>
<pagination
......@@ -78,6 +79,9 @@
<script setup name="LocationSelectDialog">
import { ref, reactive, watch } from 'vue'
import { listWmsLocation } from "@/api/ware/wmsLocation"
const { proxy } = getCurrentInstance()
const { sys_normal_disable } = proxy.useDict('sys_normal_disable')
const props = defineProps({
visible: {
......
......@@ -60,7 +60,11 @@
<el-table-column label="计量单位" align="center" prop="unit" />
<el-table-column label="生产厂家" align="center" prop="manufacturer" />
<el-table-column label="安全库存" align="center" prop="safetyStock" />
<el-table-column label="状态" align="center" prop="status" />
<el-table-column label="状态" align="center" prop="status" >
<template #default="scope">
<dict-tag :options="sys_normal_disable" :value="scope.row.status" />
</template>
</el-table-column>
</el-table>
<pagination
......@@ -153,6 +157,10 @@ import { listWmsMaterial, addWmsMaterial } from "@/api/ware/wmsMaterial"
import { listWmsMaterialCategory } from "@/api/ware/wmsMaterialCategory"
import { ElMessage } from 'element-plus'
const { proxy } = getCurrentInstance()
const { sys_normal_disable } = proxy.useDict('sys_normal_disable')
const props = defineProps({
visible: {
type: Boolean,
......
......@@ -53,45 +53,6 @@
</el-col>
</el-row>
</el-form-item>
<!-- 预览区域 -->
<el-form-item label="二维码预览">
<div class="qrcode-preview-container">
<div
class="qrcode-preview"
:style="{
width: previewSize.width + 'px',
height: previewSize.height + 'px',
border: '1px solid #dcdfe6'
}"
>
<!-- 这里使用假的二维码预览,实际应该使用二维码生成库 -->
<div class="qrcode-placeholder" v-if="!previewVisible">
点击预览按钮生成二维码
</div>
<div v-else>
<!-- 实际项目中应该使用qrcode库生成二维码 -->
<div class="qrcode-content">
<svg width="100%" height="100%" viewBox="0 0 100 100">
<rect width="100" height="100" fill="white" />
<!-- 简单的二维码样式 -->
<rect x="10" y="10" width="80" height="80" fill="none" stroke="#333" stroke-width="2" />
<rect x="20" y="20" width="10" height="10" fill="#333" />
<rect x="45" y="20" width="10" height="10" fill="#333" />
<rect x="70" y="20" width="10" height="10" fill="#333" />
<rect x="20" y="45" width="10" height="10" fill="#333" />
<rect x="45" y="45" width="10" height="10" fill="#333" />
<rect x="70" y="45" width="10" height="10" fill="#333" />
<rect x="20" y="70" width="10" height="10" fill="#333" />
<rect x="45" y="70" width="10" height="10" fill="#333" />
<rect x="70" y="70" width="10" height="10" fill="#333" />
</svg>
</div>
<div class="qrcode-value" v-if="qrcodeValue">{{ qrcodeValue }}</div>
</div>
</div>
</div>
</el-form-item>
</el-form>
<template #footer>
......@@ -166,7 +127,11 @@ function handleSizeChange() {
// 预览二维码
function handlePreview() {
previewVisible.value = true
handleQrcodePrint({
width: previewSize.value.width,
height: previewSize.value.height,
qrcodeValue: props.qrcodeValue
})
}
// 打印
......@@ -181,12 +146,10 @@ function handlePrint() {
height = form.customHeight
}
// 调用父组件的打印方法
emit('print', {
width,
height,
qrcodeValue: props.qrcodeValue
})
// 使用LODOP直接打印二维码
const LODOP = getLodop(document.getElementById('LODOP1'), document.getElementById('LODOP_EM1'))
CreatePrintPage(width, height, props.qrcodeValue)
LODOP.PRINT()
// 关闭对话框
cancel()
......@@ -201,6 +164,25 @@ function handleClose(newVal) {
function cancel() {
emit('update:visible', false)
}
/** 处理二维码打印 */
function handleQrcodePrint(params) {
const { width, height, qrcodeValue } = params
// 使用LODOP打印二维码
const LODOP = getLodop(document.getElementById('LODOP1'), document.getElementById('LODOP_EM1'))
CreatePrintPage(width, height, qrcodeValue)
LODOP.PREVIEW() // 预览打印
}
function CreatePrintPage(width, height, qrcodeValue) {
LODOP.SET_SHOW_MODE("SKIN_TYPE", '1');
LODOP.SET_PRINT_PAGESIZE(1, width, height, '自定义二维码标签')
LODOP.ADD_PRINT_BARCODE(0, 0, 150, 150, "QRCode", qrcodeValue);
};
</script>
<style scoped>
......
......@@ -54,7 +54,11 @@
<el-table-column label="EPC编码" align="center" prop="epcCode" />
<el-table-column label="TID编码" align="center" prop="tidCode" />
<el-table-column label="标签类型" align="center" prop="tagType" />
<el-table-column label="标签状态" align="center" prop="tagStatus" />
<el-table-column label="标签状态" align="center" prop="tagStatus">
<template #default="scope">
<span>{{ sys_normal_disable[scope.row.tagStatus] }}</span>
</template>
</el-table-column>
<el-table-column label="最后读取时间" align="center" prop="lastReadTime">
<template #default="scope">
<span>{{ parseTime(scope.row.lastReadTime, '{y}-{m}-{d}') }}</span>
......@@ -83,7 +87,8 @@
import { ref, reactive, watch } from 'vue'
import { listWmsRfidTag } from "@/api/ware/wmsRfidTag"
import { parseTime } from "@/utils/ruoyi"
const {proxy} = getCurrentInstance()
const { sys_normal_disable } = proxy.useDict('sys_normal_disable')
const props = defineProps({
visible: {
type: Boolean,
......
......@@ -47,7 +47,11 @@
<el-table-column label="联系电话" align="center" prop="contactPhone" />
<el-table-column label="邮箱" align="center" prop="email" />
<el-table-column label="地址" align="center" prop="address" />
<el-table-column label="状态" align="center" prop="status" />
<el-table-column label="状态" align="center" prop="status" >
<template #default="scope">
<dict-tag :options="sys_normal_disable" :value="scope.row.status" />
</template>
</el-table-column>
</el-table>
<pagination
......@@ -70,7 +74,9 @@
<script setup name="SupplierSelectDialog">
import { ref, reactive, watch } from 'vue'
import { listWmsSupplier } from "@/api/ware/wmsSupplier"
const { proxy } = getCurrentInstance()
const { sys_normal_disable } = proxy.useDict('sys_normal_disable')
const props = defineProps({
visible: {
type: Boolean,
......
......@@ -39,7 +39,11 @@
<el-table-column label="面积" align="center" prop="area" />
<el-table-column label="容量" align="center" prop="capacity" />
<el-table-column label="位置" align="center" prop="location" />
<el-table-column label="状态" align="center" prop="status" />
<el-table-column label="状态" align="center" prop="status" >
<template #default="scope">
<dict-tag :options="sys_normal_disable" :value="scope.row.status" />
</template>
</el-table-column>
</el-table>
<pagination
......@@ -62,7 +66,9 @@
<script setup name="WarehouseSelectDialog">
import { ref, reactive, watch } from 'vue'
import { listWmsWarehouse } from "@/api/ware/wmsWarehouse"
const { proxy } = getCurrentInstance()
const { sys_normal_disable } = proxy.useDict('sys_normal_disable')
const props = defineProps({
visible: {
type: Boolean,
......
<template>
<el-dialog
title="调整入库明细信息"
v-model="dialogVisible"
width="1200px"
append-to-body
>
<el-table :data="adjustInventoryDetailList" border style="width: 100%" height="600px">
<el-table-column prop="wmsMaterial.materialName" label="物资名称" width="200" fixed="left" />
<el-table-column prop="batchNo" label="批次号" width="150" />
<el-table-column prop="actualQuantity" label="数量" width="120">
<template #default="scope">
<el-input
v-if="scope.row.isEditing"
v-model.number="scope.row.actualQuantity"
placeholder="请输入实际数量"
size="small"
type="number"
:precision="3"
:step="0.001"
@input="() => {
scope.row.amount = scope.row.actualQuantity && scope.row.unitPrice ? (scope.row.actualQuantity * scope.row.unitPrice).toFixed(2) : '0.00'
}"
/>
<span v-else>{{ scope.row.actualQuantity }}</span>
</template>
</el-table-column>
<el-table-column prop="unitPrice" label="单价" width="100">
<template #default="scope">
<el-input
v-if="scope.row.isEditing"
v-model.number="scope.row.unitPrice"
placeholder="请输入单价"
size="small"
type="number"
:precision="2"
:step="0.01"
@input="() => {
scope.row.amount = scope.row.actualQuantity && scope.row.unitPrice ? (scope.row.actualQuantity * scope.row.unitPrice).toFixed(2) : '0.00'
}"
/>
<span v-else>{{ scope.row.unitPrice }}</span>
</template>
</el-table-column>
<el-table-column label="金额" width="100">
<template #default="scope">
<span>{{ scope.row.amount }}</span>
</template>
</el-table-column>
<el-table-column prop="locationId" label="货架" width="300">
<template #default="scope">
<LocationCascaderSelect
v-if="scope.row.isEditing"
:model-value="{warehouseId: scope.row.warehouseId, areaId: scope.row.areaId, locationId: scope.row.locationId}"
@update:model-value="(value) => {
scope.row.warehouseId = value.warehouseId;
scope.row.areaId = value.areaId;
scope.row.locationId = value.locationId;
}"
/>
<span v-else>{{ scope.row.wmsLocation?.locationName }}</span>
</template>
</el-table-column>
<!-- PLT标签 -->
<el-table-column prop="storageLocation" label="PLT标签" width="180">
<template #default="scope">
<div v-if="scope.row.isEditing">
<el-input v-model="scope.row.storageLocation" placeholder="请选择PLT标签" size="small" readonly />
<el-button slot="append" type="primary" size="small" @click="openPtlTagSelect(scope.$index)">选择</el-button>
</div>
<span v-else>{{ scope.row.storageLocation || '-' }}</span>
</template>
</el-table-column>
<!-- RFID标签 -->
<el-table-column prop="rfidTagIds" label="RFID标签" width="180">
<template #default="scope">
<div v-if="scope.row.isEditing">
<el-input v-model="scope.row.rfidTagIds" placeholder="请选择RFID标签" size="small" readonly />
<el-button slot="append" type="primary" size="small" @click="openRfidTagSelect(scope.$index)">选择</el-button>
</div>
<span v-else>{{ scope.row.rfidTagIds || '-' }}</span>
</template>
</el-table-column>
<el-table-column label="操作" width="180" align="center" fixed="right">
<template #default="scope">
<el-button
v-if="!scope.row.isEditing"
type="primary"
size="small"
icon="Edit"
@click="handleEditDetail(scope.row)"
>
编辑
</el-button>
<el-button
v-else
type="success"
size="small"
icon="Check"
@click="handleSaveDetail(scope.row)"
>
保存
</el-button>
<el-button
type="danger"
size="small"
icon="Delete"
@click="handleDelDetail(scope.row)"
>
删除
</el-button>
</template>
</el-table-column>
</el-table>
<template #footer>
<div class="dialog-footer">
<el-button @click="dialogVisible = false">关 闭</el-button>
</div>
</template>
<!-- RFID标签选择对话框组件 -->
<RfidTagSelectDialog ref="rfidTagSelectDialogRef" v-model:visible="rfidTagDialogVisible" title="选择RFID标签"
@confirm="handleRfidTagConfirm" />
<!-- PTL标签选择对话框组件 -->
<PtlTagSelectDialog ref="ptlTagSelectDialogRef" v-model:visible="ptlTagDialogVisible" title="选择PTL标签"
@confirm="handlePtlTagConfirm" />
</el-dialog>
</template>
<script setup>
import { ref, computed, getCurrentInstance, watch, onMounted } from 'vue'
import { listWmsInboundOrderItem } from "@/api/ware/wmsInboundOrderItem"
import { updateWmsInboundOrderItem, delWmsInboundOrderItem } from "@/api/ware/wmsInboundOrder"
import LocationCascaderSelect from "@/components/LocationCascaderSelect.vue"
import RfidTagSelectDialog from "@/components/RfidTagSelectDialog.vue"
import PtlTagSelectDialog from "@/components/PtlTagSelectDialog.vue"
const props = defineProps({
visible: {
type: Boolean,
default: false
},
orderId: {
type: Number,
default: null
}
})
const emit = defineEmits(['update:visible', 'detail-updated', 'detail-deleted', 'error'])
const dialogVisible = computed({
get() {
return props.visible
},
set(value) {
emit('update:visible', value)
}
})
const { proxy } = getCurrentInstance()
// 当前调整的入库单
const currentAdjustOrder = ref(null)
// 入库明细调整列表
const adjustInventoryDetailList = ref([])
// RFID标签选择对话框状态
const rfidTagDialogVisible = ref(false)
const rfidTagSelectDialogRef = ref(null)
// PTL标签选择对话框状态
const ptlTagDialogVisible = ref(false)
const ptlTagSelectDialogRef = ref(null)
// 记录当前编辑的明细行索引
const currentEditingRowIndex = ref(-1)
// 监听orderId变化,加载明细数据
watch(
() => props.orderId,
(newId) => {
if (newId && props.visible) {
loadAdjustInventoryDetails()
}
}
)
// 监听visible变化,加载明细数据
watch(
() => props.visible,
(newVisible) => {
if (newVisible && props.orderId) {
loadAdjustInventoryDetails()
}
}
)
// 加载调整入库明细
function loadAdjustInventoryDetails() {
if (!props.orderId) {
return
}
listWmsInboundOrderItem({ orderId: props.orderId, pageSize: 1000, pageNum: 1 }).then(response => {
adjustInventoryDetailList.value = response.rows.map(item => ({
...item,
isEditing: false // 添加编辑状态标志
}))
}).catch(error => {
proxy.$message.error('查询入库明细失败:' + error.message)
emit('error', error)
})
}
// 编辑明细
function handleEditDetail(row) {
// 保存原始值,以便取消编辑时恢复
row.originalData = JSON.parse(JSON.stringify(row))
row.isEditing = true
}
// 保存明细
function handleSaveDetail(row) {
// 计算金额
if (row.actualQuantity && row.unitPrice) {
row.amount = (row.actualQuantity * row.unitPrice).toFixed(2)
} else {
row.amount = '0.00'
}
// 调用更新接口
updateWmsInboundOrderItem(row).then(response => {
proxy.$message.success('保存成功')
row.isEditing = false
emit('detail-updated', row)
}).catch(error => {
proxy.$message.error('保存失败:' + error.message)
// 恢复原始值
if (row.originalData) {
Object.assign(row, row.originalData)
delete row.originalData
}
emit('error', error)
})
}
// 删除明细
function handleDelDetail(row) {
proxy.$messageBox.confirm('确定要删除该入库明细吗?', '警告', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
delWmsInboundOrderItem(row.wmsInboundOrderItemId).then(response => {
proxy.$message.success('删除成功')
// 从列表中移除该明细
const index = adjustInventoryDetailList.value.findIndex(item => item.wmsInboundOrderItemId === row.wmsInboundOrderItemId)
if (index !== -1) {
adjustInventoryDetailList.value.splice(index, 1)
}
emit('detail-deleted', row)
}).catch(error => {
proxy.$message.error('删除失败:' + error.message)
emit('error', error)
})
}).catch(() => {
// 取消操作
})
}
// 打开RFID标签选择对话框
function openRfidTagSelect(index) {
currentEditingRowIndex.value = index
rfidTagDialogVisible.value = true
}
// 处理RFID标签选择确认
function handleRfidTagConfirm(selectedTags) {
if (currentEditingRowIndex.value >= 0 && adjustInventoryDetailList.value[currentEditingRowIndex.value]) {
adjustInventoryDetailList.value[currentEditingRowIndex.value].rfidTagIds = selectedTags.map(tag => tag.rfidTagId).join(',')
}
currentEditingRowIndex.value = -1
}
// 打开PTL标签选择对话框
function openPtlTagSelect(index) {
currentEditingRowIndex.value = index
ptlTagDialogVisible.value = true
}
// 处理PTL标签选择确认
function handlePtlTagConfirm(selectedTags) {
if (currentEditingRowIndex.value >= 0 && adjustInventoryDetailList.value[currentEditingRowIndex.value]) {
adjustInventoryDetailList.value[currentEditingRowIndex.value].storageLocation = selectedTags.map(tag => tag.storageLocation).join(',')
}
currentEditingRowIndex.value = -1
}
</script>
<template>
<el-dialog
title="入库操作"
v-model="dialogVisible"
width="1200px"
append-to-body
>
<el-form :model="inventoryQueryParams" ref="inventoryQueryRef" :inline="true" label-width="120px">
<el-form-item label="批次号" prop="batchNo">
<el-input
v-model="inventoryQueryParams.batchNo"
placeholder="请输入或扫描批次号"
clearable
@keyup.enter="handleInventoryQuery"
@input="handleBatchNoInput"
/>
</el-form-item>
<el-form-item>
<el-button type="primary" icon="Search" @click="handleInventoryQuery">搜索</el-button>
<el-button icon="Refresh" @click="resetInventoryQuery">重置</el-button>
</el-form-item>
</el-form>
<el-table :data="inventoryDetailList" border style="width: 100%; margin-top: 20px;" height="600px">
<el-table-column prop="wmsMaterial.materialName" label="物资名称" width="200" />
<el-table-column prop="batchNo" label="批次号" width="150" />
<el-table-column prop="actualQuantity" label="数量" width="100" />
<el-table-column prop="unitPrice" label="单价" width="100" />
<el-table-column label="金额" width="100">
<template #default="scope">
<span>{{ scope.row.amount }}</span>
</template>
</el-table-column>
<el-table-column prop="wmsLocation.locationName" label="货架" width="100" />
<el-table-column prop="storageLocation" label="PTL标签" width="180">
<template #default="scope">
<el-input v-model="scope.row.storageLocation" placeholder="请选择PTL标签" size="small" readonly />
<el-button slot="append" type="primary" size="small" @click="openPtlTagSelect(scope.$index)">选择</el-button>
</template>
</el-table-column>
<el-table-column prop="rfidTagIds" label="RFID标签" width="180">
<template #default="scope">
<el-input v-model="scope.row.rfidTagIds" placeholder="请选择RFID标签" size="small" readonly />
<el-button slot="append" type="primary" size="small" @click="openRfidTagSelect(scope.$index)">选择</el-button>
</template>
</el-table-column>
<el-table-column prop="wmsInboundOrderItemId" label="操作" width="100" fixed="right">
<template #default="scope">
<el-button type="primary" size="small" @click="handleExportQrcode(scope.row)">打印二维码</el-button>
</template>
</el-table-column>
</el-table>
<template #footer>
<div class="dialog-footer">
<el-button @click="dialogVisible = false">取 消</el-button>
<el-button type="primary" @click="confirmInventory">确认入库</el-button>
</div>
</template>
<!-- RFID标签选择对话框组件 -->
<RfidTagSelectDialog ref="rfidTagSelectDialogRef" v-model:visible="rfidTagDialogVisible" title="选择RFID标签"
@confirm="handleRfidTagConfirm" />
<!-- PTL标签选择对话框组件 -->
<PtlTagSelectDialog ref="ptlTagSelectDialogRef" v-model:visible="ptlTagDialogVisible" title="选择PTL标签"
@confirm="handlePtlTagConfirm" />
<!-- 二维码打印对话框组件 -->
<QrcodePrintDialog
ref="qrcodePrintDialogRef"
v-model:visible="qrcodePrintDialogVisible"
:qrcode-value="currentQrcodeValue"
@print="handleQrcodePrint"
/>
</el-dialog>
</template>
<script setup>
import { ref, computed, getCurrentInstance } from 'vue'
import { listWmsInboundOrderItem } from "@/api/ware/wmsInboundOrderItem"
import { addToInventory } from "@/api/ware/wmsInboundOrder"
import RfidTagSelectDialog from "@/components/RfidTagSelectDialog.vue"
import PtlTagSelectDialog from "@/components/PtlTagSelectDialog.vue"
import QrcodePrintDialog from "@/components/QrcodePrintDialog.vue"
const props = defineProps({
visible: {
type: Boolean,
default: false
},
currentOrder: {
type: Object,
default: null
}
})
const emit = defineEmits(['update:visible', 'inventory-success', 'inventory-error'])
const dialogVisible = computed({
get() {
return props.visible
},
set(value) {
emit('update:visible', value)
}
})
const { proxy } = getCurrentInstance()
// 入库查询参数
const inventoryQueryParams = ref({
batchNo: null
})
// 入库明细列表
const inventoryDetailList = ref([])
// RFID标签选择对话框状态
const rfidTagDialogVisible = ref(false)
const rfidTagSelectDialogRef = ref(null)
// PTL标签选择对话框状态
const ptlTagDialogVisible = ref(false)
const ptlTagSelectDialogRef = ref(null)
// 二维码打印对话框状态
const qrcodePrintDialogVisible = ref(false)
const qrcodePrintDialogRef = ref(null)
// 记录当前编辑的明细行索引
const currentEditingRowIndex = ref(-1)
// 当前要打印的二维码值
const currentQrcodeValue = ref('')
// 处理批次号输入(支持扫描枪)
function handleBatchNoInput() {
if (inventoryQueryParams.value.batchNo && inventoryQueryParams.value.batchNo.endsWith('\n')) {
inventoryQueryParams.value.batchNo = inventoryQueryParams.value.batchNo.trim()
handleInventoryQuery()
}
}
// 入库明细查询
function handleInventoryQuery() {
if (!inventoryQueryParams.value.batchNo) {
proxy.$message.warning('请输入批次号')
return
}
listWmsInboundOrderItem({ batchNo: inventoryQueryParams.value.batchNo, orderId: props.currentOrder.orderId }).then(response => {
if(response.rows.length){
const currentOrder = response.rows[0];
if(currentOrder.putawayStatus === '1'){
proxy.$message.warning('该批次号已上架,不能重复上架')
}else{
inventoryDetailList.value = [currentOrder];
}
}else{
proxy.$message.warning('未查询到相关入库明细')
}
}).catch(error => {
proxy.$message.error('查询入库明细失败:' + error.message)
emit('inventory-error', error)
})
}
// 重置入库查询
function resetInventoryQuery() {
inventoryQueryParams.value = {
batchNo: null
}
}
// 确认入库
function confirmInventory() {
if (inventoryDetailList.value.length === 0) {
proxy.$message.warning('请先添加入库明细')
return
}
proxy.$messageBox.confirm('确定要执行入库操作吗?', '警告', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
const orderData = { ...props.currentOrder, items: inventoryDetailList.value }
addToInventory(orderData).then(response => {
proxy.$message.success('入库成功')
dialogVisible.value = false
emit('inventory-success')
}).catch(error => {
proxy.$message.error('入库失败:' + error.message)
emit('inventory-error', error)
})
}).catch(() => {
// 取消操作
})
}
// 打开RFID标签选择对话框
function openRfidTagSelect(index) {
currentEditingRowIndex.value = index
rfidTagDialogVisible.value = true
}
// 处理RFID标签选择确认
function handleRfidTagConfirm(selectedTags) {
if (currentEditingRowIndex.value >= 0 && inventoryDetailList.value[currentEditingRowIndex.value]) {
inventoryDetailList.value[currentEditingRowIndex.value].rfidTagIds = selectedTags.map(tag => tag.tagId).join(',')
}
currentEditingRowIndex.value = -1
}
// 打开PTL标签选择对话框
function openPtlTagSelect(index) {
currentEditingRowIndex.value = index
ptlTagDialogVisible.value = true
}
// 处理PTL标签选择确认
function handlePtlTagConfirm(selectedTags) {
if (currentEditingRowIndex.value >= 0 && inventoryDetailList.value[currentEditingRowIndex.value]) {
inventoryDetailList.value[currentEditingRowIndex.value].storageLocation = selectedTags.map(tag => tag.antennaId).join(',')
}
currentEditingRowIndex.value = -1
}
// 导出二维码
function handleExportQrcode(row) {
currentQrcodeValue.value = JSON.stringify({
orderItemId: row.wmsInboundOrderItemId,
materialName: row.wmsMaterial.materialName,
batchNo: row.batchNo,
quantity: row.actualQuantity
})
qrcodePrintDialogVisible.value = true
}
// 处理二维码打印
function handleQrcodePrint() {
proxy.$message.success('二维码打印成功')
}
</script>
......@@ -7,16 +7,6 @@
<el-form-item label="关联单号" prop="relatedOrderNo">
<el-input v-model="queryParams.relatedOrderNo" placeholder="请输入关联单号" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="仓库" prop="warehouseId">
<el-row :gutter="10">
<el-col :span="18">
<el-input v-model="queryParams.warehouseId" placeholder="请选择仓库" readonly clearable />
</el-col>
<el-col :span="6">
<el-button type="primary" @click="openQueryWarehouseSelect">选择仓库</el-button>
</el-col>
</el-row>
</el-form-item>
<el-form-item>
<el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
<el-button icon="Refresh" @click="resetQuery">重置</el-button>
......@@ -39,13 +29,13 @@
<dict-tag :options="inbound_type" :value="scope.row.orderType" />
</template>
</el-table-column>
<el-table-column label="仓库ID" align="center" prop="warehouseId" />
<el-table-column label="供应商ID" align="center" prop="supplierId" />
<el-table-column label="仓库" align="center" prop="warehouseName" />
<el-table-column label="供应商" align="center" prop="supplierName" />
<el-table-column label="关联单号" align="center" prop="relatedOrderNo" />
<el-table-column label="总数量" align="center" prop="totalQuantity" />
<el-table-column label="总金额" align="center" prop="totalAmount" />
<!-- <el-table-column label="单据状态" align="center" prop="orderStatus" /> -->
<el-table-column label="入库人" align="center" prop="applicantId" />
<el-table-column label="入库人" align="center" prop="applicantUserName" />
<el-table-column label="入库时间" align="center" prop="applyTime" width="180">
<template #default="scope">
<span>{{ parseTime(scope.row.applyTime, '{y}-{m}-{d}') }}</span>
......@@ -105,10 +95,17 @@
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="入库类型" prop="orderType">
<el-radio-group v-model="form.orderType">
<el-radio v-for="(item, index) in inbound_type" :key="index" :label="item.value">{{ item.label }}</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="仓库" prop="warehouseId">
<el-row :gutter="10">
<el-col :span="18">
<el-input v-model="form.warehouseId" placeholder="请选择仓库" readonly />
<el-input v-model="form.warehouseName" placeholder="请选择仓库" readonly />
</el-col>
<el-col :span="6">
<el-button type="primary" @click="openWarehouseSelect">选择仓库</el-button>
......@@ -116,11 +113,14 @@
</el-row>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="8">
<el-form-item label="供应商" prop="supplierId">
<el-row :gutter="10">
<el-col :span="18">
<el-input v-model="form.supplierId" placeholder="请选择供应商" readonly />
<el-input v-model="form.supplierName" placeholder="请选择供应商" readonly />
</el-col>
<el-col :span="6">
<el-button type="primary" @click="openSupplierSelect">选择供应商</el-button>
......@@ -128,8 +128,6 @@
</el-row>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="8">
<el-form-item label="关联单号" prop="relatedOrderNo">
<el-input v-model="form.relatedOrderNo" placeholder="请输入关联单号" />
......@@ -140,16 +138,17 @@
<el-input v-model="form.totalQuantity" placeholder="请输入总数量" disabled />
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="8">
<el-form-item label="总金额" prop="totalAmount">
<el-input v-model="form.totalAmount" placeholder="请输入总金额" disabled />
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="8">
<el-form-item label="入库人" prop="applicantId">
<el-input v-model="form.applicantId" placeholder="请输入申请人" disabled />
<el-input v-model="form.applicantName" placeholder="请输入申请人" disabled />
</el-form-item>
</el-col>
<el-col :span="8">
......@@ -159,6 +158,9 @@
</el-date-picker>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="8">
<el-form-item label="实际到货日期" prop="actualArrivalDate">
<el-date-picker clearable v-model="form.actualArrivalDate" type="date" value-format="YYYY-MM-DD"
......@@ -166,8 +168,6 @@
</el-date-picker>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<!-- <el-col :span="12">
<el-form-item label="预计到货日期" prop="expectedArrivalDate">
<el-date-picker clearable v-model="form.expectedArrivalDate" type="date" value-format="YYYY-MM-DD"
......@@ -368,187 +368,20 @@
<SupplierSelectDialog ref="supplierSelectDialogRef" v-model:visible="supplierDialogVisible" title="选择供应商"
@confirm="handleSupplierConfirm" />
<!-- RFID标签选择对话框组件 -->
<RfidTagSelectDialog ref="rfidTagSelectDialogRef" v-model:visible="rfidTagDialogVisible" title="选择RFID标签"
@confirm="handleRfidTagConfirm" />
<!-- PTL标签选择对话框组件 -->
<PtlTagSelectDialog ref="ptlTagSelectDialogRef" v-model:visible="ptlTagDialogVisible" title="选择PTL标签"
@confirm="handlePtlTagConfirm" />
<!-- 二维码打印对话框组件 -->
<QrcodePrintDialog
ref="qrcodePrintDialogRef"
v-model:visible="qrcodePrintDialogVisible"
:qrcode-value="currentQrcodeValue"
@print="handleQrcodePrint"
/>
<!-- 入库对话框 -->
<el-dialog
title="入库操作"
v-model="inventoryDialogVisible"
width="1200px"
append-to-body
>
<el-form :model="inventoryQueryParams" ref="inventoryQueryRef" :inline="true" label-width="120px">
<el-form-item label="批次号" prop="batchNo">
<el-input
v-model="inventoryQueryParams.batchNo"
placeholder="请输入或扫描批次号"
clearable
@keyup.enter="handleInventoryQuery"
@input="handleBatchNoInput"
<InventoryDialog
v-model:visible="inventoryDialogVisible"
:current-order="currentInventoryOrder"
@inventory-success="getList"
/>
</el-form-item>
<el-form-item>
<el-button type="primary" icon="Search" @click="handleInventoryQuery">搜索</el-button>
<el-button icon="Refresh" @click="resetInventoryQuery">重置</el-button>
</el-form-item>
</el-form>
<el-table :data="inventoryDetailList" border style="width: 100%; margin-top: 20px;" height="600px">
<!-- <el-table-column prop="materialCode" label="物资编码" width="150" /> -->
<el-table-column prop="wmsMaterial.materialName" label="物资名称" width="200" />
<el-table-column prop="batchNo" label="批次号" width="150" />
<el-table-column prop="actualQuantity" label="数量" width="100" />
<el-table-column prop="unitPrice" label="单价" width="100" />
<el-table-column label="金额" width="100">
<template #default="scope">
<span>{{ scope.row.amount }}</span>
</template>
</el-table-column>
<el-table-column prop="wmsWarehouse.warehouseName" label="仓库" width="100" />
<el-table-column prop="wmsArea.areaName" label="库区" width="100" />
<el-table-column prop="wmsLocation.locationName" label="货架" width="100" />
<el-table-column prop="storageLocation" label="PTL标签" width="180">
<template #default="scope">
<el-input v-model="scope.row.storageLocation" placeholder="请选择PTL标签" size="small" readonly />
<el-button slot="append" type="primary" size="small" @click="openPtlTagSelect(scope.$index)">选择</el-button>
</template>
</el-table-column>
<el-table-column prop="rfidTagIds" label="RFID标签" width="180">
<template #default="scope">
<el-input v-model="scope.row.rfidTagIds" placeholder="请选择RFID标签" size="small" readonly />
<el-button slot="append" type="primary" size="small" @click="openRfidTagSelect(scope.$index)">选择</el-button>
</template>
</el-table-column>
<el-table-column prop="wmsInboundOrderItemId" label="操作" width="100" fixed="right">
<template #default="scope">
<el-button type="primary" size="small" @click="handleExportQrcode(scope.row)">打印二维码</el-button>
</template>
</el-table-column>
</el-table>
<template #footer>
<div class="dialog-footer">
<el-button @click="inventoryDialogVisible = false"> </el-button>
<el-button type="primary" @click="confirmInventory">确认入库</el-button>
</div>
</template>
</el-dialog>
<!-- 入库明细调整对话框 -->
<el-dialog
title="调整入库明细信息"
v-model="adjustInventoryDialogVisible"
width="1200px"
append-to-body
>
<el-table :data="adjustInventoryDetailList" border style="width: 100%" height="600px">
<el-table-column prop="wmsMaterial.materialName" label="物资名称" width="200" />
<el-table-column prop="batchNo" label="批次号" width="150" />
<el-table-column prop="actualQuantity" label="数量" width="120">
<template #default="scope">
<el-input
v-if="scope.row.isEditing"
v-model.number="scope.row.actualQuantity"
placeholder="请输入实际数量"
size="small"
type="number"
:precision="3"
:step="0.001"
@input="() => {
scope.row.amount = scope.row.actualQuantity && scope.row.unitPrice ? (scope.row.actualQuantity * scope.row.unitPrice).toFixed(2) : '0.00'
}"
<AdjustInventoryDialog
v-model:visible="adjustInventoryDialogVisible"
:order-id="currentAdjustOrder?.orderId"
:current-order="currentAdjustOrder"
@detail-updated="getList"
/>
<span v-else>{{ scope.row.actualQuantity }}</span>
</template>
</el-table-column>
<el-table-column prop="unitPrice" label="单价" width="100">
<template #default="scope">
<el-input
v-if="scope.row.isEditing"
v-model.number="scope.row.unitPrice"
placeholder="请输入单价"
size="small"
type="number"
:precision="2"
:step="0.01"
@input="() => {
scope.row.amount = scope.row.actualQuantity && scope.row.unitPrice ? (scope.row.actualQuantity * scope.row.unitPrice).toFixed(2) : '0.00'
}"
/>
<span v-else>{{ scope.row.unitPrice }}</span>
</template>
</el-table-column>
<el-table-column label="金额" width="100">
<template #default="scope">
<span>{{ scope.row.amount }}</span>
</template>
</el-table-column>
<el-table-column prop="locationId" label="货架" width="300">
<template #default="scope">
<LocationCascaderSelect
v-if="scope.row.isEditing"
:model-value="{warehouseId: currentAdjustOrder.warehouseId, areaId: scope.row.areaId, locationId: scope.row.locationId}"
@update:model-value="(value) => {
scope.row.warehouseId = value.warehouseId;
scope.row.areaId = value.areaId;
scope.row.locationId = value.locationId;
}"
/>
<span v-else>{{ scope.row.wmsLocation?.locationName }}</span>
</template>
</el-table-column>
<el-table-column label="操作" width="180" align="center">
<template #default="scope">
<el-button
v-if="!scope.row.isEditing"
type="primary"
size="small"
icon="Edit"
@click="handleEditDetail(scope.row)"
>
编辑
</el-button>
<el-button
v-else
type="success"
size="small"
icon="Check"
@click="handleSaveDetail(scope.row)"
>
保存
</el-button>
<el-button
type="danger"
size="small"
icon="Delete"
@click="handleDelDetail(scope.row)"
>
删除
</el-button>
</template>
</el-table-column>
</el-table>
<template #footer>
<div class="dialog-footer">
<el-button @click="adjustInventoryDialogVisible = false"> </el-button>
</div>
</template>
</el-dialog>
</div>
</template>
......@@ -559,12 +392,9 @@ import MaterialSelectDialog from "@/components/MaterialSelectDialog.vue"
import WarehouseSelectDialog from "@/components/WarehouseSelectDialog.vue"
import SupplierSelectDialog from "@/components/SupplierSelectDialog.vue"
import LocationCascaderSelect from "@/components/LocationCascaderSelect.vue"
import RfidTagSelectDialog from "@/components/RfidTagSelectDialog.vue"
import PtlTagSelectDialog from "@/components/PtlTagSelectDialog.vue"
import QrcodePrintDialog from "@/components/QrcodePrintDialog.vue"
import { listWmsMaterial } from "@/api/ware/wmsMaterial"
import InventoryDialog from "./components/InventoryDialog.vue"
import AdjustInventoryDialog from "./components/AdjustInventoryDialog.vue"
import useUserStore from '@/store/modules/user'
import { listWmsInboundOrderItem } from "@/api/ware/wmsInboundOrderItem"
const { proxy } = getCurrentInstance()
......@@ -611,27 +441,15 @@ const qrcodePrintDialogVisible = ref(false)
// 二维码打印对话框实例引用
const qrcodePrintDialogRef = ref(null)
const inventoryQueryRef = ref(null)
// 入库对话框状态
const inventoryDialogVisible = ref(false)
// 当前入库的入库单
const currentInventoryOrder = ref(null)
// 入库查询参数
const inventoryQueryParams = ref({
batchNo: null
})
// 入库明细列表
const inventoryDetailList = ref([])
// 入库明细调整对话框状态
const adjustInventoryDialogVisible = ref(false)
// 当前调整的入库单
const currentAdjustOrder = ref(null)
// 入库明细调整列表
const adjustInventoryDetailList = ref([])
// 记录当前编辑的明细行索引
const currentEditingRowIndex = ref(-1)
// 当前选中的入库单
const currentRow = ref(null)
......@@ -683,152 +501,19 @@ const { queryParams, form, rules } = toRefs(data)
// 打开入库对话框
function handleInventory(row) {
currentInventoryOrder.value = row
inventoryDetailList.value = []
resetInventoryQuery()
inventoryDialogVisible.value = true
}
// 处理批次号输入(支持扫描枪)
function handleBatchNoInput() {
// 扫描枪通常会自动添加换行符,这里可以根据实际情况调整
if (inventoryQueryParams.value.batchNo && inventoryQueryParams.value.batchNo.endsWith('\n')) {
inventoryQueryParams.value.batchNo = inventoryQueryParams.value.batchNo.trim()
handleInventoryQuery()
}
}
// 入库明细查询
function handleInventoryQuery() {
if (!inventoryQueryParams.value.batchNo) {
proxy.$message.warning('请输入批次号')
return
}
listWmsInboundOrderItem({ batchNo: inventoryQueryParams.value.batchNo }).then(response => {
if(response.rows.length){
const currentOrder = response.rows[0];
if(currentOrder.putawayStatus === '1'){
proxy.$message.warning('该批次号已上架,不能重复上架')
}else{
inventoryDetailList.value = [currentOrder];
}
}else{
proxy.$message.warning('未查询到相关入库明细')
}
}).catch(error => {
proxy.$message.error('查询入库明细失败:' + error.message)
})
}
// 重置入库查询
function resetInventoryQuery() {
inventoryQueryParams.value = {
batchNo: null
}
}
// 确认入库
function confirmInventory() {
if (inventoryDetailList.value.length === 0) {
proxy.$message.warning('请先添加入库明细')
return
}
proxy.$messageBox.confirm('确定要执行入库操作吗?', '警告', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
currentInventoryOrder.value.items = inventoryDetailList.value;
// 调用入库API
addToInventory(currentInventoryOrder.value).then(response => {
proxy.$message.success('入库成功')
inventoryDialogVisible.value = false
getList() // 刷新列表
}).catch(error => {
proxy.$message.error('入库失败:' + error.message)
})
}).catch(() => {
// 取消操作
})
}
// 调整已入库信息相关方法
// 打开调整入库信息对话框
function handleAdjustInventory(row) {
currentAdjustOrder.value = row
// 深拷贝明细列表,避免直接修改原数据
listWmsInboundOrderItem({ orderId: row.orderId, pageSize: 1000, pageNum: 1 }).then(response => {
adjustInventoryDetailList.value = response.rows.map(item => ({
...item,
isEditing: false // 添加编辑状态标志
}))
adjustInventoryDialogVisible.value = true
}).catch(error => {
proxy.$message.error('查询入库明细失败:' + error.message)
})
}
// 编辑明细
function handleEditDetail(row) {
// 保存原始值,以便取消编辑时恢复
row.originalData = JSON.parse(JSON.stringify(row))
row.isEditing = true
}
// 保存明细
function handleSaveDetail(row) {
// 计算金额
if (row.actualQuantity && row.unitPrice) {
row.amount = (row.actualQuantity * row.unitPrice).toFixed(2)
} else {
row.amount = '0.00'
}
// 调用更新接口
updateWmsInboundOrderItem(row).then(response => {
proxy.$message.success('保存成功')
row.isEditing = false
}).catch(error => {
proxy.$message.error('保存失败:' + error.message)
// 恢复原始值
if (row.originalData) {
Object.assign(row, row.originalData)
delete row.originalData
}
})
}
// 删除明细
function handleDelDetail(row) {
proxy.$messageBox.confirm('确定要删除这条明细吗?', '警告', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
// 调用删除接口
delWmsInboundOrderItem(row.itemId).then(response => {
proxy.$message.success('删除成功')
// 从列表中移除
const index = adjustInventoryDetailList.value.findIndex(item => item.itemId === row.itemId)
if (index !== -1) {
adjustInventoryDetailList.value.splice(index, 1)
}
// 从原入库单中移除
const originalIndex = currentAdjustOrder.value.items.findIndex(item => item.itemId === row.itemId)
if (originalIndex !== -1) {
currentAdjustOrder.value.items.splice(originalIndex, 1)
}
}).catch(error => {
proxy.$message.error('删除失败:' + error.message)
})
}).catch(() => {
// 取消操作
})
}
/** 查询入库单主列表 */
function getList() {
......@@ -907,6 +592,7 @@ function handleAdd() {
const userStore = useUserStore()
// 设置申请人为当前用户
form.value.applicantId = userStore.id
form.value.applicantName = userStore.nickName
// 设置申请时间为当前时间
form.value.applyTime = new Date().toISOString().split('T')[0]
......@@ -942,6 +628,7 @@ function handleWarehouseConfirm(selectedWarehouses) {
const warehouse = selectedWarehouses[0]
// 同时更新表单和搜索参数
form.value.warehouseId = warehouse.warehouseId
form.value.warehouseName = warehouse.warehouseName
queryParams.value.warehouseId = warehouse.warehouseId
// 可以根据需要添加更多仓库信息字段
}
......@@ -960,6 +647,7 @@ function handleSupplierConfirm(selectedSuppliers) {
if (selectedSuppliers.length > 0) {
const supplier = selectedSuppliers[0]
form.value.supplierId = supplier.supplierId
form.value.supplierName = supplier.supplierName
// 可以根据需要添加更多供应商信息字段
}
}
......@@ -1026,37 +714,7 @@ function addDetail() {
materialSelectDialogRef.value.handleQuery()
}
/** 打开PTL标签选择对话框 */
function openPtlTagSelect(rowIndex) {
currentEditingRowIndex.value = rowIndex
ptlTagDialogVisible.value = true
}
/** 处理PTL标签选择确认 */
function handlePtlTagConfirm(selectedPtlTags) {
if (selectedPtlTags.length > 0) {
const ptlTag = selectedPtlTags[0]
// 使用天线编码作为PTL标签值
// form.value.items[currentEditingRowIndex.value].storageLocation = ptlTag.antennaCode
inventoryDetailList.value[currentEditingRowIndex.value].storageLocation = ptlTag.antennaCode
}
}
/** 打开RFID标签选择对话框 */
function openRfidTagSelect(rowIndex) {
currentEditingRowIndex.value = rowIndex
rfidTagDialogVisible.value = true
}
/** 处理RFID标签选择确认 */
function handleRfidTagConfirm(selectedRfidTags) {
if (selectedRfidTags.length > 0) {
const rfidTag = selectedRfidTags[0]
// 使用标签编码作为RFID标签值
// form.value.items[currentEditingRowIndex.value].rfidTagIds = rfidTag.tagCode
inventoryDetailList.value[currentEditingRowIndex.value].rfidTagIds = rfidTag.tagCode
}
}
/** 处理物资选择确认 */
function handleMaterialConfirm(selectedMaterials) {
......@@ -1204,15 +862,17 @@ function handlePrint(row) {
margin-bottom: 20px;
padding: 10px;
border: 1px solid #eee;
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 10px;
}
.info-row {
display: flex;
margin-bottom: 10px;
flex-direction: column;
}
.info-label {
width: 120px;
font-weight: bold;
margin-right: 10px;
margin-bottom: 5px;
}
.table-container {
margin-top: 20px;
......@@ -1245,11 +905,11 @@ function handlePrint(row) {
</div>
<div class="info-row">
<span class="info-label">仓库:</span>
<span>${orderData.warehouseId}</span>
<span>${orderData.warehouseName}</span>
</div>
<div class="info-row">
<span class="info-label">供应商:</span>
<span>${orderData.supplierId}</span>
<span>${orderData.supplierName}</span>
</div>
<div class="info-row">
<span class="info-label">总数量:</span>
......@@ -1261,7 +921,7 @@ function handlePrint(row) {
</div>
<div class="info-row">
<span class="info-label">申请人:</span>
<span>${orderData.applicantId}</span>
<span>${orderData.applicantName}</span>
</div>
<div class="info-row">
<span class="info-label">申请时间:</span>
......@@ -1298,7 +958,7 @@ function handlePrint(row) {
orderData.items.forEach(detail => {
printContent += `
<tr>
<td>${detail.materialName}</td>
<td>${detail.wmsMaterial.materialName}</td>
<td>${detail.planQuantity}</td>
<td>${detail.actualQuantity}</td>
<td>${detail.unit}</td>
......@@ -1344,55 +1004,6 @@ function handlePrint(row) {
})
}
function CreatePrintPage() {
LODOP = getLodop(document.getElementById('LODOP1'), document.getElementById('LODOP_EM1'));
LODOP.PRINT_INITA(0, 0, 800, 1600, "打印控件功能演示_Lodop功能_打印条码");
LODOP.ADD_PRINT_BARCODE(28, 34, 307, 47, "128A", "123456789012");
LODOP.ADD_PRINT_BARCODE(88, 32, 206, 78, "128B", "123456789012");
LODOP.SET_PRINT_STYLEA(0, "FontSize", 18);
LODOP.ADD_PRINT_BARCODE(107, 255, 161, 64, "128C", "888888");
LODOP.SET_PRINT_STYLEA(0, "Color", "#FF0000");
LODOP.ADD_PRINT_BARCODE(179, 42, 130, 47, "128Auto", "12345678901");
LODOP.ADD_PRINT_BARCODE(252, 42, 153, 54, "EAN8", "12345678");
LODOP.SET_PRINT_STYLEA(0, "Angle", 180);
LODOP.ADD_PRINT_BARCODE(173, 244, 235, 172, "EAN13", "1234567890123");
LODOP.SET_PRINT_STYLEA(0, "Angle", 35);
LODOP.ADD_PRINT_BARCODE(351, 34, 360, 36, "EAN128A", "123456789012");
LODOP.SET_PRINT_STYLEA(0, "ShowBarText", 0);
LODOP.ADD_PRINT_BARCODE(403, 34, 360, 47, "EAN128B", "123456789012");
LODOP.SET_PRINT_STYLEA(0, "AlignJustify", 2);
LODOP.ADD_PRINT_BARCODE(462, 34, 360, 47, "EAN128C", "123456789012");
LODOP.ADD_PRINT_BARCODE(513, 34, 360, 47, "Code39", "*123ABC4567890*");
LODOP.SET_PRINT_STYLEA(0, "Color", "#0000FF");
LODOP.ADD_PRINT_BARCODE(570, 34, 360, 47, "39Extended", "*1234567890*");
LODOP.ADD_PRINT_BARCODE(621, 34, 360, 47, "2_5interleaved", "123456789012");
LODOP.ADD_PRINT_BARCODE(677, 34, 360, 47, "2_5industrial", "123456789012");
LODOP.ADD_PRINT_BARCODE(729, 34, 360, 47, "2_5matrix", "123456789012");
LODOP.SET_PRINT_STYLEA(0, "Color", "#408080");
LODOP.ADD_PRINT_BARCODE(787, 34, 360, 47, "UPC_A", "089600124569");
LODOP.ADD_PRINT_BARCODE(844, 34, 135, 64, "UPC_E0", "08960007");
LODOP.ADD_PRINT_BARCODE(65, 595, 45, 95, "UPC_E1", "1122333");
LODOP.SET_PRINT_STYLEA(0, "Angle", 90);
LODOP.ADD_PRINT_BARCODE(87, 676, 57, 122, "UPCsupp2", "12345");
LODOP.SET_PRINT_STYLEA(0, "Angle", 90);
LODOP.ADD_PRINT_BARCODE(359, 435, 78, 181, "UPCsupp5", "123456789012");
LODOP.SET_PRINT_STYLEA(0, "Angle", 90);
LODOP.ADD_PRINT_BARCODE(309, 579, 44, 238, "Code93", "BJ100080");
LODOP.SET_PRINT_STYLEA(0, "Angle", 90);
LODOP.ADD_PRINT_BARCODE(241, 663, 73, 246, "93Extended", "123456789012");
LODOP.SET_PRINT_STYLEA(0, "Angle", -90);
LODOP.ADD_PRINT_BARCODE(583, 419, 58, 251, "MSI", "123456789012");
LODOP.SET_PRINT_STYLEA(0, "Color", "#FF00FF");
LODOP.SET_PRINT_STYLEA(0, "ShowBarText", 0);
LODOP.SET_PRINT_STYLEA(0, "Angle", 90);
LODOP.ADD_PRINT_BARCODE(589, 504, 74, 270, "PostNet", "123456789012");
LODOP.SET_PRINT_STYLEA(0, "Angle", 90);
LODOP.ADD_PRINT_BARCODE(565, 626, 115, 253, "Codabar", "123456789012");
LODOP.SET_PRINT_STYLEA(0, "Angle", 285);
LODOP.ADD_PRINT_BARCODE(30, 405, 176, 67, "PDF417", "我是pdf417value");
LODOP.ADD_PRINT_BARCODE(130, 434, 168, 146, "QRCode", "1234567890版本7的最大值是122个字符123123");
LODOP.SET_PRINT_STYLEA(0, "GroundColor", "#0080FF");
};
function handleExportQrcode(row) {
currentRow.value = row
......@@ -1401,32 +1012,5 @@ function handleExportQrcode(row) {
qrcodePrintDialogVisible.value = true
}
/** 处理二维码打印 */
function handleQrcodePrint(params) {
const { width, height, qrcodeValue } = params
// 使用LODOP打印二维码
const LODOP = getLodop(document.getElementById('LODOP1'), document.getElementById('LODOP_EM1'))
// 设置打印纸张大小(自定义纸张)
// LODOP.PRINT_INITA(0, 0, width * 3.7795275591, height * 3.7795275591, '打印二维码')
// 或者设置为标签打印模式
LODOP.PRINT_INIT('打印二维码')
LODOP.SET_PRINT_PAGESIZE(1, width * 10, height * 10, '自定义二维码标签')
// 添加二维码
// 参数:top, left, width, height, type, value
// 注意:这里的单位是缇(1mm = 10缇)
LODOP.ADD_PRINT_BARCODE(10, 10, width * 10 - 20, height * 10 - 20, 'QRCode', qrcodeValue)
// 设置二维码样式
LODOP.SET_PRINT_STYLEA(0, 'GroundColor', '#FFFFFF')
// 执行打印
LODOP.PRINT_DESIGN() // 打印设计模式,方便调整
// LODOP.PRINT() // 直接打印
}
getList()
</script>
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment