Browse Source

Merge remote-tracking branch 'gitlab/dev'

# Conflicts:
#	ruoyi-admin/src/main/java/com/ruoyi/inventory/controller/TbInventoryDetailController.java
LinWuTai 1 year ago
parent
commit
b1ac424081

+ 30 - 18
ruoyi-admin/src/main/java/com/ruoyi/inventory/controller/TbAssetInventoryController.java

@@ -1,6 +1,7 @@
 package com.ruoyi.inventory.controller;
 
 import java.io.IOException;
+import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
 import java.util.Set;
@@ -171,22 +172,33 @@ public class TbAssetInventoryController extends BaseController
         QRCodeUtils.createCodeToOutputStream(qrDTO, response.getOutputStream());
     }
 
-//    /**
-//     * 查询部门资产报表(两次盘点间的资产损耗)
-//     * @param depId 部门ID
-//     * @return
-//     */
-////    我粘贴过来的 @PreAuthorize("@ss.hasPermi('inventory:inventory:query')")
-//    @GetMapping("/getDepAssetLossTb")
-//    public AjaxResult getDepAssetLossTb(String depId){
-//        List<DepAssetLossResultDto> results = tbAssetInventoryService.inventoryDepAssetById(depId);
-//        return success(results);
-//    }
-//
-//    @PostMapping("/exportDepAssetLossTb/{deptId}")
-//    public void exportDepAssetLossTb(HttpServletResponse response, @PathVariable("deptId") String depId){
-//        List<DepAssetLossResultDto> results = tbAssetInventoryService.inventoryDepAssetById(depId);
-//        ExcelUtil<DepAssetLossResultDto> util = new ExcelUtil<DepAssetLossResultDto>(DepAssetLossResultDto.class);
-//        util.exportExcel(response, results, "近两次资产盘点损耗统计");
-//    }
+    /**
+     * 查询部门资产报表(两次盘点间的资产损耗)
+     * @param depId 部门ID
+     * @return
+     */
+    @GetMapping("/getDepAssetLossTb")
+    public AjaxResult getDepAssetLossTb(String depId){
+
+        List<DepAssetLossResultDto> result = null;
+        try {
+            result = tbAssetInventoryService.inventoryDepAssetById(depId);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return success(result);
+    }
+
+    @PostMapping("/exportDepAssetLossTb/{deptId}")
+    public void exportDepAssetLossTb(HttpServletResponse response, @RequestParam String deptId){
+
+        List<DepAssetLossResultDto> result = null;
+        try {
+            result = tbAssetInventoryService.inventoryDepAssetById(depId);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        ExcelUtil<DepAssetLossResultDto> util = new ExcelUtil<DepAssetLossResultDto>(DepAssetLossResultDto.class);
+        util.exportExcel(response, result, "近两次资产盘点损耗统计");
+    }
 }

+ 114 - 112
ruoyi-admin/src/main/java/com/ruoyi/inventory/controller/TbInventoryDetailController.java

@@ -1,7 +1,10 @@
 package com.ruoyi.inventory.controller;
 
 import java.util.ArrayList;
+import java.util.Date;
 import java.util.List;
+import java.util.Set;
+import java.util.stream.Collectors;
 import javax.servlet.http.HttpServletResponse;
 
 import cn.hutool.core.date.DateUtil;
@@ -59,61 +62,60 @@ public class TbInventoryDetailController extends BaseController
      * 查询全单位或者部门的资产对比分析报表
      * @return
      */
-    @PreAuthorize("@ss.hasPermi('inventory:compare:list')")
-    @GetMapping("/getDepAssetLossTb")
-    public TableDataInfo compareList(InventoryCompareDTO inventoryCompareDTO){
-        String deptId = inventoryCompareDTO.getDeptId();
-        startPage();
-        TbInventoryCompareResult tbInventoryCompareResult = new TbInventoryCompareResult();
-        List<TbInventoryCompareResult> tbInventoryCompareResultList = new ArrayList<>();
-
-        List<TbAssetInventory> tbAssetInventoryList = tbInventoryDetailService.selectTbInventoryCompareList(deptId);
-        if(tbAssetInventoryList.size() == 0){
-            throw new RuntimeException("该组织不存在盘点完毕的盘点或者该部门不存在盘点完毕的盘点");
-        }
-        if(tbAssetInventoryList.size() == 1){
-            throw new RuntimeException("该组织只存在一个盘点,不能进行盘点间类别数量损耗对比");
-        }
-
-        //最近一次盘点
-        String orderNumber = tbAssetInventoryList.get(0).getOrderNumber();
-        if (StrUtil.isBlank(orderNumber)) {
-            throw new RuntimeException("盘点计划编码不能为空");
-        }
-        List<TbInventoryDetail> tbInventoryDetailList1 = tbInventoryDetailService.selectTbInventoryDetailByOrderNumber(orderNumber);
-        List<AssetInventoryStatement> inventoryStatement1 = getInventoryStatement(tbAssetInventoryList.get(0), tbInventoryDetailList1);
-        List<TbInventoryCompare> tbInventoryCompareList = getTbInventoryCompareList(inventoryStatement1);
-        double total = 0.0;
-        for (TbInventoryCompare tbInventoryCompare : tbInventoryCompareList) {
-            total = tbInventoryCompare.getLossVal()+total;
-        }
-        tbInventoryCompareResult.setDate(tbAssetInventoryList.get(0).getInventoryDate());
-        tbInventoryCompareResult.setAssetResultList(tbInventoryCompareList);
-        tbInventoryCompareResult.setInventoryDepartment(tbAssetInventoryList.get(0).getInventoryDepartmentName());
-        tbInventoryCompareResult.setLossTotal(total);
-        tbInventoryCompareResultList.add(tbInventoryCompareResult);
-
-        //最近一次的上一次盘点
-        TbInventoryCompareResult tbInventoryCompareResult2 = new TbInventoryCompareResult();
-        orderNumber = tbAssetInventoryList.get(1).getOrderNumber();
-        if (StrUtil.isBlank(orderNumber)) {
-            throw new RuntimeException("盘点计划编码不能为空");
-        }
-        List<TbInventoryDetail> tbInventoryDetailList2 = tbInventoryDetailService.selectTbInventoryDetailByOrderNumber(orderNumber);
-        List<AssetInventoryStatement> inventoryStatement2 = getInventoryStatement(tbAssetInventoryList.get(0), tbInventoryDetailList2);
-        List<TbInventoryCompare> tbInventoryCompareList2 = getTbInventoryCompareList(inventoryStatement2);
-        total = 0.0;
-        for (TbInventoryCompare tbInventoryCompare : tbInventoryCompareList2) {
-            total = tbInventoryCompare.getLossVal()+total;
-        }
-        tbInventoryCompareResult2.setDate(tbAssetInventoryList.get(0).getInventoryDate());
-        tbInventoryCompareResult2.setAssetResultList(tbInventoryCompareList2);
-        tbInventoryCompareResult2.setInventoryDepartment(tbAssetInventoryList.get(1).getInventoryDepartmentName());
-        tbInventoryCompareResult2.setLossTotal(total);
-        tbInventoryCompareResultList.add(tbInventoryCompareResult2);
-
-        return getDataTable(tbInventoryCompareResultList);
-    }
+//    @PreAuthorize("@ss.hasPermi('inventory:compare:list')")
+//    @GetMapping("/getDepAssetLossTb")
+//    public TableDataInfo compareList(@RequestParam(required = false) String deptId){
+//        startPage();
+//        TbInventoryCompareResult tbInventoryCompareResult = new TbInventoryCompareResult();
+//        List<TbInventoryCompareResult> tbInventoryCompareResultList = new ArrayList<>();
+//
+//        List<TbAssetInventory> tbAssetInventoryList = tbInventoryDetailService.selectTbInventoryCompareList(deptId);
+//        if(tbAssetInventoryList.size() == 0){
+//            throw new RuntimeException("该组织不存在盘点完毕的盘点或者该部门不存在盘点完毕的盘点");
+//        }
+//        if(tbAssetInventoryList.size() == 1){
+//            throw new RuntimeException("该组织只存在一个盘点,不能进行盘点间类别数量损耗对比");
+//        }
+//
+//        //最近一次盘点
+//        String orderNumber = tbAssetInventoryList.get(0).getOrderNumber();
+//        if (StrUtil.isBlank(orderNumber)) {
+//            throw new RuntimeException("盘点计划编码不能为空");
+//        }
+//        List<TbInventoryDetail> tbInventoryDetailList1 = tbInventoryDetailMapper.selectTbInventoryDetailByOrderNumber(orderNumber);
+//        List<AssetInventoryStatement> inventoryStatement1 = getInventoryStatement(tbAssetInventoryList.get(0), tbInventoryDetailList1);
+//        List<TbInventoryCompare> tbInventoryCompareList = getTbInventoryCompareList(inventoryStatement1);
+//        double total = 0.0;
+//        for (TbInventoryCompare tbInventoryCompare : tbInventoryCompareList) {
+//            total = tbInventoryCompare.getLossVal()+total;
+//        }
+//        tbInventoryCompareResult.setDate(tbAssetInventoryList.get(0).getInventoryDate());
+//        tbInventoryCompareResult.setAssetResultList(tbInventoryCompareList);
+//        tbInventoryCompareResult.setInventoryDepartment(tbAssetInventoryList.get(0).getInventoryDepartmentName());
+//        tbInventoryCompareResult.setLossTotal(total);
+//        tbInventoryCompareResultList.add(tbInventoryCompareResult);
+//
+//        //最近一次的上一次盘点
+//        TbInventoryCompareResult tbInventoryCompareResult2 = new TbInventoryCompareResult();
+//        orderNumber = tbAssetInventoryList.get(1).getOrderNumber();
+//        if (StrUtil.isBlank(orderNumber)) {
+//            throw new RuntimeException("盘点计划编码不能为空");
+//        }
+//        List<TbInventoryDetail> tbInventoryDetailList2 = tbInventoryDetailMapper.selectTbInventoryDetailByOrderNumber(orderNumber);
+//        List<AssetInventoryStatement> inventoryStatement2 = getInventoryStatement(tbAssetInventoryList.get(0), tbInventoryDetailList2);
+//        List<TbInventoryCompare> tbInventoryCompareList2 = getTbInventoryCompareList(inventoryStatement2);
+//        total = 0.0;
+//        for (TbInventoryCompare tbInventoryCompare : tbInventoryCompareList2) {
+//            total = tbInventoryCompare.getLossVal()+total;
+//        }
+//        tbInventoryCompareResult2.setDate(tbAssetInventoryList.get(0).getInventoryDate());
+//        tbInventoryCompareResult2.setAssetResultList(tbInventoryCompareList2);
+//        tbInventoryCompareResult2.setInventoryDepartment(tbAssetInventoryList.get(1).getInventoryDepartmentName());
+//        tbInventoryCompareResult2.setLossTotal(total);
+//        tbInventoryCompareResultList.add(tbInventoryCompareResult2);
+//
+//        return getDataTable(tbInventoryCompareResultList);
+//    }
 
     @Autowired
     private ITbAssetInventoryService inventoryService;
@@ -170,62 +172,62 @@ public class TbInventoryDetailController extends BaseController
      * 导出全单位或者部门的资产对比分析报表
      * @param response
      */
-    @PreAuthorize("@ss.hasPermi('inventory:compare:export')")
-    @Log(title = "全单位资产对比分析报表", businessType = BusinessType.EXPORT)
-    @PostMapping("/exportDepAssetLossTb")
-    public void exportCompare(HttpServletResponse response,@RequestParam("deptId") String deptId){
-        TbInventoryCompareResult tbInventoryCompareResult = new TbInventoryCompareResult();
-        List<TbInventoryCompareResult> tbInventoryCompareResultList = new ArrayList<>();
-
-        List<TbAssetInventory> tbAssetInventoryList = tbInventoryDetailService.selectTbInventoryCompareList(deptId);
-        if(tbAssetInventoryList.size() == 0){
-            throw new RuntimeException("该组织不存在盘点完毕的盘点或者该部门不参在盘点完毕的盘点");
-        }
-        if(tbAssetInventoryList.size() == 1){
-            throw new RuntimeException("该组织只存在一个盘点,不能进行盘点间类别数量损耗对比");
-        }
-
-        //最近一次盘点
-        String orderNumber = tbAssetInventoryList.get(0).getOrderNumber();
-        if (StrUtil.isBlank(orderNumber)) {
-            throw new RuntimeException("盘点计划编码不能为空");
-        }
-        List<TbInventoryDetail> tbInventoryDetailList1 = tbInventoryDetailService.selectTbInventoryDetailByOrderNumber(orderNumber);
-        List<AssetInventoryStatement> inventoryStatement1 = getInventoryStatement(tbAssetInventoryList.get(0), tbInventoryDetailList1);
-        List<TbInventoryCompare> tbInventoryCompareList = getTbInventoryCompareList(inventoryStatement1);
-        double total = 0.0;
-        for (TbInventoryCompare tbInventoryCompare : tbInventoryCompareList) {
-            total = tbInventoryCompare.getLossVal()+total;
-        }
-        tbInventoryCompareResult.setDate(tbAssetInventoryList.get(0).getInventoryDate());
-        tbInventoryCompareResult.setAssetResultList(tbInventoryCompareList);
-        tbInventoryCompareResult.setInventoryDepartment(tbAssetInventoryList.get(0).getInventoryDepartmentName());
-        tbInventoryCompareResult.setLossTotal(total);
-        tbInventoryCompareResultList.add(tbInventoryCompareResult);
-
-        //最近一次的上一次盘点
-        TbInventoryCompareResult tbInventoryCompareResult2 = new TbInventoryCompareResult();
-        orderNumber = tbAssetInventoryList.get(1).getOrderNumber();
-        if (StrUtil.isBlank(orderNumber)) {
-            throw new RuntimeException("盘点计划编码不能为空");
-        }
-        List<TbInventoryDetail> tbInventoryDetailList2 = tbInventoryDetailService.selectTbInventoryDetailByOrderNumber(orderNumber);
-        List<AssetInventoryStatement> inventoryStatement2 = getInventoryStatement(tbAssetInventoryList.get(0), tbInventoryDetailList2);
-        List<TbInventoryCompare> tbInventoryCompareList2 = getTbInventoryCompareList(inventoryStatement2);
-        total = 0.0;
-        for (TbInventoryCompare tbInventoryCompare : tbInventoryCompareList2) {
-            total = tbInventoryCompare.getLossVal()+total;
-        }
-        tbInventoryCompareResult2.setDate(tbAssetInventoryList.get(0).getInventoryDate());
-        tbInventoryCompareResult2.setAssetResultList(tbInventoryCompareList2);
-        tbInventoryCompareResult2.setInventoryDepartment(tbAssetInventoryList.get(1).getInventoryDepartmentName());
-        tbInventoryCompareResult2.setLossTotal(total);
-        tbInventoryCompareResultList.add(tbInventoryCompareResult2);
-
-        ExcelUtil<TbInventoryCompareResult> util = new ExcelUtil<>(TbInventoryCompareResult.class);
-
-        util.exportExcel(response, tbInventoryCompareResultList , "资产对比分析报表");
-    }
+//    @PreAuthorize("@ss.hasPermi('inventory:compare:export')")
+//    @Log(title = "全单位资产对比分析报表", businessType = BusinessType.EXPORT)
+//    @PostMapping("/exportDepAssetLossTb")
+//    public void exportCompare(HttpServletResponse response,@RequestParam(required = false) String deptId){
+//        TbInventoryCompareResult tbInventoryCompareResult = new TbInventoryCompareResult();
+//        List<TbInventoryCompareResult> tbInventoryCompareResultList = new ArrayList<>();
+//
+//        List<TbAssetInventory> tbAssetInventoryList = tbInventoryDetailService.selectTbInventoryCompareList(deptId);
+//        if(tbAssetInventoryList.size() == 0){
+//            throw new RuntimeException("该组织不存在盘点完毕的盘点或者该部门不参在盘点完毕的盘点");
+//        }
+//        if(tbAssetInventoryList.size() == 1){
+//            throw new RuntimeException("该组织只存在一个盘点,不能进行盘点间类别数量损耗对比");
+//        }
+//
+//        //最近一次盘点
+//        String orderNumber = tbAssetInventoryList.get(0).getOrderNumber();
+//        if (StrUtil.isBlank(orderNumber)) {
+//            throw new RuntimeException("盘点计划编码不能为空");
+//        }
+//        List<TbInventoryDetail> tbInventoryDetailList1 = tbInventoryDetailMapper.selectTbInventoryDetailByOrderNumber(orderNumber);
+//        List<AssetInventoryStatement> inventoryStatement1 = getInventoryStatement(tbAssetInventoryList.get(0), tbInventoryDetailList1);
+//        List<TbInventoryCompare> tbInventoryCompareList = getTbInventoryCompareList(inventoryStatement1);
+//        double total = 0.0;
+//        for (TbInventoryCompare tbInventoryCompare : tbInventoryCompareList) {
+//            total = tbInventoryCompare.getLossVal()+total;
+//        }
+//        tbInventoryCompareResult.setDate(tbAssetInventoryList.get(0).getInventoryDate());
+//        tbInventoryCompareResult.setAssetResultList(tbInventoryCompareList);
+//        tbInventoryCompareResult.setInventoryDepartment(tbAssetInventoryList.get(0).getInventoryDepartmentName());
+//        tbInventoryCompareResult.setLossTotal(total);
+//        tbInventoryCompareResultList.add(tbInventoryCompareResult);
+//
+//        //最近一次的上一次盘点
+//        TbInventoryCompareResult tbInventoryCompareResult2 = new TbInventoryCompareResult();
+//        orderNumber = tbAssetInventoryList.get(1).getOrderNumber();
+//        if (StrUtil.isBlank(orderNumber)) {
+//            throw new RuntimeException("盘点计划编码不能为空");
+//        }
+//        List<TbInventoryDetail> tbInventoryDetailList2 = tbInventoryDetailMapper.selectTbInventoryDetailByOrderNumber(orderNumber);
+//        List<AssetInventoryStatement> inventoryStatement2 = getInventoryStatement(tbAssetInventoryList.get(0), tbInventoryDetailList2);
+//        List<TbInventoryCompare> tbInventoryCompareList2 = getTbInventoryCompareList(inventoryStatement2);
+//        total = 0.0;
+//        for (TbInventoryCompare tbInventoryCompare : tbInventoryCompareList2) {
+//            total = tbInventoryCompare.getLossVal()+total;
+//        }
+//        tbInventoryCompareResult2.setDate(tbAssetInventoryList.get(0).getInventoryDate());
+//        tbInventoryCompareResult2.setAssetResultList(tbInventoryCompareList2);
+//        tbInventoryCompareResult2.setInventoryDepartment(tbAssetInventoryList.get(1).getInventoryDepartmentName());
+//        tbInventoryCompareResult2.setLossTotal(total);
+//        tbInventoryCompareResultList.add(tbInventoryCompareResult2);
+//
+//        ExcelUtil<TbInventoryCompareResult> util = new ExcelUtil<>(TbInventoryCompareResult.class);
+//
+//        util.exportExcel(response, tbInventoryCompareResultList , "资产对比分析报表");
+//    }
 
     /**
      * 获取盘点报表
@@ -255,7 +257,6 @@ public class TbInventoryDetailController extends BaseController
             assetInventoryStatement.setAssetNumber(assetInformation.getNumber());
 
             // 设置资产名称
-            System.out.println("设置资产名称");
             assetInventoryStatement.setAssetName(assetInformation.getName());
 
             // 设置所在位置
@@ -383,6 +384,7 @@ public class TbInventoryDetailController extends BaseController
                 if(quantity>inventoryQuantity){
                     tbInventoryCompare.setLossNumber(quantity - inventoryQuantity);
                     tbInventoryCompare.setLossVal(assetInventoryStatement.getOriginalValue()*(quantity - inventoryQuantity));
+
                 }else {
                     tbInventoryCompare.setLossNumber(0);
                     tbInventoryCompare.setLossVal(0.0);

+ 1 - 0
ruoyi-admin/src/main/java/com/ruoyi/inventory/domain/dto/AssetInvOrderDto.java

@@ -13,4 +13,5 @@ public class AssetInvOrderDto {
 
     private String orderNumber;
     private String inventDate;
+    private String deptName;
 }

+ 17 - 0
ruoyi-admin/src/main/java/com/ruoyi/inventory/domain/dto/DepAssetDetailDto.java

@@ -0,0 +1,17 @@
+package com.ruoyi.inventory.domain.dto;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@NoArgsConstructor
+@AllArgsConstructor
+@Data
+public class DepAssetDetailDto {
+
+    /** 实点数量 */
+    private int inventoryQuantity;
+
+    /** 资产元数据 */
+    private String assetData;
+}

+ 15 - 7
ruoyi-admin/src/main/java/com/ruoyi/inventory/domain/dto/DepAssetLossDto.java

@@ -21,22 +21,30 @@ public class DepAssetLossDto  {
 
     /** 位置 */
     @Excel(name = "位置")
-    private List<String> locations;
+    private String location;
 
     /** 类别 */
     @Excel(name = "类别")
     private String category;
 
-    /** 现存数量 */
-    @Excel(name = "现存数量")
+    /** 计量单位 */
+    @Excel(name = "计量单位")
+    private String units;
+
+    /** 账面数量变化 */
+    @Excel(name = "账面数量变化")
     private int nowQuantity;
 
-    /** 损耗数量 */
-    @Excel(name = "损耗数量")
+    /** 实点数量变化 */
+    @Excel(name = "实点数量变化")
+    private int invQuantity;
+
+    /** 损耗数量变化 */
+    @Excel(name = "损耗数量变化")
     private int lossQuantity;
 
-    /** 损耗值 */
-    @Excel(name = "损耗值")
+    /** 损耗值变化 */
+    @Excel(name = "损耗值变化")
     private double lossVal;
 
 

+ 20 - 8
ruoyi-admin/src/main/java/com/ruoyi/inventory/domain/dto/DepAssetLossResultDto.java

@@ -15,20 +15,32 @@ public class DepAssetLossResultDto {
     /**
      * 此次盘点计算出的损耗总值
      */
-    @Excel(name = "损耗总值")
-    private double totalLossVal;
+//    @Excel(name = "损耗总值")
+//    private double totalLossVal;
 
     /**
-     * 盘点时间
+     * 最近一次盘点日期
      */
-    @Excel(name = "盘点时间")
-    private String date;
+    @Excel(name = "最近一次盘点日期")
+    private String lastFirstDate;
 
     /**
-     * 资产盘点结果集
+     * 前前次盘点日期
      */
-    @Excel(name = "资产盘点结果集")
-    private List<DepAssetLossDto> assetResultList;
+    @Excel(name = "前前次盘点日期")
+    private String lastSecondDate;
+
+    /**
+     * 盘点部门名称
+     */
+    @Excel(name = "部门名称")
+    private String deptName;
+
+    /**
+     * 资产损耗盘点结果集
+     */
+    @Excel(name = "资产损耗盘点结果集")
+    private List<DepAssetLossDto> compareResultList;
 
 
 }

+ 6 - 1
ruoyi-admin/src/main/java/com/ruoyi/inventory/mapper/TbAssetInventoryMapper.java

@@ -4,6 +4,7 @@ import java.util.List;
 import com.ruoyi.inventory.domain.TbAssetInventory;
 import com.ruoyi.inventory.domain.TbInventoryDetail;
 import com.ruoyi.inventory.domain.dto.AssetInvOrderDto;
+import com.ruoyi.inventory.domain.dto.DepAssetDetailDto;
 import com.ruoyi.inventory.domain.dto.DepAssetLossDto;
 import com.ruoyi.inventory.domain.dto.TbAssetInventoryDTO;
 import org.apache.ibatis.annotations.Param;
@@ -81,7 +82,11 @@ public interface TbAssetInventoryMapper
      */
     public List<TbAssetInventoryDTO> selectTbAssetInventoryDTOList(TbAssetInventoryDTO dto);
 
-    List<String> getDepAssetByOrderNumber(String orderNumber);
+    List<DepAssetDetailDto> getDepAssetByOrderNumber(String orderNumber);
 
     List<AssetInvOrderDto> getOrderNumberByDepId(@Param("depId") String depId);
+
+    List<String> getChildDeptId(String deptId);
+
+
 }

