Commit 8dc06376 by 杨浩

bug修复;

采购入库新增调整
parent 745aedec
......@@ -83,7 +83,9 @@ public class ErpSupplierController {
@Operation(summary = "获得供应商精简列表", description = "只包含被开启的供应商,主要用于前端的下拉选项")
public CommonResult<List<ErpSupplierRespVO>> getSupplierSimpleList() {
List<ErpSupplierDO> list = supplierService.getSupplierListByStatus(CommonStatusEnum.ENABLE.getStatus());
return success(convertList(list, supplier -> new ErpSupplierRespVO().setId(supplier.getId())));
return success(convertList(list, supplier -> new ErpSupplierRespVO().setId(supplier.getId())
.setSystemDeptId(supplier.getSystemDeptId())
.setName(supplier.getName())));
}
@GetMapping("/export-excel")
......
......@@ -119,11 +119,11 @@ public class ErpPurchaseInRespVO {
private String productUnit;
@Schema(description = "产品单价", example = "100.00")
private BigDecimal productPrice;
private Integer productPrice;
@Schema(description = "产品数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "100.00")
@NotNull(message = "产品数量不能为空")
private BigDecimal count;
private Integer count;
@Schema(description = "税率,百分比", example = "99.88")
private BigDecimal taxPercent;
......
......@@ -70,11 +70,11 @@ public class ErpPurchaseInSaveReqVO {
private String productUnit;
@Schema(description = "产品单价", example = "100.00")
private BigDecimal productPrice;
private Integer productPrice;
@Schema(description = "产品数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "100.00")
@NotNull(message = "产品数量不能为空")
private BigDecimal count;
private Integer count;
@Schema(description = "税率,百分比", example = "99.88")
private BigDecimal taxPercent;
......
......@@ -130,4 +130,10 @@ public class ErpSupplierRespVO {
@Schema(description = "审核意见")
private String auditReason;
/**
* 关联部门id
*/
private String systemDeptId;
}
package cn.iocoder.foodnexus.module.erp.controller.admin.sale.vo.order;
import cn.iocoder.foodnexus.framework.common.pojo.PageParam;
import cn.iocoder.foodnexus.module.erp.enums.SaleOrderPickUpStatus;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
......@@ -77,4 +78,10 @@ public class ErpSaleOrderPageReqVO extends PageParam {
@Schema(description = "是否可退货", example = "true")
private Boolean returnEnable;
@Schema(description = "配送人员")
private Long deliveryStaffId;
@Schema(description = "拣货状态")
private SaleOrderPickUpStatus pickUpStatus;
}
\ No newline at end of file
......@@ -2,6 +2,7 @@ package cn.iocoder.foodnexus.module.erp.controller.admin.sale.vo.order;
import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
import cn.idev.excel.annotation.ExcelProperty;
import cn.iocoder.foodnexus.module.erp.enums.SaleOrderPickUpStatus;
import cn.iocoder.foodnexus.module.order.dto.CustomerAddressInfo;
import cn.iocoder.foodnexus.module.order.enums.DeliveryMode;
import com.baomidou.mybatisplus.annotation.TableField;
......@@ -123,6 +124,9 @@ public class ErpSaleOrderRespVO {
@TableField(typeHandler = JacksonTypeHandler.class)
private CustomerAddressInfo addressInfo;
@Schema(description = "拣货状态")
private SaleOrderPickUpStatus pickUpStatus;
@Data
public static class Item {
......@@ -178,7 +182,7 @@ public class ErpSaleOrderRespVO {
@Schema(description = "供应商id")
private Long supplierId;
@Schema(description = "拣货状态")
private String pickUpStatus;
private SaleOrderPickUpStatus pickUpStatus;
}
......
package cn.iocoder.foodnexus.module.erp.controller.admin.sale.vo.order;
import cn.iocoder.foodnexus.module.erp.enums.SaleOrderPickUpStatus;
import cn.iocoder.foodnexus.module.order.dto.CustomerAddressInfo;
import cn.iocoder.foodnexus.module.order.enums.DeliveryMode;
import com.baomidou.mybatisplus.annotation.TableField;
......@@ -102,7 +103,7 @@ public class ErpSaleOrderSaveReqVO {
private Long supplierId;
@Schema(description = "拣货状态")
private String pickUpStatus;
private SaleOrderPickUpStatus pickUpStatus;
}
......
......@@ -113,7 +113,7 @@ public class ErpSaleOutRespVO {
private Long productId;
@Schema(description = "产品单位单位", requiredMode = Schema.RequiredMode.REQUIRED, example = "3113")
private Long productUnitId;
private String productUnit;
@Schema(description = "产品单价", example = "100.00")
private BigDecimal productPrice;
......
......@@ -64,7 +64,7 @@ public class ErpSaleOutSaveReqVO {
@Schema(description = "产品单位单位", requiredMode = Schema.RequiredMode.REQUIRED, example = "3113")
@NotNull(message = "产品单位单位不能为空")
private Long productUnitId;
private String productUnit;
@Schema(description = "产品单价", example = "100.00")
private BigDecimal productPrice;
......
......@@ -74,7 +74,7 @@ public class ErpPurchaseInDO extends BaseDO {
/**
* 合计数量
*/
private BigDecimal totalCount;
private Integer totalCount;
/**
* 最终合计价格,单位:元
*
......
......@@ -65,11 +65,11 @@ public class ErpPurchaseInItemDO extends BaseDO {
/**
* 产品单位单价,单位:元
*/
private BigDecimal productPrice;
private Integer productPrice;
/**
* 数量
*/
private BigDecimal count;
private Integer count;
/**
* 总价,单位:元
*
......
......@@ -3,6 +3,7 @@ package cn.iocoder.foodnexus.module.erp.dal.dataobject.sale;
import cn.iocoder.foodnexus.framework.mybatis.core.dataobject.BaseDO;
import cn.iocoder.foodnexus.module.erp.api.enums.ErpAuditStatus;
import cn.iocoder.foodnexus.module.erp.dal.dataobject.finance.ErpAccountDO;
import cn.iocoder.foodnexus.module.erp.enums.SaleOrderPickUpStatus;
import cn.iocoder.foodnexus.module.order.dto.CustomerAddressInfo;
import cn.iocoder.foodnexus.module.order.enums.DeliveryMode;
import com.baomidou.mybatisplus.annotation.KeySequence;
......@@ -157,4 +158,9 @@ public class ErpSaleOrderDO extends BaseDO {
*/
@TableField(typeHandler = JacksonTypeHandler.class)
private CustomerAddressInfo addressInfo;
/**
* 拣货状态
*/
private SaleOrderPickUpStatus pickUpStatus;
}
\ No newline at end of file
......@@ -106,6 +106,6 @@ public class ErpSaleOrderItemDO extends BaseDO {
*
* {@link SaleOrderPickUpStatus}
*/
private String pickUpStatus;
private SaleOrderPickUpStatus pickUpStatus;
}
\ No newline at end of file
......@@ -61,7 +61,7 @@ public class ErpSaleOutItemDO extends BaseDO {
*
* 冗余 {@link ErpProductDO#getUnitId()}
*/
private Long productUnitId;
private String productUnit;
/**
* 产品单位单价,单位:元
......
......@@ -29,6 +29,8 @@ public interface ErpSaleOrderMapper extends BaseMapperX<ErpSaleOrderDO> {
.eqIfPresent(ErpSaleOrderDO::getStatus, reqVO.getStatus())
.likeIfPresent(ErpSaleOrderDO::getRemark, reqVO.getRemark())
.eqIfPresent(ErpSaleOrderDO::getCreator, reqVO.getCreator())
.eqIfPresent(ErpSaleOrderDO::getDeliveryStaffId, reqVO.getDeliveryStaffId())
.eqIfPresent(ErpSaleOrderDO::getPickUpStatus, reqVO.getPickUpStatus())
.orderByDesc(ErpSaleOrderDO::getId);
// 入库状态。为什么需要 t. 的原因,是因为联表查询时,需要指定表名,不然会报 out_count 错误
if (Objects.equals(reqVO.getOutStatus(), ErpSaleOrderPageReqVO.OUT_STATUS_NONE)) {
......
......@@ -69,6 +69,7 @@ ErrorCode PURCHASE_ORDER_ITEM_RETURN_FAIL_IN_EXCEED = new ErrorCode(1_030_101_00
ErrorCode SALE_ORDER_PROCESS_FAIL_EXISTS_OUT = new ErrorCode(1_020_201_008, "反审核失败,已存在对应的销售出库单");
ErrorCode SALE_ORDER_ITEM_RETURN_FAIL_OUT_EXCEED = new ErrorCode(1_020_201_009, "销售订单项({})超过最大允许退货数量({})");
ErrorCode SALE_ORDER_PROCESS_FAIL_EXISTS_RETURN = new ErrorCode(1_020_201_010, "反审核失败,已存在对应的销售退货单");
ErrorCode SALE_ORDER_PICKUP_STATUS_FAIL = new ErrorCode(1_020_201_011, "销售订单状态异常");
// ========== ERP 销售出库(1-030-202-000) ==========
ErrorCode SALE_OUT_NOT_EXISTS = new ErrorCode(1_020_202_000, "销售出库单不存在");
......
......@@ -20,6 +20,7 @@ public enum SaleOrderPickUpStatus implements ArrayValuable<String> {
PICK_UP("PICK_UP", "已拣"),
ALREADY("ALREADY", "已发货"),
;
......
......@@ -131,7 +131,7 @@ public class ErpPurchaseInServiceImpl implements ErpPurchaseInService {
}
private void calculateTotalPrice(ErpPurchaseInDO purchaseIn, List<ErpPurchaseInItemDO> purchaseInItems) {
purchaseIn.setTotalCount(getSumValue(purchaseInItems, ErpPurchaseInItemDO::getCount, BigDecimal::add));
purchaseIn.setTotalCount(purchaseInItems.stream().mapToInt(ErpPurchaseInItemDO::getCount).sum());
purchaseIn.setTotalProductPrice(getSumValue(purchaseInItems, ErpPurchaseInItemDO::getTotalPrice, BigDecimal::add, BigDecimal.ZERO));
purchaseIn.setTotalTaxPrice(getSumValue(purchaseInItems, ErpPurchaseInItemDO::getTaxPrice, BigDecimal::add, BigDecimal.ZERO));
purchaseIn.setTotalPrice(purchaseIn.getTotalProductPrice().add(purchaseIn.getTotalTaxPrice()));
......@@ -180,9 +180,9 @@ public class ErpPurchaseInServiceImpl implements ErpPurchaseInService {
Integer bizType = approve ? ErpStockRecordBizTypeEnum.PURCHASE_IN.getType()
: ErpStockRecordBizTypeEnum.PURCHASE_IN_CANCEL.getType();
purchaseInItems.forEach(purchaseInItem -> {
BigDecimal count = approve ? purchaseInItem.getCount() : purchaseInItem.getCount().negate();
Integer count = approve ? purchaseInItem.getCount() : - purchaseInItem.getCount();
stockRecordService.createStockRecord(new ErpStockRecordCreateReqBO(
purchaseInItem.getProductId(), purchaseInItem.getWarehouseId(), count,
purchaseInItem.getProductId(), purchaseInItem.getWarehouseId(), BigDecimal.valueOf(count),
bizType, purchaseInItem.getInId(), purchaseInItem.getId(), purchaseIn.getNo()));
});
}
......@@ -207,7 +207,7 @@ public class ErpPurchaseInServiceImpl implements ErpPurchaseInService {
// 2. 转化为 ErpPurchaseInItemDO 列表
return convertList(list, o -> BeanUtils.toBean(o, ErpPurchaseInItemDO.class, item -> {
// item.setProductUnitId(productMap.get(item.getProductId()).getUnitId());
item.setTotalPrice(MoneyUtils.priceMultiply(item.getProductPrice(), item.getCount()));
item.setTotalPrice(BigDecimal.valueOf(item.getProductPrice() * item.getCount()));
if (item.getTotalPrice() == null) {
return;
}
......
......@@ -8,11 +8,13 @@ import cn.iocoder.foodnexus.framework.common.util.number.MoneyUtils;
import cn.iocoder.foodnexus.framework.common.util.object.BeanUtils;
import cn.iocoder.foodnexus.module.erp.api.PurchaseOrderSplitEvent;
import cn.iocoder.foodnexus.module.erp.api.enums.ErpDeliveryStatus;
import cn.iocoder.foodnexus.module.erp.controller.admin.purchase.vo.in.ErpPurchaseInSaveReqVO;
import cn.iocoder.foodnexus.module.erp.controller.admin.purchase.vo.order.ErpPurchaseOrderPageReqVO;
import cn.iocoder.foodnexus.module.erp.controller.admin.purchase.vo.order.ErpPurchaseOrderSaveReqVO;
import cn.iocoder.foodnexus.module.erp.dal.dataobject.product.ErpProductDO;
import cn.iocoder.foodnexus.module.erp.dal.dataobject.purchase.ErpPurchaseOrderDO;
import cn.iocoder.foodnexus.module.erp.dal.dataobject.purchase.ErpPurchaseOrderItemDO;
import cn.iocoder.foodnexus.module.erp.dal.dataobject.sale.ErpSaleOrderItemDO;
import cn.iocoder.foodnexus.module.erp.dal.mysql.purchase.ErpPurchaseOrderItemMapper;
import cn.iocoder.foodnexus.module.erp.dal.mysql.purchase.ErpPurchaseOrderMapper;
import cn.iocoder.foodnexus.module.erp.dal.redis.no.ErpNoRedisDAO;
......@@ -38,6 +40,7 @@ import org.springframework.transaction.event.TransactionalEventListener;
import org.springframework.validation.annotation.Validated;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.*;
import static cn.iocoder.foodnexus.framework.common.exception.util.ServiceExceptionUtil.exception;
......@@ -61,6 +64,9 @@ public class ErpPurchaseOrderServiceImpl implements ErpPurchaseOrderService {
@Resource
private ErpPurchaseOrderItemMapper purchaseOrderItemMapper;
@Autowired
private ErpPurchaseInService purchaseInService;
@Resource
private ErpNoRedisDAO noRedisDAO;
......@@ -355,6 +361,34 @@ public class ErpPurchaseOrderServiceImpl implements ErpPurchaseOrderService {
purchaseOrderMapper.update(Wrappers.<ErpPurchaseOrderDO>lambdaUpdate()
.set(ErpPurchaseOrderDO::getDeliveryStatus, updateStatus)
.in(ErpPurchaseOrderDO::getId, ids));
if (updateStatus.equals(ErpDeliveryStatus.ARRIVAL)) {
orderList.forEach(purchaseOrder -> {
// 新增采购入库单
ErpPurchaseInSaveReqVO inSaveReqVO = new ErpPurchaseInSaveReqVO();
inSaveReqVO.setInTime(LocalDateTime.now());
inSaveReqVO.setOrderId(purchaseOrder.getId());
inSaveReqVO.setFileUrl(purchaseOrder.getFileUrl());
inSaveReqVO.setRemark(purchaseOrder.getRemark());
List<ErpPurchaseOrderItemDO> purchaseOrderItems = purchaseOrderItemMapper.selectListByOrderId(purchaseOrder.getId());
inSaveReqVO.setItems(CommonUtil.listConvert(purchaseOrderItems, purchaseOrderItem ->
getItem(purchaseOrderItem, customerOrderApi.queryById(purchaseOrderItem.getCustomerOrderId()))));
purchaseInService.createPurchaseIn(inSaveReqVO);
});
}
}
private static ErpPurchaseInSaveReqVO.Item getItem(ErpPurchaseOrderItemDO purchaseOrderItemDO, CustomerOrderDTO customerOrder) {
ErpPurchaseInSaveReqVO.Item item = new ErpPurchaseInSaveReqVO.Item();
item.setOrderItemId(purchaseOrderItemDO.getId());
item.setWarehouseId(customerOrder.getWarehouseAreaId());
item.setProductId(purchaseOrderItemDO.getProductId());
item.setProductUnit(purchaseOrderItemDO.getProductUnit());
item.setProductPrice(purchaseOrderItemDO.getProductPrice());
item.setCount(purchaseOrderItemDO.getCount());
item.setTaxPercent(purchaseOrderItemDO.getTaxPercent());
item.setRemark(purchaseOrderItemDO.getRemark());
return item;
}
@Override
......
......@@ -114,5 +114,16 @@ public interface ErpSaleOrderService {
*/
boolean updateDeliveryStaff(Long id, Long deliveryStaffId);
/**
* 更新拣货
* @param id
* @param itemId
*/
void updatePickUp(Long id, Long itemId);
/**
* 配送
* @param id
*/
void delivery(Long id, Long deliveryStaffId);
}
\ No newline at end of file
......@@ -10,6 +10,7 @@ import cn.iocoder.foodnexus.module.erp.api.vo.warehouse.WarehouseInfo;
import cn.iocoder.foodnexus.module.erp.controller.admin.purchase.vo.in.ErpPurchaseInSaveReqVO;
import cn.iocoder.foodnexus.module.erp.controller.admin.sale.vo.order.ErpSaleOrderPageReqVO;
import cn.iocoder.foodnexus.module.erp.controller.admin.sale.vo.order.ErpSaleOrderSaveReqVO;
import cn.iocoder.foodnexus.module.erp.controller.admin.sale.vo.out.ErpSaleOutSaveReqVO;
import cn.iocoder.foodnexus.module.erp.dal.dataobject.product.ErpProductDO;
import cn.iocoder.foodnexus.module.erp.dal.dataobject.purchase.ErpPurchaseOrderDO;
import cn.iocoder.foodnexus.module.erp.dal.dataobject.sale.ErpSaleOrderDO;
......@@ -89,6 +90,9 @@ public class ErpSaleOrderServiceImpl implements ErpSaleOrderService {
@Autowired
private DeliveryStaffApi deliveryStaffApi;
@Autowired
private ErpSaleOutService saleOutService;
@Override
@Transactional(rollbackFor = Exception.class)
public Long createSaleOrder(ErpSaleOrderSaveReqVO createReqVO) {
......@@ -360,14 +364,7 @@ public class ErpSaleOrderServiceImpl implements ErpSaleOrderService {
.eq(ErpSaleOrderItemDO::getId, itemId));
// 插入采购入库单
ErpPurchaseInSaveReqVO inSaveReqVO = new ErpPurchaseInSaveReqVO();
inSaveReqVO.setInTime(LocalDateTime.now());
inSaveReqVO.setOrderId(saleOrder.getCustomerOrderId());
inSaveReqVO.setSaleOrderId(saleOrder.getId());
inSaveReqVO.setSaleOrderItemId(saleItemOrder.getId());
ErpPurchaseInSaveReqVO.Item item = getItem(saleItemOrder, customerOrder);
inSaveReqVO.setItems(CommonUtil.asList(item));
purchaseInService.createPurchaseIn(inSaveReqVO);
Long allCount = saleOrderItemMapper.selectCount(ErpSaleOrderItemDO::getOrderId, saleOrder.getId());
......@@ -375,6 +372,10 @@ public class ErpSaleOrderServiceImpl implements ErpSaleOrderService {
.eq(ErpSaleOrderItemDO::getOrderId, saleOrder.getId())
.eq(ErpSaleOrderItemDO::getPickUpStatus, SaleOrderPickUpStatus.PICK_UP.getType()));
if (allCount > 0 && Objects.equals(pickUpCount, allCount)) {
saleOrderMapper.update(Wrappers.<ErpSaleOrderDO>lambdaUpdate()
.set(ErpSaleOrderDO::getPickUpStatus, SaleOrderPickUpStatus.PICK_UP.getType())
.eq(ErpSaleOrderDO::getId, saleOrder.getId()));
String deliveryName = deliveryStaffApi.queryNameByStaffId(saleOrder.getDeliveryStaffId());
String warehouseName = Optional.ofNullable(customerOrder.getWarehouseInfo()).map(WarehouseInfo::getName).orElse("");
ErpPurchaseOrderDO purchaseOrder = purchaseOrderService.getPurchaseOrder(saleItemOrder.getPurchaseOrderId());
......@@ -388,17 +389,46 @@ public class ErpSaleOrderServiceImpl implements ErpSaleOrderService {
}
private static ErpPurchaseInSaveReqVO.Item getItem(ErpSaleOrderItemDO saleItemOrder, CustomerOrderDTO customerOrder) {
ErpPurchaseInSaveReqVO.Item item = new ErpPurchaseInSaveReqVO.Item();
item.setOrderItemId(saleItemOrder.getPurchaseOrderId());
item.setWarehouseId(customerOrder.getWarehouseAreaId());
item.setProductId(saleItemOrder.getProductId());
item.setProductUnit(saleItemOrder.getProductUnit());
item.setProductPrice(saleItemOrder.getProductPrice());
item.setCount(saleItemOrder.getCount());
item.setTaxPercent(saleItemOrder.getTaxPercent());
item.setRemark(saleItemOrder.getRemark());
/**
* 配送
*
* @param id
*/
@Override
public void delivery(Long id, Long deliveryStaffId) {
ErpSaleOrderDO saleOrder = this.validateSaleOrder(id);
if (!SaleOrderPickUpStatus.PICK_UP.equals(saleOrder.getPickUpStatus())) {
throw exception(SALE_ORDER_PICKUP_STATUS_FAIL);
}
saleOrderMapper.update(Wrappers.<ErpSaleOrderDO>lambdaUpdate()
.set(ErpSaleOrderDO::getPickUpStatus, SaleOrderPickUpStatus.ALREADY.getType())
.set(ErpSaleOrderDO::getDeliveryStaffId, deliveryStaffId)
.eq(ErpSaleOrderDO::getId, saleOrder.getId()));
List<ErpSaleOrderItemDO> saleOrderItems = saleOrderItemMapper.selectListByOrderId(id);
// 新增销售出库单
ErpSaleOutSaveReqVO saleOutSaveReqVO = new ErpSaleOutSaveReqVO();
saleOutSaveReqVO.setSaleUserId(saleOrder.getSaleUserId());
saleOutSaveReqVO.setAccountId(saleOrder.getAccountId());
saleOutSaveReqVO.setOutTime(LocalDateTime.now());
saleOutSaveReqVO.setOrderId(saleOrder.getId());
saleOutSaveReqVO.setDiscountPercent(saleOrder.getDiscountPercent());
saleOutSaveReqVO.setFileUrl(saleOrder.getFileUrl());
saleOutSaveReqVO.setRemark(saleOrder.getRemark());
saleOutSaveReqVO.setItems(CommonUtil.listConvert(saleOrderItems, saleOrderItem -> {
ErpSaleOutSaveReqVO.Item item = new ErpSaleOutSaveReqVO.Item();
item.setOrderItemId(saleOrderItem.getId());
// item.setWarehouseId();
item.setProductId(saleOrderItem.getProductId());
item.setProductUnit(saleOrderItem.getProductUnit());
item.setProductPrice(saleOrderItem.getProductPrice());
item.setCount(saleOrderItem.getCount());
item.setTaxPercent(saleOrderItem.getTaxPercent());
item.setRemark(saleOrderItem.getRemark());
return item;
}));
saleOutService.createSaleOut(saleOutSaveReqVO);
}
}
......@@ -20,6 +20,8 @@ import cn.iocoder.foodnexus.module.erp.service.finance.ErpAccountService;
import cn.iocoder.foodnexus.module.erp.service.product.ErpProductService;
import cn.iocoder.foodnexus.module.erp.service.stock.ErpStockRecordService;
import cn.iocoder.foodnexus.module.erp.service.stock.bo.ErpStockRecordCreateReqBO;
import cn.iocoder.foodnexus.module.product.dal.dataobject.spu.ProductSpuDO;
import cn.iocoder.foodnexus.module.product.service.spu.ProductSpuService;
import cn.iocoder.foodnexus.module.system.api.user.AdminUserApi;
import jakarta.annotation.Resource;
import org.springframework.context.annotation.Lazy;
......@@ -57,7 +59,7 @@ public class ErpSaleOutServiceImpl implements ErpSaleOutService {
private ErpNoRedisDAO noRedisDAO;
@Resource
private ErpProductService productService;
private ProductSpuService productSpuService;
@Resource
@Lazy // 延迟加载,避免循环依赖
private ErpSaleOrderService saleOrderService;
......@@ -209,12 +211,10 @@ public class ErpSaleOutServiceImpl implements ErpSaleOutService {
private List<ErpSaleOutItemDO> validateSaleOutItems(List<ErpSaleOutSaveReqVO.Item> list) {
// 1. 校验产品存在
List<ErpProductDO> productList = productService.validProductList(
convertSet(list, ErpSaleOutSaveReqVO.Item::getProductId));
Map<Long, ErpProductDO> productMap = convertMap(productList, ErpProductDO::getId);
Map<Long, ProductSpuDO> productMap = productSpuService.getSpuMap(convertSet(list, ErpSaleOutSaveReqVO.Item::getProductId));
// 2. 转化为 ErpSaleOutItemDO 列表
return convertList(list, o -> BeanUtils.toBean(o, ErpSaleOutItemDO.class, item -> {
item.setProductUnitId(productMap.get(item.getProductId()).getUnitId());
item.setProductUnit(productMap.get(item.getProductId()).getUnitName());
item.setTotalPrice(MoneyUtils.priceMultiply(item.getProductPrice(), item.getCount()));
if (item.getTotalPrice() == null) {
return;
......
......@@ -152,4 +152,10 @@ public class DeliveryStaffServiceImpl implements DeliveryStaffService, DeliveryS
public String queryNameByStaffId(Long staffId) {
return Optional.ofNullable(deliveryStaffMapper.selectById(staffId)).map(DeliveryStaffDO::getName).orElse("");
}
@Override
public Long queryStaffIdByUserId(Long loginUserId) {
return Optional.ofNullable(deliveryStaffMapper.selectOne(DeliveryStaffDO::getUserId, loginUserId))
.map(DeliveryStaffDO::getId).orElse(null);
}
}
\ No newline at end of file
......@@ -9,4 +9,5 @@ public interface DeliveryStaffApi {
String queryNameByStaffId(Long staffId);
Long queryStaffIdByUserId(Long loginUserId);
}
package cn.iocoder.foodnexus.module.order.controller.app.delivery;
import cn.hutool.core.collection.CollUtil;
import cn.iocoder.foodnexus.framework.common.enums.UserSystemEnum;
import cn.iocoder.foodnexus.framework.common.pojo.CommonResult;
import cn.iocoder.foodnexus.framework.common.pojo.PageResult;
import cn.iocoder.foodnexus.framework.common.util.collection.MapUtils;
import cn.iocoder.foodnexus.framework.common.util.object.BeanUtils;
import cn.iocoder.foodnexus.framework.security.core.util.SecurityFrameworkUtils;
import cn.iocoder.foodnexus.module.erp.controller.admin.product.vo.product.ErpProductRespVO;
import cn.iocoder.foodnexus.module.erp.controller.admin.sale.vo.order.ErpSaleOrderPageReqVO;
import cn.iocoder.foodnexus.module.erp.controller.admin.sale.vo.order.ErpSaleOrderRespVO;
import cn.iocoder.foodnexus.module.erp.dal.dataobject.sale.ErpCustomerDO;
import cn.iocoder.foodnexus.module.erp.dal.dataobject.sale.ErpSaleOrderDO;
import cn.iocoder.foodnexus.module.erp.dal.dataobject.sale.ErpSaleOrderItemDO;
import cn.iocoder.foodnexus.module.erp.enums.SaleOrderPickUpStatus;
import cn.iocoder.foodnexus.module.erp.service.product.ErpProductService;
import cn.iocoder.foodnexus.module.erp.service.sale.ErpCustomerService;
import cn.iocoder.foodnexus.module.erp.service.sale.ErpSaleOrderService;
import cn.iocoder.foodnexus.module.order.api.DeliveryStaffApi;
import cn.iocoder.foodnexus.module.system.annotations.AppSystemAuth;
import cn.iocoder.foodnexus.module.system.api.user.AdminUserApi;
import cn.iocoder.foodnexus.module.system.api.user.dto.AdminUserRespDTO;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.annotation.Resource;
import jakarta.validation.Valid;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.*;
import java.util.List;
import java.util.Map;
import static cn.iocoder.foodnexus.framework.common.pojo.CommonResult.success;
import static cn.iocoder.foodnexus.framework.common.util.collection.CollectionUtils.convertMultiMap;
import static cn.iocoder.foodnexus.framework.common.util.collection.CollectionUtils.convertSet;
/**
* @author : yanghao
* create at: 2025/9/26 09:49
* @description: 订单 - 配送
*/
@Tag(name = "管理后台 - 订单 - 配送")
@Tag(name = "配送员 - 订单 - 配送")
@RestController
@RequestMapping("/delivery/order")
@Validated
@AppSystemAuth(UserSystemEnum.DELIVERY)
public class DeliveryOrderController {
@Autowired
private DeliveryStaffApi deliveryStaffApi;
@Autowired
private ErpSaleOrderService saleOrderService;
@Resource
private ErpProductService productService;
@Resource
private ErpCustomerService customerService;
@Resource
private AdminUserApi adminUserApi;
// 查询所有已拣销售订单
@GetMapping("/page")
@Operation(summary = "获得销售订单分页")
public CommonResult<PageResult<ErpSaleOrderRespVO>> getSaleOrderPage(@Valid ErpSaleOrderPageReqVO pageReqVO) {
pageReqVO.setDeliveryStaffId(deliveryStaffApi.queryStaffIdByUserId(SecurityFrameworkUtils.getLoginUserId()));
pageReqVO.setPickUpStatus(SaleOrderPickUpStatus.PICK_UP);
PageResult<ErpSaleOrderDO> pageResult = saleOrderService.getSaleOrderPage(pageReqVO);
return success(buildSaleOrderVOPageResult(pageResult));
}
// 配送订单,生成销售出库单
@PostMapping("/delivery")
@Operation(summary = "配送订单")
@Parameter(name = "id", description = "销售订单id", required = true)
public CommonResult<Boolean> delivery(@RequestParam("id") Long id) {
saleOrderService.delivery(id, deliveryStaffApi.queryStaffIdByUserId(SecurityFrameworkUtils.getLoginUserId()));
return success(Boolean.TRUE);
}
// 订单修改
private PageResult<ErpSaleOrderRespVO> buildSaleOrderVOPageResult(PageResult<ErpSaleOrderDO> pageResult) {
if (CollUtil.isEmpty(pageResult.getList())) {
return PageResult.empty(pageResult.getTotal());
}
// 1.1 订单项
List<ErpSaleOrderItemDO> saleOrderItemList = saleOrderService.getSaleOrderItemListByOrderIds(
convertSet(pageResult.getList(), ErpSaleOrderDO::getId));
Map<Long, List<ErpSaleOrderItemDO>> saleOrderItemMap = convertMultiMap(saleOrderItemList, ErpSaleOrderItemDO::getOrderId);
// 1.2 产品信息
Map<Long, ErpProductRespVO> productMap = productService.getProductVOMap(
convertSet(saleOrderItemList, ErpSaleOrderItemDO::getProductId));
// 1.3 客户信息
Map<Long, ErpCustomerDO> customerMap = customerService.getCustomerMap(
convertSet(pageResult.getList(), ErpSaleOrderDO::getCustomerId));
// 1.4 管理员信息
Map<Long, AdminUserRespDTO> userMap = adminUserApi.getUserMap(
convertSet(pageResult.getList(), saleOrder -> Long.parseLong(saleOrder.getCreator())));
// 2. 开始拼接
return BeanUtils.toBean(pageResult, ErpSaleOrderRespVO.class, saleOrder -> {
saleOrder.setItems(BeanUtils.toBean(saleOrderItemMap.get(saleOrder.getId()), ErpSaleOrderRespVO.Item.class,
item -> MapUtils.findAndThen(productMap, item.getProductId(), product -> item.setProductName(product.getName())
.setProductBarCode(product.getBarCode()).setProductUnitName(product.getUnitName()))));
saleOrder.setProductNames(CollUtil.join(saleOrder.getItems(), ",", ErpSaleOrderRespVO.Item::getProductName));
MapUtils.findAndThen(customerMap, saleOrder.getCustomerId(), supplier -> saleOrder.setCustomerName(supplier.getName()));
MapUtils.findAndThen(userMap, Long.parseLong(saleOrder.getCreator()), user -> saleOrder.setCreatorName(user.getNickname()));
});
}
}
......@@ -75,9 +75,9 @@ public class DeptController {
@GetMapping(value = {"/list-all-simple", "/simple-list"})
@Operation(summary = "获取部门精简信息列表", description = "只包含被开启的部门,主要用于前端的下拉选项")
public CommonResult<List<DeptSimpleRespVO>> getSimpleDeptList() {
public CommonResult<List<DeptSimpleRespVO>> getSimpleDeptList(@RequestParam(value = "userSystem", required = false) String userSystem) {
List<DeptDO> list = deptService.getDeptList(
new DeptListReqVO().setStatus(CommonStatusEnum.ENABLE.getStatus()));
new DeptListReqVO().setUserSystem(userSystem).setStatus(CommonStatusEnum.ENABLE.getStatus()));
return success(BeanUtils.toBean(list, DeptSimpleRespVO.class));
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment