feat(biz): 新增发货状态管理功能

This commit is contained in:
zxy 2026-05-20 16:16:18 +08:00
parent 2eef93f948
commit 57a06c7fee
15 changed files with 242 additions and 38 deletions

View File

@ -53,4 +53,8 @@ public class SaleDeliveryDetailSaveReqVO {
private String unit; private String unit;
private BigDecimal stockQty;
private Integer stockBag;
} }

View File

@ -98,6 +98,4 @@ public class StoreHouseController {
List<StoreHouseDO> list = storeHouseService.getStoreHouseSelect(storeType); List<StoreHouseDO> list = storeHouseService.getStoreHouseSelect(storeType);
return success(BeanUtils.toBean(list, StoreHouseRespVO.class)); return success(BeanUtils.toBean(list, StoreHouseRespVO.class));
} }
} }

View File

@ -81,4 +81,9 @@ public class OrderItemDO extends BaseDO {
*/ */
private String ordItemStatus; private String ordItemStatus;
/**
* 发货状态(1 未发货 2 部分发货 3 全部发货)
*/
private String deliveryStatus;
} }

View File

@ -35,7 +35,7 @@ public class ProStorageDO extends BaseDO {
/** /**
* 操作类型 1为入库2为出库 * 操作类型 1为入库2为出库
*/ */
private Boolean operatorType; private Integer operatorType;
/** /**
* 业务类型 (10 生产入库11 盘盈入库12 其它入库 21 成品出库 22 盘亏出库 23生产退库) * 业务类型 (10 生产入库11 盘盈入库12 其它入库 21 成品出库 22 盘亏出库 23生产退库)
*/ */
@ -47,7 +47,7 @@ public class ProStorageDO extends BaseDO {
/** /**
* 状态1 已创建2 提交 * 状态1 已创建2 提交
*/ */
private Boolean status; private Integer status;
/** /**
* 业务日期 * 业务日期
*/ */
@ -55,7 +55,7 @@ public class ProStorageDO extends BaseDO {
/** /**
* 操作人id * 操作人id
*/ */
private Integer operatorId; private String operatorId;
/** /**
* 操作人 * 操作人
*/ */

View File

@ -117,5 +117,9 @@ public class ProStorageInventoryDO extends BaseDO {
* 生产计划号 * 生产计划号
*/ */
private String proNo; private String proNo;
/**
* 盘点单号
*/
private String inventBillNo;
} }

View File

@ -1,12 +1,12 @@
package com.ningxia.yunxi.chemmes.module.biz.dal.dataobject.prostoragemat; package com.ningxia.yunxi.chemmes.module.biz.dal.dataobject.prostoragemat;
import lombok.*; import com.baomidou.mybatisplus.annotation.KeySequence;
import java.util.*; import com.baomidou.mybatisplus.annotation.TableId;
import java.time.LocalDateTime; import com.baomidou.mybatisplus.annotation.TableName;
import java.time.LocalDateTime;
import java.math.BigDecimal;
import com.baomidou.mybatisplus.annotation.*;
import com.ningxia.yunxi.chemmes.framework.mybatis.core.dataobject.BaseDO; import com.ningxia.yunxi.chemmes.framework.mybatis.core.dataobject.BaseDO;
import lombok.*;
import java.math.BigDecimal;
/** /**
* 成品入/出库子 DO * 成品入/出库子 DO
@ -91,11 +91,11 @@ public class ProStorageMatDO extends BaseDO {
/** /**
* 来源单号id * 来源单号id
*/ */
private Integer sourceId; private Long sourceId;
/** /**
* 关联单号id * 关联单号id
*/ */
private Integer relarionId; private Long relarionId;
/** /**
* 单袋规格 * 单袋规格
*/ */
@ -113,4 +113,6 @@ public class ProStorageMatDO extends BaseDO {
*/ */
private String proNo; private String proNo;
private String inventBillNo;
} }

View File

@ -81,4 +81,5 @@ public class SaleDeliveryDetailDO extends BaseDO {
*/ */
private Integer deliveriedBagQty; private Integer deliveriedBagQty;
} }

View File

