Browse Source

feat(all): 新增报表

1 增加配送车次报表
2 增加配送客户报表
3 增加配送明细报表
pull/1/head
zhaoqiaobo 1 year ago
parent
commit
8226f206ab
  1. 25
      blade-service/logpm-report/src/main/java/com/logpm/report/config/MybatisPlusConfig.java
  2. 110
      blade-service/logpm-report/src/main/java/com/logpm/report/controller/ReportDeliveryController.java
  3. 28
      blade-service/logpm-report/src/main/java/com/logpm/report/mapper/ReportDeliverMapeer.java
  4. 429
      blade-service/logpm-report/src/main/java/com/logpm/report/mapper/ReportDeliverMapper.xml
  5. 36
      blade-service/logpm-report/src/main/java/com/logpm/report/reader/DeliveryCustomerReader.java
  6. 36
      blade-service/logpm-report/src/main/java/com/logpm/report/reader/DeliveryDetailReader.java
  7. 36
      blade-service/logpm-report/src/main/java/com/logpm/report/reader/DeliveryTrainReader.java
  8. 31
      blade-service/logpm-report/src/main/java/com/logpm/report/service/ExportReaderService.java
  9. 29
      blade-service/logpm-report/src/main/java/com/logpm/report/service/ReportDeliverService.java
  10. 82
      blade-service/logpm-report/src/main/java/com/logpm/report/service/impl/ReportDeliverServiceImpl.java
  11. 161
      blade-service/logpm-report/src/main/java/com/logpm/report/util/ReportExcelUtil.java
  12. 143
      blade-service/logpm-report/src/main/java/com/logpm/report/vo/ReportCustomerVO.java
  13. 191
      blade-service/logpm-report/src/main/java/com/logpm/report/vo/ReportDetailVO.java
  14. 119
      blade-service/logpm-report/src/main/java/com/logpm/report/vo/ReportDevilerVO.java

25
blade-service/logpm-report/src/main/java/com/logpm/report/config/MybatisPlusConfig.java

@ -0,0 +1,25 @@
package com.logpm.report.config;
import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* @author zhaoqiaobo
* @create 2024-03-08 13:59
*/
@Configuration
@MapperScan("com.baomidou.cloud.service.*.mapper*r")
public class MybatisPlusConfig {
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor(){
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
return interceptor;
}
}

110
blade-service/logpm-report/src/main/java/com/logpm/report/controller/ReportDeliveryController.java

@ -0,0 +1,110 @@
/*
* Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* Neither the name of the dreamlu.net developer nor the names of its
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
* Author: Chill 庄骞 (smallchill@163.com)
*/
package com.logpm.report.controller;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
import com.logpm.report.service.ReportDeliverService;
import com.logpm.report.vo.ReportCustomerVO;
import com.logpm.report.vo.ReportDetailVO;
import com.logpm.report.vo.ReportDevilerVO;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.AllArgsConstructor;
import org.springblade.core.boot.ctrl.BladeController;
import org.springblade.core.mp.support.Query;
import org.springblade.core.tool.api.R;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletResponse;
/**
* 配送报表 控制器
*
* @author cyz
* @since 2023-06-08
*/
@RestController
@AllArgsConstructor
@RequestMapping("/reportDelivery")
@Api(value = "配送报表", tags = "配送报表")
public class ReportDeliveryController extends BladeController {
private final ReportDeliverService reportDeliverService;
@GetMapping("/train")
@ApiOperationSupport(order = 1)
@ApiOperation(value = "配送车次报表", notes = "配送车次报表")
public R<IPage<ReportDevilerVO>> deliveryTrainPage(ReportDevilerVO vo, Query query) {
IPage<ReportDevilerVO> pages = reportDeliverService.deliveryTrainPage(vo, query);
return R.data(pages);
}
@GetMapping("/exportTrain")
@ApiOperationSupport(order = 2)
@ApiOperation(value = "导出配送车次报表", notes = "导出配送车次报表")
public void exportTrain(HttpServletResponse response, ReportDevilerVO vo) {
try {
reportDeliverService.exportTrain(response, vo);
} catch (Exception e) {
e.printStackTrace();
}
}
@GetMapping("/customer")
@ApiOperationSupport(order = 3)
@ApiOperation(value = "配送客户报表", notes = "配送客户报表")
public R<IPage<ReportCustomerVO>> customerPage(ReportCustomerVO vo, Query query) {
IPage<ReportCustomerVO> pages = reportDeliverService.customerPage(vo, query);
return R.data(pages);
}
@GetMapping("/exportCustomer")
@ApiOperationSupport(order = 4)
@ApiOperation(value = "导出配送客户报表", notes = "导出配送客户报表")
public void exportCustomer(HttpServletResponse response, ReportCustomerVO vo) {
try {
reportDeliverService.exportCustomer(response, vo);
} catch (Exception e) {
e.printStackTrace();
}
}
@GetMapping("/details")
@ApiOperationSupport(order = 3)
@ApiOperation(value = "配送明细报表", notes = "配送明细报表")
public R<IPage<ReportDetailVO>> detailsPage(ReportDetailVO vo, Query query) {
IPage<ReportDetailVO> pages = reportDeliverService.detailsPage(vo, query);
return R.data(pages);
}
@GetMapping("/exportDetails")
@ApiOperationSupport(order = 4)
@ApiOperation(value = "导出配送明细报表", notes = "导出配送明细报表")
public void exportDetails(HttpServletResponse response, ReportDetailVO vo) {
try {
reportDeliverService.exportDetails(response, vo);
} catch (Exception e) {
e.printStackTrace();
}
}
}

28
blade-service/logpm-report/src/main/java/com/logpm/report/mapper/ReportDeliverMapeer.java

