Explorar el Código

pms 瑞都日报汇总(按队伍) sap库存列表功能优化(按币种)

zhangcl hace 6 días
padre
commit
1702f72d4c
Se han modificado 15 ficheros con 120 adiciones y 5 borrados
  1. 3 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotrddailyreport/vo/IotRdDailyReportSummaryTeamRespVO.java
  2. 4 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotrddailyreport/vo/IotRdDailyReportSummaryWellRespVO.java
  3. 44 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotsapstock/IotSapStockController.java
  4. 4 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotsapstock/vo/IotSapStockRespVO.java
  5. 3 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotsapstock/vo/IotSapStockSaveReqVO.java
  6. 23 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotsapstock/vo/IotSapStockSummaryRespVO.java
  7. 4 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotsapstocklog/vo/IotSapStockLogRespVO.java
  8. 3 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotsapstocklog/vo/IotSapStockLogSaveReqVO.java
  9. 4 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/dataobject/iotsapstock/IotSapStockDO.java
  10. 4 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/dataobject/iotsapstocklog/IotSapStockLogDO.java
  11. 1 1
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/job/sap/SyncSapStockJob.java
  12. 2 1
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/sap/SapController.java
  13. 4 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/sap/service/IotSapServiceImpl.java
  14. 3 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/sap/vo/IotSapStockVO.java
  15. 14 3
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/iotrddailyreport/IotRdDailyReportServiceImpl.java

+ 3 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotrddailyreport/vo/IotRdDailyReportSummaryTeamRespVO.java

