20 changed files with 948 additions and 1009 deletions
			
			
		- 
					12src/api/shelf/index.js
- 
					58src/api/stockTask/index.js
- 
					14src/assets/iconfonts/light/iconfont.css
- 
					2src/assets/iconfonts/light/iconfont.js
- 
					14src/assets/iconfonts/light/iconfont.json
- 
					BINsrc/assets/iconfonts/light/iconfont.ttf
- 
					BINsrc/assets/iconfonts/light/iconfont.woff
- 
					BINsrc/assets/iconfonts/light/iconfont.woff2
- 
					9src/utils/request.js
- 
					56src/views/components/bookSwiper.vue
- 
					45src/views/components/canvasPreview.vue
- 
					130src/views/home.vue
- 
					321src/views/visualCheck/checkManage/dataScreening/girdList.vue
- 
					155src/views/visualCheck/checkManage/dataScreening/index.vue
- 
					70src/views/visualCheck/checkManage/dataScreening/regionsList.vue
- 
					686src/views/visualCheck/checkManage/dataScreening/shelfList copy.vue
- 
					146src/views/visualCheck/checkManage/dataScreening/shelfList.vue
- 
					179src/views/visualCheck/checkManage/paramSetting/index.vue
- 
					37src/views/visualCheck/mixins/index.js
- 
					21src/views/visualCheck/venueDevice/bookshelf/index.vue
						
							
						
						
							2
	
						
						src/assets/iconfonts/light/iconfont.js
						
							File diff suppressed because it is too large
							
							
								
									View File
								
							
						
					
				File diff suppressed because it is too large
							
							
								
									View File
								
							
						| @ -1,686 +0,0 @@ | |||
| <template> | |||
|   <div class="app-container"> | |||
|     <div class="venue-header"> | |||
|       <h4 @click="handleToGrids"><i class="iconfont icon-shuju" />书架总览</h4> | |||
|       <span class="bookshelf-area">{{ floorName }} - {{ regionName }}</span> | |||
|       <p><i class="iconfont icon-gongsi" />{{ user.fonds.fondsName }}</p> | |||
|     </div> | |||
|     <div class="venue-content"> | |||
|       <crudOperation :permission="permission"> | |||
|         <template v-slot:middle> | |||
|           <el-select v-model="layerVal" clearable size="small" placeholder="楼层" class="filter-item" style="width: 100px; margin-right: 20px;"> | |||
|             <el-option v-for="item in layerOptions" :key="item.id" :label="item.name" :value="item.id" /> | |||
|           </el-select> | |||
|           <el-button v-permission="permission.add" size="mini" @click="crud.toAdd"> | |||
|             <i class="iconfont icon-shengchengpandiandan" /> | |||
|             书架盘点 | |||
|           </el-button> | |||
|         </template> | |||
|         <template v-slot:right> | |||
|           <el-button :loading="crud.downloadLoading" size="mini" @click="doExport(crud.selections)"> | |||
|             <i class="iconfont icon-daochu" /> | |||
|             导出 | |||
|           </el-button> | |||
|         </template> | |||
|       </crudOperation> | |||
|       <div class="venue-left"> | |||
|         <div class="container-right tab-content"> | |||
|           <span class="right-top-line" /> | |||
|           <span class="left-bottom-line" /> | |||
| 
 | |||
