Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
F
foodNexus-admin
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
副食品筹措管理平台
foodNexus-admin
Commits
46cd642f
Commit
46cd642f
authored
Sep 29, 2025
by
杨浩
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
客户订单签收
parent
8dc06376
Hide whitespace changes
Inline
Side-by-side
Showing
41 changed files
with
596 additions
and
156 deletions
+596
-156
foodnexus-module-erp/src/main/java/cn/iocoder/foodnexus/module/erp/controller/admin/purchase/ErpPurchaseInController.java
+8
-5
foodnexus-module-erp/src/main/java/cn/iocoder/foodnexus/module/erp/controller/admin/purchase/ErpPurchaseOrderController.java
+13
-8
foodnexus-module-erp/src/main/java/cn/iocoder/foodnexus/module/erp/controller/admin/purchase/vo/in/ErpPurchaseInRespVO.java
+0
-6
foodnexus-module-erp/src/main/java/cn/iocoder/foodnexus/module/erp/controller/admin/purchase/vo/in/ErpPurchaseInSaveReqVO.java
+0
-6
foodnexus-module-erp/src/main/java/cn/iocoder/foodnexus/module/erp/controller/admin/sale/ErpSaleOrderController.java
+7
-5
foodnexus-module-erp/src/main/java/cn/iocoder/foodnexus/module/erp/controller/admin/sale/ErpSaleOutController.java
+7
-5
foodnexus-module-erp/src/main/java/cn/iocoder/foodnexus/module/erp/controller/admin/sale/vo/order/ErpSaleOrderRespVO.java
+4
-4
foodnexus-module-erp/src/main/java/cn/iocoder/foodnexus/module/erp/controller/admin/sale/vo/order/ErpSaleOrderSaveReqVO.java
+2
-2
foodnexus-module-erp/src/main/java/cn/iocoder/foodnexus/module/erp/controller/admin/sale/vo/out/ErpSaleOutRespVO.java
+26
-3
foodnexus-module-erp/src/main/java/cn/iocoder/foodnexus/module/erp/controller/admin/sale/vo/out/ErpSaleOutSaveReqVO.java
+25
-2
foodnexus-module-erp/src/main/java/cn/iocoder/foodnexus/module/erp/dal/dataobject/purchase/ErpPurchaseInDO.java
+2
-13
foodnexus-module-erp/src/main/java/cn/iocoder/foodnexus/module/erp/dal/dataobject/purchase/ErpPurchaseInItemDO.java
+1
-1
foodnexus-module-erp/src/main/java/cn/iocoder/foodnexus/module/erp/dal/dataobject/sale/ErpSaleOrderDO.java
+3
-3
foodnexus-module-erp/src/main/java/cn/iocoder/foodnexus/module/erp/dal/dataobject/sale/ErpSaleOrderItemDO.java
+3
-3
foodnexus-module-erp/src/main/java/cn/iocoder/foodnexus/module/erp/dal/dataobject/sale/ErpSaleOutDO.java
+43
-4
foodnexus-module-erp/src/main/java/cn/iocoder/foodnexus/module/erp/dal/dataobject/sale/ErpSaleOutItemDO.java
+16
-8
foodnexus-module-erp/src/main/java/cn/iocoder/foodnexus/module/erp/enums/SaleOrderPickUpStatus.java
+2
-0
foodnexus-module-erp/src/main/java/cn/iocoder/foodnexus/module/erp/service/finance/ErpFinancePaymentServiceImpl.java
+1
-1
foodnexus-module-erp/src/main/java/cn/iocoder/foodnexus/module/erp/service/finance/ErpFinanceReceiptServiceImpl.java
+1
-1
foodnexus-module-erp/src/main/java/cn/iocoder/foodnexus/module/erp/service/purchase/ErpPurchaseInServiceImpl.java
+14
-15
foodnexus-module-erp/src/main/java/cn/iocoder/foodnexus/module/erp/service/purchase/ErpPurchaseOrderServiceImpl.java
+0
-1
foodnexus-module-erp/src/main/java/cn/iocoder/foodnexus/module/erp/service/sale/ErpSaleOrderService.java
+9
-1
foodnexus-module-erp/src/main/java/cn/iocoder/foodnexus/module/erp/service/sale/ErpSaleOrderServiceImpl.java
+91
-21
foodnexus-module-erp/src/main/java/cn/iocoder/foodnexus/module/erp/service/sale/ErpSaleOutService.java
+2
-0
foodnexus-module-erp/src/main/java/cn/iocoder/foodnexus/module/erp/service/sale/ErpSaleOutServiceImpl.java
+14
-12
foodnexus-module-mall/foodnexus-module-operations/src/main/java/cn/iocoder/foodnexus/module/operations/service/deliverystaff/DeliveryStaffServiceImpl.java
+7
-0
foodnexus-module-mall/foodnexus-module-order-api/src/main/java/cn/iocoder/foodnexus/module/order/api/DeliveryStaffApi.java
+4
-0
foodnexus-module-mall/foodnexus-module-order-api/src/main/java/cn/iocoder/foodnexus/module/order/dto/DeliveryOrderUpdateReqVO.java
+58
-0
foodnexus-module-mall/foodnexus-module-order-api/src/main/java/cn/iocoder/foodnexus/module/order/dto/DeliveryStaffSimpleInfo.java
+27
-0
foodnexus-module-mall/foodnexus-module-order-api/src/main/java/cn/iocoder/foodnexus/module/order/enums/CustomerOrderStatus.java
+1
-1
foodnexus-module-mall/foodnexus-module-order/src/main/java/cn/iocoder/foodnexus/module/order/controller/admin/customerorderitem/vo/CustomerOrderItemRespVO.java
+5
-0
foodnexus-module-mall/foodnexus-module-order/src/main/java/cn/iocoder/foodnexus/module/order/controller/app/customerOrder/AppCustomerOrderController.java
+12
-9
foodnexus-module-mall/foodnexus-module-order/src/main/java/cn/iocoder/foodnexus/module/order/controller/app/customerOrder/vo/AppCustomerOrderReceiptRespVO.java
+31
-0
foodnexus-module-mall/foodnexus-module-order/src/main/java/cn/iocoder/foodnexus/module/order/controller/app/delivery/DeliveryOrderController.java
+12
-5
foodnexus-module-mall/foodnexus-module-order/src/main/java/cn/iocoder/foodnexus/module/order/dal/dataobject/customerorderitem/CustomerOrderItemDO.java
+7
-0
foodnexus-module-mall/foodnexus-module-order/src/main/java/cn/iocoder/foodnexus/module/order/enums/ErrorCodeConstants.java
+2
-0
foodnexus-module-mall/foodnexus-module-order/src/main/java/cn/iocoder/foodnexus/module/order/service/customerorder/CustomerOrderService.java
+4
-0
foodnexus-module-mall/foodnexus-module-order/src/main/java/cn/iocoder/foodnexus/module/order/service/customerorder/CustomerOrderServiceImpl.java
+99
-10
foodnexus-module-mall/foodnexus-module-order/src/main/java/cn/iocoder/foodnexus/module/order/service/customerorderrecord/CustomerOrderRecordServiceImpl.java
+7
-1
foodnexus-module-mall/foodnexus-module-product/src/main/java/cn/iocoder/foodnexus/module/product/service/spu/ProductSpuService.java
+7
-0
foodnexus-module-mall/foodnexus-module-product/src/main/java/cn/iocoder/foodnexus/module/product/service/spu/ProductSpuServiceImpl.java
+19
-0
No files found.
foodnexus-module-erp/src/main/java/cn/iocoder/foodnexus/module/erp/controller/admin/purchase/ErpPurchaseInController.java
View file @
46cd642f
...
...
@@ -20,6 +20,9 @@ import cn.iocoder.foodnexus.module.erp.service.product.ErpProductService;
import
cn.iocoder.foodnexus.module.erp.service.purchase.ErpPurchaseInService
;
import
cn.iocoder.foodnexus.module.erp.service.purchase.ErpSupplierService
;
import
cn.iocoder.foodnexus.module.erp.service.stock.ErpStockService
;
import
cn.iocoder.foodnexus.module.product.api.ProductSpuApi
;
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
cn.iocoder.foodnexus.module.system.api.user.dto.AdminUserRespDTO
;
import
io.swagger.v3.oas.annotations.Operation
;
...
...
@@ -53,7 +56,7 @@ public class ErpPurchaseInController {
@Resource
private
ErpStockService
stockService
;
@Resource
private
ErpProduct
Service
productService
;
private
ProductSpu
Service
productService
;
@Resource
private
ErpSupplierService
supplierService
;
...
...
@@ -103,14 +106,14 @@ public class ErpPurchaseInController {
return
success
(
null
);
}
List
<
ErpPurchaseInItemDO
>
purchaseInItemList
=
purchaseInService
.
getPurchaseInItemListByInId
(
id
);
Map
<
Long
,
ErpProductRespVO
>
productMap
=
productService
.
getProductVO
Map
(
Map
<
Long
,
ProductSpuDO
>
productMap
=
productService
.
getSpu
Map
(
convertSet
(
purchaseInItemList
,
ErpPurchaseInItemDO:
:
getProductId
));
return
success
(
BeanUtils
.
toBean
(
purchaseIn
,
ErpPurchaseInRespVO
.
class
,
purchaseInVO
->
purchaseInVO
.
setItems
(
BeanUtils
.
toBean
(
purchaseInItemList
,
ErpPurchaseInRespVO
.
Item
.
class
,
item
->
{
ErpStockDO
stock
=
stockService
.
getStock
(
item
.
getProductId
(),
item
.
getWarehouseId
());
item
.
setStockCount
(
stock
!=
null
?
stock
.
getCount
()
:
BigDecimal
.
ZERO
);
MapUtils
.
findAndThen
(
productMap
,
item
.
getProductId
(),
product
->
item
.
setProductName
(
product
.
getName
())
.
setProduct
BarCode
(
product
.
getBarCode
()).
setProduct
UnitName
(
product
.
getUnitName
()));
.
setProductUnitName
(
product
.
getUnitName
()));
}))));
}
...
...
@@ -143,7 +146,7 @@ public class ErpPurchaseInController {
convertSet
(
pageResult
.
getList
(),
ErpPurchaseInDO:
:
getId
));
Map
<
Long
,
List
<
ErpPurchaseInItemDO
>>
purchaseInItemMap
=
convertMultiMap
(
purchaseInItemList
,
ErpPurchaseInItemDO:
:
getInId
);
// 1.2 产品信息
Map
<
Long
,
ErpProductRespVO
>
productMap
=
productService
.
getProductVO
Map
(
Map
<
Long
,
ProductSpuDO
>
productMap
=
productService
.
getSpu
Map
(
convertSet
(
purchaseInItemList
,
ErpPurchaseInItemDO:
:
getProductId
));
// 1.3 供应商信息
Map
<
Long
,
ErpSupplierDO
>
supplierMap
=
supplierService
.
getSupplierMap
(
...
...
@@ -155,7 +158,7 @@ public class ErpPurchaseInController {
return
BeanUtils
.
toBean
(
pageResult
,
ErpPurchaseInRespVO
.
class
,
purchaseIn
->
{
purchaseIn
.
setItems
(
BeanUtils
.
toBean
(
purchaseInItemMap
.
get
(
purchaseIn
.
getId
()),
ErpPurchaseInRespVO
.
Item
.
class
,
item
->
MapUtils
.
findAndThen
(
productMap
,
item
.
getProductId
(),
product
->
item
.
setProductName
(
product
.
getName
())
.
setProduct
BarCode
(
product
.
getBarCode
()).
setProduct
UnitName
(
product
.
getUnitName
()))));
.
setProductUnitName
(
product
.
getUnitName
()))));
purchaseIn
.
setProductNames
(
CollUtil
.
join
(
purchaseIn
.
getItems
(),
","
,
ErpPurchaseInRespVO
.
Item
::
getProductName
));
MapUtils
.
findAndThen
(
supplierMap
,
purchaseIn
.
getSupplierId
(),
supplier
->
purchaseIn
.
setSupplierName
(
supplier
.
getName
()));
MapUtils
.
findAndThen
(
userMap
,
Long
.
parseLong
(
purchaseIn
.
getCreator
()),
user
->
purchaseIn
.
setCreatorName
(
user
.
getNickname
()));
...
...
foodnexus-module-erp/src/main/java/cn/iocoder/foodnexus/module/erp/controller/admin/purchase/ErpPurchaseOrderController.java
View file @
46cd642f
...
...
@@ -19,6 +19,8 @@ import cn.iocoder.foodnexus.module.erp.service.product.ErpProductService;
import
cn.iocoder.foodnexus.module.erp.service.purchase.ErpPurchaseOrderService
;
import
cn.iocoder.foodnexus.module.erp.service.purchase.ErpSupplierService
;
import
cn.iocoder.foodnexus.module.erp.service.stock.ErpStockService
;
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
cn.iocoder.foodnexus.module.system.api.user.dto.AdminUserRespDTO
;
import
io.swagger.v3.oas.annotations.Operation
;
...
...
@@ -27,6 +29,7 @@ import io.swagger.v3.oas.annotations.tags.Tag;
import
jakarta.annotation.Resource
;
import
jakarta.servlet.http.HttpServletResponse
;
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.*
;
...
...
@@ -53,6 +56,8 @@ public class ErpPurchaseOrderController {
private
ErpStockService
stockService
;
@Resource
private
ErpSupplierService
supplierService
;
@Autowired
private
ProductSpuService
productService
;
@Resource
private
AdminUserApi
adminUserApi
;
...
...
@@ -100,14 +105,14 @@ public class ErpPurchaseOrderController {
return
success
(
null
);
}
List
<
ErpPurchaseOrderItemDO
>
purchaseOrderItemList
=
purchaseOrderService
.
getPurchaseOrderItemListByOrderId
(
id
);
/*Map<Long, ErpProductRespV
O> productMap = productService.getProductVOMap(
convertSet(purchaseOrderItemList, ErpPurchaseOrderItemDO::getProductId));
*/
Map
<
Long
,
ProductSpuD
O
>
productMap
=
productService
.
getProductVOMap
(
convertSet
(
purchaseOrderItemList
,
ErpPurchaseOrderItemDO:
:
getProductId
));
return
success
(
BeanUtils
.
toBean
(
purchaseOrder
,
ErpPurchaseOrderRespVO
.
class
,
purchaseOrderVO
->
purchaseOrderVO
.
setItems
(
BeanUtils
.
toBean
(
purchaseOrderItemList
,
ErpPurchaseOrderRespVO
.
Item
.
class
,
item
->
{
BigDecimal
purchaseCount
=
stockService
.
getStockCount
(
item
.
getProductId
());
item
.
setStockCount
(
purchaseCount
!=
null
?
purchaseCount
:
BigDecimal
.
ZERO
);
/*
MapUtils.findAndThen(productMap, item.getProductId(), product -> item.setProductName(product.getName())
.setProduct
BarCode(product.getBarCode()).setProductUnitName(product.getUnitName()));*/
MapUtils
.
findAndThen
(
productMap
,
item
.
getProductId
(),
product
->
item
.
setProductName
(
product
.
getName
())
.
setProduct
UnitName
(
product
.
getUnitName
()));
}))));
}
...
...
@@ -140,8 +145,8 @@ public class ErpPurchaseOrderController {
convertSet
(
pageResult
.
getList
(),
ErpPurchaseOrderDO:
:
getId
));
Map
<
Long
,
List
<
ErpPurchaseOrderItemDO
>>
purchaseOrderItemMap
=
convertMultiMap
(
purchaseOrderItemList
,
ErpPurchaseOrderItemDO:
:
getOrderId
);
// 1.2 产品信息
/*Map<Long, ErpProductRespV
O> productMap = productService.getProductVOMap(
convertSet(purchaseOrderItemList, ErpPurchaseOrderItemDO::getProductId));
*/
Map
<
Long
,
ProductSpuD
O
>
productMap
=
productService
.
getProductVOMap
(
convertSet
(
purchaseOrderItemList
,
ErpPurchaseOrderItemDO:
:
getProductId
));
// 1.3 供应商信息
Map
<
Long
,
ErpSupplierDO
>
supplierMap
=
supplierService
.
getSupplierMap
(
convertSet
(
pageResult
.
getList
(),
ErpPurchaseOrderDO:
:
getSupplierId
));
...
...
@@ -151,9 +156,9 @@ public class ErpPurchaseOrderController {
// 2. 开始拼接
return
BeanUtils
.
toBean
(
pageResult
,
ErpPurchaseOrderRespVO
.
class
,
purchaseOrder
->
{
purchaseOrder
.
setItems
(
BeanUtils
.
toBean
(
purchaseOrderItemMap
.
get
(
purchaseOrder
.
getId
()),
ErpPurchaseOrderRespVO
.
Item
.
class
/*
,
,
item
->
MapUtils
.
findAndThen
(
productMap
,
item
.
getProductId
(),
product
->
item
.
setProductName
(
product
.
getName
())
.setProduct
BarCode(product.getBarCode()).setProductUnitName(product.getUnitName()))*/
));
.
setProduct
UnitName
(
product
.
getUnitName
()))
));
purchaseOrder
.
setProductNames
(
CollUtil
.
join
(
purchaseOrder
.
getItems
(),
","
,
ErpPurchaseOrderRespVO
.
Item
::
getProductName
));
MapUtils
.
findAndThen
(
supplierMap
,
purchaseOrder
.
getSupplierId
(),
supplier
->
purchaseOrder
.
setSupplierName
(
supplier
.
getName
()));
MapUtils
.
findAndThen
(
userMap
,
Long
.
parseLong
(
purchaseOrder
.
getCreator
()),
user
->
purchaseOrder
.
setCreatorName
(
user
.
getNickname
()));
...
...
foodnexus-module-erp/src/main/java/cn/iocoder/foodnexus/module/erp/controller/admin/purchase/vo/in/ErpPurchaseInRespVO.java
View file @
46cd642f
...
...
@@ -94,12 +94,6 @@ public class ErpPurchaseInRespVO {
@ExcelProperty
(
"产品信息"
)
private
String
productNames
;
@Schema
(
description
=
"销售订单"
)
private
Long
saleOrderId
;
@Schema
(
description
=
"销售子订单"
)
private
Long
saleOrderItemId
;
@Data
public
static
class
Item
{
...
...
foodnexus-module-erp/src/main/java/cn/iocoder/foodnexus/module/erp/controller/admin/purchase/vo/in/ErpPurchaseInSaveReqVO.java
View file @
46cd642f
...
...
@@ -37,12 +37,6 @@ public class ErpPurchaseInSaveReqVO {
@Schema
(
description
=
"备注"
,
example
=
"你猜"
)
private
String
remark
;
@Schema
(
description
=
"销售订单"
)
private
Long
saleOrderId
;
@Schema
(
description
=
"销售子订单"
)
private
Long
saleOrderItemId
;
@Schema
(
description
=
"入库清单列表"
)
private
List
<
Item
>
items
;
...
...
foodnexus-module-erp/src/main/java/cn/iocoder/foodnexus/module/erp/controller/admin/sale/ErpSaleOrderController.java
View file @
46cd642f
...
...
@@ -19,6 +19,8 @@ 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.erp.service.stock.ErpStockService
;
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
cn.iocoder.foodnexus.module.system.api.user.dto.AdminUserRespDTO
;
import
io.swagger.v3.oas.annotations.Operation
;
...
...
@@ -52,7 +54,7 @@ public class ErpSaleOrderController {
@Resource
private
ErpStockService
stockService
;
@Resource
private
ErpProduct
Service
productService
;
private
ProductSpu
Service
productService
;
@Resource
private
ErpCustomerService
customerService
;
...
...
@@ -120,14 +122,14 @@ public class ErpSaleOrderController {
return
success
(
null
);
}
List
<
ErpSaleOrderItemDO
>
saleOrderItemList
=
saleOrderService
.
getSaleOrderItemListByOrderId
(
id
);
Map
<
Long
,
ErpProductRespV
O
>
productMap
=
productService
.
getProductVOMap
(
Map
<
Long
,
ProductSpuD
O
>
productMap
=
productService
.
getProductVOMap
(
convertSet
(
saleOrderItemList
,
ErpSaleOrderItemDO:
:
getProductId
));
return
success
(
BeanUtils
.
toBean
(
saleOrder
,
ErpSaleOrderRespVO
.
class
,
saleOrderVO
->
saleOrderVO
.
setItems
(
BeanUtils
.
toBean
(
saleOrderItemList
,
ErpSaleOrderRespVO
.
Item
.
class
,
item
->
{
BigDecimal
stockCount
=
stockService
.
getStockCount
(
item
.
getProductId
());
item
.
setStockCount
(
stockCount
!=
null
?
stockCount
:
BigDecimal
.
ZERO
);
MapUtils
.
findAndThen
(
productMap
,
item
.
getProductId
(),
product
->
item
.
setProductName
(
product
.
getName
())
.
setProduct
BarCode
(
product
.
getBarCode
()).
setProduct
UnitName
(
product
.
getUnitName
()));
.
setProductUnitName
(
product
.
getUnitName
()));
}))));
}
...
...
@@ -160,7 +162,7 @@ public class ErpSaleOrderController {
convertSet
(
pageResult
.
getList
(),
ErpSaleOrderDO:
:
getId
));
Map
<
Long
,
List
<
ErpSaleOrderItemDO
>>
saleOrderItemMap
=
convertMultiMap
(
saleOrderItemList
,
ErpSaleOrderItemDO:
:
getOrderId
);
// 1.2 产品信息
Map
<
Long
,
ErpProductRespV
O
>
productMap
=
productService
.
getProductVOMap
(
Map
<
Long
,
ProductSpuD
O
>
productMap
=
productService
.
getProductVOMap
(
convertSet
(
saleOrderItemList
,
ErpSaleOrderItemDO:
:
getProductId
));
// 1.3 客户信息
Map
<
Long
,
ErpCustomerDO
>
customerMap
=
customerService
.
getCustomerMap
(
...
...
@@ -172,7 +174,7 @@ public class ErpSaleOrderController {
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
())
.
setProduct
BarCode
(
product
.
getBarCode
()).
setProduct
UnitName
(
product
.
getUnitName
()))));
.
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
()));
...
...
foodnexus-module-erp/src/main/java/cn/iocoder/foodnexus/module/erp/controller/admin/sale/ErpSaleOutController.java
View file @
46cd642f
...
...
@@ -20,6 +20,8 @@ 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.ErpSaleOutService
;
import
cn.iocoder.foodnexus.module.erp.service.stock.ErpStockService
;
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
cn.iocoder.foodnexus.module.system.api.user.dto.AdminUserRespDTO
;
import
io.swagger.v3.oas.annotations.Operation
;
...
...
@@ -53,7 +55,7 @@ public class ErpSaleOutController {
@Resource
private
ErpStockService
stockService
;
@Resource
private
ErpProduct
Service
productService
;
private
ProductSpu
Service
productService
;
@Resource
private
ErpCustomerService
customerService
;
...
...
@@ -103,14 +105,14 @@ public class ErpSaleOutController {
return
success
(
null
);
}
List
<
ErpSaleOutItemDO
>
saleOutItemList
=
saleOutService
.
getSaleOutItemListByOutId
(
id
);
Map
<
Long
,
ErpProductRespV
O
>
productMap
=
productService
.
getProductVOMap
(
Map
<
Long
,
ProductSpuD
O
>
productMap
=
productService
.
getProductVOMap
(
convertSet
(
saleOutItemList
,
ErpSaleOutItemDO:
:
getProductId
));
return
success
(
BeanUtils
.
toBean
(
saleOut
,
ErpSaleOutRespVO
.
class
,
saleOutVO
->
saleOutVO
.
setItems
(
BeanUtils
.
toBean
(
saleOutItemList
,
ErpSaleOutRespVO
.
Item
.
class
,
item
->
{
ErpStockDO
stock
=
stockService
.
getStock
(
item
.
getProductId
(),
item
.
getWarehouseId
());
item
.
setStockCount
(
stock
!=
null
?
stock
.
getCount
()
:
BigDecimal
.
ZERO
);
MapUtils
.
findAndThen
(
productMap
,
item
.
getProductId
(),
product
->
item
.
setProductName
(
product
.
getName
())
.
setProduct
BarCode
(
product
.
getBarCode
()).
setProduct
UnitName
(
product
.
getUnitName
()));
.
setProductUnitName
(
product
.
getUnitName
()));
}))));
}
...
...
@@ -143,7 +145,7 @@ public class ErpSaleOutController {
convertSet
(
pageResult
.
getList
(),
ErpSaleOutDO:
:
getId
));
Map
<
Long
,
List
<
ErpSaleOutItemDO
>>
saleOutItemMap
=
convertMultiMap
(
saleOutItemList
,
ErpSaleOutItemDO:
:
getOutId
);
// 1.2 产品信息
Map
<
Long
,
ErpProductRespV
O
>
productMap
=
productService
.
getProductVOMap
(
Map
<
Long
,
ProductSpuD
O
>
productMap
=
productService
.
getProductVOMap
(
convertSet
(
saleOutItemList
,
ErpSaleOutItemDO:
:
getProductId
));
// 1.3 客户信息
Map
<
Long
,
ErpCustomerDO
>
customerMap
=
customerService
.
getCustomerMap
(
...
...
@@ -155,7 +157,7 @@ public class ErpSaleOutController {
return
BeanUtils
.
toBean
(
pageResult
,
ErpSaleOutRespVO
.
class
,
saleOut
->
{
saleOut
.
setItems
(
BeanUtils
.
toBean
(
saleOutItemMap
.
get
(
saleOut
.
getId
()),
ErpSaleOutRespVO
.
Item
.
class
,
item
->
MapUtils
.
findAndThen
(
productMap
,
item
.
getProductId
(),
product
->
item
.
setProductName
(
product
.
getName
())
.
setProduct
BarCode
(
product
.
getBarCode
()).
setProduct
UnitName
(
product
.
getUnitName
()))));
.
setProductUnitName
(
product
.
getUnitName
()))));
saleOut
.
setProductNames
(
CollUtil
.
join
(
saleOut
.
getItems
(),
","
,
ErpSaleOutRespVO
.
Item
::
getProductName
));
MapUtils
.
findAndThen
(
customerMap
,
saleOut
.
getCustomerId
(),
supplier
->
saleOut
.
setCustomerName
(
supplier
.
getName
()));
MapUtils
.
findAndThen
(
userMap
,
Long
.
parseLong
(
saleOut
.
getCreator
()),
user
->
saleOut
.
setCreatorName
(
user
.
getNickname
()));
...
...
foodnexus-module-erp/src/main/java/cn/iocoder/foodnexus/module/erp/controller/admin/sale/vo/order/ErpSaleOrderRespVO.java
View file @
46cd642f
...
...
@@ -51,10 +51,10 @@ public class ErpSaleOrderRespVO {
@Schema
(
description
=
"合计数量"
,
requiredMode
=
Schema
.
RequiredMode
.
REQUIRED
,
example
=
"15663"
)
@ExcelProperty
(
"合计数量"
)
private
BigDecimal
totalCount
;
private
Integer
totalCount
;
@Schema
(
description
=
"最终合计价格"
,
requiredMode
=
Schema
.
RequiredMode
.
REQUIRED
,
example
=
"24906"
)
@ExcelProperty
(
"最终合计价格"
)
private
BigDecimal
totalPrice
;
private
Integer
totalPrice
;
@Schema
(
description
=
"合计产品价格,单位:元"
,
requiredMode
=
Schema
.
RequiredMode
.
REQUIRED
,
example
=
"7127"
)
private
BigDecimal
totalProductPrice
;
...
...
@@ -140,11 +140,11 @@ public class ErpSaleOrderRespVO {
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
;
...
...
foodnexus-module-erp/src/main/java/cn/iocoder/foodnexus/module/erp/controller/admin/sale/vo/order/ErpSaleOrderSaveReqVO.java
View file @
46cd642f
...
...
@@ -84,11 +84,11 @@ public class ErpSaleOrderSaveReqVO {
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
;
...
...
foodnexus-module-erp/src/main/java/cn/iocoder/foodnexus/module/erp/controller/admin/sale/vo/out/ErpSaleOutRespVO.java
View file @
46cd642f
...
...
@@ -2,6 +2,10 @@ package cn.iocoder.foodnexus.module.erp.controller.admin.sale.vo.out;
import
cn.idev.excel.annotation.ExcelIgnoreUnannotated
;
import
cn.idev.excel.annotation.ExcelProperty
;
import
cn.iocoder.foodnexus.module.order.dto.CustomerAddressInfo
;
import
cn.iocoder.foodnexus.module.order.enums.DeliveryMode
;
import
com.baomidou.mybatisplus.annotation.TableField
;
import
com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler
;
import
io.swagger.v3.oas.annotations.media.Schema
;
import
jakarta.validation.constraints.NotNull
;
import
lombok.Data
;
...
...
@@ -51,10 +55,10 @@ public class ErpSaleOutRespVO {
@Schema
(
description
=
"合计数量"
,
requiredMode
=
Schema
.
RequiredMode
.
REQUIRED
,
example
=
"15663"
)
@ExcelProperty
(
"合计数量"
)
private
BigDecimal
totalC
ount
;
private
Integer
c
ount
;
@Schema
(
description
=
"最终合计价格"
,
requiredMode
=
Schema
.
RequiredMode
.
REQUIRED
,
example
=
"24906"
)
@ExcelProperty
(
"最终合计价格"
)
private
BigDecimal
totalPrice
;
private
Integer
totalPrice
;
@Schema
(
description
=
"已收款金额,单位:元"
,
requiredMode
=
Schema
.
RequiredMode
.
REQUIRED
,
example
=
"7127"
)
private
BigDecimal
receiptPrice
;
...
...
@@ -97,6 +101,25 @@ public class ErpSaleOutRespVO {
@ExcelProperty
(
"产品信息"
)
private
String
productNames
;
@Schema
(
description
=
"客户订单id"
)
private
Long
customerOrderId
;
@Schema
(
description
=
"配送模式"
)
private
DeliveryMode
deliveryMode
;
@Schema
(
description
=
"配送时间"
)
private
LocalDateTime
deliveryTime
;
@Schema
(
description
=
"配送人员"
)
private
Long
deliveryStaffId
;
@Schema
(
description
=
"客户收货地址id"
)
private
Long
addressId
;
@Schema
(
description
=
"客户收货地址info"
)
@TableField
(
typeHandler
=
JacksonTypeHandler
.
class
)
private
CustomerAddressInfo
addressInfo
;
@Data
public
static
class
Item
{
...
...
@@ -116,7 +139,7 @@ public class ErpSaleOutRespVO {
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
=
"产品数量不能为空"
)
...
...
foodnexus-module-erp/src/main/java/cn/iocoder/foodnexus/module/erp/controller/admin/sale/vo/out/ErpSaleOutSaveReqVO.java
View file @
46cd642f
package
cn
.
iocoder
.
foodnexus
.
module
.
erp
.
controller
.
admin
.
sale
.
vo
.
out
;
import
cn.iocoder.foodnexus.module.order.dto.CustomerAddressInfo
;
import
cn.iocoder.foodnexus.module.order.enums.DeliveryMode
;
import
com.baomidou.mybatisplus.annotation.TableField
;
import
com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler
;
import
io.swagger.v3.oas.annotations.media.Schema
;
import
jakarta.validation.constraints.NotNull
;
import
lombok.Data
;
...
...
@@ -44,6 +48,25 @@ public class ErpSaleOutSaveReqVO {
@Schema
(
description
=
"出库清单列表"
)
private
List
<
Item
>
items
;
@Schema
(
description
=
"客户订单id"
)
private
Long
customerOrderId
;
@Schema
(
description
=
"配送模式"
)
private
DeliveryMode
deliveryMode
;
@Schema
(
description
=
"配送时间"
)
private
LocalDateTime
deliveryTime
;
@Schema
(
description
=
"配送人员"
)
private
Long
deliveryStaffId
;
@Schema
(
description
=
"客户收货地址id"
)
private
Long
addressId
;
@Schema
(
description
=
"客户收货地址info"
)
@TableField
(
typeHandler
=
JacksonTypeHandler
.
class
)
private
CustomerAddressInfo
addressInfo
;
@Data
public
static
class
Item
{
...
...
@@ -67,11 +90,11 @@ public class ErpSaleOutSaveReqVO {
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
;
...
...
foodnexus-module-erp/src/main/java/cn/iocoder/foodnexus/module/erp/dal/dataobject/purchase/ErpPurchaseInDO.java
View file @
46cd642f
...
...
@@ -80,7 +80,7 @@ public class ErpPurchaseInDO extends BaseDO {
*
* totalPrice = totalProductPrice + totalTaxPrice - discountPrice + otherPrice
*/
private
BigDecimal
totalPrice
;
private
Integer
totalPrice
;
/**
* 已支付金额,单位:元
*
...
...
@@ -91,7 +91,7 @@ public class ErpPurchaseInDO extends BaseDO {
/**
* 合计产品价格,单位:元
*/
private
BigDecimal
totalProductPrice
;
private
Integer
totalProductPrice
;
/**
* 合计税额,单位:元
*/
...
...
@@ -120,14 +120,4 @@ public class ErpPurchaseInDO extends BaseDO {
*/
private
String
remark
;
/**
* 销售订单
*/
private
Long
saleOrderId
;
/**
* 销售子订单
*/
private
Long
saleOrderItemId
;
}
\ No newline at end of file
foodnexus-module-erp/src/main/java/cn/iocoder/foodnexus/module/erp/dal/dataobject/purchase/ErpPurchaseInItemDO.java
View file @
46cd642f
...
...
@@ -75,7 +75,7 @@ public class ErpPurchaseInItemDO extends BaseDO {
*
* totalPrice = productPrice * count
*/
private
BigDecimal
totalPrice
;
private
Integer
totalPrice
;
/**
* 税率,百分比
*/
...
...
foodnexus-module-erp/src/main/java/cn/iocoder/foodnexus/module/erp/dal/dataobject/sale/ErpSaleOrderDO.java
View file @
46cd642f
...
...
@@ -72,18 +72,18 @@ public class ErpSaleOrderDO extends BaseDO {
/**
* 合计数量
*/
private
BigDecimal
totalCount
;
private
Integer
totalCount
;
/**
* 最终合计价格,单位:元
*
* totalPrice = totalProductPrice + totalTaxPrice - discountPrice
*/
private
BigDecimal
totalPrice
;
private
Integer
totalPrice
;
/**
* 合计产品价格,单位:元
*/
private
BigDecimal
totalProductPrice
;
private
Integer
totalProductPrice
;
/**
* 合计税额,单位:元
*/
...
...
foodnexus-module-erp/src/main/java/cn/iocoder/foodnexus/module/erp/dal/dataobject/sale/ErpSaleOrderItemDO.java
View file @
46cd642f
...
...
@@ -52,17 +52,17 @@ public class ErpSaleOrderItemDO extends BaseDO {
/**
* 产品单位单价,单位:元
*/
private
BigDecimal
productPrice
;
private
Integer
productPrice
;
/**
* 数量
*/
private
BigDecimal
count
;
private
Integer
count
;
/**
* 总价,单位:元
*
* totalPrice = productPrice * count
*/
private
BigDecimal
totalPrice
;
private
Integer
totalPrice
;
/**
* 税率,百分比
*/
...
...
foodnexus-module-erp/src/main/java/cn/iocoder/foodnexus/module/erp/dal/dataobject/sale/ErpSaleOutDO.java
View file @
46cd642f
...
...
@@ -3,9 +3,13 @@ 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.order.dto.CustomerAddressInfo
;
import
cn.iocoder.foodnexus.module.order.enums.DeliveryMode
;
import
com.baomidou.mybatisplus.annotation.KeySequence
;
import
com.baomidou.mybatisplus.annotation.TableField
;
import
com.baomidou.mybatisplus.annotation.TableId
;
import
com.baomidou.mybatisplus.annotation.TableName
;
import
com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler
;
import
lombok.*
;
import
java.math.BigDecimal
;
...
...
@@ -16,7 +20,7 @@ import java.time.LocalDateTime;
*
* @author 芋道源码
*/
@TableName
(
value
=
"erp_sale_out"
)
@TableName
(
value
=
"erp_sale_out"
,
autoResultMap
=
true
)
@KeySequence
(
"erp_sale_out_seq"
)
// 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
@Data
@EqualsAndHashCode
(
callSuper
=
true
)
...
...
@@ -80,13 +84,13 @@ public class ErpSaleOutDO extends BaseDO {
/**
* 合计数量
*/
private
BigDecimal
totalCount
;
private
Integer
totalCount
;
/**
* 最终合计价格,单位:元
*
* totalPrice = totalProductPrice + totalTaxPrice - discountPrice + otherPrice
*/
private
BigDecimal
totalPrice
;
private
Integer
totalPrice
;
/**
* 已收款金额,单位:元
*
...
...
@@ -97,7 +101,7 @@ public class ErpSaleOutDO extends BaseDO {
/**
* 合计产品价格,单位:元
*/
private
BigDecimal
totalProductPrice
;
private
Integer
totalProductPrice
;
/**
* 合计税额,单位:元
*/
...
...
@@ -126,4 +130,38 @@ public class ErpSaleOutDO extends BaseDO {
*/
private
String
remark
;
/**
* 客户订单id
*/
private
Long
customerOrderId
;
/**
* 配送模式
*
* 枚举 {@link DeliveryMode}
*/
private
DeliveryMode
deliveryMode
;
/**
* 配送时间
*/
private
LocalDateTime
deliveryTime
;
/**
* 配送人员
*
* DeliveryStaffDO
*/
private
Long
deliveryStaffId
;
/**
* 客户收货地址id
*/
private
Long
addressId
;
/**
* 客户收货地址info
*/
@TableField
(
typeHandler
=
JacksonTypeHandler
.
class
)
private
CustomerAddressInfo
addressInfo
;
}
\ No newline at end of file
foodnexus-module-erp/src/main/java/cn/iocoder/foodnexus/module/erp/dal/dataobject/sale/ErpSaleOutItemDO.java
View file @
46cd642f
...
...
@@ -5,18 +5,21 @@ import cn.iocoder.foodnexus.module.erp.dal.dataobject.product.ErpProductDO;
import
cn.iocoder.foodnexus.module.erp.dal.dataobject.stock.ErpStockOutDO
;
import
cn.iocoder.foodnexus.module.erp.dal.dataobject.stock.ErpWarehouseDO
;
import
com.baomidou.mybatisplus.annotation.KeySequence
;
import
com.baomidou.mybatisplus.annotation.TableField
;
import
com.baomidou.mybatisplus.annotation.TableId
;
import
com.baomidou.mybatisplus.annotation.TableName
;
import
com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler
;
import
lombok.*
;
import
java.math.BigDecimal
;
import
java.util.List
;
/**
* ERP 销售出库项 DO
*
* @author 芋道源码
*/
@TableName
(
"erp_sale_out_items"
)
@TableName
(
value
=
"erp_sale_out_items"
,
autoResultMap
=
true
)
@KeySequence
(
"erp_sale_out_items_seq"
)
// 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
@Data
@EqualsAndHashCode
(
callSuper
=
true
)
...
...
@@ -58,25 +61,23 @@ public class ErpSaleOutItemDO extends BaseDO {
private
Long
productId
;
/**
* 产品单位单位
*
* 冗余 {@link ErpProductDO#getUnitId()}
*/
private
String
productUnit
;
/**
* 产品单位单价,单位:
元
* 产品单位单价,单位:
分
*/
private
BigDecimal
productPrice
;
private
Integer
productPrice
;
/**
* 数量
*/
private
BigDecimal
count
;
private
Integer
count
;
/**
* 总价,单位:
元
* 总价,单位:
分
*
* totalPrice = productPrice * count
*/
private
BigDecimal
totalPrice
;
private
Integer
totalPrice
;
/**
* 税率,百分比
*/
...
...
@@ -93,4 +94,10 @@ public class ErpSaleOutItemDO extends BaseDO {
*/
private
String
remark
;
/**
* 相关文件
*/
@TableField
(
typeHandler
=
JacksonTypeHandler
.
class
)
private
List
<
String
>
remarkFiles
;
}
\ No newline at end of file
foodnexus-module-erp/src/main/java/cn/iocoder/foodnexus/module/erp/enums/SaleOrderPickUpStatus.java
View file @
46cd642f
...
...
@@ -22,6 +22,8 @@ public enum SaleOrderPickUpStatus implements ArrayValuable<String> {
ALREADY
(
"ALREADY"
,
"已发货"
),
ARRIVAL
(
"ARRIVAL"
,
"已到货"
),
;
public
static
final
String
[]
ARRAYS
=
Arrays
.
stream
(
values
()).
map
(
SaleOrderPickUpStatus:
:
getType
).
toArray
(
String
[]::
new
);
...
...
foodnexus-module-erp/src/main/java/cn/iocoder/foodnexus/module/erp/service/finance/ErpFinancePaymentServiceImpl.java
View file @
46cd642f
...
...
@@ -163,7 +163,7 @@ public class ErpFinancePaymentServiceImpl implements ErpFinancePaymentService {
if
(
ObjectUtil
.
equal
(
item
.
getBizType
(),
ErpBizTypeEnum
.
PURCHASE_IN
.
getType
()))
{
ErpPurchaseInDO
purchaseIn
=
purchaseInService
.
validatePurchaseIn
(
item
.
getBizId
());
Assert
.
equals
(
purchaseIn
.
getSupplierId
(),
supplierId
,
"供应商必须相同"
);
item
.
setTotalPrice
(
purchaseIn
.
getTotalPrice
(
)).
setBizNo
(
purchaseIn
.
getNo
());
item
.
setTotalPrice
(
BigDecimal
.
valueOf
(
purchaseIn
.
getTotalPrice
()
)).
setBizNo
(
purchaseIn
.
getNo
());
}
else
if
(
ObjectUtil
.
equal
(
item
.
getBizType
(),
ErpBizTypeEnum
.
PURCHASE_RETURN
.
getType
()))
{
ErpPurchaseReturnDO
purchaseReturn
=
purchaseReturnService
.
validatePurchaseReturn
(
item
.
getBizId
());
Assert
.
equals
(
purchaseReturn
.
getSupplierId
(),
supplierId
,
"供应商必须相同"
);
...
...
foodnexus-module-erp/src/main/java/cn/iocoder/foodnexus/module/erp/service/finance/ErpFinanceReceiptServiceImpl.java
View file @
46cd642f
...
...
@@ -163,7 +163,7 @@ public class ErpFinanceReceiptServiceImpl implements ErpFinanceReceiptService {
if
(
ObjectUtil
.
equal
(
item
.
getBizType
(),
ErpBizTypeEnum
.
SALE_OUT
.
getType
()))
{
ErpSaleOutDO
saleOut
=
saleOutService
.
validateSaleOut
(
item
.
getBizId
());
Assert
.
equals
(
saleOut
.
getCustomerId
(),
customerId
,
"客户必须相同"
);
item
.
setTotalPrice
(
saleOut
.
getTotalPrice
(
)).
setBizNo
(
saleOut
.
getNo
());
item
.
setTotalPrice
(
BigDecimal
.
valueOf
(
saleOut
.
getTotalPrice
()
)).
setBizNo
(
saleOut
.
getNo
());
}
else
if
(
ObjectUtil
.
equal
(
item
.
getBizType
(),
ErpBizTypeEnum
.
SALE_RETURN
.
getType
()))
{
ErpSaleReturnDO
saleReturn
=
saleReturnService
.
validateSaleReturn
(
item
.
getBizId
());
Assert
.
equals
(
saleReturn
.
getCustomerId
(),
customerId
,
"客户必须相同"
);
...
...
foodnexus-module-erp/src/main/java/cn/iocoder/foodnexus/module/erp/service/purchase/ErpPurchaseInServiceImpl.java
View file @
46cd642f
...
...
@@ -3,6 +3,7 @@ package cn.iocoder.foodnexus.module.erp.service.purchase;
import
cn.hutool.core.collection.CollUtil
;
import
cn.hutool.core.util.ObjectUtil
;
import
cn.iocoder.foodnexus.framework.common.pojo.PageResult
;
import
cn.iocoder.foodnexus.framework.common.util.CommonUtil
;
import
cn.iocoder.foodnexus.framework.common.util.number.MoneyUtils
;
import
cn.iocoder.foodnexus.framework.common.util.object.BeanUtils
;
import
cn.iocoder.foodnexus.module.erp.controller.admin.purchase.vo.in.ErpPurchaseInPageReqVO
;
...
...
@@ -57,8 +58,6 @@ public class ErpPurchaseInServiceImpl implements ErpPurchaseInService {
private
ErpNoRedisDAO
noRedisDAO
;
@Resource
private
ErpProductService
productService
;
@Resource
@Lazy
// 延迟加载,避免循环依赖
private
ErpPurchaseOrderService
purchaseOrderService
;
@Resource
...
...
@@ -66,8 +65,6 @@ public class ErpPurchaseInServiceImpl implements ErpPurchaseInService {
@Resource
private
ErpStockRecordService
stockRecordService
;
@Resource
private
AdminUserApi
adminUserApi
;
@Override
@Transactional
(
rollbackFor
=
Exception
.
class
)
...
...
@@ -77,7 +74,9 @@ public class ErpPurchaseInServiceImpl implements ErpPurchaseInService {
// 1.2 校验入库项的有效性
List
<
ErpPurchaseInItemDO
>
purchaseInItems
=
validatePurchaseInItems
(
createReqVO
.
getItems
());
// 1.3 校验结算账户
accountService
.
validateAccount
(
createReqVO
.
getAccountId
());
if
(
CommonUtil
.
isNotEmpty
(
createReqVO
.
getAccountId
()))
{
accountService
.
validateAccount
(
createReqVO
.
getAccountId
());
}
// 1.4 生成入库单号,并校验唯一性
String
no
=
noRedisDAO
.
generate
(
ErpNoRedisDAO
.
PURCHASE_IN_NO_PREFIX
);
if
(
purchaseInMapper
.
selectByNo
(
no
)
!=
null
)
{
...
...
@@ -132,15 +131,15 @@ public class ErpPurchaseInServiceImpl implements ErpPurchaseInService {
private
void
calculateTotalPrice
(
ErpPurchaseInDO
purchaseIn
,
List
<
ErpPurchaseInItemDO
>
purchaseInItems
)
{
purchaseIn
.
setTotalCount
(
purchaseInItems
.
stream
().
mapToInt
(
ErpPurchaseInItemDO:
:
getCount
).
sum
());
purchaseIn
.
setTotalProductPrice
(
getSumValue
(
purchaseInItems
,
ErpPurchaseInItemDO:
:
getTotalPrice
,
BigDecimal:
:
add
,
BigDecimal
.
ZERO
));
purchaseIn
.
setTotalProductPrice
(
getSumValue
(
purchaseInItems
,
ErpPurchaseInItemDO:
:
getTotalPrice
,
Integer:
:
sum
,
0
));
purchaseIn
.
setTotalTaxPrice
(
getSumValue
(
purchaseInItems
,
ErpPurchaseInItemDO:
:
getTaxPrice
,
BigDecimal:
:
add
,
BigDecimal
.
ZERO
));
purchaseIn
.
setTotalPrice
(
purchaseIn
.
getTotalProductPrice
()
.
add
(
purchaseIn
.
getTotalTaxPrice
())
);
purchaseIn
.
setTotalPrice
(
purchaseIn
.
getTotalProductPrice
());
// 计算优惠价格
if
(
purchaseIn
.
getDiscountPercent
()
==
null
)
{
purchaseIn
.
setDiscountPercent
(
BigDecimal
.
ZERO
);
}
purchaseIn
.
setDiscountPrice
(
MoneyUtils
.
priceMultiplyPercent
(
purchaseIn
.
getTotalPrice
(),
purchaseIn
.
getDiscountPercent
()));
purchaseIn
.
setTotalPrice
(
purchaseIn
.
getTotalPrice
()
.
subtract
(
purchaseIn
.
getDiscountPrice
()).
add
(
purchaseIn
.
getOtherPrice
())
);
//
purchaseIn.setDiscountPrice(MoneyUtils.priceMultiplyPercent(purchaseIn.getTotalPrice(), purchaseIn.getDiscountPercent()));
purchaseIn
.
setTotalPrice
(
purchaseIn
.
getTotalPrice
()
/*.subtract(purchaseIn.getDiscountPrice()).add(purchaseIn.getOtherPrice())*/
);
}
private
void
updatePurchaseOrderInCount
(
Long
orderId
)
{
...
...
@@ -193,7 +192,7 @@ public class ErpPurchaseInServiceImpl implements ErpPurchaseInService {
if
(
purchaseIn
.
getPaymentPrice
().
equals
(
paymentPrice
))
{
return
;
}
if
(
paymentPrice
.
compareTo
(
purchaseIn
.
getTotalPrice
(
))
>
0
)
{
if
(
paymentPrice
.
compareTo
(
BigDecimal
.
valueOf
(
purchaseIn
.
getTotalPrice
()
))
>
0
)
{
throw
exception
(
PURCHASE_IN_FAIL_PAYMENT_PRICE_EXCEED
,
paymentPrice
,
purchaseIn
.
getTotalPrice
());
}
purchaseInMapper
.
updateById
(
new
ErpPurchaseInDO
().
setId
(
id
).
setPaymentPrice
(
paymentPrice
));
...
...
@@ -201,19 +200,19 @@ public class ErpPurchaseInServiceImpl implements ErpPurchaseInService {
private
List
<
ErpPurchaseInItemDO
>
validatePurchaseInItems
(
List
<
ErpPurchaseInSaveReqVO
.
Item
>
list
)
{
// 1. 校验产品存在
List
<
ErpProductDO
>
productList
=
productService
.
validProductList
(
/*
List<ErpProductDO> productList = productService.validProductList(
convertSet(list, ErpPurchaseInSaveReqVO.Item::getProductId));
Map
<
Long
,
ErpProductDO
>
productMap
=
convertMap
(
productList
,
ErpProductDO:
:
getId
);
Map<Long, ErpProductDO> productMap = convertMap(productList, ErpProductDO::getId);
*/
// 2. 转化为 ErpPurchaseInItemDO 列表
return
convertList
(
list
,
o
->
BeanUtils
.
toBean
(
o
,
ErpPurchaseInItemDO
.
class
,
item
->
{
// item.setProductUnitId(productMap.get(item.getProductId()).getUnitId());
item
.
setTotalPrice
(
BigDecimal
.
valueOf
(
item
.
getProductPrice
()
*
item
.
getCount
()
));
item
.
setTotalPrice
(
item
.
getProductPrice
()
*
item
.
getCount
(
));
if
(
item
.
getTotalPrice
()
==
null
)
{
return
;
}
if
(
item
.
getTaxPercent
()
!=
null
)
{
/*
if (item.getTaxPercent() != null) {
item.setTaxPrice(MoneyUtils.priceMultiplyPercent(item.getTotalPrice(), item.getTaxPercent()));
}
}
*/
}));
}
...
...
foodnexus-module-erp/src/main/java/cn/iocoder/foodnexus/module/erp/service/purchase/ErpPurchaseOrderServiceImpl.java
View file @
46cd642f
...
...
@@ -346,7 +346,6 @@ public class ErpPurchaseOrderServiceImpl implements ErpPurchaseOrderService {
}
if
(!
customerOrderSet
.
contains
(
item
.
getCustomerOrderId
()))
{
customerOrderApi
.
updateOrderStatus
(
item
.
getCustomerOrderId
(),
updateOrderStatus
);
// 添加订单进度记录
CustomerOrderRecordEvent
event
=
new
CustomerOrderRecordEvent
();
event
.
setOrderStatus
(
updateOrderStatus
);
...
...
foodnexus-module-erp/src/main/java/cn/iocoder/foodnexus/module/erp/service/sale/ErpSaleOrderService.java
View file @
46cd642f
...
...
@@ -5,6 +5,7 @@ import cn.iocoder.foodnexus.module.erp.controller.admin.sale.vo.order.ErpSaleOrd
import
cn.iocoder.foodnexus.module.erp.controller.admin.sale.vo.order.ErpSaleOrderSaveReqVO
;
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.order.dto.DeliveryOrderUpdateReqVO
;
import
jakarta.validation.Valid
;
import
java.math.BigDecimal
;
...
...
@@ -123,7 +124,13 @@ public interface ErpSaleOrderService {
/**
* 配送
* @param id
*/
void
delivery
(
Long
id
,
Long
deliveryStaffId
);
/**
* 到货
* @param id
* @param deliveryStaffId
*/
void
arrival
(
DeliveryOrderUpdateReqVO
reqVO
,
Long
deliveryStaffId
);
}
\ No newline at end of file
foodnexus-module-erp/src/main/java/cn/iocoder/foodnexus/module/erp/service/sale/ErpSaleOrderServiceImpl.java
View file @
46cd642f
...
...
@@ -15,8 +15,11 @@ 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
;
import
cn.iocoder.foodnexus.module.erp.dal.dataobject.sale.ErpSaleOrderItemDO
;
import
cn.iocoder.foodnexus.module.erp.dal.dataobject.sale.ErpSaleOutDO
;
import
cn.iocoder.foodnexus.module.erp.dal.dataobject.sale.ErpSaleOutItemDO
;
import
cn.iocoder.foodnexus.module.erp.dal.mysql.sale.ErpSaleOrderItemMapper
;
import
cn.iocoder.foodnexus.module.erp.dal.mysql.sale.ErpSaleOrderMapper
;
import
cn.iocoder.foodnexus.module.erp.dal.mysql.sale.ErpSaleOutItemMapper
;
import
cn.iocoder.foodnexus.module.erp.dal.redis.no.ErpNoRedisDAO
;
import
cn.iocoder.foodnexus.module.erp.api.enums.ErpAuditStatus
;
import
cn.iocoder.foodnexus.module.erp.enums.SaleOrderPickUpStatus
;
...
...
@@ -29,7 +32,11 @@ import cn.iocoder.foodnexus.module.order.api.CustomerOrderRecordApi;
import
cn.iocoder.foodnexus.module.order.api.DeliveryStaffApi
;
import
cn.iocoder.foodnexus.module.order.dto.CustomerOrderDTO
;
import
cn.iocoder.foodnexus.module.order.dto.CustomerOrderRecordEvent
;
import
cn.iocoder.foodnexus.module.order.dto.DeliveryOrderUpdateReqVO
;
import
cn.iocoder.foodnexus.module.order.dto.DeliveryStaffSimpleInfo
;
import
cn.iocoder.foodnexus.module.order.enums.CustomerOrderStatus
;
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
com.baomidou.mybatisplus.core.toolkit.Wrappers
;
import
jakarta.annotation.Resource
;
...
...
@@ -66,7 +73,7 @@ public class ErpSaleOrderServiceImpl implements ErpSaleOrderService {
private
ErpNoRedisDAO
noRedisDAO
;
@Resource
private
ErpProduct
Service
productService
;
private
ProductSpu
Service
productService
;
@Resource
private
ErpCustomerService
customerService
;
@Resource
...
...
@@ -93,6 +100,9 @@ public class ErpSaleOrderServiceImpl implements ErpSaleOrderService {
@Autowired
private
ErpSaleOutService
saleOutService
;
@Autowired
private
ErpSaleOutItemMapper
saleOutItemMapper
;
@Override
@Transactional
(
rollbackFor
=
Exception
.
class
)
public
Long
createSaleOrder
(
ErpSaleOrderSaveReqVO
createReqVO
)
{
...
...
@@ -155,16 +165,16 @@ public class ErpSaleOrderServiceImpl implements ErpSaleOrderService {
}
private
void
calculateTotalPrice
(
ErpSaleOrderDO
saleOrder
,
List
<
ErpSaleOrderItemDO
>
saleOrderItems
)
{
saleOrder
.
setTotalCount
(
getSumValue
(
saleOrderItems
,
ErpSaleOrderItemDO:
:
getCount
,
BigDecimal:
:
add
));
saleOrder
.
setTotalProductPrice
(
getSumValue
(
saleOrderItems
,
ErpSaleOrderItemDO:
:
getTotalPrice
,
BigDecimal:
:
add
,
BigDecimal
.
ZERO
));
saleOrder
.
setTotalCount
(
getSumValue
(
saleOrderItems
,
ErpSaleOrderItemDO:
:
getCount
,
Integer:
:
sum
));
saleOrder
.
setTotalProductPrice
(
getSumValue
(
saleOrderItems
,
ErpSaleOrderItemDO:
:
getTotalPrice
,
Integer:
:
sum
,
0
));
saleOrder
.
setTotalTaxPrice
(
getSumValue
(
saleOrderItems
,
ErpSaleOrderItemDO:
:
getTaxPrice
,
BigDecimal:
:
add
,
BigDecimal
.
ZERO
));
saleOrder
.
setTotalPrice
(
saleOrder
.
getTotalProductPrice
()
.
add
(
saleOrder
.
getTotalTaxPrice
())
);
saleOrder
.
setTotalPrice
(
saleOrder
.
getTotalProductPrice
());
// 计算优惠价格
if
(
saleOrder
.
getDiscountPercent
()
==
null
)
{
saleOrder
.
setDiscountPercent
(
BigDecimal
.
ZERO
);
}
saleOrder
.
setDiscountPrice
(
MoneyUtils
.
priceMultiplyPercent
(
saleOrder
.
getTotalPrice
(),
saleOrder
.
getDiscountPercent
()));
saleOrder
.
setTotalPrice
(
saleOrder
.
getTotalPrice
()
.
subtract
(
saleOrder
.
getDiscountPrice
())
);
//
saleOrder.setDiscountPrice(MoneyUtils.priceMultiplyPercent(saleOrder.getTotalPrice(), saleOrder.getDiscountPercent()));
saleOrder
.
setTotalPrice
(
saleOrder
.
getTotalPrice
()
/*.subtract(saleOrder.getDiscountPrice()*/
);
}
@Override
...
...
@@ -196,19 +206,16 @@ public class ErpSaleOrderServiceImpl implements ErpSaleOrderService {
private
List
<
ErpSaleOrderItemDO
>
validateSaleOrderItems
(
List
<
ErpSaleOrderSaveReqVO
.
Item
>
list
)
{
// 1. 校验产品存在
List
<
ErpProductDO
>
productList
=
productService
.
validProductList
(
convertSet
(
list
,
ErpSaleOrderSaveReqVO
.
Item
::
getProductId
));
Map
<
Long
,
ErpProductDO
>
productMap
=
convertMap
(
productList
,
ErpProductDO:
:
getId
);
// 2. 转化为 ErpSaleOrderItemDO 列表
return
convertList
(
list
,
o
->
BeanUtils
.
toBean
(
o
,
ErpSaleOrderItemDO
.
class
,
item
->
{
// item.setProductUnit(productMap.get(item.getProductId()).getUni());
item
.
setTotalPrice
(
MoneyUtils
.
priceMultiply
(
item
.
getProductPrice
(),
item
.
getCount
()
));
item
.
setTotalPrice
(
item
.
getProductPrice
()
*
item
.
getCount
(
));
if
(
item
.
getTotalPrice
()
==
null
)
{
return
;
}
if
(
item
.
getTaxPercent
()
!=
null
)
{
/*
if (item.getTaxPercent() != null) {
item.setTaxPrice(MoneyUtils.priceMultiplyPercent(item.getTotalPrice(), item.getTaxPercent()));
}
}
*/
}));
}
...
...
@@ -240,9 +247,9 @@ public class ErpSaleOrderServiceImpl implements ErpSaleOrderService {
if
(
item
.
getOutCount
().
equals
(
outCount
))
{
return
;
}
if
(
outCount
.
compareTo
(
item
.
getCount
(
))
>
0
)
{
if
(
outCount
.
compareTo
(
BigDecimal
.
valueOf
(
item
.
getCount
()
))
>
0
)
{
throw
exception
(
SALE_ORDER_ITEM_OUT_FAIL_PRODUCT_EXCEED
,
productService
.
get
Product
(
item
.
getProductId
()).
getName
(),
item
.
getCount
());
productService
.
get
Spu
(
item
.
getProductId
()).
getName
(),
item
.
getCount
());
}
saleOrderItemMapper
.
updateById
(
new
ErpSaleOrderItemDO
().
setId
(
item
.
getId
()).
setOutCount
(
outCount
));
});
...
...
@@ -262,7 +269,7 @@ public class ErpSaleOrderServiceImpl implements ErpSaleOrderService {
}
if
(
returnCount
.
compareTo
(
item
.
getOutCount
())
>
0
)
{
throw
exception
(
SALE_ORDER_ITEM_RETURN_FAIL_OUT_EXCEED
,
productService
.
get
Product
(
item
.
getProductId
()).
getName
(),
item
.
getOutCount
());
productService
.
get
Spu
(
item
.
getProductId
()).
getName
(),
item
.
getOutCount
());
}
saleOrderItemMapper
.
updateById
(
new
ErpSaleOrderItemDO
().
setId
(
item
.
getId
()).
setReturnCount
(
returnCount
));
});
...
...
@@ -378,11 +385,9 @@ public class ErpSaleOrderServiceImpl implements ErpSaleOrderService {
String
deliveryName
=
deliveryStaffApi
.
queryNameByStaffId
(
saleOrder
.
getDeliveryStaffId
());
String
warehouseName
=
Optional
.
ofNullable
(
customerOrder
.
getWarehouseInfo
()).
map
(
WarehouseInfo:
:
getName
).
orElse
(
""
);
ErpPurchaseOrderDO
purchaseOrder
=
purchaseOrderService
.
getPurchaseOrder
(
saleItemOrder
.
getPurchaseOrderId
());
CustomerOrderRecordEvent
event
=
new
CustomerOrderRecordEvent
();
event
.
setOrderStatus
(
CustomerOrderStatus
.
SORTING
);
event
.
setCustomerOrderId
(
saleOrder
.
getCustomerOrderId
());
event
.
setSupplierId
(
purchaseOrder
.
getSupplierId
());
event
.
setCopyWriter
(
CommonUtil
.
asList
(
warehouseName
,
deliveryName
));
orderRecordApi
.
recordEvent
(
event
);
}
...
...
@@ -391,10 +396,9 @@ public class ErpSaleOrderServiceImpl implements ErpSaleOrderService {
/**
* 配送
*
* @param id
*/
@Override
@Transactional
(
rollbackFor
=
Exception
.
class
)
public
void
delivery
(
Long
id
,
Long
deliveryStaffId
)
{
ErpSaleOrderDO
saleOrder
=
this
.
validateSaleOrder
(
id
);
if
(!
SaleOrderPickUpStatus
.
PICK_UP
.
equals
(
saleOrder
.
getPickUpStatus
()))
{
...
...
@@ -402,8 +406,12 @@ public class ErpSaleOrderServiceImpl implements ErpSaleOrderService {
}
saleOrderMapper
.
update
(
Wrappers
.<
ErpSaleOrderDO
>
lambdaUpdate
()
.
set
(
ErpSaleOrderDO:
:
getPickUpStatus
,
SaleOrderPickUpStatus
.
ALREADY
.
getType
())
.
set
(
ErpSaleOrderDO:
:
getDeliveryTime
,
LocalDateTime
.
now
())
.
set
(
ErpSaleOrderDO:
:
getDeliveryStaffId
,
deliveryStaffId
)
.
eq
(
ErpSaleOrderDO:
:
getId
,
saleOrder
.
getId
()));
saleOrderItemMapper
.
update
(
Wrappers
.<
ErpSaleOrderItemDO
>
lambdaUpdate
()
.
set
(
ErpSaleOrderItemDO:
:
getPickUpStatus
,
SaleOrderPickUpStatus
.
ALREADY
.
getType
())
.
eq
(
ErpSaleOrderItemDO:
:
getOrderId
,
saleOrder
.
getId
()));
List
<
ErpSaleOrderItemDO
>
saleOrderItems
=
saleOrderItemMapper
.
selectListByOrderId
(
id
);
// 新增销售出库单
...
...
@@ -415,11 +423,19 @@ public class ErpSaleOrderServiceImpl implements ErpSaleOrderService {
saleOutSaveReqVO
.
setDiscountPercent
(
saleOrder
.
getDiscountPercent
());
saleOutSaveReqVO
.
setFileUrl
(
saleOrder
.
getFileUrl
());
saleOutSaveReqVO
.
setRemark
(
saleOrder
.
getRemark
());
saleOutSaveReqVO
.
setCustomerOrderId
(
saleOrder
.
getCustomerOrderId
());
saleOutSaveReqVO
.
setDeliveryMode
(
saleOrder
.
getDeliveryMode
());
saleOutSaveReqVO
.
setDeliveryTime
(
saleOrder
.
getDeliveryTime
());
saleOutSaveReqVO
.
setDeliveryStaffId
(
saleOrder
.
getDeliveryStaffId
());
saleOutSaveReqVO
.
setAddressId
(
saleOrder
.
getAddressId
());
saleOutSaveReqVO
.
setAddressInfo
(
saleOrder
.
getAddressInfo
());
CustomerOrderDTO
customerOrderDTO
=
customerOrderApi
.
queryById
(
saleOrder
.
getCustomerOrderId
());
saleOutSaveReqVO
.
setItems
(
CommonUtil
.
listConvert
(
saleOrderItems
,
saleOrderItem
->
{
ErpSaleOutSaveReqVO
.
Item
item
=
new
ErpSaleOutSaveReqVO
.
Item
();
item
.
setOrderItemId
(
saleOrderItem
.
getId
());
// item.setWarehouseId();
item
.
setWarehouseId
(
customerOrderDTO
.
getWarehouseAreaId
());
item
.
setProductId
(
saleOrderItem
.
getProductId
());
item
.
setProductUnit
(
saleOrderItem
.
getProductUnit
());
item
.
setProductPrice
(
saleOrderItem
.
getProductPrice
());
...
...
@@ -429,6 +445,60 @@ public class ErpSaleOrderServiceImpl implements ErpSaleOrderService {
return
item
;
}));
saleOutService
.
createSaleOut
(
saleOutSaveReqVO
);
DeliveryStaffSimpleInfo
deliveryStaffSimpleInfo
=
deliveryStaffApi
.
querybyStaffId
(
saleOrder
.
getDeliveryStaffId
());
CustomerOrderRecordEvent
event
=
new
CustomerOrderRecordEvent
();
event
.
setOrderStatus
(
CustomerOrderStatus
.
DELIVERY
);
event
.
setCustomerOrderId
(
saleOrder
.
getCustomerOrderId
());
event
.
setCopyWriter
(
CommonUtil
.
asList
(
deliveryStaffSimpleInfo
.
getName
(),
deliveryStaffSimpleInfo
.
getContact
()));
orderRecordApi
.
recordEvent
(
event
);
}
/**
* 到货
*/
@Override
@Transactional
(
rollbackFor
=
Exception
.
class
)
public
void
arrival
(
DeliveryOrderUpdateReqVO
reqVO
,
Long
deliveryStaffId
)
{
ErpSaleOutDO
saleOut
=
saleOutService
.
validateSaleOut
(
reqVO
.
getSaleOutId
());
ErpSaleOrderDO
saleOrder
=
this
.
validateSaleOrder
(
saleOut
.
getOrderId
());
if
(!
SaleOrderPickUpStatus
.
ALREADY
.
equals
(
saleOrder
.
getPickUpStatus
()))
{
throw
exception
(
SALE_ORDER_PICKUP_STATUS_FAIL
);
}
saleOrderMapper
.
update
(
Wrappers
.<
ErpSaleOrderDO
>
lambdaUpdate
()
.
set
(
ErpSaleOrderDO:
:
getPickUpStatus
,
SaleOrderPickUpStatus
.
ARRIVAL
.
getType
())
.
set
(
ErpSaleOrderDO:
:
getDeliveryStaffId
,
deliveryStaffId
)
.
eq
(
ErpSaleOrderDO:
:
getId
,
saleOrder
.
getId
()));
saleOrderItemMapper
.
update
(
Wrappers
.<
ErpSaleOrderItemDO
>
lambdaUpdate
()
.
set
(
ErpSaleOrderItemDO:
:
getPickUpStatus
,
SaleOrderPickUpStatus
.
ARRIVAL
.
getType
())
.
eq
(
ErpSaleOrderItemDO:
:
getOrderId
,
saleOrder
.
getId
()));
// 更新出库单价格
if
(
CommonUtil
.
isNotEmpty
(
reqVO
.
getItems
()))
{
Map
<
Long
,
DeliveryOrderUpdateReqVO
.
Item
>
itemMap
=
CommonUtil
.
listConvertMap
(
reqVO
.
getItems
(),
DeliveryOrderUpdateReqVO
.
Item
::
getSaleOutItemid
);
List
<
ErpSaleOutItemDO
>
saleOutItems
=
saleOutService
.
getSaleOutItemListByOutId
(
reqVO
.
getSaleOutId
());
List
<
ErpSaleOutItemDO
>
updateBatch
=
new
ArrayList
<>();
saleOutItems
.
forEach
(
saleOutItem
->
{
if
(
itemMap
.
containsKey
(
saleOutItem
.
getId
()))
{
DeliveryOrderUpdateReqVO
.
Item
item
=
itemMap
.
get
(
saleOutItem
.
getId
());
ErpSaleOutItemDO
updateItem
=
new
ErpSaleOutItemDO
();
updateItem
.
setId
(
item
.
getSaleOutItemid
());
updateItem
.
setCount
(
item
.
getSignedQuantity
());
updateItem
.
setRemark
(
item
.
getRemark
());
updateItem
.
setRemarkFiles
(
item
.
getRemarkFiles
());
updateItem
.
setTotalPrice
(
item
.
getSignedQuantity
()
*
saleOutItem
.
getProductPrice
());
updateBatch
.
add
(
updateItem
);
}
});
saleOutItemMapper
.
updateBatch
(
updateBatch
);
}
DeliveryStaffSimpleInfo
deliveryStaffSimpleInfo
=
deliveryStaffApi
.
querybyStaffId
(
saleOrder
.
getDeliveryStaffId
());
CustomerOrderRecordEvent
event
=
new
CustomerOrderRecordEvent
();
event
.
setOrderStatus
(
CustomerOrderStatus
.
ARRIVAL
);
event
.
setCustomerOrderId
(
saleOrder
.
getCustomerOrderId
());
event
.
setCopyWriter
(
CommonUtil
.
asList
(
deliveryStaffSimpleInfo
.
getName
(),
deliveryStaffSimpleInfo
.
getContact
()));
orderRecordApi
.
recordEvent
(
event
);
}
}
foodnexus-module-erp/src/main/java/cn/iocoder/foodnexus/module/erp/service/sale/ErpSaleOutService.java
View file @
46cd642f
...
...
@@ -99,4 +99,5 @@ public interface ErpSaleOutService {
List
<
ErpSaleOutItemDO
>
getSaleOutItemListByOutIds
(
Collection
<
Long
>
outIds
);
ErpSaleOutDO
getSaleOutByCustomerOrderId
(
Long
customerOrderId
);
}
\ No newline at end of file
foodnexus-module-erp/src/main/java/cn/iocoder/foodnexus/module/erp/service/sale/ErpSaleOutServiceImpl.java
View file @
46cd642f
...
...
@@ -141,16 +141,16 @@ public class ErpSaleOutServiceImpl implements ErpSaleOutService {
}
private
void
calculateTotalPrice
(
ErpSaleOutDO
saleOut
,
List
<
ErpSaleOutItemDO
>
saleOutItems
)
{
saleOut
.
setTotalCount
(
getSumValue
(
saleOutItems
,
ErpSaleOutItemDO:
:
getCount
,
BigDecimal:
:
add
));
saleOut
.
setTotalProductPrice
(
getSumValue
(
saleOutItems
,
ErpSaleOutItemDO:
:
getTotalPrice
,
BigDecimal:
:
add
,
BigDecimal
.
ZERO
));
saleOut
.
setTotalCount
(
getSumValue
(
saleOutItems
,
ErpSaleOutItemDO:
:
getCount
,
Integer:
:
sum
));
saleOut
.
setTotalProductPrice
(
getSumValue
(
saleOutItems
,
ErpSaleOutItemDO:
:
getTotalPrice
,
Integer:
:
sum
,
0
));
saleOut
.
setTotalTaxPrice
(
getSumValue
(
saleOutItems
,
ErpSaleOutItemDO:
:
getTaxPrice
,
BigDecimal:
:
add
,
BigDecimal
.
ZERO
));
saleOut
.
setTotalPrice
(
saleOut
.
getTotalProductPrice
()
.
add
(
saleOut
.
getTotalTaxPrice
())
);
saleOut
.
setTotalPrice
(
saleOut
.
getTotalProductPrice
());
// 计算优惠价格
if
(
saleOut
.
getDiscountPercent
()
==
null
)
{
saleOut
.
setDiscountPercent
(
BigDecimal
.
ZERO
);
}
saleOut
.
setDiscountPrice
(
MoneyUtils
.
priceMultiplyPercent
(
saleOut
.
getTotalPrice
(),
saleOut
.
getDiscountPercent
()));
saleOut
.
setTotalPrice
(
saleOut
.
getTotalPrice
()
.
subtract
(
saleOut
.
getDiscountPrice
().
add
(
saleOut
.
getOtherPrice
()))
);
//
saleOut.setDiscountPrice(MoneyUtils.priceMultiplyPercent(saleOut.getTotalPrice(), saleOut.getDiscountPercent()));
saleOut
.
setTotalPrice
(
saleOut
.
getTotalPrice
()
/* - (saleOut.getDiscountPrice().add(saleOut.getOtherPrice()))*/
);
}
private
void
updateSaleOrderOutCount
(
Long
orderId
)
{
...
...
@@ -190,9 +190,9 @@ public class ErpSaleOutServiceImpl implements ErpSaleOutService {
Integer
bizType
=
approve
?
ErpStockRecordBizTypeEnum
.
SALE_OUT
.
getType
()
:
ErpStockRecordBizTypeEnum
.
SALE_OUT_CANCEL
.
getType
();
saleOutItems
.
forEach
(
saleOutItem
->
{
BigDecimal
count
=
approve
?
saleOutItem
.
getCount
().
negate
()
:
saleOutItem
.
getCount
();
Integer
count
=
approve
?
-
saleOutItem
.
getCount
()
:
saleOutItem
.
getCount
();
stockRecordService
.
createStockRecord
(
new
ErpStockRecordCreateReqBO
(
saleOutItem
.
getProductId
(),
saleOutItem
.
getWarehouseId
(),
count
,
saleOutItem
.
getProductId
(),
saleOutItem
.
getWarehouseId
(),
BigDecimal
.
valueOf
(
count
)
,
bizType
,
saleOutItem
.
getOutId
(),
saleOutItem
.
getId
(),
saleOut
.
getNo
()));
});
}
...
...
@@ -203,7 +203,7 @@ public class ErpSaleOutServiceImpl implements ErpSaleOutService {
if
(
saleOut
.
getReceiptPrice
().
equals
(
receiptPrice
))
{
return
;
}
if
(
receiptPrice
.
compareTo
(
saleOut
.
getTotalPrice
(
))
>
0
)
{
if
(
receiptPrice
.
compareTo
(
BigDecimal
.
valueOf
(
saleOut
.
getTotalPrice
()
))
>
0
)
{
throw
exception
(
SALE_OUT_FAIL_RECEIPT_PRICE_EXCEED
,
receiptPrice
,
saleOut
.
getTotalPrice
());
}
saleOutMapper
.
updateById
(
new
ErpSaleOutDO
().
setId
(
id
).
setReceiptPrice
(
receiptPrice
));
...
...
@@ -215,13 +215,10 @@ public class ErpSaleOutServiceImpl implements ErpSaleOutService {
// 2. 转化为 ErpSaleOutItemDO 列表
return
convertList
(
list
,
o
->
BeanUtils
.
toBean
(
o
,
ErpSaleOutItemDO
.
class
,
item
->
{
item
.
setProductUnit
(
productMap
.
get
(
item
.
getProductId
()).
getUnitName
());
item
.
setTotalPrice
(
MoneyUtils
.
priceMultiply
(
item
.
getProductPrice
(),
item
.
getCount
()
));
item
.
setTotalPrice
(
item
.
getProductPrice
()
*
item
.
getCount
(
));
if
(
item
.
getTotalPrice
()
==
null
)
{
return
;
}
if
(
item
.
getTaxPercent
()
!=
null
)
{
item
.
setTaxPrice
(
MoneyUtils
.
priceMultiplyPercent
(
item
.
getTotalPrice
(),
item
.
getTaxPercent
()));
}
}));
}
...
...
@@ -313,4 +310,9 @@ public class ErpSaleOutServiceImpl implements ErpSaleOutService {
return
saleOutItemMapper
.
selectListByOutIds
(
outIds
);
}
@Override
public
ErpSaleOutDO
getSaleOutByCustomerOrderId
(
Long
customerOrderId
)
{
return
saleOutMapper
.
selectOne
(
ErpSaleOutDO:
:
getCustomerOrderId
,
customerOrderId
);
}
}
foodnexus-module-mall/foodnexus-module-operations/src/main/java/cn/iocoder/foodnexus/module/operations/service/deliverystaff/DeliveryStaffServiceImpl.java
View file @
46cd642f
...
...
@@ -7,6 +7,7 @@ import cn.iocoder.foodnexus.framework.common.util.CommonUtil;
import
cn.iocoder.foodnexus.module.operations.dal.dataobject.deliverystaffcustomer.DeliveryStaffCustomerDO
;
import
cn.iocoder.foodnexus.module.operations.dal.mysql.deliverystaffcustomer.DeliveryStaffCustomerMapper
;
import
cn.iocoder.foodnexus.module.order.api.DeliveryStaffApi
;
import
cn.iocoder.foodnexus.module.order.dto.DeliveryStaffSimpleInfo
;
import
cn.iocoder.foodnexus.module.system.controller.admin.user.vo.user.UserSaveReqVO
;
import
cn.iocoder.foodnexus.module.system.service.dept.DeptService
;
import
cn.iocoder.foodnexus.module.system.service.user.AdminUserService
;
...
...
@@ -158,4 +159,9 @@ public class DeliveryStaffServiceImpl implements DeliveryStaffService, DeliveryS
return
Optional
.
ofNullable
(
deliveryStaffMapper
.
selectOne
(
DeliveryStaffDO:
:
getUserId
,
loginUserId
))
.
map
(
DeliveryStaffDO:
:
getId
).
orElse
(
null
);
}
@Override
public
DeliveryStaffSimpleInfo
querybyStaffId
(
Long
staffId
)
{
return
BeanUtils
.
toBean
(
deliveryStaffMapper
.
selectById
(
staffId
),
DeliveryStaffSimpleInfo
.
class
);
}
}
\ No newline at end of file
foodnexus-module-mall/foodnexus-module-order-api/src/main/java/cn/iocoder/foodnexus/module/order/api/DeliveryStaffApi.java
View file @
46cd642f
package
cn
.
iocoder
.
foodnexus
.
module
.
order
.
api
;
import
cn.iocoder.foodnexus.module.order.dto.DeliveryStaffSimpleInfo
;
/**
* @author : yanghao
* create at: 2025/9/25 15:54
...
...
@@ -10,4 +12,6 @@ public interface DeliveryStaffApi {
String
queryNameByStaffId
(
Long
staffId
);
Long
queryStaffIdByUserId
(
Long
loginUserId
);
DeliveryStaffSimpleInfo
querybyStaffId
(
Long
staffId
);
}
foodnexus-module-mall/foodnexus-module-order-api/src/main/java/cn/iocoder/foodnexus/module/order/dto/DeliveryOrderUpdateReqVO.java
0 → 100644
View file @
46cd642f
package
cn
.
iocoder
.
foodnexus
.
module
.
order
.
dto
;
import
jakarta.validation.Valid
;
import
jakarta.validation.constraints.Min
;
import
jakarta.validation.constraints.NotNull
;
import
lombok.Data
;
import
java.util.List
;
/**
* @author : yanghao
* create at: 2025/9/28 17:35
* @description: 配送订单 - 实际配送信息
*/
@Data
public
class
DeliveryOrderUpdateReqVO
{
/**
* 销售出库单id
*/
@NotNull
(
message
=
"销售出库单id不能为空"
)
private
Long
saleOutId
;
/**
* 销售出库子项
*/
@NotNull
(
message
=
"销售出库子项不能为空"
)
@Valid
private
List
<
Item
>
items
;
@Data
public
static
class
Item
{
/**
* 销售出库子id
*/
@NotNull
(
message
=
"销售出库子id不能为空"
)
private
Long
saleOutItemid
;
/**
* 实际签收数量
*/
@NotNull
(
message
=
"实际签收数量不能为空"
)
@Min
(
value
=
0
,
message
=
"实际签收数量最小为0"
)
private
Integer
signedQuantity
;
/**
* 说明
*/
private
String
remark
;
/**
* 相关文件
*/
private
List
<
String
>
remarkFiles
;
}
}
foodnexus-module-mall/foodnexus-module-order-api/src/main/java/cn/iocoder/foodnexus/module/order/dto/DeliveryStaffSimpleInfo.java
0 → 100644
View file @
46cd642f
package
cn
.
iocoder
.
foodnexus
.
module
.
order
.
dto
;
import
lombok.Data
;
/**
* @author : yanghao
* create at: 2025/9/28 16:40
* @description:
*/
@Data
public
class
DeliveryStaffSimpleInfo
{
private
Long
id
;
/**
* 姓名
*/
private
String
name
;
/**
* 联系方式
*/
private
String
contact
;
/**
* 关联系统用户id
*/
private
Long
userId
;
}
foodnexus-module-mall/foodnexus-module-order-api/src/main/java/cn/iocoder/foodnexus/module/order/enums/CustomerOrderStatus.java
View file @
46cd642f
...
...
@@ -91,7 +91,7 @@ public enum CustomerOrderStatus implements ArrayValuable<String> {
CANCEL
(
"取消订单"
,
"CANCEL"
,
9999
)
{
@Override
public
String
getText
()
{
return
""
;
return
"
客户取消订单
"
;
}
},
...
...
foodnexus-module-mall/foodnexus-module-order/src/main/java/cn/iocoder/foodnexus/module/order/controller/admin/customerorderitem/vo/CustomerOrderItemRespVO.java
View file @
46cd642f
package
cn
.
iocoder
.
foodnexus
.
module
.
order
.
controller
.
admin
.
customerorderitem
.
vo
;
import
cn.iocoder.foodnexus.module.order.dal.dataobject.customerorder.CustomerOrderRemark
;
import
cn.iocoder.foodnexus.module.product.api.dto.ProductInfo
;
import
io.swagger.v3.oas.annotations.media.Schema
;
import
lombok.*
;
...
...
@@ -69,4 +70,7 @@ public class CustomerOrderItemRespVO {
@ExcelProperty
(
"签收总价,单位:分"
)
private
Integer
signedTotal
;
@Schema
(
description
=
"订单备注"
)
private
CustomerOrderRemark
orderRemark
;
}
\ No newline at end of file
foodnexus-module-mall/foodnexus-module-order/src/main/java/cn/iocoder/foodnexus/module/order/controller/app/customerOrder/AppCustomerOrderController.java
View file @
46cd642f
package
cn
.
iocoder
.
foodnexus
.
module
.
order
.
controller
.
app
.
customerOrder
;
import
cn.iocoder.foodnexus.framework.apilog.core.annotation.ApiAccessLog
;
import
cn.iocoder.foodnexus.framework.common.enums.UserSystemEnum
;
import
cn.iocoder.foodnexus.framework.common.pojo.CommonResult
;
import
cn.iocoder.foodnexus.framework.common.pojo.PageParam
;
import
cn.iocoder.foodnexus.framework.common.pojo.PageResult
;
import
cn.iocoder.foodnexus.framework.common.util.CommonUtil
;
import
cn.iocoder.foodnexus.framework.common.util.object.BeanUtils
;
import
cn.iocoder.foodnexus.framework.excel.core.util.ExcelUtils
;
import
cn.iocoder.foodnexus.module.erp.dal.dataobject.sale.ErpSaleOutDO
;
import
cn.iocoder.foodnexus.module.erp.service.sale.ErpSaleOutService
;
import
cn.iocoder.foodnexus.module.order.controller.admin.customerorder.vo.CustomerOrderPageReqVO
;
import
cn.iocoder.foodnexus.module.order.controller.admin.customerorder.vo.CustomerOrderRecordMapVO
;
import
cn.iocoder.foodnexus.module.order.controller.admin.customerorder.vo.CustomerOrderRespVO
;
import
cn.iocoder.foodnexus.module.order.controller.a
dmin.customerorder.vo.CustomerOrderSaveReq
VO
;
import
cn.iocoder.foodnexus.module.order.controller.a
pp.customerOrder.vo.AppCustomerOrderReceiptResp
VO
;
import
cn.iocoder.foodnexus.module.order.controller.app.customerOrder.vo.AppCustomerOrderRemarkReqVO
;
import
cn.iocoder.foodnexus.module.order.controller.app.customerOrder.vo.AppCustomerOrderSaveReqVO
;
import
cn.iocoder.foodnexus.module.order.controller.app.customerOrder.vo.AppCustomerOrderSaveReqVO
;
import
cn.iocoder.foodnexus.module.order.dal.dataobject.customerorder.CustomerOrderDO
;
import
cn.iocoder.foodnexus.module.order.service.customerorder.CustomerOrderService
;
import
cn.iocoder.foodnexus.module.order.service.customerorderrecord.CustomerOrderRecordService
;
...
...
@@ -23,18 +21,14 @@ 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.servlet.http.HttpServletResponse
;
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.*
;
import
javax.sql.rowset.serial.SerialException
;
import
java.io.IOException
;
import
java.util.List
;
import
static
cn
.
iocoder
.
foodnexus
.
framework
.
apilog
.
core
.
enums
.
OperateTypeEnum
.
EXPORT
;
import
static
cn
.
iocoder
.
foodnexus
.
framework
.
common
.
pojo
.
CommonResult
.
success
;
@Tag
(
name
=
"APP - 客户总订单"
)
...
...
@@ -48,6 +42,8 @@ public class AppCustomerOrderController {
private
CustomerOrderService
customerOrderService
;
@Autowired
private
CustomerOrderRecordService
customerOrderRecordService
;
@Autowired
private
ErpSaleOutService
saleOutService
;
@PostMapping
(
"/create"
)
@Operation
(
summary
=
"创建客户总订单"
)
...
...
@@ -72,6 +68,13 @@ public class AppCustomerOrderController {
return
success
(
Boolean
.
TRUE
);
}
@GetMapping
(
"receipt"
)
@Operation
(
summary
=
"获取签收客户订单信息"
)
@Parameter
(
name
=
"id"
,
description
=
"客户订单id"
,
required
=
true
)
public
CommonResult
<
List
<
AppCustomerOrderReceiptRespVO
>>
receipt
(
@RequestParam
(
"id"
)
Long
id
)
{
return
success
(
customerOrderService
.
queryReceipt
(
id
));
}
@PostMapping
(
"receipt"
)
@Operation
(
summary
=
"签收客户订单"
)
public
CommonResult
<
Boolean
>
receipt
(
@Valid
@RequestBody
AppCustomerOrderRemarkReqVO
reqVO
)
{
...
...
foodnexus-module-mall/foodnexus-module-order/src/main/java/cn/iocoder/foodnexus/module/order/controller/app/customerOrder/vo/AppCustomerOrderReceiptRespVO.java
0 → 100644
View file @
46cd642f
package
cn
.
iocoder
.
foodnexus
.
module
.
order
.
controller
.
app
.
customerOrder
.
vo
;
import
io.swagger.v3.oas.annotations.media.Schema
;
import
jakarta.validation.Valid
;
import
jakarta.validation.constraints.Min
;
import
jakarta.validation.constraints.NotNull
;
import
lombok.Data
;
import
java.util.List
;
/**
* @author : yanghao
* create at: 2025/9/24 15:51
* @description: 订单备注
*/
@Data
public
class
AppCustomerOrderReceiptRespVO
{
@Schema
(
description
=
"商品id"
)
private
Long
productId
;
@Schema
(
description
=
"实际签收数量"
)
private
Integer
signedQuantity
;
@Schema
(
description
=
"说明"
)
private
String
remark
;
@Schema
(
description
=
"相关文件"
)
private
List
<
String
>
remarkFiles
;
}
foodnexus-module-mall/foodnexus-module-order/src/main/java/cn/iocoder/foodnexus/module/order/controller/app/delivery/DeliveryOrderController.java
View file @
46cd642f
...
...
@@ -13,11 +13,11 @@ import cn.iocoder.foodnexus.module.erp.controller.admin.sale.vo.order.ErpSaleOrd
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.order.dto.DeliveryOrderUpdateReqVO
;
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
;
...
...
@@ -27,7 +27,6 @@ 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.*
;
...
...
@@ -69,11 +68,13 @@ public class DeliveryOrderController {
@Operation
(
summary
=
"获得销售订单分页"
)
public
CommonResult
<
PageResult
<
ErpSaleOrderRespVO
>>
getSaleOrderPage
(
@Valid
ErpSaleOrderPageReqVO
pageReqVO
)
{
pageReqVO
.
setDeliveryStaffId
(
deliveryStaffApi
.
queryStaffIdByUserId
(
SecurityFrameworkUtils
.
getLoginUserId
()));
pageReqVO
.
setPickUpStatus
(
SaleOrderPickUpStatus
.
PICK_UP
);
//
pageReqVO.setPickUpStatus(SaleOrderPickUpStatus.PICK_UP);
PageResult
<
ErpSaleOrderDO
>
pageResult
=
saleOrderService
.
getSaleOrderPage
(
pageReqVO
);
return
success
(
buildSaleOrderVOPageResult
(
pageResult
));
}
// TODO 配送单修改实际配送数量在哪一步?
// 配送订单,生成销售出库单
@PostMapping
(
"/delivery"
)
@Operation
(
summary
=
"配送订单"
)
...
...
@@ -83,8 +84,14 @@ public class DeliveryOrderController {
return
success
(
Boolean
.
TRUE
);
}
// 订单修改
// 订单到货
@PostMapping
(
"/arrival"
)
@Operation
(
summary
=
"订单到货"
)
@Parameter
(
name
=
"id"
,
description
=
"销售订单id"
,
required
=
true
)
public
CommonResult
<
Boolean
>
arrival
(
@RequestBody
@Valid
DeliveryOrderUpdateReqVO
reqVO
)
{
saleOrderService
.
arrival
(
reqVO
,
deliveryStaffApi
.
queryStaffIdByUserId
(
SecurityFrameworkUtils
.
getLoginUserId
()));
return
success
(
Boolean
.
TRUE
);
}
private
PageResult
<
ErpSaleOrderRespVO
>
buildSaleOrderVOPageResult
(
PageResult
<
ErpSaleOrderDO
>
pageResult
)
{
...
...
foodnexus-module-mall/foodnexus-module-order/src/main/java/cn/iocoder/foodnexus/module/order/dal/dataobject/customerorderitem/CustomerOrderItemDO.java
View file @
46cd642f
package
cn
.
iocoder
.
foodnexus
.
module
.
order
.
dal
.
dataobject
.
customerorderitem
;
import
cn.iocoder.foodnexus.module.order.dal.dataobject.customerorder.CustomerOrderRemark
;
import
cn.iocoder.foodnexus.module.product.api.dto.ProductInfo
;
import
com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler
;
import
lombok.*
;
...
...
@@ -79,5 +80,10 @@ public class CustomerOrderItemDO extends BaseDO {
*/
private
Integer
signedTotal
;
/**
* 订单备注
*/
@TableField
(
typeHandler
=
JacksonTypeHandler
.
class
)
private
CustomerOrderRemark
orderRemark
;
}
\ No newline at end of file
foodnexus-module-mall/foodnexus-module-order/src/main/java/cn/iocoder/foodnexus/module/order/enums/ErrorCodeConstants.java
View file @
46cd642f
...
...
@@ -16,6 +16,8 @@ public interface ErrorCodeConstants {
ErrorCode
CUSTOMER_ORDER_WAREHOUSE_NOEXISTS
=
new
ErrorCode
(
1_019_100_002
,
"仓库不存在"
);
ErrorCode
CUSTOMER_WAREHOUSE_NOT_BIND
=
new
ErrorCode
(
1_019_100_003
,
"所选仓库未绑定"
);
ErrorCode
CUSTOMER_ORDER_ADDRESS_NOEXISTS
=
new
ErrorCode
(
1_019_100_004
,
"仓库不存在"
);
ErrorCode
CUSTOMER_ORDER_STATUS_ERROR
=
new
ErrorCode
(
1_019_100_005
,
"客户订单状态异常"
);
ErrorCode
CUSTOMER_ORDER_OUT_ERROR
=
new
ErrorCode
(
1_019_100_006
,
"客户订单出库环节异常"
);
// ========== 客户订单-子订单 1_020_100_0001 ==========
ErrorCode
CUSTOMER_ORDER_ITEM_NOT_EXISTS
=
new
ErrorCode
(
1_020_100_001
,
"客户订单-子订单不存在"
);
...
...
foodnexus-module-mall/foodnexus-module-order/src/main/java/cn/iocoder/foodnexus/module/order/service/customerorder/CustomerOrderService.java
View file @
46cd642f
...
...
@@ -2,6 +2,7 @@ package cn.iocoder.foodnexus.module.order.service.customerorder;
import
java.util.*
;
import
cn.iocoder.foodnexus.module.order.controller.app.customerOrder.vo.AppCustomerOrderReceiptRespVO
;
import
cn.iocoder.foodnexus.module.order.controller.app.customerOrder.vo.AppCustomerOrderRemarkReqVO
;
import
cn.iocoder.foodnexus.module.order.controller.app.customerOrder.vo.AppCustomerOrderSaveReqVO
;
import
cn.iocoder.foodnexus.module.order.controller.app.customerOrder.vo.AppCustomerOrderSaveReqVO
;
...
...
@@ -87,4 +88,6 @@ public interface CustomerOrderService {
* @param reqVO
*/
void
receipt
(
AppCustomerOrderRemarkReqVO
reqVO
);
List
<
AppCustomerOrderReceiptRespVO
>
queryReceipt
(
Long
id
);
}
\ No newline at end of file
foodnexus-module-mall/foodnexus-module-order/src/main/java/cn/iocoder/foodnexus/module/order/service/customerorder/CustomerOrderServiceImpl.java
View file @
46cd642f
...
...
@@ -9,13 +9,17 @@ import cn.iocoder.foodnexus.module.erp.api.PurchaseOrderSplitEvent;
import
cn.iocoder.foodnexus.module.erp.api.service.ErpCustomerApi
;
import
cn.iocoder.foodnexus.module.erp.api.service.ErpSupplierApi
;
import
cn.iocoder.foodnexus.module.erp.api.service.ErpWarehouseApi
;
import
cn.iocoder.foodnexus.module.erp.dal.dataobject.sale.ErpSaleOutDO
;
import
cn.iocoder.foodnexus.module.erp.dal.dataobject.sale.ErpSaleOutItemDO
;
import
cn.iocoder.foodnexus.module.erp.service.customerwarehouse.CustomerWarehouseService
;
import
cn.iocoder.foodnexus.module.erp.service.purchase.ErpPurchaseOrderServiceImpl
;
import
cn.iocoder.foodnexus.module.erp.service.sale.ErpSaleOutService
;
import
cn.iocoder.foodnexus.module.operations.dal.dataobject.inquiresupplierpush.InquireSupplierPushDO
;
import
cn.iocoder.foodnexus.module.operations.service.inquiresupplierpush.InquireSupplierPushService
;
import
cn.iocoder.foodnexus.module.order.api.CustomerOrderApi
;
import
cn.iocoder.foodnexus.module.order.api.CustomerOrderRecordApi
;
import
cn.iocoder.foodnexus.module.order.controller.app.customerOrder.vo.AppCustomerOrderItemSaveReqVO
;
import
cn.iocoder.foodnexus.module.order.controller.app.customerOrder.vo.AppCustomerOrderReceiptRespVO
;
import
cn.iocoder.foodnexus.module.order.controller.app.customerOrder.vo.AppCustomerOrderRemarkReqVO
;
import
cn.iocoder.foodnexus.module.order.controller.app.customerOrder.vo.AppCustomerOrderSaveReqVO
;
import
cn.iocoder.foodnexus.module.order.dto.CustomerAddressInfo
;
...
...
@@ -54,7 +58,6 @@ import cn.iocoder.foodnexus.framework.common.util.object.BeanUtils;
import
cn.iocoder.foodnexus.module.order.dal.mysql.customerorder.CustomerOrderMapper
;
import
static
cn
.
iocoder
.
foodnexus
.
framework
.
common
.
exception
.
util
.
ServiceExceptionUtil
.
exception
;
import
static
cn
.
iocoder
.
foodnexus
.
framework
.
common
.
util
.
collection
.
CollectionUtils
.
convertList
;
import
static
cn
.
iocoder
.
foodnexus
.
module
.
order
.
enums
.
ErrorCodeConstants
.*;
/**
...
...
@@ -104,6 +107,10 @@ public class CustomerOrderServiceImpl implements CustomerOrderService, CustomerO
private
ProductSpuService
productSpuService
;
@Autowired
@Lazy
private
ErpSaleOutService
saleOutService
;
@Autowired
private
GenCodeUtils
genCodeUtils
;
@Override
...
...
@@ -263,13 +270,24 @@ public class CustomerOrderServiceImpl implements CustomerOrderService, CustomerO
throw
exception
(
CUSTOMER_ORDER_NOT_EXISTS
);
}
// TODO ... 取消订单校验待定(订单状态)
CustomerOrderRemark
orderRemark
=
BeanUtils
.
toBean
(
reqVO
,
CustomerOrderRemark
.
class
,
item
->
{
item
.
setOperTime
(
LocalDateTime
.
now
());
});
customerOrderMapper
.
update
(
Wrappers
.<
CustomerOrderDO
>
lambdaUpdate
()
.
set
(
CustomerOrderDO:
:
getOrderRemark
,
orderRemark
)
.
eq
(
CustomerOrderDO:
:
getId
,
reqVO
.
getId
()));
CustomerOrderStatus
orderStatus
=
customerOrder
.
getOrderStatus
();
if
(
orderStatus
.
equals
(
CustomerOrderStatus
.
ORDER_SUCCESS
)
||
orderStatus
.
equals
(
CustomerOrderStatus
.
ORDER_MATCH
))
{
CustomerOrderRemark
orderRemark
=
BeanUtils
.
toBean
(
reqVO
,
CustomerOrderRemark
.
class
,
item
->
{
item
.
setOperTime
(
LocalDateTime
.
now
());
});
customerOrderMapper
.
update
(
Wrappers
.<
CustomerOrderDO
>
lambdaUpdate
()
.
set
(
CustomerOrderDO:
:
getOrderRemark
,
orderRemark
)
.
eq
(
CustomerOrderDO:
:
getId
,
reqVO
.
getId
()));
// 订单记录
CustomerOrderRecordEvent
event
=
new
CustomerOrderRecordEvent
();
event
.
setOrderStatus
(
CustomerOrderStatus
.
CANCEL
);
event
.
setCustomerOrderId
(
reqVO
.
getId
());
orderRecordApi
.
recordEvent
(
event
);
}
else
{
throw
exception
(
CUSTOMER_ORDER_STATUS_ERROR
);
}
}
/**
...
...
@@ -280,10 +298,81 @@ public class CustomerOrderServiceImpl implements CustomerOrderService, CustomerO
@Override
public
void
receipt
(
AppCustomerOrderRemarkReqVO
reqVO
)
{
// TODO .. 校验订单
CustomerOrderDO
customerOrder
=
getCustomerOrder
(
reqVO
.
getId
());
if
(
CommonUtil
.
isEmpty
(
customerOrder
))
{
throw
exception
(
CUSTOMER_ORDER_NOT_EXISTS
);
}
if
(!
customerOrder
.
getOrderStatus
().
equals
(
CustomerOrderStatus
.
ARRIVAL
))
{
throw
exception
(
CUSTOMER_ORDER_STATUS_ERROR
);
}
List
<
CustomerOrderItemDO
>
customerOrderItems
=
customerOrderItemMapper
.
selectList
(
CustomerOrderItemDO:
:
getOrderId
,
reqVO
.
getId
());
ErpSaleOutDO
saleOut
=
saleOutService
.
getSaleOutByCustomerOrderId
(
reqVO
.
getId
());
if
(
CommonUtil
.
isEmpty
(
saleOut
))
{
throw
exception
(
CUSTOMER_ORDER_OUT_ERROR
);
}
List
<
ErpSaleOutItemDO
>
saleOutItems
=
saleOutService
.
getSaleOutItemListByOutId
(
saleOut
.
getId
());
Map
<
Long
,
ErpSaleOutItemDO
>
productMap
=
CommonUtil
.
listConvertMap
(
saleOutItems
,
ErpSaleOutItemDO:
:
getProductId
);
List
<
CustomerOrderItemDO
>
updateBatch
=
new
ArrayList
<>();
customerOrderItems
.
forEach
(
customerOrderItem
->
{
CustomerOrderItemDO
updateItem
=
new
CustomerOrderItemDO
();
updateItem
.
setId
(
customerOrderItem
.
getId
());
if
(
productMap
.
containsKey
(
customerOrderItem
.
getProductId
()))
{
ErpSaleOutItemDO
saleOutItem
=
productMap
.
get
(
customerOrderItem
.
getProductId
());
updateItem
.
setSignedQuantity
(
saleOutItem
.
getCount
());
CustomerOrderRemark
remark
=
new
CustomerOrderRemark
();
remark
.
setOperTime
(
saleOutItem
.
getCreateTime
());
remark
.
setRemarkFiles
(
saleOutItem
.
getRemarkFiles
());
remark
.
setRemark
(
saleOutItem
.
getRemark
());
updateItem
.
setOrderRemark
(
remark
);
}
else
{
updateItem
.
setSignedQuantity
(
customerOrderItem
.
getOrderItemQuantity
());
}
updateItem
.
setSignedTotal
(
updateItem
.
getSignedQuantity
()
*
customerOrderItem
.
getOrderItemPrice
());
updateBatch
.
add
(
updateItem
);
});
// TODO .. 根据签收单调整订单价格等
customerOrderItemMapper
.
updateBatch
(
updateBatch
);
// TODO .. 修改订单状态
// 订单记录
CustomerOrderRecordEvent
event
=
new
CustomerOrderRecordEvent
();
event
.
setOrderStatus
(
CustomerOrderStatus
.
SIGN_RECEIPT
);
event
.
setCustomerOrderId
(
reqVO
.
getId
());
// TODO 签收单链接
event
.
setCopyWriter
(
CommonUtil
.
asList
(
"TODO 签收单链接"
));
orderRecordApi
.
recordEvent
(
event
);
}
@Override
public
List
<
AppCustomerOrderReceiptRespVO
>
queryReceipt
(
Long
id
)
{
CustomerOrderDO
customerOrder
=
getCustomerOrder
(
id
);
if
(
CommonUtil
.
isEmpty
(
customerOrder
))
{
throw
exception
(
CUSTOMER_ORDER_NOT_EXISTS
);
}
if
(!
customerOrder
.
getOrderStatus
().
equals
(
CustomerOrderStatus
.
ARRIVAL
))
{
throw
exception
(
CUSTOMER_ORDER_STATUS_ERROR
);
}
List
<
CustomerOrderItemDO
>
customerOrderItems
=
customerOrderItemMapper
.
selectList
(
CustomerOrderItemDO:
:
getOrderId
,
id
);
ErpSaleOutDO
saleOut
=
saleOutService
.
getSaleOutByCustomerOrderId
(
id
);
if
(
CommonUtil
.
isEmpty
(
saleOut
))
{
throw
exception
(
CUSTOMER_ORDER_OUT_ERROR
);
}
List
<
ErpSaleOutItemDO
>
saleOutItems
=
saleOutService
.
getSaleOutItemListByOutId
(
saleOut
.
getId
());
Map
<
Long
,
ErpSaleOutItemDO
>
productMap
=
CommonUtil
.
listConvertMap
(
saleOutItems
,
ErpSaleOutItemDO:
:
getProductId
);
return
CommonUtil
.
listConvert
(
customerOrderItems
,
customerOrderItem
->
{
AppCustomerOrderReceiptRespVO
result
=
new
AppCustomerOrderReceiptRespVO
();
result
.
setProductId
(
customerOrderItem
.
getProductId
());
if
(
productMap
.
containsKey
(
customerOrderItem
.
getProductId
()))
{
ErpSaleOutItemDO
saleOutItem
=
productMap
.
get
(
customerOrderItem
.
getProductId
());
result
.
setSignedQuantity
(
saleOutItem
.
getCount
());
result
.
setRemark
(
saleOutItem
.
getRemark
());
result
.
setRemarkFiles
(
saleOutItem
.
getRemarkFiles
());
}
else
{
result
.
setSignedQuantity
(
customerOrderItem
.
getOrderItemQuantity
());
}
return
result
;
});
}
/**
...
...
foodnexus-module-mall/foodnexus-module-order/src/main/java/cn/iocoder/foodnexus/module/order/service/customerorderrecord/CustomerOrderRecordServiceImpl.java
View file @
46cd642f
...
...
@@ -141,7 +141,10 @@ public class CustomerOrderRecordServiceImpl implements CustomerOrderRecordServic
CustomerOrderStatus
orderStatus
=
event
.
getOrderStatus
();
CustomerOrderDTO
orderInfo
=
customerOrderApi
.
queryById
(
orderId
);
String
message
=
String
.
format
(
orderStatus
.
getText
(),
event
.
getCopyWriter
().
toArray
(
new
String
[
0
]));
String
message
=
orderStatus
.
getText
();
if
(
CommonUtil
.
isNotEmpty
(
event
.
getCopyWriter
()))
{
message
=
String
.
format
(
orderStatus
.
getText
(),
event
.
getCopyWriter
().
toArray
(
new
String
[
0
]));
}
CustomerOrderRecordSaveReqVO
saveReqVO
=
new
CustomerOrderRecordSaveReqVO
();
saveReqVO
.
setCustomerId
(
orderInfo
.
getCustomerId
());
...
...
@@ -150,5 +153,7 @@ public class CustomerOrderRecordServiceImpl implements CustomerOrderRecordServic
saveReqVO
.
setSupplierId
(
event
.
getSupplierId
());
saveReqVO
.
setMessageInfo
(
message
);
this
.
createCustomerOrderRecord
(
saveReqVO
);
customerOrderApi
.
updateOrderStatus
(
orderId
,
orderStatus
);
}
}
\ No newline at end of file
foodnexus-module-mall/foodnexus-module-product/src/main/java/cn/iocoder/foodnexus/module/product/service/spu/ProductSpuService.java
View file @
46cd642f
...
...
@@ -16,6 +16,7 @@ import org.springframework.scheduling.annotation.Async;
import
java.util.Collection
;
import
java.util.List
;
import
java.util.Map
;
import
java.util.Set
;
/**
* 商品 SPU Service 接口
...
...
@@ -151,4 +152,10 @@ public interface ProductSpuService {
void
updateBrowseCount
(
Long
id
,
int
incrCount
);
void
audit
(
AuditCommonReqVO
auditReqVO
);
default
Map
<
Long
,
ProductSpuDO
>
getProductVOMap
(
Set
<
Long
>
longs
)
{
return
this
.
getSpuMap
(
longs
);
}
List
<
ProductSpuDO
>
validProductList
(
Set
<
Long
>
ids
);
}
foodnexus-module-mall/foodnexus-module-product/src/main/java/cn/iocoder/foodnexus/module/product/service/spu/ProductSpuServiceImpl.java
View file @
46cd642f
...
...
@@ -141,6 +141,25 @@ public class ProductSpuServiceImpl implements ProductSpuService {
}
@Override
public
List
<
ProductSpuDO
>
validProductList
(
Set
<
Long
>
ids
)
{
if
(
CollUtil
.
isEmpty
(
ids
))
{
return
Collections
.
emptyList
();
}
List
<
ProductSpuDO
>
list
=
productSpuMapper
.
selectByIds
(
ids
);
Map
<
Long
,
ProductSpuDO
>
productMap
=
convertMap
(
list
,
ProductSpuDO:
:
getId
);
for
(
Long
id
:
ids
)
{
ProductSpuDO
product
=
productMap
.
get
(
id
);
if
(
productMap
.
get
(
id
)
==
null
)
{
throw
exception
(
SPU_NOT_EXISTS
);
}
if
(
CommonStatusEnum
.
isDisable
(
product
.
getStatus
()))
{
throw
exception
(
SPU_NOT_ENABLE
,
product
.
getName
());
}
}
return
list
;
}
@Override
@Transactional
(
rollbackFor
=
Exception
.
class
)
public
void
deleteSpu
(
Long
id
)
{
// 校验存在
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment