hfxc226 3 年之前
父节点
当前提交
6126a053d6

+ 17 - 0
src/api/sqarepartmanage/sparepartinfo.js

@@ -17,6 +17,23 @@ export function getSparePartInfoPage (parameter) {
   })
 }
 
+/**
+ * fetch single func
+ * parameter: { }
+ * @param parameter
+ * @returns {*}
+ */
+export function fetchSparePartInfos (parameter) {
+  return axios({
+    url: '/sqarepartmanage/spare-part-info/code/batch',
+    method: 'POST',
+    headers: {
+      'Content-Type': 'application/json;charset=UTF-8'
+    },
+    data: parameter
+  })
+}
+
 /**
  * page func
  * parameter: { }

+ 12 - 0
src/api/upms/code.js

@@ -23,3 +23,15 @@ export function generateSbCodeAll (parameter) {
     data: parameter
   })
 }
+
+export function generateSpareCodeAll (parameter) {
+  return axios({
+    url: `/upms/codes/spare/all`,
+    method: 'POST',
+    headers: {
+      'Accept': 'application/json',
+      'Content-Type': 'application/json;charset=UTF-8'
+    },
+    data: parameter
+  })
+}

+ 1 - 1
src/components/custom/ImgCode.vue

@@ -39,7 +39,7 @@ export default {
       type: String,
       default: ''
     },
-    type: { // 1.表示设备
+    type: { // 1.表示设备,2:备件
       type: Number,
       default: 1
     },

+ 4 - 0
src/utils/dict.js

@@ -69,6 +69,10 @@ DictCache.TYPE = {
   SB_QR_CODE_LABEL_CONTENT_WIDTH: 'SB_QR_CODE_LABEL_CONTENT_WIDTH', // 设备标签表格宽度
   SB_QR_CODE_LABEL_CONTENT_HEIGHT: 'SB_QR_CODE_LABEL_CONTENT_HEIGHT', // 设备标签表格高度
   SB_QR_CODE_LABEL_IMG_WIDTH: 'SB_QR_CODE_LABEL_IMG_WIDTH', // 设备标签二维码宽度
+  SPARE_QR_CODE_LABEL_WIDTH: 'SPARE_QR_CODE_LABEL_WIDTH', // 备件标签宽度
+  SPARE_QR_CODE_LABEL_CONTENT_WIDTH: 'SPARE_QR_CODE_LABEL_CONTENT_WIDTH', // 备件标签表格宽度
+  SPARE_QR_CODE_LABEL_CONTENT_HEIGHT: 'SPARE_QR_CODE_LABEL_CONTENT_HEIGHT', // 备件标签表格高度
+  SPARE_QR_CODE_LABEL_IMG_WIDTH: 'SPARE_QR_CODE_LABEL_IMG_WIDTH', // 备件标签二维码宽度
   FILE_DOWNLOAD_TEMPLATE: 'FILE_DOWNLOAD_TEMPLATE', // 模板文件
   DELFLAG: 'DELFLAG', // 删除标志
   SBTYPE_TYPE: 'SBTYPE_TYPE', // 设备类型

+ 1 - 1
src/views/sb/info/SbInfo.vue

@@ -556,7 +556,7 @@ export default {
       let ids = []
       const length = this.selectedRows.length
       if (length === 0) {
-        this.$message.info('请选择要打印的记录')
+        this.$message.info('请选择要打印的设备')
         return
       }
       ids = this.selectedRows.map(item => item.id)

+ 1 - 1
src/views/sb/info/modules/PrintInSbInfoBatch.vue

@@ -84,7 +84,7 @@ import { formatDate } from '@/utils/util'
 import { configData, updateSysConfigBatch } from '@/api/upms/config'
 
 export default {
-  name: 'PrintInStoreForm',
+  name: 'PrintInSbInfoBatch',
   components: { },
   data () {
     return {

+ 44 - 6
src/views/sqarepartmanage/sparepartinfo/SparePartInfo.vue

@@ -91,9 +91,11 @@
         <div class="table-operator">
           <a-button v-if="$auth('sqarepartmanage-spare-part-info-add')" type="primary" icon="plus" @click="handleAdd">新增</a-button>
           <a-button style="margin-left: 8px" v-if="$auth('sqarepartmanage-spare-part-info-export')" type="primary" icon="download" @click="doExport">导出</a-button>
-          <a-button style="margin-left: 8px" v-if="$auth('sb-infos-export')" type="primary" icon="upload" @click="doImport">初始化新增导入</a-button>
-          <a-button style="margin-left: 8px" v-if="$auth('sb-infos-export')" type="primary" icon="upload" @click="doImportForUpdate">修改导入</a-button>
-          <a-button style="margin-left: 8px" v-if="selectedRowKeys.length > 0 && $auth('sqarepartmanage-spare-part-info-del')" type="primary" icon="upload" @click="handleSpareSelect">批量矫正</a-button>
+          <a-button style="margin-left: 8px" v-if="$auth('sqarepartmanage-spare-part-info-export')" type="primary" icon="upload" @click="doImport">初始化新增导入</a-button>
+          <a-button style="margin-left: 8px" v-if="$auth('sqarepartmanage-spare-part-info-export')" type="primary" icon="upload" @click="doImportForUpdate">修改导入</a-button>
+<!--          <a-button style="margin-left: 8px" v-if="selectedRowKeys.length > 0 && $auth('sqarepartmanage-spare-part-info-del')" type="primary" icon="upload" @click="handleSpareSelect">批量矫正</a-button>-->
+          <a-button style="margin-left: 8px" type="primary" icon="printer" @click="handlePrintBatch()">批量打印</a-button>
+          <a-button style="margin-left: 8px" v-if="$auth('sb-infos-generate-code-all')" :loading="confirmLoading" type="primary" @click="batchGenerate()">重新生成二维码</a-button>
           <a-dropdown v-action:edit v-if="selectedRowKeys.length > 0 && $auth('sqarepartmanage-spare-part-info-del')">
             <a-menu slot="overlay">
               <a-popconfirm title="是否要删除所选数据?" @confirm="batchDelete()">
@@ -148,6 +150,7 @@
     <spare-part-info-select-modal-for-adjust :type="'radio'" ref="spareSelectModal" @selected="handleSpareSelected"/>
     <import-form-add ref="importModal" @ok="handleOk"/>
     <import-form-update ref="importModalForUpdate" @ok="handleOk"/>
+    <print-in-spare-batch ref="printInSbInfoBatch" @ok="handleOk"/>
   </a-card>
 </template>
 
@@ -160,16 +163,28 @@ import StoreList from './modules/StoreList'
 import InStoreList from './modules/InStoreList'
 import OutStoreList from './modules/OutStoreList'
 import SparePartUsedSelectModal from '@/views/sqarepartmanage/sparepartused/modules/SparePartUsedSelectModal'
-import { getSparePartInfoPage, updateSpareIdsBatch, deleteSparePartInfos, fetchSparePartInfo, fetchStoreList, fetchInStoreList, fetchOutStoreList, exportSparePartInfo } from '@/api/sqarepartmanage/sparepartinfo'
+import {
+  getSparePartInfoPage,
+  updateSpareIdsBatch,
+  deleteSparePartInfos,
+  fetchSparePartInfo,
+  fetchStoreList,
+  fetchInStoreList,
+  fetchOutStoreList,
+  exportSparePartInfo,
+  fetchSparePartInfos
+} from '@/api/sqarepartmanage/sparepartinfo'
 import { fetchSpareTypeTree } from '@/api/sqarepartmanage/sparetype'
 import ImportFormAdd from './modules/ImportFormAdd'
 import ImportFormUpdate from './modules/ImportFormUpdate'
 import SparePartInfoSelectModalForAdjust from '@/views/sqarepartmanage/sparepartinfo/modules/SparePartInfoSelectModalForAdjust'
-
+import PrintInSpareBatch from '@/views/sqarepartmanage/sparepartinfo/modules/PrintInSpareBatch'
+import { generateSpareCodeAll } from '@/api/upms/code'
 export default {
   name: 'SparePartInfoList',
   components: {
     STable,
+    PrintInSpareBatch,
     Ellipsis,
     BaseForm,
     Detail,
@@ -501,7 +516,30 @@ export default {
         this.BaseTool.UPLOAD.downLoadExportExcel(file)
       })
     },
-
+    batchGenerate () {
+      this.confirmLoading = true
+      this.$message.info('正在生成请稍后')
+      generateSpareCodeAll().then(res => {
+        this.confirmLoading = false
+        this.$message.info('生成成功')
+        this.handleOk()
+        this.$refs.table.clearSelected()
+      })
+    },
+    handlePrintBatch () {
+      this.visible = false
+      let ids = []
+      const length = this.selectedRows.length
+      if (length === 0) {
+        this.$message.info('请选择要打印的备件')
+        return
+      }
+      ids = this.selectedRows.map(item => item.id)
+      fetchSparePartInfos(ids).then(res => {
+        const modal = this.$refs.printInSbInfoBatch
+        modal.base(res.data)
+      })
+    },
     doImport () {
       this.$refs.importModal.base()
     },

+ 30 - 13
src/views/sqarepartmanage/sparepartinfo/modules/BaseForm.vue

@@ -338,21 +338,18 @@
         </row-item>
         <row-item>
           <a-form-item
-            label="备件图片"
+            label="图片"
             :labelCol="BaseTool.Constant.labelCol"
             :wrapperCol="BaseTool.Constant.wrapperCol"
           >
-            <a-upload
-              :action="uploadUrl"
-              :multiple="true"
-              list-type="picture"
-              :file-list="this.defaultApplicationFileList"
-              @change="handleApplicationFileChange"
-              accept="image/*"
-              :headers="headers"
-            >
-              <a-button> <a-icon type="upload" /> 上传图片 </a-button>
-            </a-upload>
+            <!--        <upload-img
+              ref="imageUpload"
+              @catchImage="catchImage"
+            ></upload-img>-->
+            <upload-spare-file
+              ref="imageUpload"
+              @catchImage="catchImage"
+            ></upload-spare-file>
           </a-form-item>
         </row-item>
         <row-item>
@@ -452,6 +449,7 @@ import { fetchStoreTree } from '@/api/store/store'
 import { selectSbModelListBySpareId } from '@/api/sb/modelbom'
 import SbInfoSelectModal from '@/views/sb/info/modules/SbInfoSelectModal'
 import BaseFormSpare from '@/views/sb/modelbom/modules/BaseFormSpare'
+
 export default {
   name: 'BaseSparePartInfo',
   components: {
@@ -536,6 +534,7 @@ export default {
       ],
       data: [],
       sbId: null,
+      image: '',
       selectedRowKeys: [],
       selectedRows: [],
       options: {
@@ -565,6 +564,7 @@ export default {
       if (this.BaseTool.Object.isBlank(record)) {
         this.modalTitle = '添加'
         this.isAdd = true
+        this.$refs.imageUpload.base(1, [])
         return
       }
       this.modalTitle = '编辑'
@@ -626,6 +626,18 @@ export default {
           'remark'
         ])))
       })
+      this.image = record.image
+      const fileList = []
+      if (record.image) {
+        fileList.push({
+          uid: '-1',
+          name: record.name,
+          status: 'done',
+          url: this.BaseTool.Constant.FILE_URL + record.image,
+          originUrl: record.image
+        })
+      }
+      this.$refs.imageUpload.base(1, fileList)
     },
     save () {
       const { form: { validateFieldsAndScroll, setFieldsValue } } = this
@@ -643,6 +655,7 @@ export default {
         }
         values.applicationFileList = this.applicationFileList
         values.detailList = this.data
+        values.image = this.image
         // 日期处理
         if (this.BaseTool.String.isBlank(values.id)) {
           addSparePartInfo(values)
@@ -720,7 +733,11 @@ export default {
         this.ggList = res.data
       })
     },
-
+    catchImage (fileList) {
+      if (fileList.length !== 0) {
+        this.image = fileList[0].url
+      }
+    },
     checkSpareNo () {
       const { form: { getFieldValue } } = this
       const typeId = getFieldValue('typeId')

+ 4 - 10
src/views/sqarepartmanage/sparepartinfo/modules/Detail.vue

@@ -43,16 +43,9 @@
       <detail-list-item term="创建人">{{ model.createdUserName }}</detail-list-item>
       <detail-list-item term="更新人">{{ model.updateUserName }}</detail-list-item>
       <detail-list-item term="更新日期">{{ model.updateTime }}</detail-list-item>
-    </detail-list>
-    <title-divider title="图片信息" width="90px"></title-divider>
-    <detail-list title="" :col="1">
-      <detail-list-item term="" v-if="model.applicationFileList != null && model.applicationFileList.length > 0">
-        <viewer :images="model.applicationFileList" @inited="inited" ref="viewer" :index="1" >
-          <img v-for="item in model.applicationFileList" :src="item.url" :key="item.id" class="image">
-        </viewer>
-      </detail-list-item>
-      <detail-list-item term="" v-if="model.applicationFileList == null || model.applicationFileList.length === 0">
-        暂无
+      <detail-list-item term="图片"><img :src="BaseTool.Constant.FILE_URL + model.image" width="200px" height="200px"/></detail-list-item>
+      <detail-list-item>
+        <img-code :src="model.qrCode" :type="2" title="点击重新生成二维码" :code-id="model.id" :width="200"></img-code>
       </detail-list-item>
     </detail-list>
     <title-divider title="设备信息" width="100px"></title-divider>
@@ -115,6 +108,7 @@ export default {
         'qrCode': null,
         'applicationFileList': [],
         'minStock': null,
+        'image': null,
         'initStock': null,
         'params': null,
         'remark': null,

+ 322 - 0
src/views/sqarepartmanage/sparepartinfo/modules/PrintInSpareBatch.vue

@@ -0,0 +1,322 @@
+<template>
+  <div class="print-content" v-show="visible">
+    <a-row :gutter="48" slot="extra">
+      <a-col :md="48" :sm="48">
+        <span class="table-page-search-submitButtons" style="float: right">
+          <a-button type="dashed" @click="handleEdit()">保存参数</a-button>
+          <a-button type="primary" style="margin-left: 8px" v-print="'#print-container-batch'" :disabled="disabled">打印</a-button>
+          <a-button style="margin-left: 8px" @click="handleCancel()">返回列表</a-button>
+        </span>
+      </a-col>
+    </a-row>
+    <a-row>
+      <a-col :span="4">
+        标签纸宽度(黑色背景)
+      </a-col>
+      <a-col :span="12">
+        <a-slider v-model="labelWidth" :min="1" :max="1000" />
+      </a-col>
+      <a-col :span="2">
+        <a-input-number v-model="labelWidth" style="marginLeft: 8px" />
+      </a-col>
+    </a-row>
+    <a-row>
+      <a-col :span="4">
+        标签表格宽度
+      </a-col>
+      <a-col :span="12">
+        <a-slider v-model="labelContentWidth" :min="1" :max="1000" />
+      </a-col>
+      <a-col :span="2">
+        <a-input-number v-model="labelContentWidth" suffix="px" style="marginLeft: 8px" />
+      </a-col>
+    </a-row>
+    <a-row>
+      <a-col :span="4">
+        标签表格高度
+      </a-col>
+      <a-col :span="12">
+        <a-slider v-model="labelContentHeight" :min="1" :max="1000" />
+      </a-col>
+      <a-col :span="2">
+        <a-input-number v-model="labelContentHeight" suffix="px" style="marginLeft: 8px" />
+      </a-col>
+    </a-row>
+    <a-row>
+      <a-col :span="4">
+        二维码宽度
+      </a-col>
+      <a-col :span="12">
+        <a-slider v-model="imgWidth" :min="1" :max="1000" />
+      </a-col>
+      <a-col :span="2">
+        <a-input-number v-model="imgWidth" suffix="px" style="marginLeft: 8px" />
+      </a-col>
+    </a-row>
+    <div class="container" :style="labelWidthProgress" id="print-container-batch">
+      <table class="gridtable list" :style="labelContentWidthProgress" :id="'printDiv' + record.id" v-for="record in sbInfoList" :key="record.id">
+        <tbody>
+          <tr>
+            <td class="text-center">备件名称</td>
+            <td class="text-center">{{ record.name }}</td>
+            <td rowspan="4" style="padding: 0 !important;" class="text-center"><img :style="imageProgress" :src="record.qrCode"></img></td>
+          </tr>
+          <tr>
+            <td class="text-center">备件编号</td>
+            <td class="text-center">{{ record.no }}</td>
+          </tr>
+          <tr>
+            <td class="text-center">规格型号</td>
+            <td class="text-center">{{ record.ggxh }}</td>
+          </tr>
+          <tr>
+            <td class="text-center" width='17%'>备件类型</td>
+            <td class="text-center">{{ record.typeName }}</td>
+          </tr>
+        </tbody>
+      </table>
+    </div>
+  </div>
+</template>
+
+<script>
+import { formatDate } from '@/utils/util'
+import { configData, updateSysConfigBatch } from '@/api/upms/config'
+
+export default {
+  name: 'PrintSpareBatch',
+  components: { },
+  data () {
+    return {
+      visible: false,
+      disabled: true,
+      sbInfoList: [],
+      count: 0,
+      levelMap: {},
+      user: this.$store.getters.userInfo,
+      labelWidth: 200,
+      labelContentWidth: 100,
+      labelContentHeight: 100,
+      imgWidth: 50,
+      configMap: {}
+      // 下拉框map
+    }
+  },
+  computed: {
+    labelWidthProgress () {
+      const style = {}
+      style.width = this.labelWidth + 'px'
+      style.backgroundColor = 'black'
+      style.textAlign = 'center'
+      return style
+    },
+    labelContentWidthProgress () {
+      const style = {}
+      style.width = this.labelContentWidth + 'px'
+      style.height = this.labelContentHeight + 'px'
+      style.backgroundColor = 'white'
+      style.textAlign = 'center'
+      style.margin = '4px auto'
+      return style
+    },
+    imageProgress () {
+      const style = {}
+      style.width = this.imgWidth + 'px'
+      return style
+    }
+  },
+  props: {},
+  created () {
+    // 下拉框map
+    this.levelMap = this.DictCache.getLabelByValueMapByType(this.DictCache.TYPE.SPARE_PART_INFO_LEVEL)
+    configData().then(res => {
+      this.configMap = res.data['config:open:value']
+      this.labelWidth = parseInt(this.configMap[this.DictCache.TYPE.SPARE_QR_CODE_LABEL_WIDTH])
+      this.labelContentWidth = parseInt(this.configMap[this.DictCache.TYPE.SPARE_QR_CODE_LABEL_CONTENT_WIDTH])
+      this.labelContentHeight = parseInt(this.configMap[this.DictCache.TYPE.SPARE_QR_CODE_LABEL_CONTENT_HEIGHT])
+      this.imgWidth = parseInt(this.configMap[this.DictCache.TYPE.SPARE_QR_CODE_LABEL_IMG_WIDTH])
+    })
+  },
+  methods: {
+    base (sbInfoList) {
+      this.disabled = true
+      this.visible = true
+      this.sbInfoList = sbInfoList
+      this.disabled = false
+    },
+    formatDateEn (value) {
+      return formatDate(new Date(value), 'yyyy-MM-dd')
+    },
+    formatDateCh (value) {
+      return formatDate(new Date(value), 'yyyy年MM月dd日')
+    },
+    handleCancel (values) {
+      this.visible = false
+      this.$emit('ok', values)
+    },
+    print () {
+      this.count = this.count + 1
+    },
+    handleEdit () {
+      const parameter = []
+      parameter.push({ code: this.DictCache.TYPE.SPARE_QR_CODE_LABEL_WIDTH, content: this.labelWidth })
+      parameter.push({ code: this.DictCache.TYPE.SPARE_QR_CODE_LABEL_CONTENT_WIDTH, content: this.labelContentWidth })
+      parameter.push({ code: this.DictCache.TYPE.SPARE_QR_CODE_LABEL_CONTENT_HEIGHT, content: this.labelContentHeight })
+      parameter.push({ code: this.DictCache.TYPE.SPARE_QR_CODE_LABEL_IMG_WIDTH, content: this.imgWidth })
+      updateSysConfigBatch(parameter).then(res => {
+        this.$message.info('更新成功, 退出,重新登录后全局生效')
+      })
+    }
+
+  }
+}
+</script>
+<style media=print>
+/* 应用这个样式的在打印时隐藏 */
+.noPrint {
+  display: none;
+}
+
+/* 应用这个样式的,从那个标签结束开始另算一页,之后在遇到再起一页,以此类推 */
+.page {
+  page-break-after: always;
+}
+</style>
+<style>
+.print-content{
+  margin: 0 auto;
+  width: 1000px;
+  background-color: #fff;
+}
+
+.container {
+  width: 100%;
+  padding-right: 15px;
+  padding-left: 15px;
+  margin-right: auto;
+  margin-left: auto;
+}
+
+.col-xs-1, .col-sm-1, .col-md-1, .col-lg-1, .col-xs-2, .col-sm-2, .col-md-2, .col-lg-2, .col-xs-3, .col-sm-3, .col-md-3, .col-lg-3, .col-xs-4, .col-sm-4, .col-md-4, .col-lg-4, .col-xs-5, .col-sm-5, .col-md-5, .col-lg-5, .col-xs-6, .col-sm-6, .col-md-6, .col-lg-6, .col-xs-7, .col-sm-7, .col-md-7, .col-lg-7, .col-xs-8, .col-sm-8, .col-md-8, .col-lg-8, .col-xs-9, .col-sm-9, .col-md-9, .col-lg-9, .col-xs-10, .col-sm-10, .col-md-10, .col-lg-10, .col-xs-11, .col-sm-11, .col-md-11, .col-lg-11, .col-xs-12, .col-sm-12, .col-md-12, .col-lg-12 {
+  position: relative;
+  min-height: 1px;
+  padding-right: 15px;
+  padding-left: 15px;
+}
+
+.text-left {
+  text-align: left;
+}
+
+.text-right {
+  text-align: right;
+}
+
+.text-center {
+  text-align: center;
+}
+
+table.gridtable {
+  width: 100%;
+  font-family: verdana, arial, sans-serif;
+  font-size: 11px;
+  color: #333333;
+  border-width: 1px;
+  border-color: #666666;
+  border-collapse: collapse;
+  page-break-after: always;
+}
+
+table.gridtable th {
+  border-width: 1px;
+  padding: 8px 0px;
+  border-style: solid;
+  border-color: #666666;
+  background-color: #dedede;
+}
+
+table.gridtable td {
+  border-width: 1px;
+  padding: 0;
+  border-style: solid;
+  color: black;
+  font-weight: bold;
+  border-color: #666666;
+  background-color: #ffffff;
+}
+
+.row {
+  margin-right: -15px;
+  margin-left: -15px;
+}
+
+.container:before,
+.container:after,
+.row:before, .row:after {
+  display: table;
+  content: " ";
+}
+
+.container:after, .row:after {
+  clear: both;
+}
+
+.col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12 {
+  float: left;
+}
+
+.col-md-12 {
+  width: 100%;
+}
+
+.col-md-11 {
+  width: 91.66666667%;
+}
+
+.col-md-10 {
+  width: 83.33333333%;
+}
+
+.col-md-9 {
+  width: 75%;
+}
+
+.col-md-8 {
+  width: 66.66666667%;
+}
+
+.col-md-7 {
+  width: 58.33333333%;
+}
+
+.col-md-6 {
+  width: 50%;
+}
+
+.col-md-5 {
+  width: 41.66666667%;
+}
+
+.col-md-4 {
+  width: 33.33333333%;
+}
+
+.col-md-3 {
+  width: 25%;
+}
+
+.col-md-2 {
+  width: 16.66666667%;
+}
+
+.col-md-1 {
+  width: 8.33333333%;
+}
+
+ .node-line{
+   position: absolute;
+   width: 60px;
+   height: 10px;
+   left:20%;
+ }
+</style>