qin 1 年之前
父節點
當前提交
2ba9270ef4

+ 26 - 0
src/main/java/com/poteviohealth/cgp/statistics/controller/OrderController.java

@@ -11,7 +11,9 @@ import com.poteviohealth.cgp.common.facade.time.MethodTime;
 import com.poteviohealth.cgp.common.filter.TokenContext;
 import com.poteviohealth.cgp.common.filter.repeatSubmit.RepeatSubmit;
 import com.poteviohealth.cgp.common.utils.ExcelUtils;
+import com.poteviohealth.cgp.statistics.model.indto.DishesOrderWebInDTO;
 import com.poteviohealth.cgp.statistics.model.indto.OrderServiceWebInDTO;
+import com.poteviohealth.cgp.statistics.model.outdto.DishesOrderWebOutDTO;
 import com.poteviohealth.cgp.statistics.model.outdto.OrderExcelDTO;
 import com.poteviohealth.cgp.statistics.service.IOrderService;
 import io.swagger.annotations.Api;
@@ -66,6 +68,30 @@ public class OrderController extends BaseWebController {
 
     }
 
+
+
+    @PostMapping(value = "/orderDishesExport")
+    @ApiOperation(httpMethod = "POST", value = "餐单Excel导出")
+    @RepeatSubmit
+    @MethodTime
+    public void orderDishesExport(HttpServletResponse resp, @RequestBody DishesOrderWebInDTO dto){
+        String key ="orderDishesExport";
+        String error =  this.checkExcelExport(key);
+        if ("".equals(error)) {
+            orgConstrainService.fillOrgParams(dto);
+            List<DishesOrderWebOutDTO> list = orderService.orderDishes(dto);
+            ExcelUtils.easyDownload("classpath:excel/order_dishes.xlsx", Maps.newHashMap(), list,  "", resp);
+            if(cacheService.exists(key)){
+                if(cacheService.get(key).equals(TokenContext.cureWebUser().getUserId().toString())){
+                    cacheService.del(key);
+                }
+            }
+        }else{
+            throw new BusinessException(error);
+        }
+
+    }
+
     @DistributedLock(fairLock =true)
     private String checkExcelExport(String key){
         String returnVal = "";

+ 11 - 0
src/main/java/com/poteviohealth/cgp/statistics/mapper/OrderMapper.java

@@ -181,4 +181,15 @@ public interface OrderMapper extends BaseMapper<Order>{
     @SqlParser(filter = true)
     int orderPageListAllSize(@Param(Constants.WRAPPER) Wrapper wrapper,@Param("dbName")String dbName,@Param("operatorId")Integer operatorId);
 
+    @SqlParser(filter = true)
+    int dishesOrderPageListAllSize(@Param(Constants.WRAPPER) Wrapper wrapper,@Param("dbName")String dbName,@Param("operatorId")Integer operatorId);
+
+    /**
+     * excel
+     * @param wrapper
+     * @return
+     */
+    @SqlParser(filter=true)
+    List<DishesOrderWebOutDTO> dishesOrderExcel(@Param(Constants.WRAPPER) Wrapper wrapper,@Param("dbName")String dbName,@Param("operatorId")Integer operatorId,@Param("start")Integer start,@Param("end")Integer end);
+
 }

+ 42 - 0
src/main/java/com/poteviohealth/cgp/statistics/model/indto/DishesOrderWebInDTO.java

@@ -0,0 +1,42 @@
+package com.poteviohealth.cgp.statistics.model.indto;
+
+import com.poteviohealth.cgp.common.model.OrgPageQuery;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+
+import java.util.Date;
+
+/**
+ * 点餐订单列表查询入参
+ * @Author Qin
+ * @Date 2019/7/26 18:46
+ **/
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@EqualsAndHashCode(callSuper = false)
+@ApiModel(value="订单列表查询入参")
+public class DishesOrderWebInDTO extends OrgPageQuery {
+
+    @ApiModelProperty(value="搜索订单code/联系电话",example = "10")
+    private String customerName;
+
+    @ApiModelProperty(value="搜索订单code",example = "10")
+    private String sn;
+
+    @ApiModelProperty(value="联系电话",example = "18888888883")
+    private String customerPhone;
+
+    @ApiModelProperty(value = "起始时间")
+    private Date startDate;
+
+    @ApiModelProperty(value = "结束时间")
+    private Date endDate;
+
+    @ApiModelProperty(value = "支付方式")
+    private Integer payStyle;
+}

+ 57 - 0
src/main/java/com/poteviohealth/cgp/statistics/model/outdto/DishesOrderWebOutDTO.java

@@ -0,0 +1,57 @@
+package com.poteviohealth.cgp.statistics.model.outdto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * @Author QIN
+ * @Date 2019/7/16 19:08
+ * @Param 订单DTO
+ * @return
+**/
+@Data
+@ApiModel(value="订单列表查询出参")
+public class DishesOrderWebOutDTO {
+
+    @ApiModelProperty(value = "驿站名称")
+    private String serviceStationName;
+
+    @ApiModelProperty(value = "下单时间")
+    private Date orderTime;
+
+    @ApiModelProperty(value = "订单号")
+    private String sn;
+
+    @ApiModelProperty(value = "实付总价格(分)")
+    private String sumPrice;
+
+    @ApiModelProperty(value = "卡支付金额(分)")
+    private String cardPrice;
+
+    @ApiModelProperty(value = "补贴卡支付金额(分)")
+    private String subsidyPrice;
+
+    @ApiModelProperty(value = "支付金额(分)")
+    private String payPrice;
+
+    @ApiModelProperty(value = "资金积分支付个数")
+    private Long fundPrice;
+
+    @ApiModelProperty(value = "客户姓名")
+    private String customerName;
+
+    @ApiModelProperty(value = "客户电话")
+    private String customerPhone;
+
+    @ApiModelProperty(value = "商品相关信息")
+    private String productString;
+
+    @ApiModelProperty(value = "支付状态:1.待支付;2.支付中,3.已支付,4:支付失败,5:退款中,6:退款成功,7:退款失败")
+    private String payStatusStr;
+
+    @ApiModelProperty(value = "支付账户:1.助餐;2.积分;3.市场化;4.现金;")
+    private String payAccountStr;
+}

+ 9 - 0
src/main/java/com/poteviohealth/cgp/statistics/service/IOrderService.java

@@ -2,7 +2,9 @@ package com.poteviohealth.cgp.statistics.service;
 
 import com.poteviohealth.cgp.common.service.IBaseService;
 import com.poteviohealth.cgp.statistics.model.Order;
+import com.poteviohealth.cgp.statistics.model.indto.DishesOrderWebInDTO;
 import com.poteviohealth.cgp.statistics.model.indto.OrderServiceWebInDTO;
+import com.poteviohealth.cgp.statistics.model.outdto.DishesOrderWebOutDTO;
 import com.poteviohealth.cgp.statistics.model.outdto.OrderExcelDTO;
 
 import java.util.List;
@@ -25,4 +27,11 @@ public interface IOrderService extends IBaseService<Order> {
      */
     List<OrderExcelDTO> orderExcel(OrderServiceWebInDTO dto);
 
+
+    /**
+     * excel
+     * @return
+     */
+    List<DishesOrderWebOutDTO> orderDishes(DishesOrderWebInDTO dto);
+
 }

+ 56 - 0
src/main/java/com/poteviohealth/cgp/statistics/service/impl/OrderServiceImpl.java

@@ -23,9 +23,11 @@ import com.poteviohealth.cgp.common.integrated.partner.model.EmployeeStationJson
 import com.poteviohealth.cgp.common.service.impl.BaseServiceImpl;
 import com.poteviohealth.cgp.statistics.mapper.OrderMapper;
 import com.poteviohealth.cgp.statistics.model.Order;
+import com.poteviohealth.cgp.statistics.model.indto.DishesOrderWebInDTO;
 import com.poteviohealth.cgp.statistics.model.indto.OrderServiceWebInDTO;
 import com.poteviohealth.cgp.statistics.model.outdto.*;
 import com.poteviohealth.cgp.statistics.service.IOrderService;
+import com.poteviohealth.cgp.statistics.utils.DishesOrderExcelTask;
 import com.poteviohealth.cgp.statistics.utils.OrderExcelTask;
 import lombok.extern.log4j.Log4j2;
 import org.apache.commons.collections.CollectionUtils;
@@ -206,6 +208,60 @@ public class OrderServiceImpl extends BaseServiceImpl<OrderMapper, Order> implem
         return list;
     }
 
