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.
969 lines
38 KiB
969 lines
38 KiB
<template>
|
|
<div class="app-container row-container">
|
|
<div class="head-container">
|
|
<div v-if="crud.props.searchToggle" class="head-search">
|
|
<el-input v-model="query.billNo" clearable size="small" placeholder="输入盘点单号搜索" prefix-icon="el-icon-search" style="width: 225px;" class="filter-item" @keyup.enter.native="crud.toQuery" />
|
|
<el-select v-model="query.warehouseId" 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,index) in warehouseOptions"
|
|
:key="index"
|
|
:label="item.warehouseName"
|
|
:value="item.id"
|
|
/>
|
|
</el-select>
|
|
<el-select v-model="query.status" 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.value" :label="item.label" :value="item.value" />
|
|
</el-select>
|
|
<el-button class="filter-item filter-search" size="mini" type="success" icon="el-icon-search" @click="crud.toQuery">搜索</el-button>
|
|
<el-button class="filter-item filter-refresh" size="mini" type="warning" icon="el-icon-refresh-left" @click="resetQuery()">重置</el-button>
|
|
</div>
|
|
<crudOperation :permission="permission">
|
|
<template v-slot:middle>
|
|
<!-- <el-button :loading="addLoading" size="mini" @click="addStockTakeBill">
|
|
<i class="iconfont icon-xinzeng" />
|
|
新增
|
|
</el-button> -->
|
|
<!-- <el-button slot="reference" size="mini" :loading="crud.delAllLoading" :disabled="crud.selections.length === 0" @click="toDelete(crud.selections)">
|
|
<i class="iconfont icon-shanchu" />
|
|
删除
|
|
</el-button> -->
|
|
<!-- <el-button size="mini" :disabled="crud.selections.length === 0">
|
|
<i class="iconfont icon-jiesuan" />
|
|
结算
|
|
</el-button> -->
|
|
<!-- <el-button :loading="crud.downloadLoading" size="mini" :disabled="crud.selections.length === 0" @click="doExport(crud.selections)">
|
|
<i class="iconfont icon-daochu" />
|
|
导出
|
|
</el-button> -->
|
|
</template>
|
|
<!-- <template v-slot:right>
|
|
<el-button :loading="clearCacheLoading" size="mini" style="background-color: #ed4a41; border-color: #ed4a41; color: #fff;" @click="clearCacheDatas">
|
|
<i class="iconfont icon-shanchu" />
|
|
清空缓存
|
|
</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"
|
|
highlight-current-row
|
|
stripe
|
|
style="width: 100%;"
|
|
height="calc(100vh - 330px)"
|
|
:data="crud.data"
|
|
@selection-change="crud.selectionChangeHandler"
|
|
@row-click="clickRowHandler"
|
|
@row-dblclick="handleRowDblClick"
|
|
>
|
|
<el-table-column type="selection" align="center" width="55" />
|
|
<el-table-column prop="billNo" label="任务编号" min-width="180px" :show-overflow-tooltip="true" />
|
|
<!-- <el-table-column prop="stockName" label="任务名称" min-width="150px" />
|
|
<el-table-column prop="stockManager" label="负责人" min-width="100px" /> -->
|
|
<el-table-column prop="warehouseName" label="所属仓库" min-width="160px" :show-overflow-tooltip="true" />
|
|
<!-- <el-table-column prop="stockExecutor" label="盘点执行人" min-width="120px" /> -->
|
|
|
|
<el-table-column prop="stockNum" label="总数" min-width="80px" align="right" />
|
|
<el-table-column prop="correctQty" label="账实相符数" min-width="120px" align="right" />
|
|
<el-table-column prop="excessQty" label="盘盈数" min-width="80px" align="right" />
|
|
<el-table-column prop="missingQty" label="盘亏数" min-width="80px" align="right" />
|
|
<el-table-column prop="status" label="盘点状态" align="center" min-width="100px">
|
|
<template slot-scope="scope">
|
|
<span v-if="(scope.row.status || '').toString().trim() === '0'" class="row-state row-lending ">未盘点</span>
|
|
<span v-if="(scope.row.status || '').toString().trim() === '-1'" class="row-state row-lending state-active">已终止</span>
|
|
<span v-if="(scope.row.status || '').toString().trim() === '1'" class="row-state row-warehousing state-active">盘点中</span>
|
|
<span v-if="(scope.row.status || '').toString().trim() === '2'" class="row-state row-binding state-active">已完成</span>
|
|
</template>
|
|
</el-table-column>
|
|
<el-table-column prop="takeDate" label="发起时间" width="150px">
|
|
<template slot-scope="scope">
|
|
<div>{{ scope.row.takeDate | parseTime }}</div>
|
|
</template>
|
|
</el-table-column>
|
|
<el-table-column prop="takeStart" label="盘点开始时间" width="150px">
|
|
<template slot-scope="scope">
|
|
<div>{{ scope.row.takeStart | parseTime }}</div>
|
|
</template>
|
|
</el-table-column>
|
|
<el-table-column prop="takeEnd" label="盘点结束时间" width="150px">
|
|
<template slot-scope="scope">
|
|
<div>{{ scope.row.takeEnd | parseTime }}</div>
|
|
</template>
|
|
</el-table-column>
|
|
<el-table-column label="操作" min-width="210px">
|
|
<template slot-scope="scope">
|
|
<el-button :loading="scope.row.deleteLoading" style="background-color: #F65163; border-color:#F65163; color: #fff;" @click="toDelete(scope.row)">
|
|
删除
|
|
</el-button>
|
|
<el-button :loading="scope.row.settleLoading" style="background-color: #1AAE93; border-color:#1AAE93; color: #fff;" @click="handleSettle(scope.row)">
|
|
结算
|
|
</el-button>
|
|
<el-button :loading="scope.row.exportLoading" @click="handleExport(scope.row)">
|
|
导出
|
|
</el-button>
|
|
</template>
|
|
</el-table-column>
|
|
</el-table>
|
|
<!--分页组件-->
|
|
<pagination v-if="crud.data.length!==0" />
|
|
</div>
|
|
|
|
<el-dialog width="1000px" :close-on-click-modal="false" :modal-append-to-body="false" append-to-body :before-close="crud.cancelCU" :visible.sync="crud.status.cu > 0" :title="crud.status.title" class="group-form">
|
|
<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="departmentname">
|
|
<el-select v-model="form.departmentname" placeholder="请选择" style="width: 300px;" @change="handleDepartmentChange">
|
|
<el-option
|
|
v-for="(item,index) in departmentOptions"
|
|
:key="index"
|
|
:label="item"
|
|
:value="item"
|
|
/>
|
|
</el-select>
|
|
</el-form-item>
|
|
<!-- <el-form-item label="使用者" prop="user">
|
|
<el-select v-model="form.user" placeholder="请选择" style="min-width: 200px;">
|
|
<el-option
|
|
v-for="(item,index) in userOptions"
|
|
:key="index"
|
|
:label="item.name"
|
|
:value="item.id"
|
|
/>
|
|
</el-select>
|
|
</el-form-item> -->
|
|
<el-button type="primary" size="small" :loading="fetchLoading" @click="fetchAssetsData(true)">查询</el-button>
|
|
</el-form>
|
|
<div v-if="showFilterList" class="filter-list">
|
|
<!-- <div v-if="fetchLoading">
|
|
<el-icon class="is-loading"><i class="el-icon-loading" /></el-icon> 加载中...
|
|
</div>
|
|
<div v-else> -->
|
|
<div>约<span>{{ totalAssets }}</span>项资产</div>
|
|
<el-table v-loading="fetchLoading" stripe style="width: 100%; margin-top: 20px;" height="calc(100vh - 460px)" :data="listTable">
|
|
<!-- <el-table-column type="index" label="序号" align="center" width="55" /> -->
|
|
<el-table-column label="序号" align="center" width="55">
|
|
<template slot-scope="scope">
|
|
{{ (currentPage - 1) * pageSize + scope.$index + 1 }}
|
|
</template>
|
|
</el-table-column>
|
|
<!-- <el-table-column prop="result" label="结果">
|
|
<template slot-scope="scope">
|
|
<el-tag v-if="scope.row.result === 1" type="success">正常</el-tag>
|
|
<el-tag v-if="scope.row.result === 2" type="error">盘亏</el-tag>
|
|
<el-tag v-if="scope.row.result === 3">盘盈</el-tag>
|
|
</template>
|
|
</el-table-column> -->
|
|
<el-table-column prop="mark" label="资产编码" min-width="220px" :show-overflow-tooltip="true" />
|
|
<el-table-column prop="name" label="资产名称" min-width="220px" :show-overflow-tooltip="true" />
|
|
<!-- <el-table-column prop="remark" label="盘点备注" min-width="100px" />
|
|
<el-table-column prop="status" label="资产状态" min-width="100px" /> -->
|
|
<el-table-column prop="capitaltyepname" label="资产类型" min-width="100px" />
|
|
<el-table-column prop="departmentname" label="使用部门" min-width="260px" :show-overflow-tooltip="true" />
|
|
<el-table-column prop="resourcename" label="使用人" min-width="120px" />
|
|
<!-- <el-table-column prop="blongsubcompanyname" label="所属单位" min-width="180px" :show-overflow-tooltip="true" /> -->
|
|
<el-table-column prop="blongdepartmentname" label="所属部门" min-width="180px" :show-overflow-tooltip="true" />
|
|
<el-table-column prop="glrname" label="管理人" min-width="120px" />
|
|
<el-table-column prop="cfd" label="存放地" min-width="260px" :show-overflow-tooltip="true" />
|
|
</el-table>
|
|
<div v-if="listTable.length !== 0" style="margin-top: 10px; display: flex; justify-content: flex-end;">
|
|
<el-pagination
|
|
style="margin: 10px 0 !important;"
|
|
:current-page="currentPage"
|
|
:page-sizes="[10, 20, 50, 100]"
|
|
:page-size="pageSize"
|
|
layout="total, sizes, prev, pager, next"
|
|
:total="totalAssets"
|
|
@size-change="handleSizeChange"
|
|
@current-change="handleCurrentChange"
|
|
/>
|
|
</div>
|
|
<!-- </div> -->
|
|
</div>
|
|
<div slot="footer" class="dialog-footer">
|
|
<el-button type="text" @click="crud.cancelCU">取消</el-button>
|
|
<el-button style="width: 84px !important;" :loading="crud.status.cu === 2" type="primary" :disabled="!hasAssets" @click="crud.submitCU">生成盘点单</el-button>
|
|
</div>
|
|
</div>
|
|
</el-dialog>
|
|
|
|
<!-- 资产详情对话框 -->
|
|
<el-dialog
|
|
class="inventory-detail-dialog"
|
|
:visible.sync="detailDialogVisible"
|
|
title="盘点任务详情"
|
|
width="1000px"
|
|
append-to-body
|
|
:close-on-click-modal="false"
|
|
:modal-append-to-body="false"
|
|
>
|
|
<div v-if="selectedTask" class="task-detail">
|
|
<!-- 任务基本信息 -->
|
|
<el-table class="archives-table" stripe style="width: 100%;" :data="selectedTask">
|
|
<el-table-column prop="billNo" label="任务编号" min-width="180px" :show-overflow-tooltip="true" />
|
|
<!-- <el-table-column prop="stockName" label="任务名称" min-width="150px" />
|
|
<el-table-column prop="stockManager" label="负责人" min-width="100px" /> -->
|
|
<el-table-column prop="warehouseName" label="所属仓库" min-width="300px" :show-overflow-tooltip="true" />
|
|
<!-- <el-table-column prop="stockExecutor" label="盘点执行人" min-width="120px" /> -->
|
|
<el-table-column prop="takeDate" label="发起时间" width="180px">
|
|
<template slot-scope="scope">
|
|
<div>{{ scope.row.takeDate | parseTime }}</div>
|
|
</template>
|
|
</el-table-column>
|
|
<el-table-column prop="takeStart" label="盘点开始时间" width="180px">
|
|
<template slot-scope="scope">
|
|
<div>{{ scope.row.takeStart | parseTime }}</div>
|
|
</template>
|
|
</el-table-column>
|
|
<el-table-column prop="takeEnd" label="盘点结束时间" width="180px">
|
|
<template slot-scope="scope">
|
|
<div>{{ scope.row.takeEnd | parseTime }}</div>
|
|
</template>
|
|
</el-table-column>
|
|
<el-table-column prop="stockNum" label="总数" min-width="80px" />
|
|
<el-table-column prop="correctQty" label="账实相符数" min-width="120px" />
|
|
<el-table-column prop="excessQty" label="盘盈数" min-width="80px" />
|
|
<el-table-column prop="missingQty" label="盘亏数" min-width="80px" />
|
|
<el-table-column prop="status" label="盘点状态" align="center" min-width="100px">
|
|
<template slot-scope="scope">
|
|
<span v-if="(scope.row.status || '').toString().trim() === '0'" class="row-state row-lending">未盘点</span>
|
|
<span v-if="(scope.row.status || '').toString().trim() === '-1'" class="row-state row-lending state-active">已终止</span>
|
|
<span v-if="(scope.row.status || '').toString().trim() === '1'" class="row-state row-warehousing state-active">盘点中</span>
|
|
<span v-if="(scope.row.status || '').toString().trim() === '2'" class="row-state row-binding state-active">已完成</span>
|
|
</template>
|
|
</el-table-column>
|
|
</el-table>
|
|
<!-- 盘点清单 -->
|
|
<div class="inventory-list">
|
|
<div style="display: flex; justify-content: space-between; align-items: center;">
|
|
<ul class="tab-nav">
|
|
<li :class="{'active-tab-nav': tabIndex == 0}" @click="changeActiveTab(0)">盘点清单</li>
|
|
<li :class="{'active-tab-nav': tabIndex == 1}" @click="changeActiveTab(1)">盘盈列表</li>
|
|
</ul>
|
|
<div>
|
|
<el-select v-if="tabIndex===0" v-model="taskResult" clearable size="small" placeholder="状态" class="filter-item" style="width: 80px" @change="doSearch">
|
|
<el-option v-for="item in taskResultOptions" :key="item.value" :label="item.label" :value="item.value" />
|
|
</el-select>
|
|
<el-input
|
|
v-model="keyWord"
|
|
size="small"
|
|
clearable
|
|
placeholder="请输入关键字搜索"
|
|
style="width: 300px;"
|
|
class="input-prepend filter-item"
|
|
@keyup.enter.native="doSearch"
|
|
@clear="doSearch"
|
|
>
|
|
<el-select slot="prepend" v-model="optionVal" style="width: 92px">
|
|
<el-option
|
|
v-for="item in options"
|
|
:key="item.value"
|
|
:label="item.label"
|
|
:value="item.value"
|
|
/>
|
|
</el-select>
|
|
</el-input>
|
|
<el-button class="filter-item filter-search" size="mini" type="success" icon="el-icon-search" @click="doSearch">搜索</el-button>
|
|
</div>
|
|
</div>
|
|
<el-table v-loading="inventoryLoading" stripe style="width: 100%;" height="calc(100vh - 460px)" :data="inventoryList">
|
|
<el-table-column label="序号" align="center" width="55">
|
|
<template slot-scope="scope">
|
|
{{ (inventoryPage - 1) * inventoryPageSize + scope.$index + 1 }}
|
|
</template>
|
|
</el-table-column>
|
|
<el-table-column v-if="tabIndex === 0" prop="taskResult" label="结果">
|
|
<template slot-scope="scope">
|
|
<el-tag v-if="scope.row.taskResult === 0">未盘</el-tag>
|
|
<el-tag v-if="scope.row.taskResult === 1" type="success">正常</el-tag>
|
|
<el-tag v-if="scope.row.taskResult === 2" type="error">盘亏</el-tag>
|
|
</template>
|
|
</el-table-column>
|
|
<el-table-column v-else prop="taskResult" label="结果">
|
|
<template>
|
|
<el-tag class="other-tag">盘盈</el-tag>
|
|
</template>
|
|
</el-table-column>
|
|
<el-table-column prop="assetMark" label="资产编码" min-width="220px" :show-overflow-tooltip="true">
|
|
<template slot-scope="scope">
|
|
<span v-if="tabIndex === 0">{{ scope.row.assetMark }}</span>
|
|
<span v-else>
|
|
{{
|
|
(scope.row.assetInfo && scope.row.assetInfo.mark)
|
|
? scope.row.assetInfo.mark
|
|
: (scope.row.superfluous && scope.row.superfluous.mark) || '-'
|
|
}}
|
|
</span>
|
|
</template>
|
|
</el-table-column>
|
|
<el-table-column prop="assetName" label="资产名称" min-width="180px" :show-overflow-tooltip="true">
|
|
<template slot-scope="scope">
|
|
<span v-if="tabIndex === 0">{{ scope.row.assetName }}</span>
|
|
<span v-else>
|
|
{{ scope.row.assetInfo ? scope.row.assetInfo.name : '' }}
|
|
</span>
|
|
</template>
|
|
</el-table-column>
|
|
<el-table-column prop="taskRemark" label="盘点备注" min-width="100px">
|
|
<template slot-scope="scope">
|
|
<span v-if="tabIndex === 0">{{ scope.row.taskRemark }}</span>
|
|
<span v-else>
|
|
{{ scope.row.assetInfo ? scope.row.assetInfo.remark : '' }}
|
|
</span>
|
|
</template>
|
|
</el-table-column>
|
|
<el-table-column prop="capitalStatus" label="资产状态" min-width="100px">
|
|
<template slot-scope="scope">
|
|
<span v-if="tabIndex === 0">{{ scope.row.capitalStatus }}</span>
|
|
<span v-else>
|
|
{{ scope.row.assetInfo ? scope.row.assetInfo.capitalStatus : '' }}
|
|
</span>
|
|
</template>
|
|
</el-table-column>
|
|
<el-table-column prop="capitaltypename" label="资产类型" min-width="100px">
|
|
<template slot-scope="scope">
|
|
<span v-if="tabIndex === 0">{{ scope.row.capitaltypename }}</span>
|
|
<span v-else>
|
|
{{ scope.row.assetInfo ? scope.row.assetInfo.capitaltypename : '' }}
|
|
</span>
|
|
</template>
|
|
</el-table-column>
|
|
<el-table-column prop="blongdepartmentname" label="所属部门" min-width="160px" :show-overflow-tooltip="true">
|
|
<template slot-scope="scope">
|
|
<span v-if="tabIndex === 0">{{ scope.row.blongdepartmentname }}</span>
|
|
<span v-else>
|
|
{{ scope.row.assetInfo ? scope.row.assetInfo.blongdepartmentname : '' }}
|
|
</span>
|
|
</template>
|
|
</el-table-column>
|
|
<el-table-column prop="departmentname" label="使用部门" min-width="160px" :show-overflow-tooltip="true">
|
|
<template slot-scope="scope">
|
|
<span v-if="tabIndex === 0">{{ scope.row.departmentname }}</span>
|
|
<span v-else>
|
|
{{ scope.row.assetInfo ? scope.row.assetInfo.departmentname : '' }}
|
|
</span>
|
|
</template>
|
|
</el-table-column>
|
|
<el-table-column prop="resourcename" label="使用人" min-width="100px" :show-overflow-tooltip="true">
|
|
<template slot-scope="scope">
|
|
<span v-if="tabIndex === 0">{{ scope.row.resourcename }}</span>
|
|
<span v-else>
|
|
{{ scope.row.assetInfo ? scope.row.assetInfo.resourcename : '' }}
|
|
</span>
|
|
</template>
|
|
</el-table-column>
|
|
<!-- <el-table-column prop="blongsubcompanyname" label="所属单位" min-width="180px" :show-overflow-tooltip="true" />
|
|
<el-table-column prop="blongdepartmentname" label="所属部门" min-width="180px" :show-overflow-tooltip="true" /> -->
|
|
<el-table-column prop="glrname" label="管理人" min-width="100px" :show-overflow-tooltip="true">
|
|
<template slot-scope="scope">
|
|
<span v-if="tabIndex === 0">{{ scope.row.glrname }}</span>
|
|
<span v-else>
|
|
{{ scope.row.assetInfo ? scope.row.assetInfo.glrname : '' }}
|
|
</span>
|
|
</template>
|
|
</el-table-column>
|
|
<el-table-column prop="cfd" label="存放地" min-width="260px" :show-overflow-tooltip="true">
|
|
<template slot-scope="scope">
|
|
<span v-if="tabIndex === 0">{{ scope.row.cfd }}</span>
|
|
<span v-else>
|
|
{{ scope.row.assetInfo ? scope.row.assetInfo.cfd : '' }}
|
|
</span>
|
|
</template>
|
|
</el-table-column>
|
|
<el-table-column v-if="tabIndex === 1" prop="taskTime" label="盘点时间" width="160px">
|
|
<template slot-scope="scope">
|
|
<!-- 有资产信息 → 显示 - -->
|
|
<span v-if="scope.row.assetInfo"> - </span>
|
|
|
|
<!-- 没有资产信息 → 安全显示时间,没有时间也显示 - -->
|
|
<span v-else-if="scope.row.superfluous && scope.row.superfluous.taskTime">
|
|
{{ scope.row.superfluous.taskTime | parseTime }}
|
|
</span>
|
|
|
|
<!-- 都没有 → 显示 - -->
|
|
<span v-else> - </span>
|
|
</template>
|
|
</el-table-column>
|
|
</el-table>
|
|
<div style="margin-top: 10px; display: flex; justify-content: flex-end;">
|
|
<el-pagination
|
|
:key="`tab-${tabIndex}-${inventoryTotal}`"
|
|
:current-page="inventoryPage"
|
|
:page-sizes="[10, 20, 50, 100]"
|
|
:page-size="inventoryPageSize"
|
|
layout="total, sizes, prev, pager, next"
|
|
:total="inventoryTotal"
|
|
style="margin: 20px 0 !important;"
|
|
@size-change="handleInventorySizeChange"
|
|
@current-change="handleInventoryCurrentChange"
|
|
/>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div v-else>
|
|
暂无数据
|
|
</div>
|
|
</el-dialog>
|
|
</div>
|
|
</template>
|
|
|
|
<script>
|
|
// import { getAssetDeptTree } from '@/api/system/dept'
|
|
import crudAsset, { FetchInitAssetInfo, FetchStockTakeDetailsByTaskId, FetchStockTakeSuperfluousByTaskId, FetchStockSettle, FetchDeleteStockTake, add } from '@/api/asset/index'
|
|
import { FetchWarehouseTree } from '@/api/assetDevice/index'
|
|
import CRUD, { presenter, header, form, crud } from '@crud/crud'
|
|
import crudOperation from '@crud/CRUD.operation'
|
|
import pagination from '@crud/Pagination'
|
|
// import { exportFile } from '@/utils/index'
|
|
import qs from 'qs'
|
|
import { mapGetters } from 'vuex'
|
|
|
|
// user: null, id: null, departmentname: null
|
|
const defaultForm = { }
|
|
export default {
|
|
name: 'Stocktaking',
|
|
components: { pagination, crudOperation },
|
|
cruds() {
|
|
return CRUD({ title: '资产盘点', url: 'api/stocktake/initStockTakeBill', crudMethod: { ...crudAsset }, optShow: {
|
|
add: false,
|
|
edit: false,
|
|
del: false,
|
|
reset: true,
|
|
download: false,
|
|
group: false
|
|
}})
|
|
},
|
|
mixins: [presenter(), header(), form(defaultForm), crud()],
|
|
data() {
|
|
return {
|
|
clearCacheLoading: false,
|
|
addLoading: false,
|
|
settleLoading: false,
|
|
permission: {
|
|
add: [],
|
|
edit: [],
|
|
del: []
|
|
},
|
|
departmentOptions: [],
|
|
userOptions: [
|
|
{ id: 1, name: '张三' },
|
|
{ id: 2, name: '李四' },
|
|
{ id: 3, name: '王五' }
|
|
],
|
|
rules: {
|
|
departmentname: [
|
|
{ required: true, message: '请选择所属部门', trigger: 'change' }
|
|
]
|
|
// user: [
|
|
// { required: true, message: '请选择使用者', trigger: 'change' }
|
|
// ]
|
|
},
|
|
keyWord: '',
|
|
optionVal: 'assetMark',
|
|
options: [
|
|
{ value: 'assetMark', label: '资产编号' },
|
|
{ value: 'assetName', label: '资产名称' }
|
|
],
|
|
fetchLoading: false,
|
|
showFilterList: false,
|
|
listTable: [],
|
|
totalAssets: 0,
|
|
currentPage: 1,
|
|
pageSize: 10,
|
|
detailDialogVisible: false,
|
|
selectedTask: [],
|
|
inventoryList: [],
|
|
inventoryLoading: false,
|
|
inventoryPage: 1,
|
|
inventoryPageSize: 10,
|
|
inventoryTotal: 0,
|
|
statusOptions: [
|
|
{ value: 0, label: '未盘点' },
|
|
{ value: 1, label: '盘点中' },
|
|
// { value: -1, label: '已终止' },
|
|
{ value: 2, label: '已完成' }
|
|
],
|
|
warehouseOptions: [],
|
|
query: {
|
|
billNo: '',
|
|
warehouseId: '',
|
|
status: ''
|
|
},
|
|
tabIndex: 0,
|
|
taskResult: '',
|
|
taskResultOptions: [
|
|
{ value: 0, label: '未盘' },
|
|
{ value: 1, label: '正常' },
|
|
{ value: 2, label: '盘亏' }
|
|
],
|
|
assetMark: '',
|
|
assetName: ''
|
|
}
|
|
},
|
|
computed: {
|
|
...mapGetters([
|
|
'baseApi',
|
|
'user'
|
|
]),
|
|
hasAssets() {
|
|
return this.totalAssets > 0
|
|
}
|
|
},
|
|
created() {
|
|
// this.getAssetDeptTree()
|
|
FetchWarehouseTree().then(res => {
|
|
this.warehouseOptions = res
|
|
}).catch(() => {
|
|
})
|
|
},
|
|
mounted() {
|
|
},
|
|
methods: {
|
|
[CRUD.HOOK.beforeRefresh]() {
|
|
// 传递搜索参数
|
|
console.log('this.user', this.user)
|
|
this.crud.params.billNo = this.query.billNo
|
|
this.crud.params.warehouseId = this.query.warehouseId
|
|
this.crud.params.status = this.query.status
|
|
this.crud.query.userId = this.user.id
|
|
|
|
// 保存原始参数
|
|
this.originalPage = this.crud.page.page
|
|
this.originalSize = this.crud.page.size
|
|
// 添加pageNo和pageSize参数
|
|
this.crud.params.pageNo = this.crud.page.page
|
|
this.crud.params.pageSize = this.crud.page.size
|
|
// 清空page和size参数
|
|
this.crud.params.page = undefined
|
|
this.crud.params.size = undefined
|
|
},
|
|
[CRUD.HOOK.afterRefresh]() {
|
|
// 恢复原始参数
|
|
if (this.originalPage !== undefined) {
|
|
this.crud.page.page = this.originalPage
|
|
this.crud.page.size = this.originalSize
|
|
// 移除pageNo和pageSize参数
|
|
delete this.crud.params.pageNo
|
|
delete this.crud.params.pageSize
|
|
delete this.crud.params.page
|
|
delete this.crud.params.size
|
|
}
|
|
|
|
// 为每一行数据添加loading状态
|
|
this.crud.data.forEach(item => {
|
|
if (!item.deleteLoading) {
|
|
this.$set(item, 'deleteLoading', false)
|
|
}
|
|
if (!item.settleLoading) {
|
|
this.$set(item, 'settleLoading', false)
|
|
}
|
|
if (!item.exportLoading) {
|
|
this.$set(item, 'exportLoading', false)
|
|
}
|
|
})
|
|
},
|
|
// 新增前
|
|
[CRUD.HOOK.beforeToAdd](crud, form) {
|
|
// 重置表单数据
|
|
crud.form.departmentname = null
|
|
// crud.form.user = null
|
|
// 重置相关状态
|
|
this.showFilterList = false
|
|
this.listTable = []
|
|
this.totalAssets = 0
|
|
this.currentPage = 1
|
|
this.pageSize = 10
|
|
// 重置表单验证状态
|
|
if (this.$refs.form) {
|
|
this.$refs.form.resetFields()
|
|
}
|
|
},
|
|
// 编辑前
|
|
[CRUD.HOOK.beforeToEdit](crud, form) {
|
|
},
|
|
// 提交前做的操作
|
|
[CRUD.HOOK.afterValidateCU](crud) {
|
|
console.log(crud.form)
|
|
return true
|
|
},
|
|
// 关闭弹框前的操作
|
|
[CRUD.HOOK.beforeAddCancel](crud) {
|
|
// 重置表单数据
|
|
crud.form.departmentname = null
|
|
// crud.form.user = null
|
|
// 重置相关状态
|
|
this.showFilterList = false
|
|
this.listTable = []
|
|
this.totalAssets = 0
|
|
this.currentPage = 1
|
|
this.pageSize = 10
|
|
// 重置表单验证状态
|
|
if (this.$refs.form) {
|
|
this.$refs.form.resetFields()
|
|
}
|
|
},
|
|
// getAssetDeptTree() {
|
|
// getAssetDeptTree().then(res => {
|
|
// this.departmentOptions = res
|
|
// })
|
|
// },
|
|
searchChange(val) {
|
|
if (val) {
|
|
this.keyWord = ''
|
|
}
|
|
},
|
|
resetQuery() {
|
|
// 重置查询参数
|
|
this.query.billNo = ''
|
|
this.query.warehouseId = ''
|
|
this.query.status = ''
|
|
this.crud.toQuery()
|
|
},
|
|
// 触发单选
|
|
clickRowHandler(row) {
|
|
this.$refs.table.clearSelection()
|
|
this.$refs.table.toggleRowSelection(row)
|
|
},
|
|
handleSettle(row) {
|
|
// if ((row.status || '').toString().trim() !== '1') {
|
|
// this.$message({ message: '当前任务不在盘点中,不可结算', type: 'error', offset: 8 })
|
|
// return
|
|
// }
|
|
row.settleLoading = true
|
|
FetchStockSettle(row.id).then(res => {
|
|
row.settleLoading = false
|
|
if (res.data === null) {
|
|
this.$message({ message: res.message, type: 'error', offset: 8 })
|
|
} else {
|
|
this.$message({ message: '结算操作成功', type: 'success', offset: 8 })
|
|
this.crud.refresh()
|
|
}
|
|
}).catch(err => {
|
|
row.settleLoading = false
|
|
console.log(err)
|
|
this.$message({ message: '结算操作失败', type: 'error', offset: 8 })
|
|
})
|
|
},
|
|
handleExport(row) {
|
|
row.exportLoading = true
|
|
let loadingClosed = false
|
|
|
|
const params = { id: row.id }
|
|
const exportUrl = this.baseApi + '/api/stocktake/exportStockTakeData?' + qs.stringify(params, { indices: false })
|
|
|
|
const link = document.createElement('a')
|
|
link.style.display = 'none'
|
|
link.href = exportUrl
|
|
|
|
document.body.appendChild(link)
|
|
link.click()
|
|
|
|
// 正常关闭
|
|
const timer = setTimeout(() => {
|
|
if (!loadingClosed) {
|
|
loadingClosed = true
|
|
row.exportLoading = false
|
|
document.body.removeChild(link)
|
|
}
|
|
}, 1500)
|
|
|
|
// 兜底最长等待3秒
|
|
setTimeout(() => {
|
|
if (!loadingClosed) {
|
|
clearTimeout(timer)
|
|
row.exportLoading = false
|
|
}
|
|
}, 3000)
|
|
},
|
|
doSearch() {
|
|
if (this.optionVal === 'assetMark') {
|
|
this.assetMark = this.keyWord
|
|
this.assetName = ''
|
|
} else {
|
|
this.assetName = this.keyWord
|
|
this.assetMark = ''
|
|
}
|
|
this.inventoryPage = 1
|
|
this.tabIndex === 1 ? this.getStockTakeSuperfluousByTaskId() : this.fetchInventoryList()
|
|
},
|
|
toDelete(datas) {
|
|
this.$confirm('此操作将删除当前所选盘点任务' + '<span>你是否还要继续?</span>', '提示', {
|
|
confirmButtonText: '继续',
|
|
cancelButtonText: '取消',
|
|
type: 'warning',
|
|
dangerouslyUseHTMLString: true
|
|
}).then(() => {
|
|
datas.deleteLoading = true
|
|
FetchDeleteStockTake(datas.id).then((res) => {
|
|
datas.deleteLoading = false
|
|
if (res.data === null) {
|
|
this.$message({ message: res.message, type: 'error', offset: 8 })
|
|
} else {
|
|
this.$message({ message: '删除成功', type: 'success', offset: 8 })
|
|
}
|
|
this.crud.refresh()
|
|
}).catch(err => {
|
|
datas.deleteLoading = false
|
|
console.log(err)
|
|
})
|
|
}).catch(() => {
|
|
})
|
|
},
|
|
// 清空缓存
|
|
// clearCacheDatas(datas) {
|
|
// this.$confirm('此操作将清空盘点缓存数据' + '<span>你是否还要继续?</span>', '提示', {
|
|
// confirmButtonText: '继续',
|
|
// cancelButtonText: '取消',
|
|
// type: 'warning',
|
|
// dangerouslyUseHTMLString: true
|
|
// }).then(() => {
|
|
// this.clearCacheLoading = true
|
|
// }).catch(() => {
|
|
// this.clearCacheLoading = false
|
|
// })
|
|
// },
|
|
// 获取资产数据
|
|
fetchAssetsData(isBtn) {
|
|
this.$refs.form.validate((valid) => {
|
|
if (valid) {
|
|
if (isBtn) {
|
|
this.fetchLoading = true
|
|
}
|
|
this.showFilterList = true
|
|
const params = {
|
|
'departmentname': this.crud.form.departmentname,
|
|
'pageNo': this.currentPage,
|
|
'pageSize': this.pageSize
|
|
}
|
|
FetchInitAssetInfo(params).then(res => {
|
|
console.log('res', res)
|
|
this.listTable = res.records
|
|
this.totalAssets = res.total
|
|
this.fetchLoading = false
|
|
}).catch(err => {
|
|
console.log(err)
|
|
this.$message({ message: '获取数据失败', type: 'error', offset: 8 })
|
|
this.fetchLoading = false
|
|
})
|
|
}
|
|
})
|
|
},
|
|
// 处理分页大小变化
|
|
handleSizeChange(size) {
|
|
this.pageSize = size
|
|
this.fetchAssetsData()
|
|
},
|
|
// 处理当前页码变化
|
|
handleCurrentChange(current) {
|
|
this.currentPage = current
|
|
this.fetchAssetsData()
|
|
},
|
|
// 处理部门选择变化
|
|
handleDepartmentChange() {
|
|
this.currentPage = 1
|
|
this.fetchAssetsData()
|
|
},
|
|
// 处理双击行事件
|
|
handleRowDblClick(row) {
|
|
this.tabIndex = 0
|
|
this.selectedTask = [row]
|
|
this.detailDialogVisible = true
|
|
|
|
this.taskResult = ''
|
|
this.assetMark = ''
|
|
this.assetName = ''
|
|
this.keyWord = ''
|
|
this.inventoryPage = 1
|
|
this.fetchInventoryList()
|
|
},
|
|
changeActiveTab(index) {
|
|
this.tabIndex = index
|
|
this.inventoryPage = 1
|
|
this.taskResult = ''
|
|
this.assetMark = ''
|
|
this.assetName = ''
|
|
this.keyWord = ''
|
|
this.tabIndex === 1 ? this.getStockTakeSuperfluousByTaskId() : this.fetchInventoryList()
|
|
},
|
|
// 获取盘点清单数据
|
|
fetchInventoryList() {
|
|
if (!this.selectedTask) return
|
|
this.inventoryLoading = true
|
|
const params = {
|
|
taskId: this.selectedTask[0].id,
|
|
pageNo: this.inventoryPage,
|
|
pageSize: this.inventoryPageSize,
|
|
taskResult: this.taskResult,
|
|
assetMark: this.assetMark,
|
|
assetName: this.assetName
|
|
}
|
|
FetchStockTakeDetailsByTaskId(params).then(res => {
|
|
this.inventoryList = res.records
|
|
this.inventoryTotal = res.total
|
|
this.inventoryLoading = false
|
|
}).catch(err => {
|
|
console.log(err)
|
|
this.$message({ message: '获取数据失败', type: 'error', offset: 8 })
|
|
this.inventoryLoading = false
|
|
})
|
|
},
|
|
// 获取盘盈列表数据
|
|
getStockTakeSuperfluousByTaskId() {
|
|
if (!this.selectedTask) return
|
|
this.inventoryLoading = true
|
|
const params = {
|
|
taskId: this.selectedTask[0].id,
|
|
pageNo: this.inventoryPage,
|
|
pageSize: this.inventoryPageSize,
|
|
assetMark: this.assetMark,
|
|
assetName: this.assetName
|
|
}
|
|
FetchStockTakeSuperfluousByTaskId(params).then(res => {
|
|
this.inventoryList = res.data.records
|
|
this.inventoryTotal = res.data.total
|
|
this.inventoryLoading = false
|
|
}).catch(err => {
|
|
console.log(err)
|
|
this.$message({ message: '获取数据失败', type: 'error', offset: 8 })
|
|
this.inventoryLoading = false
|
|
})
|
|
},
|
|
// 处理盘点清单分页大小变化
|
|
handleInventorySizeChange(size) {
|
|
this.inventoryPage = 1
|
|
this.inventoryPageSize = size
|
|
this.tabIndex === 1 ? this.getStockTakeSuperfluousByTaskId() : this.fetchInventoryList()
|
|
},
|
|
// 处理盘点清单当前页码变化
|
|
handleInventoryCurrentChange(current) {
|
|
this.inventoryPage = current
|
|
this.tabIndex === 1 ? this.getStockTakeSuperfluousByTaskId() : this.fetchInventoryList()
|
|
},
|
|
// 直接触发新增接口
|
|
addStockTakeBill() {
|
|
this.addLoading = true
|
|
add({}).then(res => {
|
|
if (res.data === null) {
|
|
this.$message({ message: res.message, type: 'error', offset: 8 })
|
|
} else {
|
|
this.$message({ message: '新增成功', type: 'success', offset: 8 })
|
|
this.crud.refresh()
|
|
}
|
|
this.addLoading = false
|
|
}).catch(err => {
|
|
console.log(err)
|
|
this.$message({ message: '新增失败', type: 'error', offset: 8 })
|
|
this.addLoading = false
|
|
})
|
|
}
|
|
}
|
|
}
|
|
</script>
|
|
|
|
<style lang="scss" scoped>
|
|
.group-form{
|
|
.el-form-item{
|
|
&:nth-child(odd){
|
|
margin-right: 0;
|
|
}
|
|
&.form-item-style{
|
|
margin-right: 40px;
|
|
}
|
|
::v-deep .el-form-item__content{
|
|
width: 300px !important;
|
|
}
|
|
}
|
|
}
|
|
|
|
::v-deep .input-prepend .el-input__inner{
|
|
padding-left: 100px;
|
|
}
|
|
|
|
::v-deep .el-tag{
|
|
&.el-tag--small{
|
|
color: #0348f3 !important;
|
|
background-color: #eef5fe !important;
|
|
border-color: #c1dbfc !important;
|
|
}
|
|
&.el-tag--success {
|
|
background-color: #e7faf0 !important;
|
|
border-color: #d0f5e0!important;
|
|
color: #13ce66!important;
|
|
}
|
|
&.el-tag--info {
|
|
background-color: #f4f4f5 !important;
|
|
border-color: #f4f4f5!important;
|
|
color: #909399!important;
|
|
}
|
|
&.el-tag--error {
|
|
background-color: #fbc0b5 !important;
|
|
border-color: #fcab9d !important;
|
|
color: #ed4a41!important;
|
|
}
|
|
&.other-tag{
|
|
color: #FF8329 !important;
|
|
background-color: #FFF3E5 !important;
|
|
border-color: #FEBD98 !important;
|
|
}
|
|
}
|
|
|
|
.task-detail {
|
|
padding: 10px 0;
|
|
}
|
|
|
|
.task-info {
|
|
margin-bottom: 20px;
|
|
}
|
|
|
|
.task-info h3,
|
|
.inventory-list h3 {
|
|
margin-bottom: 10px;
|
|
font-size: 16px;
|
|
font-weight: bold;
|
|
color: #333;
|
|
}
|
|
|
|
.inventory-list {
|
|
margin-top: 30px;
|
|
}
|
|
|
|
.inventory-list .el-table {
|
|
margin-top: 10px;
|
|
}
|
|
|
|
.inventory-detail-dialog{
|
|
::v-deep .el-dialog__body{
|
|
padding: 0 !important;
|
|
}
|
|
}
|
|
.el-table .el-button{
|
|
padding: 7px 10px !important;
|
|
}
|
|
|
|
.tab-nav{
|
|
display: flex;
|
|
justify-content: flex-start;
|
|
margin: 25px 0 18px 0;
|
|
font-size: 16px;
|
|
font-weight: bold;
|
|
color: #333;
|
|
// padding: 0 0 0 20px;
|
|
border-bottom: 1px solid #EDEFF3;
|
|
li{
|
|
margin-right: 30px;
|
|
cursor: default;
|
|
&.active-tab-nav{
|
|
padding-bottom: 10px;
|
|
color: #0348F3;
|
|
border-bottom: 3px solid #0348F3;
|
|
}
|
|
}
|
|
}
|
|
</style>
|