From 9c5dda67aac54403190fde2607d4943f596dab5d Mon Sep 17 00:00:00 2001 From: HH Date: Sun, 19 Mar 2023 14:31:54 +0800 Subject: [PATCH] =?UTF-8?q?=E5=90=8E=E5=8F=B0=E4=B8=8B=E5=8D=95=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../web/controller/order/OrderController.java | 120 ++++++++++++++---- .../ghy/order/domain/OrderTemplateGoods.java | 2 +- .../order/request/SysOrderAssignRequest.java | 8 +- 3 files changed, 105 insertions(+), 25 deletions(-) diff --git a/ghy-admin/src/main/java/com/ghy/web/controller/order/OrderController.java b/ghy-admin/src/main/java/com/ghy/web/controller/order/OrderController.java index 027cc719..b102b424 100644 --- a/ghy-admin/src/main/java/com/ghy/web/controller/order/OrderController.java +++ b/ghy-admin/src/main/java/com/ghy/web/controller/order/OrderController.java @@ -52,6 +52,7 @@ import org.springframework.web.bind.annotation.ResponseBody; import javax.annotation.Resource; import java.math.BigDecimal; +import java.math.RoundingMode; import java.text.ParseException; import java.time.LocalDate; import java.time.LocalDateTime; @@ -140,13 +141,20 @@ public class OrderController extends BaseController { */ @PostMapping("/sys/order") @ResponseBody + @Transactional(rollbackFor = Exception.class) public AjaxResult sysOrder(@RequestBody SysOrderAssignRequest request) { String goodsBrand = request.getGoodsBrand(); Long deptId = getSysUser().getDeptId(); - - ArrayList goodList = new ArrayList<>(); + List goodsList = request.getGoods(); + // 订单总价 不能小于0 + BigDecimal orderPrice = BigDecimal.valueOf(request.getPrice()).max(BigDecimal.ZERO); + // 商品单价 + BigDecimal goodsPrice = orderPrice.divide(BigDecimal.valueOf(goodsList.size()), RoundingMode.HALF_UP); + // 累计商品价格 用来处理商品单价除不尽的情况 + BigDecimal goodsPriceAccumulative = BigDecimal.ZERO; + int goodsNum = 0; // 新增商品 -- 商品不关联师傅,状态为不展示在商城页面 - for (OrderTemplateGoods good : request.getGoods()) { + for (OrderTemplateGoods good : goodsList) { List dgcIds = good.getDeptGoodsCategoryIds(); List dgcNames = good.getDeptGoodsCategoryNames(); // 商品的4级类要完整 @@ -159,38 +167,106 @@ public class OrderController extends BaseController { goods.setDeptGoodsCategoryId(dgcIds.get(2)); goods.setDeptGoodsCategoryName(dgcNames.get(2)); goods.setStatus(1); - goodList.add(goods); GoodsStandard standard = new GoodsStandard(); standard.setGoodsStandardName(good.getGoodsName()); standard.setDeptGoodsCategoryId(dgcIds.get(3)); standard.setGoodsCategoryName(dgcNames.get(3)); + if ((++goodsNum) == (goodsList.size() - 1)) { + standard.setGoodsPrice(orderPrice.subtract(goodsPriceAccumulative)); + } else { + standard.setGoodsPrice(goodsPrice); + goodsPriceAccumulative = goodsPriceAccumulative.add(goodsPrice); + } goodsService.insertGoods(goods); - } - - List appGoodsList = goodList.stream().map(x -> { - AppGoodsRequest agr = new AppGoodsRequest(); - - return agr; - }).collect(Collectors.toList()); - BigDecimal totalPay = goodsService.calculate(appGoodsList); - try { - - // 选择消费者(消费者类型为渠道商、不需要) -- - - // 生成消费者下单地址 + standard.setGoodsId(goods.getGoodsId()); + goodsStandardService.save(Collections.singletonList(standard)); // 生成主单 + OrderMaster orderMaster = new OrderMaster(); + orderMaster.setDeptId(deptId); + orderMaster.setCode(orderMasterService.createOrderCode()); + orderMaster.setOrderType(0); + orderMaster.setOrderStatus(OrderStatus.RECEIVE.code()); + orderMaster.setAddressId(request.getAddressId()); + orderMaster.setPayStatus(PayStatus.WAIT_PAY.getCode()); + orderMaster.setCreateTime(new Date()); + orderMaster.setWorkerId(goods.getWorkerId()); + orderMaster.setGoodsId(goods.getGoodsId()); + orderMasterService.insertOrderMaster(orderMaster); + Assert.notNull(orderMaster.getId(), "OrderMaster.id is null!"); - // 生成财务单 + // 生成财务主单 + FinancialMaster financialMaster = new FinancialMaster(financialMasterService.createCode(), deptId, + orderMaster.getId(), orderMaster.getCode(), standard.getGoodsPrice(), BigDecimal.ZERO, standard.getGoodsPrice()); + financialMaster.setServerMoney(financialMaster.getTotalMoney()); + financialMasterService.insertFinancialMaster(financialMaster); + Assert.notNull(financialMaster.getId(), "FinancialMaster.id is null!"); - // 生成财务细单 -- 平台扣点、提成 - return AjaxResult.success("下单成功"); - } catch (Exception e) { + // 生成提成类子财务单 + createDeptFinancialDetail(standard, deptId, financialMaster); + + // 生成商品订单 + OrderGoods orderGoods = new OrderGoods(orderMaster.getId(), standard.getGoodsStandardId(), + standard.getGoodsStandardName(), good.getNumber(), 0); + orderGoodsService.insertOrderGoods(orderGoods); - return AjaxResult.error("系统异常"); } + + // 选择消费者(消费者类型为渠道商、不需要) -- + + // 生成消费者下单地址 + + // 生成主单 + + // 生成财务单 + + // 生成财务细单 -- 平台扣点、提成 + return AjaxResult.success("下单成功"); + } + + /** + * 平台下单时生成子财务单的方法 + * 只有平台扣点和截流扣点 + * + * @param goodsStandard 商品 + * @param deptId 企业ID + * @param financialMaster 主财务单 + */ + private void createDeptFinancialDetail(GoodsStandard goodsStandard, Long deptId, FinancialMaster financialMaster) { + // 平台 + BigDecimal deptMoney = BigDecimal.ZERO; + // 截流扣点 + BigDecimal specialMoney = BigDecimal.ZERO; + // 服务金额 + BigDecimal serverMoney = financialMaster.getServerMoney(); + // 扣点设置类目 + DeptGoodsCategory deptGoodsCategory = deptGoodsCategoryService.get(goodsStandard.getDeptGoodsCategoryId()); + // 平台扣点 = 平台金额 + 商品单价 * 扣点比例 + deptMoney = deptMoney.add(deptGoodsCategory.getDeptMoney()) + .add(goodsStandard.getGoodsPrice().multiply(BigDecimal.valueOf(Double.parseDouble(deptGoodsCategory.getDeptRate())))); + // 截流扣点 = 截流金额 + 商品单价 * 扣点比例 + specialMoney = specialMoney.add(deptGoodsCategory.getRetainMoney()) + .add(goodsStandard.getGoodsPrice().multiply(BigDecimal.valueOf(Double.parseDouble(deptGoodsCategory.getRetainRate())))); + // 平台扣点记录 + FinancialDetail deptDetail = new FinancialDetail(deptId, financialDetailService.createCode(), + financialMaster.getId(), financialMaster.getCode(), deptMoney, FinancialDetailType.PLATFORM_FEE.getCode(), null); + financialDetailService.insertFinancialDetail(deptDetail); + // 剩余服务金额 + serverMoney = serverMoney.subtract(deptMoney); + + // 截流扣点记录 + FinancialDetail retainDetail = new FinancialDetail(deptId, financialDetailService.createCode(), + financialMaster.getId(), financialMaster.getCode(), specialMoney, FinancialDetailType.PLATFORM_FEE.getCode(), null); + financialDetailService.insertFinancialDetail(retainDetail); + // 剩余服务金额 + serverMoney = serverMoney.subtract(specialMoney); + + FinancialMaster fmUpdate = new FinancialMaster(); + fmUpdate.setId(financialMaster.getId()); + fmUpdate.setServerMoney(serverMoney); + financialMasterService.updateFinancialMaster(financialMaster); } /** diff --git a/ghy-order/src/main/java/com/ghy/order/domain/OrderTemplateGoods.java b/ghy-order/src/main/java/com/ghy/order/domain/OrderTemplateGoods.java index e0802a90..c0fcd531 100644 --- a/ghy-order/src/main/java/com/ghy/order/domain/OrderTemplateGoods.java +++ b/ghy-order/src/main/java/com/ghy/order/domain/OrderTemplateGoods.java @@ -22,5 +22,5 @@ public class OrderTemplateGoods { // 四层商品类型 private List deptGoodsCategoryNames; // 商品数量 - private Long number; + private Integer number; } diff --git a/ghy-order/src/main/java/com/ghy/order/request/SysOrderAssignRequest.java b/ghy-order/src/main/java/com/ghy/order/request/SysOrderAssignRequest.java index d60ea590..925526b2 100644 --- a/ghy-order/src/main/java/com/ghy/order/request/SysOrderAssignRequest.java +++ b/ghy-order/src/main/java/com/ghy/order/request/SysOrderAssignRequest.java @@ -13,7 +13,8 @@ public class SysOrderAssignRequest { // 商品品牌 private String goodsBrand; - + // 商品规格 + private String goodsSpecification; // 视频 private String videoUrl; // 图片 @@ -21,5 +22,8 @@ public class SysOrderAssignRequest { // 商品相关信息 private Long goodsDeptCategoryId; - + // 服务地址ID + private Long addressId; + // 发布价格(限制整数) + private Integer price; }