Newer
Older
smart-metering-front / src / views / business / schedule / interchange / dialog / labelPrint.vue
<!-- 标签打印 -->
<script setup lang="ts" name="LabelPrint">
import { ref } from 'vue'
import type { Ref } from 'vue'
import { ElMessage, dayjs } from 'element-plus'
import JsBarcode from 'jsbarcode'
import type { TableColumn } from '@/components/NormalTable/table_interface'
import { printHtml } from '@/utils/printUtils'
const emits = defineEmits(['changeVisible', 'confirmCheckout'])
// 表头
const columns = ref<TableColumn[]>([
  { text: '客户单位', value: 'customerName', align: 'center', fixed: true },
  { text: '仪器名称', value: 'sampleName', align: 'center' },
  { text: '型号', value: 'sampleModel', align: 'center' },
  { text: '出厂编号', value: 'manufacturingNo', align: 'center' },
  { text: '备注', value: 'remark', align: 'center' },
  { text: '送检时间', value: 'realDeliverTime', align: 'center', width: '180' },
])
const visible = ref(false) // 对话框显隐
const list = ref([]) as any // 表格数据
// 点击取消
const cancle = () => {
  visible.value = false
}

// 点击确定
const printObj = ref({
  id: 'labelHtml', // 需要打印元素的id
  popTitle: '', // 打印配置页上方的标题
  extraHead: '', // 最上方的头部文字,附加在head标签上的额外标签,使用逗号分割
  preview: false, // 是否启动预览模式,默认是false
  previewBeforeOpenCallback() { console.log('正在加载预览窗口!') }, // 预览窗口打开之前的callback
  previewOpenCallback() { console.log('已经加载完预览窗口,预览打开了!') }, // 预览窗口打开时的callback
  beforeOpenCallback() { console.log('开始打印之前!') }, // 开始打印之前的callback
  openCallback() { console.log('执行打印了!') }, // 调用打印时的callback
  closeCallback() { console.log('关闭了打印工具!') }, // 关闭打印的callback(无法区分确认or取消)
  clickMounted() { console.log('点击v-print绑定的按钮了!') },
  standard: '',
  extarCss: '',
})

// 点击删除
const deleteRow = (index: number) => {
  list.value.splice(index, 1)
}

function initDialog(value: any) {
  list.value = value.map((item: { sampleStatus: string; remark: string; realDeliverTime: string }) => {
    return {
      ...item,
      realDeliverTime: `${item.sampleStatus}` === '1' ? dayjs().format('YYYY-MM-DD HH:mm:ss') : item.realDeliverTime, // 待收入送检时间默认今天
      remark: item.remark || '无',
      measured: false, // 是否自检
      backMeasure: false, // 是否退检
    }
  })
  visible.value = true
  nextTick(() => {
    JsBarcode('#barcode').init()
  })
}

defineExpose({ initDialog })
</script>

