Browse Source

计算价格的接口 订单顺序

yuhongqi 1 month ago
parent
commit
0f10df48be

+ 1 - 1
fs-service-system/src/main/java/com/fs/live/mapper/LiveAfterSalesMapper.java

@@ -86,7 +86,7 @@ public interface LiveAfterSalesMapper {
 
     @Select({"<script> " +
             "select s.*  from live_after_sales s   " +
-            "where s.sales_status=0 and s.status=0 and date_format(date_add(s.create_time, interval 24 hour),'%Y-%m-%d %H') &gt;= date_format(now(),'%Y-%m-%d %H')  " +
+            "where s.sales_status=0 and s.status=0 and date_format(date_add(s.create_time, interval 24 hour),'%Y-%m-%d %H') &gt;= date_format(now(),'%Y-%m-%d %H') order by create_time desc " +
             "</script>"})
     List<LiveAfterSales> selectLiveAfterSalesByDoAudit();
 

+ 5 - 0
fs-service-system/src/main/java/com/fs/live/service/ILiveOrderService.java

@@ -9,6 +9,9 @@ import com.fs.live.vo.LiveGoodsVo;
 import com.fs.live.vo.LiveOrderListVo;
 import com.fs.live.vo.LiveOrderVo;
 import com.fs.store.domain.FsStoreOrder;
+import com.fs.store.dto.FsStoreOrderComputeDTO;
+import com.fs.store.dto.LiveOrderComputeDTO;
+import com.fs.store.param.LiveOrderComputedParam;
 
 import java.text.ParseException;
 import java.util.List;
@@ -172,4 +175,6 @@ public interface ILiveOrderService {
     List<LiveOrder> selectDeliverPenddingData();
 
     void deliveryOrder(String orderCode, String mailNo, String expressCode, String expressName);
+
+    LiveOrderComputeDTO computedOrder(long l, LiveOrderComputedParam param);
 }

+ 100 - 0
fs-service-system/src/main/java/com/fs/live/service/impl/LiveOrderServiceImpl.java

@@ -70,6 +70,7 @@ import com.fs.store.enums.ShippingTempEnum;
 import com.fs.store.mapper.FsStoreProductAttrValueMapper;
 import com.fs.store.mapper.FsUserMapper;
 import com.fs.store.mapper.FsWarehousesMapper;
+import com.fs.store.param.LiveOrderComputedParam;
 import com.fs.store.service.*;
 import com.fs.store.service.channel.PaymentHandler;
 import com.fs.store.service.channel.PaymentHandlerHolder;
@@ -1291,6 +1292,105 @@ public class LiveOrderServiceImpl implements ILiveOrderService {
         }
     }
 