|           <!-- <div style="display: flex;justify-content: flex-start; align-items: center;"> --> | |||
|           <swiper | |||
|             ref="swiperTitle" | |||
|             class="swiper-title" | |||
|             :options="swiperOptionTitle" | |||
|             :auto-update="true" | |||
|             :auto-destroy="true" | |||
|             :delete-instance-on-destroy="true" | |||
|             :cleanup-styles-on-destroy="true" | |||
|           > | |||
|             <swiper-slide | |||
|               v-for="(item, index) of tabListData" | |||
|               ref="swiperSlideItem" | |||
|               :key="'name' + index" | |||
|               :iname="item.name" | |||
|               class="swiper-slide-title" | |||
|             > | |||
|               <div | |||
|                 class="tab-name" | |||
|                 :class="{ active: index === swiperActiveIndex }" | |||
|                 @click="handleSlidClickFun(index)" | |||
|               > | |||
|                 {{ item.name }} | |||
|               </div> | |||
|             </swiper-slide> | |||
|           </swiper> | |||
|           <div class="tag-info"> | |||
|             <p>错序:1</p> | |||
|             <p>错架:1</p> | |||
|             <p>在架:20</p> | |||
|           </div> | |||
|           <!-- </div> --> | |||
|           <swiper | |||
|             ref="swiperContent" | |||
|             class="swiper-content" | |||
|             :options="swiperOptionContent" | |||
|             :auto-update="true" | |||
|             :auto-destroy="true" | |||
|             :delete-instance-on-destroy="true" | |||
|             :cleanup-styles-on-destroy="true" | |||
|           > | |||
|             <swiper-slide | |||
|               v-for="(item, index) of tabListData" | |||
|               :key="'content' + index" | |||
|               class="swiper-slide-content" | |||
|             > | |||
| 
 | |||
|               <ul class="cabinet-row"> | |||
|                 <li | |||
|                   v-for="(cell,i) in booShelfGrid" | |||
|                   :key="i" | |||
|                   class="cabinet-cell" | |||
|                   :style="cellStyle" | |||
|                   :class="{ active: i === cellIndex }" | |||
|                   @click="handleCellCurrent(cell,i)" | |||
|                   @mouseenter="showPopover(i)" | |||
|                   @mouseleave="hidePopover" | |||
|                 > | |||
|                   <span class="cell-name">{{ removeAreaPrefix(cell.gridName) }}</span> | |||
|                   <!-- v-if="popoverIndex === i" --> | |||
|                   <el-popover | |||
|                     v-if="popoverIndex === i" | |||
|                     ref="popover" | |||
|                     :visible="popoverVisible[i]" | |||
|                     width="400" | |||
|                     :style="popoverStyles[i]" | |||
|                     trigger="manual" | |||
|                   > | |||
|                     <div slot="reference" class="popover-content"> | |||
|                       <div class="tooltip-top"> | |||
|                         <h4>层位概况</h4> | |||
|                         <i class="update-time">2024-11-28 09:46</i> | |||
|                       </div> | |||
|                       <ul> | |||
|                         <li><p>层位</p><em class="percentage"><i style="color: #fff;">{{ removeAreaPrefix(cell.gridName) }}</i></em></li> | |||
|                         <li><p>在架</p><em><i>15000</i>册</em></li> | |||
|                         <li><p>错架</p><em><i>300</i>层</em> <em class="percentage">(2.00%)</em></li> | |||
|                         <li><p>错序</p><em><i>0</i>层</em><em class="percentage">(0.00%)</em></li> | |||
|                       </ul> | |||
|                     </div> | |||
|                   </el-popover> | |||
|                 </li> | |||
|               </ul> | |||
|             </swiper-slide> | |||
|           </swiper> | |||
|         </div> | |||
|       </div> | |||
|       <div class="venue-right"> | |||
|         <div class="lib-right-item lib-info"> | |||
|           <h4>本架概况</h4> | |||
|           <ul class="data-right-list"> | |||
|             <li><p>书架</p><span><i>001排</i></span></li> | |||
|             <li><p>规则</p><span><i>双面 6 x 5</i></span></li> | |||
|           </ul> | |||
|         </div> | |||
|         <div class="lib-right-item"> | |||
|           <h4>本架盘点概况</h4> | |||
|           <div class="refresh-date">2024-11-28 09:46</div> | |||
|           <ul class="data-right-list"> | |||
|             <li><p>在架</p><span><i>15000</i>册</span></li> | |||
|             <li><p>错架</p><span><i>300</i>层</span> <span class="percentage">(2.00%)</span></li> | |||
|             <li><p>错序</p><span><i>0</i>层</span><span class="percentage">(0.00%)</span></li> | |||
|           </ul> | |||
|         </div> | |||
|       </div> | |||
|     </div> | |||
| 
 | |||