@ -0,0 +1,28 @@
package com.logpm.report.mapper;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.logpm.report.vo.ReportCustomerVO;
import com.logpm.report.vo.ReportDetailVO;
import com.logpm.report.vo.ReportDevilerVO;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
* @author zhaoqiaobo
* @create 2024-03-06 15:54
*/
@Mapper
public interface ReportDeliverMapeer extends BaseMapper {
List<ReportDevilerVO> getDeliveryTrainPage(IPage<ReportDevilerVO> page, @Param("ew") Wrapper<ReportDevilerVO> query);
List<ReportCustomerVO> getCustomerPage(IPage<ReportCustomerVO> page, @Param("ew") Wrapper query);
List<ReportDetailVO> getDetailsPage(IPage<ReportDetailVO> page, @Param("ew") Wrapper query);
}

429
blade-service/logpm-report/src/main/java/com/logpm/report/mapper/ReportDeliverMapper.xml

@ -0,0 +1,429 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.logpm.report.mapper.ReportDeliverMapeer">
<select id="getDeliveryTrainPage" resultType="com.logpm.report.vo.ReportDevilerVO">
select * from (SELECT d.train_number train_number,
d.task_time task_time,
d.warehouse_name warehouse_name,
CASE
WHEN d.type = 1 THEN
'市配'
WHEN d.type = 2 THEN
'商配'
ELSE ''
END type,
CASE
WHEN d.kind = 1 THEN
'自主配送'
WHEN d.kind = 2 THEN
'自主配送'
ELSE ''
END kind,
d.vehicle_name vehicle_name,
d.driver_name driver_name,
d.distribution_company distribution_company,
CASE
WHEN d.delivery_status = 1 THEN
'待配送'
WHEN d.delivery_status = 2 THEN
'配送中'
WHEN d.delivery_status = 3 THEN
'已完成'
ELSE ''
END delivery_status,
d.customers_number customers_number,
d.price,
d.order_number order_number,
rn.num reservation_num,
rsln.num reservation_stock_listNum,
IFNULL(loadScan.loadedNum,0) loaded_num,
IFNULL(loadscaninvn.loadedNum,0) invn_loaded_num,
IFNULL(loadScan.exLoadedNum,0) ex_loaded_num,
IFNULL(loadScan.reNum,0) re_num,
IFNULL(loadscaninvn.reNum,0) invn_re_num,
IFNULL(loadScan.exReNum,0) ex_reNum,
ifnull(ds.dsNum,0)ds_num,
ifnull(ds.ssNum,0)ss_num,
ifnull(d.unloading_team_name,'') unloading_team_name
FROM
logpm_distribution_delivery_list d
LEFT JOIN (
SELECT
lds.delivery_id,
COALESCE ( sum( ldr.reservation_num ), 0 ) num
FROM
logpm_distribution_signfor lds
JOIN logpm_distribution_reservation ldr ON lds.reservation_id = ldr.id
WHERE
ldr.reservation_status != '40'
GROUP BY
lds.delivery_id
) rn ON rn.delivery_id = d.id
LEFT JOIN (
SELECT
lds.delivery_id,
COALESCE ( sum( ldr.reservation_stock_list_num ), 0 ) num
FROM
logpm_distribution_signfor lds
JOIN logpm_distribution_reservation ldr ON lds.reservation_id = ldr.id
GROUP BY
lds.delivery_id
) rsln ON rsln.delivery_id = d.id
left join (
select
t.delivery_id,SUM(t.loaded_nub) loadedNum,sum(t.received_quantity) reNum,sum(t.is_abnormal_loading) exLoadedNum,sum(t.is_abnormal_signing) exReNum
from logpm_distribution_loadscan t
group by t.delivery_id
) loadScan on loadScan.delivery_id = d.id
left join (
select
t.delivery_id,SUM(t.loaded_nub) loadedNum,sum(t.received_quantity) reNum
from logpm_distribution_loadscaninvn t
group by t.delivery_id
) loadscaninvn on loadscaninvn.delivery_id = d.id
left join (
select
t.delivery_id,
SUM(CASE
WHEN t.driver_signing = 2 THEN
1
ELSE
0
END) dsNum,
SUM(CASE
WHEN t.signing_status = 2 THEN
1
ELSE
0
END) ssNum
from logpm_distribution_signfor t
group by t.delivery_id
) ds on ds.delivery_id = d.id) t
${ew.customSqlSegment}
</select>
<select id="getCustomerPage" resultType="com.logpm.report.vo.ReportCustomerVO">
select *
from (select lddl.train_number train_number,
obj.reservation_code reservation_code,
obj.stock_article_id stock_article_id,
lddl.task_time task_time,
lddl.warehouse_name warehouse_name,
obj.receiving_unit receiving_unit,
obj.mall_name mall_name,
obj.consignee,
obj.delivery_phone delivery_phone,
obj.delivery_address delivery_address,
CASE
WHEN lddl.type = 1 THEN
'市配'
WHEN lddl.type = 2 THEN
'商配'
ELSE ''
END type,
CASE
WHEN lddl.kind = 1 THEN
'自主配送'
WHEN lddl.kind = 2 THEN
'自主配送'
ELSE ''
END kind,
lddl.vehicle_name vehicle_name,
lddl.driver_name driver_name,
lddl.distribution_company distribution_company,
CASE
WHEN lddl.delivery_status = 1 THEN
'待配送'
WHEN lddl.delivery_status = 2 THEN
'配送中'
WHEN lddl.delivery_status = 3 THEN
'已完成'
ELSE ''
END delivery_status,
lddl.order_number order_number,
rn.num reservation_num,
rsln.num reservation_stock_sist_num,
IFNULL(loadScan.loadedNum, 0) loaded_num,
IFNULL(loadscaninvn.loadedNum, 0) invn_loaded_num,
IFNULL(loadScan.exLoadedNum, 0) ex_loaded_num,
IFNULL(loadScan.reNum, 0) re_num,
IFNULL(loadscaninvn.reNum, 0) invn_re_num,
IFNULL(loadScan.exReNum, 0) ex_re_num,
lds.sjsigning_time sjsigning_time,
lds.signee_name signee_name,
lds.signing_time signing_time,
lds.examine_user_name examine_user_name
from logpm_distribution_reservation obj
left join logpm_distribution_signfor lds on lds.reservation_id = obj.id
left join logpm_distribution_delivery_list lddl on lds.delivery_id = lddl.id
LEFT JOIN (
SELECT lds.delivery_id,
COALESCE(sum(ldr.reservation_num), 0) num
FROM logpm_distribution_signfor lds
JOIN logpm_distribution_reservation ldr ON lds.reservation_id = ldr.id
WHERE ldr.reservation_status != '40'
GROUP BY
lds.delivery_id
) rn ON rn.delivery_id = lddl.id
LEFT JOIN (
SELECT lds.delivery_id,
COALESCE(sum(ldr.reservation_stock_list_num), 0) num
FROM logpm_distribution_signfor lds
JOIN logpm_distribution_reservation ldr ON lds.reservation_id = ldr.id
GROUP BY lds.delivery_id
) rsln ON rsln.delivery_id = lddl.id
left join (
select t.delivery_id,
SUM(t.loaded_nub) loadedNum,
sum(t.received_quantity) reNum,
sum(t.is_abnormal_loading) exLoadedNum,
sum(t.is_abnormal_signing) exReNum
from logpm_distribution_loadscan t
group by t.delivery_id
) loadScan on loadScan.delivery_id = lddl.id
left join (
select t.delivery_id,
SUM(t.loaded_nub) loadedNum,
sum(t.received_quantity) reNum
from logpm_distribution_loadscaninvn t
group by t.delivery_id
) loadscaninvn on loadscaninvn.delivery_id = lddl.id
)t
${ew.customSqlSegment}
</select>
<select id="getDetailsPage" resultType="com.logpm.report.vo.ReportDetailVO">
select *
from (
SELECT drp.reservation_id id,
lddl.train_number train_number,
obj.reservation_code reservation_code,
lddl.task_time task_time,
lddl.warehouse_name warehouse_name,
CASE
WHEN lddl.type = 1 THEN
'市配'
WHEN lddl.type = 2 THEN
'商配'
ELSE ''
END type,
CASE
WHEN lddl.kind = 1 THEN
'自主配送'
WHEN lddl.kind = 2 THEN
'自主配送'
ELSE ''
END kind,
lddl.vehicle_name vehicle_name,
lddl.driver_name driver_name,
lddl.distribution_company distribution_company,
obj.consignee dr_consignee,
obj.delivery_phone delivery_phone,
obj.delivery_address delivery_address,
wi.consignee,
wi.consignee_name consignee_name,
wi.consignee_mobile consignee_mobile,
wi.waybill_no waybill_no,
obj.stock_article_id stock_article_id,
dpl.order_package_code order_package_code,
wi.customer_train customer_train,
CASE
WHEN dpl.conditions = 1 THEN
'定制品'
WHEN dpl.conditions = 2 THEN
'库存品'
ELSE '零担'
END conditions,
dpl.firsts,
dpl.SECOND decond,
dpl.third_product third_product,
dpl.material_code material_code,
dpl.material_name material_name,
'' start_war,
'' start_war_in_time,
'' start_war_out_time,
dpl.warehouse_entry_time_end warehouse_entry_time_end,
ldl.unload_time unload_time,
ldl.un_administrators_name un_administrators_name,
lds.sjsigning_time sjsigning_time,
lds.signee_name lds_signee_name,
CASE
WHEN lds.signing_status = 1 THEN
'未签收'
WHEN lds.signing_status = 1 THEN
'签收'
ELSE ''
END signing_status,
lds.signing_time signing_time,
lds.examine_user_name examine_user_name,
CASE
WHEN ldl.is_abnormal_signing = 1 THEN
'是'
ELSE '否'
END abnormal_signing,
CASE
WHEN ldl.is_abnormal_loading = 1 THEN
'是'
ELSE '否'
END abnormal_loading,
CASE
WHEN ldla.auditing_status = 3 THEN
'异常'
WHEN ldla.auditing_status = 1 THEN
'未审核'
WHEN ldla.auditing_status = 2 THEN
'已审核'
ELSE ''
END auditing_status,
ldla.auditing_user auditing_user,
ldla.auditing_time auditing_time
FROM logpm_distribution_reservation_package drp
LEFT JOIN logpm_distribution_parcel_list dpl
ON dpl.order_package_code = drp.packet_bar_code AND dpl.is_deleted = 0
left join logpm_distribution_reservation obj on drp.reservation_id = obj.id
LEFT JOIN logpm_distribution_signfor lds ON lds.reservation_id = drp.reservation_id
LEFT JOIN logpm_distribution_delivery_list lddl ON lds.delivery_id = lddl.id
LEFT JOIN logpm_warehouse_waybill wi ON wi.id = obj.waybill_id
LEFT JOIN logpm_distribution_loadscan ldl
ON ldl.order_package_code = dpl.order_package_code
AND ldl.type = 2
LEFT JOIN logpm_distribution_loadscan_abnormal ldla
ON ldla.package_code = dpl.order_package_code
) t
${ew.customSqlSegment}
<if test="ew!=null and ew.customSqlSegment !=null and ew.customSqlSegment!=''">
and
</if>
<if test="ew==null or ew.customSqlSegment ==null or ew.customSqlSegment==''">
where
</if>
EXISTS(
SELECT obj.id
FROM logpm_distribution_reservation obj
WHERE obj.id = t.id)
union all
select *
from (SELECT drp.reservation_id id,
lddl.train_number train_number,
obj.reservation_code reservation_code,
lddl.task_time task_time,
lddl.warehouse_name warehouse_name,
CASE
WHEN lddl.type = 1 THEN
'市配'
WHEN lddl.type = 2 THEN
'商配'
ELSE ''
END type,
CASE
WHEN lddl.kind = 1 THEN
'自主配送'
WHEN lddl.kind = 2 THEN
'自主配送'
ELSE ''
END kind,
lddl.vehicle_name vehicle_name,
lddl.driver_name driver_name,
lddl.distribution_company distribution_company,
obj.consignee dr_consignee,
obj.delivery_phone delivery_phone,
obj.delivery_address delivery_address,
wi.consignee,
wi.consignee_name consignee_name,
wi.consignee_mobile consignee_mobile,
wi.waybill_no waybill_no,
obj.stock_article_id stock_article_id,
dpl.order_package_code order_package_code,
wi.customer_train customer_train,
CASE
WHEN dpl.conditions = 1 THEN
'定制品'
WHEN dpl.conditions = 2 THEN
'库存品'
ELSE '零担'
END conditions,
dpl.firsts,
dpl.SECOND decond,
dpl.third_product third_product,
dpl.material_code material_code,
dpl.material_name material_name,
'' start_war,
'' start_war_in_time,
'' start_war_out_time,
dpl.warehouse_entry_time_end warehouse_entry_time_end,
ldl.unload_time unload_time,
ldl.un_administrators_name un_administrators_name,
lds.sjsigning_time sjsigning_time,
lds.signee_name lds_signee_name,
CASE
WHEN lds.signing_status = 1 THEN
'未签收'
WHEN lds.signing_status = 1 THEN
'签收'
ELSE ''
END signing_status,
lds.signing_time signing_time,
lds.examine_user_name examine_user_name,
CASE
WHEN ldl.is_abnormal_signing = 1 THEN
'是'
ELSE '否'
END abnormal_signing,
CASE
WHEN ldl.is_abnormal_loading = 1 THEN
'是'
ELSE '否'
END abnormal_loading,
CASE
WHEN ldla.auditing_status = 3 THEN
'异常'
WHEN ldla.auditing_status = 1 THEN
'未审核'
WHEN ldla.auditing_status = 2 THEN
'已审核'
ELSE ''
END auditing_status,
ldla.auditing_user auditing_user,
ldla.auditing_time auditing_time
FROM logpm_distribution_reservation_zero_package drp
LEFT JOIN logpm_distribution_parcel_list dpl
ON dpl.id = drp.parcel_list_id
left join logpm_distribution_reservation obj on drp.reservation_id = obj.id
LEFT JOIN logpm_distribution_signfor lds ON lds.reservation_id = drp.reservation_id
LEFT JOIN logpm_distribution_delivery_list lddl ON lds.delivery_id = lddl.id
LEFT JOIN logpm_warehouse_waybill wi ON wi.id = obj.waybill_id
LEFT JOIN logpm_distribution_loadscan ldl
ON ldl.order_package_code = dpl.order_package_code
AND ldl.type = 2
LEFT JOIN logpm_distribution_loadscan_abnormal ldla
ON ldla.package_code = dpl.order_package_code
) t
${ew.customSqlSegment}
<if test="ew!=null and ew.customSqlSegment !=null and ew.customSqlSegment!=''">
and
</if>
<if test="ew==null or ew.customSqlSegment ==null or ew.customSqlSegment==''">
where
</if>
EXISTS(
SELECT obj.id
FROM logpm_distribution_reservation obj
WHERE obj.id = t.id)
</select>
</mapper>

