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.Service; import com.product.core.dao.BaseDao; import com.product.core.entity.DataTableEntity; import com.product.core.entity.FieldSetEntity; import com.product.core.exception.BaseException; import com.product.core.service.support.AbstractBaseService; import com.product.project.management.config.Cmnconst; import com.product.project.management.config.SystemCode; import com.product.project.management.util.ProjectItemUtil; import com.product.util.BaseUtil; import cn.hutool.core.lang.UUID; @Service("projectBudget") public class ProjectBudgetService extends AbstractBaseService{ @Autowired BaseDao baseDao; /** * 项目预算导入 * @param dtParseData 解析数据 * @param headerDataList excel标题数据 */ public DataTableEntity importBudget2(DataTableEntity dtParseData, List> headerDataList) { //判断是否有解析EXCEL数据 if (BaseUtil.dataTableIsEmpty(dtParseData)) { return null; } //临时存储集合 Map itemizeFullNameAndUUID = new HashMap<>(); Map itemizeFullNameAndCode = new HashMap<>(); Map itemizeFullNameAndMaxCode = new HashMap<>(); DataTableEntity dtNewProjectItem = new DataTableEntity(); //遍历excel转换数据 for (int i = 0; i < dtParseData.getRows(); i++) { //获取excel行数据 FieldSetEntity fseParseData = dtParseData.getFieldSetEntity(i); String uuid = autoCreateProjectItem(dtNewProjectItem, fseParseData, itemizeFullNameAndUUID, itemizeFullNameAndCode, itemizeFullNameAndMaxCode); fseParseData.setValue(Cmnconst.PROJECT_ITEMIZE_UUID, uuid); } if (!BaseUtil.dataTableIsEmpty(dtNewProjectItem)) { try { baseDao.add(dtNewProjectItem); } catch (Exception e) { e.printStackTrace(); } } return dtParseData; } /** * 通过field1,field2,field3,field4,field5,field6数据自动生成项目分项数据 * 如果项目分项已存在数据库或者新生成,将存入map集合中以便使用 * 如果项目分项不存在于数据库则生成项目分项数据 * @param dtNewProjectItem * @param fseParseData * @param itemizeFullNameAndUUID * @param itemizeFullNameAndCode * @param itemizeFullNameAndMaxCode * @return */ public String autoCreateProjectItem(DataTableEntity dtNewProjectItem, FieldSetEntity fseParseData, Map itemizeFullNameAndUUID, Map itemizeFullNameAndCode, Map itemizeFullNameAndMaxCode) { String itemizFullName = null; String finalUUID = null; //循环field1~field6字段,逐步生成对应的项目分项数据 for (int i = 1; i < 7; i++) { //获取分项名称,判断是否为空 String itemize = fseParseData.getString("field"+i); //判断项目分项名称是否为空(如为空:则该预算对应的项目分项生成完毕,预算关联的UUID为上一个field分项对应的UUID if (BaseUtil.strIsNull(itemize)) { finalUUID = itemizeFullNameAndUUID.get(itemizFullName); break; } //获取上级分项和当前分项全称(如当前分项没有上级:则全称等于名称;如有上级:则全称等于上级全称/名称) String itemizeParent = null; //获取分项全称 if (BaseUtil.strIsNull(itemizFullName)) { itemizFullName = itemize; }else { itemizeParent = itemizFullName; itemizFullName = itemizFullName + "/" + itemize; } //判断项目分项是否存在于集合中 if(!itemizeFullNameAndCode.containsKey(itemizFullName)) { //查询分项和上级分项是否存在于数据库中 FieldSetEntity fseProjectItem = baseDao.getFieldSetEntityByFilter(Cmnconst.PRODUCT_PROJECT_ITEM, "itemize_full_name=?", new Object[] {itemizFullName}, false); if (fseProjectItem == null) { String uuid = UUID.randomUUID().toString(); String code; if (!BaseUtil.strIsNull(itemizeFullNameAndMaxCode.get(itemizeParent))) { code = ProjectItemUtil.autoAddOneCode(itemizeFullNameAndMaxCode.get(itemizeParent)); }else { FieldSetEntity fseMaxProjectItem; if(BaseUtil.strIsNull(itemizeParent)) { fseMaxProjectItem = baseDao.getFieldSetEntityByFilter(Cmnconst.PRODUCT_PROJECT_ITEM, new String[] {"Max(itemize_code)itemize_code"}, "itemize_parent_code IS NULL", new Object[] {}, false, null); }else { fseMaxProjectItem = baseDao.getFieldSetEntityByFilter(Cmnconst.PRODUCT_PROJECT_ITEM, new String[] {"Max(itemize_code)itemize_code"}, "itemize_parent_code = ?", new Object[] {itemizeFullNameAndCode.get(itemizeParent)}, false, null); } if (fseMaxProjectItem==null || BaseUtil.strIsNull(fseMaxProjectItem.getString(Cmnconst.ITEMIZE_CODE))) { code = ProjectItemUtil.autoCreateCode(itemizeFullNameAndCode.get(itemizeParent)); }else { code = ProjectItemUtil.autoAddOneCode(fseMaxProjectItem.getString(Cmnconst.ITEMIZE_CODE)); } } FieldSetEntity fseNewProject = new FieldSetEntity(Cmnconst.PRODUCT_PROJECT_ITEM); fseNewProject.setValue(Cmnconst.UUID, uuid); fseNewProject.setValue("~type~", "add"); // fseNewProject.setValue(Cmnconst.PROJECT_UUID, ); fseNewProject.setValue(Cmnconst.ITEMIZE, itemize); fseNewProject.setValue(Cmnconst.ITEMIZE_CODE, code); fseNewProject.setValue(Cmnconst.ITEMIZE_PARENT_CODE, itemizeFullNameAndCode.get(itemizeParent)); fseNewProject.setValue(Cmnconst.ITEMIZE_FULL_NAME, itemizFullName); dtNewProjectItem.addFieldSetEntity(fseNewProject); itemizeFullNameAndUUID.put(itemizFullName, uuid); itemizeFullNameAndCode.put(itemizFullName, code); itemizeFullNameAndMaxCode.put(itemizeParent, code); }else { String uuid = fseProjectItem.getUUID(); String code = fseProjectItem.getString(Cmnconst.ITEMIZE_CODE); FieldSetEntity fseMaxProjectItem; if (BaseUtil.strIsNull(fseProjectItem.getString(Cmnconst.ITEMIZE_PARENT_CODE))) { fseMaxProjectItem = baseDao.getFieldSetEntityByFilter(Cmnconst.PRODUCT_PROJECT_ITEM, new String[] {"Max(itemize_code)itemize_code"}, "itemize_parent_code IS NULL", new Object[] {}, false, null); }else { fseMaxProjectItem = baseDao.getFieldSetEntityByFilter(Cmnconst.PRODUCT_PROJECT_ITEM, new String[] {"Max(itemize_code)itemize_code"}, "itemize_parent_code=?", new Object[] {fseProjectItem.getString(Cmnconst.ITEMIZE_PARENT_CODE)}, false, null); } itemizeFullNameAndUUID.put(itemizFullName, uuid); itemizeFullNameAndCode.put(itemizFullName, code); itemizeFullNameAndMaxCode.put(itemizeParent, fseMaxProjectItem.getString(Cmnconst.ITEMIZE_CODE)); } } } return finalUUID; } /** * 项目预算导入 * @param dtParseData 解析数据 * @param headerDataList excel标题数据 */ public DataTableEntity importBudget(DataTableEntity dtParseData, List> headerDataList) { //判断是否有解析EXCEL数据 if (BaseUtil.dataTableIsEmpty(dtParseData)) { return null; } //声明异常集 StringBuilder sbError = new StringBuilder(); //遍历excel转换数据 for (int i = 0; i < dtParseData.getRows(); i++) { FieldSetEntity fseParseData = dtParseData.getFieldSetEntity(i); //根据解析数据获取项目分项信息 List params = new ArrayList<>(); String projectItem = autoCreateFilter(params, fseParseData); //根据模板项目分项查询数据库项目分项 FieldSetEntity fseProjectItem = baseDao.getFieldSetEntityByFilter(Cmnconst.PRODUCT_PROJECT_ITEM, "project_uuid IN (SELECT uuid FROM product_project_qxlw WHERE project_name=?) AND itemize_full_name=?", params.toArray(), false); if(fseProjectItem==null) { sbError.append(String.format("第 %s 行项目分项 '%s' 不存在于系统中。", fseParseData.getString("~row~"), projectItem)); continue; } //设置关联项目分项 fseParseData.setValue("project_itemize_uuid", fseProjectItem.getUUID()); //获取编码生成材料类型 String budgetCode = fseParseData.getString(Cmnconst.BUDGET_CODE); Integer materialType = 0; if("架立筋".equals(budgetCode)) { materialType = 1; }else if("声测管".equals(budgetCode)) { materialType = 2; }else { //网片 FieldSetEntity materialInfo = baseDao.getFieldSetEntityByFilter(Cmnconst.PRODUCT_PROJECT_BASE_MATERIAL, "material_type=3 AND material_name like ?", new Object[] {fseParseData.getString(Cmnconst.MATERIAL_CODE)+"%"}, false); if (materialInfo!=null) { materialType = 3; } } fseParseData.setValue(Cmnconst.MATERIAL_TYPE, materialType); } //判断是否包含错误信息 if (!BaseUtil.strIsNull(sbError.toString())) { throw new BaseException(SystemCode.PROJECT_BUDGET_IMPORT_FAIL.getValue(), sbError.toString()); } return dtParseData; } /** * 自动生成查询项目分项filter * @param params * @param fseParseData * @return */ public String autoCreateFilter(List params , FieldSetEntity fseParseData) { StringBuilder projectItem = new StringBuilder(); for (int i = 1; i < 7; i++) { String fieldValue = fseParseData.getString("field"+i); if(!BaseUtil.strIsNull(fieldValue)) { if (i>2) { projectItem.append("/"); } if(i==1) { params.add(fieldValue); }else{ projectItem.append(fieldValue); } } } params.add(projectItem.toString()); return projectItem.toString(); } }