|     <!-- form --> | |||
|     <el-dialog append-to-body :close-on-click-modal="false" :modal-append-to-body="false" :before-close="crud.cancelCU" :visible="crud.status.cu > 0" :title="crud.status.title"> | |||
|       <span class="dialog-right-top" /> | |||
|       <span class="dialog-left-bottom" /> | |||
|       <div class="setting-dialog"> | |||
|         <el-form ref="form" :inline="true" :model="form" :rules="rules" size="small" label-width="80px"> | |||
|           <el-form-item label="盘点单号" prop="taskName"> | |||
|             <el-input v-model="form.taskName" /> | |||
|           </el-form-item> | |||
|           <el-form-item label="盘点类型" prop="taskType"> | |||
|             <el-input v-model="form.taskType" /> | |||
|           </el-form-item> | |||
|           <el-form-item label="目标位置" prop="location"> | |||
|             <el-input v-model="form.location" /> | |||
|           </el-form-item> | |||
|           <el-form-item label="目标数量" prop="number"> | |||
|             <el-input v-model="form.number" /> | |||
|           </el-form-item> | |||
|           <el-row> | |||
|             <el-form-item label="备注" prop="remark"> | |||
|               <el-input v-model="form.remark" type="textarea" style="width: 572px;" :rows="4" /> | |||
|             </el-form-item> | |||
|           </el-row> | |||
|         </el-form> | |||
|         <div slot="footer" class="dialog-footer"> | |||
|           <el-button type="text" @click="crud.cancelCU">取消</el-button> | |||
|           <el-button :loading="crud.status.cu === 2" type="primary" @click="crud.submitCU">保存</el-button> | |||
|         </div> | |||
|       </div> | |||
|     </el-dialog> | |||
|   </div> | |||
| </template> | |||
| 
 | |||
| <script> | |||
| import { FetchInitShelfGridByShelfId, FetchBookShelfDetails } from '@/api/shelf/index' | |||
| import crudRegion from '@/api/area/index' | |||
| import CRUD, { presenter, header, form, crud } from '@crud/crud' | |||
| import crudOperation from '@crud/CRUD.operation' | |||
| import { mapGetters } from 'vuex' | |||
| import { swiper, swiperSlide } from 'vue-awesome-swiper' | |||
| import 'swiper/dist/css/swiper.css' | |||
| 
 | |||
