feat(biz): 新增发货状态管理功能
This commit is contained in:
parent
2eef93f948
commit
57a06c7fee
@ -53,4 +53,8 @@ public class SaleDeliveryDetailSaveReqVO {
|
|||||||
|
|
||||||
private String unit;
|
private String unit;
|
||||||
|
|
||||||
|
private BigDecimal stockQty;
|
||||||
|
|
||||||
|
private Integer stockBag;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -81,4 +81,9 @@ public class OrderItemDO extends BaseDO {
|
|||||||
*/
|
*/
|
||||||
private String ordItemStatus;
|
private String ordItemStatus;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 发货状态(1 未发货 2 部分发货 3 全部发货)
|
||||||
|
*/
|
||||||
|
private String deliveryStatus;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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;
|
||||||
/**
|
/**
|
||||||
* 操作人
|
* 操作人
|
||||||
*/
|
*/
|
||||||
|
|||||||
@ -117,5 +117,9 @@ public class ProStorageInventoryDO extends BaseDO {
|
|||||||
* 生产计划号
|
* 生产计划号
|
||||||
*/
|
*/
|
||||||
private String proNo;
|
private String proNo;
|
||||||
|
/**
|
||||||
|
* 盘点单号
|
||||||
|
*/
|
||||||
|
private String inventBillNo;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -81,4 +81,5 @@ public class SaleDeliveryDetailDO extends BaseDO {
|
|||||||
*/
|
*/
|
||||||
private Integer deliveriedBagQty;
|
private Integer deliveriedBagQty;
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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);
|
||||||
|
|||||||
@ -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;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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);
|
||||||
|
|||||||
@ -52,4 +52,6 @@ public interface ProStorageService {
|
|||||||
*/
|
*/
|
||||||
PageResult<ProStorageDO> getProStoragePage(ProStoragePageReqVO pageReqVO);
|
PageResult<ProStorageDO> getProStoragePage(ProStoragePageReqVO pageReqVO);
|
||||||
|
|
||||||
|
String generateSaleDeliveryNo();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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',
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user