yubin il y a 1 semaine
Parent
commit
07e5b5754b

+ 130 - 0
mall-service/src/main/java/com/txz/mall/controller/PinkController.java

@@ -1,19 +1,30 @@
 package com.txz.mall.controller;
 
 import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.date.DateField;
+import cn.hutool.core.date.DateTime;
+import cn.hutool.core.date.DateUtil;
 import com.github.pagehelper.PageHelper;
 import com.github.pagehelper.PageInfo;
 import com.txz.mall.business.PinkServiceBusiness;
 import com.txz.mall.core.Result;
 import com.txz.mall.core.ResultCode;
+import com.txz.mall.core.ResultGenerator;
+import com.txz.mall.core.ServiceException;
+import com.txz.mall.dao.StorePinkMapper;
+import com.txz.mall.enums.PinkOrderStatusEnum;
+import com.txz.mall.enums.StorePinkStatusEnum;
 import com.txz.mall.model.StoreOrder;
 import com.txz.mall.model.StorePink;
 import com.txz.mall.service.StorePinkService;
+import com.txz.mall.util.I18nUtil;
+import com.txz.mall.web.param.OrderStatisticsParam;
 import com.txz.mall.web.param.StorePinkParam;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.springframework.util.ObjectUtils;
 import org.springframework.web.bind.annotation.*;
 import tk.mybatis.mapper.entity.Condition;
 import tk.mybatis.mapper.entity.Example;
@@ -21,6 +32,9 @@ import vo.StorePinkDetailVO;
 import vo.StorePinkOngoingVO;
 
 import javax.annotation.Resource;
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
 
@@ -186,4 +200,120 @@ public class PinkController {
         storePinkService.theSelection(orderId,new Date());
         return Result.success();
     }