@@ -14,6 +14,9 @@ public class IotRdDailyReportSummaryTeamRespVO {
     @Schema(description = "队伍名称")
     private String teamName;
 
+    @Schema(description = "队伍排序值")
+    private Integer sort;
+
     @Schema(description = "队伍下包含的井数量")
     private Integer wellCount;
 

+ 4 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotrddailyreport/vo/IotRdDailyReportSummaryWellRespVO.java

@@ -4,6 +4,7 @@ import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.Data;
 
+import java.time.LocalDateTime;
 import java.util.List;
 
 @Schema(description = "管理后台 - 瑞都日报 移动端汇总日报 井维度 Response VO")
@@ -17,6 +18,9 @@ public class IotRdDailyReportSummaryWellRespVO {
     @Schema(description = "井id")
     private Long taskId;
 
+    @Schema(description = "井创建时间")
+    private LocalDateTime createTime;
+
     @Schema(description = "井名称 可能重名")
     private String wellName;
 

+ 44 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotsapstock/IotSapStockController.java

@@ -13,6 +13,7 @@ import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
 import cn.iocoder.yudao.module.pms.controller.admin.iotsapstock.vo.IotSapStockPageReqVO;
 import cn.iocoder.yudao.module.pms.controller.admin.iotsapstock.vo.IotSapStockRespVO;
 import cn.iocoder.yudao.module.pms.controller.admin.iotsapstock.vo.IotSapStockSaveReqVO;
+import cn.iocoder.yudao.module.pms.controller.admin.iotsapstock.vo.IotSapStockSummaryRespVO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.iotsapstock.IotSapStockDO;
 import cn.iocoder.yudao.module.pms.service.iotsapstock.IotSapStockService;
 import io.swagger.v3.oas.annotations.Operation;
@@ -29,6 +30,7 @@ import java.io.IOException;
 import java.math.BigDecimal;
 import java.util.List;
 import java.util.Objects;
+import java.util.stream.Collectors;
 
 import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.EXPORT;
 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
@@ -120,6 +122,48 @@ public class IotSapStockController {
         return success(respPage);
     }
 
+    @GetMapping("/sapStockSummary")
+    @Operation(summary = "获得PMS SAP 库存汇总数据 区分币种的总数量 总金额")
+    @PreAuthorize("@ss.hasPermission('pms:iot-sap-stock:query')")
+    public CommonResult<List<IotSapStockSummaryRespVO>> sapStockSummary(@Valid IotSapStockPageReqVO pageReqVO) {
+        // 查询符合条件的库存数量列表
+        List<IotSapStockDO> sapStockList = iotSapStockService.getIotSapStockList(pageReqVO);
+        List<IotSapStockSummaryRespVO> summaryList = sapStockList.stream()
+                // 过滤:币种为空的数据直接丢弃,无统计意义
+                .filter(stock -> Objects.nonNull(stock.getCurrency()))
+                // 按币种分组 Map<币种, 同币种库存集合>
+                .collect(Collectors.groupingBy(IotSapStockDO::getCurrency))
+                // 遍历分组map,转换为VO列表
+                .entrySet().stream()
+                .map(entry -> {
+                    String currency = entry.getKey();
+                    List<IotSapStockDO> groupStocks = entry.getValue();
+
+                    // 分组内累加总数量(过滤null数量)
+                    BigDecimal groupTotalQty = groupStocks.stream()
+                            .map(IotSapStockDO::getQuantity)
+                            .filter(Objects::nonNull)
+                            .reduce(BigDecimal.ZERO, BigDecimal::add);
+
+                    // 分组内累加总金额:数量、单价都不为空才计算金额
+                    BigDecimal groupTotalAmt = groupStocks.stream()
+                            .filter(stock -> Objects.nonNull(stock.getQuantity())
+                                    && Objects.nonNull(stock.getUnitPrice()))
+                            .map(stock -> stock.getQuantity().multiply(stock.getUnitPrice()))
+                            .reduce(BigDecimal.ZERO, BigDecimal::add);
+
+                    // 组装VO
+                    IotSapStockSummaryRespVO vo = new IotSapStockSummaryRespVO();
+                    vo.setCurrency(currency);
+                    vo.setTotalQuantity(groupTotalQty);
+                    vo.setTotalAmount(groupTotalAmt);
+                    return vo;
+                })
+                .collect(Collectors.toList());
+
+        return success(summaryList);
+    }
+
     @GetMapping("/export-excel")
     @Operation(summary = "导出PMS SAP 库存(通用库存/项目部库存) Excel")
     @PreAuthorize("@ss.hasPermission('pms:iot-sap-stock:export')")

+ 4 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotsapstock/vo/IotSapStockRespVO.java

@@ -69,6 +69,10 @@ public class IotSapStockRespVO {
     @ExcelProperty("单位")
     private String unit;
 
+    @Schema(description = "币种")
+    @ExcelProperty("币种")
+    private String currency;
+
     @Schema(description = "安全库存")
     @ExcelProperty("安全库存")
     private BigDecimal safetyStock;

+ 3 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotsapstock/vo/IotSapStockSaveReqVO.java

@@ -58,6 +58,9 @@ public class IotSapStockSaveReqVO {
     @Schema(description = "单位")
     private String unit;
 
+    @Schema(description = "币种")
+    private String currency;
+
     @Schema(description = "安全库存")
     private BigDecimal safetyStock;
 

+ 23 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotsapstock/vo/IotSapStockSummaryRespVO.java

@@ -0,0 +1,23 @@
+package cn.iocoder.yudao.module.pms.controller.admin.iotsapstock.vo;
+
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+@Schema(description = "管理后台 - PMS SAP 库存 区分币种的 物料总数量 总金额")
+@Data
+@ExcelIgnoreUnannotated
+public class IotSapStockSummaryRespVO {
+
+    @Schema(description = "币种", example = "CNY")
+    private String currency;
+
+    @Schema(description = "物料库存总数量")
+    private BigDecimal totalQuantity;
+
+    @Schema(description = "物料库存总金额", example = "101.23")
+    private BigDecimal totalAmount;
+
+}

+ 4 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotsapstocklog/vo/IotSapStockLogRespVO.java

@@ -73,6 +73,10 @@ public class IotSapStockLogRespVO {
     @ExcelProperty("单位")
     private String unit;
 
+    @Schema(description = "币种")
+    @ExcelProperty("币种")
+    private String currency;
+
     @Schema(description = "安全库存")
     @ExcelProperty("安全库存")
     private BigDecimal safetyStock;

+ 3 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotsapstocklog/vo/IotSapStockLogSaveReqVO.java

@@ -55,6 +55,9 @@ public class IotSapStockLogSaveReqVO {
     @Schema(description = "单位")
     private String unit;
 
+    @Schema(description = "币种")
+    private String currency;
+
     @Schema(description = "安全库存")
     private BigDecimal safetyStock;
 

+ 4 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/dataobject/iotsapstock/IotSapStockDO.java

@@ -89,6 +89,10 @@ public class IotSapStockDO extends BaseDO {
      * 单位
      */
     private String unit;
+    /**
+     * 币种
+     */
+    private String currency;
     /**
      * 安全库存
      */

+ 4 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/dataobject/iotsapstocklog/IotSapStockLogDO.java

@@ -85,6 +85,10 @@ public class IotSapStockLogDO extends BaseDO {
      * 单位
      */
     private String unit;
+    /**
+     * 币种
+     */
+    private String currency;
     /**
      * 安全库存
      */

+ 1 - 1
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/job/sap/SyncSapStockJob.java

@@ -203,7 +203,7 @@ public class SyncSapStockJob implements JobHandler {
                 sapStock.setINSME(etStockTable.getString("INSME"));
                 sapStock.setSPEME(etStockTable.getString("SPEME"));
                 sapStock.setJIAGE(etStockTable.getBigDecimal("JIAGE"));
-
+                sapStock.setWAERS(etStockTable.getString("WAERS"));
                 sapStocks.add(sapStock);
             } catch (Exception e) {
                 log.error("解析工厂 {} 第 {} 行库存数据时发生错误", factory, i, e);

+ 2 - 1
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/sap/SapController.java

@@ -80,7 +80,8 @@ public class SapController {
                             etStockTable.getString("MEINS"),    // 基本单位
                             etStockTable.getString("INSME"),    // 质量检验
                             etStockTable.getString("SPEME"),    // 已冻结
-                            etStockTable.getBigDecimal("JIAGE")     // 库存价格
+                            etStockTable.getBigDecimal("JIAGE"),     // 库存价格 总价
+                            etStockTable.getBigDecimal("WAERS")     // 币种
                     ));
                     BigDecimal tempJiage = etStockTable.getBigDecimal("JIAGE");
                     String location = etStockTable.getString("LGORT");

+ 4 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/sap/service/IotSapServiceImpl.java

@@ -807,6 +807,7 @@ public class IotSapServiceImpl implements IotSapService {
                     sapStockLog.setQuantity(stock.getLABST());
                     sapStockLog.setUnitPrice(stock.getJIAGE());
                     sapStockLog.setUnit(stock.getMEINS());
+                    sapStockLog.setCurrency(stock.getWAERS());
                     sapStockLog.setSyncTime(LocalDateTime.now());
                     return sapStockLog;
                 })
@@ -1200,6 +1201,7 @@ public class IotSapServiceImpl implements IotSapService {
                 // 总价
                 sapStock.setTotalPrice(totalPrice);
                 sapStock.setUnit(stock.getMEINS());
+                sapStock.setCurrency(stock.getWAERS());
                 sapStock.setSyncTime(LocalDateTime.now());
 
                 tobeAddedStocks.add(sapStock);
@@ -1226,6 +1228,8 @@ public class IotSapServiceImpl implements IotSapService {
                     existingStock.setUnitPrice(sapStockVO.getJIAGE());
                     existingStock.setQuantity(sapStockVO.getLABST());
                     existingStock.setUnit(sapStockVO.getMEINS());
+                    // 币种
+                    existingStock.setCurrency(sapStockVO.getWAERS());
                     existingStock.setSyncTime(LocalDateTime.now());
 
                     actualUpdatedStocks.add(existingStock);

+ 3 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/sap/vo/IotSapStockVO.java

@@ -50,4 +50,7 @@ public class IotSapStockVO {
     @Schema(description = "库存价格", example = "21.3")
     private BigDecimal JIAGE;
 
+    @Schema(description = "币种", example = "21.3")
+    private String WAERS;
+
 }

+ 14 - 3
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/iotrddailyreport/IotRdDailyReportServiceImpl.java

@@ -3798,7 +3798,8 @@ public class IotRdDailyReportServiceImpl implements IotRdDailyReportService {
         Map<Long, DeptDO> tempDeptMap = deptService.getDeptMap(convertList(dailyReports, IotRdDailyReportDO::getDeptId));
         // key井id   value井名称
         Map<Long, String> taskPair = new HashMap<>();
-
+        // key井id   value井创建时间
+        Map<Long, LocalDateTime> taskCreateTimeMap = new HashMap<>();
         List<Long> taskIds = dailyReports.stream()
                 .map(IotRdDailyReportDO::getTaskId)
                 .filter(Objects::nonNull)  // 过滤 null taskId,避免后续查询异常
@@ -3813,7 +3814,7 @@ public class IotRdDailyReportServiceImpl implements IotRdDailyReportService {
                     taskPair.put(task.getId(), task.getWellName());
                     // 大概率集合中只有1个元素 集合中的元素就是 队伍id
                     Set<Long> deptIds = task.getDeptIds();
-
+                    taskCreateTimeMap.put(task.getId(), task.getCreateTime());
                 });
             }
         }
@@ -3823,9 +3824,9 @@ public class IotRdDailyReportServiceImpl implements IotRdDailyReportService {
                 .collect(Collectors.groupingBy(IotRdDailyReportDO::getDeptId));
 
         deptGroup.forEach((deptId, reportsOfDept) -> {
+            DeptDO dept = tempDeptMap.get(deptId);
             // 构造队伍 VO
             IotRdDailyReportSummaryTeamRespVO teamVO = new IotRdDailyReportSummaryTeamRespVO();
-            DeptDO dept = tempDeptMap.get(deptId);
             teamVO.setTeamName(dept != null ? dept.getName() : "未知队伍");
             teamVO.setReportCount(reportsOfDept.size());
             // 统计井数量(去重)
@@ -3834,6 +3835,8 @@ public class IotRdDailyReportServiceImpl implements IotRdDailyReportService {
                     .filter(Objects::nonNull)
                     .collect(Collectors.toSet());
             teamVO.setWellCount(wellIds.size());
+            // 设置排序值(若无则置为最大,排最后)
+            teamVO.setSort(dept != null && dept.getSort() != null ? dept.getSort() : Integer.MAX_VALUE);
             teamVO.setLevel(""); // 按需设置
 
             // 2. 按井分组
@@ -3866,10 +3869,18 @@ public class IotRdDailyReportServiceImpl implements IotRdDailyReportService {
                 wellVOs.add(wellVO);
             });
 
+            // 按创建时间倒序排序 wellVOs
+            wellVOs.sort(Comparator.comparing(
+                    (IotRdDailyReportSummaryWellRespVO w) -> taskCreateTimeMap.get(w.getTaskId()),
+                    Comparator.nullsLast(Comparator.reverseOrder())
+            ));
+
             teamVO.setWells(wellVOs);
             result.add(teamVO);
         });
 
+        // 按 sort 升序排序
+        result.sort(Comparator.comparingInt(IotRdDailyReportSummaryTeamRespVO::getSort));
         return result;
     }