36
blade-service/logpm-report/src/main/java/com/logpm/report/reader/DeliveryCustomerReader.java

@ -0,0 +1,36 @@
package com.logpm.report.reader;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.logpm.report.mapper.ReportDeliverMapeer;
import com.logpm.report.service.ExportReaderService;
import org.apache.poi.ss.formula.functions.T;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.util.List;
/**
*
* @author zhaoqiaobo
* @create 2024-03-08 9:50
*/
@Component
public class DeliveryCustomerReader implements ExportReaderService {
@Resource
private ReportDeliverMapeer reportDeliverMapeer;
@Override
public Long getCount(QueryWrapper query) {
Page page = new Page(1, 1);
reportDeliverMapeer.getCustomerPage(page, query);
return page.getTotal();
}
@Override
public List<T> findList(Page page, QueryWrapper query) {
return reportDeliverMapeer.getCustomerPage(page,query);
}
}

36
blade-service/logpm-report/src/main/java/com/logpm/report/reader/DeliveryDetailReader.java

@ -0,0 +1,36 @@
package com.logpm.report.reader;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.logpm.report.mapper.ReportDeliverMapeer;
import com.logpm.report.service.ExportReaderService;
import org.apache.poi.ss.formula.functions.T;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.util.List;
/**
*
* @author zhaoqiaobo
* @create 2024-03-08 9:50
*/
@Component
public class DeliveryDetailReader implements ExportReaderService {
@Resource
private ReportDeliverMapeer reportDeliverMapeer;
@Override
public Long getCount(QueryWrapper query) {
Page page = new Page(1, 1);
reportDeliverMapeer.getDetailsPage(page, query);
return page.getTotal();
}
@Override
public List<T> findList(Page page, QueryWrapper query) {
return reportDeliverMapeer.getDetailsPage(page,query);
}
}