+    @Override
+    public List<DishesOrderWebOutDTO> orderDishes(DishesOrderWebInDTO dto) {
+        Integer operatorId = TokenContext.cureOperatorId();
+        QueryWrapper queryWrapper = webQuery(dto);
+        int count = baseMapper.dishesOrderPageListAllSize(queryWrapper,dbName,operatorId);
+        //每页1000条,计算总页数
+        int maxPage = (int) Math.ceil(count/10000.0);
+        List<DishesOrderWebOutDTO> list = Lists.newArrayList();
+        ForkJoinPool pool = new ForkJoinPool();
+        try {
+            DishesOrderExcelTask task = new DishesOrderExcelTask(1,maxPage, queryWrapper, operatorId, dbName,baseMapper);
+            Future<List<DishesOrderWebOutDTO>> future = pool.submit(task);
+            do {
+                pool.awaitTermination(1, TimeUnit.SECONDS);
+            } while (!future.isDone());
+            pool.shutdown();
+            list = future.get();
+        }catch (Exception e){
+            throw new BuilderException("餐单导出失败,请重新操作");
+        }
+        return list;
+    }
+
+    private QueryWrapper webQuery(DishesOrderWebInDTO orderWebInDTO) {
+        QueryWrapper<Order> orderQueryWrapper = new QueryWrapper<>();
+        if (StringUtils.isNotBlank(orderWebInDTO.getSn())) {
+            orderQueryWrapper.eq("sn", orderWebInDTO.getSn());
+        }
+        if (StringUtils.isNotBlank(orderWebInDTO.getCustomerName())) {
+            orderQueryWrapper.eq( "customer_name", orderWebInDTO.getCustomerName());
+        }
+        if (StringUtils.isNotBlank(orderWebInDTO.getCustomerPhone())) {
+            orderQueryWrapper.eq( "customer_phone", orderWebInDTO.getCustomerPhone());
+        }
+        if (orderWebInDTO.getPayStyle() != null) {
+            orderQueryWrapper.like("pay_account", orderWebInDTO.getPayStyle());
+        }
+        if (orderWebInDTO.getStartDate() != null) {
+            orderQueryWrapper.ge("order_time", orderWebInDTO.getStartDate());
+        }
+        if (orderWebInDTO.getEndDate() != null) {
+            orderQueryWrapper.le("order_time", orderWebInDTO.getEndDate());
+        }
+        if (!org.springframework.util.CollectionUtils.isEmpty(orderWebInDTO.getSupplierIds())) {
+            orderQueryWrapper.in("supplier_id", orderWebInDTO.getSupplierIds());
+        }
+        if (!org.springframework.util.CollectionUtils.isEmpty(orderWebInDTO.getStationIds())) {
+            orderQueryWrapper.in("service_station_id", orderWebInDTO.getStationIds());
+        }
+        orderQueryWrapper.eq("pay_status",3);
+        orderQueryWrapper.orderByDesc("order_id");
+        return orderQueryWrapper;
+    }
+
     private QueryWrapper orderServiceQuery(OrderServiceWebInDTO orderServiceWebInDTO, String prefix) {
         QueryWrapper<Order> orderQueryWrapper = new QueryWrapper<>();
         if (StringUtils.isNotBlank(orderServiceWebInDTO.getSearchValueCustomerName())) {

+ 91 - 0
src/main/java/com/poteviohealth/cgp/statistics/utils/DishesOrderExcelTask.java

@@ -0,0 +1,91 @@
+package com.poteviohealth.cgp.statistics.utils;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.google.common.collect.Lists;
+import com.poteviohealth.cgp.statistics.mapper.OrderMapper;
+import com.poteviohealth.cgp.statistics.model.outdto.DishesOrderWebOutDTO;
+import lombok.Data;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.RecursiveTask;
+
+/**
+ * @author Qin
+ */
+@Data
+public class DishesOrderExcelTask extends RecursiveTask<List<DishesOrderWebOutDTO>> {
+
+    private static final int MAX = 10000;
+    private int start;
+    private int end;
+    private QueryWrapper queryWrapper;
+    private Integer operatorId;
+    private String dbName;
+    private OrderMapper orderMapper;
+    public DishesOrderExcelTask(int start, int end, QueryWrapper queryWrapper, Integer operatorId, String dbName, OrderMapper orderMapper){
+        super();
+        this.end = end;
+        this.start =start;
+        this.queryWrapper = queryWrapper;
+        this.operatorId = operatorId;
+        this.dbName = dbName;
+        this.orderMapper = orderMapper;
+    }
+
+     @Override
+    protected List<DishesOrderWebOutDTO> compute() {
+        // 当end-start的值小于MAX时候,开始打印
+         List<DishesOrderWebOutDTO> list = Lists.newArrayList();
+
+         int page = (end - start);
+        if (page < 2) {
+            // 小于最大值 直接执行
+                list.addAll(orderMapper.dishesOrderExcel(queryWrapper,dbName,operatorId,(start-1)*MAX,MAX));
+                if(page == 1){
+                    list.addAll(orderMapper.dishesOrderExcel(queryWrapper,dbName,operatorId,(end-1)*MAX,MAX));
+                }
+
+            for (DishesOrderWebOutDTO dto : list) {
+                String val = "";
+                for (String s : dto.getPayAccountStr().split(",")) {
+                    if("1".equals(s)){
+                        val+="助餐账户,";
+                    }else if("2".equals(s)){
+                        val+="积分账户,";
+                    }else if("3".equals(s)){
+                        val+="储值账户,";
+                    }else if("4".equals(s)){
+                        val+="现金支付,";
+                    }
+                }
+                if(val != ""){
+                    val = val.substring(0, val.length()-1);
+                }
+                dto.setPayAccountStr(val);
+            }
+            return list;
+        } else {
+            // 将任务分解
+            List<DishesOrderExcelTask> tasks = new ArrayList<>();
+            int middle =(start + end) / 2;
+            DishesOrderExcelTask left = new DishesOrderExcelTask(start,middle, queryWrapper,operatorId,dbName,orderMapper);
+            DishesOrderExcelTask right = new DishesOrderExcelTask(middle+1,end, queryWrapper,operatorId,dbName,orderMapper);
+            // 并行执行
+            invokeAll(left, right);
+            tasks.add(left);
+            tasks.add(right);
+            addResultFromTasks(list, tasks);
+            return list;
+        }
+    }
+
+    // 等待所有的任务运行结束
+    private void addResultFromTasks(List<DishesOrderWebOutDTO> list, List<DishesOrderExcelTask> tasks) {
+        for (DishesOrderExcelTask item : tasks) {
+            if (item.join() != null) {
+                list.addAll(item.join());
+            }
+        }
+    }
+}

二進制
src/main/resources/excel/order_dishes.xlsx


+ 28 - 0
src/main/resources/mapper/statistics/OrderMapper.xml

@@ -278,4 +278,32 @@
           AND od.yn = 0
           and ${ew.sqlSegment}
     </select>
+    <select id="dishesOrderPageListAllSize" resultType="java.lang.Integer">
+        SELECT count(*)
+        FROM
+            ${dbName}_order.o_dishes_order_${operatorId} o
+        WHERE o.yn = 0
+          and ${ew.sqlSegment}
+    </select>
+    <select id="dishesOrderExcel" resultType="com.poteviohealth.cgp.statistics.model.outdto.DishesOrderWebOutDTO">
+        SELECT
+            customer_name,
+            sn,
+            customer_phone,
+            product_string,
+            DATE_FORMAT(order_time,'%Y-%m-%d %H:%i') AS orderTime,
+            TRUNCATE ( sum_price/ 100.0, 2 ) AS sumPrice,
+            TRUNCATE ( card_price/ 100.0, 2 ) AS cardPrice,
+            TRUNCATE ( subsidy_price/ 100.0, 2 ) AS subsidyPrice,
+            TRUNCATE ( pay_price/ 100.0, 2 ) AS payPrice,
+            fund_price,
+            '已支付' as payStatusStr,
+            pay_account as payAccountStr,
+            service_station_name
+        FROM
+            ${dbName}_order.o_dishes_order_${operatorId} o
+        WHERE o.yn = 0
+          and ${ew.sqlSegment}
+            limit #{start},#{end}
+    </select>
 </mapper>