+    @Resource
+    private StorePinkMapper storePinkMapper;
+    @ApiOperation(value = "订单统计")
+    @PostMapping(value = "/Order/Statistics")
+    public Result orderStatistics(@RequestBody OrderStatisticsParam orderStatisticsParam) {
+
+        //统计周期1.天   2.周   3.月  4.年
+        Date date = new Date();
+        DateTime offsetDate = null;
+        if(new Integer(1).equals(orderStatisticsParam.getStatisticsPeriod())){
+            offsetDate = DateUtil.offsetDay(date, -1);
+        }else if(new Integer(2).equals(orderStatisticsParam.getStatisticsPeriod())){
+            offsetDate = DateUtil.offsetWeek(date,-1);
+        }else if(new Integer(3).equals(orderStatisticsParam.getStatisticsPeriod())){
+            offsetDate = DateUtil.offsetMonth(date,-1);
+        }else if(new Integer(4).equals(orderStatisticsParam.getStatisticsPeriod())){
+            offsetDate = DateUtil.offset(date, DateField.DAY_OF_YEAR, -1);
+        }
+
+        Condition c = new Condition(StorePink.class);
+        Example.Criteria criteria = c.createCriteria();
+
+        if(!ObjectUtils.isEmpty(offsetDate)) {
+            criteria.andGreaterThanOrEqualTo("createTime", offsetDate);
+        }else if((!ObjectUtils.isEmpty(orderStatisticsParam.getStartTime())) && (!ObjectUtils.isEmpty(orderStatisticsParam.getEndTime()))){
+            criteria.andBetween("createTime", orderStatisticsParam.getStartTime(),orderStatisticsParam.getEndTime());
+        }else{
+            throw new ServiceException(I18nUtil.get("please.input.the.statistical.cycle"));
+        }
+        // 统计类型 1.开团量  2.创建订单量  3.支付订单量  4.成团量   5.订单支付成功率   6.订单平均支付金额
+
+        if(new Integer(1).equals(orderStatisticsParam.getStatisticsType())){
+           // criteria.andEqualTo("orderStatus", 3);
+            criteria.andEqualTo("kId", 0);
+        }else if(new Integer(2).equals(orderStatisticsParam.getStatisticsType())){
+          //  2.创建订单量
+
+        }else if(new Integer(3).equals(orderStatisticsParam.getStatisticsType())){
+         //   3.支付订单量
+//             *    GROUP_ORDER_TO_PAY(1, "拼团待支付"),
+//             *     GROUP_ORDER_CANCELLATION(2, "拼团订单取消"),
+//             *     GROUP_ORDER_PAID(3, "拼团已支付"),
+//             *     GROUP_ORDER_REFUND(4, "拼团失败已退款"),   //拼团超时失败  和 拼团成功后用户主动发起退款都会进到这个状态
+//             *     GROUP_ORDER_TO_SHIP(5, "拼团待发货"),
+//             *     GROUP_ORDER_CLOSED(6, "拼团未中奖关闭"),
+//             *     GROUP_ORDER_TO_RECEIVE(7, "拼团待收货"),
+//             *     GROUP_ORDER_COMPLETED(8, "拼团订单完成");
+
+
+            List<Integer> orderStatus = new ArrayList<>();
+            orderStatus.add(PinkOrderStatusEnum.GROUP_ORDER_PAID.getKey());
+            orderStatus.add(PinkOrderStatusEnum.GROUP_ORDER_REFUND.getKey());
+            orderStatus.add(PinkOrderStatusEnum.GROUP_ORDER_TO_SHIP.getKey());
+            orderStatus.add(PinkOrderStatusEnum.GROUP_ORDER_CLOSED.getKey());
+            orderStatus.add(PinkOrderStatusEnum.GROUP_ORDER_TO_RECEIVE.getKey());
+            orderStatus.add(PinkOrderStatusEnum.GROUP_ORDER_COMPLETED.getKey());
+            criteria.andIn("orderStatus", orderStatus);
+
+        }else if(new Integer(4).equals(orderStatisticsParam.getStatisticsType())){
+           // 4.成团量
+            criteria.andEqualTo("lId", 1);
+
+        }else if(new Integer(5).equals(orderStatisticsParam.getStatisticsType())){
+            //5.订单支付成功率
+            //已支付用订单的量
+            List<Integer> orderStatus = new ArrayList<>();
+            orderStatus.add(PinkOrderStatusEnum.GROUP_ORDER_PAID.getKey());
+            orderStatus.add(PinkOrderStatusEnum.GROUP_ORDER_REFUND.getKey());
+            orderStatus.add(PinkOrderStatusEnum.GROUP_ORDER_TO_SHIP.getKey());
+            orderStatus.add(PinkOrderStatusEnum.GROUP_ORDER_CLOSED.getKey());
+            orderStatus.add(PinkOrderStatusEnum.GROUP_ORDER_TO_RECEIVE.getKey());
+            orderStatus.add(PinkOrderStatusEnum.GROUP_ORDER_COMPLETED.getKey());
+            criteria.andIn("orderStatus", orderStatus);
+            int i = storePinkMapper.selectCountByCondition(c);
+
+
+            //总订单的量
+            Condition c2 = new Condition(StorePink.class);
+            Example.Criteria criteria2 = c2.createCriteria();
+            if(!ObjectUtils.isEmpty(offsetDate)) {
+                criteria2.andGreaterThanOrEqualTo("createTime", offsetDate);
+            }
+            if((!ObjectUtils.isEmpty(orderStatisticsParam.getStartTime())) && (!ObjectUtils.isEmpty(orderStatisticsParam.getEndTime()))){
+                criteria2.andBetween("createTime", orderStatisticsParam.getStartTime(),orderStatisticsParam.getEndTime());
+            }
+            int ii = storePinkMapper.selectCountByCondition(c2);
+            if(ii==0){
+                throw new ServiceException(I18nUtil.get("the.denominator.is.0"));
+            }
+
+            // 转换为BigDecimal,避免整数除法
+            BigDecimal num = BigDecimal.valueOf(i);
+            BigDecimal den = BigDecimal.valueOf(ii);
+            BigDecimal divide = num.divide(den, 2, RoundingMode.HALF_UP);
+            // 计算:(分子 / 分母) * 100,指定舍入模式(四舍五入)
+
+            return Result.success(divide);
+
+        }else if(new Integer(6).equals(orderStatisticsParam.getStatisticsType())){
+            //6.订单平均支付金额
+                List<Integer> orderStatus = new ArrayList<>();
+                orderStatus.add(PinkOrderStatusEnum.GROUP_ORDER_PAID.getKey());
+                orderStatus.add(PinkOrderStatusEnum.GROUP_ORDER_REFUND.getKey());
+                orderStatus.add(PinkOrderStatusEnum.GROUP_ORDER_TO_SHIP.getKey());
+                orderStatus.add(PinkOrderStatusEnum.GROUP_ORDER_CLOSED.getKey());
+                orderStatus.add(PinkOrderStatusEnum.GROUP_ORDER_TO_RECEIVE.getKey());
+                orderStatus.add(PinkOrderStatusEnum.GROUP_ORDER_COMPLETED.getKey());
+                BigDecimal bigDecimal = storePinkMapper.calculateTheAveragePaymentAmount(offsetDate, date, orderStatus);
+                BigDecimal bigDecimal1 = bigDecimal.setScale(2, RoundingMode.UP);
+            return ResultGenerator.genSuccessResult(bigDecimal1);
+        }
+
+        int i = storePinkMapper.selectCountByCondition(c);
+        return ResultGenerator.genSuccessResult(i);
+    }
+
 }

+ 12 - 0
mall-service/src/main/java/com/txz/mall/dao/StorePinkMapper.java

@@ -8,6 +8,7 @@ import org.apache.ibatis.annotations.Param;
 import org.apache.ibatis.annotations.Select;
 import org.apache.ibatis.annotations.SelectProvider;
 
+import java.math.BigDecimal;
 import java.util.Date;
 import java.util.List;
 import java.util.Map;
@@ -25,5 +26,16 @@ public interface StorePinkMapper extends Mapper<StorePink> {
 //            "</foreach> " +
 //            "pid in (productSet) and create_time > #{date} group by pid ORDER BY num desc limit 20")
     List<Map<String,Object>> getRank(@Param("date") Date date,@Param("productSet") Set<Long> productSet);
+
+
+//        @Select("select AVG(total_price) from m_store_pink " +
+//                "where order_status in " +
+//            "<foreach collection='statusList' item='item' open='(' separator=',' close=')'>" +
+//               "#{item}" +
+//            "</foreach> " +
+//            "and create_time >= #{startDate}"+
+//            "and create_time <= #{endDate}"
+//        )
+     BigDecimal calculateTheAveragePaymentAmount(@Param("startDate") Date startDate, @Param("endDate") Date endDate, @Param("statusList") List<Integer> statusList);
     
 }

+ 23 - 0
mall-service/src/main/java/com/txz/mall/web/param/OrderStatisticsParam.java

@@ -0,0 +1,23 @@
+package com.txz.mall.web.param;
+
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+@Data
+public class OrderStatisticsParam implements Serializable {
+
+    /**
+     *  统计周期1.天   2.周   3.月  4.年
+     */
+    private Integer statisticsPeriod;
+    private Date startTime;   //统计开始时间
+    private Date endTime;   //统计结束时间
+
+    /**
+     * 统计类型 1.开团量  2.创建订单量  3.支付订单量  4.成团量   5.订单支付成功率   6.订单平均支付金额
+     */
+    private Integer statisticsType;
+
+}

+ 2 - 0
mall-service/src/main/resources/i18n/messages_en_US.properties

@@ -157,6 +157,8 @@ new.add=new.add
 linkage.update.of.activity.inventory.failed.when.modifying.products=linkage update of activity inventory failed when modifying products
 failed.to.increase.virtual.sales.during.payment=failed to increase virtual sales during payment
 participation.type.is.empty=participation type is empty
+the.denominator.is.0=the denominator is 0
+please.input.the.statistical.cycle=please input the statistical cycle
 
 
 interface=interface

+ 3 - 0
mall-service/src/main/resources/i18n/messages_zh_CN.properties

@@ -155,6 +155,9 @@ automatic.order.receipt.confirmation=\u8BA2\u5355\u81EA\u52A8\u7B7E\u6536
 product.export.template=\u5546\u54C1\u5BFC\u51FA\u6A21\u677F
 you.have.already.checked.in.today=\u4ECA\u5929\u5DF2\u7ECF\u7B7E\u5230\u8FC7\u4E86\uFF01
 participation.type.is.empty=\u53C2\u56E2\u7C7B\u578B\u4E3A\u7A7A
+the.denominator.is.0=\u5206\u6BCD\u4E3A0
+please.input.the.statistical.cycle=\u8BF7\u4F20\u5165\u7EDF\u8BA1\u5468\u671F
+
 interface=\u63A5\u53E3
 does.not.exist=\u4E0D\u5B58\u5728
 internal.error.please.contact.the.administrator=\u5185\u90E8\u5F02\u5E38\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458

+ 18 - 0
mall-service/src/main/resources/mapper/StorePinkMapper.xml

@@ -47,4 +47,22 @@
     </select>
 
 
+    <select id="calculateTheAveragePaymentAmount" resultType="java.math.BigDecimal">
+
+                select COALESCE(AVG(total_price))
+                from m_store_pink where order_status in
+                <foreach collection='statusList' item='item' open='(' separator=',' close=')'>
+                    #{item}
+                </foreach>
+                and create_time &gt;= #{startDate}
+                and create_time &lt;= #{endDate}
+    </select>
+
+    <!--        where order_status in-->
+
+    <!--        and create_time >= #{startDate}-->
+    <!--        and create_time<= #{endDate}-->
+
+
+
 </mapper>