Commit 684cc178 by 杨子

feat(库存管理): 新增盘点任务完成功能及借调单管理优化

1. 添加盘点任务完成API及前端操作按钮
2. 优化借调单管理界面及功能,包括:
   - 新增确认借调和归还功能
   - 调整表单字段及验证规则
   - 改进库存选择逻辑
3. 简化出入库报表界面,移除不必要元素
4. 优化库存选择对话框布局和查询逻辑
5. 为盘点任务添加状态显示功能
6. 移除盘点计划中仓库ID的必填验证
parent e840518b
......@@ -42,3 +42,21 @@ export function delWmsBorrowOrder(orderId) {
method: 'delete'
})
}
// 确认借调
export function borrowWmsBorrowOrder(data) {
return request({
url: '/ware/wmsBorrowOrder/borrow?orderId=' + data.orderId,
method: 'post',
data: data
})
}
// 归还借调
export function returnWmsBorrowOrder(data) {
return request({
url: '/ware/wmsBorrowOrder/return',
method: 'post',
data: data
})
}
......@@ -42,3 +42,11 @@ export function delWmsInventoryTask(taskId) {
method: 'delete'
})
}
// 结束盘点任务
export function completeWmsInventoryTask(taskId) {
return request({
url: '/ware/wmsInventoryTask/complete/' + taskId,
method: 'post'
})
}
<template>
<el-dialog :title="title" v-model="dialogVisible" width="1200px" append-to-body>
<el-form :model="queryParams" ref="queryRef" :inline="true" label-width="80px">
<el-form-item label="物资编码" prop="materialCode">
<el-input v-model="queryParams.materialCode" placeholder="请输入物资编码" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="物资名称" prop="materialName">
<el-input v-model="queryParams.materialName" placeholder="请输入物资名称" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="货架" prop="locationId">
<el-input v-model="queryParams.locationName" placeholder="请选择货架" readonly clearable>
<template #append>
<el-button type="primary" @click="openLocationSelect">选择货架</el-button>
</template>
</el-input>
<el-form-item label="物资名称" prop="material.materialName" v-if="!defaultParams.materialId">
<el-input v-model="queryParams['material.materialName']" placeholder="请输入物资名称" clearable
@keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="批次号" prop="batchNo">
<el-input v-model="queryParams.batchNo" placeholder="请输入批次号" clearable @keyup.enter="handleQuery" />
......@@ -25,20 +16,22 @@
<el-table v-loading="loading" :data="inventoryList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="物资编码" align="center" prop="material.materialCode" />
<el-table-column label="物资编码" align="center" prop="material.materialCode" width="120" />
<el-table-column label="物资名称" align="center" prop="material.materialName" />
<el-table-column label="规格型号" align="center" prop="material.specification" />
<el-table-column label="计量单位" align="center" prop="material.unit" />
<el-table-column label="仓库" align="center" prop="warehouse.warehouseName" />
<el-table-column label="库区" align="center" prop="area.areaName" />
<el-table-column label="货架" align="center" prop="location.locationName" />
<el-table-column label="仓库/库区/货架" width="120">
<template #default="scope">
<div>{{ scope.row.warehouse?.warehouseName || '-' }} / {{ scope.row.area?.areaName || '-' }}/ {{
scope.row.location?.locationName || '-' }}</div>
</template>
</el-table-column>
<el-table-column label="批次号" align="center" prop="batchNo" width="180" />
<el-table-column label="生产日期" align="center" prop="productionDate" width="180">
<el-table-column label="生产日期" align="center" prop="productionDate">
<template #default="scope">
<span>{{ parseTime(scope.row.productionDate, '{y}-{m}-{d}') }}</span>
</template>
</el-table-column>
<el-table-column label="失效日期" align="center" prop="expirationDate" width="180">
<el-table-column label="失效日期" align="center" prop="expirationDate">
<template #default="scope">
<span>{{ parseTime(scope.row.expirationDate, '{y}-{m}-{d}') }}</span>
</template>
......@@ -80,7 +73,7 @@ import LocationSelectDialog from './LocationSelectDialog.vue'
const { proxy } = getCurrentInstance()
const {sys_yes_no, inventory_status} = proxy.useDict('sys_yes_no', 'inventory_status')
const { sys_yes_no, inventory_status } = proxy.useDict('sys_yes_no', 'inventory_status')
const props = defineProps({
......@@ -131,10 +124,19 @@ const total = ref(0)
// 选中的库存
const selectedInventory = ref([])
const defaultParams = ref({})
// 搜索按钮操作
function handleQuery() {
function handleQuery(params) {
defaultParams.value = {
...defaultParams.value,
...params,
}
loading.value = true
listWmsInventory(queryParams.value).then(response => {
listWmsInventory({
...defaultParams.value,
...queryParams.value,
}).then(response => {
inventoryList.value = response.rows
total.value = response.total
loading.value = false
......
<template>
<div class="reports-view">
<div class="view-header">
<div class="header-actions">
<el-button type="primary" @click="exportReport">
<el-icon><Download /></el-icon>
导出报表
</el-button>
<el-button @click="refreshData">
<el-icon><Refresh /></el-icon>
刷新
</el-button>
</div>
</div>
<div class="view-content">
<!-- 过滤条件 -->
<el-card shadow="hover" class="filter-card">
<el-form :model="filterForm" :inline="true" label-width="100px">
<el-form-item label="报表类型">
<el-select v-model="filterForm.reportType" placeholder="请选择报表类型" clearable filterable style="width: 120px;">
<el-option label="出入库汇总" value="summary"></el-option>
<el-option label="周转率分析" value="turnover"></el-option>
<el-option label="效率分析" value="efficiency"></el-option>
<el-option label="异常统计" value="exception"></el-option>
</el-select>
</el-form-item>
<el-form-item label="时间范围">
<el-date-picker
......@@ -89,9 +69,6 @@
<el-statistic title="库存周转天数" :value="statistics.turnoverDays" suffix="天" :value-style="{ color: '#909399' }"></el-statistic>
</el-card>
<el-card shadow="hover" class="stat-card">
<el-statistic title="作业效率" :value="statistics.operationEfficiency" suffix="件/小时" :value-style="{ color: '#67C23A' }"></el-statistic>
</el-card>
<el-card shadow="hover" class="stat-card">
<el-statistic title="异常率" :value="statistics.exceptionRate" suffix="%" :value-style="{ color: '#F56C6C' }"></el-statistic>
</el-card>
</div>
......@@ -126,7 +103,7 @@
<el-card shadow="hover" class="chart-card full-width">
<template #header>
<div class="card-header">
<span>周转率与效率分析</span>
<span>周转率分析</span>
</div>
</template>
<div ref="turnoverChartRef" class="chart-container"></div>
......@@ -582,7 +559,7 @@ const initCharts = () => {
const turnoverOption = {
title: {
text: '周转率与效率分析',
text: '周转率分析',
textStyle: {
fontSize: 16,
fontWeight: 'normal'
......@@ -593,7 +570,7 @@ const initCharts = () => {
trigger: 'axis'
},
legend: {
data: ['周转率', '作业效率', '异常率'],
data: ['周转率'],
top: 30
},
grid: {
......@@ -619,11 +596,6 @@ const initCharts = () => {
axisLabel: {
formatter: '{value}%'
}
},
{
type: 'value',
name: '作业效率(件/小时)',
position: 'right'
}
],
series: [
......@@ -636,24 +608,6 @@ const initCharts = () => {
},
yAxisIndex: 0
},
{
name: '作业效率',
type: 'line',
data: reportData.value.map(item => item.efficiency),
itemStyle: {
color: '#67C23A'
},
yAxisIndex: 1
},
{
name: '异常率',
type: 'line',
data: reportData.value.map(item => item.exceptionCount),
itemStyle: {
color: '#F56C6C'
},
yAxisIndex: 0
}
]
}
turnoverChart.setOption(turnoverOption)
......
......@@ -2,74 +2,26 @@
<div class="app-container">
<el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" label-width="100px">
<el-form-item label="借调单号" prop="orderNo">
<el-input
v-model="queryParams.orderNo"
placeholder="请输入借调单号"
clearable
@keyup.enter="handleQuery"
/>
</el-form-item>
<el-form-item label="物资ID" prop="materialId">
<el-input
v-model="queryParams.materialId"
placeholder="请输入物资ID"
clearable
@keyup.enter="handleQuery"
/>
</el-form-item>
<el-form-item label="仓库ID" prop="warehouseId">
<el-input
v-model="queryParams.warehouseId"
placeholder="请输入仓库ID"
clearable
@keyup.enter="handleQuery"
/>
</el-form-item>
<el-form-item label="数量" prop="quantity">
<el-input
v-model="queryParams.quantity"
placeholder="请输入数量"
clearable
@keyup.enter="handleQuery"
/>
<el-input v-model="queryParams.orderNo" placeholder="请输入借调单号" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="借用人" prop="borrowerId">
<el-input
v-model="queryParams.borrowerId"
placeholder="请输入借用人"
clearable
@keyup.enter="handleQuery"
/>
<el-input v-model="queryParams.borrowerId" placeholder="请输入借用人" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="借用部门" prop="borrowDeptId">
<el-input
v-model="queryParams.borrowDeptId"
placeholder="请输入借用部门"
clearable
@keyup.enter="handleQuery"
/>
<el-form-item label="借用人电话" prop="borrowerPhone">
<el-input v-model="queryParams.borrowerPhone" placeholder="请输入借用人电话" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="借用时间" prop="borrowTime">
<el-date-picker clearable
v-model="queryParams.borrowTime"
type="date"
value-format="YYYY-MM-DD"
<el-date-picker clearable v-model="queryParams.borrowTime" type="date" value-format="YYYY-MM-DD"
placeholder="请选择借用时间">
</el-date-picker>
</el-form-item>
<el-form-item label="预计归还时间" prop="expectedReturnTime">
<el-date-picker clearable
v-model="queryParams.expectedReturnTime"
type="date"
value-format="YYYY-MM-DD"
<el-date-picker clearable v-model="queryParams.expectedReturnTime" type="date" value-format="YYYY-MM-DD"
placeholder="请选择预计归还时间">
</el-date-picker>
</el-form-item>
<el-form-item label="实际归还时间" prop="actualReturnTime">
<el-date-picker clearable
v-model="queryParams.actualReturnTime"
type="date"
value-format="YYYY-MM-DD"
<el-date-picker clearable v-model="queryParams.actualReturnTime" type="date" value-format="YYYY-MM-DD"
placeholder="请选择实际归还时间">
</el-date-picker>
</el-form-item>
......@@ -81,42 +33,16 @@
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button
type="primary"
plain
icon="Plus"
@click="handleAdd"
v-hasPermi="['ware:wmsBorrowOrder:add']"
>新增</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="success"
plain
icon="Edit"
:disabled="single"
@click="handleUpdate"
v-hasPermi="['ware:wmsBorrowOrder:edit']"
>修改</el-button>
<el-button type="primary" plain icon="Plus" @click="handleAdd"
v-hasPermi="['ware:wmsBorrowOrder:add']">新增</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="danger"
plain
icon="Delete"
:disabled="multiple"
@click="handleDelete"
v-hasPermi="['ware:wmsBorrowOrder:remove']"
>删除</el-button>
<el-button type="success" plain icon="Edit" :disabled="single" @click="handleUpdate"
v-hasPermi="['ware:wmsBorrowOrder:edit']">修改</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="warning"
plain
icon="Download"
@click="handleExport"
v-hasPermi="['ware:wmsBorrowOrder:export']"
>导出</el-button>
<el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete"
v-hasPermi="['ware:wmsBorrowOrder:remove']">删除</el-button>
</el-col>
<right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
......@@ -124,12 +50,19 @@
<el-table v-loading="loading" :data="wmsBorrowOrderList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="借调单号" align="center" prop="orderNo" width="150" />
<el-table-column label="借调类型" align="center" prop="borrowType" width="100" />
<el-table-column label="物资ID" align="center" prop="materialId" width="100" />
<el-table-column label="仓库ID" align="center" prop="warehouseId" width="100" />
<el-table-column label="数量" align="center" prop="quantity" />
<el-table-column label="借用人" align="center" prop="borrowerId" />
<el-table-column label="借用部门" align="center" prop="borrowDeptId" />
<el-table-column label="借调类型" align="center" prop="borrowType" width="100">
<template #default="{ row }">
<dict-tag :options="borrow_order_type" :value="row.borrowType" />
</template>
</el-table-column>
<el-table-column label="物资名称" align="center" prop="material.materialName" width="100" />
<el-table-column label="规格型号" align="center" prop="material.specification" width="100" />
<el-table-column label="物资分类" align="center" prop="material.category.categoryName" width="100" />
<el-table-column label="仓库" align="center" prop="warehouse.warehouseName" width="100" />
<el-table-column label="借出数量" align="center" prop="quantity" />
<el-table-column label="归还数量" align="center" prop="returnedQuantity" />
<el-table-column label="借用人" align="center" prop="borrowerName" />
<el-table-column label="借用人电话" align="center" prop="borrowerPhone" />
<el-table-column label="借用时间" align="center" prop="borrowTime" width="180">
<template #default="scope">
<span>{{ parseTime(scope.row.borrowTime, '{y}-{m}-{d}') }}</span>
......@@ -145,74 +78,74 @@
<span>{{ parseTime(scope.row.actualReturnTime, '{y}-{m}-{d}') }}</span>
</template>
</el-table-column>
<el-table-column label="单据状态" align="center" prop="orderStatus" />
<el-table-column label="审批状态" align="center" prop="approvalStatus" />
<el-table-column label="状态" align="center" prop="orderStatus">
<template #default="{ row }">
<dict-tag :options="borrower_order_status" :value="row.orderStatus" />
</template>
</el-table-column>
<!-- <el-table-column label="审批状态" align="center" prop="approvalStatus" /> -->
<el-table-column label="备注" align="center" prop="remark" />
<el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="200" fixed="right">
<el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="280" fixed="right">
<template #default="scope">
<el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['ware:wmsBorrowOrder:edit']">修改</el-button>
<el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['ware:wmsBorrowOrder:remove']">删除</el-button>
<el-button link type="success" icon="Check" @click="handleReturn(scope.row)" v-hasPermi="['ware:wmsBorrowOrder:return']">归还</el-button>
<el-button v-if="scope.row.orderStatus === orderStatusKeyMap.NOT_BORROWED" link type="primary" icon="Edit" @click="handleUpdate(scope.row)"
v-hasPermi="['ware:wmsBorrowOrder:edit']">修改</el-button>
<el-button v-if="scope.row.orderStatus === orderStatusKeyMap.NOT_BORROWED" link type="primary" icon="Delete" @click="handleDelete(scope.row)"
v-hasPermi="['ware:wmsBorrowOrder:remove']">删除</el-button>
<el-button v-if="scope.row.orderStatus === orderStatusKeyMap.NOT_BORROWED" link type="success" icon="Check" @click="handleBorrow(scope.row)"
v-hasPermi="['ware:wmsBorrowOrder:borrow']">确认借调</el-button>
<el-button v-if="scope.row.orderStatus === orderStatusKeyMap.BORROWED || scope.row.orderStatus === orderStatusKeyMap.EXPIRED_NOT_RETURNED || scope.row.orderStatus === orderStatusKeyMap.PARTIALLY_RETURNED" link type="success" icon="Check" @click="handleReturn(scope.row)"
v-hasPermi="['ware:wmsBorrowOrder:return']">归还</el-button>
</template>
</el-table-column>
</el-table>
<pagination
v-show="total>0"
:total="total"
v-model:page="queryParams.pageNum"
v-model:limit="queryParams.pageSize"
@pagination="getList"
/>
<pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize"
@pagination="getList" />
<!-- 添加或修改借调管理对话框 -->
<el-dialog :title="title" v-model="open" width="500px" append-to-body>
<el-form ref="wmsBorrowOrderRef" :model="form" :rules="rules" label-width="100px">
<el-form ref="wmsBorrowOrderRef" :model="form" :rules="rules" label-width="110px">
<el-form-item label="借调单号" prop="orderNo">
<el-input v-model="form.orderNo" placeholder="请输入借调单号" />
</el-form-item>
<el-form-item label="物资ID" prop="materialId">
<el-row :gutter="10">
<el-col :span="18">
<el-input v-model="form.materialId" placeholder="请选择物资" readonly />
</el-col>
<el-col :span="6">
<el-button type="primary" @click="openMaterialSelect">选择物资</el-button>
</el-col>
</el-row>
<el-form-item label="借调类型" prop="borrowType">
<el-radio-group v-model="form.borrowType">
<el-radio v-for="item in borrow_order_type" :key="item.key" :label="item.value">
{{ item.label }}
</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="仓库ID" prop="warehouseId">
<el-form-item label="物资" prop="inventoryId">
<el-row :gutter="10">
<el-col :span="18">
<el-input v-model="form.warehouseId" placeholder="请选择仓库" readonly />
<el-input v-model="form.inventoryName" placeholder="请选择库存中的物资" readonly />
</el-col>
<el-col :span="6">
<el-button type="primary" @click="openWarehouseSelect">选择仓库</el-button>
<el-button type="primary" @click="openInventorySelect">选择物资</el-button>
</el-col>
</el-row>
</el-form-item>
<el-form-item label="数量" prop="quantity">
<el-input v-model="form.quantity" placeholder="请输入数量" />
<el-form-item label="借出数量" prop="quantity">
<el-input-number v-model="form.quantity" placeholder="请输入借出数量" class="w-full" :max="maxQuantity"
:precision="3" />
</el-form-item>
<el-form-item label="借用人" prop="borrowerId">
<el-input v-model="form.borrowerId" placeholder="请输入借用人" />
<el-form-item label="借用人" prop="borrowerName">
<el-input v-model="form.borrowerName" placeholder="请输入借用人" />
</el-form-item>
<el-form-item label="借用部门" prop="borrowDeptId">
<el-input v-model="form.borrowDeptId" placeholder="请输入借用部门" />
<el-form-item label="借用人电话" prop="borrowerPhone">
<el-input v-model="form.borrowerPhone" placeholder="请输入借用联系电话" />
</el-form-item>
<!-- <el-form-item label="借用部门" prop="borrowDeptId">
<el-input v-model="form.borrowDeptId" placeholder="请输入借用部门" />
</el-form-item> -->
<el-form-item label="借用时间" prop="borrowTime">
<el-date-picker clearable
v-model="form.borrowTime"
type="date"
value-format="YYYY-MM-DD"
<el-date-picker clearable v-model="form.borrowTime" type="date" value-format="YYYY-MM-DD"
placeholder="请选择借用时间">
</el-date-picker>
</el-form-item>
<el-form-item label="预计归还时间" prop="expectedReturnTime">
<el-date-picker clearable
v-model="form.expectedReturnTime"
type="date"
value-format="YYYY-MM-DD"
<el-date-picker clearable v-model="form.expectedReturnTime" type="date" value-format="YYYY-MM-DD"
placeholder="请选择预计归还时间">
</el-date-picker>
</el-form-item>
......@@ -228,31 +161,50 @@
</template>
</el-dialog>
<!-- 物资选择对话框组件 -->
<MaterialSelectDialog
ref="materialSelectDialogRef"
v-model:visible="materialDialogVisible"
title="选择物资"
@confirm="handleMaterialConfirm"
/>
<!-- 库存选择对话框组件 -->
<InventorySelectDialog ref="inventorySelectDialogRef" v-model:visible="inventoryDialogVisible" title="选择库存"
@confirm="handleInventoryConfirm" />
<!-- 仓库选择对话框组件 -->
<WarehouseSelectDialog
ref="warehouseSelectDialogRef"
v-model:visible="warehouseDialogVisible"
title="选择仓库"
@confirm="handleWarehouseConfirm"
/>
<WarehouseSelectDialog ref="warehouseSelectDialogRef" v-model:visible="warehouseDialogVisible" title="选择仓库"
@confirm="handleWarehouseConfirm" />
<!-- 归还对话框 -->
<el-dialog title="归还借调" v-model="returnDialogVisible" width="500px" append-to-body>
<el-form :model="returnForm" label-width="100px">
<el-form-item label="归还数量" prop="returnQuantity">
<el-input-number v-model="returnForm.returnQuantity" :min="0.001" :max="returnForm.maxReturnQuantity"
:step="0.001" placeholder="请输入归还数量" />
</el-form-item>
<el-form-item label="归还到库存" prop="inventoryId">
<el-row :gutter="10">
<el-col :span="18">
<el-input v-model="returnForm.inventoryName" placeholder="不填则使用原库存" readonly />
</el-col>
<el-col :span="6">
<el-button type="primary" @click="openReturnInventorySelect">选择物资</el-button>
</el-col>
</el-row>
</el-form-item>
</el-form>
<template #footer>
<el-button @click="returnDialogVisible = false">取消</el-button>
<el-button type="primary" @click="submitReturnForm">确认归还</el-button>
</template>
</el-dialog>
</div>
</template>
<script setup name="WmsBorrowOrder">
import { listWmsBorrowOrder, getWmsBorrowOrder, delWmsBorrowOrder, addWmsBorrowOrder, updateWmsBorrowOrder } from "@/api/ware/wmsBorrowOrder"
import MaterialSelectDialog from "@/components/MaterialSelectDialog.vue"
import { listWmsBorrowOrder, getWmsBorrowOrder, delWmsBorrowOrder, addWmsBorrowOrder, updateWmsBorrowOrder, borrowWmsBorrowOrder, returnWmsBorrowOrder } from "@/api/ware/wmsBorrowOrder"
import InventorySelectDialog from "@/components/InventorySelectDialog.vue"
import WarehouseSelectDialog from "@/components/WarehouseSelectDialog.vue"
import useUserStore from "@/store/modules/user"
const { proxy } = getCurrentInstance()
const { borrow_order_type, borrower_order_status } = proxy.useDict('borrow_order_type', 'borrower_order_status')
const userInfo = useUserStore()
const wmsBorrowOrderList = ref([])
const open = ref(false)
const loading = ref(true)
......@@ -262,11 +214,28 @@ const single = ref(true)
const multiple = ref(true)
const total = ref(0)
const title = ref("")
const maxQuantity = ref(0)
// 物资选择对话框状态
const materialDialogVisible = ref(false)
// 物资选择对话框实例引用
const materialSelectDialogRef = ref(null)
const wmsBorrowOrder = ref(null)
const openInventoryType = ref(''); // form(表单) | returned(归还)
const orderStatusKeyMap = {
/**未借出 */
'NOT_BORROWED': '4',
/**已借出 */
'BORROWED': '0',
/**已归还 */
'RETURNED': '1',
/**超期未还 */
'EXPIRED_NOT_RETURNED': '2',
/**部分归还 */
'PARTIALLY_RETURNED': '3',
}
// 库存选择对话框状态
const inventoryDialogVisible = ref(false)
// 库存选择对话框实例引用
const inventorySelectDialogRef = ref(null)
// 仓库选择对话框状态
const warehouseDialogVisible = ref(false)
......@@ -281,6 +250,7 @@ const data = reactive({
orderNo: null,
borrowType: null,
materialId: null,
inventoryId: null,
warehouseId: null,
quantity: null,
borrowerId: null,
......@@ -293,23 +263,49 @@ const data = reactive({
},
rules: {
orderNo: [
{ required: true, message: "借调单号不能为空", trigger: "blur" }
{ required: true, message: "借调单号不能为空", trigger: "blur" },
{ min: 1, max: 50, message: "借调单号长度不能超过50个字符", trigger: "blur" }
],
borrowType: [
{ required: true, message: "借调类型不能为空", trigger: "change" }
],
materialId: [
{ required: true, message: "物资ID不能为空", trigger: "change" }
inventoryId: [
{ required: true, message: "库存ID不能为空", trigger: "change" }
],
warehouseId: [
{ required: true, message: "仓库ID不能为空", trigger: "change" }
],
quantity: [
{ required: true, message: "数量不能为空", trigger: "blur" }
{ required: true, message: "数量不能为空", trigger: "blur" },
{ type: "number", min: 0.001, message: "数量必须大于0", trigger: "blur" },
{ type: "number", message: "数量必须是数字", trigger: "blur" }
],
borrowerName: [
{ required: true, message: "借用人不能为空", trigger: "blur" },
{ min: 1, max: 20, message: "借用人姓名长度不能超过20个字符", trigger: "blur" }
],
borrowerPhone: [
{ required: true, message: "借用人电话不能为空", trigger: "blur" },
{ pattern: /^1[3-9]\d{9}$/, message: "请输入正确的手机号码", trigger: "blur" }
],
borrowerId: [
{ required: true, message: "借用人不能为空", trigger: "blur" }
borrowTime: [
{ required: true, message: "借用时间不能为空", trigger: "change" }
],
expectedReturnTime: [
{ required: true, message: "预计归还时间不能为空", trigger: "change" },
{
validator: (rule, value, callback) => {
if (value && form.value.borrowTime && new Date(value) < new Date(form.value.borrowTime)) {
callback(new Error('预计归还时间不能早于借用时间'))
} else {
callback()
}
}, trigger: 'change'
}
],
remark: [
{ max: 200, message: "备注长度不能超过200个字符", trigger: "blur" }
]
}
})
......@@ -341,11 +337,13 @@ function reset() {
warehouseId: null,
quantity: null,
borrowerId: null,
bporrowerName: null,
borrowerPhone: null,
borrowDeptId: null,
borrowTime: null,
expectedReturnTime: null,
actualReturnTime: null,
orderStatus: null,
orderStatus: orderStatusKeyMap.NOT_BORROWED,
approvalStatus: null,
remark: null,
createBy: null,
......@@ -387,7 +385,13 @@ function handleUpdate(row) {
reset()
const _orderId = row.orderId || ids.value
getWmsBorrowOrder(_orderId).then(response => {
form.value = response.data
form.value = {
...row,
...response.data
}
form.value.inventoryName = row.material?.materialName|| ''
maxQuantity.value = row.quantity - row.returnedQuantity // 最大可归还数量为未归还数量
open.value = true
title.value = "修改借调管理"
})
......@@ -417,12 +421,12 @@ function submitForm() {
/** 删除按钮操作 */
function handleDelete(row) {
const _orderIds = row.orderId || ids.value
proxy.$modal.confirm('是否确认删除借调管理编号为"' + _orderIds + '"的数据项?').then(function() {
proxy.$modal.confirm('是否确认删除借调管理编号为"' + _orderIds + '"的数据项?').then(function () {
return delWmsBorrowOrder(_orderIds)
}).then(() => {
getList()
proxy.$modal.msgSuccess("删除成功")
}).catch(() => {})
}).catch(() => { })
}
/** 导出按钮操作 */
......@@ -432,20 +436,34 @@ function handleExport() {
}, `wmsBorrowOrder_${new Date().getTime()}.xlsx`)
}
/** 打开物资选择对话框 */
function openMaterialSelect() {
materialDialogVisible.value = true
if (materialSelectDialogRef.value) {
materialSelectDialogRef.value.handleQuery()
/** 打开库存选择对话框 */
function openInventorySelect() {
inventoryDialogVisible.value = true
openInventoryType.value = 'form'
if (inventorySelectDialogRef.value) {
inventorySelectDialogRef.value.handleQuery()
}
}
/** 处理物资选择结果 */
function handleMaterialConfirm(selectedMaterials) {
if (selectedMaterials.length > 0) {
const material = selectedMaterials[0]
form.value.materialId = material.materialId
// 可以根据需要添加更多物资信息字段
/** 处理库存选择结果 */
function handleInventoryConfirm(selectedInventories) {
if (selectedInventories.length > 0) {
const inventory = selectedInventories[0]
if (openInventoryType.value === 'returned') {
returnForm.inventoryId = inventory.inventoryId
returnForm.inventoryName = inventory.material?.materialName || ''
} else {
if (!inventory.availableQuantity) {
proxy.$message.error('库存可用数量为0, 请重新选择')
return;
}
form.value.inventoryId = inventory.inventoryId
form.value.inventoryName = inventory.material?.materialName || ''
form.value.quantity = inventory.availableQuantity;
form.value.materialId = inventory.materialId // 自动将库存中的materialId赋值到form中
form.value.warehouseId = inventory.warehouseId
maxQuantity.value = inventory.availableQuantity
}
}
}
......@@ -466,19 +484,82 @@ function handleWarehouseConfirm(selectedWarehouses) {
}
}
/** 确认借调按钮操作 */
function handleBorrow(row) {
proxy.$modal.confirm('是否确认执行该借调单?').then(function () {
// 传入当前借调对象
return borrowWmsBorrowOrder({
...row,
borrowOrder: row
})
}).then(() => {
getList()
proxy.$modal.msgSuccess("借调成功")
}).catch(() => { })
}
// 归还对话框状态
const returnDialogVisible = ref(false)
// 归还表单数据
const returnForm = reactive({
orderId: null,
returnQuantity: null,
returnedBy: null,
inventoryId: null,
maxReturnQuantity: null
})
// 归还库存选择对话框状态
const returnInventoryDialogVisible = ref(false)
/** 归还按钮操作 */
function handleReturn(row) {
proxy.$modal.confirm('是否确认归还该借调单?').then(function() {
const updateData = {
orderId: row.orderId,
actualReturnTime: new Date().toISOString().split('T')[0], // 设置为当前日期
orderStatus: '已归还' // 假设"已归还"是订单状态的一个有效值
// 初始化归还表单
returnForm.orderId = row.orderId
returnForm.returnQuantity = row.quantity - row.returnedQuantity // 默认一键归还全部数量
returnForm.maxReturnQuantity = row.quantity - row.returnedQuantity // 最大可归还数量为未归还数量
returnForm.inventoryId = null // 默认使用原库存
returnForm.returnedBy = userInfo.id // 当前登录人姓名
wmsBorrowOrder.value = row
// 打开归还对话框
returnDialogVisible.value = true
}
/** 打开归还库存选择对话框 */
function openReturnInventorySelect() {
inventoryDialogVisible.value = true
openInventoryType.value = 'returned'
if (inventorySelectDialogRef.value) {
inventorySelectDialogRef.value.handleQuery({
materialId: wmsBorrowOrder.value.materialId
})
}
}
/** 提交归还表单 */
function submitReturnForm() {
// 验证归还数量
if (returnForm.returnQuantity <= 0 || returnForm.returnQuantity > returnForm.maxReturnQuantity) {
proxy.$modal.msgError(`归还数量必须在1-${returnForm.maxReturnQuantity}之间`)
return
}
proxy.$modal.confirm('是否确认归还?').then(function () {
// 准备归还数据
const returnData = {
orderId: returnForm.orderId,
returnQuantity: returnForm.returnQuantity,
returnedBy: returnForm.returnedBy,
inventoryId: returnForm.inventoryId // 可选,不传则使用原库存
}
return updateWmsBorrowOrder(updateData)
return returnWmsBorrowOrder(returnData)
}).then(() => {
returnDialogVisible.value = false
getList()
proxy.$modal.msgSuccess("归还成功")
}).catch(() => {})
}).catch(() => { })
}
getList()
......
......@@ -252,9 +252,6 @@ const data = reactive({
planType: [
{ required: true, message: "盘点类型不能为空", trigger: "change" }
],
warehouseId: [
{ required: true, message: "仓库ID不能为空", trigger: "blur" }
],
startTime: [
{ required: true, message: "计划开始时间不能为空", trigger: "blur" }
],
......@@ -402,6 +399,7 @@ function handleAdd() {
function handleUpdate(row) {
reset()
form.value = row;
// form.value.warehouseName = row.areaIds || '|' + row.areaIds.split('|').filter(id => id).join('||') + '|'
open.value = true
title.value = "修改盘点计划"
}
......
......@@ -9,6 +9,9 @@
<el-descriptions-item label="任务名称">{{ taskInfo.taskName }}</el-descriptions-item>
<el-descriptions-item label="总盘点数">{{ taskInfo.totalItems }}</el-descriptions-item>
<el-descriptions-item label="已盘数">{{ taskInfo.countedItems }}</el-descriptions-item>
<el-descriptions-item label="任务状态">
<dict-tag :options="check_task_status" :value="taskInfo.taskStatus" />
</el-descriptions-item>
<el-descriptions-item label="备注" :span="2">{{ taskInfo.remark }}</el-descriptions-item>
</el-descriptions>
</div>
......@@ -57,7 +60,7 @@ import { listWmsInventoryTaskDetail } from "@/api/ware/wmsInventoryTaskDetail"
import { parseTime } from "@/utils/ruoyi"
const {proxy} = getCurrentInstance()
const {check_status, diff_type} = proxy.useDict('check_status','diff_type')
const {check_status, diff_type, check_task_status} = proxy.useDict('check_status','diff_type', 'check_task_status')
const props = defineProps({
visible: {
......
......@@ -33,6 +33,11 @@
<el-table-column label="仓库" align="center" prop="warehouseName" />
<el-table-column label="总盘点数" align="center" prop="totalItems" />
<el-table-column label="已盘数" align="center" prop="countedItems" />
<el-table-column label="任务状态" align="center" prop="taskStatus">
<template #default="scope">
<dict-tag :options="check_task_status" :value="scope.row.taskStatus" />
</template>
</el-table-column>
<el-table-column label="创建时间" align="center" prop="createTime" />
<el-table-column label="备注" align="center" prop="remark" width="240" />
<el-table-column label="操作" align="center" class-name="small-padding fixed-width">
......@@ -41,8 +46,10 @@
v-hasPermi="['ware:wmsInventoryTask:detail']">详情</el-button>
<el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)"
v-hasPermi="['ware:wmsInventoryTask:remove']">删除</el-button>
<el-button link type="primary" icon="Scan" @click="handleExecute(scope.row)"
<el-button link type="primary" icon="Pointer" @click="handleExecute(scope.row)"
v-hasPermi="['ware:wmsInventoryTask:execute']">执行盘点</el-button>
<el-button v-if="scope.row.taskStatus === '1'" link type="primary" icon="Check" @click="handleComplete(scope.row)"
v-hasPermi="['ware:wmsInventoryTask:complete']">结束盘点</el-button>
</template>
</el-table-column>
</el-table>
......@@ -77,7 +84,7 @@
</template>
<script setup name="WmsInventoryTask">
import { listWmsInventoryTask, getWmsInventoryTask, delWmsInventoryTask, addWmsInventoryTask, updateWmsInventoryTask } from "@/api/ware/wmsInventoryTask"
import { listWmsInventoryTask, getWmsInventoryTask, delWmsInventoryTask, addWmsInventoryTask, updateWmsInventoryTask, completeWmsInventoryTask } from "@/api/ware/wmsInventoryTask"
import DetailInfo from "./components/DetailInfo.vue"
import AddForm from "./components/AddForm.vue"
import InventoryExecuteForm from "./components/InventoryExecuteForm.vue"
......@@ -88,6 +95,8 @@ const route = useRoute()
const { proxy } = getCurrentInstance()
const {check_task_status} = proxy.useDict('check_task_status')
const wmsInventoryTaskList = ref([])
const open = ref(false)
const loading = ref(true)
......@@ -270,6 +279,16 @@ function handleExecute(row) {
// 传递任务ID到执行盘点组件
inventoryExecuteFormRef.value?.open(row.taskId)
}
/** 结束盘点按钮操作 */
function handleComplete(row) {
proxy.$modal.confirm('是否确认结束盘点任务编号为"' + row.taskNo + '"的数据项?').then(function () {
return completeWmsInventoryTask(row.taskId)
}).then(() => {
getList()
proxy.$modal.msgSuccess("结束盘点成功")
}).catch(() => { })
}
// 监听路由参数中的action
watch(() => route.query.action, (newAction) => {
if (newAction === 'createTask') {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment