跳转到主要内容

发货-费用分摊(新)

发货费用分摊模块功能解析

1. 模块架构

发货费用分摊模块采用前后端分离的架构设计,主要包含以下组件:

1.1 前端组件

组件名称 文件路径 功能描述
主页面组件 wimoor-ui/src/views/erp/warehouse/fee/index.vue 核心页面,包含双标签页设计和数据展示
详情对话框组件 wimoor-ui/src/views/erp/warehouse/fee/detail_dialog.vue 展示SKU历史费用分摊情况和趋势图表
API接口文件 wimoor-ui/src/api/erp/ship/transportationApi.js 封装与后端通信的API接口

1.2 后端组件

组件名称 文件路径 功能描述
控制器 wimoor-erp/erp-boot/src/main/java/com/wimoor/erp/stock/controller/ErpDispatchOverseaTransController.java 处理前端请求,返回数据
服务接口 wimoor-erp/erp-boot/src/main/java/com/wimoor/erp/stock/service/IErpDispatchOverseaTransService.java 定义业务逻辑方法
服务实现 wimoor-erp/erp-boot/src/main/java/com/wimoor/erp/stock/service/impl/ErpDispatchOverseaTransServiceImpl.java 实现业务逻辑
Mapper接口 wimoor-erp/erp-boot/src/main/java/com/wimoor/erp/stock/mapper/ErpDispatchOverseaTransMapper.java 定义数据库操作方法

2. 前端实现分析

2.1 主页面组件 (index.vue)

2.1.1 核心结构

<template>
  <div class="main-sty">
    <el-tabs v-model="selectable" @tab-change="handleQuery">
      <el-tab-pane label="SKU头程" name="sku" key="sku"></el-tab-pane>
      <el-tab-pane label="SKU头程明细" name="detail" key="detail"></el-tab-pane>
    </el-tabs>
    <!-- 筛选条件区域 -->
    <!-- 操作按钮区域 -->
    <!-- 数据表格区域 -->
  </div>
  <Dialog ref="dialogRef"></Dialog>
</template>

2.1.2 核心逻辑

  1. 数据加载逻辑

    • 通过 loadTableData 函数根据当前选中的标签页加载对应的数据
    • 当标签页切换时,调用 handleQuery 函数重新加载数据
    • 当筛选条件变化时,调用 handleQuery 函数重新加载数据
  2. API调用

    • getShipFeeReport:获取SKU头程费用报告
    • getShipFeeDetailReport:获取SKU头程费用明细报告
    • downShipFeeReportExcel:导出SKU头程费用报告
    • downShipFeeDetailReportExcel:导出SKU头程费用明细报告
  3. 详情查看逻辑

    • 点击"历史详情"按钮时,调用 showDialog 函数打开详情对话框
    • 传递当前查询参数和SKU编码给详情对话框

2.2 详情对话框组件 (detail_dialog.vue)

2.2.1 核心结构

<template>
  <el-dialog title="SKU头程历史(每周费用分摊)" width="800px">
    <div id='mychart1' style='height:230px;width:100%'></div>
    <GlobalTable ref="globalTable" :tableData="tableData" @loadTable="loadTableData">
      <!-- 表格列定义 -->
    </GlobalTable>
  </el-dialog>
</template>

2.2.2 核心逻辑

  1. 数据加载逻辑

    • 通过 loadTableData 函数加载SKU历史费用数据
    • 调用 getShipSkuFeeReport API获取数据
  2. 图表渲染逻辑

    • 使用 ECharts 库渲染费用趋势图表
    • lineChart 函数负责图表的配置和渲染
    • 图表展示运费、发货数量和平均单价的趋势

2.3 API接口文件 (transportationApi.js)

2.3.1 核心API接口

API方法 URL 功能描述
getShipFeeReport /erp/api/v1/inventory/dispatch/overseaTrans/getShipFeeReport 获取SKU头程费用报告
getShipFeeDetailReport /erp/api/v1/inventory/dispatch/overseaTrans/getShipFeeDetailReport 获取SKU头程费用明细报告
getShipSkuFeeReport /erp/api/v1/inventory/dispatch/overseaTrans/getShipSkuFeeReport 获取SKU费用历史报告
downShipFeeReportExcel /erp/api/v1/inventory/dispatch/overseaTrans/downShipFeeReportExcel 导出SKU头程费用报告
downShipFeeDetailReportExcel /erp/api/v1/inventory/dispatch/overseaTrans/downShipFeeDetailReportExcel 导出SKU头程费用明细报告

3. 后端实现分析

3.1 控制器 (ErpDispatchOverseaTransController.java)

3.1.1 核心方法

方法名 HTTP方法 功能描述
getShipFeeReportAction POST 获取SKU头程费用报告
getShipFeeDetailReportAction POST 获取SKU头程费用明细报告
getShipSkuFeeReportAction POST 获取SKU费用历史报告
downShipFeeReportExcelAction POST 导出SKU头程费用报告
downShipFeeDetailReportExcelAction POST 导出SKU头程费用明细报告

3.1.2 核心逻辑

  1. 参数处理

    • 从前端请求中获取筛选参数
    • 处理参数默认值,如日期范围默认为最近7天
    • 将参数传递给服务层方法
  2. 响应处理

    • 将服务层返回的数据包装为 Result 对象返回
    • 对于Excel导出,设置响应头并写入Excel文件

3.2 服务实现 (ErpDispatchOverseaTransServiceImpl.java)

3.2.1 核心方法

方法名 功能描述
getShipFeeReport 获取SKU头程费用报告
getShipFeeDetailReport 获取SKU头程费用明细报告
transSKUFeeShared 获取SKU费用历史报告(包含图表数据)
setShipFeeReport 生成SKU头程费用报告Excel文件
setShipFeeDetailReport 生成SKU头程费用明细报告Excel文件

3.2.2 核心逻辑

  1. 费用分摊计算

    • getShipFeeDetailReport 方法中,计算每个SKU的单件费用:
      if(map.get("skufee")!=null && map.get("qty")!=null) {
          String skufeeStr=map.get("skufee").toString();
          BigDecimal qty=new BigDecimal(map.get("qty").toString());
          BigDecimal skufee=new BigDecimal(skufeeStr);
          if(skufee!=null&&qty!=null&&qty.intValue()>0) {
              Double rate = skufee.doubleValue()/qty.doubleValue();
              map.put("skufeeavg", rate);
          }else {
              map.put("skufeeavg", 0);
          }
      }else {
          map.put("skufeeavg", null);
      }
      
  2. 图表数据处理

    • transSKUFeeShared 方法中,处理每周费用数据并生成图表数据:
      // 处理每周数据
      for(Map<String, Object> item:pagelist.getRecords()) {
          if(item.get("opttime2")!=null){
              temp.put(item.get("opttime2").toString().substring(0,10), item);
          }
      }
      // 生成图表数据
      while (c.getTime().before(enddate)) {
          String key = sdf.format(c.getTime());
          if(temp.get(key)==null) {
              series.add("0");
              seriesfee.add("0");
              seriesavgfee.add("0");
          }else {
              // 处理有数据的周
          }
          labels.add(key);
          c.add(Calendar.DATE, 7);
      }
      
  3. Excel导出

    • 使用 SXSSFWorkbook 生成Excel文件
    • 设置表头和数据行
    • 计算并填充SKU单件费用

3.3 Mapper接口 (ErpDispatchOverseaTransMapper.java)

3.3.1 核心方法

方法名 功能描述
transFeeShared 查询SKU头程费用汇总数据
transFeeSharedDetail 查询SKU头程费用明细数据
transFeeSharedWeek 查询SKU每周费用分摊数据

4. 数据流分析

4.1 SKU头程费用报告数据流

  1. 前端请求:用户在"SKU头程"标签页设置筛选条件并点击搜索
  2. API调用:前端调用 getShipFeeReport API
  3. 后端处理
    • 控制器接收请求并处理参数
    • 调用服务层 getShipFeeReport 方法
    • 服务层调用Mapper transFeeShared 方法查询数据库
    • 数据库返回查询结果
    • 服务层将结果返回给控制器
    • 控制器将结果包装为 Result 对象返回
  4. 前端渲染:前端接收数据并渲染到表格中

4.2 SKU头程费用明细报告数据流

  1. 前端请求:用户在"SKU头程明细"标签页设置筛选条件并点击搜索
  2. API调用:前端调用 getShipFeeDetailReport API
  3. 后端处理
    • 控制器接收请求并处理参数
    • 调用服务层 getShipFeeDetailReport 方法
    • 服务层调用Mapper transFeeSharedDetail 方法查询数据库
    • 服务层计算每个SKU的单件费用
    • 服务层将结果返回给控制器
    • 控制器将结果包装为 Result 对象返回
  4. 前端渲染:前端接收数据并渲染到表格中

