rev:拍照

This commit is contained in:
2025-12-06 15:33:06 +08:00
parent adbb171a73
commit d9210a08f4
6 changed files with 562 additions and 111 deletions

View File

@@ -53,6 +53,16 @@
>
打印
</el-button>
<el-button
slot="right"
class="filter-item"
type="success"
icon="el-icon-printer"
size="mini"
@click="printPreview"
>
打印预览
</el-button>
</crudOperation>
<!--表单组件-->
<el-dialog
@@ -79,13 +89,13 @@
</el-select>
</el-form-item>
<el-form-item label="载具编码" prop="storagevehicle_code">
<el-input v-model="form.storagevehicle_code" style="width: 200px;" :disabled="crud.status.edit > 0" />
<el-input v-model="form.storagevehicle_code" style="width: 200px;" :disabled="crud.status.edit > 0"/>
</el-form-item>
<el-form-item label="载具名称" prop="storagevehicle_name">
<el-input v-model="form.storagevehicle_name" style="width: 200px;" />
<el-input v-model="form.storagevehicle_name" style="width: 200px;"/>
</el-form-item>
<el-form-item label="载具重量" prop="weigth">
<el-input-number v-model="form.weigth" :precision="1" style="width: 200px;" />
<el-input-number v-model="form.weigth" :precision="1" style="width: 200px;"/>
</el-form-item>
<el-form-item label="是否启用">
<el-radio v-model="form.is_used" label="0">否</el-radio>
@@ -106,13 +116,13 @@
style="width: 100%;"
@selection-change="crud.selectionChangeHandler"
>
<el-table-column type="selection" width="55" />
<el-table-column v-if="false" prop="storagevehicle_id" label="载具标识" />
<el-table-column prop="storagevehicle_type_name" label="载具类型" :formatter="formattType" />
<el-table-column prop="storagevehicle_code" label="载具编码" />
<el-table-column prop="storagevehicle_name" label="载具名称" />
<el-table-column prop="pcsn" label="绑定物料" />
<el-table-column prop="weigth" label="托盘重量" />
<el-table-column type="selection" width="55"/>
<el-table-column v-if="false" prop="storagevehicle_id" label="载具标识"/>
<el-table-column prop="storagevehicle_type_name" label="载具类型" :formatter="formattType"/>
<el-table-column prop="storagevehicle_code" label="载具编码"/>
<el-table-column prop="storagevehicle_name" label="载具名称"/>
<el-table-column prop="pcsn" label="绑定物料"/>
<el-table-column prop="weigth" label="托盘重量"/>
<el-table-column label="是否启用" align="center" prop="is_used">
<template slot-scope="scope">
<el-switch
@@ -143,19 +153,21 @@
</el-table-column>
</el-table>
<!--分页组件-->
<pagination />
<pagination/>
</div>
</div>
</template>
<script>
import crudStoragevehicleinfo from '@/views/wms/basedata/storagevehicleinfo/storagevehicleinfo'
import CRUD, { crud, form, header, presenter } from '@crud/crud'
import CRUD, {crud, form, header, presenter} from '@crud/crud'
import rrOperation from '@crud/RR.operation'
import crudOperation from '@crud/CRUD.operation'
import udOperation from '@crud/UD.operation'
import pagination from '@crud/Pagination'
import { getLodop } from '@/assets/js/lodop/LodopFuncs'
import {getLodop} from '@/assets/js/lodop/LodopFuncs'
import JsBarcode from 'jsbarcode'
const defaultForm = {
storagevehicle_id: null,
@@ -186,7 +198,7 @@ const defaultForm = {
export default {
name: 'Storagevehicleinfo',
dicts: ['storagevehicle_type', 'is_used'],
components: { pagination, crudOperation, rrOperation, udOperation },
components: {pagination, crudOperation, rrOperation, udOperation},
mixins: [presenter(), header(), form(defaultForm), crud()],
cruds() {
return CRUD({
@@ -194,7 +206,7 @@ export default {
url: 'api/storagevehicleinfo',
idField: 'storagevehicle_id',
sort: 'storagevehicle_id,desc',
crudMethod: { ...crudStoragevehicleinfo },
crudMethod: {...crudStoragevehicleinfo},
optShow: {
add: true,
edit: false,
@@ -220,26 +232,26 @@ export default {
classes1: [],
rules: {
is_delete: [
{ required: true, message: '不能为空', trigger: 'blur' }
{required: true, message: '不能为空', trigger: 'blur'}
],
is_used: [
{ required: true, message: '不能为空', trigger: 'blur' }
{required: true, message: '不能为空', trigger: 'blur'}
],
storagevehicle_type: [
{ required: true, message: '不能为空', trigger: 'blur' }
{required: true, message: '不能为空', trigger: 'blur'}
],
storagevehicle_code: [
{ required: true, message: '不能为空', trigger: 'blur' }
{required: true, message: '不能为空', trigger: 'blur'}
],
storagevehicle_name: [
{ required: true, message: '不能为空', trigger: 'blur' }
{required: true, message: '不能为空', trigger: 'blur'}
],
overstruct_type: [
{ required: true, message: '不能为空', trigger: 'blur' }
{required: true, message: '不能为空', trigger: 'blur'}
],
num: [
{ required: true, message: '不能为空', trigger: 'blur' },
{ validator: numberOne }
{required: true, message: '不能为空', trigger: 'blur'},
{validator: numberOne}
]
}
}
@@ -283,48 +295,92 @@ export default {
formattType(row) {
return this.dict.label.storagevehicle_type[row.storagevehicle_type]
},
printPreview() {
const _selectData = this.$refs.table.selection
if (!_selectData || _selectData.length < 1) {
this.crud.notify('请选择一条记录', CRUD.NOTIFICATION_TYPE.INFO)
return
}
let container = document.getElementById('barcodePreview')
if (!container) {
container = document.createElement('div')
container.id = 'barcodePreview'
document.body.appendChild(container)
}
container.innerHTML = ''
container.style.display = 'flex'
container.style.flexDirection = 'column'
container.style.alignItems = 'center'
container.style.background = '#fff'
container.style.padding = '20px'
const mm2px = mm => mm * 3.78
const paperWidth = mm2px(80)
const paperHeight = mm2px(60)
const barcodeHeight = mm2px(40)
const textGap = mm2px(1)
const barcodeWidth = mm2px(75) // 条码更宽
_selectData.forEach(item => {
const code = item.storagevehicle_code || ''
const pageDiv = document.createElement('div')
pageDiv.style.width = `${paperWidth}px`
pageDiv.style.height = `${paperHeight}px`
pageDiv.style.display = 'flex'
pageDiv.style.flexDirection = 'column'
pageDiv.style.alignItems = 'center'
pageDiv.style.justifyContent = 'center'
pageDiv.style.marginBottom = '20px'
pageDiv.style.border = '1px solid #ccc'
container.appendChild(pageDiv)
const canvas = document.createElement('canvas')
canvas.width = barcodeWidth
canvas.height = barcodeHeight
pageDiv.appendChild(canvas)
JsBarcode(canvas, code, {
format: "CODE128",
width: 2, // 条码线宽适中
height: barcodeHeight,
displayValue: false
})
const textDiv = document.createElement('div')
textDiv.innerText = code
textDiv.style.fontSize = '14px'
textDiv.style.fontWeight = 'bold'
textDiv.style.textAlign = 'center'
textDiv.style.marginTop = `${textGap}px`
pageDiv.appendChild(textDiv)
})
this.crud.notify(`已生成 ${_selectData.length} 条预览`, CRUD.NOTIFICATION_TYPE.INFO)
},
print() {
const _selectData = this.$refs.table.selection
if (!_selectData || _selectData.length < 1) {
this.crud.notify('请选择一条记录', CRUD.NOTIFICATION_TYPE.INFO)
return
}
// 获取 LODOP 对象
const LODOP = getLodop()
if (!LODOP) {
// getLodop 内部已经处理了错误提示
return
}
if (!LODOP) return
try {
LODOP.PRINT_INIT('载具标签打印')
LODOP.SET_SHOW_MODE('HIDE_DISBUTTIN_SETUP', 1)
// 批量打印选中的记录
for (let i = 0; i < _selectData.length; i++) {
const code = _selectData[i].storagevehicle_code
const name = _selectData[i].storagevehicle_name || code
// 打印纸张大小60 * 80
// 参数说明SET_PRINT_PAGESIZE(方向, 宽度, 高度, 单位)
// 方向0-纵向1-横向
LODOP.SET_PRINT_PAGESIZE(0, '60mm', '80mm', '')
// 添加条码
// 条码位置:水平居中 (60-50)/2 = 5mm垂直居中 (80-30)/2 = 25mm
// 条码大小50mm宽 * 30mm高可根据实际需要调整
LODOP.ADD_PRINT_BARCODE('25mm', '5mm', '30mm', '50mm', '128Auto', code)
// 如果需要打印多份,使用 NEWPAGE 分隔
if (i < _selectData.length - 1) {
LODOP.NEWPAGE()
}
const code = _selectData[i].storagevehicle_code || ''
LODOP.SET_PRINT_PAGESIZE(1, `80mm`, `60mm`, '1')
LODOP.ADD_PRINT_BARCODE(`7.5mm`, `10mm`, `62.5mm`, `47.5mm`, '128Auto', code)
if (i < _selectData.length - 1) LODOP.NEWPAGE()
}
// 执行打印(会在客户端电脑上执行)
LODOP.PRINT()
this.crud.notify(`成功打印 ${_selectData.length} 条记录`, CRUD.NOTIFICATION_TYPE.SUCCESS)
this.crud.toQuery()
} catch (error) {
@@ -332,6 +388,8 @@ export default {
this.crud.notify('打印失败:' + (error.message || '未知错误'), CRUD.NOTIFICATION_TYPE.ERROR)
}
}
}
}
</script>