Jelajahi Sumber

杰生 申购金额统计和申购金额分页

home 2 tahun lalu
induk
melakukan
5fa7cc94a7

+ 183 - 0
hx-api/storage-api/src/main/java/com/fjhx/entity/material/Material.java

@@ -0,0 +1,183 @@
+package com.fjhx.entity.material;
+
+import java.math.BigDecimal;
+import com.baomidou.mybatisplus.annotation.IdType;
+import java.util.Date;
+import com.baomidou.mybatisplus.annotation.Version;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.fjhx.base.BaseEntity;
+import com.baomidou.mybatisplus.annotation.TableField;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * <p>
+ * 物料
+ * </p>
+ *
+ * @author ${author}
+ * @since 2022-07-04
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class Material extends BaseEntity {
+
+
+    /**
+     * 软删除
+     */
+    @TableField("IsDelete")
+    private Boolean isdelete;
+
+    /**
+     * 创建时间
+     */
+    @TableField("CreatedTime")
+    private Date createdtime;
+
+    /**
+     * 修改时间
+     */
+    @TableField("UpdatedTime")
+    private Date updatedtime;
+
+    /**
+     * 物料名称
+     */
+    @TableField("Name")
+    private String name;
+
+    /**
+     * 编码
+     */
+    @TableField("Code")
+    private String code;
+
+    /**
+     * 克重
+     */
+    @TableField("UnitWeight")
+    private Float unitweight;
+
+    /**
+     * 单位编号
+     */
+    @TableField("MaterialUnitID")
+    private String materialunitid;
+
+    /**
+     * 库存单位id
+     */
+    @TableField("StockUnitID")
+    private String stockunitid;
+
+    /**
+     * 门幅
+     */
+    @TableField("Width")
+    private Float width;
+
+    /**
+     * 分类
+     */
+    @TableField("CategoryCode")
+    private String categorycode;
+
+    /**
+     * 安全库存
+     */
+    @TableField("SafetyStock")
+    private Integer safetystock;
+
+    /**
+     * 定时任务自动生成申购单时间
+     */
+    @TableField("AutoTaskTime")
+    private Date autotasktime;
+
+    /**
+     * 抽检⽐例
+     */
+    @TableField("CheckRate")
+    private BigDecimal checkrate;
+
+    /**
+     * 安全预警天数/采购周期
+     */
+    @TableField("SafetyWarnDay")
+    private Integer safetywarnday;
+
+    /**
+     * 规格
+     */
+    @TableField("Spec")
+    private String spec;
+
+    /**
+     * 放置区域
+     */
+    @TableField("PlaceAreaIds")
+    private String placeareaids;
+
+    /**
+     * 滞留周期(天)
+     */
+    @TableField("DelayPeriod")
+    private Integer delayperiod;
+
+    /**
+     * 维护人员
+     */
+    @TableField("CreateUser")
+    private String createuser;
+
+    /**
+     * 组织架构
+     */
+    @TableField("OR_ID")
+    private String orId;
+
+    /**
+     * 物料其他编码(模糊搜索使用)
+     */
+    @TableField("OtherCode")
+    private String othercode;
+
+    /**
+     * 备注
+     */
+    @TableField("Remark")
+    private String remark;
+
+    /**
+     * 标准价格
+     */
+    @TableField("Price")
+    private BigDecimal price;
+
+    /**
+     * 标准库存
+     */
+    @TableField("StockStandard")
+    private BigDecimal stockstandard;
+
+    /**
+     * 单位数量
+     */
+    @TableField("UnitNum")
+    private BigDecimal unitnum;
+
+    /**
+     * 用途
+     */
+    @TableField("Purpose")
+    private String purpose;
+
+    /**
+     * 工艺类型 (枚举定义:0=直喷,1=热转,2=打纸,3=墨水,4=其他)
+     */
+    @TableField("TechnologyType")
+    private Integer technologytype;
+
+
+}

+ 17 - 0
hx-api/storage-api/src/main/java/com/fjhx/params/material/MaterialEx.java

@@ -0,0 +1,17 @@
+package com.fjhx.params.material;
+
+import com.fjhx.entity.material.Material;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * 物料
+ *
+ * @author ${author}
+ * @since 2022-07-04
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class MaterialEx extends Material {
+
+}