@ -68,19 +68,12 @@ public interface OrderItemMapper extends BaseMapperX<OrderItemDO> {
// LEFT JOIN 主表 // LEFT JOIN 主表
.leftJoin(OrderDO.class, OrderDO::getId, OrderItemDO::getSaleOrdId) .leftJoin(OrderDO.class, OrderDO::getId, OrderItemDO::getSaleOrdId)
// 查询条件 - 子表 // 查询条件 - 子表
.like(StringUtils.hasText(pageReqVO.getMaterialCode()), OrderItemDO::getMaterialCode, pageReqVO.getMaterialCode()) .ne(OrderItemDO::getDeliveryStatus, "3")
.like(StringUtils.hasText(pageReqVO.getMaterialName()), OrderItemDO::getMaterialName, pageReqVO.getMaterialName())
.eq(StringUtils.hasText(pageReqVO.getOrdItemStatus()), OrderItemDO::getOrdItemStatus, pageReqVO.getOrdItemStatus())
// 查询条件 - 主表 // 查询条件 - 主表
.eq( OrderDO::getOrdStatus, "2")
.like(StringUtils.hasText(pageReqVO.getSaleOrdNo()), OrderDO::getSaleOrdNo, pageReqVO.getSaleOrdNo()) .like(StringUtils.hasText(pageReqVO.getSaleOrdNo()), OrderDO::getSaleOrdNo, pageReqVO.getSaleOrdNo())
.eq(pageReqVO.getCustId() != null, OrderDO::getCustId, pageReqVO.getCustId())
.like(StringUtils.hasText(pageReqVO.getCustName()), OrderDO::getCustName, pageReqVO.getCustName()) .like(StringUtils.hasText(pageReqVO.getCustName()), OrderDO::getCustName, pageReqVO.getCustName())
.eq(pageReqVO.getSaleMan() != null, OrderDO::getSaleMan, pageReqVO.getSaleMan())
.eq(pageReqVO.getSaleDeptId() != null, OrderDO::getSaleDeptId, pageReqVO.getSaleDeptId())
.eq(StringUtils.hasText(pageReqVO.getOrdType()), OrderDO::getOrdType, pageReqVO.getOrdType())
.eq(StringUtils.hasText(pageReqVO.getOrdStatus()), OrderDO::getOrdStatus, pageReqVO.getOrdStatus())
.eq(StringUtils.hasText(pageReqVO.getProStatus()), OrderDO::getProStatus, pageReqVO.getProStatus())
.eq(StringUtils.hasText(pageReqVO.getDeliveryStatus()), OrderDO::getDeliveryStatus, pageReqVO.getDeliveryStatus())
.orderByDesc(OrderItemDO::getId); .orderByDesc(OrderItemDO::getId);
return selectJoinPage(pageReqVO, OrderItemWithOrderRespVO.class, wrapper); return selectJoinPage(pageReqVO, OrderItemWithOrderRespVO.class, wrapper);

View File

@ -1,5 +1,6 @@
package com.ningxia.yunxi.chemmes.module.biz.dal.mysql.prostorage; package com.ningxia.yunxi.chemmes.module.biz.dal.mysql.prostorage;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.ningxia.yunxi.chemmes.framework.common.pojo.PageResult; import com.ningxia.yunxi.chemmes.framework.common.pojo.PageResult;
import com.ningxia.yunxi.chemmes.framework.mybatis.core.mapper.BaseMapperX; import com.ningxia.yunxi.chemmes.framework.mybatis.core.mapper.BaseMapperX;
import com.ningxia.yunxi.chemmes.framework.mybatis.core.query.LambdaQueryWrapperX; import com.ningxia.yunxi.chemmes.framework.mybatis.core.query.LambdaQueryWrapperX;
@ -34,4 +35,12 @@ public interface ProStorageMapper extends BaseMapperX<ProStorageDO> {
.orderByDesc(ProStorageDO::getId)); .orderByDesc(ProStorageDO::getId));
} }
default String selectMaxBillNo() {
ProStorageDO proStorage = selectOne(new LambdaQueryWrapper<ProStorageDO>()
.orderByDesc(ProStorageDO::getBillNo)
.last("LIMIT 1"));
return proStorage != null ? proStorage.getBillNo() : null;
}
} }