| const defaultForm = { id: null, taskType: null, taskName: null, location: null, number: null, remark: null } | |||
| export default { | |||
|   name: 'DataScreening', | |||
|   components: { swiper, swiperSlide, crudOperation }, | |||
|   cruds() { | |||
|     return CRUD({ title: '架位总览', url: 'api/libraryRegion/initLibraryRegionList', crudMethod: { ...crudRegion }, sort: [], optShow: { | |||
|       add: false, | |||
|       edit: false, | |||
|       del: false, | |||
|       download: false, | |||
|       group: false, | |||
|       reset: false | |||
|     }, | |||
|     queryOnPresenterCreated: false | |||
|     }) | |||
|   }, | |||
|   mixins: [presenter(), header(), form(defaultForm), crud()], | |||
|   data() { | |||
|     const _this = this | |||
|     return { | |||
|       floorName: null, | |||
|       regionName: null, | |||
|       bookShelfDetails: null, | |||
|       booShelfGrid: null, | |||
|       cellInfo: { | |||
|         gridName: null, | |||
|         startSortmark: null, | |||
|         endSortmark: null, | |||
|         cameraId: null | |||
|       }, | |||
|       callNumVisible: false, | |||
|       layerNum: 0, | |||
|       rackNum: 0, | |||
|       swiperActiveIndex: 0, | |||
|       cellIndex: null, | |||
|       swiperOptionContent: { | |||
|         slidesPerView: 'auto', | |||
|         on: { | |||
|           slideChangeTransitionStart: function() { | |||
|             _this.cellIndex = null | |||
|             _this.swiperActiveIndex = this.activeIndex | |||
|             console.log('activeIndexffff', this.swiperActiveIndex) | |||
|             _this.swiperTitle.slideTo(this.activeIndex, 500, false) | |||
|           } | |||
|         } | |||
|       }, | |||
|       swiperOptionTitle: { | |||
|         slidesPerView: 'auto', | |||
|         freeMode: true | |||
|       }, | |||
|       layerVal: '001排', | |||
|       layerOptions: [{ id: 1, name: '001排' }], | |||
|       tabListData: [], | |||
|       permission: { | |||
|         add: ['admin', 'floor:add'], | |||
|         edit: ['admin', 'floor:edit'], | |||
|         del: ['admin', 'floor:del'] | |||
|       }, | |||
|       rules: { | |||
|         taskName: [ | |||
|           { required: true, message: '请输入盘点单号', trigger: 'blur' } | |||
|         ], | |||
|         taskType: [ | |||
|           { required: true, message: '请输入盘点类型', trigger: 'blur' } | |||
|         ], | |||
|         location: [ | |||
|           { required: true, message: '请输入目标位置', trigger: 'blur' } | |||
|         ], | |||
|         number: [ | |||
|           { required: true, message: '请输入目标数量', trigger: 'blur' } | |||
|         ] | |||
|       }, | |||
|       popoverIndex: 1, | |||
|       popoverVisible: [], | |||
|       popoverStyles: [] | |||
|     } | |||
|   }, | |||
|   computed: { | |||
|     ...mapGetters([ | |||
|       'user', | |||
|       'baseApi' | |||
|     ]), | |||
|     swiperContent() { | |||
|       return this.$refs.swiperContent.$el.swiper | |||
|     }, | |||
|     swiperTitle() { | |||
|       return this.$refs.swiperTitle.$el.swiper | |||
|     }, | |||
|     cellStyle: function() { | |||
|       // const h = '100%/' + this.layerNum | |||
|       // const w = '100%/' + this.rackNum | |||
|       const h = '70px' | |||
|       const w = '100%/' + this.rackNum | |||
|       return { width: `calc(${w} - 4px )`, height: `calc(${h} - 2px)` } | |||
|     } | |||
|   }, | |||
|   async created() { | |||
|     if (localStorage.getItem('dataScreenRegion')) { | |||
|       const dataScreenRegion = JSON.parse(localStorage.getItem('dataScreenRegion')) | |||
|       this.floorName = dataScreenRegion.floorName | |||
|       this.regionName = dataScreenRegion.regionName | |||
|       // 单面/双面 | |||
|       this.tabListData = dataScreenRegion.rowType === 1 | |||
|         ? dataScreenRegion.toward === 1 | |||
|           ? [{ name: 'A面' }] | |||
|           : [{ name: 'B面' }] | |||
|         : [{ name: 'A面' }, { name: 'B面' }] | |||
| 
 | |||
|       FetchBookShelfDetails({ 'shelfId': dataScreenRegion.id }).then(res => { | |||
|         this.layerNum = res.shelfFloor | |||
|         this.rackNum = res.shelfShelf | |||
|         this.bookShelfDetails = res | |||
|         this.getInitShelfGridByShelfId(this.bookShelfDetails.toward) | |||
|       }).catch(() => { | |||
|       }) | |||
|     } | |||
|   }, | |||
|   methods: { | |||
|     handleToGrids() { | |||
|       this.$router.push({ path: '/dataScreening/gird', query: { }}) | |||
|     }, | |||
|     [CRUD.HOOK.beforeRefresh]() { | |||
|     }, | |||
|     [CRUD.HOOK.afterRefresh](crud) { | |||
|     }, | |||
|     // 提交前的验证 | |||
|     [CRUD.HOOK.afterValidateCU](crud) { | |||
|       return true | |||
|     }, | |||
|     removeAreaPrefix(gridNames) { | |||
|       const index = gridNames.indexOf('区') | |||
|       if (index !== -1) { | |||
|         return gridNames.substring(index + 1) | |||
|       } | |||
|       return gridNames | |||
|     }, | |||
|     getInitShelfGridByShelfId(toward) { | |||
|       // rowType 1 单 2 双 | |||
|       // toward 1 A面  2 B面 | |||
|       // shelfType 1 '始终最左边为第1架(S型排架)' | |||
|       // shelfType 2 'A面最左为第1架(B面最左为最后1架)' | |||
|       // shelfType 3 'B面最左为第1架(A面最左为最后1架)' | |||
|       // floorType 1 '最顶层为第一层(从上至下)' | |||
|       // floorType 2 '最底层为第一层(从下至上)' | |||
|       FetchInitShelfGridByShelfId({ 'shelfId': this.bookShelfDetails.id, 'toward': toward }).then(res => { | |||
|         const sortFunction = toward === 1 ? { | |||
|           1: { 1: 'sortBookshelvesLeftTop', 2: 'sortBookshelvesLeftBottom' }, | |||
|           2: { 1: 'sortBookshelvesLeftTop', 2: 'sortBookshelvesLeftBottom' }, | |||
|           3: { 1: 'sortBookshelvesRightTop', 2: 'sortBookshelvesRightBottom' } | |||
|         } : { | |||
|           1: { 1: 'sortBookshelvesLeftTop', 2: 'sortBookshelvesLeftBottom' }, | |||
|           2: { 1: 'sortBookshelvesRightTop', 2: 'sortBookshelvesRightBottom' }, | |||
|           3: { 1: 'sortBookshelvesLeftTop', 2: 'sortBookshelvesLeftBottom' } | |||
|         } | |||
|         const shelfType = this.bookShelfDetails.shelfType | |||
|         const floorType = this.bookShelfDetails.floorType | |||
|         const sortMethod = sortFunction[shelfType][floorType] | |||
|         this.booShelfGrid = this[sortMethod](res) | |||
| 
 | |||
|         this.popoverVisible = Array(this.booShelfGrid.length).fill(false) | |||
|         // this.popoverStyles = new Array(this.booShelfGrid.length).fill({ position: 'absolute', left: '20%', top: '48px' }) | |||
|       }).catch(() => { | |||
|       }) | |||
|     }, | |||
|     // 最左为第一架, 最顶层为第一层   从上往下 | |||
|     sortBookshelvesLeftTop(data) { | |||
|       const sortedData = [] | |||
|       const maxFloor = Math.max(...data.map(item => parseInt(item.gridFloor))) | |||
|       const maxShelf = Math.max(...data.map(item => parseInt(item.gridShelf.slice(-1)))) | |||
| 
 | |||
|       for (let i = 1; i <= maxFloor; i++) { | |||
|         for (let j = 1; j <= maxShelf; j++) { | |||
|           const currentShelf = data.find(item => parseInt(item.gridFloor) === i && parseInt(item.gridShelf.slice(-1)) === j) | |||
|           if (currentShelf) { | |||
|             sortedData.push(currentShelf) | |||
|           } | |||
|         } | |||
|       } | |||
|       return sortedData | |||
|     }, | |||
|     // 最右为第一架,最左为最后一架, 最顶层为第一层   从上往下 | |||
|     sortBookshelvesRightTop(data) { | |||
|       const sortedData = [] | |||
|       // 获取最大的楼层数 | |||
|       const maxFloor = Math.max(...data.map(item => parseInt(item.gridFloor))) | |||
|       const maxShelf = Math.max(...data.map(item => parseInt(item.gridShelf.match(/\d+$/)[0]))) | |||
|       for (let i = 1; i <= maxFloor; i++) { | |||
|         // 从最大的书架层数开始,向下排序 | |||
|         for (let j = maxShelf; j >= 1; j--) { | |||
|           const currentShelf = data.find(item => parseInt(item.gridFloor) === i && parseInt(item.gridShelf.match(/\d+$/)[0]) === j) | |||
|           if (currentShelf) { | |||
|             sortedData.push(currentShelf) | |||
|           } | |||
|         } | |||
|       } | |||
|       return sortedData | |||
|     }, | |||
|     // 最左为第一架, 最底层为第一层   从下往上 | |||
|     sortBookshelvesLeftBottom(data) { | |||
|       const sortedData = [] | |||
|       // 获取最大的楼层数 | |||
|       const maxFloor = Math.max(...data.map(item => parseInt(item.gridFloor))) | |||
|       // 获取最大的书架层数 | |||
|       const maxShelf = Math.max(...data.map(item => parseInt(item.gridShelf.slice(-1)))) | |||
|       for (let i = maxFloor; i >= 1; i--) { | |||
|         for (let j = 1; j <= maxShelf; j++) { | |||
|           const currentShelf = data.find(item => parseInt(item.gridFloor) === i && parseInt(item.gridShelf.slice(-1)) === j) | |||
|           if (currentShelf) { | |||
|             sortedData.push(currentShelf) | |||
|           } | |||
|         } | |||
|       } | |||
|       return sortedData | |||
|     }, | |||
|     // 最左为最后一架, 最底层为第一层    从下往上 | |||
|     sortBookshelvesRightBottom(data) { | |||
|       const sortedData = [] | |||
|       // 获取最大的楼层数 | |||
|       const maxFloor = Math.max(...data.map(item => parseInt(item.gridFloor))) | |||
|       const maxShelfPerFloor = data.map(item => parseInt(item.gridShelf.match(/\d+$/)[0])) | |||
|         .reduce((acc, curr, index, arr) => { | |||
|           const floor = parseInt(data[index].gridFloor) | |||
|           if (!acc[floor]) acc[floor] = 1 | |||
|           if (acc[floor] < curr) acc[floor] = curr | |||
|           return acc | |||
|         }, {}) | |||
|       // 从最大的楼层开始向下遍历 | |||
|       for (let i = maxFloor; i >= 1; i--) { | |||
|         // 从最大的书架编号开始向左遍历 | |||
|         for (let j = maxShelfPerFloor[i] || 1; j >= 1; j--) { | |||
|           const currentShelf = data.find(item => parseInt(item.gridFloor) === i && parseInt(item.gridShelf.match(/\d+$/)[0]) === j) | |||
|           if (currentShelf) { | |||
|             sortedData.push(currentShelf) | |||
|           } | |||
|         } | |||
|       } | |||
|       return sortedData | |||
|     }, | |||
|     handleSlidClickFun(index) { | |||
|       this.cellIndex = null | |||
|       this.handleSlideToFun(index) | |||
|       if (localStorage.getItem('bookShelfDetails')) { | |||
|         this.getInitShelfGridByShelfId(index + 1) | |||
|       } | |||
|     }, | |||
|     handleSlideToFun(index) { | |||
|       this.swiperActiveIndex = index | |||
|       this.swiperContent.slideTo(index, 500, false) | |||
|       this.swiperTitle.slideTo(index, 500, false) | |||
|     }, | |||
|     handleCellCurrent(item, index) { | |||
|       console.log('index', index) | |||
|       this.cellIndex = index | |||
|       this.cellInfo = { | |||
|         id: item.id, | |||
|         gridName: item.gridName, | |||
|         startSortmark: item.startSortmark, | |||
|         endSortmark: item.endSortmark, | |||
|         cameraId: item.cameraId, | |||
|         check: item.isCheck, | |||
|         order: item.isOrder | |||
|       } | |||
|     }, | |||
|     showPopover(index) { | |||
|       this.popoverIndex = index | |||
|       // 显示对应的 popover | |||
|       if (!this.popoverVisible[index]) { | |||
|         this.$set(this.popoverVisible, index, true) | |||
|       } | |||
| 
 | |||
|       const lastColumnIndexes = [] | |||
|       const secondLastColumnIndexes = [] | |||
| 
 | |||
|       for (let i = 0; i < this.booShelfGrid.length; i++) { | |||
|       // 计算当前数据项的列索引 | |||
|         const columnIndex = i % this.rackNum | |||
|         // 如果是最后一列(第5列) | |||
|         if (columnIndex === this.rackNum - 1) { | |||
|           lastColumnIndexes.push(i) | |||
|           // 更新最后一列的样式 | |||
|           this.$set(this.popoverStyles, i, { position: 'absolute', left: '-140px', top: '48px' }) | |||
|         } | |||
|         // 如果是倒数第二列(第4列) | |||
|         if (columnIndex === this.rackNum - 2) { | |||
|           secondLastColumnIndexes.push(i) | |||
|           // 更新倒数第二列的样式 | |||
|           this.$set(this.popoverStyles, i, { position: 'absolute', left: '-20px', top: '48px' }) | |||
|         } | |||
|       } | |||
|     }, | |||
|     hidePopover() { | |||
|       this.popoverIndex = null | |||
|       // 隐藏所有的popover | |||
|       this.popoverVisible.forEach((isVisible, index) => { | |||
|         if (isVisible) { | |||
|           this.$set(this.popoverVisible, index, false) | |||
|         } | |||
|       }) | |||
|     } | |||
|   } | |||
| } | |||
| </script> | |||
| 
 | |||
| <style lang="scss" scoped> | |||
| .container-right{ | |||
|   min-height: calc(100vh - 232px) !important; | |||
| } | |||
| .venue-content{ | |||
|   position: relative; | |||
| } | |||
| 
 | |||
| .crud-opts{ | |||
|   position: absolute; | |||
|   right: 20px; | |||
|   top: 10px; | |||
| } | |||
| .venue-left{ | |||
|   flex: 1; | |||
|   margin-right: 0 !important; | |||
|   .venue-preview{ | |||
|     height: 633px !important; | |||
|   } | |||
| } | |||
| .venue-right{ | |||
|   display: flex; | |||
|   flex-direction: column; | |||
|   width: 400px; | |||
|   padding: 50px 10px 20px 10px !important; | |||
|   .lib-right-item{ | |||
|     position: relative; | |||
|     padding-bottom: 10px; | |||
|     margin-bottom: 10px; | |||
|     border: 1px solid #E8F2FF; | |||
|     border-radius: 4px; | |||
|     h4{ | |||
|       padding: 6px 10px; | |||
|       background-color: #E8F2FF; | |||
|       color: #000; | |||
|       line-height: 30px; | |||
|       border-bottom: 1px solid #edeff3; | |||
|     } | |||
|     .refresh-date{ | |||
|       position: absolute; | |||
|       right: 14px; | |||
|       top: 10px; | |||
|       font-size: 12px; | |||
|       line-height: 30px; | |||
|     } | |||
|   } | |||
| } | |||
| 
 | |||
