liuyanpeng 3 年 前
コミット
1cce45a307
4 ファイル変更807 行追加16 行削除
  1. 156 0
      src/print/CommonTable.vue
  2. 510 0
      src/print/PrintCard.vue
  3. 120 0
      src/print/config.js
  4. 21 16
      src/routes/main_routes.js

+ 156 - 0
src/print/CommonTable.vue

@@ -0,0 +1,156 @@
+<template>
+  <div class="tablePaganations">
+    <a-config-provider :locale="locale">
+      <a-table
+        class="ant-table-striped"
+        bordered
+        size="small"
+        height="1000px"
+        :loading="isLoading"
+        :data-source="dataSource"
+        :columns="columns"
+        :scroll="{ y: 360 }"
+        :pagination="pagination"
+        :row-key="(record) => record.id"
+        :row-selection="isSelect ? rowSelection : null"
+        :row-class-name="
+          (_record, index) => (index % 2 === 1 ? 'table-striped' : null)
+        "
+      >
+        <template
+          v-for="(item, index) in renderArr"
+          #[item]="scope"
+          :key="index"
+        >
+          <slot :name="item" :scope="scope" v-bind="scope || {}" />
+        </template>
+      </a-table>
+    </a-config-provider>
+  </div>
+</template>
+  
+<script setup>
+import {
+  useSlots,
+  ref,
+  reactive,
+  defineProps,
+  defineEmits,
+  watch,
+  onMounted,
+} from 'vue';
+import zhCN from 'ant-design-vue/lib/locale-provider/zh_CN';
+const locale = ref(zhCN);
+const props = defineProps({
+  dataSource: {
+    type: Object,
+    required: true,
+  },
+  columns: {
+    type: Object,
+    required: true,
+  },
+  isSelect: {
+    type: Boolean,
+  },
+  isLoading: {
+    type: Boolean,
+  },
+  total: {
+    type: Number,
+    default: 0,
+  },
+});
+
+// 分页配置
+const pagination = reactive({
+  showQuickJumper: true,
+  current: 1,
+  pageSize: 20, // 默认每页显示数量
+  showSizeChanger: true, // 显示可改变每页数量
+  pageSizeOptions: ['3', '5', '7', '9', '11', '500'], // 每页数量选项值
+  showTotal: (total, range) =>
+    range[0] + '-' + range[1] + '条' + ' 共' + total + '条', // 显示总数
+  onShowSizeChange: (current, pageSize) => showSizeChange(current, pageSize),
+  onChange: (current, pageSize) => changePage(current, pageSize), //点击页码事件
+  total: props.total,
+});
+const emit = defineEmits(['pageParams', 'selectColumn']);
+
+// 改变每页数量时更新显示
+const showSizeChange = (current, pageSize) => {
+  setTimeout(() => {
+    pagination.current = 1;
+    emit('pageParams', pagination.current, pageSize);
+  });
+  pagination.pageSize = pageSize;
+};
+
+//点击页码事件
+const changePage = (current, size) => {
+  pagination.current = current;
+  emit('pageParams', pagination.current, size);
+};
+
+const state = reactive({
+  selectedRows: [],
+  selectedRowKeys: [],
+});
+const rowSelection = reactive({
+  selectedRowKeys: state.selectedRowKeys,
+  // preserveSelectedRowKeys: true,
+  onSelect: (record, selected, selectedRows, nativeEvent) => {
+    if (selected) {
+      state.selectedRows.push(record);
+      state.selectedRowKeys.push(record.id);
+    } else {
+      let index = state.selectedRowKeys.indexOf(record.id);
+      if (index >= 0) {
+        state.selectedRows.splice(index, 1);
+        state.selectedRowKeys.splice(index, 1);
+      }
+    }
+    emit('selectColumn', state.selectedRows);
+  },
+  onSelectAll: (selected, selectedRows, changeRows) => {
+    if (selected) {
+      state.selectedRows = state.selectedRows.concat(changeRows);
+      state.selectedRows.forEach(item => {
+        state.selectedRowKeys.push(item.id);
+      });
+    } else {
+      changeRows.forEach(item => {
+        let index = state.selectedRowKeys.indexOf(item.id);
+        if (index >= 0) {
+          state.selectedRows.splice(index, 1);
+          state.selectedRowKeys.splice(index, 1);
+        }
+      });
+    }
+    emit('selectColumn', state.selectedRows);
+  },
+});
+
+// 监听total变化
+watch(
+  props,
+  newData => {
+    pagination.total = newData.total;
+  },
+  { immediate: true, deep: true },
+);
+
+// 插槽的实例
+const slots = useSlots();
+const renderArr = Object.keys(slots);
+</script>
+<style scoped>
+.tablePaganations {
+  width: 100%;
+  margin-top: 20px;
+  margin-bottom: 20px;
+}
+.ant-table-striped :deep(.table-striped) td {
+  background-color: #fafafa;
+}
+</style>