36
blade-service/logpm-report/src/main/java/com/logpm/report/reader/DeliveryTrainReader.java

@ -0,0 +1,36 @@
package com.logpm.report.reader;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.logpm.report.mapper.ReportDeliverMapeer;
import com.logpm.report.service.ExportReaderService;
import org.apache.poi.ss.formula.functions.T;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.util.List;
/**
*
* @author zhaoqiaobo
* @create 2024-03-08 9:50
*/
@Component
public class DeliveryTrainReader implements ExportReaderService {
@Resource
private ReportDeliverMapeer reportDeliverMapeer;
@Override
public Long getCount(QueryWrapper query) {
Page page = new Page(1, 1);
reportDeliverMapeer.getDeliveryTrainPage(page, query);
return page.getTotal();
}
@Override
public List<T> findList(Page page, QueryWrapper query) {
return reportDeliverMapeer.getDeliveryTrainPage(page,query);
}
}

31
blade-service/logpm-report/src/main/java/com/logpm/report/service/ExportReaderService.java

@ -0,0 +1,31 @@
package com.logpm.report.service;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.apache.poi.ss.formula.functions.T;
import java.util.List;
/**
* 导出数据读取器接口
* @author zhaoqiaobo
* @create 2024-03-07 18:14
*/
public interface ExportReaderService {
/**
* 导出的总条数
* @param query 分页查询对象
* @return
*/
Long getCount(QueryWrapper query);
/**
* 导出数据的分页查询
* @param page 分页对象
* @param query 分页查询对象
* @return
*/
List<T> findList(Page page, QueryWrapper query);
}

