package com.product.project.management.service; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import com.product.core.dao.BaseDao; import com.product.core.entity.DataTableEntity; import com.product.core.entity.FieldSetEntity; import com.product.core.service.support.AbstractBaseService; import com.product.project.management.config.Cmnconst; import com.product.util.BaseUtil; import cn.hutool.json.JSONObject; @Component public class ProjectStatisticAnalysisService extends AbstractBaseService{ @Autowired BaseDao baseDao; /** * 项目数据分析 * * @param project_uuid * @return */ public JSONObject statistAnalysis(String project_uuid) { JSONObject returnJson = new JSONObject(); List> listMaterialType = getReportMaterialType(); //数据库出库信息汇总 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 A.project_uuid,A.material_type,A.material_code,A.outbound_weight,B.itemize ") .append(" FROM( ") .append(" SELECT A.project_uuid,B.material_type,B.material_code,B.outbound_weight,substring(C.itemize_code,1,11) 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 ") .append(" LEFT JOIN product_project_item B ON A.itemize = B.itemize_code ") .append(" WHERE B.project_uuid = ? ") .append(" )A GROUP BY project_uuid,itemize,material_type,material_code ") .append(")"); //出库信息操作(getItemizeSum[钢筋和架立筋左侧汇总];allitemize[所有三级分项];intermediateData1[钢筋架立筋按分项汇总];intermediateData2[钢筋网片按分项和材料汇总];intermediateData3[报表成型]) StringBuilder operateInfo = new StringBuilder(1024); operateInfo.append(" ,getItemizeSum AS( ") .append(" SELECT itemize,ROUND(SUM(outbound_weight)/1000,1) total_outbound_weight FROM outbound WHERE ") .append(BaseUtil.buildQuestionMarkFilter(Cmnconst.MATERIAL_TYPE, listMaterialType.get(0).toArray(), true)) .append(" GROUP BY itemize ") .append(" )") .append(",allitemize AS( ") .append(" SELECT itemize FROM outbound GROUP BY itemize ") .append(" )") .append(",intermediateData1 AS( ") .append(" SELECT A.itemize "); for (int i = 0; i < listMaterialType.get(2).size(); i++) { operateInfo.append(",SUM(IF(material_type=") .append(listMaterialType.get(2).get(i)) .append(",outbound_weight,0)) as ") .append(listMaterialType.get(3).get(i)); } operateInfo.append(" FROM ( SELECT itemize FROM outbound GROUP BY itemize )A ") .append(" LEFT JOIN ( ") .append(" SELECT project_uuid,itemize,material_type,SUM(outbound_weight)outbound_weight,CASE "); for (int i = 0; i < listMaterialType.get(2).size(); i++) { operateInfo.append(" WHEN material_type=") .append(listMaterialType.get(2).get(i)) .append(" THEN ") .append("'").append(listMaterialType.get(3).get(i)).append("'"); } operateInfo.append(" END AS material_code ") .append(" FROM outbound ") .append(" WHERE ") .append(BaseUtil.buildQuestionMarkFilter(Cmnconst.MATERIAL_TYPE, listMaterialType.get(1).toArray(), false)) .append(" GROUP BY project_uuid,itemize,material_type ") .append(" ) B ON A.itemize = B.itemize ") .append(" GROUP BY A.itemize ") .append(" )") .append(",intermediateData2 AS( ") .append(" SELECT project_uuid,itemize,material_type,material_code,outbound_weight FROM outbound WHERE ") .append(BaseUtil.buildQuestionMarkFilter(Cmnconst.MATERIAL_TYPE, listMaterialType.get(1).toArray(), true)) .append(" )") .append(",intermediateData3 AS( ") .append(" SELECT A.itemize,A.total_outbound_weight,B.material_type,material_code,outbound_weight"); for (int i = 0; i < listMaterialType.get(3).size(); i++) { operateInfo.append(",A.").append(listMaterialType.get(3).get(i)); } operateInfo.append(" FROM( ") .append(" SELECT A.itemize,C.total_outbound_weight "); for (int i = 0; i < listMaterialType.get(3).size(); i++) { operateInfo.append(",B.").append(listMaterialType.get(3).get(i)); } operateInfo.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,ROUND(SUM(outbound_weight),1) outbound_weight FROM outbound WHERE ") .append(BaseUtil.buildQuestionMarkFilter(Cmnconst.MATERIAL_TYPE, listMaterialType.get(1).toArray(), true)) .append(" GROUP BY material_code ") .append(" UNION ALL ") .append(" SELECT CASE "); for (int i = 0; i < listMaterialType.get(2).size(); i++) { totalSum.append(" WHEN material_type=") .append(listMaterialType.get(2).get(i)) .append(" THEN ") .append("'").append(listMaterialType.get(3).get(i)).append("'"); } totalSum.append(" END, ROUND(SUM(outbound_weight),1)") .append(" FROM outbound WHERE ") .append(BaseUtil.buildQuestionMarkFilter(Cmnconst.MATERIAL_TYPE, listMaterialType.get(2).toArray(), true)) .append(" GROUP BY material_type ") .append(" UNION ALL ") .append(" SELECT '合计',ROUND(SUM(outbound_weight)/1000,1) 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, project_uuid}); if (!BaseUtil.dataTableIsEmpty(dtItemizeInfo)) { Map 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); for (int j = 0; j < listMaterialType.get(3).size(); j++) { fseConvertData.setValue(listMaterialType.get(3).get(j), fseItemize.getString(listMaterialType.get(3).get(j))); } 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, 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; } /** * 返回材料类型信息 * listSummary 需要汇总的材料 * listShowMaterialCode 需要展示材料编码的材料 * listNotShowMaterialCode 不需要展示材料编码的材料 * listNotShowMaterialCodeName 不需要展示材料编码的材料类型名称 * @return */ public List> getReportMaterialType() { DataTableEntity dtMaterialType = baseDao.listTable(Cmnconst.PRODUCT_PROJECT_BASE_MATERIAL_TYPE, null, new Object[] {}, new Object[] {"material_type_name","material_type_value"}); if (!BaseUtil.dataTableIsEmpty(dtMaterialType)) { List> returnList = new ArrayList<>(); List listSummary = new ArrayList<>(); List listShowMaterialCode = new ArrayList<>(); List listNotShowMaterialCode = new ArrayList<>(); List listNotShowMaterialCodeName = new ArrayList<>(); for (int i = 0; i < dtMaterialType.getRows(); i++) { String dictValue = dtMaterialType.getFieldSetEntity(i).getString("material_type_value"); String dictLabel = dtMaterialType.getFieldSetEntity(i).getString("material_type_name"); if ("0".equals(dictValue)) { listSummary.add(dictValue); listShowMaterialCode.add(dictValue); }else if ("1".equals(dictValue)) { listSummary.add(dictValue); listNotShowMaterialCode.add(dictValue); listNotShowMaterialCodeName.add(dictLabel); }else if ("3".equals(dictValue)) { listShowMaterialCode.add(dictValue); }else { listNotShowMaterialCode.add(dictValue); listNotShowMaterialCodeName.add(dictLabel); } } returnList.add(listSummary); returnList.add(listShowMaterialCode); returnList.add(listNotShowMaterialCode); returnList.add(listNotShowMaterialCodeName); return returnList; } return null; } }