打印生产计划单

pull/4/head
qiuhongwu 8 months ago
parent 6a1cce6ed4
commit da89c798b8

@ -168,7 +168,7 @@ import { getIntDictOptions, getStrDictOptions, DICT_TYPE } from '@/utils/dict'
import { dateFormatter, formatDate } from '@/utils/formatTime' import { dateFormatter, formatDate } from '@/utils/formatTime'
import download from '@/utils/download' import download from '@/utils/download'
import * as PlanApi from '@/api/heli/plan' import * as PlanApi from '@/api/heli/plan'
import Print from './planprint.vue' // import Print from './productionPrint.vue' //
import * as UserApi from '@/api/system/user' import * as UserApi from '@/api/system/user'
defineOptions({ name: 'Plan' }) defineOptions({ name: 'Plan' })

@ -0,0 +1,748 @@
<template>
<Dialog title="打印预览" v-model="dialogVisible" width="1000">
<!-- 打印预览 -->
<div class="print-wrap page" ref="print">
<table border="2" cellspacing="0" id="table" style="height: 27cm;">
<tbody>
<tr>
<td colspan="2">
<div style="width: 100px; text-align: center">
<img :src="logoDataUrl" style="width: 100%" alt="" />
</div>
</td>
<td colspan="6">
<span style="font-size: 20px; font-weight: 700">模具生产计划单</span>
</td>
<td colspan="2" style="padding: 5px 0">
<div style="border-bottom: 1px solid #666; padding-bottom: 5px">项目编号</div>
<div style="padding-top: 5px">{{ formData.code }}</div>
</td>
</tr>
</tbody>
<tbody>
<tr>
<td colspan="2"> 客户名称 </td>
<td colspan="5">
<span>{{ formData.customer.name }}</span>
</td>
<td colspan="1">{{ formData.customer.brief }}</td>
<td> 编码 </td>
<td>{{ formData.customer.code }} </td>
</tr>
</tbody>
<tr>
<td colspan="2"> 项目名称 </td>
<td colspan="6">
{{ formData.projectName }}
</td>
<td> 业务员 </td>
<td>{{ formData.businessManName }} </td>
</tr>
<tr>
<td colspan="2"> 项目工期 </td>
<td style="padding: 0 5px"> </td>
<td colspan="1">
<span>{{ formatDate(new Date(formData.projectStartTime), 'YYYY-MM-DD') }}</span>
</td>
<td colspan="1"></td>
<td colspan="1">{{ formatDate(new Date(formData.projectEndTime), 'YYYY-MM-DD') }}</td>
<td>天数</td>
<td colspan="1">{{ betweenDay(new Date(formData.projectStartTime), new Date(formData.projectEndTime)) }}</td>
<td colspan="1"> 是否紧急 </td>
<td colspan="1">{{ getDictLabel(DICT_TYPE.HELI_COMMON_IS_OR_NOT, formData.isUrgency) }} </td>
</tr>
<tr>
<td colspan="2"> 项目负责: </td>
<td colspan="2">{{ `111` }} </td>
<td colspan="2">
<div style="width: 100%; display: flex; justify-content: center; font-size: 12px">
<div>
<div>类别</div>
<div>性质</div>
</div>
<div style="border: 1px solid #333">
<div style="border-bottom: 1px solid #333; padding: 0 5px; height: 50%">{{ getDictLabel(DICT_TYPE.HELI_BUSINESS_LINE, formData.businessLine) }}</div>
<div style="padding: 0 5px; height: 50%">{{ getDictLabel(DICT_TYPE.HELI_PROJECT_PROPERTY, formData.property) }}</div>
</div>
</div>
</td>
<td colspan="4">
<div style="display: flex; justify-content: space-between">
<div style="width: 100%; font-size: 12px; display: flex; flex-direction: column">
<div style="text-align: left; width: 100; margin-left: 10px">自客户提供资料</div>
<div id="fruitForm" style="display: flex; justify-content: flex-start; align-items: center">
<span class="checkbox" v-if="isSelected.includes(1) == false"></span>
<span class="checkbox" v-else-if="isSelected.includes(1) == true"></span>
<label for="checkbox1">修理内容</label>
<span class="checkbox" v-if="isSelected.includes(2) == false"></span>
<span class="checkbox" v-else-if="isSelected.includes(2) == true"></span>
<label for="checkbox2">技术协议</label>
<span class="checkbox" v-if="isSelected.includes(3) == false"></span>
<span class="checkbox" v-else-if="isSelected.includes(3) == true"></span>
<label for="checkbox3">图纸/数模</label>
</div>
</div>
</div>
</td>
</tr>
<tr>
<td colspan="2">是否要工:</td>
<td>{{ `` }}</td>
<td>开始日期</td>
<td>{{ `2024/1/15` }}</td>
<td>结束日期</td>
<td>{{ `2024/1/15` }}</td>
<td>负责人</td>
<td colspan="2">{{ `2024/1/15` }}</td>
</tr>
<tbody>
<tr>
<td colspan="10">
<div style="text-align: left; width: 100%">子项目信息:</div>
</td>
</tr>
<tr>
<td class="xh"> 序号 </td>
<td colspan="3"> 名称/编号 </td>
<td> 设备型号 </td>
<td> 数量 </td>
<td> 主要材料 </td>
<td> 毛坯日期 </td>
<td> 2D/日期 </td>
<td> 3D/日期 </td>
</tr>
<tr v-for="(item,idx) in formData.projectOrderSubs" :key="idx">
<td class="xh"> {{ idx+1 }} </td>
<td colspan="3" style="padding: 0 0">
<div style="display: flex; flex-direction: column; justify-content: space-between">
<span style="border-bottom: 1px solid #666"> {{item.name}} </span>
<span v-if="!item.deviceModel">&nbsp;</span>
<span v-else>{{item.deviceModel}}</span>
</div>
</td>
<td>{{item.compositionName}} </td>
<td>{{item.amount}} </td>
<td>{{ `H13` }} </td>
<td> {{ `2024/1/15` }} </td>
<td style="padding: 0 0">
<div style="display: flex; flex-direction: column; justify-content: space-between">
<span style="border-bottom: 1px solid #666"> {{ `2024/1/15` }} </span>
<span>{{ `name` }}</span>
</div>
</td>
<td style="padding: 0 0">
<div style="display: flex; flex-direction: column; justify-content: space-between">
<span style="border-bottom: 1px solid #666"> {{ `2024/1/15` }} </span>
<span>{{ `name` }}</span>
</div>
</td>
</tr>
</tbody>
<tbody v-if="formData.projectOrderSubs.length<8">
<tr v-for="item in (8-formData.projectOrderSubs.length)" :key="item">
<td> {{item+(formData.projectOrderSubs.length)}}</td>
<td colspan="3">&nbsp; </td>
<td> &nbsp; </td>
<td> &nbsp; </td>
<td>&nbsp; </td>
<td> &nbsp; </td>
<td> &nbsp; </td>
<td>&nbsp; </td>
</tr>
</tbody>
<tbody>
<tr>
<td class="xh"> 序号 </td>
<td colspan="3"> 工艺流程 </td>
<td> 开始日期 </td>
<td> 结束日期 </td>
<td colspan="2"> 责任人 </td>
<td colspan="2"> 备注 </td>
</tr>
<tr v-for="(its,index) in planData.craftInfos" :key="its.index">
<td class="xh"> {{ index+1 }} </td>
<td colspan="3"> {{ its.name }}</td>
<td> </td>
<td> </td>
<td colspan="2"> </td>
<td colspan="2"> </td>
</tr>
</tbody>
<tbody>
<tr>
<td colspan="10">
<div style="
text-align: left;
width: 100%;
display: flex;
flex-direction: column;
padding-left: 15px;
">
<span>说明:</span>
<span>1.每个项目的零部件制作工艺材料材质硬度要求必须统一出现任何问题各工程师负责!</span>
<span>2.模具调试试模需要根据客户要求自己安排调试我司根据需要安排人员参与配合</span>
</div>
</td>
</tr>
</tbody>
<tbody>
<tr>
<td colspan="4" style="width: 33%"> 编制/日期 </td>
<td colspan="3" style="width: 33%"> 审核/日期 </td>
<td colspan="3" style="width: 33%"> 批准/日期 </td>
</tr>
<tr>
<td colspan="4">{{formData.creatorName}}</td>
<td colspan="3">{{formData.auditUserName}}</td>
<td colspan="3">{{formData.approveUserName}}</td>
</tr>
<tr>
<td colspan="4">{{formatDate(new Date(formData.createTime), 'YYYY-MM-DD')}}</td>
<td colspan="3">{{formatDate(new Date(formData.auditTime), 'YYYY-MM-DD')}}</td>
<td colspan="3">{{formatDate(new Date(formData.approveTime), 'YYYY-MM-DD')}}</td>
</tr>
</tbody>
</table>
<div v-if="formData.projectOrderSubs.length>2">
<!-- 附页是否开启需要判断 根据子项目信息-->
<table border="2" cellspacing="0" id="table1">
<tbody>
<tr>
<td colspan="2">
<div style="width: 100px; text-align: center">
<img :src="logoDataUrl" style="width: 100%" alt="" />
</div>
</td>
<td colspan="6">
<span style="font-size: 20px; font-weight: 700">模具生产计划单-附页</span>
</td>
<td colspan="2" style="padding: 5px 0">
<div style="border-bottom: 1px solid #666; padding-bottom: 5px">项目编号</div>
<div style="padding-top: 5px">{{ `formData.code` }}</div>
</td>
</tr>
</tbody>
<tbody>
<tr>
<td colspan="2"> 客户名称 </td>
<td colspan="5">
<span>{{ '公司名字' }}</span>
</td>
<td colspan="1">{{ `密称` }}</td>
<td> 编码 </td>
<td>{{ `1091` }} </td>
</tr>
</tbody>
<tr>
<td colspan="2"> 项目名称 </td>
<td colspan="6">
{{ `系列模具` }}
</td>
<td> 业务员 </td>
<td>{{ `xxx` }} </td>
</tr>
<tr>
<td colspan="2"> 项目工期 </td>
<td style="padding: 0 5px"> </td>
<td colspan="1">
<span>{{ '2024/1/11' }}</span>
</td>
<td colspan="1"></td>
<td colspan="1">{{ `2024/4/11` }}</td>
<td>天数</td>
<td colspan="1">{{ `92` }}</td>
<td colspan="1"> 是否紧急 </td>
<td colspan="1">{{ `` }} </td>
</tr>
<tr>
<td colspan="10">
<div style="font-size: 18px; height: 50px; line-height: 50px">
<span>接上页</span>
</div>
</td>
</tr>
<tbody>
<tr>
<td colspan="10">
<div style="text-align: left; width: 100%">子项目信息:</div>
</td>
</tr>
<tr>
<td class="xh"> 序号 </td>
<td colspan="3"> 名称/编号 </td>
<td> 设备型号 </td>
<td> 数量 </td>
<td> 主要材料 </td>
<td> 毛坯日期 </td>
<td> 2D/日期 </td>
<td> 3D/日期 </td>
</tr>
<tr v-for="item in 15" :key="item.index">
<td class="xh"> {{ item + 8 }} </td>
<td colspan="3" style="padding: 0 0">
<div style="display: flex; flex-direction: column; justify-content: space-between">
<span style="border-bottom: 1px solid #666"> {{ `名称` }} </span>
<span>{{ `编号` }}</span>
</div>
</td>
<td>{{ `LP 100L` }} </td>
<td>{{ `1` }} </td>
<td>{{ `H13` }} </td>
<td> {{ `2024/1/15` }} </td>
<td style="padding: 0 0">
<div style="display: flex; flex-direction: column; justify-content: space-between">
<span style="border-bottom: 1px solid #666"> {{ `2024/1/15` }} </span>
<span>{{ `name` }}</span>
</div>
</td>
<td style="padding: 0 0">
<div style="display: flex; flex-direction: column; justify-content: space-between">
<span style="border-bottom: 1px solid #666"> {{ `2024/1/15` }} </span>
<span>{{ `name` }}</span>
</div>
</td>
</tr>
</tbody>
<tbody>
<tr>
<td colspan="10">
<div style="
text-align: left;
width: 100%;
display: flex;
flex-direction: column;
padding-left: 15px;
">
<span>说明:</span>
<span>1.每个项目的零部件制作工艺材料材质硬度要求必须统一出现任何问题各工程师负责!</span>
<span>2.模具调试试模需要根据客户要求自己安排调试我司根据需要安排人员参与配合</span>
</div>
</td>
</tr>
</tbody>
<tbody>
<tr>
<td colspan="4" style="width: 33%"> 编制/日期 </td>
<td colspan="3" style="width: 33%"> 审核/日期 </td>
<td colspan="3" style="width: 33%"> 批准/日期 </td>
</tr>
<tr>
<td colspan="4">{{formData.creatorName}}</td>
<td colspan="3">{{formData.auditUserName}}</td>
<td colspan="3">{{formData.approveUserName}}</td>
</tr>
<tr>
<td colspan="4">{{formatDate(new Date(formData.createTime), 'YYYY-MM-DD')}}</td>
<td colspan="3">{{formatDate(new Date(formData.auditTime), 'YYYY-MM-DD')}}</td>
<td colspan="3">{{formatDate(new Date(formData.approveTime), 'YYYY-MM-DD')}}</td>
</tr>
</tbody>
</table>
</div>
</div>
<template #footer>
<!-- 打印 -->
<el-button @click="onPrint" type="primary">打印</el-button>
<el-button @click="outopen"></el-button>
</template>
</Dialog>
</template>
<script setup lang="ts">
// import { ref, reactive } from 'vue'
import * as PlanApi from '@/api/heli/plan'
import * as PlanSubApi from '@/api/heli/plansub'
import * as ProjectOrderApi from '@/api/heli/projectorder'
import { getIntDictOptions, getStrDictOptions, DICT_TYPE, getDictLabel } from '@/utils/dict'
import { betweenDay, dateFormatter, formatDate } from '@/utils/formatTime'
import { Check } from '@element-plus/icons-vue'
import { getCustomer } from '@/api/heli/customer'
import { getOperateLogPage } from '@/api/system/operatelog'
import urlimg from '@/assets/imgs/exlogo.png'
const logoDataUrl = ref('') // LogoBase64URL
const dialogVisible = ref(false) //
const onPrint = () => {
// dom
const printNode = document.querySelector('.print-wrap')
if (!printNode) return
//
const newIframe: any = document.createElement('iframe')
newIframe.setAttribute(
'style',
'width:0px;height:0px;position:absolute;left:-9999px;top:-9999px;'
)
newIframe.setAttribute('align', 'center')
document.body.appendChild(newIframe)
//
let doc: any = null
doc = newIframe.contentWindow.document
doc.write(`
<style type="text/css">
/* 浏览器打印基本样式 */
.page {
width: 21cm;
min-height: 29.7cm;
padding: 10mm;
margin: 20px auto;
border: 1px #d3d3d3 solid;
border-radius: 5px;
background: white;
box-shadow: 0 0 5px rgba(0, 0, 0, 0.1);
position: relative;
font-size: 14px !important;
}
@page {
size: A4;
margin:1cm;
}
@media print {
.page {
margin: 10mm;
border: initial;
border-radius: initial;
width: initial;
min-height: initial;
box-shadow: initial;
background: initial;
page-break-after: always;
}
}
table {
width: 100%; /* 让表格宽度100%占满其父元素宽度 */
height: auto; /* 高度根据内容自适应 */
font-size: 14px;
text-align: center;
border-collapse: collapse;
margin-top: 5mm; /* 添加顶部外边距,替代原先的页内边距 */
tr{
td {
padding: 5px 0;
border: 1px solid #333;
}
}
}
.xh {
width: 50px !important;
}
.checkbox {
border: 2px solid #999;
width: 10px;
height: 10px;
display: flex;
justify-content: center;
align-items: center;
margin-left:10px ;
}
</style>
<div>
${printNode.innerHTML}
</div>`)
doc.close()
//
setTimeout(() => {
newIframe.contentWindow.focus()
newIframe.contentWindow.print()
document.body.removeChild(newIframe) //
dialogVisible.value = false
}, 100)
}
const outopen = () => {
dialogVisible.value = false
}
const queryParams: any = ref({
code: undefined
})
const isSelected = ref([1, 3])
const formData = ref({
id: undefined,
code: undefined,
orderStatus: 4,
deliveryStatus: 1,
businessDeptId: undefined,
customerId: undefined,
projectName: undefined,
businessLine: undefined,
blueprintNo: undefined,
hasPrice: 1,
price: undefined,
currency: '1',
projectStartTime: undefined,
projectEndTime: undefined,
isUrgency: 0,
property: 1,
referenceTechnology: undefined,
hasAlter: 0,
lastAlterTime: undefined,
qualityRequirement: undefined,
remark: undefined,
hasContract: 0,
hasTechnologyProtocol: 0,
hasBlueprint: 0,
blueprintRemark: undefined,
status: 1,
businessMan: undefined,
createTime: new Date(),
projectOrderSubs: [],
attachments: [],
operateLogs: [],
contractNo: undefined,
active: '',
activeOpinion: '',
isSnapshot: 0,
snapshotId: undefined,
snapshotCode: undefined,
orderTime: new Date(),
snapshotOrderTime: undefined,
alterFieldNames: [],
customer: {},
creatorName: undefined,
auditTime: undefined,
auditUserName: undefined,
approveTime: undefined,
approveUserName: undefined
})
const planData = ref({
id: undefined,
projectId: undefined,
projectOwner: undefined,
hasCraft: undefined,
craftOwner: undefined,
craftStartTime: undefined,
craftEndTime: undefined,
editor: undefined,
editorDate: undefined,
auditor: undefined,
auditDate: undefined,
approver: undefined,
approveDate: undefined,
description: undefined,
status: undefined,
createTime: undefined,
operateLogs: [],
projectOrderSubs: [],
projectPlanSubs: [],
craftInfos: [],
craftContent: undefined
})
/** 打开弹窗 */
const open = async (id: number) => {
//
// LogoBase64URL
const logoImage = new Image()
logoImage.src = urlimg // Logo
logoImage.onload = () => {
const canvas = document.createElement('canvas')
canvas.width = logoImage.width
canvas.height = logoImage.height
const context = canvas.getContext('2d')
context.drawImage(logoImage, 0, 0)
const base64String = canvas.toDataURL('image/png')
logoDataUrl.value = base64String
}
dialogVisible.value = true
resetForm()
//
planData.value = await PlanApi.getPlan(id)
//
await handleInitPlanSub(id)
//
await handleCraftInfo()
formData.value = await ProjectOrderApi.getProjectOrder(planData.value.projectId)
//
formData.value.projectOrderSubs = await ProjectOrderApi.getProjectOrderSubListByProjectOrderId(
planData.value.projectId
)
formData.value.customer = await getCustomer(formData.value.customerId)
// /
let logParams = {
pageNo: 1,
pageSize: 2,
typeList: [9, 10]
}
const logs = await getOperateLogPage(logParams)
if (logs.list && logs.list.length == 2) {
const approveLog = logs.list[0]
const auditLog = logs.list[1]
formData.value.approveTime = approveLog.startTime
formData.value.approveUserName = approveLog.userNickname
formData.value.auditTime = auditLog.startTime
formData.value.auditUserName = auditLog.userNickname
}
}
defineExpose({ open }) // open
const handleCraftInfo = async () => {
if (planData.value.craftContent == null) {
planData.value.craftInfos = []
getIntDictOptions(DICT_TYPE.HELI_CRAFT).forEach((dict) => {
planData.value.craftInfos.push({
id: dict.value,
name: dict.label,
startDate: '',
endDate: '',
owner: '',
description: ''
})
})
} else {
planData.value.craftInfos = eval(planData.value.craftContent)
}
}
const handleInitPlanSub = async (id) => {
//
const queryParams = reactive({
pageNo: 1,
pageSize: 99,
projectPlanId: id
})
planData.value.projectPlanSubs = (await PlanSubApi.getPlanSubPage(queryParams)).list
formData.value.projectOrderSubs.forEach((item) => {
if (planData.value.projectPlanSubs.filter((sub) => sub.projectSubId == item.id).length > 0) {
var subTemp = planData.value.projectPlanSubs.find((sub) => sub.projectSubId == item.id)
item.planSubId = subTemp.id
item.projectPlanId = subTemp.projectPlanId
item.projectId = subTemp.projectId
item.projectSubId = subTemp.projectSubId
item.projectSubShortName = subTemp.projectSubShortName
item.projectSubCode = subTemp.projectSubCode
item.mouldId = subTemp.mouldId
item.equipId = subTemp.equipId
item.blankDate = subTemp.blankDate
item.blankOwner = subTemp.blankOwner
item.twoDimDate = subTemp.twoDimDate
item.twoDimOwner = subTemp.twoDimOwner
item.threeDimDate = subTemp.threeDimDate
item.threeDimOwner = subTemp.threeDimOwner
}
})
console.log(planData.value, 'planData')
console.log(formData.value, 'formData')
}
/** 重置表单 */
const resetForm = () => {
formData.value = {
id: undefined,
code: undefined,
orderStatus: 4,
deliveryStatus: 1,
businessDeptId: undefined,
customerId: undefined,
projectName: undefined,
businessLine: undefined,
blueprintNo: undefined,
hasPrice: 1,
price: undefined,
currency: '1',
projectStartTime: undefined,
projectEndTime: undefined,
isUrgency: 0,
property: 1,
referenceTechnology: undefined,
hasAlter: 0,
lastAlterTime: undefined,
qualityRequirement: undefined,
remark: undefined,
hasContract: 0,
hasTechnologyProtocol: 0,
hasBlueprint: 0,
blueprintRemark: undefined,
status: 1,
businessMan: undefined,
createTime: new Date(),
projectOrderSubs: [],
attachments: [],
operateLogs: [],
contractNo: undefined,
active: '',
activeOpinion: '',
isSnapshot: 0,
snapshotId: undefined,
snapshotCode: undefined,
orderTime: new Date(),
snapshotOrderTime: undefined,
alterFieldNames: [],
customer: {},
creatorName: undefined,
auditTime: undefined,
auditUserName: undefined,
approveTime: undefined,
approveUserName: undefined
}
}
</script>
<style scoped lang="scss">
.page {
width: 22cm;
min-height: 29.7cm;
padding: 10mm;
margin: 20px auto;
border: 1px #d3d3d3 solid;
border-radius: 5px;
background: white;
box-shadow: 0 0 5px rgba(0, 0, 0, 0.1);
position: relative;
font-size: 14px !important;
}
@page {
size: A4;
margin: 0;
}
@media print {
.page {
margin: 0;
border: initial;
border-radius: initial;
width: initial;
min-height: initial;
box-shadow: initial;
background: initial;
page-break-after: always;
}
}
table {
width: 100%; /* 让表格宽度100%占满其父元素宽度 */
height: auto; /* 高度根据内容自适应 */
font-size: 14px;
text-align: center;
border-collapse: collapse;
margin-top: 5mm; /* 添加顶部外边距,替代原先的页内边距 */
tr {
td {
padding: 2px 0;
border: 1px solid #333;
}
}
}
.xh {
width: 50px !important;
}
.checkbox {
border: 2px solid #999;
width: 15px;
height: 15px;
display: flex;
justify-content: center;
align-items: center;
margin-left: 10px;
}
/*
A4的大小21cm*29.7cmwidth:794px;
单位换算1 inch = 2.54 cm 1mm = 96 px 1 cm = 37.79528 px*/
</style>
Loading…
Cancel
Save