29
blade-service/logpm-report/src/main/java/com/logpm/report/service/ReportDeliverService.java

@ -0,0 +1,29 @@
package com.logpm.report.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.logpm.report.vo.ReportCustomerVO;
import com.logpm.report.vo.ReportDetailVO;
import com.logpm.report.vo.ReportDevilerVO;
import org.springblade.core.mp.support.Query;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* @author zhaoqiaobo
* @create 2024-03-06 15:51
*/
public interface ReportDeliverService {
IPage<ReportDevilerVO> deliveryTrainPage(ReportDevilerVO vo, Query query);
void exportTrain(HttpServletResponse response, ReportDevilerVO vo) throws InterruptedException, IOException;
IPage<ReportCustomerVO> customerPage(ReportCustomerVO vo, Query query);
void exportCustomer(HttpServletResponse response, ReportCustomerVO vo) throws InterruptedException, IOException;
IPage<ReportDetailVO> detailsPage(ReportDetailVO vo, Query query);
void exportDetails(HttpServletResponse response, ReportDetailVO vo) throws InterruptedException, IOException;
}

82
blade-service/logpm-report/src/main/java/com/logpm/report/service/impl/ReportDeliverServiceImpl.java

@ -0,0 +1,82 @@
package com.logpm.report.service.impl;
import cn.hutool.core.bean.BeanUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.logpm.report.mapper.ReportDeliverMapeer;
import com.logpm.report.reader.DeliveryCustomerReader;
import com.logpm.report.reader.DeliveryDetailReader;
import com.logpm.report.reader.DeliveryTrainReader;
import com.logpm.report.service.ReportDeliverService;
import com.logpm.report.util.ReportExcelUtil;
import com.logpm.report.vo.ReportCustomerVO;
import com.logpm.report.vo.ReportDetailVO;
import com.logpm.report.vo.ReportDevilerVO;
import lombok.AllArgsConstructor;
import org.springblade.core.mp.support.Condition;
import org.springblade.core.mp.support.Query;
import org.springframework.stereotype.Service;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Map;
/**
* @author zhaoqiaobo
* @create 2024-03-06 15:52
*/
@Service
@AllArgsConstructor
public class ReportDeliverServiceImpl implements ReportDeliverService {
private final ReportDeliverMapeer reportDeliverMapeer;
private final DeliveryTrainReader deliveryTrainReader;
private final DeliveryCustomerReader deliveryCustomerReader;
private final DeliveryDetailReader deliveryDetailReader;
@Override
public IPage<ReportDevilerVO> deliveryTrainPage(ReportDevilerVO vo, Query query) {
IPage<ReportDevilerVO> page = Condition.getPage(query);
Map<String, Object> stringObjectMap = BeanUtil.beanToMap(vo);
QueryWrapper<ReportDevilerVO> queryWrapper = Condition.getQueryWrapper(stringObjectMap, ReportDevilerVO.class);
return page.setRecords(reportDeliverMapeer.getDeliveryTrainPage(page, queryWrapper));
}
@Override
public void exportTrain(HttpServletResponse response,ReportDevilerVO vo) throws InterruptedException, IOException {
Map<String, Object> stringObjectMap = BeanUtil.beanToMap(vo);
QueryWrapper<ReportDevilerVO> queryWrapper = Condition.getQueryWrapper(stringObjectMap, ReportDevilerVO.class);
new ReportExcelUtil().export(response, deliveryTrainReader, ReportDevilerVO.class, queryWrapper, "配送车次维度报表");
}
@Override
public IPage<ReportCustomerVO> customerPage(ReportCustomerVO vo, Query query) {
IPage<ReportCustomerVO> page = Condition.getPage(query);
Map<String, Object> stringObjectMap = BeanUtil.beanToMap(vo);
QueryWrapper<ReportDevilerVO> queryWrapper = Condition.getQueryWrapper(stringObjectMap, ReportDevilerVO.class);
return page.setRecords(reportDeliverMapeer.getCustomerPage(page, queryWrapper));
}
@Override
public void exportCustomer(HttpServletResponse response, ReportCustomerVO vo) throws InterruptedException, IOException {
Map<String, Object> stringObjectMap = BeanUtil.beanToMap(vo);
QueryWrapper<ReportDevilerVO> queryWrapper = Condition.getQueryWrapper(stringObjectMap, ReportDevilerVO.class);
new ReportExcelUtil().export(response, deliveryCustomerReader, ReportCustomerVO.class, queryWrapper, "配送客户维度报表");
}
@Override
public IPage<ReportDetailVO> detailsPage(ReportDetailVO vo,Query query) {
IPage<ReportDetailVO> page = Condition.getPage(query);
Map<String, Object> stringObjectMap = BeanUtil.beanToMap(vo);
QueryWrapper<ReportDevilerVO> queryWrapper = Condition.getQueryWrapper(stringObjectMap, ReportDevilerVO.class);
return page.setRecords(reportDeliverMapeer.getDetailsPage(page, queryWrapper));
}
@Override
public void exportDetails(HttpServletResponse response, ReportDetailVO vo) throws InterruptedException, IOException {
Map<String, Object> stringObjectMap = BeanUtil.beanToMap(vo);
QueryWrapper<ReportDevilerVO> queryWrapper = Condition.getQueryWrapper(stringObjectMap, ReportDevilerVO.class);
new ReportExcelUtil().export(response, deliveryDetailReader, ReportDetailVO.class, queryWrapper, "配送明细报表");
}
}

161
blade-service/logpm-report/src/main/java/com/logpm/report/util/ReportExcelUtil.java