4.3 SKU历史费用报告数据流

  1. 前端请求:用户点击"历史详情"按钮
  2. API调用:前端调用 getShipSkuFeeReport API
  3. 后端处理
    • 控制器接收请求并处理参数
    • 调用服务层 transSKUFeeShared 方法
    • 服务层调用Mapper transFeeSharedWeek 方法查询数据库
    • 服务层处理数据并生成图表数据
    • 服务层将结果返回给控制器
    • 控制器将结果包装为 Result 对象返回
  4. 前端渲染
    • 前端接收数据并渲染到表格中
    • 前端使用ECharts渲染费用趋势图表

4.4 Excel导出数据流

  1. 前端请求:用户点击"导出"按钮
  2. API调用:前端调用对应的导出API
  3. 后端处理
    • 控制器接收请求并处理参数
    • 创建 SXSSFWorkbook 对象
    • 调用服务层对应的导出方法
    • 服务层调用Mapper查询数据
    • 服务层将数据写入Excel文件
    • 控制器设置响应头并将Excel文件写入响应流
  4. 前端处理:前端接收Excel文件并自动下载

5. 数据库操作分析

5.1 核心查询

  1. SKU头程费用汇总查询

    • 表:涉及发货单、SKU、费用等相关表
    • 关键字段:SKU编码、发货数量、费用金额
    • 聚合函数:SUM(计算总发货数量和总费用)
    • 分组:按SKU编码分组
  2. SKU头程费用明细查询

    • 表:涉及发货单、SKU、费用等相关表
    • 关键字段:发货单编码、SKU编码、发货数量、费用金额
    • 关联:多表关联查询
  3. SKU每周费用分摊查询

    • 表:涉及发货单、SKU、费用等相关表
    • 关键字段:SKU编码、发货日期、发货数量、费用金额
    • 分组:按SKU编码和周分组
    • 聚合函数:SUM(计算每周发货数量和费用)

6. 技术亮点

6.1 前端技术亮点

  1. 双标签页设计:使用Element Plus的 el-tabs 组件实现双标签页切换,提高用户体验
  2. 响应式布局:使用Element Plus的响应式组件构建界面,适配不同屏幕尺寸
  3. 数据可视化:集成ECharts实现费用趋势的图表展示,直观呈现数据变化
  4. 异步数据加载:使用Vue 3的Composition API实现异步数据加载,提高页面响应速度
  5. 模块化设计:将主页面和详情对话框分离为独立组件,提高代码可维护性

6.2 后端技术亮点

  1. 分层架构:采用控制器→服务→Mapper的分层架构,职责清晰
  2. Excel导出优化:使用 SXSSFWorkbook 生成Excel文件,支持大数据量导出
  3. 图表数据处理:在后端预处理图表数据,减轻前端负担
  4. 参数处理:统一处理参数默认值和边界情况,提高代码健壮性
  5. 费用计算逻辑:实现准确的费用分摊计算,确保数据准确性

7. 代码优化建议

7.1 前端优化建议

  1. 性能优化

    • 实现表格数据虚拟滚动,提高大数据量下的渲染性能
    • 对频繁调用的API实现缓存,减少重复请求
  2. 用户体验优化

    • 添加加载状态提示,提高用户体验
    • 实现筛选条件的记忆功能,下次进入页面时自动恢复上次的筛选条件
  3. 代码质量优化

    • 提取重复的代码为公共函数,减少代码冗余
    • 完善错误处理逻辑,提高代码健壮性

7.2 后端优化建议

  1. 性能优化

    • 优化数据库查询,添加适当的索引
    • 实现查询结果缓存,减少数据库压力
  2. 代码质量优化

    • 提取重复的参数处理逻辑为公共方法
    • 使用枚举或常量定义固定值,提高代码可维护性
    • 完善异常处理,提供更详细的错误信息
  3. 功能优化

    • 增加费用分摊规则的可配置性,支持不同场景的分摊需求
    • 增加费用分析报表,提供更丰富的数据洞察

8. 总结

发货费用分摊模块是一个功能完整、设计合理的企业级应用模块,主要实现了以下功能:

  1. 费用分摊计算:将发货总费用根据发货数量等因素分摊到各个SKU
  2. 多维度数据展示:支持SKU级别的费用汇总和发货单级别的费用明细
  3. 丰富的筛选条件:支持按仓库、日期、承运商、物流渠道等条件筛选
  4. 数据可视化:使用ECharts展示费用趋势图表,直观呈现数据变化
  5. Excel导出:支持将数据导出为Excel文件,方便离线分析

该模块通过前后端分离的架构设计,实现了从数据存储、业务逻辑到前端展示的完整流程,为用户提供了清晰、直观的费用分摊分析工具,帮助用户更好地了解和管理发货费用。