feat(job): 实现出库功能并优化相关接口

- 修改指定出库接口参数,由stockIds改为groupCodingNo和quantity
- 更新MydoJobMapper.xml存储过程调用参数名称
- 调整前端页面字段展示及交互逻辑,适配新的出库方式
- 优化库存查询条件和显示列,去除冗余字段
- 增加出库数量校验逻辑,确保不超过可用库存
- 更新相关服务层和控制层代码以支持新业务流程
- 修改ViewHandAllotStock实体类属性,匹配数据库视图结构
- 调整导出功能标题及相关注释说明
This commit is contained in:
liuhanqing
2025-12-09 13:10:03 +08:00
parent 4e79dcb95f
commit 458ae995a7
14 changed files with 287 additions and 941 deletions

View File

@@ -35,13 +35,13 @@ export function hangInvalidCheckJob(data) {
})
}
export function pointOut(stockIds,exitId) {
export function pointOut(groupCodingNo, outQuantity) {
return request({
url: '/job/outmydoJob/pointOut',
method: 'get',
params: {
stockIds: stockIds.join(',') ,// 将数组转换为逗号分隔的字符串
exitId:exitId
groupCodingNo: groupCodingNo,
outQuantity: outQuantity
}
})
}

View File

@@ -135,8 +135,8 @@
<!-- </template>-->
<!-- </el-table-column>-->
<el-table-column label="仓库" align="left" prop="warehouseName" />
<el-table-column label="出口" align="left" prop="exitId"/> <!-- 出口ID -->
<!-- <el-table-column label="仓库" align="left" prop="warehouseName" /> -->
<!-- <el-table-column label="出口" align="left" prop="exitId"/> 出口ID -->
<el-table-column label="创建时间" align="left" prop="createTime" width="180"/> <!-- 创建时间 -->
<el-table-column label="开始时间" align="left" prop="startTime" width="180"/> <!-- 开始时间 -->
<el-table-column label="结束时间" align="left" prop="finishTime" width="180"/> <!-- 结束时间 -->
@@ -154,44 +154,13 @@
<el-table v-loading="detailLoading" :data="mydoJobDetailList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="子任务ID" align="left" prop="jobDetailId" width="160" /> <!-- 子任务ID -->
<el-table-column label="库存ID" align="left" prop="stockId" width="160" /> <!-- 库存ID -->
<el-table-column label="子单据ID" align="left" prop="inOrOutDId" width="160" /> <!-- 子单据ID -->
<el-table-column label="子任务ID" align="left" prop="jobDetailId" /> <!-- 子任务ID -->
<el-table-column label="库存ID" align="left" prop="stockId" /> <!-- 库存ID -->
<el-table-column label="子单据ID" align="left" prop="inOrOutDId" /> <!-- 子单据ID -->
<el-table-column label="物料编码" align="left" prop="productId" />
<el-table-column label="物料名称" align="left" prop="productName" />
<el-table-column label="出库数量" align="right" prop="outQuantity" /> <!-- 出库数量 -->
<el-table-column label="批号" align="left" prop="lotNo" />
<el-table-column label="单价" align="left" prop="printDate" />
<el-table-column label="供应商" align="left" prop="supplierName" />
<el-table-column label="来源" align="left" prop="spare1" ><!--来源-->
<template slot-scope="scope">
<dict-tag :options="dict.type.origin_type" :value="scope.row.spare1"/>
</template>
</el-table-column>
<el-table-column label="状态" align="left" prop="spare2" ><!--用途-->
<template slot-scope="scope">
<dict-tag :options="dict.type.turnover_type" :value="scope.row.spare2"/>
</template>
</el-table-column>
<el-table-column label="套账" align="left" prop="spare3" ><!--用途-->
<template slot-scope="scope">
<dict-tag :options="dict.type.account_type" :value="scope.row.spare3"/>
</template>
</el-table-column>
<el-table-column label="用途" align="left" prop="spare4" ><!--用途-->
<template slot-scope="scope">
<dict-tag :options="dict.type.purpose_type" :value="scope.row.spare4"/>
</template>
</el-table-column>
<el-table-column label="台次" align="left" prop="spare5" />
<el-table-column label="合同号" align="left" prop="spare6" />
<el-table-column label="件次" align="left" prop="spare7" />
<el-table-column label="质量等级" align="left" prop="spare8" ><!--用途-->
<template slot-scope="scope">
<dict-tag :options="dict.type.quality_type" :value="scope.row.spare8"/>
</template>
</el-table-column>
<el-table-column label="管理号" align="left" prop="spare9" />
</el-table>
<pagination

View File

@@ -531,13 +531,13 @@ export default {
// 如果是审核操作(status=2),显示弹窗选择出口
if (status === 2 || status === 3) {
this.currentAuditStatus = status
// if (status === 2 || status === 3) {
// this.currentAuditStatus = status
this.auditDialogVisible = true
this.auditForm.exitId = null
return
}
// this.auditDialogVisible = true
// this.auditForm.exitId = null
// return
// }
const params = {
stockoutIds: this.selectedRows.map(row => row.stockoutId),

View File

@@ -1,36 +1,35 @@
<template>
<div class="app-container">
<el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
<el-form-item label="库存编码" prop="stockId"><!-- 库存id -->
<el-form-item label="层数" prop="theFloor"><!-- 层数 -->
<el-input
v-model="queryParams.stockId"
placeholder="请输入库存编码"
v-model="queryParams.theFloor"
placeholder="请输入层数"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="货位名称" prop="cargoSpaceName"><!-- 货位id -->
<el-form-item label="列数" prop="theColumn"><!-- 列数 -->
<el-input
v-model="queryParams.cargoSpaceName"
placeholder="请输入货位名称"
v-model="queryParams.theColumn"
placeholder="请输入列数"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="订单号" prop="orderId"><!-- 货位id -->
<el-form-item label="通道编码" prop="groupCodingNo"><!-- 货位id -->
<el-input
v-model="queryParams.orderId"
placeholder="请输入订单号"
v-model="queryParams.groupCodingNo"
placeholder="请输入通道编码"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="品名" prop="productName"><!-- 物料描述 -->
<el-form-item label="产品名称" prop="productName"><!-- 物料描述 -->
<el-input
v-model="queryParams.productName"
placeholder="请输入品名"
placeholder="请输入产品名称"
clearable
@keyup.enter.native="handleQuery"
/>
@@ -59,52 +58,13 @@
<el-table v-loading="loading" :data="managementList" @selection-change="handleSelectionChange" max-height="650">
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="库存编码" align="center" prop="stockId" />
<el-table-column label="仓库" align="center" prop="warehouseId" >
<template slot-scope="scope">
<dict-tag :options="dict.type.warehouse" :value="scope.row.warehouseId"/>
</template>
</el-table-column>
<el-table-column label="货位名称" align="center" prop="cargoSpaceName" />
<el-table-column label="批次号" align="center" prop="lotNo" />
<el-table-column label="物料编码" align="center" prop="productId" />
<el-table-column label="物料名称" align="center" prop="productName" />
<el-table-column label="规格型号" align="center" prop="netWeight" />
<el-table-column label="图号" align="center" prop="grossWeight" />
<el-table-column label="库存数量" align="center" prop="quantity" width="80" />
<el-table-column label="来源" align="center" prop="spare1" >
<template slot-scope="scope">
<dict-tag :options="dict.type.origin_type" :value="scope.row.spare1"/>
</template>
</el-table-column>
<el-table-column label="套账" align="center" prop="spare3" >
<template slot-scope="scope">
<dict-tag :options="dict.type.account_type" :value="scope.row.spare3"/>
</template>
</el-table-column>
<el-table-column label="用途" align="center" prop="spare4" >
<template slot-scope="scope">
<dict-tag :options="dict.type.purpose_type" :value="scope.row.model"/>
</template>
</el-table-column>
<el-table-column label="台次" align="center" prop="spare5" />
<el-table-column label="入库单价" align="center" prop="spare6" />
<el-table-column label="状态" align="center" prop="voltage" >
<template slot-scope="scope">
<dict-tag :options="dict.type.turnover_type" :value="scope.row.voltage"/>
</template>
</el-table-column>
<el-table-column label="件次" align="center" prop="power" />
<!-- <el-table-column label="供应商" align="center" prop="phase" />-->
<el-table-column label="供应商" align="center" prop="inClassId" />
<el-table-column label="管理号" align="center" prop="distribution" />
<el-table-column label="产品质量" align="center" prop="spare8" >
<template slot-scope="scope">
<dict-tag :options="dict.type.quality_type" :value="scope.row.spare8"/>
</template>
</el-table-column>
<el-table-column label="合同号" align="center" prop="orderId" />
<el-table-column label="唯一id" align="center" prop="onlyIdentity" />
<el-table-column label="列数" align="center" prop="theColumn" />
<el-table-column label="层数" align="center" prop="theFloor" />
<el-table-column label="产品编码" align="center" prop="productId" />
<el-table-column label="产品名称" align="center" prop="productName" />
<el-table-column label="通道组编码" align="center" prop="groupCodingNo" />
<el-table-column label="库存数量" align="center" prop="quantity" />
</el-table>
@@ -148,17 +108,21 @@
</el-dialog>
<!-- 出口选择弹窗 -->
<el-dialog title="选择出口" :visible.sync="exitDialogVisible" width="400px" append-to-body>
<el-form ref="exitForm" :model="exitForm" :rules="exitRules" label-width="80px">
<el-form-item label="选择出口" prop="exitId">
<el-select v-model="exitForm.exitId" placeholder="请选择出口" clearable>
<el-option
v-for="item in exitOptions"
:key="item.exitId"
:label="item.exitName"
:value="item.exitId"
/>
</el-select>
<el-dialog title="指定出库" :visible.sync="exitDialogVisible" width="420px" append-to-body>
<el-form ref="exitForm" :model="exitForm" :rules="exitRules" label-width="90px">
<el-form-item label="出库数量" prop="outQuantity">
<el-input-number
v-model="exitForm.outQuantity"
:min="1"
:max="selectedTotalQuantity"
:step="1"
:precision="2"
controls-position="right"
placeholder="请输入出库数量"
/>
<div class="no-wrap" style="margin-top: 6px; color: #909399; font-size: 12px;">
可用库存:{{ selectedTotalQuantity }}
</div>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
@@ -202,31 +166,11 @@ export default {
queryParams: {
pageNum: 1,
pageSize: 10,
stockId: null,
cargoSpaceStockStatus:'2',
cargoSpaceName: null,
stockStatus: null,
productStatus: null,
lotNo: null,
inDate: null,
backDate: null,
productGuid: null,
quantity: null,
jobId: null,
trayCode: null,
outQuantity: null,
stockinDetailId: null,
stockinId: null,
inType: null,
inClassId: null,
warehouseId: null,
stackingId: null,
spare1: null,
spare2: null,
spare3: null,
spare4: null,
spare5: null,
spare6: null
theFloor: null,
theColumn: null,
groupCodingNo: null,
productId: null,
productName: null,
},
// 表单参数
form: {},
@@ -240,23 +184,21 @@ export default {
exitDialogVisible: false,
// 出口表单数据
exitForm: {
exitId: null
exitId: null,
outQuantity: null
},
// 出口表单验证规则
exitRules: {
exitId: [
{ required: true, message: "请选择出口", trigger: 'change' }
outQuantity: [
{ required: true, message: "请输入出库数量", trigger: 'change' },
{ validator: this.validateOutQuantity, trigger: 'blur' }
]
},
// 出口选项
exitOptions: [
{ exitId: '1', exitName: '1'},
{ exitId: '2', exitName: '2'},
],
// 选中的库存数据
selectedStockData: []
selectedStockData: [],
selectedTotalQuantity: 0
}
},
created() {
@@ -264,6 +206,20 @@ export default {
this.getWarehouseList();
},
methods: {
validateOutQuantity(rule, value, callback) {
if (value === null || value === undefined || value === '') {
return callback(new Error('请输入出库数量'))
}
const num = parseFloat(value)
if (isNaN(num) || num <= 0) {
return callback(new Error('出库数量必须大于0'))
}
const max = this.selectedTotalQuantity || 0
if (num > max) {
return callback(new Error('出库数量不能超过可用库存'))
}
return callback()
},
/** 获取仓库列表 */
getWarehouseList() {
listWarehouse().then(response => {
@@ -387,12 +343,17 @@ export default {
// 获取选中的完整数据
const selectedData = this.managementList.filter(item => this.ids.includes(item.stockId));
this.selectedStockData = selectedData;
this.selectedTotalQuantity = selectedData.reduce((sum, row) => {
const q = parseFloat(row.quantity)
return sum + (isNaN(q) ? 0 : q)
}, 0)
// 显示出口选择弹窗
this.exitDialogVisible = true;
this.exitForm.exitId = null;
this.exitForm.outQuantity = null;
},
@@ -400,14 +361,32 @@ export default {
submitPointOut() {
this.$refs["exitForm"].validate(valid => {
if (valid) {
const stockIds = this.ids;
// 调用API将stockIds数组和出口信息传给后端
console.log("指定货位出库:", stockIds, this.exitForm.exitId)
pointOut(stockIds, this.exitForm.exitId).then(response => {
this.$modal.msgSuccess(response.msg);
this.getList();
this.exitDialogVisible = false;
});
if (this.ids.length !== 1) {
this.$modal.msgError('请选择一条库存进行出库')
return
}
const selectedRow = this.managementList.find(item => item.stockId === this.ids[0])
if (!selectedRow) {
this.$modal.msgError('未找到选中库存数据')
return
}
const outQty = parseFloat(this.exitForm.outQuantity)
if (isNaN(outQty) || outQty <= 0) {
this.$modal.msgError('请输入有效的出库数量')
return
}
const max = parseFloat(selectedRow.quantity) || 0
if (outQty > max) {
this.$modal.msgError('出库数量不能超过选择的库存数量')
return
}
const groupCodingNo = selectedRow.groupCodingNo
console.log('指定货位出库:', groupCodingNo, outQty)
pointOut(groupCodingNo, outQty).then(response => {
this.$modal.msgSuccess(response.msg)
this.getList()
this.exitDialogVisible = false
})
}
})
},
@@ -416,6 +395,7 @@ export default {
cancelExit() {
this.exitDialogVisible = false;
this.exitForm.exitId = null;
this.exitForm.outQuantity = null;
},
/** 导出按钮操作 */
handleExport() {