+ 510 - 0
src/print/PrintCard.vue

@@ -0,0 +1,510 @@
+<template>
+  <Navbar title="卡片打印" :is-go-back="true" />
+  <div class="printDiv">
+    <div>
+      <span style="color: red"> * </span>
+      <label>导入批次:</label>
+      <a-select
+        v-model:value="queryParams.batchNo"
+        show-search
+        class="commonStyle"
+        :options="batchNos.map((item) => ({ value: item.label }))"
+        @change="searchPrintInfo"
+      />
+      <label>保管人员:</label>
+      <a-select
+        v-model:value="queryParams.depositoryUser"
+        show-search
+        class="commonStyle"
+        :options="depositoryUsers.map((item) => ({ value: item.label }))"
+        @change="searchPrintInfo"
+      />
+      <label>打印状态:</label>
+      <a-select
+        v-model:value="status"
+        show-search
+        class="commonStyle"
+        :options="
+          statusOptions.map((item) => ({
+            value: `${item.value}-${item.label}`,
+            label: item.label,
+          }))
+        "
+        @change="searchPrintInfo"
+      />
+    </div>
+    <div style="margin: 8px 0 0 9px">
+      <label>公司名称:</label>
+      <a-select
+        v-model:value="queryParams.clientName"
+        show-search
+        class="commonStyle"
+        :options="clientNames.map((item) => ({ value: item.label }))"
+        @change="searchPrintInfo"
+      />
+      <label>所属部门:</label>
+      <a-select
+        v-model:value="queryParams.organizationName"
+        show-search
+        class="commonStyle"
+        :options="organizationNames.map((item) => ({ value: item.label }))"
+        @change="searchPrintInfo"
+      />
+      <label>成本中心:</label>
+      <a-select
+        v-model:value="queryParams.costCenterName"
+        show-search
+        class="commonStyle"
+        :options="costCenterNames.map((item) => ({ value: item.label }))"
+        @change="searchPrintInfo"
+      />
+      <a-button type="primary" @click="searchPrintInfo">查询</a-button>
+    </div>
+    <div style="margin: 8px 0 0 9px">
+      <label>打印模板:</label>
+      <a-select
+        v-model:value="printTemplate"
+        show-search
+        class="commonStyle"
+        :options="
+          templateNames.map((item) => ({
+            value: `${item.id}-${item.name}`,
+            label: item.name,
+          }))
+        "
+      />
+      <a-button
+        type="dashed"
+        style="margin-right: 16px"
+        @click="imageVisible = true"
+      >
+        打印预览
+      </a-button>
+      <a-button type="dashed" style="margin-right: 16px" @click="showPrintInfo">
+        打印
+      </a-button>
+    </div>
+    <a-divider />
+    <CommonTable
+      :total="total"
+      :columns="columns"
+      :is-loading="isLoading"
+      :is-select="isSelect"
+      :data-source="dataSource"
+      @select-column="selectColumn"
+      @page-params="getPageParams"
+    >
+      <template #bodyCell="{ column, record }">
+        <template v-if="column.key === 'imageUrl'">
+          <a-image :width="100" :height="50" :src="record.imageUrl" />
+        </template>
+      </template>
+    </CommonTable>
+    <a-modal
+      v-model:visible="printVisible"
+      title="包装信息"
+      ok-text="确认"
+      cancel-text="取消"
+      @ok="printCard"
+    >
+      <label>包装批号:</label>
+      <a-input
+        id="displayName"
+        v-model:value="packageBatchNo"
+        :disabled="true"
+      />
+      <label>上次的批号:</label>
+      <a-input
+        id="displayName"
+        v-model:value="lastPackageBatchNo"
+        :disabled="true"
+      />
+      <label>包装名称:</label>
+      <a-input id="displayName" v-model:value="packageName" :disabled="true" />
+      <label>上次的名称:</label>
+      <a-input
+        id="displayName"
+        v-model:value="lastPackageName"
+        :disabled="true"
+      />
+      <div class="operationBtn">
+        <a-button type="dashed" style="width: 240px" @click="lastTime">
+          同上一次
+        </a-button>
+        <a-button
+          type="dashed"
+          style="width: 240px; margin-left: 4px"
+          @click="createNew"
+        >
+          生成新的
+        </a-button>
+      </div>
+    </a-modal>
+    <a-modal
+      v-model:visible="imageVisible"
+      title="打印预览"
+      ok-text="确认"
+      cancel-text="取消"
+      :body-style="bodyStyle"
+      @ok="imageVisible = false"
+    >
+      <a-image
+        :preview="{ visible: false }"
+        :width="200"
+        class="image"
+        :src="imageUrls[0]"
+        @click="visible = true"
+      />
+      <div style="display: none">
+        <a-image-preview-group
+          :preview="{ visible, onVisibleChange: (vis) => (visible = vis) }"
+        >
+          <a-image v-for="item in imageUrls" :key="item" :src="item" />
+        </a-image-preview-group>
+      </div>
+    </a-modal>
+    <div ref="hua" style="float: left; z-index: -999" />
+    <Loading v-if="globalLoading" />
+  </div>
+</template>
+
+<script setup>
+import CommonTable from './CommonTable.vue';
+import Common from '../common/Common';
+import { message } from 'ant-design-vue';
+import { ref, reactive, onMounted } from 'vue';
+import {
+  columns,
+  dateConvert,
+  multipleImageUpload,
+  getTemplate,
+} from './config';
+import CreateJPEG from '../common/X6';
+import { SqlApi, Notify } from 'pc-component-v3';
+import { getImageSrc } from '../common/image-src';
+
+const imageUrls = reactive([
+  'https://gw.alipayobjects.com/zos/antfincdn/LlvErxo8H9/photo-1503185912284-5271ff81b9a8.webp',
+  'https://gw.alipayobjects.com/zos/antfincdn/cV16ZqzMjW/photo-1473091540282-9b846e7965e3.webp',
+  'https://gw.alipayobjects.com/zos/antfincdn/x43I27A55%26/photo-1438109491414-7198515b166b.webp',
+]);
+const total = ref(0);
+const isSelect = ref(true);
+const isLoading = ref(false);
+const selectedRows = ref([]);
+const dataSource = ref([]);
+const printVisible = ref(false);
+const imageVisible = ref(false);
+const visible = ref(false);
+const globalLoading = ref(false);
+const bodyStyle = {
+  display: 'flex',
+  justifyContent: 'center',
+};
+const status = ref('');
+const batchNos = ref([]);
+const clientNames = ref([]);
+const depositoryUsers = ref([]);
+const costCenterNames = ref([]);
+const organizationNames = ref([]);
+const statusOptions = ref([
+  {
+    value: '',
+    label: ' ',
+  },
+  {
+    value: 'To_Be_Printed',
+    label: '待打印',
+  },
+  {
+    value: 'Printing',
+    label: '打印中',
+  },
+  {
+    value: 'Printed',
+    label: '已打印',
+  },
+]);
+const queryParams = reactive({
+  batchNo: '',
+  depositoryUser: '',
+  labelPrintType: '',
+  clientName: '',
+  organizationName: '',
+  costCenterName: '',
+});
+const pager = reactive({
+  start: 0,
+  length: 20,
+});
+const templateId = ref('');
+const allTemplate = ref([]);
+const templateData = ref([]);
+const lastBatchNo = ref('');
+const printTemplate = ref('');
+const templateNames = ref([]);
+const packageBatchNo = ref('');
+const lastPackageBatchNo = ref('');
+const packageName = ref('');
+const lastPackageName = ref('');
+const newPackageName = ref('');
+const hua = ref(null);
+let getImageData;
+// 获取分页
+const getPageParams = (start, length) => {
+  pager.start = (start - 1) * length;
+  pager.length = length;
+  searchPrintInfo();
+};
+// 查询信息
+const searchPrintInfo = () => {
+  isLoading.value = true;
+  if (status.value !== undefined) {
+    queryParams.labelPrintType = status.value.slice(
+      0,
+      status.value.indexOf('-'),
+    );
+  }
+  let params = { ...queryParams, ...pager };
+  if (queryParams.batchNo !== '') {
+    SqlApi.execute('20230613_140456', params).then(
+      successData => {
+        const { lines, errorMessage, errorCode } = successData;
+        if (errorCode == 0) {
+          total.value = successData.total;
+          lines.forEach(item => {
+            item.key = item.id;
+          });
+          dataSource.value = lines;
+          isLoading.value = false;
+        } else {
+          Notify.error('查询异常', errorMessage, true);
+        }
+        isLoading.value = false;
+      },
+      errorData => {
+        Common.processException(errorData);
+        isLoading.value = false;
+      },
+    );
+  } else {
+    message.error('请选择导入批次');
+    status.value = '';
+    dataSource.value = [];
+    queryParams.clientName = '';
+    queryParams.costCenterName = '';
+    queryParams.depositoryUser = '';
+    queryParams.organizationName = '';
+    isLoading.value = false;
+  }
+};
+// 获取所选项的数据
+const selectColumn = rows => {
+  selectedRows.value = rows;
+  console.log('onSelectChange', selectedRows.value);
+};
+// 展开打印框
+const showPrintInfo = () => {
+  if (printTemplate.value !== '') {
+    printVisible.value = true;
+    const nameArr = [];
+    const obj = JSON.parse(JSON.stringify(queryParams));
+    delete obj.labelPrintType;
+    for (let key in obj) {
+      if (obj[key] !== '') nameArr.push(obj[key]);
+    }
+    packageName.value = nameArr.join('-');
+    newPackageName.value = nameArr.join('-');
+    packageBatchNo.value = dateConvert(new Date());
+  } else {
+    message.error('请选择打印模板');
+  }
+};
+// 同上一次包装信息
+const lastTime = () => {
+  if (lastPackageName.value == null && lastPackageBatchNo.value == null) {
+    message.info('没有上次的包装信息');
+  } else {
+    packageName.value = lastPackageName.value;
+    packageBatchNo.value = lastPackageBatchNo.value;
+  }
+};
+
+// const base64toFile = (url, imageName) => {
+//   const arr = url.split(',');
+//   const mime = arr[0].match(/.*?:(.*?);/)[1];
+//   const suffix = mime.split('/')[1];
+//   const bstr = window.atob(arr[1]);
+//   let n = bstr.length;
+//   const u8arr = new Uint8Array(n);
+//   while (n--) {
+//     u8arr[n] = bstr.charCodeAt(n);
+//   }
+//   return new File([u8arr], `${imageName}.${suffix}`, {
+//     type: 'multipart/form-data',
+//   });
+// };
+
+// 生产新的包装信息
+const createNew = () => {
+  packageBatchNo.value = dateConvert(new Date());
+  packageName.value = newPackageName.value;
+};
+
+// 确认打印
+const printCard = () => {
+  globalLoading.value = true;
+  const formData = new FormData();
+  templateId.value = printTemplate.value.slice(
+    0,
+    printTemplate.value.indexOf('-'),
+  );
+  allTemplate.value.forEach(item => {
+    if (item.id == templateId.value) {
+      templateData.value = JSON.stringify(item.contentX6);
+    }
+  });
+
+  selectedRows.value.forEach(async item => {
+    item.number = item.assetNo;
+    item.name = item.assetName;
+    item.unit = item.depositoryUser;
+    item.keeper = item.organizationName;
+    item.EPC = item.depositoryUser;
+    item.BarCode =
+      'https://rfid.fa.sjtu.edu.cn/c/5C5CFA24F72542B8910F247BA014DDBB';
+    let base64 = await getImageData(item, templateData.value);
+    console.log('图片base64:',base64);
+  });
+
+  formData.append('customerPrintTemplateId', templateId.value);
+  formData.append('packageBatchNo', packageBatchNo.value);
+  formData.append('packageName', packageName.value);
+  // formData.append('file', file);
+
+  multipleImageUpload(formData).then(
+    successData => {
+      if (successData.success === true) {
+        message.success('资产生产图片成功');
+      } else {
+        message.error('资产生产图片失败');
+      }
+      globalLoading.value = false;
+      printVisible.value = false;
+      searchPrintInfo();
+    },
+    errorData => {
+      Common.processException(errorData);
+      globalLoading.value = false;
+      printVisible.value = false;
+    },
+  );
+};
+
+onMounted(() => {
+  init();
+  getImageData = CreateJPEG(hua.value);
+});
+
+// 封装通用sqlApi请求函数
+const commonSqlApi = (url, data) => {
+  SqlApi.execute(url).then(
+    successData => {
+      if (successData.errorCode == 0) {
+        if (successData.lines !== null) {
+          data.value = successData.lines.map(item => {
+            return (item = { label: item });
+          });
+          data.value.unshift({ label: '' });
+        }
+      } else {
+        Notify.error('查询信息异常', successData.errorMessage, true);
+      }
+    },
+    errorData => {
+      Common.processException(errorData);
+    },
+  );
+};
+
+// 初始化数据
+const init = () => {
+  getTemplate().then(res => {
+    allTemplate.value = res.datas;
+    console.log(res);
+  });
+  commonSqlApi('20230613_192444', depositoryUsers); // 查询保管人
+  commonSqlApi('20230613_193808', clientNames); // 查询公司
+  commonSqlApi('20230613_194108', organizationNames); // 查询部门
+  commonSqlApi('20230613_194557', costCenterNames); // 查询成本中心
+  // 查询批次号
+  SqlApi.execute('20230613_134214').then(
+    successData => {
+      if (successData.errorCode == 0) {
+        if (successData.lines !== null) {
+          batchNos.value = successData.lines.map(item => {
+            return (item = { label: item });
+          });
+        }
+      } else {
+        Notify.error('查询导入批次异常', successData.errorMessage, true);
+      }
+    },
+    errorData => {
+      Common.processException(errorData);
+    },
+  );
+  // 查询模板
+  SqlApi.execute('20230613_135541').then(
+    successData => {
+      if (successData.errorCode == 0) {
+        if (successData.label !== null) {
+          templateNames.value = successData.lines;
+        }
+      } else {
+        Notify.error('获取包装信息异常', successData.errorMessage, true);
+      }
+    },
+    errorData => {
+      Common.processException(errorData);
+    },
+  );
+  // 获取上一次的包装信息
+  SqlApi.execute('20230613_194855').then(
+    successData => {
+      if (successData.errorCode == 0) {
+        const { packageName, packageBatchNo } = successData.lines;
+        lastPackageName.value = packageName;
+        lastPackageBatchNo.value = packageBatchNo;
+      } else {
+        Notify.error('获取包装信息异常', successData.errorMessage, true);
+      }
+    },
+    errorData => {
+      Common.processException(errorData);
+    },
+  );
+};
+</script>
+
+<style scoped>
+.printDiv {
+  padding: 24px;
+}
+.commonStyle {
+  margin-right: 16px;
+  width: 160px;
+}
+.search,
+.operationBtn {
+  margin-top: 8px;
+}
+.operationBtn {
+  display: flex;
+  justify-content: space-between;
+}
+#displayName:disabled {
+  background: white;
+  color: black;
+}
+</style>

+ 120 - 0
src/print/config.js

@@ -0,0 +1,120 @@
+import Common from '../common/Common';
+
+export const columns = [
+  {
+    title: '公司',
+    dataIndex: 'clientName',
+    key: 'clientName',
+  },
+  {
+    title: '部门',
+    dataIndex: 'organizationName',
+    key: 'organizationName',
+  },
+  {
+    title: '保管人',
+    dataIndex: 'depositoryUser',
+    key: 'depositoryUser',
+  },
+  {
+    title: '成本中心',
+    dataIndex: 'costCenterName',
+    key: 'costCenterName',
+    width: 100,
+  },
+  {
+    title: '资产名称',
+    dataIndex: 'assetName',
+    key: 'assetName',
+  },
+  {
+    title: '资产编号',
+    dataIndex: 'assetNo',
+    key: 'assetNo',
+  },
+  {
+    title: '二维码',
+    dataIndex: 'barCode',
+    key: 'barCode',
+  },
+  {
+    title: 'EPC',
+    key: 'epc',
+    dataIndex: 'epc',
+  },
+  {
+    title: '打印次数',
+    key: 'printCount',
+    dataIndex: 'printCount',
+  },
+  {
+    title: '状态',
+    key: 'labelPrintType',
+    dataIndex: 'labelPrintType',
+  },
+  {
+    title: '图片',
+    key: 'imageUrl',
+    dataIndex: 'imageUrl',
+  },
+].map(item => ({ ...item, align: 'center' }));
+
+
+export const multipleImageUpload = params => {
+  var requestUrl = 'LabelPrintResource/multipleImageUpload';
+
+  return new Promise((resolve, reject) => {
+    $.ajax({
+      url: Common.getApiURL(requestUrl),
+      type: 'post',
+      contentType: false,
+      processData: false,
+      data: params,
+
+      beforeSend: function (request) {
+        Common.addTokenToRequest(request);
+      },
+      success: function (data) {
+        resolve(data);
+      },
+      error: function (XMLHttpRequest, textStatus, errorThrown) {
+        reject(XMLHttpRequest);
+      },
+    });
+  });
+};
+export const getTemplate = () => {
+  var requestUrl = 'printPageResource/loadCustomerTemplateX6';
+
+  return new Promise((resolve, reject) => {
+    $.ajax({
+      url: Common.getApiURL(requestUrl),
+      type: 'get',
+      dataType: 'json',
+
+      beforeSend: function (request) {
+        Common.addTokenToRequest(request);
+      },
+      success: function (data) {
+        resolve(data);
+      },
+      error: function (XMLHttpRequest, textStatus, errorThrown) {
+        reject(XMLHttpRequest);
+      },
+    });
+  });
+};
+const plusZero = n => {
+  return n > 10 ? n : '0' + n;
+};
+// 日期处理函数
+export const dateConvert = dateStr => {
+  const date = new Date(dateStr);
+  const year = date.getFullYear();
+  const month = date.getMonth() + 1;
+  const day = date.getDate();
+  const hour = date.getHours();
+  const minute = date.getMinutes();
+  const second = date.getSeconds();
+  return year + '-' + plusZero(month) + '-' + plusZero(day) + ' ' + plusZero(hour) + ':' + plusZero(minute) + ':' + plusZero(second);
+};

