refactor(biz): 重构采购退料和销售发货功能
This commit is contained in:
parent
2fd6b57e09
commit
203cc6e1bc
@ -230,6 +230,7 @@ public class GlobalExceptionHandler {
|
||||
|
||||
// 处理表数据相关异常
|
||||
if (ex instanceof DuplicateKeyException){
|
||||
log.error("[defaultExceptionHandler][url({}) 数据重复]", req.getRequestURL(), ex);
|
||||
return CommonResult.error(REPEAT_DATA);
|
||||
}
|
||||
|
||||
|
||||
@ -104,6 +104,10 @@ public class PurReceiptDetailRespVO {
|
||||
@ExcelProperty("已退料数量")
|
||||
private BigDecimal returnQty;
|
||||
|
||||
@Schema(description = "已退料数量")
|
||||
@ExcelProperty("已退料数量")
|
||||
private BigDecimal returnedQty;
|
||||
|
||||
@Schema(description = "发货数量")
|
||||
@ExcelProperty("发货数量")
|
||||
private BigDecimal deliveryQty;
|
||||
|
||||
@ -83,7 +83,7 @@ public class RawStorageDO extends BaseDO {
|
||||
/**
|
||||
* 单据类型(1 标准采购申请 2设备采购申请 3 标准采购退料 4设备采购退料)
|
||||
*/
|
||||
private String billType;
|
||||
// private String billType;
|
||||
/**
|
||||
* 来源单号
|
||||
*/
|
||||
|
||||
@ -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));
|
||||
|
||||
@ -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));
|
||||
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -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());
|
||||
|
||||
@ -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 => ({
|
||||
|
||||
@ -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()
|
||||
}
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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'))
|
||||
|
||||
Loading…
Reference in New Issue
Block a user