You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
804 lines
31 KiB
804 lines
31 KiB
<template>
|
|
<div class="app-container row-container">
|
|
<div class="head-container">
|
|
<div class="head-search">
|
|
<!-- 搜索 -->
|
|
<el-select v-model="query.stockStatus" clearable size="small" placeholder="盘点状态" class="filter-item" style="width: 120px" @change="crud.toQuery">
|
|
<i slot="prefix" class="iconfont icon-zhuangtai" />
|
|
<el-option v-for="item in statusOptions" :key="item.key" :label="item.display_name" :value="item.key" />
|
|
</el-select>
|
|
<el-select v-model="query.stockType" clearable size="small" placeholder="盘点类型" class="filter-item" style="width: 120px" @change="crud.toQuery">
|
|
<i slot="prefix" class="iconfont icon-zhuangtai" />
|
|
<el-option v-for="item in TypeOptions" :key="item.key" :label="item.display_name" :value="item.key" />
|
|
</el-select>
|
|
<date-range-picker v-model="blurryTime" class="date-item" />
|
|
<el-input v-model="query.search" clearable size="small" placeholder="输入单号/备注关键字搜索" prefix-icon="el-icon-search" style="width: 220px;" class="filter-item" @clear="crud.toQuery" @keyup.enter.native="crud.toQuery" />
|
|
<rrOperation />
|
|
</div>
|
|
<crudOperation :permission="permission">
|
|
<template v-slot:middle>
|
|
<el-button v-permission="permission.add" class="check-btn" size="mini" @click="crud.toAdd">
|
|
<i class="iconfont icon-shengchengpandiandan" />
|
|
全量盘点
|
|
</el-button>
|
|
</template>
|
|
</crudOperation>
|
|
</div>
|
|
<div class="container-wrap">
|
|
<span class="right-top-line" />
|
|
<span class="left-bottom-line" />
|
|
<el-table
|
|
ref="table"
|
|
v-loading="crud.loading"
|
|
class="archives-table"
|
|
:data="crud.data"
|
|
style="width: 100%;"
|
|
height="calc(100vh - 329px)"
|
|
@selection-change="crud.selectionChangeHandler"
|
|
@row-click="clickRowHandler"
|
|
@row-dblclick="handleDbClick"
|
|
>
|
|
<el-table-column prop="stockBill" label="盘点单号" />
|
|
<el-table-column prop="stockType" label="盘点类型">
|
|
<template slot-scope="scope">
|
|
<span v-if="scope.row.stockType===1">全量盘点</span>
|
|
<span v-if="scope.row.stockType===2">区域盘点</span>
|
|
<span v-if="scope.row.stockType===3">计划盘点</span>
|
|
<span v-if="scope.row.stockType===4">书架盘点</span>
|
|
<span v-if="scope.row.stockType===5">架位盘点</span>
|
|
<span v-if="scope.row.stockType===6">层位盘点</span>
|
|
<span v-if="scope.row.stockType===7">移动盘点</span>
|
|
</template>
|
|
</el-table-column>
|
|
<el-table-column prop="stockRegion" label="目标位置" min-width="180" />
|
|
<el-table-column prop="stockGridNum" label="目标数量">
|
|
<template slot-scope="scope">
|
|
<div>{{ scope.row.stockGridNum + ' / '+ (scope.row.totalGridNum?scope.row.totalGridNum:'0') +' 层位' }}</div>
|
|
</template>
|
|
</el-table-column>
|
|
<el-table-column prop="stockRemarks" label="备注">
|
|
<template slot-scope="scope">
|
|
<div v-if="scope.row.stockRemarks !== null">{{ scope.row.stockRemarks }}</div>
|
|
<div v-else>-</div>
|
|
</template>
|
|
</el-table-column>
|
|
<el-table-column prop="startTime" label="盘点开始时间">
|
|
<template slot-scope="scope">
|
|
<div v-if="scope.row.startTime !== null">{{ scope.row.startTime | parseTime }}</div>
|
|
<div v-else>-</div>
|
|
</template>
|
|
</el-table-column>
|
|
<el-table-column prop="endTime" label="盘点结束时间">
|
|
<template slot-scope="scope">
|
|
<div v-if="scope.row.endTime !== null">{{ scope.row.endTime | parseTime }}</div>
|
|
<div v-else>-</div>
|
|
</template>
|
|
</el-table-column>
|
|
<el-table-column prop="state" label="盘点状态" align="center">
|
|
<template slot-scope="scope">
|
|
<span v-if="scope.row.state === 0" class="row-state row-lending state-active">已终止</span>
|
|
<span v-if="scope.row.state === 1" class="row-state row-warehousing state-active">排队中</span>
|
|
<span v-if="scope.row.state === 2" class="row-state row-binding state-active">盘点中</span>
|
|
<span v-if="scope.row.state === 3" class="row-state row-physical state-active">已完成</span>
|
|
</template>
|
|
</el-table-column>
|
|
</el-table>
|
|
<!--分页组件-->
|
|
<pagination v-if="crud.data.length!==0" />
|
|
</div>
|
|
|
|
<!-- form -->
|
|
<el-dialog :class="unreachable.length !== 0 ? 'stock-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" style="display: flex; justify-content: flex-start;">
|
|
<div :style=" {'width': unreachable.length !== 0 ? '670px':''}">
|
|
<el-form ref="form" :inline="true" :model="form" :rules="rules" size="small" label-width="80px">
|
|
<el-form-item label="盘点单号" prop="stockBill">
|
|
<el-input v-model="form.stockBill" disabled />
|
|
</el-form-item>
|
|
<el-form-item label="盘点类型" prop="stockTypeName">
|
|
<el-input v-model="form.stockTypeName" disabled />
|
|
</el-form-item>
|
|
<el-form-item label="目标位置" prop="stockRegion">
|
|
<el-input v-model="form.stockRegion" disabled />
|
|
</el-form-item>
|
|
<el-form-item
|
|
class="stockGridNumName-style"
|
|
label="目标数量"
|
|
prop="stockGridNumName"
|
|
>
|
|
<span v-if="stockInfoLoading" class="el-icon-loading" />
|
|
<!-- <el-input v-else disabled v-html="form.stockGridNumName" /> -->
|
|
<div v-else style="display: flex; justify-content: flex-start;">
|
|
<el-input disabled v-html="form.stockGridNumName" />
|
|
<el-popover
|
|
class="stock-popover"
|
|
placement="top-start"
|
|
width="250"
|
|
trigger="hover"
|
|
>
|
|
<div>
|
|
<span style="display:block; font-weight: bold; margin-bottom: 10px;">A / B / C 层位 </span>
|
|
A:开启盘点功能 且 当前可盘点 层位数量<br>
|
|
B:开启盘点功能 且 当前不可盘点 层为数量<br>
|
|
C:具备盘点功能的 层位数量
|
|
</div>
|
|
<i slot="reference" class="iconfont icon-zhuyi-lan" />
|
|
</el-popover>
|
|
</div>
|
|
</el-form-item>
|
|
<el-row>
|
|
<el-form-item label="备注" prop="stockRemarks">
|
|
<el-input v-model="form.stockRemarks" type="textarea" style="width: 572px;" :rows="4" />
|
|
</el-form-item>
|
|
</el-row>
|
|
</el-form>
|
|
<div slot="footer" class="dialog-footer" style="padding-right: 20px;">
|
|
<el-button type="text" @click="crud.cancelCU">取消</el-button>
|
|
<el-button :disabled="isBtnDisabled" :loading="crud.status.cu === 2" type="primary" @click="crud.submitCU">保存</el-button>
|
|
</div>
|
|
</div>
|
|
<div v-if="unreachable.length !== 0" style="width: 500px; margin-left: 10px;">
|
|
<div class="stock-info-tips">
|
|
<p>注意:系统检查到,有参与本次盘点的摄像头无法连接!仅<i>{{ reachable.length }}</i>/个层架位可盘点。</p>
|
|
<span>不可盘点具体情况如下:</span>
|
|
</div>
|
|
<div style="display: flex; justify-content: space-between;">
|
|
<el-card class="box-card">
|
|
<div slot="header">
|
|
<span>无法连接的摄像头( <i style="color: #f53f3f; font-weight: bold; font-style: normal;">{{ ipStatusFalseNum }}</i> /个)</span>
|
|
</div>
|
|
<div v-for="(item,index) in ipStatusFalse" :key="index" class="stock-info-item">
|
|
<span> {{ item.ip }} </span>
|
|
</div>
|
|
</el-card>
|
|
<el-card class="box-card">
|
|
<div slot="header">
|
|
<span>无法盘点的层架位( <i style="color: #f53f3f; font-weight: bold; font-style: normal;">{{ unreachable.length }}</i> /个)</span>
|
|
</div>
|
|
<div v-for="(item,index) in unreachable" :key="index" class="stock-info-item">
|
|
<span> {{ item.gridName }} </span>
|
|
</div>
|
|
</el-card>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</el-dialog>
|
|
|
|
<el-dialog class="detailBook" append-to-body :close-on-click-modal="false" :modal-append-to-body="false" :before-close="handleCloseDialog" :visible="detailVisible" title="盘点详情">
|
|
<span class="dialog-right-top" />
|
|
<span class="dialog-left-bottom" />
|
|
<div class="setting-dialog">
|
|
<div class="detail-tab tab-content">
|
|
<ul class="tab-nav">
|
|
<li :class="{'active-tab-nav': tabIndex === 0}" @click="changeDetailTab(0)">基础信息</li>
|
|
<li :class="{'active-tab-nav': tabIndex === 1}" @click="changeDetailTab(1)">层位盘点信息</li>
|
|
</ul>
|
|
<el-button v-if="detailInfo.state === 3" style="position: absolute; right: 0; top: -10px;" size="mini" @click="doExport(detailInfo)">
|
|
<i class="iconfont icon-daochu" />
|
|
导出
|
|
</el-button>
|
|
<div v-if="tabIndex===0" class="detail-check">
|
|
<ul class="book-detail">
|
|
<li><span>盘点单号:</span>{{ detailInfo.stockBill }}</li>
|
|
|
|
<li v-if="detailInfo.stockType===1"><span>盘点类型:</span>全量盘点</li>
|
|
<li v-if="detailInfo.stockType===2"><span>盘点类型:</span>区域盘点</li>
|
|
<li v-if="detailInfo.stockType===3"><span>盘点类型:</span>计划盘点</li>
|
|
<li v-if="detailInfo.stockType===4"><span>盘点类型:</span>书架盘点</li>
|
|
<li v-if="detailInfo.stockType===5"><span>盘点类型:</span>架位盘点</li>
|
|
<li v-if="detailInfo.stockType===6"><span>盘点类型:</span>层位盘点</li>
|
|
<li v-if="detailInfo.stockType===7"><span>盘点类型:</span>移动盘点</li>
|
|
|
|
<li><span>目标位置:</span>{{ detailInfo.stockRegion }}</li>
|
|
<li><span>目标数量:</span>{{ detailInfo.stockGridNum }} / {{ detailInfo.totalGridNum }} 层位</li>
|
|
|
|
<li v-if="detailInfo.stockRemarks !== null" class="row-li"><span>备注:</span>{{ detailInfo.stockRemarks }}</li>
|
|
<li v-else class="row-li"><span>备注:</span>-</li>
|
|
|
|
<li v-if="detailInfo.startTime !== null"><span>开始时间:</span>{{ detailInfo.startTime | parseTime }}</li>
|
|
<li v-else><span>开始时间:</span>-</li>
|
|
|
|
<li v-if="detailInfo.endTime !== null"><span>结束时间:</span>{{ detailInfo.endTime | parseTime }}</li>
|
|
<li v-else><span>结束时间:</span>-</li>
|
|
<li class="row-li" style="margin-left: 30px;">
|
|
<i v-if="detailInfo.state === 0" class="row-state cancel-state">已终止</i>
|
|
<i v-if="detailInfo.state === 1" class="row-state soon-state">排队中</i>
|
|
<i v-if="detailInfo.state === 2" class="row-state end-state">盘点中</i>
|
|
<i v-if="detailInfo.state === 3" class="row-state ing-state">已完成</i>
|
|
</li>
|
|
</ul>
|
|
<div class="detail-other">
|
|
<ul class="book-detail">
|
|
<li class="row-li"><span>在架图书:</span><p><i style=" font-weight: bold;">{{ detailInfo.onShelfNum }}</i> / 册</p></li>
|
|
<li><span>错架图书:</span><p><i style="color:#ED4A41; font-weight: bold;">{{ detailInfo.errorShelfNum }}</i> / 册</p></li>
|
|
<li><span>错架率:</span><p style="color:#ED4A41; font-weight: bold;">{{ detailInfo.errorShelfProba }}</p></li>
|
|
<li><span>错序图书:</span><p><i style="color:#0348f3; font-weight: bold;">{{ detailInfo.errorOrderNum }}</i> / 册</p></li>
|
|
<li><span>错序率:</span><p style="color:#0348f3; font-weight: bold;">{{ detailInfo.errorOrderProba }}</p></li>
|
|
</ul>
|
|
<!-- 图表部分 -->
|
|
<div style="width: 60%; height: 140px;">
|
|
<taskStockLogEcharts :task-stock-log-data="taskStockLogData" />
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div v-if="tabIndex===1">
|
|
<el-table
|
|
ref="table"
|
|
v-loading="gridTableLoading"
|
|
class="archives-table"
|
|
:data="detailTable"
|
|
style="width: 100%;"
|
|
>
|
|
<el-table-column prop="gridName" label="层位架" min-width="180" :show-overflow-tooltip="true">
|
|
<template slot-scope="scope">
|
|
{{ scope.row.gridName | removeQUPrefix }}
|
|
</template>
|
|
</el-table-column>
|
|
<el-table-column prop="floorName" label="楼层" />
|
|
<el-table-column prop="regionName" label="区域" min-width="120" />
|
|
<el-table-column prop="booksheflCount" label="盘点详情" min-width="280" :show-overflow-tooltip="true">
|
|
<template slot-scope="scope">
|
|
<ul class="detail-table-info">
|
|
<li><span>在架:</span><p><i>{{ scope.row.onShelfNum }}</i> / 册</p> </li>
|
|
<li><span>错架:</span><p><i style="color:#ED4A41;">{{ scope.row.errorShelfNum }}</i> / 册</p> </li>
|
|
<li><span>错序:</span><p><i style="color:#0348f3;">{{ scope.row.errorOrderNum }}</i> / 册</p> </li>
|
|
</ul>
|
|
</template>
|
|
</el-table-column>
|
|
<el-table-column prop="progress" label="进度" min-width="120" :show-overflow-tooltip="true">
|
|
<template slot-scope="scope">
|
|
<span>{{ scope.row.progress !== null ? scope.row.progress : '-' }}</span>
|
|
</template>
|
|
</el-table-column>
|
|
<el-table-column prop="detailsRemarks" label="备注" min-width="100" :show-overflow-tooltip="true" />
|
|
<el-table-column prop="state" label="状态" width="80">
|
|
<template slot-scope="scope">
|
|
<span v-if="scope.row.state === 0" class="row-state row-lending state-active">已终止</span>
|
|
<span v-if="scope.row.state === 1" class="row-state row-warehousing state-active">排队中</span>
|
|
<span v-if="scope.row.state === 2" class="row-state row-binding state-active">盘点中</span>
|
|
<span v-if="scope.row.state === 3" class="row-state row-physical state-active">已完成</span>
|
|
</template>
|
|
</el-table-column>
|
|
</el-table>
|
|
<el-pagination
|
|
v-if="detailTable.length !== 0"
|
|
:page-size.sync="detailPage.size"
|
|
:total="detailPage.total"
|
|
:current-page.sync="detailPage.page"
|
|
style="margin-top: 8px;"
|
|
:pager-count="5"
|
|
layout="total, sizes, prev, pager, next"
|
|
@size-change="handleSizeChange"
|
|
@current-change="handleCurrentPage"
|
|
/>
|
|
</div>
|
|
</div>
|
|
<div slot="footer" class="dialog-footer">
|
|
<!-- 排队中会多一个“删除盘点” 进行中的多一个“终止盘点” -->
|
|
<el-button v-if="detailInfo.state === 1" :loading="crud.delAllLoading" type="primary" class="end-btn" @click="toDelete"><i class="iconfont icon-stop" />删除盘点</el-button>
|
|
<el-button v-if="detailInfo.state === 2" :loading="stopLoading" type="primary" class="end-btn" @click="toStopStockBill"><i class="iconfont icon-stop" />终止盘点</el-button>
|
|
<el-button :loading="crud.status.cu === 2" type="primary" @click="detailVisible=false">确定</el-button>
|
|
</div>
|
|
</div>
|
|
</el-dialog>
|
|
|
|
</div>
|
|
</template>
|
|
|
|
<script>
|
|
import crudStockTaskLog from '@/api/stockTaskLog/index'
|
|
import CRUD, { presenter, header, form, crud } from '@crud/crud'
|
|
import crudOperation from '@crud/CRUD.operation'
|
|
import rrOperation from '@crud/RR.operation'
|
|
import pagination from '@crud/Pagination'
|
|
import taskStockLogEcharts from '@/views/components/echarts/taskStockLog.vue'
|
|
import DateRangePicker from '@/components/DateRangePicker'
|
|
import { mapGetters } from 'vuex'
|
|
import { parseTime, saveAs, getBlob } from '@/utils/index'
|
|
import qs from 'qs'
|
|
|
|
const defaultForm = { stockTypeName: '全量盘点', stockType: 1, stockBill: null, stockRegion: '全部区域', stockGridNum: null, stockGridNumName: null, totalGridNum: null, stockRemarks: null, regionId: null, shelfId: null, gridShelf: null, gridId: null, reableGridIds: [], unReableGridIds: [] }
|
|
export default {
|
|
name: 'CheckLog',
|
|
components: { crudOperation, rrOperation, pagination, taskStockLogEcharts, DateRangePicker },
|
|
cruds() {
|
|
return CRUD({ title: '盘点日志', idField: 'billId', url: 'api/stocktask-task/initStockLogList', crudMethod: { ...crudStockTaskLog }, sort: [], optShow: {
|
|
add: false,
|
|
edit: false,
|
|
del: false,
|
|
download: false,
|
|
group: false,
|
|
reset: false
|
|
}})
|
|
},
|
|
mixins: [presenter(), header(), form(defaultForm), crud()],
|
|
data() {
|
|
return {
|
|
statusOptions: [
|
|
{ key: 0, display_name: '已终止' },
|
|
{ key: 1, display_name: '排队中' },
|
|
{ key: 2, display_name: '盘点中' },
|
|
{ key: 3, display_name: '已完成' }
|
|
],
|
|
TypeOptions: [
|
|
{ key: 1, display_name: '全量盘点' },
|
|
{ key: 2, display_name: '区域盘点' },
|
|
{ key: 3, display_name: '计划盘点' },
|
|
{ key: 4, display_name: '书架盘点' },
|
|
{ key: 5, display_name: '架位盘点' },
|
|
{ key: 6, display_name: '层位盘点' },
|
|
{ key: 7, display_name: '移动盘点' }
|
|
],
|
|
blurryTime: null,
|
|
tabIndex: 0,
|
|
detailVisible: false,
|
|
stopLoading: false,
|
|
dbRowData: {},
|
|
detailInfo: {},
|
|
taskStockLogData: [],
|
|
gridTableLoading: false,
|
|
detailPage: {
|
|
page: 1,
|
|
size: 10,
|
|
total: 0
|
|
},
|
|
detailTable: [],
|
|
permission: {
|
|
add: ['admin', 'checkLog:add'],
|
|
edit: ['admin', 'checkLog:edit'],
|
|
del: ['admin', 'checkLog:del']
|
|
},
|
|
rules: {
|
|
stockBill: [
|
|
{ required: true, message: '请输入盘点单号', trigger: 'blur' }
|
|
],
|
|
stockTypeName: [
|
|
{ required: true, message: '请输入盘点类型', trigger: 'blur' }
|
|
],
|
|
stockRegion: [
|
|
{ required: true, message: '请输入目标位置', trigger: 'blur' }
|
|
],
|
|
stockGridNumName: [
|
|
{ required: true, message: '请输入目标数量', trigger: 'blur' }
|
|
]
|
|
},
|
|
stockInfo: null,
|
|
ipStatusList: [],
|
|
ipStatusFalseNum: 0,
|
|
unreachable: [],
|
|
reachable: [],
|
|
isBtnDisabled: true,
|
|
stockInfoLoading: false
|
|
}
|
|
},
|
|
computed: {
|
|
...mapGetters([
|
|
'user',
|
|
'baseApi'
|
|
])
|
|
},
|
|
methods: {
|
|
[CRUD.HOOK.beforeRefresh]() {
|
|
if (this.blurryTime) {
|
|
this.crud.query.startTime = this.blurryTime[0]
|
|
this.crud.query.endTime = this.blurryTime[1]
|
|
} else {
|
|
this.crud.query.startTime = null
|
|
this.crud.query.endTime = null
|
|
}
|
|
},
|
|
[CRUD.HOOK.afterRefresh](crud) {
|
|
this.isBtnDisabled = true
|
|
this.stockInfoLoading = false
|
|
},
|
|
// 新增前
|
|
[CRUD.HOOK.beforeToAdd]() {
|
|
let params
|
|
if (this.crud.form.stockType === 1) {
|
|
this.crud.form.stockTypeName = '全量盘点'
|
|
params = {
|
|
'gridShelf': null,
|
|
'regionId': null,
|
|
'shelfId': null
|
|
}
|
|
}
|
|
|
|
this.stockInfoLoading = true
|
|
const stockInfoPromise = crudStockTaskLog.FetchStockGirdSuccess()
|
|
.then(stockInfo => {
|
|
this.stockInfoLoading = false
|
|
return stockInfo
|
|
})
|
|
.catch(error => {
|
|
this.stockInfoLoading = false
|
|
console.error('stockInfo 接口失败:', error)
|
|
throw error
|
|
})
|
|
|
|
const otherPromises = [
|
|
crudStockTaskLog.FetchNewBillNo(),
|
|
crudStockTaskLog.FetchStockGirdNum(),
|
|
crudStockTaskLog.FetchTotalGirdNum(params)
|
|
]
|
|
|
|
Promise.all([stockInfoPromise, ...otherPromises])
|
|
.then(([stockInfo, newBillNoRes, stockGridNumRes, totalGirdNumRes]) => {
|
|
console.log('stockInfo', stockInfo)
|
|
this.stockInfo = stockInfo
|
|
|
|
const ipStatusList = stockInfo
|
|
? Object.entries(stockInfo.ipReachableCache).map(([ip, status]) => ({ ip, status }))
|
|
: []
|
|
this.ipStatusList = ipStatusList
|
|
this.ipStatusFalse = this.ipStatusList.filter(item => !item.status)
|
|
this.ipStatusFalseNum = this.ipStatusList.filter(item => !item.status).length
|
|
this.reachable = stockInfo.reachable
|
|
this.unreachable = stockInfo.unreachable
|
|
// 测试
|
|
// this.reachable = stockInfo.unreachable
|
|
// this.unreachable = []
|
|
|
|
if (stockInfo && this.reachable.length !== 0) {
|
|
this.isBtnDisabled = false
|
|
} else {
|
|
this.isBtnDisabled = true
|
|
}
|
|
|
|
this.crud.form.stockBill = newBillNoRes
|
|
this.crud.form.stockGridNumName = stockInfo
|
|
? `<span style="color: #00b42a;">${this.reachable.length}</span> /
|
|
<span style="color: #f53f3f;">${this.unreachable.length}</span> /
|
|
${totalGirdNumRes} 层位`
|
|
: '数据加载失败'
|
|
this.crud.form.stockGridNum = stockGridNumRes
|
|
this.crud.form.totalGridNum = totalGirdNumRes
|
|
})
|
|
.catch(error => {
|
|
console.error('整体请求失败:', error)
|
|
this.isBtnDisabled = true
|
|
})
|
|
},
|
|
[CRUD.HOOK.afterAddCancel]() {
|
|
this.isBtnDisabled = true
|
|
this.stockInfoLoading = false
|
|
},
|
|
// 初始化编辑时
|
|
[CRUD.HOOK.beforeToEdit](crud, form) {
|
|
},
|
|
[CRUD.HOOK.beforeValidateCU](crud, form) {
|
|
},
|
|
// 提交前做的操作
|
|
[CRUD.HOOK.afterValidateCU](crud) {
|
|
console.log(crud.form)
|
|
crud.form.reableGridIds = this.reachable.map(item => item.gridId)
|
|
crud.form.unReableGridIds = this.unreachable.map(item => item.gridId)
|
|
delete crud.form.stockGridNumName
|
|
delete crud.form.stockTypeName
|
|
return true
|
|
},
|
|
clickRowHandler(row) {
|
|
// this.$refs.table.clearSelection()
|
|
// this.$refs.table.toggleRowSelection(row)
|
|
},
|
|
doExport(data) {
|
|
this.$confirm('此操作将导出所选数据' + '<span>你是否还要继续?</span>', '提示', {
|
|
confirmButtonText: '继续',
|
|
cancelButtonText: '取消',
|
|
type: 'warning',
|
|
dangerouslyUseHTMLString: true
|
|
}).then(() => {
|
|
const params = {
|
|
'billId': data.id
|
|
}
|
|
const fileName = '盘点单-' + parseTime(new Date()) + '.xlsx'
|
|
getBlob(this.baseApi + '/api/stocktask-task/exportStockBill' + '?' + qs.stringify(params, { indices: false }), function(blob) {
|
|
saveAs(blob, fileName)
|
|
})
|
|
}).catch(() => {
|
|
})
|
|
},
|
|
handleDbClick(row) {
|
|
this.tabIndex = 0
|
|
this.detailVisible = true
|
|
this.dbRowData = row
|
|
this.detailTable = []
|
|
crudStockTaskLog.FetchInitStockLogDetails({ 'billId': row.billId }).then(res => {
|
|
this.detailInfo = res
|
|
|
|
this.taskStockLogData = [
|
|
{ value: res.onShelfNum - res.errorShelfNum - res.errorOrderNum, name: '正常在架' },
|
|
{ value: res.errorShelfNum, name: '错架' },
|
|
{ value: res.errorOrderNum, name: '错序' }
|
|
]
|
|
}).catch(() => {
|
|
})
|
|
},
|
|
changeDetailTab(index) {
|
|
this.tabIndex = index
|
|
if (index === 1) {
|
|
this.getInitStockTaskDetails()
|
|
}
|
|
},
|
|
getInitStockTaskDetails() {
|
|
this.gridTableLoading = true
|
|
const params = {
|
|
'billId': this.dbRowData.billId,
|
|
'page': this.detailPage.page - 1,
|
|
'size': this.detailPage.size
|
|
}
|
|
crudStockTaskLog.FetchInitStockTaskDetails(params).then(res => {
|
|
if (res) {
|
|
if (this.dbRowData.state === 2) {
|
|
const progressPromises = res.content.map(item => {
|
|
const paramsProgress = {
|
|
'stockBill': this.dbRowData.stockBill,
|
|
'gridCode': item.gridCode
|
|
}
|
|
return crudStockTaskLog.FetchProgressByStockBillAndGridCode(paramsProgress)
|
|
})
|
|
|
|
Promise.all(progressPromises).then(progressResults => {
|
|
this.detailTable = res.content.map((item, index) => {
|
|
item.progress = progressResults[index]
|
|
return item
|
|
})
|
|
|
|
this.gridTableLoading = false
|
|
}).catch(error => {
|
|
console.error(error)
|
|
this.gridTableLoading = false
|
|
})
|
|
} else {
|
|
this.detailTable = res.content.map((item, index) => {
|
|
item.progress = this.dbRowData.state === 0 ? '已终止' : (this.dbRowData.state === 1 ? '排队中' : '已完成')
|
|
return item
|
|
})
|
|
this.gridTableLoading = false
|
|
}
|
|
this.detailPage.total = res.totalElements
|
|
}
|
|
}).catch(() => {
|
|
this.gridTableLoading = false
|
|
})
|
|
},
|
|
handleSizeChange(size) {
|
|
this.detailPage.size = size
|
|
this.detailPage.page = 1
|
|
this.tabIndex = 1
|
|
this.getInitStockTaskDetails()
|
|
},
|
|
handleCurrentPage(val) {
|
|
this.detailPage.page = val
|
|
this.tabIndex = 1
|
|
this.getInitStockTaskDetails()
|
|
},
|
|
handleCloseDialog() {
|
|
this.detailVisible = false
|
|
this.tabIndex = 0
|
|
this.isBtnDisabled = true
|
|
this.stockInfoLoading = false
|
|
},
|
|
toDelete() {
|
|
this.$confirm('此操作将删除当前盘点单任务<span>你是否还要继续?</span>', '提示', {
|
|
confirmButtonText: '继续',
|
|
cancelButtonText: '取消',
|
|
type: 'warning',
|
|
dangerouslyUseHTMLString: true
|
|
}).then(() => {
|
|
this.crud.delAllLoading = true
|
|
const params = {
|
|
'id': this.dbRowData.billId
|
|
}
|
|
console.log(params)
|
|
crudStockTaskLog.del(params).then(res => {
|
|
console.log(res)
|
|
if (res && res.code !== 500) {
|
|
this.$message({ message: '当前盘点单任务删除成功', type: 'success', offset: 8 })
|
|
this.crud.refresh()
|
|
} else {
|
|
this.$message({ message: res.message, type: 'error', offset: 8 })
|
|
}
|
|
this.handleCloseDialog()
|
|
this.crud.delAllLoading = false
|
|
}).catch(err => {
|
|
this.crud.delAllLoading = false
|
|
console.log(err)
|
|
})
|
|
}).catch(() => {
|
|
this.crud.delAllLoading = false
|
|
})
|
|
},
|
|
toStopStockBill() {
|
|
this.$confirm('此操作将终止当前盘点单任务<span>你是否还要继续?</span>', '提示', {
|
|
confirmButtonText: '继续',
|
|
cancelButtonText: '取消',
|
|
type: 'warning',
|
|
dangerouslyUseHTMLString: true
|
|
}).then(() => {
|
|
this.stopLoading = true
|
|
const params = {
|
|
'id': this.dbRowData.billId
|
|
}
|
|
crudStockTaskLog.FetchStopStockBill(params).then(res => {
|
|
console.log(res)
|
|
if (res && res.code !== 500) {
|
|
this.$message({ message: '当前盘点单任务终止成功', type: 'success', offset: 8 })
|
|
this.crud.refresh()
|
|
} else {
|
|
this.$message({ message: res.message, type: 'error', offset: 8 })
|
|
}
|
|
this.handleCloseDialog()
|
|
this.stopLoading = false
|
|
}).catch(err => {
|
|
console.log(err)
|
|
this.stopLoading = false
|
|
})
|
|
}).catch(() => {
|
|
this.stopLoading = false
|
|
})
|
|
}
|
|
}
|
|
}
|
|
</script>
|
|
|
|
<style lang="scss" scoped>
|
|
.detailBook {
|
|
::v-deep .el-dialog {
|
|
width: 1000px !important;
|
|
.el-dialog__body{
|
|
padding: 0 0 30px 0;
|
|
}
|
|
}
|
|
.detail-check{
|
|
padding: 20px 30px;
|
|
background-color: #F6F8FC;
|
|
}
|
|
.book-detail{
|
|
display: flex;
|
|
justify-content: space-between;
|
|
flex-wrap: wrap;
|
|
li{
|
|
width: 50%;
|
|
line-height: 40px;
|
|
span{
|
|
display: inline-block;
|
|
width: 100px;
|
|
text-align: right;
|
|
margin-right: 20px;
|
|
color: #0C0E1E;
|
|
}
|
|
i{
|
|
font-style: normal;
|
|
padding: 0 8px;
|
|
}
|
|
&.row-li{
|
|
width: 100%
|
|
}
|
|
}
|
|
}
|
|
.end-btn{
|
|
width: auto !important;
|
|
padding: 0 10px;
|
|
border-color: #ED4A41;
|
|
background-color: #ED4A41;
|
|
}
|
|
.detail-other{
|
|
display: flex;
|
|
justify-content: space-between;
|
|
align-items: flex-start;
|
|
border-top: 1px solid #edeff3;
|
|
padding-top: 20px;
|
|
margin-top: 20px;
|
|
.book-detail{
|
|
width: 50%;
|
|
li{
|
|
display: flex;
|
|
justify-content: flex-start;
|
|
// width: 50%;
|
|
span{
|
|
display: block;
|
|
width: 100px;
|
|
text-align: right;
|
|
margin-right: 0;
|
|
}
|
|
p{
|
|
width: 100px;
|
|
text-align: right;
|
|
i{
|
|
padding: 0;
|
|
}
|
|
}
|
|
}
|
|
|
|
}
|
|
}
|
|
::v-deep .dialog-footer{
|
|
margin-top: 30px;
|
|
}
|
|
.archives-table td.el-table__cell .row-state{
|
|
margin: 0 !important;
|
|
}
|
|
}
|
|
|
|
.detail-table-info{
|
|
display: flex;
|
|
justify-content: flex-start;
|
|
li{
|
|
width: calc(100% / 3);
|
|
margin-right: 15px;
|
|
span{
|
|
display: inline-block;
|
|
width: 40px;
|
|
text-align: right;
|
|
}
|
|
p{
|
|
display: inline-block;
|
|
text-align: right;
|
|
width: calc(100% - 40px);
|
|
i{
|
|
font-weight: bold;
|
|
font-style: normal;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
.stock-dialog{
|
|
::v-deep .el-dialog{
|
|
width: 1220px !important;
|
|
}
|
|
}
|
|
.stockGridNumName-style{
|
|
::v-deep .el-form-item__content{
|
|
width: auto !important;
|
|
padding: 0 10px;
|
|
.stock-popover{
|
|
display: inline-block;
|
|
margin-left: 6px;
|
|
color: #0348f3;
|
|
}
|
|
}
|
|
}
|
|
.stock-info-tips{
|
|
line-height: 24px;
|
|
margin-bottom: 20px;
|
|
p{
|
|
color: #0c0e1e;
|
|
i{
|
|
display: inline-block;
|
|
padding: 0 4px;
|
|
font-weight: bold;
|
|
font-style: normal;
|
|
color: #00b42a;
|
|
}
|
|
}
|
|
span{
|
|
display: block;
|
|
}
|
|
}
|
|
::v-deep .el-card {
|
|
flex: 1;
|
|
margin-right: 15px;
|
|
.el-card__header{
|
|
color: #0c0e1e;
|
|
// font-size: 16px;
|
|
background-color: #fff !important;
|
|
border-bottom: 1px solid #ebeef5 !important;
|
|
}
|
|
.el-card__body{
|
|
height: 180px;
|
|
overflow: hidden;
|
|
overflow-y: scroll;
|
|
}
|
|
.stock-info-item{
|
|
display: flex; justify-content: space-between; padding: 4px 20px;
|
|
span{
|
|
display: block;
|
|
height: 26px;
|
|
line-height: 26px;
|
|
}
|
|
}
|
|
}
|
|
</style>
|