| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381 |
- <template>
- <ele-modal
- title="工序流转卡"
- :visible.sync="QRvisible"
- v-if="QRvisible"
- width="900px"
- :maxable="true"
- >
- <div id="printSection" class="flow-card-print">
- <div
- class="flow-card-page"
- v-for="(card, cIndex) in printList"
- :key="cIndex"
- >
- <div class="flow-card-title">工 序 流 转 卡</div>
- <table class="flow-card-header">
- <tr>
- <td class="label">产 品 代 号</td>
- <td class="value">{{ card.topCategoryCode }}</td>
- <td class="label">产 品 名 称</td>
- <td class="value">{{ card.topCategoryName }}</td>
- </tr>
- <tr>
- <td class="label">零(部)件代号</td>
- <td class="value">{{ card.productCode }}</td>
- <td class="label">零(部)件名称</td>
- <td class="value">{{ card.productName }}</td>
- </tr>
- <tr>
- <td class="label">产品批号(编号)</td>
- <td class="value">{{ card.batchNo }}</td>
- <td class="label">原材料本厂合格证号</td>
- <td class="value">{{ card.materialFactoryCertNo }}</td>
- </tr>
- <tr>
- <td class="label">原材料炉(批)号</td>
- <td class="value">{{ card.materialFurnaceNo }}</td>
- <td class="label">半成品合格证号</td>
- <td class="value">{{ card.semiProductCertNo }}</td>
- </tr>
- </table>
- <table class="flow-card-detail">
- <thead>
- <tr>
- <th rowspan="2" class="col-no">工<br />序<br />号</th>
- <th rowspan="2" class="col-name">工序名称</th>
- <th rowspan="2" class="col-num">转<br />入<br />数</th>
- <th rowspan="2" class="col-leader">工序负<br />责人</th>
- <th rowspan="2" class="col-num">转<br />出<br />数</th>
- <th colspan="2" class="col-bad">不 合 格 数</th>
- <th rowspan="2" class="col-date">日 期</th>
- <th rowspan="2" class="col-remark">备 注</th>
- </tr>
- <tr>
- <th class="col-bad-sub">返工<br />品数</th>
- <th class="col-bad-sub">废品<br />数</th>
- </tr>
- </thead>
- <tbody>
- <tr v-for="(row, idx) in getRows(card)" :key="idx">
- <td>{{ row.taskNo }}</td>
- <td>{{ row.taskName }}</td>
- <td>{{ row.inNum }}</td>
- <td>{{ row.leader }}</td>
- <td>{{ row.outNum }}</td>
- <td>{{ row.reworkNum }}</td>
- <td>{{ row.scrapNum }}</td>
- <td>{{ row.date }}</td>
- <td>{{ row.remark }}</td>
- </tr>
- </tbody>
- </table>
- <div class="flow-card-footer">
- <div class="footer-item">发出日期:{{ card.issueDate }}</div>
- <div class="footer-item">收回日期:{{ card.recoverDate }}</div>
- </div>
- </div>
- </div>
- <div slot="footer">
- <el-button @click="print">打印预览</el-button>
- <el-button @click="close">关闭</el-button>
- </div>
- </ele-modal>
- </template>
- <script>
- import { getTaskInstanceList } from '@/api/produce/job';
- export default {
- name: 'print-flow-card',
- data() {
- return {
- QRvisible: false,
- rowCount: 25,
- printList: []
- };
- },
- methods: {
- async open(rows) {
- const list = Array.isArray(rows) ? rows : rows ? [rows] : [];
- if (!list.length) {
- this.printList = [this.buildEmptyCard()];
- this.QRvisible = true;
- return;
- }
- const cards = await Promise.all(
- list.map((row) =>
- getTaskInstanceList(row.id)
- .then((res) => this.buildCard(row, Array.isArray(res) ? res : []))
- .catch(() => this.buildCard(row, []))
- )
- );
- this.printList = cards;
- this.QRvisible = true;
- },
- close() {
- this.QRvisible = false;
- },
- buildEmptyCard() {
- return {
- topCategoryCode: '',
- topCategoryName: '',
- productCode: '',
- productName: '',
- batchNo: '',
- materialFactoryCertNo: '',
- materialFurnaceNo: '',
- semiProductCertNo: '',
- issueDate: '',
- recoverDate: '',
- taskList: []
- };
- },
- buildCard(row, taskList) {
- return {
- topCategoryCode: row.topCategoryCode || '',
- topCategoryName: row.topCategoryName || '',
- productCode: row.productCode || '',
- productName: row.productName || '',
- batchNo: row.batchNo || '',
- materialFactoryCertNo: row.materialFactoryCertNo || '',
- materialFurnaceNo: row.materialFurnaceNo || '',
- semiProductCertNo: row.semiProductCertNo || '',
- issueDate: row.issueDate || '',
- recoverDate: row.recoverDate || '',
- taskList: taskList.map((item, idx) => ({
- taskNo: idx + 1,
- taskName: item.taskTypeName || item.taskName || ''
- }))
- };
- },
- getRows(card) {
- const list = Array.isArray(card.taskList) ? card.taskList.slice() : [];
- const rows = list.map((item, i) => ({
- taskNo: item.taskNo || i + 1,
- taskName: item.taskName || '',
- inNum: item.inNum || '',
- leader: item.leader || '',
- outNum: item.outNum || '',
- reworkNum: item.reworkNum || '',
- scrapNum: item.scrapNum || '',
- date: item.date || '',
- remark: item.remark || ''
- }));
- while (rows.length < this.rowCount) {
- rows.push({
- taskNo: '',
- taskName: '',
- inNum: '',
- leader: '',
- outNum: '',
- reworkNum: '',
- scrapNum: '',
- date: '',
- remark: ''
- });
- }
- return rows;
- },
- print() {
- const printSection = document.getElementById('printSection');
- const printWindow = window.open('', '_blank');
- printWindow.document.open();
- printWindow.document.write(`<!DOCTYPE html>
- <html>
- <head>
- <meta charset="UTF-8" />
- <title>工序流转卡</title>
- <style>
- @page { size: A4 portrait; margin: 12mm 10mm; }
- html, body {
- margin: 0;
- padding: 0;
- width: 190mm;
- font-family: 'SimSun', '宋体', 'Microsoft YaHei', serif;
- color: #000;
- -webkit-print-color-adjust: exact;
- print-color-adjust: exact;
- }
- .flow-card-page {
- width: 190mm;
- box-sizing: border-box;
- page-break-after: always;
- }
- .flow-card-page:last-child { page-break-after: auto; }
- .flow-card-title {
- text-align: center;
- font-size: 28px;
- font-weight: bold;
- letter-spacing: 16px;
- text-decoration: underline;
- margin: 0 0 8mm 0;
- padding-top: 2mm;
- }
- table {
- width: 190mm;
- border-collapse: collapse;
- table-layout: fixed;
- }
- .flow-card-header td {
- border: 1px solid #000;
- height: 11mm;
- padding: 0 6px;
- font-size: 16px;
- vertical-align: middle;
- }
- .flow-card-header td.label {
- width: 22%;
- text-align: center;
- }
- .flow-card-header td.value { width: 28%; }
- .flow-card-detail th,
- .flow-card-detail td {
- border: 1px solid #000;
- text-align: center;
- vertical-align: middle;
- font-size: 14px;
- padding: 1px 2px;
- line-height: 1.3;
- white-space: nowrap;
- }
- .flow-card-detail th { font-weight: bold; }
- .flow-card-detail thead th { height: 7mm; }
- .flow-card-detail tbody td { height: 9mm; }
- .col-no { width: 7%; }
- .col-name { width: 17%; }
- .col-num { width: 7%; }
- .col-leader { width: 10%; }
- .col-bad { width: 14%; }
- .col-bad-sub { width: 7%; }
- .col-date { width: 13%; }
- .col-remark { width: 11%; }
- .flow-card-footer {
- display: flex;
- justify-content: space-between;
- margin-top: 6mm;
- font-size: 16px;
- }
- .flow-card-footer .footer-item { width: 45%; }
- </style>
- </head>
- <body>
- ${printSection.innerHTML}
- </body>
- </html>`);
- printWindow.document.close();
- printWindow.onload = function () {
- printWindow.focus();
- printWindow.print();
- };
- }
- }
- };
- </script>
- <style lang="scss" scoped>
- .flow-card-print {
- background: #fff;
- color: #000;
- font-family: 'SimSun', '宋体', 'Microsoft YaHei', serif;
- padding: 6mm 4mm;
- *,
- *::before,
- *::after {
- box-sizing: border-box;
- }
- }
- .flow-card-page {
- width: 186mm;
- margin: 0 auto 12mm auto;
- }
- .flow-card-title {
- text-align: center;
- font-size: 26pt;
- font-weight: bold;
- letter-spacing: 14px;
- text-decoration: underline;
- margin: 0 0 6mm 0;
- padding-bottom: 2mm;
- }
- .flow-card-header,
- .flow-card-detail {
- width: 100%;
- border-collapse: collapse;
- table-layout: fixed;
- }
- .flow-card-header td {
- border: 1px solid #000;
- height: 11mm;
- padding: 0 6px;
- font-size: 13pt;
- vertical-align: middle;
- &.label {
- width: 22%;
- text-align: center;
- }
- &.value {
- width: 28%;
- }
- }
- .flow-card-detail {
- th,
- td {
- border: 1px solid #000;
- text-align: center;
- vertical-align: middle;
- font-size: 11pt;
- padding: 1px 2px;
- line-height: 1.25;
- }
- th {
- font-weight: bold;
- }
- thead th {
- height: 7mm;
- }
- tbody td {
- height: 9mm;
- }
- }
- .col-no { width: 7%; }
- .col-name { width: 17%; }
- .col-num { width: 7%; }
- .col-leader { width: 10%; }
- .col-bad { width: 14%; }
- .col-bad-sub { width: 7%; }
- .col-date { width: 13%; }
- .col-remark { width: 11%; }
- .flow-card-footer {
- display: flex;
- justify-content: space-between;
- margin-top: 6mm;
- font-size: 13pt;
- .footer-item {
- width: 45%;
- }
- }
- </style>
|