| .data-right-list { | |||
|   padding-top: 10px; | |||
|   li{ | |||
|     display: flex; | |||
|     justify-content: flex-start; | |||
|     align-items: center; | |||
|     line-height: 36px; | |||
| 
 | |||
|     p{ | |||
|       width: 80px; | |||
|       font-weight: bold; | |||
|       text-align: right; | |||
|     } | |||
|     span{ | |||
|       width: 140px; | |||
|       display: block; | |||
|       text-align: right; | |||
|       i{ | |||
|         font-style: normal; | |||
|         font-weight: bold; | |||
|         padding: 0 10px; | |||
|         color: #0348f3; | |||
|       } | |||
|       &.percentage{ | |||
|         width: auto; | |||
|       } | |||
|     } | |||
|   } | |||
| } | |||
| .swiper-title{ | |||
|   ::v-deep .swiper-wrapper{ | |||
|     margin: 10px 0; | |||
|     border-bottom: 1px solid #EDEFF3; | |||
|   } | |||
| } | |||
| .swiper-slide-title { | |||
| 	width: auto !important; | |||
|   margin-right: 20px; | |||
|   cursor: pointer; | |||
| 	.tab-name { | |||
| 		padding: 10px; | |||
| 		&.active { | |||
| 			color: #0348F3; | |||
|       border-bottom: 3px solid #0348F3; | |||
| 		} | |||
| 	} | |||
| } | |||
| 
 | |||
