refactor(biz): 重构采购退料和销售发货功能

This commit is contained in:
zxy 2026-05-26 17:16:36 +08:00
parent 2fd6b57e09
commit 203cc6e1bc
11 changed files with 54 additions and 85 deletions

View File

@ -230,6 +230,7 @@ public class GlobalExceptionHandler {
// 处理表数据相关异常
if (ex instanceof DuplicateKeyException){
log.error("[defaultExceptionHandler][url({}) 数据重复]", req.getRequestURL(), ex);
return CommonResult.error(REPEAT_DATA);
}

View File

@ -104,6 +104,10 @@ public class PurReceiptDetailRespVO {
@ExcelProperty("已退料数量")
private BigDecimal returnQty;
@Schema(description = "已退料数量")
@ExcelProperty("已退料数量")
private BigDecimal returnedQty;
@Schema(description = "发货数量")
@ExcelProperty("发货数量")
private BigDecimal deliveryQty;

View File

@ -83,7 +83,7 @@ public class RawStorageDO extends BaseDO {
/**
* 单据类型(1 标准采购申请 2设备采购申请 3 标准采购退料 4设备采购退料)
*/
private String billType;
// private String billType;
/**
* 来源单号
*/

View File

@ -31,7 +31,7 @@ public interface RawStorageMapper extends BaseMapperX<RawStorageDO> {
.likeIfPresent(RawStorageDO::getOperatorName, reqVO.getOperatorName())
.eqIfPresent(RawStorageDO::getRelarionNo, reqVO.getRelarionNo())
.eqIfPresent(RawStorageDO::getRelarionId, reqVO.getRelarionId())
.eqIfPresent(RawStorageDO::getBillType, reqVO.getBillType())
// .eqIfPresent(RawStorageDO::getBillType, reqVO.getBillType())
.eqIfPresent(RawStorageDO::getSourceNo, reqVO.getSourceNo())
.eqIfPresent(RawStorageDO::getSourceId, reqVO.getSourceId())
.orderByDesc(RawStorageDO::getId));

View File

@ -26,17 +26,7 @@ public interface RawStorageInventoryMapper extends BaseMapperX<RawStorageInvento
.eqIfPresent(RawStorageInventoryDO::getMaterialId, reqVO.getMaterialId())
.likeIfPresent(RawStorageInventoryDO::getMatName, reqVO.getMatName())
.eqIfPresent(RawStorageInventoryDO::getMatCode, reqVO.getMatCode())
.eqIfPresent(RawStorageInventoryDO::getSpec, reqVO.getSpec())
.eqIfPresent(RawStorageInventoryDO::getUnit, reqVO.getUnit())
.eqIfPresent(RawStorageInventoryDO::getLotNo, reqVO.getLotNo())
.betweenIfPresent(RawStorageInventoryDO::getCreateTime, reqVO.getCreateTime())
.eqIfPresent(RawStorageInventoryDO::getDescription, reqVO.getDescription())
.eqIfPresent(RawStorageInventoryDO::getYardQty, reqVO.getYardQty())
.eqIfPresent(RawStorageInventoryDO::getUseQty, reqVO.getUseQty())
.eqIfPresent(RawStorageInventoryDO::getPreQty, reqVO.getPreQty())
.eqIfPresent(RawStorageInventoryDO::getPrice, reqVO.getPrice())
.eqIfPresent(RawStorageInventoryDO::getPackQty, reqVO.getPackQty())
.eqIfPresent(RawStorageInventoryDO::getBagSpec, reqVO.getBagSpec())
// .betweenIfPresent(RawStorageInventoryDO::getEarStoreDate, reqVO.getEarStoreDate())
.eqIfPresent(RawStorageInventoryDO::getInventBillNo, reqVO.getInventBillNo())
.orderByDesc(RawStorageInventoryDO::getId));

View File

@ -19,7 +19,6 @@ import com.ningxia.yunxi.chemmes.module.biz.dal.mysql.purreceiptdetail.PurReceip
import com.ningxia.yunxi.chemmes.module.biz.dal.mysql.purreturn.PurReturnMapper;
import com.ningxia.yunxi.chemmes.module.biz.dal.mysql.purreturndetail.PurReturnDetailMapper;
import com.ningxia.yunxi.chemmes.module.biz.dal.mysql.rawstorageinventory.RawStorageInventoryMapper;
import com.ningxia.yunxi.chemmes.module.biz.service.rawstorageinventory.RawStorageInventoryService;
import com.ningxia.yunxi.chemmes.module.biz.service.rawstoragelog.RawStorageLogService;
import com.ningxia.yunxi.chemmes.module.biz.service.supplier.SupplierService;
import com.ningxia.yunxi.chemmes.module.system.dal.dataobject.user.AdminUserDO;
@ -53,8 +52,6 @@ public class PurReturnServiceImpl implements PurReturnService {
private final PurReceiptDetailMapper purreceiptDetailMapper;
private final RawStorageInventoryService rawStorageInventoryService;
private final RawStorageInventoryMapper rawStorageInventoryMapper;
private final SupplierService supplierService;
@ -123,6 +120,7 @@ public class PurReturnServiceImpl implements PurReturnService {
PurReceiptDetailDO purReceiptDetailDO = purreceiptDetailMapper.selectById(purReturnDetailDO.getPurReceiptDetailId());
RawStorageInventoryDO rawStorageInventory = rawStorageInventoryMapper.selectOne(new LambdaQueryWrapper<RawStorageInventoryDO>().eq(RawStorageInventoryDO::getInventBillNo, purReturnDetailDO.getInventBillNo()));
rawStorageInventory.setYardQty(rawStorageInventory.getYardQty().subtract(purReturnDetailDO.getReturnQty()));
purReturnDetailDO.setReturnedQty(purReceiptDetailDO.getReturnQty());
purReceiptDetailDO.setReturnQty(purReceiptDetailDO.getReturnQty().add(purReturnDetailDO.getReturnQty()));
purreceiptDetailMapper.updateById(purReceiptDetailDO);
//twm_raw_storage_log 插入
@ -161,6 +159,7 @@ public class PurReturnServiceImpl implements PurReturnService {
rawStorageLog.setInventBillNo(purReturnDetailDO.getInventBillNo());
rawStorageLogService.saveRawStorageLog(rawStorageLog);
rawStorageInventoryMapper.updateById(rawStorageInventory);
purReturnDetailMapper.updateById(purReturnDetailDO);
}
}

View File

@ -118,7 +118,7 @@ public class RawStorageServiceImpl implements RawStorageService {
private void updateOrderItem(PurReceiptDetailDO detail) {
//更新库存 tsc_pur_order_item
PurOrderItemDO purOrderItemDO = purOrderItemMapper.selectById(detail.getPurOrdDetailId());
purOrderItemDO.setDeliveryQty(purOrderItemDO.getDeliveryQty().add(detail.getReceiptQty()));
purOrderItemDO.setDeliveryQty(purOrderItemDO.getDeliveryQty() != null ? purOrderItemDO.getDeliveryQty().add(detail.getReceiptQty()) : detail.getReceiptQty());
// 判断出库状态
if (purOrderItemDO.getDeliveryQty().compareTo(purOrderItemDO.getPurQty()) >= 0) {
purOrderItemDO.setDeliveryStatus("3");
@ -215,7 +215,7 @@ public class RawStorageServiceImpl implements RawStorageService {
rawStorageInventoryDO.setLotNo(detail.getLotNo());
rawStorageInventoryDO.setDescription("");
rawStorageInventoryDO.setYardQty(detail.getRemaimQty());
rawStorageInventoryDO.setUseQty(detail.getReceiptQty());
// rawStorageInventoryDO.setUseQty(detail.getReceiptQty());
// rawStorageInventoryDO.setPreQty();
// rawStorageInventoryDO.setPrice(detail.getTotalPrice());
// rawStorageInventoryDO.setPackQty(detail.getPackQty());

View File

@ -211,13 +211,13 @@
<template #footer>
<el-button
v-if="formType !== 'detail'"
@click="handleSave"
@click="handleSave(false)"
type="primary"
:disabled="formLoading"
>保存</el-button>
<el-button
v-if="formData.purStatus === '1' && formType !== 'detail'"
@click="handleConfirm"
@click="handleSave(true)"
type="primary"
:disabled="formLoading"
>确认</el-button>
@ -515,7 +515,7 @@ const removeDetailItem = (index: number) => {
}
/** 保存 */
const handleSave = async () => {
const handleSave = async (isAudit: boolean) => {
try {
await formRef.value.validate()
@ -555,6 +555,8 @@ const handleSave = async () => {
//
// item.id ID purOrdDetailId
// items purOrdDetailId
formData.purStatus = isAudit ? '2' : '1'
const data = {
...formData,
items: detailList.value.map(item => ({

View File

@ -134,6 +134,7 @@ const handleQuery = () => {
/** 重置 */
const resetQuery = () => {
queryParams.purReceiptNo = undefined
queryParams.materialName = undefined
handleQuery()
}
@ -178,7 +179,8 @@ const handleSave = () => {
materialCode: row.materialCode,
materialName: row.materialName,
receiptQty: row.receiptQty,
returnedQty: row.returnedQty || 0,
returnQty: row.returnQty || 0,
ordQty: row.ordQty,
spec: row.spec,
storeHouseName: row.storeHouseName,
storeHouseId: row.storeHouseId,
@ -204,6 +206,7 @@ const open = (supplierName?: string) => {
//
queryParams.supplierName = supplierName
queryParams.purReceiptNo = undefined
queryParams.materialName = undefined
queryParams.pageNo = 1
handleQuery()
}

View File

@ -292,9 +292,10 @@ const handlePurReceiptSelect = async (selectedData: any[]) => {
//
detailList.value = selectedData.map(item => ({
...item,
receiptQty: item.receiptQty || item.purQty,
returnedQty: item.returnedQty || 0,
returnQty: (Number(item.receiptQty || item.purQty) || 0) - (Number(item.returnedQty) || 0) // 退 = - 退
receiptQty: item.receiptQty || 0,
returnedQty: item.returnQty || 0,
returnQty: (Number(item.receiptQty ) || 0) - (Number(item.returnQty) || 0), // 退 = - 退
inStorageTime: item.inStorageTime || new Date().toISOString().split('T')[0] //
}))
}
}
@ -322,6 +323,14 @@ const handleSave = async () => {
message.warning(`${i + 1}行物料的退料数量不能为空且必须大于0`)
return
}
// 退 + 退
const totalReturned = Number(item.returnQty) + Number(item.returnedQty || 0)
const receiptQty = Number(item.receiptQty) || 0
if (totalReturned > receiptQty) {
message.warning(`${i + 1}行物料的退料数量(${item.returnQty}) + 已退料数量(${item.returnedQty || 0}) 不能大于收货数量(${receiptQty})`)
return
}
}
formLoading.value = true
@ -367,6 +376,14 @@ const handleConfirm = async () => {
message.warning(`${i + 1}行物料的退料数量不能为空且必须大于0`)
return
}
// 退 + 退
const totalReturned = Number(item.returnQty) + Number(item.returnedQty || 0)
const receiptQty = Number(item.receiptQty) || 0
if (totalReturned > receiptQty) {
message.warning(`${i + 1}行物料的退料数量(${item.returnQty}) + 已退料数量(${item.returnedQty || 0}) 不能大于收货数量(${receiptQty})`)
return
}
}
formLoading.value = true

View File

@ -811,61 +811,8 @@ const validateDeliveryQty = async () => {
return true
}
const submitForm = async () => {
//
if (!(await validateDeliveryQty())) {
return
}
//
await formRef.value.validate()
//
formLoading.value = true
try {
// detailList
const detailList = productList.value.map(item => ({
twmStorageDetailId: item.twmStorageDetailId || item.id || item.inventoryId,
storeHouseId: item.storeHouseId,
storeHouseName: item.warehouse,
storeHouseCd: item.storeHouseCd,
storeAreaId: item.storeAreaId,
storeAreaName: item.warehouseArea,
storeAreCd: item.storeAreCd,
lotNo: item.batchNo,
bagSpec: item.bagSpec,
deliveriedBagQty: item.deliveriedBag,
deliveriedQty: item.deliveriedQty,
remark: item.remark,
inventBillNo: item.inventBillNo,
packQty: item.packQty || 0,
yardQty: item.yardQty || 0,
//
}))
//
const { contact1, conPhone1, conAddress1, contact2, conPhone2, conAddress2, ...submitData } = formData
const data = {
...submitData,
detailList,
}
if (formType.value === 'create') {
await SaleDeliveryApi.createSaleDelivery(data)
message.success(t('common.createSuccess'))
} else {
await SaleDeliveryApi.updateSaleDelivery(data)
message.success(t('common.updateSuccess'))
}
dialogVisible.value = false
emit('success')
} finally {
formLoading.value = false
}
}
/** 提交确认 */
const submitAudit = async () => {
/** 提交表单 */
const submitForm = async (isConfirm: boolean = false) => {
//
if (!(await validateDeliveryQty())) {
return
@ -893,19 +840,25 @@ const submitAudit = async () => {
deliveriedQty: item.deliveriedQty,
remark: item.remark,
inventBillNo: item.inventBillNo,
packQty: item.packQty || '',
yardQty: item.yardQty || '',
//
packQty: item.packQty || 0,
yardQty: item.yardQty || 0,
}))
//
const { contact1, conPhone1, conAddress1, contact2, conPhone2, conAddress2, ...submitData } = formData
const data = {
//
const data: any = {
...submitData,
deliveryStatus: '2', //
detailList,
}
//
if (isConfirm) {
data.deliveryStatus = '2'
}
//
if (formType.value === 'create') {
await SaleDeliveryApi.createSaleDelivery(data)
message.success(t('common.createSuccess'))