Commit dbc367ad9511445c437b3b17aa5a92df4b13bab8

Authored by YunaiV
1 parent 0694bc86

✨ ERP:基本完成销售入库模块

yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/util/number/MoneyUtils.java
@@ -19,6 +19,11 @@ public class MoneyUtils { @@ -19,6 +19,11 @@ public class MoneyUtils {
19 private static final int PRICE_SCALE = 2; 19 private static final int PRICE_SCALE = 2;
20 20
21 /** 21 /**
  22 + * 百分比对应的 BigDecimal 对象
  23 + */
  24 + public static final BigDecimal PERCENT_100 = BigDecimal.valueOf(100);
  25 +
  26 + /**
22 * 计算百分比金额,四舍五入 27 * 计算百分比金额,四舍五入
23 * 28 *
24 * @param price 金额 29 * @param price 金额
@@ -107,4 +112,20 @@ public class MoneyUtils { @@ -107,4 +112,20 @@ public class MoneyUtils {
107 return price.multiply(count).setScale(PRICE_SCALE, RoundingMode.HALF_UP); 112 return price.multiply(count).setScale(PRICE_SCALE, RoundingMode.HALF_UP);
108 } 113 }
109 114
  115 + /**
  116 + * 金额相乘(百分比),默认进行四舍五入
  117 + *
  118 + * 位数:{@link #PRICE_SCALE}
  119 + *
  120 + * @param price 金额
  121 + * @param percent 百分比
  122 + * @return 金额相乘结果
  123 + */
  124 + public static BigDecimal priceMultiplyPercent(BigDecimal price, BigDecimal percent) {
  125 + if (price == null || percent == null) {
  126 + return null;
  127 + }
  128 + return price.multiply(percent).divide(PERCENT_100, PRICE_SCALE, RoundingMode.HALF_UP);
  129 + }
  130 +
110 } 131 }
yudao-module-erp/yudao-module-erp-api/src/main/java/cn/iocoder/yudao/module/erp/enums/stock/ErpStockRecordBizTypeEnum.java
@@ -30,6 +30,9 @@ public enum ErpStockRecordBizTypeEnum implements IntArrayValuable { @@ -30,6 +30,9 @@ public enum ErpStockRecordBizTypeEnum implements IntArrayValuable {
30 CHECK_MORE_IN_CANCEL(41, "盘盈入库(作废)"), 30 CHECK_MORE_IN_CANCEL(41, "盘盈入库(作废)"),
31 CHECK_LESS_OUT(42, "盘亏出库"), 31 CHECK_LESS_OUT(42, "盘亏出库"),
32 CHECK_LESS_OUT_CANCEL(43, "盘亏出库(作废)"), 32 CHECK_LESS_OUT_CANCEL(43, "盘亏出库(作废)"),
  33 +
  34 + SALE_OUT(50, "销售出库"),
  35 + SALE_OUT_CANCEL(51, "销售出库(作废)"),
33 ; 36 ;
34 37
35 public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(ErpStockRecordBizTypeEnum::getType).toArray(); 38 public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(ErpStockRecordBizTypeEnum::getType).toArray();
yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/service/sale/ErpSaleOrderServiceImpl.java
@@ -131,7 +131,7 @@ public class ErpSaleOrderServiceImpl implements ErpSaleOrderService { @@ -131,7 +131,7 @@ public class ErpSaleOrderServiceImpl implements ErpSaleOrderService {
131 if (saleOrder.getDiscountPercent() == null) { 131 if (saleOrder.getDiscountPercent() == null) {
132 saleOrder.setDiscountPercent(BigDecimal.ZERO); 132 saleOrder.setDiscountPercent(BigDecimal.ZERO);
133 } 133 }
134 - saleOrder.setDiscountPrice(MoneyUtils.priceMultiply(saleOrder.getTotalPrice(), saleOrder.getDiscountPercent())); 134 + saleOrder.setDiscountPrice(MoneyUtils.priceMultiplyPercent(saleOrder.getTotalPrice(), saleOrder.getDiscountPercent()));
135 saleOrder.setTotalPrice(saleOrder.getTotalPrice().subtract(saleOrder.getDiscountPrice())); 135 saleOrder.setTotalPrice(saleOrder.getTotalPrice().subtract(saleOrder.getDiscountPrice()));
136 } 136 }
137 137
@@ -191,8 +191,11 @@ public class ErpSaleOrderServiceImpl implements ErpSaleOrderService { @@ -191,8 +191,11 @@ public class ErpSaleOrderServiceImpl implements ErpSaleOrderService {
191 if (item.getTotalPrice() == null) { 191 if (item.getTotalPrice() == null) {
192 return; 192 return;
193 } 193 }
194 - item.setTaxPrice(MoneyUtils.priceMultiply(item.getTotalPrice(), item.getTaxPercent()));  
195 - item.setTotalPrice(item.getTotalPrice().add(item.getTaxPrice())); 194 + if (item.getTaxPercent() == null) {
  195 + item.setTaxPercent(BigDecimal.ZERO);
  196 + } else {
  197 + item.setTaxPrice(MoneyUtils.priceMultiplyPercent(item.getTotalPrice(), item.getTaxPercent()));
  198 + }
196 })); 199 }));
197 } 200 }
198 201
yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/service/sale/ErpSaleOutServiceImpl.java
@@ -15,8 +15,11 @@ import cn.iocoder.yudao.module.erp.dal.mysql.sale.ErpSaleOutItemMapper; @@ -15,8 +15,11 @@ import cn.iocoder.yudao.module.erp.dal.mysql.sale.ErpSaleOutItemMapper;
15 import cn.iocoder.yudao.module.erp.dal.mysql.sale.ErpSaleOutMapper; 15 import cn.iocoder.yudao.module.erp.dal.mysql.sale.ErpSaleOutMapper;
16 import cn.iocoder.yudao.module.erp.dal.redis.no.ErpNoRedisDAO; 16 import cn.iocoder.yudao.module.erp.dal.redis.no.ErpNoRedisDAO;
17 import cn.iocoder.yudao.module.erp.enums.ErpAuditStatus; 17 import cn.iocoder.yudao.module.erp.enums.ErpAuditStatus;
  18 +import cn.iocoder.yudao.module.erp.enums.stock.ErpStockRecordBizTypeEnum;