View File

@ -107,6 +107,7 @@ public class OrderServiceImpl implements OrderService {
List<OrderItemDO> orderItems = BeanUtils.toBean(list, OrderItemDO.class); List<OrderItemDO> orderItems = BeanUtils.toBean(list, OrderItemDO.class);
orderItems.forEach(item -> orderItems.forEach(item ->
item.setSaleOrdId(saleOrdId) item.setSaleOrdId(saleOrdId)
.setDeliveryStatus("1")
.setId(null) .setId(null)
); );
orderItemMapper.insertBatch(orderItems); orderItemMapper.insertBatch(orderItems);

View File

@ -52,4 +52,6 @@ public interface ProStorageService {
*/ */
PageResult<ProStorageDO> getProStoragePage(ProStoragePageReqVO pageReqVO); PageResult<ProStorageDO> getProStoragePage(ProStoragePageReqVO pageReqVO);
String generateSaleDeliveryNo();
} }

View File

@ -10,6 +10,8 @@ import org.springframework.stereotype.Service;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
import javax.annotation.Resource; import javax.annotation.Resource;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import static com.ningxia.yunxi.chemmes.framework.common.exception.util.ServiceExceptionUtil.exception; import static com.ningxia.yunxi.chemmes.framework.common.exception.util.ServiceExceptionUtil.exception;
@ -67,4 +69,21 @@ public class ProStorageServiceImpl implements ProStorageService {
return proStorageMapper.selectPage(pageReqVO); return proStorageMapper.selectPage(pageReqVO);
} }
@Override
public String generateSaleDeliveryNo() {
String ym = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMM"));
String maxBillNo = proStorageMapper.selectMaxBillNo();
if (maxBillNo == null || maxBillNo.length() < 9
|| !maxBillNo.substring(2, 8).equals(ym)) {
return "CK" + ym + "001";
} else {
String prefix = maxBillNo.substring(0, 8);
int sequence = Integer.parseInt(maxBillNo.substring(8));
sequence++;
return prefix + String.format("%03d", sequence);
}
}
} }

View File

@ -5,10 +5,21 @@ import com.ningxia.yunxi.chemmes.framework.common.util.object.BeanUtils;
import com.ningxia.yunxi.chemmes.module.biz.controller.admin.saledelivery.vo.SaleDeliveryPageReqVO; import com.ningxia.yunxi.chemmes.module.biz.controller.admin.saledelivery.vo.SaleDeliveryPageReqVO;
import com.ningxia.yunxi.chemmes.module.biz.controller.admin.saledelivery.vo.SaleDeliverySaveReqVO; import com.ningxia.yunxi.chemmes.module.biz.controller.admin.saledelivery.vo.SaleDeliverySaveReqVO;
import com.ningxia.yunxi.chemmes.module.biz.controller.admin.saledeliverydetail.vo.SaleDeliveryDetailSaveReqVO; import com.ningxia.yunxi.chemmes.module.biz.controller.admin.saledeliverydetail.vo.SaleDeliveryDetailSaveReqVO;
import com.ningxia.yunxi.chemmes.module.biz.dal.dataobject.order.OrderDO;
import com.ningxia.yunxi.chemmes.module.biz.dal.dataobject.orderitem.OrderItemDO;
import com.ningxia.yunxi.chemmes.module.biz.dal.dataobject.prostorage.ProStorageDO;
import com.ningxia.yunxi.chemmes.module.biz.dal.dataobject.prostorageinventory.ProStorageInventoryDO;
import com.ningxia.yunxi.chemmes.module.biz.dal.dataobject.prostoragemat.ProStorageMatDO;
import com.ningxia.yunxi.chemmes.module.biz.dal.dataobject.saledelivery.SaleDeliveryDO; import com.ningxia.yunxi.chemmes.module.biz.dal.dataobject.saledelivery.SaleDeliveryDO;
import com.ningxia.yunxi.chemmes.module.biz.dal.dataobject.saledeliverydetail.SaleDeliveryDetailDO; import com.ningxia.yunxi.chemmes.module.biz.dal.dataobject.saledeliverydetail.SaleDeliveryDetailDO;
import com.ningxia.yunxi.chemmes.module.biz.dal.mysql.order.OrderMapper;
import com.ningxia.yunxi.chemmes.module.biz.dal.mysql.orderitem.OrderItemMapper;
import com.ningxia.yunxi.chemmes.module.biz.dal.mysql.prostorage.ProStorageMapper;
import com.ningxia.yunxi.chemmes.module.biz.dal.mysql.prostorageinventory.ProStorageInventoryMapper;
import com.ningxia.yunxi.chemmes.module.biz.dal.mysql.prostoragemat.ProStorageMatMapper;
import com.ningxia.yunxi.chemmes.module.biz.dal.mysql.saledelivery.SaleDeliveryMapper; import com.ningxia.yunxi.chemmes.module.biz.dal.mysql.saledelivery.SaleDeliveryMapper;
import com.ningxia.yunxi.chemmes.module.biz.dal.mysql.saledeliverydetail.SaleDeliveryDetailMapper; import com.ningxia.yunxi.chemmes.module.biz.dal.mysql.saledeliverydetail.SaleDeliveryDetailMapper;
import com.ningxia.yunxi.chemmes.module.biz.service.prostorage.ProStorageService;
import com.ningxia.yunxi.chemmes.module.system.dal.dataobject.user.AdminUserDO; import com.ningxia.yunxi.chemmes.module.system.dal.dataobject.user.AdminUserDO;
import com.ningxia.yunxi.chemmes.module.system.dal.mysql.user.AdminUserMapper; import com.ningxia.yunxi.chemmes.module.system.dal.mysql.user.AdminUserMapper;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
@ -16,6 +27,7 @@ import org.springframework.transaction.annotation.Transactional;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
import javax.annotation.Resource; import javax.annotation.Resource;
import java.math.BigDecimal;
import java.time.LocalDate; import java.time.LocalDate;
import java.time.format.DateTimeFormatter; import java.time.format.DateTimeFormatter;
import java.util.List; import java.util.List;
@ -41,6 +53,23 @@ public class SaleDeliveryServiceImpl implements SaleDeliveryService {
@Resource @Resource
private AdminUserMapper adminUserMapper; private AdminUserMapper adminUserMapper;
@Resource
private ProStorageInventoryMapper proStorageInventoryMapper;
@Resource
private ProStorageMapper proStorageMapper;
@Resource
private ProStorageMatMapper proStorageMatMapper;
@Resource
private OrderItemMapper orderItemMapper;
@Resource
private OrderMapper orderMapper;
@Resource
private ProStorageService proStorageService;
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
@ -56,10 +85,12 @@ public class SaleDeliveryServiceImpl implements SaleDeliveryService {
AdminUserDO adminUserDO = adminUserMapper.selectById(userId); AdminUserDO adminUserDO = adminUserMapper.selectById(userId);
saleDelivery.setDeliveryEmpId(String.valueOf(adminUserDO.getId())); saleDelivery.setDeliveryEmpId(String.valueOf(adminUserDO.getId()));
saleDelivery.setDeliveryEmpName(adminUserDO.getNickname()); saleDelivery.setDeliveryEmpName(adminUserDO.getNickname());
saleDelivery.setSaleOrdDetailId(createReqVO.getSaleOrdDetailId());
saleDeliveryMapper.insert(saleDelivery); saleDeliveryMapper.insert(saleDelivery);
createSaleDeliveryDetailList(saleDelivery.getId(), createReqVO.getDetailList()); createSaleDeliveryDetailList(saleDelivery.getId(), createReqVO.getDetailList());
if ("2".equals(createReqVO.getDeliveryStatus())) {
confirmSaleDelivery(saleDelivery.getId());
}
// 返回 // 返回
return saleDelivery.getId(); return saleDelivery.getId();
@ -74,6 +105,9 @@ public class SaleDeliveryServiceImpl implements SaleDeliveryService {
SaleDeliveryDO updateObj = BeanUtils.toBean(updateReqVO, SaleDeliveryDO.class); SaleDeliveryDO updateObj = BeanUtils.toBean(updateReqVO, SaleDeliveryDO.class);
saleDeliveryMapper.updateById(updateObj); saleDeliveryMapper.updateById(updateObj);
updateSaleDeliveryDetailList(updateReqVO.getId(), updateReqVO.getDetailList()); updateSaleDeliveryDetailList(updateReqVO.getId(), updateReqVO.getDetailList());
if ("2".equals(updateReqVO.getDeliveryStatus())) {
confirmSaleDelivery(updateReqVO.getId());
}
} }
/** /**
@ -146,7 +180,13 @@ public class SaleDeliveryServiceImpl implements SaleDeliveryService {
List<SaleDeliveryDetailDO> detailList = saleDeliveryDetailMapper.selectBySaleDeliveryId(id); List<SaleDeliveryDetailDO> detailList = saleDeliveryDetailMapper.selectBySaleDeliveryId(id);
// 转换为子表VO列表 // 转换为子表VO列表
saleDeliveryVO.setDetailList(BeanUtils.toBean(detailList, SaleDeliveryDetailSaveReqVO.class)); saleDeliveryVO.setDetailList(BeanUtils.toBean(detailList, SaleDeliveryDetailSaveReqVO.class));
for (SaleDeliveryDetailSaveReqVO saleDeliveryDetailSaveReqVO : saleDeliveryVO.getDetailList()) {
ProStorageInventoryDO storageInventoryDO = proStorageInventoryMapper.selectById(saleDeliveryDetailSaveReqVO.getTwmStorageDetailId());
if (storageInventoryDO != null) {
saleDeliveryDetailSaveReqVO.setStockQty(storageInventoryDO.getYardQty());
saleDeliveryDetailSaveReqVO.setStockBag(storageInventoryDO.getPackQty());
}
}
return saleDeliveryVO; return saleDeliveryVO;
} }
@ -156,7 +196,6 @@ public class SaleDeliveryServiceImpl implements SaleDeliveryService {
} }
/** /**
* 生成销售出库单号 * 生成销售出库单号
* 规则SC + 年份(4位) + 月份(2位) + 流水号(3位) * 规则SC + 年份(4位) + 月份(2位) + 流水号(3位)
@ -166,8 +205,7 @@ public class SaleDeliveryServiceImpl implements SaleDeliveryService {
String maxSaleDeliveryNo = saleDeliveryMapper.selectMaxSaleDeliveryNo(); String maxSaleDeliveryNo = saleDeliveryMapper.selectMaxSaleDeliveryNo();
if (maxSaleDeliveryNo == null || maxSaleDeliveryNo.length() < 9 if (maxSaleDeliveryNo == null || maxSaleDeliveryNo.length() < 9 || !maxSaleDeliveryNo.substring(2, 8).equals(ym)) {
|| !maxSaleDeliveryNo.substring(2, 8).equals(ym)) {
return "SC" + ym + "001"; return "SC" + ym + "001";
} else { } else {
String prefix = maxSaleDeliveryNo.substring(0, 8); String prefix = maxSaleDeliveryNo.substring(0, 8);
@ -176,4 +214,123 @@ public class SaleDeliveryServiceImpl implements SaleDeliveryService {
return prefix + String.format("%03d", sequence); return prefix + String.format("%03d", sequence);
} }
} }
private void confirmSaleDelivery(Integer id) {
SaleDeliveryDO saleDelivery = saleDeliveryMapper.selectById(id);
if (saleDelivery == null) {
throw exception("销售出库单不存在");
}
// if ("2".equals(saleDelivery.getDeliveryStatus())) {
// throw exception("该出库单已确认,无需重复确认");
// }
List<SaleDeliveryDetailDO> detailList = saleDeliveryDetailMapper.selectBySaleDeliveryId(saleDelivery.getId());
if (detailList == null || detailList.isEmpty()) {
throw exception("出库单明细不能为空");
}
ProStorageDO proStorage = ProStorageDO.builder()
.billNo(proStorageService.generateSaleDeliveryNo())
.operatorType(2)
.businessType(21)
// .billType("0")
.status(1)
.billDate(LocalDate.now())
.operatorId(saleDelivery.getDeliveryEmpId())
.operatorName(saleDelivery.getDeliveryEmpName())
.relarionNo(saleDelivery.getSaleOrdNo())
.relarionId(saleDelivery.getSaleOrdId())
.sourceNo(saleDelivery.getSaleOrdNo())
.sourceId(saleDelivery.getSaleOrdId())
.build();
proStorageMapper.insert(proStorage);
for (SaleDeliveryDetailDO detail : detailList) {
ProStorageInventoryDO inventory = proStorageInventoryMapper.selectById(detail.getTwmStorageDetailId());
if (inventory == null) {
throw exception("库存不存在:仓库[" + detail.getStoreHouseName() + "] 批次[" + detail.getLotNo() + "]");
}
BigDecimal deliveriedQty = detail.getDeliveriedQty() != null ? detail.getDeliveriedQty() : BigDecimal.ZERO;
if (inventory.getUseQty().compareTo(deliveriedQty) < 0) {
throw exception("库存不足:当前可用数量[" + inventory.getUseQty() + "] < 发货数量[" + deliveriedQty + "]");
}
inventory.setUseQty(inventory.getUseQty().subtract(deliveriedQty));
inventory.setYardQty(inventory.getYardQty().subtract(deliveriedQty));
inventory.setPackQty(inventory.getPackQty() - (detail.getDeliveriedBagQty()));
proStorageInventoryMapper.updateById(inventory);
ProStorageMatDO storageMat = ProStorageMatDO.builder()
.stockId(proStorage.getId().longValue())
.storeHouseId(detail.getStoreHouseId())
.storeAreaId(detail.getStoreAreaId())
.storeHouseCd(detail.getStoreHouseCd())
.storeHouseName(detail.getStoreHouseName())
.storeAreCd(detail.getStoreAreCd())
.storeAreaName(detail.getStoreAreaName())
.materialId(saleDelivery.getMaterialId())
.matName(saleDelivery.getMaterialName())
.matCode(saleDelivery.getMaterialCode())
.spec(saleDelivery.getSpec())
.unit(saleDelivery.getUnit())
.lotNo(detail.getLotNo())
.operatorQty(detail.getDeliveriedQty())
.bagSpec(detail.getBagSpec())
.bagQty(detail.getDeliveriedBagQty())
.relarionId(inventory.getId())
.planId(inventory.getPlanId())
.proNo(inventory.getProNo())
.sourceId(inventory.getId())
.inventBillNo(inventory.getInventBillNo())
.build();
proStorageMatMapper.insert(storageMat);
}
if (saleDelivery.getSaleOrdId() != null && saleDelivery.getSaleOrdDetailId() != null) {
OrderItemDO currentOrderItem = orderItemMapper.selectById(saleDelivery.getSaleOrdDetailId());
if (currentOrderItem == null) {
throw exception("订单明细不存在");
}
BigDecimal currentDeliveriedQty = currentOrderItem.getDeliveriedQty() != null ? currentOrderItem.getDeliveriedQty() : BigDecimal.ZERO;
BigDecimal deliveryQty = saleDelivery.getDeliveriedQty() != null ? saleDelivery.getDeliveriedQty() : BigDecimal.ZERO;
BigDecimal totalDeliveriedQty = currentDeliveriedQty.add(deliveryQty);
currentOrderItem.setDeliveriedQty(totalDeliveriedQty);
if (totalDeliveriedQty.compareTo(currentOrderItem.getOrdQty()) == 0) {
currentOrderItem.setDeliveryStatus("3");
} else if (totalDeliveriedQty.compareTo(currentOrderItem.getOrdQty()) < 0) {
currentOrderItem.setDeliveryStatus("2");
} else {
throw exception("订单明细发货数量不能大于订单数量");
}
orderItemMapper.updateById(currentOrderItem);
List<OrderItemDO> allOrderItems = orderItemMapper.selectBySaleOrdId(saleDelivery.getSaleOrdId());
boolean allShipped = true;
for (OrderItemDO item : allOrderItems) {
if (!"3".equals(item.getDeliveryStatus())) {
allShipped = false;
break;
}
}
OrderDO order = orderMapper.selectById(saleDelivery.getSaleOrdId());
if (order != null) {
if (allShipped) {
order.setDeliveryStatus("3");
} else {
order.setDeliveryStatus("2");
}
orderMapper.updateById(order);
}
}
saleDelivery.setDeliveryStatus("2");
saleDeliveryMapper.updateById(saleDelivery);
}
} }

View File

@ -169,6 +169,7 @@ const getList = async () => {
saleOrdId: order.id, saleOrdId: order.id,
custId: order.custId, // ID custId: order.custId, // ID
deliveriedQty: item.deliveriedQty || 0, deliveriedQty: item.deliveriedQty || 0,
itemId: item.id
})), })),
} }
}) })
@ -239,8 +240,8 @@ const emitSelect = (row) => {
remaimQty: ((row.ordQty || 0) - (row.deliveriedQty || 0)) || 0, remaimQty: ((row.ordQty || 0) - (row.deliveriedQty || 0)) || 0,
deliveriedQty: row.deliveriedQty || 0, deliveriedQty: row.deliveriedQty || 0,
unit: row.unit, unit: row.unit,
itemId: row.itemId
} }
console.log('emitSelect data:', selectData)
emit('select', selectData) emit('select', selectData)
dialogVisible.value = false dialogVisible.value = false
} }

View File

@ -171,12 +171,12 @@
</el-table-column> </el-table-column>
<el-table-column label="库存数量" prop="stockQty" width="150px" align="center"> <el-table-column label="库存数量" prop="stockQty" width="150px" align="center">
<template #default="scope"> <template #default="scope">
<el-input v-model="scope.row.stockQty" placeholder="库存数量" readonly /> {{ scope.row.stockQty }}
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="库存袋数" prop="stockBag" width="150px" align="center"> <el-table-column label="库存袋数" prop="stockBag" width="150px" align="center">
<template #default="scope"> <template #default="scope">
<el-input v-model="scope.row.stockBag" placeholder="库存袋数" readonly /> {{ scope.row.stockBag }}
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="单袋规格" prop="bagSpec" width="150px" align="center"> <el-table-column label="单袋规格" prop="bagSpec" width="150px" align="center">
@ -188,7 +188,7 @@
<template #default="scope"> <template #default="scope">
<MoneyInput <MoneyInput
v-model="scope.row.deliveriedBag" v-model="scope.row.deliveriedBag"
:decimal-places="2" :decimal-places="0"
:allow-negative="false" :allow-negative="false"
:show-prefix="false" :show-prefix="false"
placeholder="请输入" placeholder="请输入"
@ -280,6 +280,7 @@ const getToday = () => {
const formData = reactive({ const formData = reactive({
id: undefined, id: undefined,
saleDeliveryNo: '自动生成', saleDeliveryNo: '自动生成',
saleOrdDetailId: undefined,
deliveryDate: getToday(), deliveryDate: getToday(),
deliveryStatus: '1', deliveryStatus: '1',
deliveryType: '1', deliveryType: '1',
@ -486,6 +487,7 @@ const open = async (type: string, id?: number) => {
// //
productList.value = itemsData.map((item: any) => ({ productList.value = itemsData.map((item: any) => ({
id: item.id, id: item.id,
twmStorageDetailId: item.twmStorageDetailId || item.id,
storeHouseId: item.storeHouseId, storeHouseId: item.storeHouseId,
storeHouseCd: item.storeHouseCd || '', storeHouseCd: item.storeHouseCd || '',
storeAreaId: item.storeAreaId, storeAreaId: item.storeAreaId,
@ -497,6 +499,8 @@ const open = async (type: string, id?: number) => {
deliveriedBag: item.deliveriedBagQty || '', deliveriedBag: item.deliveriedBagQty || '',
deliveriedQty: item.deliveriedQty || '', deliveriedQty: item.deliveriedQty || '',
remark: item.remark || '', remark: item.remark || '',
stockQty: item.stockQty || '',
stockBag: item.stockBag || '',
})) }))
} finally { } finally {
formLoading.value = false formLoading.value = false
@ -523,6 +527,7 @@ const loadSaleOrderOptions = async () => {
spec: item.spec, spec: item.spec,
ordQty: item.ordQty, ordQty: item.ordQty,
remaimQty: item.remaimQty, remaimQty: item.remaimQty,
saleOrdDetailId: item.itemId,
})) }))
} catch (e) { } catch (e) {
console.error('加载销售订单失败', e) console.error('加载销售订单失败', e)
@ -539,6 +544,7 @@ const handleSaleOrderChange = async (value: number) => {
formData.ordQty = order.ordQty formData.ordQty = order.ordQty
formData.remaimQty = order.remaimQty formData.remaimQty = order.remaimQty
formData.deliveriedQty = order.remaimQty formData.deliveriedQty = order.remaimQty
formData.saleOrdDetailId = order.saleOrdDetailId
} }
} }
@ -564,6 +570,7 @@ const handleOrderSelect = async (data: any) => {
formData.saleOrdNo = data.saleOrdNo formData.saleOrdNo = data.saleOrdNo
formData.custId = data.custId formData.custId = data.custId
formData.custName = data.custName formData.custName = data.custName
formData.saleOrdDetailId = data.itemId
formData.materialName = data.materialName formData.materialName = data.materialName
formData.materialId = data.materialId formData.materialId = data.materialId
formData.materialCode = data.materialCode formData.materialCode = data.materialCode
@ -661,6 +668,7 @@ const handleInventorySelect = (data: any[]) => {
// //
productList.value.push({ productList.value.push({
inventoryId: inventory.id, // ID inventoryId: inventory.id, // ID
twmStorageDetailId: inventory.id, // ID
storeHouseId: inventory.storeHouseId, // ID storeHouseId: inventory.storeHouseId, // ID
storeHouseCd: inventory.storeHouseCd, // storeHouseCd: inventory.storeHouseCd, //
storeAreaId: inventory.storeAreaId, // ID storeAreaId: inventory.storeAreaId, // ID
@ -682,9 +690,7 @@ const handleInventorySelect = (data: any[]) => {
/** 删除产品项 */ /** 删除产品项 */
const removeProductItem = (index: number) => { const removeProductItem = (index: number) => {
if (productList.value.length > 1) { productList.value.splice(index, 1)
productList.value.splice(index, 1)
}
} }
/** 提交表单 */ /** 提交表单 */
@ -800,7 +806,7 @@ const submitForm = async () => {
try { try {
// detailList // detailList
const detailList = productList.value.map(item => ({ const detailList = productList.value.map(item => ({
twmStorageDetailId: item.id, twmStorageDetailId: item.twmStorageDetailId || item.id || item.inventoryId,
storeHouseId: item.storeHouseId, storeHouseId: item.storeHouseId,
storeHouseName: item.warehouse, storeHouseName: item.warehouse,
storeHouseCd: item.storeHouseCd, storeHouseCd: item.storeHouseCd,
@ -848,7 +854,8 @@ const submitAudit = async () => {
try { try {
// detailList // detailList
const detailList = productList.value.map(item => ({ const detailList = productList.value.map(item => ({
id: item.id, id: item.id || item.inventoryId,
twmStorageDetailId: item.twmStorageDetailId || item.id || item.inventoryId,
storeHouseId: item.storeHouseId, storeHouseId: item.storeHouseId,
storeHouseName: item.warehouse, storeHouseName: item.warehouse,
storeHouseCd: item.storeHouseCd, storeHouseCd: item.storeHouseCd,
@ -887,6 +894,7 @@ const resetForm = () => {
Object.assign(formData, { Object.assign(formData, {
id: undefined, id: undefined,
saleDeliveryNo: '自动生成', saleDeliveryNo: '自动生成',
saleOrdDetailId: undefined,
deliveryDate: getToday(), deliveryDate: getToday(),
deliveryStatus: '1', deliveryStatus: '1',
deliveryType: '1', deliveryType: '1',