<template>
  <el-dialog :modelValue="visible" title="标签打印" width="1300px" @close="cancle">
    <div style="display: flex;overflow: hidden;position: relative;">
      <normal-table
        :data="list"
        :pagination="false"
        :columns="columns"
        :is-showmulti-select="false"
        :max-height="460"
        style="width: 860px;margin-right: 40px;"
      >
        <!-- 序号 -->
        <template #preColumns>
          <el-table-column label="#" width="55" align="center" fixed>
            <template #default="scope">
              {{ scope.$index + 1 }}
            </template>
          </el-table-column>
        </template>
        <template #columns>
          <el-table-column
            label="操作"
            align="center"
            fixed="right"
            width="90"
          >
            <template #default="scope">
              <el-button
                size="small"
                type="danger"
                link
                @click="deleteRow(scope.$index)"
              >
                删除
              </el-button>
            </template>
          </el-table-column>
        </template>
      </normal-table>

      <div style="height: 460px;overflow-y: auto;">
        <!-- 标签 -->
        <div style="background-color: #fff;">
          <div style="display: flex;flex-direction: column;width: 330px;">
            <div v-for="(item, index) in list" :key="index" style="margin-bottom: 10px;width: 300px; height: 240px; box-sizing: border-box; border: 1px solid #606266; border-radius: 3px; padding: 8px 10px;display: flex;flex-direction: column;line-height: 20px;">
              <div style="display: flex;">
                <span style="margin-right: 16px;white-space: nowrap;">送检时间</span>
                <span style="color: #000;">{{ item.realDeliverTime }}</span>
              </div>
              <div style="display: flex;">
                <span style="margin-right: 16px;white-space: nowrap;">客户单位</span>
                <span style="color: #000;">{{ item.customerName }}</span>
              </div>
              <div style="display: flex;">
                <span style="margin-right: 16px;white-space: nowrap;">仪器名称</span>
                <span style="color: #000;">{{ item.sampleName }}</span>
              </div>
              <div style="display: flex;">
                <span style="margin-right: 16px;white-space: nowrap;">型ㅤㅤ号</span>
                <span style="color: #000;">{{ item.sampleModel }}</span>
              </div>
              <div style="display: flex;">
                <span style="margin-right: 16px;white-space: nowrap;">出厂编号</span>
                <span style="color: #000;">{{ item.manufacturingNo }}</span>
              </div>
              <div style="display: flex;">
                <span style="margin-right: 16px;white-space: nowrap;">备ㅤㅤ注</span>
                <span class="label-print-remark">{{ item.remark || '无' }}</span>
              </div>
              <div style="display: flex;justify-content: space-around;">
                <el-checkbox v-model="item.measured" disabled>
                  已检
                </el-checkbox>
                <el-checkbox v-model="item.backMeasure" disabled>
                  退检
                </el-checkbox>
              </div>
              <img
                id="barcode"
                style="width: 200px;margin-left: 44px;"
                :jsbarcode-value="item.sampleNo"
                jsbarcode-textmargin="0"
                jsbarcode-fontoptions="bold"
                jsbarcode-fontSize="32"
                :jsbarcode-height="48"
              >
            </div>
          </div>
        </div>

        <div id="labelHtml" style="display: flex;flex-direction: column;position: absolute;top: 0;right: 0;z-index: -999999;">
          <div v-for="(item, index) in list" :key="index" style="width: 300px; height: 240px; box-sizing: border-box; padding: 8px 10px;display: flex;flex-direction: column;line-height: 20px;">
            <div style="display: flex;">
              <span style="margin-right: 16px;white-space: nowrap;">送检时间</span>
              <span style="color: #000;">{{ item.realDeliverTime }}</span>
            </div>
            <div style="display: flex;">
              <span style="margin-right: 16px;white-space: nowrap;">客户单位</span>
              <span style="color: #000;">{{ item.customerName }}</span>
            </div>
            <div style="display: flex;">
              <span style="margin-right: 16px;white-space: nowrap;">仪器名称</span>
              <span style="color: #000;">{{ item.sampleName }}</span>
            </div>
            <div style="display: flex;">
              <span style="margin-right: 16px;white-space: nowrap;">型ㅤㅤ号</span>
              <span style="color: #000;">{{ item.sampleModel }}</span>
            </div>
            <div style="display: flex;">
              <span style="margin-right: 16px;white-space: nowrap;">出厂编号</span>
              <span style="color: #000;">{{ item.manufacturingNo }}</span>
            </div>
            <div style="display: flex;">
              <span style="margin-right: 16px;white-space: nowrap;">备ㅤㅤ注</span>
              <span class="label-print-remark">{{ item.remark || '无' }}</span>
            </div>
            <div style="display: flex;justify-content: space-around;">
              <el-checkbox v-model="item.measured">
                已检
              </el-checkbox>
              <el-checkbox v-model="item.backMeasure">
                退检
              </el-checkbox>
            </div>
            <img
              id="barcode"
              style="width: 100px;margin-left: 44px;"
              :jsbarcode-value="item.sampleNo"
              jsbarcode-textmargin="0"
              jsbarcode-fontoptions="bold"
              jsbarcode-fontSize="32"
              :jsbarcode-height="48"
            >
          </div>
        </div>
      </div>
    </div>
    <template #footer>
      <el-button v-print="printObj" type="primary">
        打印
      </el-button>
      <!-- <el-button type="primary" @click="printHtml('labelHtml')">
        打印
      </el-button> -->
      <el-button @click="cancle">
        取消
      </el-button>
    </template>
  </el-dialog>
</template>

<style lang="scss" scoped>
.label-print-remark {
  color: #000;

  @include text-overflow(1, false);
}
</style>