+ 21 - 16
src/routes/main_routes.js

@@ -57,6 +57,8 @@ const Training = () => import(/* webpackChunkName: "component-test-5" */ '../../
 const PrintTemp = () => import(/* webpackChunkName: "component-test-5" */ '../customer/printTemp/index.vue');
 // const PrintTempStep1 = () => import(/* webpackChunkName: "component-test-5" */ '../customer/printTemp/step1.vue');
 // const PrintTempStep2 = () => import(/* webpackChunkName: "component-test-5" */ '../customer/printTemp/step2.vue');
+
+const PrintCard = () => import('../print/PrintCard.vue');
 import { ProcessReport } from 'pc-component-v3';
 
 export default [
@@ -183,7 +185,7 @@ export default [
       },
       // 数据导入
       {
-        path: 'data-import-panel',component: DataImportPanel,
+        path: 'data-import-panel', component: DataImportPanel,
         meta: {
           'loginRequired': true,
           'functionAccessArray': [
@@ -257,7 +259,7 @@ export default [
       },
       // 归档
       { path: 'archive', component: Archive },
-      
+
       //用户搜索
       { path: 'userSearch', component: UserSearch },
       //抓拍
@@ -295,7 +297,8 @@ export default [
 
 
       // 任务流程管理
-      { path: 'taskProcessManagement', component: TaskProcessManagement,
+      {
+        path: 'taskProcessManagement', component: TaskProcessManagement,
         meta: {
           'loginRequired': true,
           'functionAccessArray': [
@@ -308,7 +311,8 @@ export default [
       },
 
       // 执行列表
-      { path: 'executionList', component: ExecutionList,
+      {
+        path: 'executionList', component: ExecutionList,
         meta: {
           'loginRequired': true,
           'functionAccessArray': [
@@ -329,7 +333,7 @@ export default [
       { path: 'report-approve', component: ReportApprove },
 
 
-      
+
     ],
   },
 
@@ -337,7 +341,8 @@ export default [
   { path: '/lowcode-page/:lowcodeWindowNo', component: LowcodePage },
   // 打印页面
   { path: '/single/PrintPage', component: PrintPage },
-
+  // 卡片打印
+  { path: '/single/PrintCard', component: PrintCard },
 
 
   //钉钉待办任务审批跳转
@@ -354,14 +359,14 @@ export default [
   { path: '/DynamicImport', component: DynamicImport },
 
   { path: '/notFound', component: NotFound },
-  { path:'/privacy-statement', component: PrivacyStatement},
-  { path:'/studyVideo', component: StudyVideo},
-  { path:'/resetPassword', component: ResetPassword},
-
-  { path:'/retrievePassword', component: RetrievePassword},
-  { path:'/knowledgeTrain', component: KnowledgeTrain1},
-  { path:'/knowledgeTrainAnswer', component: KnowledgeTrainAnswer},
-  { path: '/excelReport/:processReportNo', component: ExcelReport},
-  { path: '/dateExcelReport/:processReportNo', component: DateExcelReport},
-  { path: '/desktop/delegationReport', component: DelegationReport},
+  { path: '/privacy-statement', component: PrivacyStatement },
+  { path: '/studyVideo', component: StudyVideo },
+  { path: '/resetPassword', component: ResetPassword },
+
+  { path: '/retrievePassword', component: RetrievePassword },
+  { path: '/knowledgeTrain', component: KnowledgeTrain1 },
+  { path: '/knowledgeTrainAnswer', component: KnowledgeTrainAnswer },
+  { path: '/excelReport/:processReportNo', component: ExcelReport },
+  { path: '/dateExcelReport/:processReportNo', component: DateExcelReport },
+  { path: '/desktop/delegationReport', component: DelegationReport },
 ];