+    @Override
+    public LiveOrderComputeDTO computedOrder(long l, LiveOrderComputedParam param) {
+        String orderKey= redisCache.getCacheObject("orderKey:"+param.getOrderKey());
+        if (StringUtils.isEmpty(orderKey)) {
+            return null;
+        }
+        FsStoreProduct fsStoreProduct = fsStoreProductService.selectFsStoreProductById(param.getProductId());
+        BigDecimal payPrice = fsStoreProduct.getPrice().multiply(new BigDecimal(param.getTotalNum()));
+        BigDecimal payDelivery = handleDeliveryMoney(param.getCityId(), fsStoreProduct, param.getTotalNum());
+
+
+        return LiveOrderComputeDTO.builder().payPrice(payPrice)
+                .payDelivery(payDelivery)
+                .totalPrice(payPrice.add(payDelivery))
+                .build();
+    }
+
+    private BigDecimal handleDeliveryMoney(Long cityId, FsStoreProduct fsStoreProduct, String totalNumSize) {
+        BigDecimal storePostage = BigDecimal.ZERO;
+        List<Long> citys = new ArrayList<>();
+        citys.add(cityId);
+        citys.add(0l);
+        String ids = String.valueOf(fsStoreProduct.getTempId());
+        List<FsShippingTemplates> shippingTemplatesList = shippingTemplatesService.selectFsShippingTemplatesByIds(ids);
+        String cityIds = String.join(",", citys.stream()
+                .map(String::valueOf).collect(Collectors.toList()));
+        List<FsShippingTemplatesRegion> shippingTemplatesRegionList = shippingTemplatesRegionService.selectFsShippingTemplatesRegionListByTempIdsAndCityIds(ids,cityIds);
+        Map<Long, Integer> shippingTemplatesMap = shippingTemplatesList
+                .stream()
+                .collect(Collectors.toMap(FsShippingTemplates::getId,
+                        FsShippingTemplates::getType));
+        //提取运费模板有相同值覆盖
+        Map<Long, FsShippingTemplatesRegion> shippingTemplatesRegionMap =
+                shippingTemplatesRegionList.stream()
+                        .collect(Collectors.toMap(FsShippingTemplatesRegion::getTempId,
+                                YxShippingTemplatesRegion -> YxShippingTemplatesRegion,
+                                (key1, key2) -> key2));
+        Long tempId = Long.valueOf(fsStoreProduct.getTempId());
+        double num = 0d;
+        Integer templateType = shippingTemplatesMap.get(tempId);
+        List<FsStoreProductAttrValue> productAttrValues = fsStoreProductAttrValueMapper.selectFsStoreProductAttrValueByProductId(fsStoreProduct.getProductId());
+        if(productAttrValues == null || productAttrValues.isEmpty()) {
+            return storePostage;
+        }
+        FsStoreProductAttrValue productAttrValue = productAttrValues.get(0);
+        Integer totalNum = Integer.valueOf(totalNumSize);
+        // TYPE_1: 按件数计算
+        if (ShippingTempEnum.TYPE_1.getValue().equals(templateType)) {
+            num = totalNum.doubleValue();
+        }
+        // TYPE_2: 按重量计算(数量 × 重量)
+        else if (ShippingTempEnum.TYPE_2.getValue().equals(templateType)) {
+            num = NumberUtil.mul(totalNum, productAttrValue.getWeight()).doubleValue();
+        }
+        // TYPE_3: 按体积计算(数量 × 体积)
+        else if (ShippingTempEnum.TYPE_3.getValue().equals(templateType)) {
+            num = NumberUtil.mul(totalNum, productAttrValue.getVolume()).doubleValue();
+        }
+        FsShippingTemplatesRegion shippingTemplatesRegion = shippingTemplatesRegionMap.get(tempId);
+        if (shippingTemplatesRegion == null) {
+            log.error("没有找到运费模板");
+            return storePostage;
+        }
+        BigDecimal price = NumberUtil.round(NumberUtil.mul(totalNum, fsStoreProduct.getPrice()), 2);
+
+        TemplateDTO templateDTO = TemplateDTO.builder()
+                .number(num)  // 累计数量(件数/重量/体积)
+                .price(price)  // 累计金额
+                .first(shippingTemplatesRegion.getFirst().doubleValue())  // 首件数量
+                .firstPrice(shippingTemplatesRegion.getFirstPrice())  // 首件运费
+                .continues(shippingTemplatesRegion.getContinues().doubleValue())  // 续件数量
+                .continuePrice(shippingTemplatesRegion.getContinuePrice())  // 续件运费
+                .tempId(tempId)  // 模板ID
+                .cityId(cityId)  // 城市ID
+                .build();
+        //只满足首件
+        if (Double.compare(templateDTO.getNumber(), templateDTO.getFirst()) <= 0) {
+            storePostage = NumberUtil.round(NumberUtil.add(storePostage,
+                    templateDTO.getFirstPrice()), 2);
+        } else {
+            BigDecimal firstPrice = NumberUtil.add(storePostage, templateDTO.getFirstPrice());
+
+            if (templateDTO.getContinues() <= 0) {
+                storePostage = firstPrice;
+            } else {
+                //续件平均值且向上取整数
+                double average = Math.ceil(NumberUtil.div(NumberUtil.sub(templateDTO.getNumber(),
+                                templateDTO.getFirst()),
+                        templateDTO.getContinues().doubleValue()));
+                //最终邮费
+                storePostage = NumberUtil.add(firstPrice, NumberUtil.mul(average,
+                        templateDTO.getContinuePrice()));
+            }
+
+        }
+
+        return storePostage;
+    }
+
     public  boolean containsAddress(String companyName) {
         String[] items= {"新疆","西藏","内蒙古","海南"};
         boolean found = false;

+ 2 - 2
fs-service-system/src/main/java/com/fs/live/service/impl/LiveServiceImpl.java

@@ -534,7 +534,7 @@ public class LiveServiceImpl implements ILiveService
 
     @Override
     public R finishLive(Live live) {
-        Live exist = baseMapper.selectLiveByLiveIdAndCompanyIdAndCompanyUserId(live.getLiveId(),live.getCompanyId(),live.getCompanyUserId());
+        Live exist = baseMapper.selectLiveByLiveId(live.getLiveId());
         if (exist == null) {
             return R.error("直播间不存在");
         }
@@ -553,7 +553,7 @@ public class LiveServiceImpl implements ILiveService
 
     @Override
     public R startLive(Live live) {
-        Live exist = baseMapper.selectLiveByLiveIdAndCompanyIdAndCompanyUserId(live.getLiveId(),live.getCompanyId(),live.getCompanyUserId());
+        Live exist = baseMapper.selectLiveByLiveId(live.getLiveId());
         if (exist == null) {
             return R.error("直播间不存在");
         }

+ 34 - 0
fs-service-system/src/main/java/com/fs/store/dto/LiveOrderComputeDTO.java

@@ -0,0 +1,34 @@
+package com.fs.store.dto;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class LiveOrderComputeDTO implements Serializable
+{
+
+    private BigDecimal payPrice;
+
+    private BigDecimal totalPrice;
+
+    private Double usedIntegral; //使用了多少积分
+
+    private BigDecimal payIntegral;
+
+    private BigDecimal serviceFee; //服务费
+
+    private BigDecimal payPostage;
+    private BigDecimal payDelivery;
+
+    private BigDecimal deductionPrice;
+
+
+}

+ 32 - 0
fs-service-system/src/main/java/com/fs/store/param/LiveOrderComputedParam.java

@@ -0,0 +1,32 @@
+package com.fs.store.param;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+public class LiveOrderComputedParam implements Serializable
+{
+    @ApiModelProperty(value = "orderKey")
+    private String orderKey;
+    //@NotBlank(message = "请选择地址")
+    @ApiModelProperty(value = "地址ID")
+    private Long addressId;
+
+    private Long productId;
+    private String totalNum;
+    private Long cityId;
+
+
+    @ApiModelProperty(value = "使用积分 1使用")
+    private Integer useIntegral;
+    @ApiModelProperty(value = "优惠券")
+    private Long couponUserId;
+
+    private String createOrderKey;
+
+    private Long companyId;
+    private Long companyUserId;
+
+}

+ 2 - 0
fs-service-system/src/main/resources/mapper/live/LiveAfterSalesMapper.xml

@@ -96,11 +96,13 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="companyUserId != null "> and las.company_user_id = #{companyUserId}</if>
             <if test="deptId != null "> and cu.dept_id = #{deptId}</if>
         </where>
+        order by las.create_time desc
     </select>
 
     <select id="selectLiveAfterSalesById" parameterType="Long" resultMap="LiveAfterSalesResult">
         <include refid="selectLiveAfterSalesVo"/>
         where id = #{id}
+        order by create_time desc
     </select>
 
     <insert id="insertLiveAfterSales" parameterType="LiveAfterSales" useGeneratedKeys="true" keyProperty="id">

+ 3 - 0
fs-service-system/src/main/resources/mapper/live/LiveOrderMapper.xml

@@ -93,6 +93,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             a.use_integral,	a.pay_integral,	a.back_integral,	a.is_edit_money,	b.product_info as product_introduce
         FROM
             live_order a LEFT JOIN fs_store_product b ON a.product_id = b.product_id
+        order by a.create_time desc
     </sql>
 
     <select id="selectLiveOrderList" parameterType="LiveOrder" resultMap="LiveOrderResult">
@@ -178,6 +179,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="isEditMoney != null "> and is_edit_money = #{isEditMoney}</if>
             <if test="orderName != null "> and order_name = #{orderName}</if>
         </where>
+        order by a.create_time desc
     </select>
 
     <select id="selectLiveOrderByOrderId" parameterType="String" resultMap="LiveOrderResult">
@@ -198,6 +200,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
                          left join company_user cu on a.company_user_id = cu.user_id
                          left join company c on a.company_id = c.company_id
         where a.order_id = #{orderId}
+        order by a.create_time desc
     </select>
 
     <insert id="insertLiveOrder" parameterType="LiveOrder" useGeneratedKeys="true" keyProperty="orderId">

+ 13 - 0
fs-user-app/src/main/java/com/fs/app/controller/LiveOrderController.java

@@ -24,8 +24,12 @@ import com.fs.live.param.LiveOrderConfirmParam;
 import com.fs.live.service.ILiveOrderService;
 import com.fs.live.vo.LiveOrderListVo;
 import com.fs.store.dto.ExpressInfoDTO;
+import com.fs.store.dto.FsStoreOrderComputeDTO;
+import com.fs.store.dto.LiveOrderComputeDTO;
 import com.fs.store.enums.ShipperCodeEnum;
+import com.fs.store.param.FsStoreOrderComputedParam;
 import com.fs.store.param.FsStoreOrderRefundParam;
+import com.fs.store.param.LiveOrderComputedParam;
 import com.fs.store.param.LiveOrderRefundParam;
 import com.fs.store.service.IFsExpressService;
 import com.github.pagehelper.PageHelper;
@@ -133,6 +137,15 @@ public class LiveOrderController extends AppBaseController
         return liveOrderService.createLiveOrder(liveOrder);
     }
 
+    @Login
+    @ApiOperation("计算订单金额")
+    @PostMapping("/computed")
+    public R computed(@Validated @RequestBody LiveOrderComputedParam param){
+
+        LiveOrderComputeDTO dto=liveOrderService.computedOrder(Long.parseLong(getUserId()),param);
+        return R.ok().put("data",dto);
+    }
+
     /**
      * 修改订单
      */