+ 2 - 1
ruoyi-admin/src/main/java/com/ruoyi/inventory/service/ITbAssetInventoryService.java

@@ -2,6 +2,7 @@ package com.ruoyi.inventory.service;
 
 import java.util.List;
 import com.ruoyi.inventory.domain.TbAssetInventory;
+import com.ruoyi.inventory.domain.dto.DepAssetLossResultDto;
 import com.ruoyi.inventory.domain.dto.TakeStockDTO;
 import com.ruoyi.inventory.domain.dto.TbAssetInventoryDTO;
 
@@ -81,5 +82,5 @@ public interface ITbAssetInventoryService
     public List<TbAssetInventoryDTO> selectTbAssetInventoryDTOList(TbAssetInventoryDTO dto);
 
 
-    List inventoryDepAssetById(String depId);
+    List<DepAssetLossResultDto> inventoryDepAssetById(String depId) throws Exception;
 }

+ 165 - 73
ruoyi-admin/src/main/java/com/ruoyi/inventory/service/impl/TbAssetInventoryServiceImpl.java

@@ -8,10 +8,12 @@ import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.StrUtil;
 import cn.hutool.json.JSONUtil;
+import com.mchange.lang.DoubleUtils;
 import com.ruoyi.asset.domain.TbAssetInformation;
 import com.ruoyi.asset.domain.TbLocation;
 import com.ruoyi.asset.mapper.TbAssetInformationMapper;
 import com.ruoyi.asset.mapper.TbLocationMapper;