@ -0,0 +1,161 @@
package com.logpm.report.util;
import cn.hutool.core.collection.CollectionUtil;
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.ExcelWriter;
import com.alibaba.excel.write.metadata.WriteSheet;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.logpm.report.service.ExportReaderService;
import org.apache.poi.ss.formula.functions.T;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
/**
* excel导出工具类
*
* @author zhaoqiaobo
* @create 2024-03-06 17:48
*/
public class ReportExcelUtil {
public static final String CONTENT_TYPE = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
public static final String CONTENT_TYPE_ECXCEL = "application/vnd.ms-excel";
/**
* 每个sheet装多少条数据
*/
public static final Long SHEETDATANUM = 1000000L;
/**
* 每次查询几条数据
*/
public static final Long PAGESIZE = 50000L;
/**
* 设置excel导出的返回头
* @param response HttpServletResponse对象
* @param fileName 文件名
*/
public static void setExportHeader(HttpServletResponse response, String fileName) {
response.setContentType(CONTENT_TYPE);
response.setCharacterEncoding(StandardCharsets.UTF_8.name());
try {
response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8") + ".xlsx");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
/**
* 多线程导出数据到excel 带默认参数 pageSize onceSheetDataNum
* @param response
* @param service
* @param classz
* @param query
* @param fileName
*/
public void export(HttpServletResponse response, ExportReaderService service, Class classz, QueryWrapper query, String fileName) {
export(response, service, classz, query, fileName, PAGESIZE, SHEETDATANUM);
}
/**
* 多线程导出数据到excel
* 注意事项
* 1 需要定义导出数据读取器实现 ExportReaderService 接口.实现接口中的两个方法
*
* @param response HttpServletResponse对象
* @param service ExportReaderService读取器接口实现类
* @param classz easyexcel 导出数据定义对象
* @param query 数据查询对象
* @param fileName 导出文件名称
* @param pageSize 每次查询多少条数据
* @param onceSheetDataNum 一个sheet页最大装多少条数据
*/
public void export(HttpServletResponse response, ExportReaderService service, Class classz, QueryWrapper query, String fileName, Long pageSize, Long onceSheetDataNum) {
// 设置响应头
ReportExcelUtil.setExportHeader(response, fileName);
// 获取需要导出的总条数
Long count = service.getCount(query);
// 每个 sheet 放多少条数据
Double sheetDataNum = onceSheetDataNum.doubleValue();
// 总共要几个 sheet
int sheetNum = (int) Math.ceil((count / sheetDataNum));
// 总共需要查询数据库几次
int findNum = (int) Math.ceil((count / pageSize.doubleValue()));
// 封装查询后需要导出的数据
Map<Integer, List<Object>> pageMap = new HashMap<>();
// 定义线程池,每个大表导出使用一个线程池
ExecutorService executorService = Executors.newFixedThreadPool(findNum);
// 控制线程全部查询完后执行导出操作
CountDownLatch countDownLatch = new CountDownLatch(findNum);
ExcelWriter excelWriter = null;
try {
// 创建 excelWriter
excelWriter = EasyExcel.write(response.getOutputStream(), classz).build();
} catch (IOException e) {
e.printStackTrace();
}
int num = 0;
for (int i = 0; i < sheetNum; i++) {
// sheet编号
int finalI = i + 1;
// 每页需要查几次
long l = count - (pageSize * num);
long ceil = l > pageSize ? (int) Math.ceil(onceSheetDataNum / pageSize.doubleValue()) : (int) Math.ceil(l / pageSize.doubleValue());
for (int j = 0; j < ceil; j++) {
// 已经查询过几次了
int finalNum = num;
// 查询次数+1
num = num + 1;
// 提交线程执行查询
executorService.submit(() -> {
// 剩余数据
long remaindNum = count - (finalNum * pageSize);
// 当前第几次查询
int current = finalNum + 1;
// 当前查询需要查询几条数据
long lastNum = remaindNum > pageSize ? pageSize : remaindNum;
// 分页查询对象
Page<T> page = new Page(current, lastNum);
// 执行查询操作返回数据
List deliveryTrainPage = service.findList(page, query);
// 获取组装的数据列表
List<Object> reportDevilerVOS = pageMap.get(finalI);
// 将查询数据添加到本地缓存
if (CollectionUtil.isEmpty(reportDevilerVOS)) {
pageMap.put(finalI, deliveryTrainPage);
} else {
pageMap.get(finalI).addAll(deliveryTrainPage);
}
// 当前线程执行完成
countDownLatch.countDown();
});
}
}
try {
// 等待其他线程执行完成
countDownLatch.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
// 分sheet向excel中写数据,
for (Map.Entry<Integer, List<Object>> entry : pageMap.entrySet()) {
Integer key = entry.getKey();
List<Object> value = entry.getValue();
WriteSheet writeSheet = EasyExcel.writerSheet(key, "sheet" + key).build();
excelWriter.write(value, writeSheet);
}
// 关闭流
excelWriter.finish();
}
}

143
blade-service/logpm-report/src/main/java/com/logpm/report/vo/ReportCustomerVO.java

@ -0,0 +1,143 @@
package com.logpm.report.vo;
import com.alibaba.excel.annotation.ExcelProperty;
import com.alibaba.excel.annotation.write.style.ColumnWidth;
import com.alibaba.excel.annotation.write.style.ContentRowHeight;
import com.alibaba.excel.annotation.write.style.HeadRowHeight;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
/**
* 配送报表 客户维度
* @author zhaoqiaobo
* @create 2024-03-06 16:02
*/
@ColumnWidth(25)
@HeadRowHeight(20)
@ContentRowHeight(18)
@ApiModel(value = "配送报表-客户维度", description = "配送报表-客户维度")
@Data
public class ReportCustomerVO implements Serializable {
private static final long serialVersionUID = 1L;
@ApiModelProperty(value = "车次")
@ExcelProperty("车次")
private String trainNumber;
@ApiModelProperty(value = "预约单号")
@ExcelProperty("预约单号")
private String reservationCode;
@ApiModelProperty(value = "订单自编码")
@ExcelProperty("订单自编码")
private String stockArticleId;
@ApiModelProperty(value = "配送日期")
@ExcelProperty("配送日期")
private String taskTime;
@ApiModelProperty(value = "仓库")
@ExcelProperty("仓库")
private String warehouseName;
@ApiModelProperty(value = "收货单位")
@ExcelProperty("收货单位")
private String receivingUnit;
@ApiModelProperty(value = "商场名称")
@ExcelProperty("商场名称")
private String mallName;
@ApiModelProperty(value = "客户名称")
@ExcelProperty("客户名称")
private String consignee;
@ApiModelProperty(value = "客户电话")
@ExcelProperty("客户电话")
private String deliveryPhone;
@ApiModelProperty(value = "地址")
@ExcelProperty("地址")
private String deliveryAddress;
@ApiModelProperty(value = "配送类型")
@ExcelProperty("配送类型")
private String type;
@ApiModelProperty(value = "配送种类")
@ExcelProperty("配送种类")
private String kind;
@ApiModelProperty(value = "配送车辆")
@ExcelProperty("配送车辆")
private String vehicleName;
@ApiModelProperty(value = "配送司机")
@ExcelProperty("配送司机")
private String driverName;
@ApiModelProperty(value = "配送公司")
@ExcelProperty("配送公司")
private String distributionCompany;
@ApiModelProperty(value = "配送状态")
@ExcelProperty("配送状态")
private String deliveryStatus;
@ApiModelProperty(value = "订单总数")
@ExcelProperty("订单总数")
private String orderNumber;
@ApiModelProperty(value = "计划定制品件数")
@ExcelProperty("计划定制品件数")
private String reservationNum;
@ApiModelProperty(value = "计划库存品件数")
@ExcelProperty("计划库存品件数")
private String reservationStockListNum;
@ApiModelProperty(value = "定制品装车件数")
@ExcelProperty("定制品装车件数")
private String loadedNum;
@ApiModelProperty(value = "库存品装车件数")
@ExcelProperty("库存品装车件数")
private String invnLoadedNum;
@ApiModelProperty(value = "异常装车件数")
@ExcelProperty("异常装车件数")
private String exLoadedNum;
@ApiModelProperty(value = "定制品签收件数")
@ExcelProperty("定制品签收件数")
private String reNum;
@ApiModelProperty(value = "库存品签收件数")
@ExcelProperty("库存品签收件数")
private String invnReNum;
@ApiModelProperty(value = "异常签收件数")
@ExcelProperty("异常签收件数")
private String exReNum;
@ApiModelProperty(value = "司机完成签收时间")
@ExcelProperty("司机完成签收时间")
private String sjsigningTime;
@ApiModelProperty(value = "签收人")
@ExcelProperty("签收人")
private String signeeName;
@ApiModelProperty(value = "文员复核时间")
@ExcelProperty("文员复核时间")
private String signingTime;
@ApiModelProperty(value = "复核人")
@ExcelProperty("复核人")
private String examineUserName;
}

191
blade-service/logpm-report/src/main/java/com/logpm/report/vo/ReportDetailVO.java

@ -0,0 +1,191 @@
package com.logpm.report.vo;
import com.alibaba.excel.annotation.ExcelProperty;
import com.alibaba.excel.annotation.write.style.ColumnWidth;
import com.alibaba.excel.annotation.write.style.ContentRowHeight;
import com.alibaba.excel.annotation.write.style.HeadRowHeight;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
/**
* 配送报表 车次维度
* @author zhaoqiaobo
* @create 2024-03-06 16:02
*/
@ColumnWidth(25)
@HeadRowHeight(20)
@ContentRowHeight(18)
@ApiModel(value = "配送报表-车次维度", description = "配送报表-车次维度")
@Data
public class ReportDetailVO implements Serializable {
private static final long serialVersionUID = 1L;
@ApiModelProperty(value = "车次")
@ExcelProperty("车次")
private String trainNumber;
@ApiModelProperty(value = "预约单号")
@ExcelProperty("预约单号")
private String reservationCode;
@ApiModelProperty(value = "配送日期")
@ExcelProperty("配送日期")
private String taskTime;
@ApiModelProperty(value = "仓库")
@ExcelProperty("仓库")
private String warehouseName;
@ApiModelProperty(value = "配送类型")
@ExcelProperty("配送类型")
private String type;
@ApiModelProperty(value = "配送种类")
@ExcelProperty("配送种类")
private String kind;
@ApiModelProperty(value = "配送车辆")
@ExcelProperty("配送车辆")
private String vehicleName;
@ApiModelProperty(value = "配送司机")
@ExcelProperty("配送司机")
private String driverName;
@ApiModelProperty(value = "配送公司")
@ExcelProperty("配送公司")
private String distributionCompany;
@ApiModelProperty(value = "客户名称")
@ExcelProperty("客户名称")
private String drConsignee;
@ApiModelProperty(value = "客户电话")
@ExcelProperty("客户电话")
private String deliveryPhone;
@ApiModelProperty(value = "地址")
@ExcelProperty("地址")
private String deliveryAddress;
@ApiModelProperty(value = "运单收货单位")
@ExcelProperty("运单收货单位")
private String consignee;
@ApiModelProperty(value = "运单收货人")
@ExcelProperty("运单收货人")
private String consigneeName;
@ApiModelProperty(value = "运单收货电话")
@ExcelProperty("运单收货电话")
private String consigneeMobile;
@ApiModelProperty(value = "运单号")
@ExcelProperty("运单号")
private String waybillNo;
@ApiModelProperty(value = "订单自编码")
@ExcelProperty("订单自编码")
private String stockArticleId;
@ApiModelProperty(value = "客户电话")
@ExcelProperty("包条码")
private String orderPackageCode;
@ApiModelProperty(value = "客户车次号")
@ExcelProperty("客户车次号")
private String customerTrain;
@ApiModelProperty(value = "包件类型")
@ExcelProperty("包件类型")
private String conditions;
@ApiModelProperty(value = "一级品")
@ExcelProperty("一级品")
private String firsts;
@ApiModelProperty(value = "二级品")
@ExcelProperty("二级品")
private String decond;
@ApiModelProperty(value = "三级品")
@ExcelProperty("三级品")
private String thirdProduct;
@ApiModelProperty(value = "物料编码")
@ExcelProperty("物料编码")
private String materialCode;
@ApiModelProperty(value = "物料名称")
@ExcelProperty("物料名称")
private String materialName;
@ApiModelProperty(value = "始发仓")
@ExcelProperty("始发仓")
private String startWar;
@ApiModelProperty(value = "始发仓入库日期")
@ExcelProperty("始发仓入库日期")
private String startWarInTime;
@ApiModelProperty(value = "始发仓发货日期")
@ExcelProperty("始发仓发货日期")
private String startWarOutTime;
@ApiModelProperty(value = "入库时间")
@ExcelProperty("入库时间")
private String warehouseEntryTimeEnd;
@ApiModelProperty(value = "装车时间")
@ExcelProperty("装车时间")
private String unloadTime;
@ApiModelProperty(value = "装车人")
@ExcelProperty("装车人")
private String unAdministratorsName;
@ApiModelProperty(value = "签收时间")
@ExcelProperty("签收时间")
private String sjsigningTime;
@ApiModelProperty(value = "签收人")
@ExcelProperty("签收人")
private String ldsSigneeName;
@ApiModelProperty(value = "文员审核状态")
@ExcelProperty("文员审核状态")
private String signingStatus;
@ApiModelProperty(value = "文员审核时间")
@ExcelProperty("文员审核时间")
private String signingTime;
@ApiModelProperty(value = "审核人名称")
@ExcelProperty("审核人名称")
private String examineUserName;
@ApiModelProperty(value = "是否异常签收")
@ExcelProperty("是否异常签收")
private String abnormalSigning;
@ApiModelProperty(value = "是否异常装车")
@ExcelProperty("是否异常装车")
private String abnormalLoading;
@ApiModelProperty(value = "异常审核状态")
@ExcelProperty("异常审核状态")
private String auditingStatus;
@ApiModelProperty(value = "审核人")
@ExcelProperty("审核人")
private String auditingUser;
@ApiModelProperty(value = "审核时间")
@ExcelProperty("审核时间")
private String auditingTime;
}

119
blade-service/logpm-report/src/main/java/com/logpm/report/vo/ReportDevilerVO.java

@ -0,0 +1,119 @@
package com.logpm.report.vo;
import com.alibaba.excel.annotation.ExcelProperty;
import com.alibaba.excel.annotation.write.style.ColumnWidth;
import com.alibaba.excel.annotation.write.style.ContentRowHeight;
import com.alibaba.excel.annotation.write.style.HeadRowHeight;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
/**
* 配送报表 车次维度
* @author zhaoqiaobo
* @create 2024-03-06 16:02
*/
@ColumnWidth(25)
@HeadRowHeight(20)
@ContentRowHeight(18)
@ApiModel(value = "配送报表-车次维度", description = "配送报表-车次维度")
@Data
public class ReportDevilerVO implements Serializable {
private static final long serialVersionUID = 1L;
@ApiModelProperty(value = "车次")
@ExcelProperty("车次")
private String trainNumber;
@ApiModelProperty(value = "配送日期")
@ExcelProperty("配送日期")
private String taskTime;
@ApiModelProperty(value = "仓库")
@ExcelProperty("仓库")
private String warehouseName;
@ApiModelProperty(value = "配送类型")
@ExcelProperty("配送类型")
private String type;
@ApiModelProperty(value = "配送种类")
@ExcelProperty("配送种类")
private String kind;
@ApiModelProperty(value = "配送车辆")
@ExcelProperty("配送车辆")
private String vehicleName;
@ApiModelProperty(value = "配送司机")
@ExcelProperty("配送司机")
private String driverName;
@ApiModelProperty(value = "配送公司")
@ExcelProperty("配送公司")
private String distributionCompany;
@ApiModelProperty(value = "配送状态")
@ExcelProperty("配送状态")
private String deliveryStatus;
@ApiModelProperty(value = "配送客户数")
@ExcelProperty("配送客户数")
private String customersNumber;
@ApiModelProperty(value = "配送价格")
@ExcelProperty("配送价格")
private String price;
@ApiModelProperty(value = "订单总数")
@ExcelProperty("订单总数")
private String orderNumber;
@ApiModelProperty(value = "计划定制品件数")
@ExcelProperty("计划定制品件数")
private String reservationNum;
@ApiModelProperty(value = "计划库存品件数")
@ExcelProperty("计划库存品件数")
private String reservationStockListNum;
@ApiModelProperty(value = "定制品装车件数")
@ExcelProperty("定制品装车件数")
private String loadedNum;
@ApiModelProperty(value = "库存品装车件数")
@ExcelProperty("库存品装车件数")
private String invnLoadedNum;
@ApiModelProperty(value = "异常装车件数")
@ExcelProperty("异常装车件数")
private String exLoadedNum;
@ApiModelProperty(value = "定制品签收件数")
@ExcelProperty("定制品签收件数")
private String reNum;
@ApiModelProperty(value = "库存品签收件数")
@ExcelProperty("库存品签收件数")
private String invnReNum;
@ApiModelProperty(value = "异常签收件数")
@ExcelProperty("异常签收件数")
private String exReNum;
@ApiModelProperty(value = "签收完成客户数")
@ExcelProperty("签收完成客户数")
private String dsNum;
@ApiModelProperty(value = "文员复核客户数")
@ExcelProperty("文员复核客户数")
private String ssNum;
@ApiModelProperty(value = "卸车班组名称")
@ExcelProperty("卸车班组名称")
private String unloadingTeamName;
}
Loading…
Cancel
Save