| .swiper-content{ | |||
|   height: 610px; | |||
| } | |||
| .tag-info{ | |||
|   position: absolute; | |||
|   right: 20px; | |||
|   top: 34px; | |||
|   display: flex; | |||
|   justify-content: flex-start; | |||
|   padding-left: 100px; | |||
|   p{ | |||
|     margin-left: 20px; | |||
|     margin-top: -4px; | |||
|     font-size: 14px; | |||
|   } | |||
| } | |||
| .cabinet-row .cabinet-cell{ | |||
|   background: url('~@/assets/images/shelf02.png') repeat-x left top; | |||
|   background-size: 100% 100%; | |||
|   border: none; | |||
|   overflow: inherit; | |||
|   cursor: pointer; | |||
|   &::before{ | |||
|     content: ""; | |||
|     position: absolute; | |||
|     left: 0; | |||
|     top: 0; | |||
|     width: 6px; | |||
|     height: 68px; | |||
|     background: url('~@/assets/images/shelf01.png') no-repeat left top; | |||
|     background-size: 100% 100%; | |||
|   } | |||
|   &::after{ | |||
|     content: ""; | |||
|     position: absolute; | |||
|     right: -4px; | |||
|     top: 0; | |||
|     width: 6px; | |||
|     height: 68px; | |||
|     background: url('~@/assets/images/shelf01.png') no-repeat left top; | |||
|     background-size: 100% 100%; | |||
|   } | |||
|   span.cell-name{ | |||
|     position: initial !important; | |||
|     transform: none; | |||
|     line-height: 68px; | |||
|   } | |||
| } | |||
| ::v-deep .cabinet-row .cabinet-cell span.el-popover__reference-wrapper{ | |||
|   position: absolute !important; | |||
|   left: 50% !important; | |||
|   top: 20px !important; | |||
|   transform: none; | |||
|   width: 300px; | |||
|   height: 210px; | |||
|   background:rgba(0,0,0,.8); | |||
|   color: #fff; | |||
|   border-radius: 6px; | |||
|   z-index: 99999999; | |||
| 
 | |||
|   .popover-content{ | |||
|     .tooltip-top{ | |||
|       display: flex; | |||
|       justify-content: space-between; | |||
|       align-items: center; | |||
|       height: 40px; | |||
|       line-height: 40px; | |||
|       padding: 0 10px; | |||
|       border-bottom: 1px solid #fff; | |||
|     } | |||
|     .tooltip-top i{ | |||
|       font-style: normal; | |||
|       font-size: 12px; | |||
|     } | |||
|     ul{ | |||
|       padding: 10px; | |||
|     } | |||
|     ul li{ | |||
|       display: flex; | |||
|       justify-content: flex-start; | |||
|       align-items: center; | |||
|       line-height: 36px; | |||
|       font-style: normal; | |||
|     } | |||
| 
 | |||
|     ul li p{ | |||
|       width: 80px; | |||
|       font-weight: bold; | |||
|       text-align: right; | |||
|     } | |||
|     ul li em{ | |||
|       width: 100px; | |||
|       display: block; | |||
|       text-align: right; | |||
|       font-style: normal; | |||
|     } | |||
|     ul li i{ | |||
|       font-style: normal; | |||
|       font-weight: bold; | |||
|       padding: 0 10px; | |||
|       color: #0348f3; | |||
|     } | |||
|     ul li em.percentage{ | |||
|       width: auto; | |||
|     } | |||
|   } | |||
| } | |||
| </style> | |||
| @ -0,0 +1,37 @@ | |||
| import { FetchInitHomeInfo, FetchInitStockInfo } from '@/api/stockTask/index' | |||
| import { mapGetters } from 'vuex' | |||
| export const dataScreeningCrud = { | |||
|   mixins: [], | |||
|   // 组件共用属性
 | |||
|   data() { | |||
|     return { | |||
|       baseData: {}, | |||
|       baseStockData: {} | |||
|     } | |||
|   }, | |||
|   computed: { | |||
|     ...mapGetters([ | |||
|       'user', | |||
|       'baseApi' | |||
|     ]) | |||
|   }, | |||
|   // 组件挂载时的共用方法
 | |||
|   mounted() { | |||
|     this.handleInitHomeInfo() | |||
|   }, | |||
|   // 组件共用方法
 | |||
|   methods: { | |||
|     handleInitHomeInfo() { | |||
|       FetchInitHomeInfo().then(res => { | |||
|         this.baseData = res | |||
|       }).catch(() => { | |||
|       }) | |||
|     }, | |||
|     handleInitStockInfo(params) { | |||
|       FetchInitStockInfo(params).then(res => { | |||
|         this.baseStockData = res | |||
|       }).catch(() => { | |||
|       }) | |||
|     } | |||
|   } | |||
| } | |||
						Write
						Preview
					
					
					Loading…
					
					Cancel
						Save
					
		Reference in new issue