+import com.ruoyi.common.utils.StringUtils;
 import com.ruoyi.inventory.domain.TbInventoryDetail;
 import com.ruoyi.inventory.domain.dto.*;
 import com.ruoyi.inventory.mapper.TbInventoryDetailMapper;
@@ -466,7 +468,7 @@ public class TbAssetInventoryServiceImpl implements ITbAssetInventoryService
      * @param depId
      * @return
      */
-    public List<DepAssetLossResultDto> inventoryDepAssetById(String depId){
+    public List<DepAssetLossResultDto> inventoryDepAssetById(String depId) throws Exception {
 
        /* 本想这样写sql的:
         select inventory_metadata metadata
@@ -478,120 +480,210 @@ public class TbAssetInventoryServiceImpl implements ITbAssetInventoryService
             order by inventory_date desc
             limit 0,2)
         但是,语法不支持,会报错:This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery'
-        暂时选择以下方法解决,要连接四次数据库,很可能需要优化
+        暂时选择以下方法解决,要连接四次数据库,很可能需要优化
         */
 
+        List<String> childDeptIdList = tbAssetInventoryMapper.getChildDeptId(depId);
+        if(childDeptIdList == null || childDeptIdList.size()==0){
+            throw new Exception("不存在该部门id");
+        }
+        List<DepAssetLossResultDto> resultDtoList = new ArrayList<>();
         //历史盘点计划编码和日期
-        List<AssetInvOrderDto> invs = tbAssetInventoryMapper.getOrderNumberByDepId(depId);
-        //前前一次盘点计划编码和日期
-//        TbAssetInventoryDTO old_inv = tbAssetInventoryMapper.getOrderNumberByDepId(depId);
+        List<AssetInvOrderDto> invs;
+        for (String ch_depId : childDeptIdList) {
+            invs = tbAssetInventoryMapper.getOrderNumberByDepId(ch_depId);
+            if (ObjectUtil.isEmpty(invs) || invs.size()==0){
+                continue;
+            };
 
-        if (ObjectUtil.isEmpty(invs) || invs.size()==0) return null;
+            AssetInvOrderDto new_inv = invs.get(0);
+//        System.out.println("new-盘点计划:"+new_inv);
+            AssetInvOrderDto old_inv = null;
+            if (invs.size()>1) old_inv = invs.get(1);
 
-        AssetInvOrderDto new_inv = invs.get(0);
-        System.out.println("new-盘点计划:"+new_inv);
-        AssetInvOrderDto old_inv = null;
-        if (invs.size()>1) old_inv = invs.get(1);
+            DepAssetLossResultDto resultDto = null;
 
-        DepAssetLossResultDto old_resultDto = null;
-        DepAssetLossResultDto new_resultDto = null;
-        if (new_inv!=null){
-            new_resultDto = lossResult(new_inv);
+            if (!ObjectUtil.isNull(new_inv)) {
+                resultDto = compareResult(new_inv,old_inv);
+                resultDto.setDeptName(new_inv.getDeptName());
+            }
+            resultDtoList.add(resultDto);
         }
-        if (!ObjectUtil.isNull(old_inv)) old_resultDto = lossResult(old_inv);
 
-        List<DepAssetLossResultDto> results = new ArrayList<>();
-        results.add(old_resultDto);
-        results.add(new_resultDto);
-        return results;
+
+        //前前一次盘点计划编码和日期
+//        TbAssetInventoryDTO old_inv = tbAssetInventoryMapper.getOrderNumberByDepId(depId);
+
+        return resultDtoList;
     }
 
     /**
      * 处理资产信息,统计每一样资产的损耗情况
      * @param assetInfos
      * @param assetMap
-     * @param lossValMap
      */
     private void handleAssetInfo(List<TbAssetInformation> assetInfos,
                                  Map<String, DepAssetLossDto> assetMap,
-                                 Map<String, Double> lossValMap){
+                                 Map<String, Integer> invQuantity_map){
         for (TbAssetInformation asset : assetInfos) {
-            if (!assetMap.containsKey(asset.getName())){
+            //资产位置
+            String loc = asset.getAncestorLocationName()+asset.getParentLocationName()+asset.getLocationName();
+
+            if (!assetMap.containsKey(asset.getName()+"-"+loc)){
 
                 DepAssetLossDto lossDto = new DepAssetLossDto();
                 lossDto.setAssetName(asset.getName());
                 lossDto.setCategory(asset.getCategoryName());
+                lossDto.setUnits(asset.getUnits());
+                lossDto.setLocation(loc);
+                //账面数量
                 lossDto.setNowQuantity(asset.getQuantity());
-
-                List<String> locations = new ArrayList<>();
-                if (asset.getManageStatus()==7) {
-                    lossDto.setLossQuantity(asset.getQuantity());
-                    locations.add(asset.getAncestorLocationName()+asset.getParentLocationName()+asset.getLocationName());
-                    lossDto.setLocations(locations);
-                    lossValMap.put(asset.getName(),(asset.getOriginalValue()-asset.getNetValue())*asset.getQuantity());
+                //实点数量
+                lossDto.setInvQuantity(invQuantity_map.get(asset.getName()+"-"+loc));
+                //损耗数量 = 账面数量 - 实点数量
+                lossDto.setLossQuantity(lossDto.getNowQuantity()-lossDto.getInvQuantity());
+                //损耗值
+                Double a = asset.getOriginalValue(); //原值
+                Double b = asset.getNetValue();      //净值
+                Double c = asset.getResidualValue(); //残值
+                if (lossDto.getLossQuantity()>0){
+                    if (ObjectUtil.isNull(a) || ObjectUtil.isNull(b) || ObjectUtil.isNull(c)) {
+                        lossDto.setLossVal(0);
+                    } else {
+                        lossDto.setLossVal((a-b)*invQuantity_map.get(asset.getName()+"-"+loc)
+                                + (a-c)*lossDto.getLossQuantity());
+                    }
+                } else {
+                    if (ObjectUtil.isNull(a) || ObjectUtil.isNull(b)){
+                        lossDto.setLossVal(0);
+                    } else {
+                        lossDto.setLossVal((a-b)*invQuantity_map.get(asset.getName()+"-"+loc));
+                    }
                 }
-                assetMap.put(asset.getName(),lossDto);
+                assetMap.put(asset.getName()+"-"+loc,lossDto);
             } else {
-                DepAssetLossDto lossDto = assetMap.get(asset.getName());
+                DepAssetLossDto lossDto = assetMap.get(asset.getName()+"-"+loc);
+                //账面数量
                 lossDto.setNowQuantity(lossDto.getNowQuantity()+asset.getQuantity());
-                if (asset.getManageStatus()==7) {
-                    lossDto.setLossQuantity(lossDto.getLossQuantity()+asset.getQuantity());
-                    lossDto.getLocations()
-                            .add(asset.getAncestorLocationName()+asset.getParentLocationName()+asset.getLocationName());
-                    lossValMap.put(asset.getName(),
-                                   Double.sum(lossValMap.get(asset.getName()),
-                                           (asset.getOriginalValue()-asset.getNetValue())*asset.getQuantity()));
+                //损耗数量
+                lossDto.setLossQuantity(lossDto.getNowQuantity()-lossDto.getInvQuantity());
+                //损耗值
+                Double a = asset.getOriginalValue(); //原值
+                Double b = asset.getNetValue();      //净值
+                Double c = asset.getResidualValue(); //残值
+                if (lossDto.getLossQuantity()>0){
+                    if (ObjectUtil.isNull(a) || ObjectUtil.isNull(b) || ObjectUtil.isNull(c)) {
+                        lossDto.setLossVal(0);
+                    } else {
+                        lossDto.setLossVal((a-b)*invQuantity_map.get(asset.getName()+"-"+loc)
+                                + (a-c)*lossDto.getLossQuantity());
+                    }
+                } else {
+                    if (ObjectUtil.isNull(a) || ObjectUtil.isNull(b)){
+                        lossDto.setLossVal(0);
+                    } else {
+                        lossDto.setLossVal((a-b)*invQuantity_map.get(asset.getName()+"-"+loc));
+                    }
                 }
             }
-
         }
     }
 
     /**
-     * 根据盘点计划的编号查询出资产元数据,并统计损耗
-     * @param invPlan
+     * 统计并对比两次盘点的资产数据
+     * @param new_invPlan
      * @return
      */
-    private DepAssetLossResultDto lossResult(AssetInvOrderDto invPlan){
-
-        List<String> asset_list = tbAssetInventoryMapper.getDepAssetByOrderNumber(invPlan.getOrderNumber());
-        //盘点资产详细信息-元数据
-        List<TbAssetInformation> assetInfos = new ArrayList<>();
-        //json数据 --> java对象
-        for (String asset : asset_list) {
-            System.out.println(asset);
-            assetInfos.add(JSONUtil.toBean(asset, TbAssetInformation.class));
+    private DepAssetLossResultDto compareResult(AssetInvOrderDto new_invPlan, AssetInvOrderDto old_invPlan){
+
+        //----------------------最近一次---------------------------
+        //资产统计
+        Map<String, DepAssetLossDto> new_assetMap = new HashMap<>();
+        //记录实点数量
+        Map<String, Integer> new_invQuantity_map = new HashMap<>();
+
+        getInvResult(new_invPlan, new_assetMap, new_invQuantity_map);
+
+        //---------------------前前一次----------------------------
+        //资产统计
+        Map<String, DepAssetLossDto> old_assetMap = new HashMap<>();
+        //记录实点数量
+        Map<String, Integer> old_invQuantity_map = new HashMap<>();
+
+        boolean result = getInvResult(old_invPlan, old_assetMap, old_invQuantity_map);
+        //如果只有一次盘点,则直接返回资产数据
+        if (!result){
+            ArrayList<DepAssetLossDto> resultList = new ArrayList<>();
+            Set<Map.Entry<String, DepAssetLossDto>> assets = new_assetMap.entrySet();
+            for (Map.Entry<String, DepAssetLossDto> asset : assets) {
+                resultList.add(asset.getValue());
+            }
+            DepAssetLossResultDto resultDto = new DepAssetLossResultDto();
+            resultDto.setCompareResultList(resultList);
+            resultDto.setLastFirstDate(new_invPlan.getInventDate());
+            resultDto.setLastSecondDate(null);
+            return resultDto;
         }
+        //比较两次盘点(最近一次的减去前前次的),并将比较结果转到list
+        ArrayList<DepAssetLossDto> compareResultList = new ArrayList<>();
+        Set<Map.Entry<String, DepAssetLossDto>> assets = new_assetMap.entrySet();
+        for (Map.Entry<String, DepAssetLossDto> asset : assets) {
+
+            DepAssetLossDto new_ = asset.getValue();
+            if (!old_assetMap.containsKey(asset.getKey())) {
+                compareResultList.add(new_);
+                continue;
+            }
+            DepAssetLossDto old_ = old_assetMap.get(asset.getKey());
+            new_.setNowQuantity(new_.getNowQuantity()-old_.getNowQuantity());
+            new_.setInvQuantity(new_.getInvQuantity()-old_.getInvQuantity());
+            new_.setLossQuantity(new_.getLossQuantity()-old_.getLossQuantity());
+            new_.setLossVal(new_.getLossVal()-old_.getLossVal());
 
-        Map<String, DepAssetLossDto> assetMap = new HashMap<>();
-        //各资产损耗值map
-        HashMap<String, Double> lossValMap = new HashMap<>();
-        //统计两次盘点计划每一样资产(同资产名)的相关信息
-        handleAssetInfo(assetInfos,assetMap,lossValMap);
-        //将map中统计好的资产信息转到list
-        ArrayList<DepAssetLossDto> assetResultList = new ArrayList<>();
-        Set<Map.Entry<String, DepAssetLossDto>> entrySet = assetMap.entrySet();
-        for (Map.Entry<String, DepAssetLossDto> entry : entrySet) {
-            DepAssetLossDto dto = entry.getValue();
-            if (lossValMap.containsKey(dto.getAssetName()))dto.setLossVal(lossValMap.get(dto.getAssetName()));
-            assetResultList.add(dto);
+            compareResultList.add(new_);
         }
-        //计算损耗总值
-        Set<Map.Entry<String, Double>> lossValSet = lossValMap.entrySet();
-        double lossVal = 0.0;
-        for (Map.Entry<String, Double> entry : lossValSet) {
-            lossVal+=entry.getValue();
-        }
-
-//        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
         //封装结果
         DepAssetLossResultDto resultDto = new DepAssetLossResultDto();
-        resultDto.setTotalLossVal(lossVal);
-        resultDto.setAssetResultList(assetResultList);
-        resultDto.setDate(invPlan.getInventDate());
+//        resultDto.setTotalLossVal(lossVal);
+        resultDto.setCompareResultList(compareResultList);
+        resultDto.setLastFirstDate(new_invPlan.getInventDate());
+        resultDto.setLastSecondDate(old_invPlan.getInventDate());
 
         return resultDto;
     }
 
+    //统计
+    private boolean getInvResult(AssetInvOrderDto invPlan,
+                              Map<String, DepAssetLossDto> assetMap,
+                              Map<String, Integer> invQuantity_map){
+
+        if (ObjectUtil.isNull(invPlan)) return false;
+
+        List<DepAssetDetailDto> asset_list = tbAssetInventoryMapper.getDepAssetByOrderNumber(invPlan.getOrderNumber());
+        //盘点资产详细信息-元数据
+        List<TbAssetInformation> assetInfos = new ArrayList<>();
+
+        //json数据 --> java对象
+        for (DepAssetDetailDto asset : asset_list) {
+            TbAssetInformation info = JSONUtil.toBean(asset.getAssetData(), TbAssetInformation.class);
+            assetInfos.add(info);
+            //位置
+            String loc = info.getAncestorLocationName()+info.getParentLocationName()+info.getLocationName();
+
+            if (!invQuantity_map.containsKey(info.getName()+"-"+loc)) {
+                invQuantity_map.put(info.getName() + "-" + loc, asset.getInventoryQuantity());
+            } else {
+                invQuantity_map.put(
+                        info.getName() + "-" + loc,
+                        invQuantity_map.get(info.getName()+"-"+loc) + asset.getInventoryQuantity()
+                );
+            }
+        }
+
+        //统计盘点计划每一样资产(同资产名且同位置)的相关信息
+        handleAssetInfo(assetInfos,assetMap,invQuantity_map);
+        return true;
+    }
 
 }
+

+ 19 - 12
ruoyi-admin/src/main/resources/mapper/inventory/TbAssetInventoryMapper.xml

@@ -3,7 +3,7 @@
 PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="com.ruoyi.inventory.mapper.TbAssetInventoryMapper">
-    
+
     <resultMap type="TbAssetInventory" id="TbAssetInventoryResult">
         <result property="id"    column="id"    />
         <result property="orderNumber"    column="order_number"    />
@@ -46,7 +46,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 
     <select id="selectTbAssetInventoryList" parameterType="TbAssetInventory" resultType="TbAssetInventory">
         <include refid="selectTbAssetInventory"/>
-        <where>  
+        <where>
             <if test="orderNumber != null  and orderNumber != ''"> and a.order_number = #{orderNumber}</if>
             <if test="name != null  and name != ''"> and a.name like concat('%', #{name}, '%')</if>
             <if test="inventoryDepartment != null  and inventoryDepartment != ''"> and a.inventory_department = #{inventoryDepartment} OR a.inventory_department in (
@@ -86,7 +86,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <include refid="selectTbAssetInventory"/>
         where a.order_number = #{orderNumber}
     </select>
-        
+
     <insert id="insertTbAssetInventory" parameterType="TbAssetInventory" useGeneratedKeys="true" keyProperty="id">
         insert into tb_asset_inventory
         <trim prefix="(" suffix=")" suffixOverrides=",">
@@ -143,7 +143,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
     </delete>
 
     <delete id="deleteTbAssetInventoryByIds" parameterType="String">
-        delete from tb_asset_inventory where id in 
+        delete from tb_asset_inventory where id in
         <foreach item="id" collection="array" open="(" separator="," close=")">
             #{id}
         </foreach>
@@ -192,18 +192,25 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 
 
 
-    <select id="getDepAssetByOrderNumber" parameterType="String" resultType="String">
-        select inventory_metadata metadata
+    <select id="getDepAssetByOrderNumber" parameterType="String" resultType="com.ruoyi.inventory.domain.dto.DepAssetDetailDto">
+        select inventory_metadata assetData,inventory_quantity inventoryQuantity
         from tb_inventory_detail
-        where order_number = #{orderNumber}
+        where order_number = #{orderNumber} and inventory_status = 1
     </select>
 
     <select id="getOrderNumberByDepId" parameterType="String" resultType="com.ruoyi.inventory.domain.dto.AssetInvOrderDto">
-        select order_number orderNumber,inventory_date inventDate
-        from tb_asset_inventory
-        where inventory_status = 2 and inventory_department = #{depId}
-        and inventory_result != "0"
-        order by inventory_date desc
+        select inv.order_number orderNumber,inv.inventory_date inventDate,dep.dept_name deptName
+        from tb_asset_inventory inv
+        left join sys_dept dep on inv.inventory_department = dep.dept_id
+        where inv.inventory_department = #{depId} and inv.inventory_status = 2 and inv.inventory_result!=0
+        and inv.inventory_result != "0"
+        order by inv.inventory_date desc
     </select>
     <!-- limit #{whichOne},1 -->
+
+    <select id="getChildDeptId" parameterType="String" resultType="String">
+        select dept_id
+        from sys_dept
+        where dept_id = #{deptId} OR parent_id = #{deptId} OR ancestors like concat('%,', #{deptId}, ',%')
+    </select>
 </mapper>