fix(biz): 修复入库退料相关功能
This commit is contained in:
parent
437033b41e
commit
3525457c2e
@ -73,4 +73,6 @@ public class RawStorageMatSaveReqVO {
|
|||||||
@Schema(description = "存货账单号")
|
@Schema(description = "存货账单号")
|
||||||
private String inventBillNo;
|
private String inventBillNo;
|
||||||
|
|
||||||
|
private BigDecimal returnQty;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -23,7 +23,7 @@ public class RawStoragePageReqVO extends PageParam {
|
|||||||
private String billNo;
|
private String billNo;
|
||||||
|
|
||||||
@Schema(description = "操作类型 1为入库,2为出库", example = "1")
|
@Schema(description = "操作类型 1为入库,2为出库", example = "1")
|
||||||
private Boolean operatorType;
|
private String operatorType;
|
||||||
|
|
||||||
@Schema(description = "业务类型 (10 采购入库,11 盘盈入库,12 其它入库 21 生产领料 22 盘亏出库 23采购退料)", example = "1")
|
@Schema(description = "业务类型 (10 采购入库,11 盘盈入库,12 其它入库 21 生产领料 22 盘亏出库 23采购退料)", example = "1")
|
||||||
private Integer businessType;
|
private Integer businessType;
|
||||||
|
|||||||
@ -84,4 +84,8 @@ public class RawStorageMatPageReqVO extends PageParam {
|
|||||||
|
|
||||||
private String billNo;
|
private String billNo;
|
||||||
|
|
||||||
|
private String operatorType;
|
||||||
|
|
||||||
|
private String status;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -36,8 +36,9 @@ public interface RawStorageMapper extends BaseMapperX<RawStorageDO> {
|
|||||||
.orderByDesc(RawStorageDO::getId));
|
.orderByDesc(RawStorageDO::getId));
|
||||||
}
|
}
|
||||||
|
|
||||||
default String selectMaxPurReceiptNo() {
|
default String selectMaxPurReceiptNo(String operatorType) {
|
||||||
RawStorageDO rawStorageDO = selectOne(new LambdaQueryWrapperX<RawStorageDO>()
|
RawStorageDO rawStorageDO = selectOne(new LambdaQueryWrapperX<RawStorageDO>()
|
||||||
|
.eq(RawStorageDO::getOperatorType, operatorType)
|
||||||
.orderByDesc(RawStorageDO::getBillNo)
|
.orderByDesc(RawStorageDO::getBillNo)
|
||||||
.last("LIMIT 1"));
|
.last("LIMIT 1"));
|
||||||
return rawStorageDO != null ? rawStorageDO.getBillNo() : null;
|
return rawStorageDO != null ? rawStorageDO.getBillNo() : null;
|
||||||
|
|||||||
@ -26,6 +26,7 @@ public interface RawStorageMatMapper extends BaseMapperX<RawStorageMatDO> {
|
|||||||
MPJLambdaWrapper<RawStorageMatDO> wrapper = new MPJLambdaWrapper<RawStorageMatDO>()
|
MPJLambdaWrapper<RawStorageMatDO> wrapper = new MPJLambdaWrapper<RawStorageMatDO>()
|
||||||
// 选择子表字段
|
// 选择子表字段
|
||||||
.selectAll(RawStorageMatDO.class)
|
.selectAll(RawStorageMatDO.class)
|
||||||
|
.selectAs(RawStorageMatDO::getOperatorQty, RawStorageMatRespVO::getSourceQty)
|
||||||
// 选择主表字段
|
// 选择主表字段
|
||||||
.selectAs(RawStorageDO::getBillNo, RawStorageMatRespVO::getBillNo)
|
.selectAs(RawStorageDO::getBillNo, RawStorageMatRespVO::getBillNo)
|
||||||
.selectAs(RawStorageDO::getOperatorType, RawStorageMatRespVO::getOperatorType)
|
.selectAs(RawStorageDO::getOperatorType, RawStorageMatRespVO::getOperatorType)
|
||||||
@ -44,6 +45,9 @@ public interface RawStorageMatMapper extends BaseMapperX<RawStorageMatDO> {
|
|||||||
.eq(StringUtils.isNotBlank(reqVO.getMatCode()), RawStorageMatDO::getMatCode, reqVO.getMatCode())
|
.eq(StringUtils.isNotBlank(reqVO.getMatCode()), RawStorageMatDO::getMatCode, reqVO.getMatCode())
|
||||||
.eq(StringUtils.isNotBlank(reqVO.getInventBillNo()), RawStorageMatDO::getInventBillNo, reqVO.getInventBillNo())
|
.eq(StringUtils.isNotBlank(reqVO.getInventBillNo()), RawStorageMatDO::getInventBillNo, reqVO.getInventBillNo())
|
||||||
// 查询条件 - 主表
|
// 查询条件 - 主表
|
||||||
|
.apply("operator_qty - return_qty > 0")
|
||||||
|
.eq(StringUtils.isNotBlank(reqVO.getStatus()), RawStorageDO::getStatus, reqVO.getStatus())
|
||||||
|
.eq(StringUtils.isNotBlank(reqVO.getOperatorType()), RawStorageDO::getOperatorType, reqVO.getOperatorType())
|
||||||
.like(StringUtils.isNotBlank(reqVO.getBillNo()), RawStorageDO::getBillNo, reqVO.getBillNo())
|
.like(StringUtils.isNotBlank(reqVO.getBillNo()), RawStorageDO::getBillNo, reqVO.getBillNo())
|
||||||
.orderByDesc(RawStorageMatDO::getId);
|
.orderByDesc(RawStorageMatDO::getId);
|
||||||
|
|
||||||
|
|||||||
@ -62,8 +62,7 @@ public class RawStorageServiceImpl implements RawStorageService {
|
|||||||
public Integer createRawStorage(RawStorageSaveReqVO createReqVO) {
|
public Integer createRawStorage(RawStorageSaveReqVO createReqVO) {
|
||||||
// 插入主表
|
// 插入主表
|
||||||
RawStorageDO rawStorage = BeanUtils.toBean(createReqVO, RawStorageDO.class);
|
RawStorageDO rawStorage = BeanUtils.toBean(createReqVO, RawStorageDO.class);
|
||||||
rawStorage.setBillNo(getBillNo());
|
rawStorage.setBillNo(getBillNo(createReqVO.getOperatorType()));
|
||||||
rawStorage.setOperatorType("1");
|
|
||||||
// 操作人
|
// 操作人
|
||||||
Long userId = getLoginUserId();
|
Long userId = getLoginUserId();
|
||||||
AdminUserDO adminUserDO = adminUserService.getUser(userId);
|
AdminUserDO adminUserDO = adminUserService.getUser(userId);
|
||||||
@ -72,16 +71,9 @@ public class RawStorageServiceImpl implements RawStorageService {
|
|||||||
rawStorageMapper.insert(rawStorage);
|
rawStorageMapper.insert(rawStorage);
|
||||||
|
|
||||||
// 插入子表
|
// 插入子表
|
||||||
if (createReqVO.getItems() != null && !createReqVO.getItems().isEmpty()) {
|
saveMat(rawStorage.getId(), createReqVO);
|
||||||
for (RawStorageMatSaveReqVO matVO : createReqVO.getItems()) {
|
|
||||||
RawStorageMatDO mat = BeanUtils.toBean(matVO, RawStorageMatDO.class);
|
|
||||||
mat.setStockId(rawStorage.getId());
|
|
||||||
mat.setId(null);
|
|
||||||
rawStorageMatMapper.insert(mat);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (createReqVO.getStatus().equals("2")) {
|
if ("2".equals(createReqVO.getStatus())) {
|
||||||
saveStorageLog(rawStorage);
|
saveStorageLog(rawStorage);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -96,14 +88,25 @@ public class RawStorageServiceImpl implements RawStorageService {
|
|||||||
for (RawStorageMatDO rawStorageMatDO : rawStorageMatDOS) {
|
for (RawStorageMatDO rawStorageMatDO : rawStorageMatDOS) {
|
||||||
RawStorageInventoryDO rawStorageInventoryDO = rawStorageInventoryService.selectByMatCodeAndBatchNo(rawStorageMatDO);
|
RawStorageInventoryDO rawStorageInventoryDO = rawStorageInventoryService.selectByMatCodeAndBatchNo(rawStorageMatDO);
|
||||||
if (rawStorageInventoryDO != null) {
|
if (rawStorageInventoryDO != null) {
|
||||||
rawStorageInventoryDO.setYardQty(rawStorageInventoryDO.getYardQty().add(rawStorageMatDO.getOperatorQty()));
|
if ("1".equals(rawStorage.getOperatorType())) {
|
||||||
rawStorageInventoryDO.setUseQty(rawStorageInventoryDO.getUseQty().add(rawStorageMatDO.getOperatorQty()));
|
rawStorageInventoryDO.setYardQty(rawStorageInventoryDO.getYardQty().add(rawStorageMatDO.getOperatorQty()));
|
||||||
|
rawStorageInventoryDO.setUseQty(rawStorageInventoryDO.getUseQty().add(rawStorageMatDO.getOperatorQty()));
|
||||||
|
} else if ("2".equals(rawStorage.getOperatorType())) {
|
||||||
|
rawStorageInventoryDO.setYardQty(rawStorageInventoryDO.getYardQty().subtract(rawStorageMatDO.getOperatorQty()));
|
||||||
|
rawStorageInventoryDO.setUseQty(rawStorageInventoryDO.getUseQty().subtract(rawStorageMatDO.getOperatorQty()));
|
||||||
|
}
|
||||||
rawStorageInventoryService.updateRawStorageInventory(rawStorageInventoryDO);
|
rawStorageInventoryService.updateRawStorageInventory(rawStorageInventoryDO);
|
||||||
} else {
|
} else {
|
||||||
rawStorageInventoryDO = getRawStorageInventoryDO(rawStorageMatDO);
|
rawStorageInventoryDO = getRawStorageInventoryDO(rawStorageMatDO);
|
||||||
}
|
}
|
||||||
rawStorageMatDO.setInventBillNo(rawStorageInventoryDO.getInventBillNo());
|
rawStorageMatDO.setInventBillNo(rawStorageInventoryDO.getInventBillNo());
|
||||||
rawStorageMatMapper.updateById(rawStorageMatDO);
|
rawStorageMatMapper.updateById(rawStorageMatDO);
|
||||||
|
//更新源表
|
||||||
|
if ("2".equals(rawStorage.getOperatorType())) {
|
||||||
|
RawStorageMatDO sourceRawStorageMatDO = rawStorageMatMapper.selectById(rawStorageMatDO.getRelarionId());
|
||||||
|
sourceRawStorageMatDO.setReturnQty(sourceRawStorageMatDO.getReturnQty() != null ? sourceRawStorageMatDO.getReturnQty().add(rawStorageMatDO.getOperatorQty()) : rawStorageMatDO.getOperatorQty());
|
||||||
|
rawStorageMatMapper.updateById(sourceRawStorageMatDO);
|
||||||
|
}
|
||||||
saveStorageLog(rawStorage, rawStorageMatDO, dpstNo, rawStorageInventoryDO);
|
saveStorageLog(rawStorage, rawStorageMatDO, dpstNo, rawStorageInventoryDO);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -142,7 +145,7 @@ public class RawStorageServiceImpl implements RawStorageService {
|
|||||||
RawStorageLogDO rawStorageLogDO = new RawStorageLogDO();
|
RawStorageLogDO rawStorageLogDO = new RawStorageLogDO();
|
||||||
// rawStorageLogDO.setStockId();
|
// rawStorageLogDO.setStockId();
|
||||||
// rawStorageLogDO.setDescription();
|
// rawStorageLogDO.setDescription();
|
||||||
rawStorageLogDO.setStatus("1");
|
rawStorageLogDO.setStatus("2");
|
||||||
rawStorageLogDO.setStoreHouseId(rawStorageMatDO.getStoreHouseId());
|
rawStorageLogDO.setStoreHouseId(rawStorageMatDO.getStoreHouseId());
|
||||||
rawStorageLogDO.setStoreAreaId(rawStorageMatDO.getStoreAreaId());
|
rawStorageLogDO.setStoreAreaId(rawStorageMatDO.getStoreAreaId());
|
||||||
rawStorageLogDO.setStoreHouseCd(rawStorageMatDO.getStoreHouseCd());
|
rawStorageLogDO.setStoreHouseCd(rawStorageMatDO.getStoreHouseCd());
|
||||||
@ -156,8 +159,9 @@ public class RawStorageServiceImpl implements RawStorageService {
|
|||||||
rawStorageLogDO.setUnit(rawStorageMatDO.getUnit());
|
rawStorageLogDO.setUnit(rawStorageMatDO.getUnit());
|
||||||
rawStorageLogDO.setLotNo(rawStorageMatDO.getLotNo());
|
rawStorageLogDO.setLotNo(rawStorageMatDO.getLotNo());
|
||||||
rawStorageLogDO.setOperatorQty(rawStorageMatDO.getOperatorQty());
|
rawStorageLogDO.setOperatorQty(rawStorageMatDO.getOperatorQty());
|
||||||
rawStorageLogDO.setOperatorType("1");
|
rawStorageLogDO.setOperatorType(rawStorage.getOperatorType());
|
||||||
rawStorageLogDO.setBusinessType(rawStorage.getBusinessType());
|
rawStorageLogDO.setBusinessType(rawStorage.getBusinessType());
|
||||||
|
|
||||||
// rawStorageLogDO.setStorageAft();
|
// rawStorageLogDO.setStorageAft();
|
||||||
// rawStorageLogDO.setStorageBef();
|
// rawStorageLogDO.setStorageBef();
|
||||||
// rawStorageLogDO.setStockItemId(rawStorageMatDO.getId());
|
// rawStorageLogDO.setStockItemId(rawStorageMatDO.getId());
|
||||||
@ -193,22 +197,25 @@ public class RawStorageServiceImpl implements RawStorageService {
|
|||||||
if (updateReqVO.getItems() != null) {
|
if (updateReqVO.getItems() != null) {
|
||||||
// 删除旧子表数据
|
// 删除旧子表数据
|
||||||
rawStorageMatMapper.deleteByStockId(updateReqVO.getId());
|
rawStorageMatMapper.deleteByStockId(updateReqVO.getId());
|
||||||
|
saveMat(updateObj.getId(), updateReqVO);
|
||||||
// 插入新子表数据
|
|
||||||
if (!updateReqVO.getItems().isEmpty()) {
|
|
||||||
for (RawStorageMatSaveReqVO matVO : updateReqVO.getItems()) {
|
|
||||||
RawStorageMatDO mat = BeanUtils.toBean(matVO, RawStorageMatDO.class);
|
|
||||||
mat.setStockId(updateReqVO.getId());
|
|
||||||
mat.setId(null);
|
|
||||||
rawStorageMatMapper.insert(mat);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
if ("2".equals(updateReqVO.getStatus())) {
|
if ("2".equals(updateReqVO.getStatus())) {
|
||||||
saveStorageLog(updateObj);
|
saveStorageLog(updateObj);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void saveMat(Integer id, RawStorageSaveReqVO updateReqVO) {
|
||||||
|
// 插入新子表数据
|
||||||
|
if (!updateReqVO.getItems().isEmpty()) {
|
||||||
|
for (RawStorageMatSaveReqVO matVO : updateReqVO.getItems()) {
|
||||||
|
RawStorageMatDO mat = BeanUtils.toBean(matVO, RawStorageMatDO.class);
|
||||||
|
mat.setStockId(id);
|
||||||
|
mat.setId(null);
|
||||||
|
rawStorageMatMapper.insert(mat);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void deleteRawStorage(Integer id) {
|
public void deleteRawStorage(Integer id) {
|
||||||
// 校验存在
|
// 校验存在
|
||||||
@ -385,7 +392,7 @@ public class RawStorageServiceImpl implements RawStorageService {
|
|||||||
|
|
||||||
private String saveRawStorage(PurReceiptDO purReceipt, String supplierNo) {
|
private String saveRawStorage(PurReceiptDO purReceipt, String supplierNo) {
|
||||||
RawStorageSaveReqVO saveReqVO = new RawStorageSaveReqVO();
|
RawStorageSaveReqVO saveReqVO = new RawStorageSaveReqVO();
|
||||||
saveReqVO.setBillNo(getBillNo());
|
saveReqVO.setBillNo(getBillNo("1"));
|
||||||
saveReqVO.setOperatorType("1");
|
saveReqVO.setOperatorType("1");
|
||||||
saveReqVO.setBusinessType("1");
|
saveReqVO.setBusinessType("1");
|
||||||
saveReqVO.setRemark("");
|
saveReqVO.setRemark("");
|
||||||
@ -407,8 +414,12 @@ public class RawStorageServiceImpl implements RawStorageService {
|
|||||||
|
|
||||||
// 生成订单号
|
// 生成订单号
|
||||||
// 生成入库单号
|
// 生成入库单号
|
||||||
private String getBillNo() {
|
private String getBillNo(String operatorType) {
|
||||||
String maxPurReceiptNo = rawStorageMapper.selectMaxPurReceiptNo();
|
String prefix = "RK";
|
||||||
return CodeGenerateUtils.generateBillNo("RK", maxPurReceiptNo);
|
if ("2".equals(operatorType)) {
|
||||||
|
prefix = "CKD";
|
||||||
|
}
|
||||||
|
String maxPurReceiptNo = rawStorageMapper.selectMaxPurReceiptNo(operatorType);
|
||||||
|
return CodeGenerateUtils.generateBillNo(prefix, maxPurReceiptNo);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -189,6 +189,7 @@ const queryParams = reactive({
|
|||||||
billNo: undefined,
|
billNo: undefined,
|
||||||
billDate: getCurrentSimMonthRange(),
|
billDate: getCurrentSimMonthRange(),
|
||||||
status: undefined,
|
status: undefined,
|
||||||
|
operatorType: "1",
|
||||||
})
|
})
|
||||||
const queryFormRef = ref() // 搜索的表单
|
const queryFormRef = ref() // 搜索的表单
|
||||||
const exportLoading = ref(false) // 导出的加载中
|
const exportLoading = ref(false) // 导出的加载中
|
||||||
|
|||||||
@ -1,5 +1,5 @@
|
|||||||
<template>
|
<template>
|
||||||
<Dialog :title="dialogTitle" v-model="dialogVisible" width="70%">
|
<Dialog :title="dialogTitle" v-model="dialogVisible" width="90%">
|
||||||
<el-form
|
<el-form
|
||||||
ref="formRef"
|
ref="formRef"
|
||||||
:model="formData"
|
:model="formData"
|
||||||
@ -17,7 +17,7 @@
|
|||||||
<el-select
|
<el-select
|
||||||
v-model="formData.businessType"
|
v-model="formData.businessType"
|
||||||
placeholder="请选择"
|
placeholder="请选择"
|
||||||
:disabled="formType === 'detail'"
|
:disabled="formType !== 'create'"
|
||||||
class="!w-full"
|
class="!w-full"
|
||||||
>
|
>
|
||||||
<el-option label="标准采购退料" value="3" />
|
<el-option label="标准采购退料" value="3" />
|
||||||
@ -58,7 +58,7 @@
|
|||||||
</el-select>
|
</el-select>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
</el-col>
|
||||||
<el-col :span="16">
|
<el-col :span="8">
|
||||||
<el-form-item label="其它入库单" prop="relarionNo">
|
<el-form-item label="其它入库单" prop="relarionNo">
|
||||||
<el-input
|
<el-input
|
||||||
v-model="formData.relarionNo"
|
v-model="formData.relarionNo"
|
||||||
@ -73,7 +73,7 @@
|
|||||||
</el-row>
|
</el-row>
|
||||||
|
|
||||||
<el-row :gutter="20">
|
<el-row :gutter="20">
|
||||||
<el-col :span="24">
|
<el-col :span="16">
|
||||||
<el-form-item label="备注" prop="remark">
|
<el-form-item label="备注" prop="remark">
|
||||||
<el-input
|
<el-input
|
||||||
v-model="formData.remark"
|
v-model="formData.remark"
|
||||||
@ -122,13 +122,13 @@
|
|||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column label="已退料数量" min-width="100px" align="center">
|
<el-table-column label="已退料数量" min-width="100px" align="center">
|
||||||
<template #default="scope">
|
<template #default="scope">
|
||||||
<span>{{ scope.row.returnedQty || '0' }}</span>
|
<span>{{ scope.row.returnQty || '0' }}</span>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column label="*退料数量" min-width="120px" align="center" >
|
<el-table-column label="*退料数量" min-width="120px" align="center" >
|
||||||
<template #default="scope" >
|
<template #default="scope" >
|
||||||
<MoneyInput
|
<MoneyInput
|
||||||
v-model="scope.row.returnQty"
|
v-model="scope.row.operatorQty"
|
||||||
:decimal-places="2"
|
:decimal-places="2"
|
||||||
:allow-negative="false"
|
:allow-negative="false"
|
||||||
:show-prefix="false"
|
:show-prefix="false"
|
||||||
@ -184,7 +184,6 @@
|
|||||||
</el-form>
|
</el-form>
|
||||||
|
|
||||||
<template #footer>
|
<template #footer>
|
||||||
<el-button @click="dialogVisible = false">取消</el-button>
|
|
||||||
<el-button
|
<el-button
|
||||||
v-if="formType !== 'detail'"
|
v-if="formType !== 'detail'"
|
||||||
type="primary"
|
type="primary"
|
||||||
@ -201,6 +200,8 @@
|
|||||||
>
|
>
|
||||||
确认
|
确认
|
||||||
</el-button>
|
</el-button>
|
||||||
|
<el-button @click="dialogVisible = false">取消</el-button>
|
||||||
|
|
||||||
</template>
|
</template>
|
||||||
</Dialog>
|
</Dialog>
|
||||||
|
|
||||||
@ -238,6 +239,7 @@ const formData = reactive({
|
|||||||
relarionNo: undefined,
|
relarionNo: undefined,
|
||||||
relarionId: undefined,
|
relarionId: undefined,
|
||||||
remark: undefined,
|
remark: undefined,
|
||||||
|
operatorType: "2",
|
||||||
})
|
})
|
||||||
|
|
||||||
// 表单验证规则
|
// 表单验证规则
|
||||||
@ -249,9 +251,6 @@ const formRules = reactive({
|
|||||||
// 明细列表
|
// 明细列表
|
||||||
const detailList = ref<any[]>([])
|
const detailList = ref<any[]>([])
|
||||||
|
|
||||||
// 仓储选项
|
|
||||||
const warehouseOptions = ref([])
|
|
||||||
|
|
||||||
// 子组件 Ref
|
// 子组件 Ref
|
||||||
const storageSelectRef = ref()
|
const storageSelectRef = ref()
|
||||||
|
|
||||||
@ -269,8 +268,6 @@ const open = async (type: string, id?: number) => {
|
|||||||
formType.value = type
|
formType.value = type
|
||||||
resetForm()
|
resetForm()
|
||||||
|
|
||||||
await loadWarehouseList()
|
|
||||||
|
|
||||||
if (id) {
|
if (id) {
|
||||||
formLoading.value = true
|
formLoading.value = true
|
||||||
try {
|
try {
|
||||||
@ -284,16 +281,6 @@ const open = async (type: string, id?: number) => {
|
|||||||
}
|
}
|
||||||
defineExpose({ open })
|
defineExpose({ open })
|
||||||
|
|
||||||
/** 加载仓储列表 */
|
|
||||||
const loadWarehouseList = async () => {
|
|
||||||
try {
|
|
||||||
const data = await RawStorageApi.getWarehouseSelect()
|
|
||||||
warehouseOptions.value = data.list || []
|
|
||||||
} catch (error) {
|
|
||||||
console.error('加载仓储列表失败:', error)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/** 打开入库单选择弹窗 */
|
/** 打开入库单选择弹窗 */
|
||||||
const openStorageSelect = () => {
|
const openStorageSelect = () => {
|
||||||
storageSelectRef.value.open()
|
storageSelectRef.value.open()
|
||||||
@ -325,13 +312,13 @@ const handleStorageConfirm = (storages: any[]) => {
|
|||||||
spec: storage.spec,
|
spec: storage.spec,
|
||||||
unit: storage.unit,
|
unit: storage.unit,
|
||||||
lotNo: storage.lotNo,
|
lotNo: storage.lotNo,
|
||||||
returnQty: undefined,
|
returnQty: storage.returnQty || 0,
|
||||||
sourceQty: storage.operatorQty || 0,
|
operatorQty: (storage.sourceQty || 0) - (storage.returnQty || 0),
|
||||||
returnedQty: storage.returnedQty || 0,
|
sourceQty: storage.sourceQty || 0,
|
||||||
inDate: storage.billDate,
|
inDate: storage.billDate,
|
||||||
inventBillNo: storage.inventBillNo,
|
inventBillNo: storage.inventBillNo,
|
||||||
sourceId: storage.stockId,
|
sourceId: storage.stockId,
|
||||||
relarionId: storage.stockId,
|
relarionId: storage.id,
|
||||||
areaOptions: [],
|
areaOptions: [],
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
@ -342,45 +329,6 @@ const handleDeleteDetail = (index: number) => {
|
|||||||
detailList.value.splice(index, 1)
|
detailList.value.splice(index, 1)
|
||||||
}
|
}
|
||||||
|
|
||||||
/** 处理仓储变化,重新加载库区 */
|
|
||||||
const handleWarehouseChange = async (row: any) => {
|
|
||||||
row.storeAreaId = undefined
|
|
||||||
row.storeAreaName = undefined
|
|
||||||
row.storeAreCd = undefined
|
|
||||||
|
|
||||||
if (row.storeHouseId) {
|
|
||||||
const warehouse = warehouseOptions.value.find((w: any) => w.id === row.storeHouseId)
|
|
||||||
if (warehouse) {
|
|
||||||
row.storeHouseCd = warehouse.storeHouseCd
|
|
||||||
row.storeHouseName = warehouse.storeHouseName
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
|
||||||
const list = await AreaApi.getStoreArea(row.storeHouseId)
|
|
||||||
row.areaOptions = (list || []).map((area: any) => ({
|
|
||||||
...area,
|
|
||||||
id: Number(area.id)
|
|
||||||
}))
|
|
||||||
} catch (error) {
|
|
||||||
console.error('加载库区列表失败:', error)
|
|
||||||
row.areaOptions = []
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
row.areaOptions = []
|
|
||||||
row.storeHouseCd = undefined
|
|
||||||
row.storeHouseName = undefined
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/** 处理库区变化 */
|
|
||||||
const handleAreaChange = (row: any) => {
|
|
||||||
const area = row.areaOptions?.find((a: any) => a.id === row.storeAreaId)
|
|
||||||
if (area) {
|
|
||||||
row.storeAreCd = area.storeAreCd
|
|
||||||
row.storeAreaName = area.storeAreaName
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/** 提交表单 */
|
/** 提交表单 */
|
||||||
const emit = defineEmits(['success', 'close'])
|
const emit = defineEmits(['success', 'close'])
|
||||||
|
|
||||||
@ -396,46 +344,40 @@ const handleSubmit = async (action: string) => {
|
|||||||
|
|
||||||
// 校验退料数量
|
// 校验退料数量
|
||||||
for (const item of detailList.value) {
|
for (const item of detailList.value) {
|
||||||
if (!item.returnQty || item.returnQty <= 0) {
|
// 退料数量不能为0
|
||||||
message.error('请完善退料数量')
|
if (!item.operatorQty || item.operatorQty <= 0) {
|
||||||
|
message.error(`该物料(${item.matCode})退料数量不能为0,请确认!`)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
// 退料数量 + 已退料数量 <= 入库数量
|
// 退料数量 + 已退料数量 <= 入库数量
|
||||||
const totalReturn = (item.returnQty || 0) + (item.returnedQty || 0)
|
const totalReturn = (item.operatorQty || 0) + (item.returnQty || 0)
|
||||||
if (totalReturn > (item.sourceQty || 0)) {
|
if (totalReturn > (item.sourceQty || 0)) {
|
||||||
message.error(`退料数量 + 已退料数量不能大于入库数量(${item.matName})`)
|
message.error(`物料(${item.matCode})退料数量>入库数量,请确认!`)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
formLoading.value = true
|
formLoading.value = true
|
||||||
try {
|
try {
|
||||||
|
// 根据操作设置 status
|
||||||
|
const status = action === 'save' ? '1' : '2'
|
||||||
|
|
||||||
const submitData = {
|
const submitData = {
|
||||||
...formData,
|
...formData,
|
||||||
|
status,
|
||||||
items: detailList.value.map(item => ({
|
items: detailList.value.map(item => ({
|
||||||
...item,
|
...item,
|
||||||
areaOptions: undefined // 不提交临时字段
|
areaOptions: undefined // 不提交临时字段
|
||||||
}))
|
}))
|
||||||
}
|
}
|
||||||
|
|
||||||
if (action === 'save') {
|
if (formType.value === 'create') {
|
||||||
if (formType.value === 'create') {
|
await RawStorageApi.createRawStorage(submitData)
|
||||||
await RawStorageApi.createRawStorage(submitData)
|
message.success(t('common.createSuccess'))
|
||||||
message.success(t('common.createSuccess'))
|
|
||||||
} else {
|
|
||||||
await RawStorageApi.updateRawStorage(submitData)
|
|
||||||
message.success(t('common.updateSuccess'))
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
// 确认操作
|
await RawStorageApi.updateRawStorage(submitData)
|
||||||
if (formType.value === 'create') {
|
message.success(t('common.updateSuccess'))
|
||||||
await RawStorageApi.confirmRawStorage(submitData)
|
|
||||||
message.success('确认成功')
|
|
||||||
} else {
|
|
||||||
await RawStorageApi.confirmRawStorage(submitData)
|
|
||||||
message.success('确认成功')
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
dialogVisible.value = false
|
dialogVisible.value = false
|
||||||
@ -458,6 +400,7 @@ const resetForm = () => {
|
|||||||
relarionNo: undefined,
|
relarionNo: undefined,
|
||||||
relarionId: undefined,
|
relarionId: undefined,
|
||||||
remark: undefined,
|
remark: undefined,
|
||||||
|
operatorType: "2",
|
||||||
})
|
})
|
||||||
detailList.value = []
|
detailList.value = []
|
||||||
formRef.value?.resetFields()
|
formRef.value?.resetFields()
|
||||||
|
|||||||
@ -1,5 +1,5 @@
|
|||||||
<template>
|
<template>
|
||||||
<Dialog :title="'选择入库单'" v-model="dialogVisible" width="90%">
|
<Dialog :title="'选择入库单'" v-model="dialogVisible" width="80%">
|
||||||
<el-form :model="queryParams" inline label-width="80px">
|
<el-form :model="queryParams" inline label-width="80px">
|
||||||
<el-form-item label="入库单号">
|
<el-form-item label="入库单号">
|
||||||
<el-input
|
<el-input
|
||||||
@ -27,6 +27,7 @@
|
|||||||
|
|
||||||
<div style="max-height: 500px; overflow-y: auto; margin-top: 15px;">
|
<div style="max-height: 500px; overflow-y: auto; margin-top: 15px;">
|
||||||
<el-table
|
<el-table
|
||||||
|
ref="tableRef"
|
||||||
v-loading="loading"
|
v-loading="loading"
|
||||||
:data="list"
|
:data="list"
|
||||||
:stripe="true"
|
:stripe="true"
|
||||||
@ -34,6 +35,7 @@
|
|||||||
border
|
border
|
||||||
:highlight-current-row="true"
|
:highlight-current-row="true"
|
||||||
@selection-change="handleSelectionChange"
|
@selection-change="handleSelectionChange"
|
||||||
|
@row-click="handleRowClick"
|
||||||
@row-dblclick="handleRowDoubleClick"
|
@row-dblclick="handleRowDoubleClick"
|
||||||
style="width: 100%;"
|
style="width: 100%;"
|
||||||
>
|
>
|
||||||
@ -51,7 +53,7 @@
|
|||||||
<el-table-column label="入库日期" align="center" prop="billDate" width="110px" />
|
<el-table-column label="入库日期" align="center" prop="billDate" width="110px" />
|
||||||
<el-table-column label="物料编码" align="center" prop="matCode" />
|
<el-table-column label="物料编码" align="center" prop="matCode" />
|
||||||
<el-table-column label="物料名称" align="center" prop="matName" />
|
<el-table-column label="物料名称" align="center" prop="matName" />
|
||||||
<el-table-column label="入库数量" align="center" prop="operatorQty" />
|
<el-table-column label="入库数量" align="center" prop="sourceQty" />
|
||||||
<el-table-column label="已退货数量" align="center" prop="returnQty" />
|
<el-table-column label="已退货数量" align="center" prop="returnQty" />
|
||||||
<el-table-column label="规格型号" align="center" prop="spec" />
|
<el-table-column label="规格型号" align="center" prop="spec" />
|
||||||
<el-table-column label="批次号" align="center" prop="lotNo" />
|
<el-table-column label="批次号" align="center" prop="lotNo" />
|
||||||
@ -71,8 +73,8 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<template #footer>
|
<template #footer>
|
||||||
<el-button @click="dialogVisible = false">取消</el-button>
|
|
||||||
<el-button type="primary" @click="handleConfirm" :disabled="selectedItems.length === 0">保存</el-button>
|
<el-button type="primary" @click="handleConfirm" :disabled="selectedItems.length === 0">保存</el-button>
|
||||||
|
<el-button @click="dialogVisible = false">取消</el-button>
|
||||||
</template>
|
</template>
|
||||||
</Dialog>
|
</Dialog>
|
||||||
</template>
|
</template>
|
||||||
@ -88,10 +90,13 @@ const loading = ref(false)
|
|||||||
const list = ref([])
|
const list = ref([])
|
||||||
const total = ref(0)
|
const total = ref(0)
|
||||||
const selectedItems = ref([])
|
const selectedItems = ref([])
|
||||||
|
const tableRef = ref() // 表格引用
|
||||||
|
|
||||||
const queryParams = reactive({
|
const queryParams = reactive({
|
||||||
pageNo: 1,
|
pageNo: 1,
|
||||||
pageSize: 10,
|
pageSize: 10,
|
||||||
|
status: '2',
|
||||||
|
operatorType: '1',
|
||||||
billNo: undefined,
|
billNo: undefined,
|
||||||
matName: undefined,
|
matName: undefined,
|
||||||
})
|
})
|
||||||
@ -131,6 +136,11 @@ const handleSelectionChange = (val: any[]) => {
|
|||||||
selectedItems.value = val
|
selectedItems.value = val
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const handleRowClick = (row: any) => {
|
||||||
|
// 单击切换选中状态(支持多选)
|
||||||
|
tableRef.value?.toggleRowSelection(row)
|
||||||
|
}
|
||||||
|
|
||||||
const handleRowDoubleClick = (row: any) => {
|
const handleRowDoubleClick = (row: any) => {
|
||||||
selectedItems.value = [row]
|
selectedItems.value = [row]
|
||||||
emit('confirm', [row])
|
emit('confirm', [row])
|
||||||
|
|||||||
@ -72,24 +72,24 @@
|
|||||||
max-height="100%"
|
max-height="100%"
|
||||||
>
|
>
|
||||||
<el-table-column label="序号" align="center" type="index" width="60px"/>
|
<el-table-column label="序号" align="center" type="index" width="60px"/>
|
||||||
<el-table-column label="单据类型" align="center" prop="businessType" >
|
<el-table-column label="业务类型" align="center" prop="businessType" >
|
||||||
<template #default="scope">
|
<template #default="scope">
|
||||||
<span v-if="scope.row.businessType === '23'">标准采购退料</span>
|
<span v-if="scope.row.businessType === '3'">标准采购退料</span>
|
||||||
<span v-else>-</span>
|
<span v-if="scope.row.businessType === '4'">设备采购退料</span>
|
||||||
|
<span v-else></span>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column label="退料单号" align="center" prop="billNo" />
|
<el-table-column label="退料单号" align="center" prop="billNo" />
|
||||||
<el-table-column label="供应商" align="center" prop="supplierName" />
|
|
||||||
<el-table-column label="单据状态" align="center" prop="status" >
|
<el-table-column label="单据状态" align="center" prop="status" >
|
||||||
<template #default="scope">
|
<template #default="scope">
|
||||||
<span v-if="scope.row.status === '1'" class="text-blue">已创建</span>
|
<span v-if="scope.row.status === '1'" class="text-blue">已创建</span>
|
||||||
<span v-else-if="scope.row.status === '2'" class="text-green">已提交</span>
|
<span v-else-if="scope.row.status === '2'" class="text-green">已提交</span>
|
||||||
<span v-else>-</span>
|
<span v-else></span>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column label="退料日期" align="center" prop="billDate" />
|
<el-table-column label="退料日期" align="center" prop="billDate" />
|
||||||
<el-table-column label="退料人员" align="center" prop="operatorName" />
|
<el-table-column label="退料人员" align="center" prop="operatorName" />
|
||||||
<el-table-column label="采购入库单号" align="center" prop="relarionNo" />
|
<el-table-column label="其他入库单号" align="center" prop="relarionNo" />
|
||||||
<el-table-column label="操作" align="center" >
|
<el-table-column label="操作" align="center" >
|
||||||
<template #default="scope">
|
<template #default="scope">
|
||||||
<el-button
|
<el-button
|
||||||
@ -150,8 +150,8 @@
|
|||||||
<el-table-column label="物料编码" align="center" prop="matCode" />
|
<el-table-column label="物料编码" align="center" prop="matCode" />
|
||||||
<el-table-column label="物料名称" align="center" prop="matName" />
|
<el-table-column label="物料名称" align="center" prop="matName" />
|
||||||
<el-table-column label="规格型号" align="center" prop="spec" />
|
<el-table-column label="规格型号" align="center" prop="spec" />
|
||||||
<el-table-column label="收货数量" align="center" prop="sourceQty" />
|
<el-table-column label="来源数量" align="center" prop="operatorQty" />
|
||||||
<el-table-column label="已退料数量" align="center" prop="returnedQty" />
|
<el-table-column label="已退料数量" align="center" prop="returnQty" />
|
||||||
<el-table-column label="退料数量" align="center" prop="returnQty" />
|
<el-table-column label="退料数量" align="center" prop="returnQty" />
|
||||||
<el-table-column label="批次号" align="center" prop="lotNo" />
|
<el-table-column label="批次号" align="center" prop="lotNo" />
|
||||||
<el-table-column label="仓储名称" align="center" prop="storeHouseName" />
|
<el-table-column label="仓储名称" align="center" prop="storeHouseName" />
|
||||||
@ -170,6 +170,7 @@ import { ref, reactive, onMounted } from 'vue'
|
|||||||
import * as RawStorageApi from '@/api/biz/rawstorage'
|
import * as RawStorageApi from '@/api/biz/rawstorage'
|
||||||
import ReturnStorageForm from './ReturnStorageForm.vue'
|
import ReturnStorageForm from './ReturnStorageForm.vue'
|
||||||
import { getUnitName } from '@/utils/dict'
|
import { getUnitName } from '@/utils/dict'
|
||||||
|
import { getCurrentSimMonthRange } from '@/utils/formatTime'
|
||||||
|
|
||||||
defineOptions({ name: 'RawStorage' })
|
defineOptions({ name: 'RawStorage' })
|
||||||
|
|
||||||
@ -186,8 +187,9 @@ const queryParams = reactive({
|
|||||||
pageNo: 1,
|
pageNo: 1,
|
||||||
pageSize: 10,
|
pageSize: 10,
|
||||||
billNo: undefined,
|
billNo: undefined,
|
||||||
billDate: [],
|
billDate: getCurrentSimMonthRange(),
|
||||||
status: undefined,
|
status: undefined,
|
||||||
|
operatorType: "2",
|
||||||
})
|
})
|
||||||
const queryFormRef = ref() // 搜索的表单
|
const queryFormRef = ref() // 搜索的表单
|
||||||
|
|
||||||
@ -198,8 +200,11 @@ const getList = async () => {
|
|||||||
const data = await RawStorageApi.getRawStoragePage(queryParams)
|
const data = await RawStorageApi.getRawStoragePage(queryParams)
|
||||||
list.value = data.list
|
list.value = data.list
|
||||||
total.value = data.total
|
total.value = data.total
|
||||||
// 默认选中第一行并加载详情
|
// 如果没有数据,清空明细列表
|
||||||
if (list.value.length > 0) {
|
if (list.value.length === 0) {
|
||||||
|
detailList.value = []
|
||||||
|
} else {
|
||||||
|
// 默认选中第一行并加载详情
|
||||||
handleRowClick(list.value[0])
|
handleRowClick(list.value[0])
|
||||||
}
|
}
|
||||||
} finally {
|
} finally {
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user