+ 17 - 0
hx-api/storage-api/src/main/java/com/fjhx/params/material/MaterialVo.java

@@ -0,0 +1,17 @@
+package com.fjhx.params.material;
+
+import com.fjhx.entity.material.Material;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * 物料
+ *
+ * @author ${author}
+ * @since 2022-07-04
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class MaterialVo extends Material {
+
+}

+ 22 - 8
hx-common/hx-tool/src/main/java/com/fjhx/utils/WrapperUtil.java

@@ -67,12 +67,12 @@ public class WrapperUtil {
      * @param field 查询字段名
      */
     public WrapperUtil periodOfTime(String field) {
-        Object beginTimeObj = condition.get("beginTime");
-        Object endTimeObj = condition.get("endTime");
+        String beginTimeObj = condition.get("beginTime");
+        String endTimeObj = condition.get("endTime");
         if (ObjectUtil.isAllNotEmpty(beginTimeObj, endTimeObj)) {
             try {
-                DateTime beginTime = DateUtil.beginOfDay(DateUtil.parse(beginTimeObj.toString()));
-                DateTime endTime = DateUtil.endOfDay(DateUtil.parse(endTimeObj.toString()));
+                DateTime beginTime = DateUtil.beginOfDay(DateUtil.parse(beginTimeObj));
+                DateTime endTime = DateUtil.endOfDay(DateUtil.parse(endTimeObj));
                 wrapper.between(field, beginTime, endTime);
             } catch (Exception e) {
                 throw new ServiceException("传入日期格式解析错误");
@@ -149,7 +149,7 @@ public class WrapperUtil {
      * @param fields 查询字段名
      */
     public WrapperUtil keyword(String... fields) {
-        Object keyword = condition.get("keyword");
+        String keyword = condition.get("keyword");
         if (ObjectUtil.isNotEmpty(keyword)) {
             wrapper.and(q -> {
                 for (String field : fields) {
@@ -167,7 +167,7 @@ public class WrapperUtil {
      * @param mapKey 搜索条件key
      */
     public WrapperUtil eq(String field, String mapKey) {
-        Object value = condition.get(mapKey);
+        String value = condition.get(mapKey);
         if (ObjectUtil.isNotEmpty(value)) {
             wrapper.eq(field, value);
         }
@@ -175,6 +175,20 @@ public class WrapperUtil {
     }
 
     /**
+     * in查询
+     *
+     * @param field  查询字段名
+     * @param mapKey 搜索条件key
+     */
+    public WrapperUtil in(String field, String mapKey) {
+        String value = condition.get(mapKey);
+        if (ObjectUtil.isNotEmpty(value)) {
+            wrapper.in(field, value);
+        }
+        return this;
+    }
+
+    /**
      * 相等(查询条件必填)
      *
      * @param field                  查询字段名
@@ -182,7 +196,7 @@ public class WrapperUtil {
      * @param exceptionSpecification 若搜索条件为空抛出的异常提示
      */
     public WrapperUtil eq(String field, String mapKey, String exceptionSpecification) {
-        Object value = condition.get(mapKey);
+        String value = condition.get(mapKey);
         if (ObjectUtil.isNotEmpty(value)) {
             wrapper.eq(field, value);
         } else {
@@ -198,7 +212,7 @@ public class WrapperUtil {
      * @param mapKey 搜索条件key
      */
     public WrapperUtil like(String field, String mapKey) {
-        Object value = condition.get(mapKey);
+        String value = condition.get(mapKey);
         if (ObjectUtil.isNotEmpty(value)) {
             wrapper.like(field, value);
         }

+ 33 - 0
hx-serve/storage/src/main/java/com/fjhx/material/controller/MaterialController.java

@@ -0,0 +1,33 @@
+package com.fjhx.material.controller;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import org.springblade.core.tool.api.R;
+import com.fjhx.entity.material.Material;
+import com.fjhx.params.material.MaterialVo;
+import com.fjhx.material.service.MaterialService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.Map;
+
+/**
+ * <p>
+ * 物料 前端控制器
+ * </p>
+ *
+ * @author ${author}
+ * @since 2022-07-04
+ */
+@RestController
+@RequestMapping("/material")
+public class MaterialController {
+
+    @Autowired
+    private MaterialService materialService;
+
+
+}
+

+ 16 - 0
hx-serve/storage/src/main/java/com/fjhx/material/mapper/MaterialMapper.java

@@ -0,0 +1,16 @@
+package com.fjhx.material.mapper;
+
+import com.fjhx.entity.material.Material;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * <p>
+ * 物料 Mapper 接口
+ * </p>
+ *
+ * @author ${author}
+ * @since 2022-07-04
+ */
+public interface MaterialMapper extends BaseMapper<Material> {
+
+}

+ 5 - 0
hx-serve/storage/src/main/java/com/fjhx/material/mapper/MaterialMapper.xml

@@ -0,0 +1,5 @@
+<?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.fjhx.material.mapper.MaterialMapper">
+
+</mapper>

+ 21 - 0
hx-serve/storage/src/main/java/com/fjhx/material/service/MaterialService.java

@@ -0,0 +1,21 @@
+package com.fjhx.material.service;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.fjhx.entity.material.Material;
+import com.fjhx.params.material.MaterialVo;
+import com.fjhx.base.BaseService;
+
+import java.util.Map;
+
+/**
+ * <p>
+ * 物料 服务类
+ * </p>
+ *
+ * @author ${author}
+ * @since 2022-07-04
+ */
+public interface MaterialService extends BaseService<Material> {
+
+
+}

+ 28 - 0
hx-serve/storage/src/main/java/com/fjhx/material/service/impl/MaterialServiceImpl.java

@@ -0,0 +1,28 @@
+package com.fjhx.material.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.fjhx.utils.WrapperUtil;
+import com.fjhx.entity.material.Material;
+import com.fjhx.params.material.MaterialVo;
+import com.fjhx.material.mapper.MaterialMapper;
+import com.fjhx.material.service.MaterialService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+import java.util.Map;
+
+/**
+ * <p>
+ * 物料 服务实现类
+ * </p>
+ *
+ * @author ${author}
+ * @since 2022-07-04
+ */
+@Service
+public class MaterialServiceImpl extends ServiceImpl<MaterialMapper, Material> implements MaterialService {
+
+
+}

+ 22 - 0
hx-serve/storage/src/main/java/com/fjhx/stock/controller/StockWaterController.java

@@ -1,5 +1,6 @@
 package com.fjhx.stock.controller;
 
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.fjhx.stock.service.StockWaterService;
 import org.springblade.core.tool.api.R;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -26,12 +27,33 @@ public class StockWaterController {
     private StockWaterService stockWaterService;
 
 
+    /**
+     * 库存报表-》领料序时浦-》统计
+     */
     @PostMapping("getPickingStatistics")
     public R getPickingStatistics(@RequestBody Map<String, String> condition) {
         Map<String, Object> result = stockWaterService.getPickingStatistics(condition);
         return R.success(result);
     }
 
+    /**
+     * 申购管理-》合同付款-》申购金额统计
+     */
+    @PostMapping("subscriptionAmountStatistics")
+    public R contractPaymentStatistics(@RequestBody Map<String, String> condition) {
+        Map<String, Object> result = stockWaterService.contractPaymentStatistics(condition);
+        return R.success(result);
+    }
+
+    /**
+     * 申购管理-》合同付款-》申购金额列表
+     */
+    @PostMapping("subscriptionAmountPage")
+    public R subscriptionAmountPage(@RequestBody Map<String, String> condition) {
+        Page<Map<String, Object>> result = stockWaterService.subscriptionAmountPage(condition);
+        return R.success(result);
+    }
+
 
 }
 

+ 13 - 1
hx-serve/storage/src/main/java/com/fjhx/stock/mapper/StockWaterMapper.java

@@ -1,7 +1,13 @@
 package com.fjhx.stock.mapper;
 
-import com.fjhx.entity.stock.StockWater;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.fjhx.entity.stock.StockWater;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
 
 /**
  * <p>
@@ -13,4 +19,10 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
  */
 public interface StockWaterMapper extends BaseMapper<StockWater> {
 
+    List<Map<String, Object>> getPickingStatistics(@Param("ew") QueryWrapper<?> wrapper);
+
+    List<Map<String, Object>> contractPaymentStatistics(@Param("ew") QueryWrapper<?> wrapper);
+
+    Page<Map<String, Object>> subscriptionAmountPage(@Param("page") Page<StockWater> page, @Param("ew") QueryWrapper<?> wrapper);
+
 }

+ 40 - 0
hx-serve/storage/src/main/java/com/fjhx/stock/mapper/StockWaterMapper.xml

@@ -2,4 +2,44 @@
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="com.fjhx.stock.mapper.StockWaterMapper">
 
+    <select id="getPickingStatistics" resultType="java.util.Map">
+        select uu.id                                                    userId,
+               uu.RealName                                              userName,
+               if(sw.StockChangeType = 15, -sw.ChangeNum, sw.ChangeNum) changeNum,
+               ifnull(m.TechnologyType, 4)                              materialType,
+               m.Width                                                  materialWidth,
+               ifnull(sw.Price, 0.00)                                   materialPrice
+        from stock_waterdetial sw
+                 inner join material m on sw.MaterialCode = m.code
+                 inner join u_user uu on uu.ID = sw.OperUserId
+            ${ew.customSqlSegment}
+    </select>
+
+    <select id="contractPaymentStatistics" resultType="java.util.Map">
+        select ifnull(m.TechnologyType, 4)                                  materialType,
+               if(pc.PurContractState = 3, pc.AdjustAmount, pc.TotalAmount) money,
+               s.AccountDate                                                accountDate,
+               pc.SupplierId                                                supplierId,
+               s.Name                                                       supplierName
+        from purchase_contract pc
+                 left join material m on pc.MaterialCode = m.code
+                 left join supplier s on pc.SupplierId = s.ID
+            ${ew.customSqlSegment}
+    </select>
+
+    <select id="subscriptionAmountPage" resultType="java.util.LinkedHashMap">
+        select s.Name            supplierName,
+               pc.PurchaseBillNo purchaseBillNo,
+               m.name            materialName,
+               pc.PurchaseQty    purchaseQty,
+               pc.Price          price,
+               pc.TotalAmount    totalAmount,
+               pc.AdjustAmount   adjustAmount,
+               pc.ApprovalTime   approvalTime
+        from purchase_contract pc
+                 left join material m on pc.MaterialCode = m.code
+                 left join supplier s on pc.SupplierId = s.ID
+            ${ew.customSqlSegment}
+    </select>
+
 </mapper>

+ 4 - 1
hx-serve/storage/src/main/java/com/fjhx/stock/service/StockWaterService.java

@@ -2,7 +2,6 @@ package com.fjhx.stock.service;
 
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.fjhx.entity.stock.StockWater;
-import com.fjhx.params.stock.StockWaterVo;
 import com.fjhx.base.BaseService;
 
 import java.util.Map;
@@ -19,4 +18,8 @@ public interface StockWaterService extends BaseService<StockWater> {
 
     Map<String, Object> getPickingStatistics(Map<String, String> condition);
 
+    Map<String, Object> contractPaymentStatistics(Map<String, String> condition);
+
+    Page<Map<String, Object>> subscriptionAmountPage(Map<String, String> condition);
+
 }

+ 302 - 3
hx-serve/storage/src/main/java/com/fjhx/stock/service/impl/StockWaterServiceImpl.java

@@ -1,12 +1,19 @@
 package com.fjhx.stock.service.impl;
 
+import cn.hutool.core.date.DateUtil;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.fjhx.entity.stock.StockWater;
 import com.fjhx.stock.mapper.StockWaterMapper;
 import com.fjhx.stock.service.StockWaterService;
+import com.fjhx.utils.WrapperUtil;
 import org.springframework.stereotype.Service;
 
-import java.util.Map;
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.util.*;
+import java.util.stream.Collectors;
 
 /**
  * <p>
@@ -21,8 +28,300 @@ public class StockWaterServiceImpl extends ServiceImpl<StockWaterMapper, StockWa
 
     @Override
     public Map<String, Object> getPickingStatistics(Map<String, String> condition) {
-        
-        return null;
+
+        QueryWrapper<?> wrapper = WrapperUtil.init(condition)
+                .periodOfTime("sw.CreatedTime") // 时间段查询
+                .getWrapper();
+
+        wrapper.eq("sw.IsDelete", 0); // 未删除
+        wrapper.in("sw.StockChangeType", 15, 20, 23);
+
+        // 获取统计数据
+        List<Map<String, Object>> pickingStatistics = baseMapper.getPickingStatistics(wrapper);
+
+        HashMap<String, Object> result = new HashMap<>();
+
+        // 按物料属性分组
+        Map<String, List<Map<String, Object>>> groupByStatistics = pickingStatistics.stream().collect(
+                Collectors.groupingBy(item -> item.get("materialType").toString()));
+
+        // 统计面料
+        HashMap<String, Object> fabricStatistics = new HashMap<>();
+        fabricStatistics.put("total", 0);
+        fabricStatistics.put("length", BigDecimal.ZERO);
+        fabricStatistics.put("measureArea", BigDecimal.ZERO);
+        fabricStatistics.put("money", BigDecimal.ZERO);
+
+        // 面料属性属性
+        List<Map<String, Object>> fabricTree = new ArrayList<>();
+
+        // 构建前端所需参数
+        for (Map.Entry<String, List<Map<String, Object>>> entry : groupByStatistics.entrySet()) {
+            String key = entry.getKey();
+            List<Map<String, Object>> value = entry.getValue();
+
+            // 墨水统计
+            if (key.equals("3")) {
+                // 墨水统计
+                HashMap<Object, Object> inkStatistics = new HashMap<>();
+                // 件数
+                inkStatistics.put("total", value.size());
+                // 公斤
+                inkStatistics.put("weight", value.stream().map(item -> (BigDecimal) item.get("changeNum"))
+                        .reduce(BigDecimal.ZERO, BigDecimal::add));
+                // 金额
+                inkStatistics.put("money", value.stream()
+                        .map(item -> ((BigDecimal) item.get("changeNum")).multiply((BigDecimal) item.get("materialPrice")))
+                        .reduce(BigDecimal.ZERO, BigDecimal::add).setScale(2, RoundingMode.HALF_UP));
+                result.put("inkStatistics", inkStatistics);
+
+                // 墨水领料明细
+                List<HashMap<String, Object>> inkDetails = new ArrayList<>(value.stream().collect(Collectors.toMap(
+                        item -> item.get("userId").toString(), // 根据用户id分组
+                        item -> { // 统计单条数据
+                            HashMap<String, Object> map = new HashMap<>();
+                            map.put("userId", item.get("userId"));
+                            map.put("userName", item.get("userName"));
+                            map.put("total", 1);
+                            map.put("weight", item.get("changeNum"));
+                            map.put("money", ((BigDecimal) item.get("changeNum"))
+                                    .multiply((BigDecimal) item.get("materialPrice")).setScale(2, RoundingMode.HALF_UP));
+                            return map;
+                        },
+                        (v1, v2) -> { // 当有多条用户记录时,统计数据
+                            v1.put("total", ((Integer) v1.get("total")) + 1);
+                            v1.put("weight", ((BigDecimal) v1.get("weight")).add((BigDecimal) v2.get("weight")));
+                            v1.put("money", ((BigDecimal) v1.get("money")).add((BigDecimal) v2.get("money")));
+                            return v1;
+                        })).values());
+
+                result.put("inkDetails", inkDetails);
+
+            }
+            // 面料统计
+            else {
+                // 卷数
+                int size = value.size();
+                // 米数
+                BigDecimal length = value.stream().map(item -> (BigDecimal) item.get("changeNum")).reduce(BigDecimal.ZERO, BigDecimal::add);
+                // 面积
+                BigDecimal measureArea = value.stream().map(item -> ((BigDecimal) item.get("changeNum"))
+                                .multiply(BigDecimal.valueOf((float) item.get("materialWidth")))
+                                .divide(new BigDecimal("100"), 2, RoundingMode.HALF_UP))
+                        .reduce(BigDecimal.ZERO, BigDecimal::add).setScale(2, RoundingMode.HALF_UP);
+                // 金额
+                BigDecimal money = value.stream().map(item -> ((BigDecimal) item.get("changeNum"))
+                                .multiply(BigDecimal.valueOf((float) item.get("materialWidth")))
+                                .multiply((BigDecimal) item.get("materialPrice"))
+                                .divide(new BigDecimal("100"), 2, RoundingMode.HALF_UP))
+                        .reduce(BigDecimal.ZERO, BigDecimal::add).setScale(2, RoundingMode.HALF_UP);
+
+                // 添加到面料统计
+                fabricStatistics.put("total", (Integer) fabricStatistics.get("total") + size);
+                fabricStatistics.put("length", ((BigDecimal) fabricStatistics.get("length")).add(length));
+                fabricStatistics.put("measureArea", ((BigDecimal) fabricStatistics.get("measureArea")).add(measureArea));
+                fabricStatistics.put("money", ((BigDecimal) fabricStatistics.get("money")).add(money));
+
+                // 构建树形
+                Map<String, Object> attribute = new HashMap<>();
+                attribute.put("materialType", key);
+                attribute.put("total", size);
+                attribute.put("length", length);
+                attribute.put("measureArea", measureArea);
+                attribute.put("money", money);
+                attribute.put("name",
+                        key.equals("0") ? "直喷" : key.equals("1") ? "热转" : key.equals("2") ? "打纸" : "其他");
+
+
+                // 查询子集
+                List<HashMap<String, Object>> children = new ArrayList<>(value.stream().collect(Collectors.toMap(
+                        item -> item.get("userId").toString(), // 根据用户id分组
+                        item -> { // 统计单条数据
+                            HashMap<String, Object> map = new HashMap<>();
+                            map.put("userId", item.get("userId"));
+                            map.put("name", item.get("userName"));
+                            map.put("total", 1); // 数量
+                            map.put("length", item.get("changeNum")); // 米数
+
+                            // 计算面积
+                            BigDecimal measureAreaItem = ((BigDecimal) item.get("changeNum"))
+                                    .multiply(BigDecimal.valueOf((float) item.get("materialWidth")))
+                                    .divide(new BigDecimal("100"), 2, RoundingMode.HALF_UP);
+
+                            map.put("measureArea", measureAreaItem); // 面积
+                            map.put("money", measureAreaItem.multiply((BigDecimal) item.get("materialPrice"))
+                                    .setScale(2, RoundingMode.HALF_UP)); // 金额
+                            return map;
+                        },
+                        (v1, v2) -> { // 当有多条用户记录时,统计数据
+                            v1.put("total", ((Integer) v1.get("total")) + 1);
+                            v1.put("length", ((BigDecimal) v1.get("length")).add((BigDecimal) v2.get("length")));
+                            v1.put("measureArea", ((BigDecimal) v1.get("measureArea")).add((BigDecimal) v2.get("measureArea")));
+                            v1.put("money", ((BigDecimal) v1.get("money")).add((BigDecimal) v2.get("money")));
+                            return v1;
+                        })).values());
+
+                attribute.put("children", children);
+
+                fabricTree.add(attribute);
+            }
+        }
+
+        // 面料统计
+        result.put("fabricStatistics", fabricStatistics);
+
+        // 面料树形
+        result.put("fabricTree", fabricTree);
+
+        return result;
+    }
+
+    @Override
+    public Map<String, Object> contractPaymentStatistics(Map<String, String> condition) {
+        QueryWrapper<?> wrapper = WrapperUtil.init(condition).periodOfTime("pc.ApprovalTime").getWrapper();
+        wrapper.eq("pc.IsDelete", 0);
+        wrapper.in("s.AccountDate ", 45, 30, 15, 0);
+
+        List<Map<String, Object>> list = baseMapper.contractPaymentStatistics(wrapper);
+
+
+        Map<String, Object> result = new HashMap<>();
+
+        /*
+            0 =》申购金额
+            1 =》面料采购
+            2 =》墨水采购
+            3 =》其他
+         */
+        Map<String, BigDecimal> collect = list.stream().collect(Collectors.toMap(
+                item -> {
+                    String materialType = item.get("materialType").toString();
+                    switch (materialType) {
+                        case "3":
+                            return "2";
+                        case "4":
+                            return "3";
+                        default:
+                            return "1";
+                    }
+                },
+                item -> ((BigDecimal) item.get("money")).setScale(2, RoundingMode.HALF_UP),
+                BigDecimal::add
+        ));
+        collect.putIfAbsent("1", BigDecimal.ZERO);
+        collect.putIfAbsent("2", BigDecimal.ZERO);
+        collect.putIfAbsent("3", BigDecimal.ZERO);
+        collect.put("0", collect.get("1").add(collect.get("2")).add(collect.get("3")));
+
+         /*
+            4 =》45天账期
+            5 =》30天账期
+            6 =》15天账期
+            7 =》预付款
+         */
+        Map<String, BigDecimal> collect2 = list.stream().collect(Collectors.toMap(
+                item -> {
+                    Integer accountDate = (Integer) item.get("accountDate");
+                    switch (accountDate) {
+                        case 45:
+                            return "4";
+                        case 30:
+                            return "5";
+                        case 15:
+                            return "6";
+                        default:
+                            return "7";
+                    }
+                },
+                item -> ((BigDecimal) item.get("money")).setScale(2, RoundingMode.HALF_UP),
+                BigDecimal::add
+        ));
+        collect.putIfAbsent("4", BigDecimal.ZERO);
+        collect.putIfAbsent("5", BigDecimal.ZERO);
+        collect.putIfAbsent("6", BigDecimal.ZERO);
+        collect.putIfAbsent("7", BigDecimal.ZERO);
+
+        collect.putAll(collect2);
+
+        // 赋值全部金额查询信息
+        result.put("money", collect);
+
+
+        // 根据供应商id,统计出向每家公司付款的金额
+        Collection<Map<String, Object>> values = list.stream().collect(Collectors.toMap(
+                item -> item.get("supplierId").toString(),
+                item -> {
+                    Map<String, Object> map = new HashMap<>();
+                    map.put("supplierId", item.get("supplierId"));
+                    map.put("supplierName", item.get("supplierName"));
+                    map.put("money", ((BigDecimal) item.get("money")).setScale(2, RoundingMode.HALF_UP));
+                    return map;
+                },
+                (v1, v2) -> {
+                    v1.put("money", ((BigDecimal) v1.get("money")).add((BigDecimal) v2.get("money")));
+                    return v1;
+                }
+        )).values();
+
+        /*
+         0 全部公司统计
+         1 50万以上
+         2 20~50万
+         3 10~20万
+         4 5~20万
+         5 5万以下
+         */
+        Map<String, List<Map<String, Object>>> map = values.stream().collect(Collectors.groupingBy(item -> {
+            BigDecimal money = (BigDecimal) item.get("money");
+            if (money.compareTo(new BigDecimal("50000")) < 0) {
+                return "5";
+            }
+            if (money.compareTo(new BigDecimal("100000")) > 0) {
+                return "4";
+            }
+            if (money.compareTo(new BigDecimal("200000")) > 0) {
+                return "3";
+            }
+            if (money.compareTo(new BigDecimal("500000")) > 0) {
+                return "4";
+            }
+            return "5";
+        }));
+
+        map.put("0", new ArrayList<>(values));
+        map.putIfAbsent("1", new ArrayList<>());
+        map.putIfAbsent("2", new ArrayList<>());
+        map.putIfAbsent("3", new ArrayList<>());
+        map.putIfAbsent("4", new ArrayList<>());
+        map.putIfAbsent("5", new ArrayList<>());
+
+        result.put("statisticsSupplier", map);
+
+        return result;
+    }
+
+    @Override
+    public Page<Map<String, Object>> subscriptionAmountPage(Map<String, String> condition) {
+
+        QueryWrapper<?> wrapper = WrapperUtil
+                .init(condition)
+                .periodOfTime("pc.ApprovalTime")
+                .in("pc.SupplierId", "supplierIdList")
+                .getWrapper();
+
+        wrapper.eq("pc.IsDelete", 0);
+
+        Page<Map<String, Object>> result = baseMapper.subscriptionAmountPage(createPage(condition), wrapper);
+        List<Map<String, Object>> records = result.getRecords();
+
+        records.forEach(item -> {
+            item.put("purchaseQty", ((BigDecimal) item.get("purchaseQty")).setScale(2, RoundingMode.HALF_UP));
+            item.put("totalAmount", ((BigDecimal) item.get("totalAmount")).setScale(2, RoundingMode.HALF_UP));
+            item.put("adjustAmount", item.get("adjustAmount") == null ? "-" : ((BigDecimal) item.get("adjustAmount")).setScale(2, RoundingMode.HALF_UP));
+            item.put("approvalTime", DateUtil.format((Date) item.get("approvalTime"), "yyyy-MM-dd"));
+        });
+
+        return result;
     }
 
 }