18 import cn.iocoder.yudao.module.erp.service.finance.ErpAccountService; 19 import cn.iocoder.yudao.module.erp.service.finance.ErpAccountService;
19 import cn.iocoder.yudao.module.erp.service.product.ErpProductService; 20 import cn.iocoder.yudao.module.erp.service.product.ErpProductService;
  21 +import cn.iocoder.yudao.module.erp.service.stock.ErpStockRecordService;
  22 +import cn.iocoder.yudao.module.erp.service.stock.bo.ErpStockRecordCreateReqBO;
20 import cn.iocoder.yudao.module.system.api.user.AdminUserApi; 23 import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
21 import jakarta.annotation.Resource; 24 import jakarta.annotation.Resource;
22 import org.springframework.context.annotation.Lazy; 25 import org.springframework.context.annotation.Lazy;
@@ -60,6 +63,8 @@ public class ErpSaleOutServiceImpl implements ErpSaleOutService { @@ -60,6 +63,8 @@ public class ErpSaleOutServiceImpl implements ErpSaleOutService {
60 private ErpSaleOrderService saleOrderService; 63 private ErpSaleOrderService saleOrderService;
61 @Resource 64 @Resource
62 private ErpAccountService accountService; 65 private ErpAccountService accountService;
  66 + @Resource
  67 + private ErpStockRecordService stockRecordService;
63 68
64 @Resource 69 @Resource
65 private AdminUserApi adminUserApi; 70 private AdminUserApi adminUserApi;
@@ -142,8 +147,11 @@ public class ErpSaleOutServiceImpl implements ErpSaleOutService { @@ -142,8 +147,11 @@ public class ErpSaleOutServiceImpl implements ErpSaleOutService {
142 if (saleOut.getDiscountPercent() == null) { 147 if (saleOut.getDiscountPercent() == null) {
143 saleOut.setDiscountPercent(BigDecimal.ZERO); 148 saleOut.setDiscountPercent(BigDecimal.ZERO);
144 } 149 }
145 - saleOut.setDiscountPrice(MoneyUtils.priceMultiply(saleOut.getTotalPrice(), saleOut.getDiscountPercent())); 150 + saleOut.setDiscountPrice(MoneyUtils.priceMultiplyPercent(saleOut.getTotalPrice(), saleOut.getDiscountPercent()));
146 saleOut.setTotalPrice(saleOut.getTotalPrice().subtract(saleOut.getDiscountPrice())); 151 saleOut.setTotalPrice(saleOut.getTotalPrice().subtract(saleOut.getDiscountPrice()));
  152 + // 计算应收金额
  153 + BigDecimal allPrice = saleOut.getTotalPrice().add(saleOut.getOtherPrice());
  154 + saleOut.setDebtPrice(allPrice.subtract(saleOut.getPayPrice()));
147 } 155 }
148 156
149 private void updateSaleOrderOutCount(Long orderId) { 157 private void updateSaleOrderOutCount(Long orderId) {
@@ -173,6 +181,17 @@ public class ErpSaleOutServiceImpl implements ErpSaleOutService { @@ -173,6 +181,17 @@ public class ErpSaleOutServiceImpl implements ErpSaleOutService {
173 if (updateCount == 0) { 181 if (updateCount == 0) {
174 throw exception(approve ? SALE_OUT_APPROVE_FAIL : SALE_OUT_PROCESS_FAIL); 182 throw exception(approve ? SALE_OUT_APPROVE_FAIL : SALE_OUT_PROCESS_FAIL);
175 } 183 }
  184 +
  185 + // 3. 变更库存
  186 + List<ErpSaleOutItemDO> saleOutItems = saleOutItemMapper.selectListByOutId(id);
  187 + Integer bizType = approve ? ErpStockRecordBizTypeEnum.SALE_OUT.getType()
  188 + : ErpStockRecordBizTypeEnum.SALE_OUT_CANCEL.getType();
  189 + saleOutItems.forEach(saleOutItem -> {
  190 + BigDecimal count = approve ? saleOutItem.getCount().negate() : saleOutItem.getCount();
  191 + stockRecordService.createStockRecord(new ErpStockRecordCreateReqBO(
  192 + saleOutItem.getProductId(), saleOutItem.getWarehouseId(), count,
  193 + bizType, saleOutItem.getOutId(), saleOutItem.getId(), saleOut.getNo()));
  194 + });
176 } 195 }
177 196
178 private List<ErpSaleOutItemDO> validateSaleOutItems(List<ErpSaleOutSaveReqVO.Item> list) { 197 private List<ErpSaleOutItemDO> validateSaleOutItems(List<ErpSaleOutSaveReqVO.Item> list) {
@@ -187,8 +206,11 @@ public class ErpSaleOutServiceImpl implements ErpSaleOutService { @@ -187,8 +206,11 @@ public class ErpSaleOutServiceImpl implements ErpSaleOutService {
187 if (item.getTotalPrice() == null) { 206 if (item.getTotalPrice() == null) {
188 return; 207 return;
189 } 208 }
190 - item.setTaxPrice(MoneyUtils.priceMultiply(item.getTotalPrice(), item.getTaxPercent()));  
191 - item.setTotalPrice(item.getTotalPrice().add(item.getTaxPrice())); 209 + if (item.getTaxPercent() == null) {
  210 + item.setTaxPercent(BigDecimal.ZERO);
  211 + } else {
  212 + item.setTaxPrice(MoneyUtils.priceMultiplyPercent(item.getTotalPrice(), item.getTaxPercent()));
  213 + }
192 })); 214 }));
193 } 215 }
194 216