354798ggg
2023-07-24 c383af8d9624b7d1f8e2111680ea1642593ad805
product-server-project-management/src/main/java/com/product/project/management/service/ProjectInfoService.java
@@ -80,145 +80,7 @@
        return baseDao.listTable(Cmnconst.PRODUCT_PROJECT_QXLW, null, null, new Object[]{CoreConst.UUID, Cmnconst.PROJECT_NAME});
    }
    /**
     * 项目数据分析
     *
     * @param project_uuid
     * @return
     */
    public JSONObject statistAnalysis(String project_uuid) {
        JSONObject returnJson = new JSONObject();
        //数据库出库信息汇总
        StringBuilder outboundInfo = new StringBuilder(512);
        outboundInfo.append(" WITH outbound AS( ")
        .append(" SELECT project_uuid,itemize,material_type,material_code,SUM(outbound_weight)outbound_weight FROM ( ")
        .append(" SELECT ")
        .append(" A.project_uuid, ")
        .append(" B.material_type,B.material_code,B.outbound_weight, ")
        .append(" (SELECT itemize FROM product_project_item WHERE project_uuid = A.project_uuid AND itemize_code = substring(C.itemize_code,1,7)) itemize ")
        .append(" FROM product_project_outbound A ")
        .append(" LEFT JOIN product_project_outbound_sub B ON A.uuid=B.outbound_uuid ")
        .append(" LEFT JOIN product_project_item C ON C.uuid = A.project_itemize ")
        .append(" WHERE A.flow_flag=2 AND A.project_uuid=? ")
        .append(" )A GROUP BY project_uuid,itemize,material_type,material_code ")
        .append(" )");
        //出库信息操作(架立筋和声测管不展示型号汇总求和行转列,普通钢筋和网片展示型号,根据项目分项关联汇总)
        StringBuilder operateInfo = new StringBuilder(1024);
        operateInfo.append(" ,getItemizeSum AS( ")
        .append(" SELECT itemize,SUM(outbound_weight)total_outbound_weight FROM outbound WHERE material_type IN (0,1) GROUP BY itemize ")
        .append(" ),allitemize AS( ")
        .append(" SELECT itemize FROM outbound GROUP BY itemize ")
        .append(" ),intermediateData1 AS( ")
        .append(" SELECT A.itemize,SUM(IF(`material_type`='1',outbound_weight,0)) as 'JLJ',SUM(IF(`material_type`='2',outbound_weight,0)) as 'SCG' ")
        .append(" FROM ( SELECT itemize FROM outbound GROUP BY itemize )A ")
        .append(" LEFT JOIN ( ")
        .append(" SELECT project_uuid,itemize,material_type,CASE WHEN material_type=1 THEN '架立筋' ELSE '声测管' END AS material_code,SUM(outbound_weight)outbound_weight ")
        .append(" FROM outbound ")
        .append(" WHERE material_type IN (1,2) ")
        .append(" GROUP BY project_uuid,itemize,material_type ")
        .append(" ) B ON A.itemize = B.itemize ")
        .append(" GROUP BY A.itemize ")
        .append(" ),intermediateData2 AS( ")
        .append(" SELECT project_uuid,itemize,material_type,material_code,outbound_weight FROM outbound WHERE material_type IN (0,3) ")
        .append(" ),intermediateData3 AS( ")
        .append(" SELECT A.itemize,A.total_outbound_weight,A.jlj,A.scg,B.material_type,material_code,outbound_weight FROM( ")
        .append(" SELECT A.itemize,C.total_outbound_weight,B.jlj,B.scg ")
        .append(" FROM allitemize A ")
        .append(" LEFT JOIN intermediateData1 B ON A.itemize = B.itemize ")
        .append(" LEFT JOIN getItemizeSum C ON A.itemize = C.itemize ")
        .append(" )A ")
        .append(" LEFT JOIN intermediateData2 B ON A.itemize = B.itemize ")
        .append(" ) ")
        .append(" select * from intermediateData3 ");
        StringBuilder totalSum = new StringBuilder("");
        totalSum.append(" SELECT material_code,SUM(outbound_weight)outbound_weight FROM outbound WHERE material_type IN (0,3) GROUP BY material_code ")
        .append(" UNION ALL ")
        .append(" SELECT CASE WHEN material_type=1 THEN 'JLJ' WHEN material_type=2 THEN 'SCG' END,SUM(outbound_weight) FROM outbound WHERE material_type IN (1,2) GROUP BY material_type ")
        .append(" UNION ALL ")
        .append(" SELECT '合计',SUM(outbound_weight) FROM outbound WHERE material_type IN (0,1,3) GROUP BY project_uuid ");
        //获取SQL解析的基本数据,利用JAVA将项目分项对应的不同材料行转列
        DataTableEntity dtItemizeInfo = baseDao.listTable(outboundInfo.toString() + operateInfo.toString(), new Object[]{project_uuid});
        if (!BaseUtil.dataTableIsEmpty(dtItemizeInfo)) {
            Map<String, FieldSetEntity> convertData = new HashMap<>();
            String[] materialTypes = new String[4];
            //通过Java循环将"材料"和"出库量"数据行转列
            for (int i = 0; i < dtItemizeInfo.getRows(); i++) {
                FieldSetEntity fseItemize = dtItemizeInfo.getFieldSetEntity(i);
                //获取材料编码,材料类型,出库量
                String materialCode = fseItemize.getString(Cmnconst.MATERIAL_CODE);
                String outboundWeight = fseItemize.getString(Cmnconst.OUTBOUND_WEIGHT);
                Integer materialType = fseItemize.getInteger(Cmnconst.MATERIAL_TYPE);
                //收集获取所有表头列(材料编码),架立筋和声测管没有表头
                if (!BaseUtil.strIsNull(materialCode)) {
                    if (BaseUtil.strIsNull(materialTypes[materialType])) {
                        materialTypes[materialType] = materialCode;
                    } else {
                       if(materialTypes[fseItemize.getInteger(Cmnconst.MATERIAL_TYPE)].indexOf(materialCode)<0) {
                          materialTypes[fseItemize.getInteger(Cmnconst.MATERIAL_TYPE)] += "," + materialCode;
                       }
                    }
            }
                //收集行转列数据
                String itemize = fseItemize.getString(Cmnconst.ITEMIZE);
                if (convertData.containsKey(itemize)) {
                    convertData.get(itemize).setValue(materialCode, outboundWeight);
                } else {
                    FieldSetEntity fseConvertData = new FieldSetEntity(Cmnconst.PRODUCT_PROJECT_QXLW);
                    fseConvertData.setValue(Cmnconst.ITEMIZE, itemize);
                    fseConvertData.setValue(Cmnconst.TOTAL_OUTBOUND_WEIGHT, fseItemize.getString(Cmnconst.TOTAL_OUTBOUND_WEIGHT));
                    fseConvertData.setValue(materialCode, outboundWeight);
                    fseConvertData.setValue("jlj", fseItemize.getString("jlj"));
                    fseConvertData.setValue("scg", fseItemize.getString("scg"));
                    convertData.put(itemize, fseConvertData);
                }
            }
            //计算汇总
            DataTableEntity dtTotalInfo = baseDao.listTable(outboundInfo.toString() + totalSum.toString(), new Object[]{project_uuid});
            FieldSetEntity fseConvertData = new FieldSetEntity(Cmnconst.PRODUCT_PROJECT_QXLW);
            if (!BaseUtil.dataTableIsEmpty(dtTotalInfo)) {
            for (int i = 0; i < dtTotalInfo.getRows(); i++) {
               FieldSetEntity fseTotalInfo = dtTotalInfo.getFieldSetEntity(i);
               String materialCode = fseTotalInfo.getString(Cmnconst.MATERIAL_CODE);
               String outboundWeight = fseTotalInfo.getString(Cmnconst.OUTBOUND_WEIGHT);
               if (!BaseUtil.strIsNull(materialCode) && !BaseUtil.strIsNull(outboundWeight)) {
                  if ("合计".equals(materialCode)) {
                     fseConvertData.setValue(Cmnconst.ITEMIZE, "合计");
                     fseConvertData.setValue(Cmnconst.TOTAL_OUTBOUND_WEIGHT, outboundWeight);
                  }else {
                     fseConvertData.setValue(materialCode, outboundWeight);
                  }
               }
            }
         }
            //将数据转为DataTableEntity返回
            if (!convertData.isEmpty()) {
                DataTableEntity finalConvertData = new DataTableEntity();
                convertData.forEach((k, v) -> {
                    finalConvertData.addFieldSetEntity(v);
                });
                finalConvertData.addFieldSetEntity(fseConvertData);
                returnJson.set("data", BaseUtil.dataTableEntityToJson(finalConvertData));
            }
            //将表头数据返回
            for (int i = 0; i < materialTypes.length; i++) {
                if (!BaseUtil.strIsNull(materialTypes[i])) {
                    returnJson.set("type" + i, materialTypes[i]);
                }
            }
        }
        return returnJson;
    }
    /**
     * 删除子项验证(已经生成预算的子项不能删除)
@@ -242,6 +104,7 @@
     * @return
     */
    public DataTableEntity listItemizeBudget(String projectUUID, String itemizeCode, Integer capge, Integer pageSize) {
        String filter;
        List<String> params = new ArrayList<>();
@@ -270,6 +133,7 @@
    public DataTableEntity listMaterialV(String uuid, Integer capge, Integer pageSize) {
        return baseDao.listTable("product_project_base_material_v","project_itemize_uuid=?",new String[]{uuid},null,null,pageSize, capge);
    }
    /**
     * 更具仓库和材料获取库存
     * @return
@@ -277,6 +141,7 @@
    public FieldSetEntity findInventoryV(String warehouse_uuid, String material_uuid) {
        return baseDao.getFieldSetByFilter("product_project_inventory_v","warehouse_uuid=? and uuid=?",new String[]{warehouse_uuid,material_uuid},false);
    }
    /**
     * 根据项目uuid获取项目分项树结构
     * @param uuid