修改打印

master
夜笙歌 2 weeks ago
parent 5cda2e5937
commit 37da31df69

@ -38,14 +38,16 @@
</el-tag>
<el-tag :draggable="true" @dragstart="onDragStart($event, 'select',pid)" class="mx-1" size="large">可选择
</el-tag>
<el-tag :draggable="true" @dragstart="onDragStart($event, 'transverseLine',pid)" class="mx-1" size="large">横线
</el-tag>
<el-tag :draggable="true" @dragstart="onDragStart($event, 'verticalLine',pid)" class="mx-1" size="large">竖线
</el-tag>
<el-tag :draggable="true" @dragstart="onDragStart($event, 'rectangle',pid)" class="mx-1" size="large">矩形
</el-tag>
<el-tag :draggable="true" @dragstart="onDragStart($event, 'circle',pid)" class="mx-1" size="large">圆形
<el-tag :draggable="true" @dragstart="onDragStart($event, 'inputNode',pid)" class="mx-1" size="large">可输入
</el-tag>
<!-- <el-tag :draggable="true" @dragstart="onDragStart($event, 'transverseLine',pid)" class="mx-1" size="large">横线-->
<!-- </el-tag>-->
<!-- <el-tag :draggable="true" @dragstart="onDragStart($event, 'verticalLine',pid)" class="mx-1" size="large">竖线-->
<!-- </el-tag>-->
<!-- <el-tag :draggable="true" @dragstart="onDragStart($event, 'rectangle',pid)" class="mx-1" size="large">矩形-->
<!-- </el-tag>-->
<!-- <el-tag :draggable="true" @dragstart="onDragStart($event, 'circle',pid)" class="mx-1" size="large">圆形-->
<!-- </el-tag>-->
<h4>表单组件</h4>
<el-tag :draggable="true" @dragstart="onDragStart($event, 'text',pid,{name:'deviceName'})" class="mx-1"
size="large">
@ -98,6 +100,10 @@
<SelectNode v-bind="selectNodeProps"
:pageSize="{width:zoom * cmToPx(pageWidth) ,height:zoom * cmToPx(pageHeight) }"></SelectNode>
</template>
<template #node-inputNode="inputNodeProps">
<InputNode v-bind="inputNodeProps"
:pageSize="{width:zoom * cmToPx(pageWidth) ,height:zoom * cmToPx(pageHeight) }"></InputNode>
</template>
</VueFlow>
</div>
</div>
@ -385,8 +391,9 @@ import BarCodeNode from './nodes/barCodeNode.vue';
import QRCodeNode from './nodes/QRCodeNode.vue';
import TimeNode from './nodes/timeNode.vue';
import SelectNode from './nodes/selectNode.vue';
import InputNode from './nodes/inputNode.vue';
import { updatePrintTemplateList } from '@/api/system/printTemplateList';
import { getPrintTemplateInfo, updatePrintTemplateInfo } from '@/api/system/printTemplateInfo';
import { getPrintTemplateInfo, listPrintTemplateInfo, updatePrintTemplateInfo } from '@/api/system/printTemplateInfo';
import { getPrintTemplateNode, getSysPrintTemplateNodeList, updateTemplateNode } from '@/api/system/printTemplateNode';
const router = useRouter();
@ -498,6 +505,7 @@ const save = () => {
height: pageHeight.value,
activeFlag: '1'
});
console.log(nodes.value);
updateTemplateNode(
nodes.value.map(e => {
return {
@ -509,6 +517,7 @@ const save = () => {
height: e.dimensions.height,
x: e.position.x,
y: e.position.y,
parentNode: e.parentNode,
data: JSON.stringify(e.data)
};
})
@ -536,40 +545,52 @@ onMounted(() => {
zoom: 1
});
});
let nodesData = localStorage.getItem('printNodes')
if(nodesData){
nodes.value = JSON.parse(nodesData);
pid.value = nodes.value.find(e => e.name === 'area')?.id;
}
console.log(nodes.value);
// let nodesData = localStorage.getItem('printNodes')
// if(nodesData){
// nodes.value = JSON.parse(nodesData);
// pid.value = nodes.value.find(e => e.name === 'area')?.id;
// }
getPrintTemplateInfo(router.currentRoute.value.query.id).then(e => {
let data = e.data;
pageType.value = data.paperType === '自定义' ? 'zdy' : data.paperType;
listPrintTemplateInfo({ templateListId: router.currentRoute.value.query.id }).then(e => {
let data = e.rows[0] || {};
pageType.value = (data.paperType || 'A4') === '自定义' ? 'zdy' : data.paperType;
pageId.value = data.templateInfoId;
pageWidth.value = data.width;
pageHeight.value = data.height;
pageWidth.value = data.width || 21;
pageHeight.value = data.height || 29.7;
getSysPrintTemplateNodeList({ templateInfoId: data.templateInfoId }).then(v => {
nodes.value = v.data.map(vv => {
nodes.value = v.data.map((vv, index) => {
return {
id: vv.id,
type: vv.type,
name: vv.name,
extent: 'parent',
dimensions: {
width: vv.width,
height: vv.height
},
computedPosition: {
x: parseFloat(vv.x || 0),
y: parseFloat(vv.y || 0),
z: index + 1
},
handleBounds: {
source: null,
target: null
},
position: {
x: vv.x,
y: vv.y
x: parseFloat(vv.x || 0),
y: parseFloat(vv.y || 0)
},
parentNode: vv.parentNode,
data: JSON.parse(vv.data)
};
});
if (nodes.value.length > 0) {
pid.value = nodes.value.find(e => e.name === 'area')?.id;
} else {
clear();
}
console.log(nodes.value);
});
});
});

@ -0,0 +1,138 @@
<template>
<div
:style="{width:props.dimensions.width+'px',height:props.dimensions.height+'px'}">
<NodeResizer :min-width="96 / 2.54/2" :min-height="96 / 2.54/2" :max-width="pageSize.width"
:max-height="pageSize.height" color="#000"
v-if="!props.isView && !props.isHideHandle && props.selected" />
<div class="custom-node"
:style="{...border(),textAlign:props.data.options.align,width:props.dimensions.width+'px',lineHeight:props.dimensions.height+'px',height:props.dimensions.height+'px',pointerEvents:props.isView?'auto': 'none'}">
<el-input class="inputEl" v-model="text" style="width: 100%;height: 100%"
v-if="!props.isPrint" />
<div class="printDiv" :style="{justifyContent: props.data.options.verticalAlign || 'center'}"
v-if="props.isPrint">
<span class="span" :style="{textAlign: props.data.options.horizontalAlign || 'center'}">
{{ text }}
</span>
</div>
</div>
</div>
</template>
<script setup>
import { defineProps } from 'vue';
import { NodeResizer } from '@vue-flow/node-resizer';
const props = defineProps({
isView: {
type: Boolean,
required: false
},
isPrint: {
type: Boolean,
required: false
},
isHideHandle: {
type: Boolean,
required: false
},
selected: {
type: Boolean,
required: false
},
data: {
type: Object,
required: true
},
dimensions: {
type: Object,
required: true
},
pageSize: {
type: Object,
required: true
},
pageData: {
type: Object,
required: true
}
});
const text = ref('');
const options = ref([]);
const getEleData = () => {
if (props.isView) {
options.value = props.data.options.selectOptions || [];
} else {
options.value = props.data.options.selectOptions || [];
}
};
const spanChange = (val) => {
text.value = val;
};
onMounted(() => {
getEleData();
});
watch(() => JSON.parse(JSON.stringify(props.data.options.selectOptions)), (obj1, obj2) => {
if (JSON.stringify(obj1) !== JSON.stringify(obj2)) {
getEleData();
}
}, { deep: true });
watch(() => JSON.parse(JSON.stringify(props.data.options.default)), (obj1, obj2) => {
if (JSON.stringify(obj1) !== JSON.stringify(obj2)) {
text.value = props.data.options.default;
}
}, { deep: true, immediate: true });
const border = () => {
let res = {};
if (props.data.options.border) {
let top = props.data.options.border.find(e => e.type === 'top');
let right = props.data.options.border.find(e => e.type === 'right');
let bottom = props.data.options.border.find(e => e.type === 'bottom');
let left = props.data.options.border.find(e => e.type === 'left');
if (top.isShow) {
res['borderTop'] = `${top.width}px ${top.borderType} ${top.color}`;
}
if (right.isShow) {
res['borderRight'] = `${right.width}px ${right.borderType} ${right.color}`;
}
if (bottom.isShow) {
res['borderBottom'] = `${bottom.width}px ${bottom.borderType} ${bottom.color}`;
}
if (left.isShow) {
res['borderLeft'] = `${left.width}px ${left.borderType} ${left.color}`;
}
}
return res;
};
</script>
<style scoped lang="less">
.custom-node {
position: absolute;
}
.printDiv {
min-width: 20px;
width: 100%;
height: 100%;
display: flex;
flex-direction: column;
.span {
text-align: center;
width: 100%;
}
}
.inputEl {
border-bottom: 1px solid #409EFF;
:deep(.el-input__wrapper) {
padding: 0 !important;
background-color: transparent;
box-shadow: none;
}
}
</style>

@ -13,7 +13,7 @@ const cmToPx = (cm) => {
const getOption = (e, name) => {
let commonOption = { field: name };
let commonOption = { field: name || '' };
if (e === 'text') {
return {
...commonOption,
@ -53,6 +53,19 @@ const getOption = (e, name) => {
type: 'left', isShow: false, width: 1, color: '#000', borderType: 'solid'
}]
};
} else if (e === 'inputNode') {
return {
...commonOption,
default: '',
selectOptions: [],
horizontalAlign: 'center',
verticalAlign: 'center',
border: [{ type: 'top', isShow: false, width: 1, color: '#000', borderType: 'solid' }, {
type: 'right', isShow: false, width: 1, color: '#000', borderType: 'solid'
}, { type: 'bottom', isShow: false, width: 1, color: '#000', borderType: 'solid' }, {
type: 'left', isShow: false, width: 1, color: '#000', borderType: 'solid'
}]
};
} else {
return {};
}
@ -70,6 +83,8 @@ const getNodeSize = (e) => {
return { width: cmToPx(8), height: cmToPx(1) };
} else if (e === 'select') {
return { width: cmToPx(4), height: cmToPx(1) };
} else if (e === 'inputNode') {
return { width: cmToPx(4), height: cmToPx(1) };
} else {
return { width: cmToPx(5), height: cmToPx(2) };
}

@ -30,6 +30,11 @@
:pageSize="{width: cmToPx(pageWidth) ,height: cmToPx(pageHeight) }"
v-bind="i"></SelectNode>
</template>
<template v-if="i.type === 'inputNode'">
<InputNode :isView="true" :isPrint="isPrint" :pageData="pageData"
:pageSize="{width: cmToPx(pageWidth) ,height: cmToPx(pageHeight) }"
v-bind="i"></InputNode>
</template>
</div>
</div>
@ -74,6 +79,7 @@ import BarCodeNode from './nodes/barCodeNode.vue';
import QRCodeNode from './nodes/QRCodeNode.vue';
import TimeNode from './nodes/timeNode.vue';
import SelectNode from './nodes/selectNode.vue';
import InputNode from './nodes/inputNode.vue';
const printType = ref(0);
const printers = ref([
@ -238,7 +244,7 @@ defineExpose({
/* 打印样式:仅显示图片区域 */
@media print {
@page {
margin: 0;

Loading…
Cancel
Save