zoukankan      html  css  js  c++  java
  • Agile PLM_统计物料消耗

    Agile PLM_统计物料消耗

    需求:统计PLM的物件下,所有子bom的物件消耗数量,方便核算成本

    要求:

    1. 搜索物件编号,查询出该物件下所有的子物件(所有下级)

    2. 只带出主料,不需要替代料

    3. 计算每一层级的用量(计算方式:每阶的数量乘积)

      // 举例
      A(一级母件) 1
      |---B(二级) 2
          ---C(三级) 2
      |---D(二级) 3
          ---C(三级) 1
          
      // 计算方式
      A(用量):1
      B(用量):1 * 2
      D(用量):1 * 3
      C(用量):1 * 2 * 2 + 1 * 3 * 1  
    4. 相同物件(物料)汇总(相同的物料用量相加)

     

    做出的效果

     

    思路:

    1. BOM表,递归查询一个物料的所有BOM

    2. 递归(设置消耗量)

    3. 相同物料汇总

     

    实现:

    1、BOM表( 查询一个物料的所有BOM的SQL )

    使用到的表:bom( BOM表 );ITEM( 物件表 );LISTENTRY( 列表表(数据字典));ITEM_QUERY( 物件查询视图 );LANGTABLE( 文本表 );

    SELECT
                b.*,
                ic.DESCRIPTION,
                l.value as sub_class_text,
                ls.value as life_cycle,
                ic.rev_number
            FROM
            (
                SELECT b.*,nvl(l3.ENTRYVALUE, '') rep FROM
                    (
                        SELECT
                            ITEM AS parent_id,
                            COMPONENT AS ID,
                            ITEM_NUMBER,
                            FIND_NUMBER,
                            to_number(QUANTITY) QUANTITY,
                            CHANGE_OUT,
                            FLAGS,
                            LIST03
                        FROM
                            bom START WITH ITEM = (SELECT ID FROM ITEM WHERE ITEM_NUMBER = '200002000001')
                            AND NVL (CHANGE_OUT, 0) = 0 AND SUBSTR (FLAGS, 5, 1) = 1
                            CONNECT BY PRIOR COMPONENT = ITEM
                            AND NVL (CHANGE_OUT, 0) = 0 AND SUBSTR (FLAGS, 5, 1) = 1
                    ) b
                LEFT JOIN LISTENTRY l3 on b.LIST03 = l3.ENTRYID and L3.LANGID = 4
            ) b
            LEFT JOIN item ip on b.parent_id = ip.id
            LEFT JOIN ITEM_QUERY ic on b.id = ic.id
            INNER JOIN LANGTABLE l on ic.SUBCLASS = l.id and type = 4450 and l.langid = 4
            INNER JOIN LANGTABLE ls on ic.RELEASE_TYPE = ls.id and ls.type = 4450 and ls.langid = 4
            WHERE b.REP NOT LIKE '替%'

    结果

     

    2、递归(设置消耗量)

        // 根据树形结构 设置物料消耗量
        private static List<Material> getTree(List<Material> materials, String itemNumber, String pid) {
            Map<String, List<Material>> collects = materials.stream().filter(a -> a.getPid() != pid)
                    .collect(Collectors.groupingBy(a -> a.getPid()));
            materials.forEach(d -> d.setChildren(collects.get(d.getId())));
            Material material = materials.stream().filter(p -> p.getItemNumber().equals(itemNumber)).findAny().orElse(null);
            if (material.getChildren() != null) {
                material.setResult(1); // 设置根母件消耗单位为1个
                setExpend(material, material.getChildren());
            }
            materials.remove(material);
            return materials;
        }
    
        // 递归(设置消耗量)
        private static void setExpend(Material father, List<Material> children) {
            List<Material> materialList = new ArrayList<>();
            for (Material material : children) {
                material.setResult(father.getResult() * material.getQty());
                if (material.getChildren() != null) {
                    setExpend(material, material.getChildren());
                }
                materialList.add(material);
            }
        }

    3、相同物料用量汇总

    // 相同物料汇总
    List<Material> collect = tree.stream().collect(Collectors.toMap(Material::getItemNumber, a -> a, (o1, o2) -> {
        o1.setResult(o1.getResult() + o2.getResult());
        return o1;
    })).values().stream().collect(Collectors.toList());

    最后把结果collect传到前端,进行数据渲染。

  • 相关阅读:
    matplotlib imshow
    django restframework Serializers
    python assert用法
    nginx 深入篇
    scrapy 中间件
    mysql 存储引擎
    scrapy 部署
    pyinstaller模块使用
    wechat 网页版通信全过程
    hadoop YARN
  • 原文地址:https://www.cnblogs.com/mmdz/p/15629454.html
Copyright © 2011-2022 走看看