package com.product.project.management.service; 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.ItemizeUtil; 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); //生成材料类型 String bugetCode = fseParseData.getString(Cmnconst.BUDGET_CODE); String materialType = null; if ("声测管".equals(bugetCode)) { materialType = "2"; }else { String materialCode = fseParseData.getString(Cmnconst.MATERIAL_CODE); if (materialCode.contains("架立筋")) { materialType = "1"; fseParseData.setValue(Cmnconst.MATERIAL_CODE, ItemizeUtil.getChineseOrEnglishOrNumber("ENGLISHNUMBER", materialCode)); }else if (materialCode.contains("钢筋网")) { materialType = "3"; fseParseData.setValue(Cmnconst.MATERIAL_CODE, ItemizeUtil.getChineseOrEnglishOrNumber("ENGLISHNUMBER", materialCode)); }else{ FieldSetEntity fseMaterial = baseDao.getFieldSetEntityByFilter(Cmnconst.PRODUCT_PROJECT_BASE_MATERIAL,"material_code=?", new Object[] {materialCode}, false); if (fseMaterial != null) { materialType = fseMaterial.getString(Cmnconst.MATERIAL_TYPE); if (materialType.indexOf("0")>-1) { materialType = "0"; } } } } fseParseData.setValue(Cmnconst.MATERIAL_TYPE, materialType); } 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; FieldSetEntity fseProject = baseDao.getFieldSetByFilter(Cmnconst.PRODUCT_PROJECT_QXLW, "project_name=?", new Object[] {fseParseData.getString("field0")}, false); String projectUUID = fseProject.getUUID(); //循环field1~field6字段,逐步生成对应的项目分项数据 for (int i = 1; i < 9; i++) { //获取分项名称,判断是否为空 String itemize = fseParseData.getString("field"+i); //判断项目分项名称是否为空(如为空:则该预算对应的项目分项生成完毕,预算关联的UUID为上一个field分项对应的UUID if (BaseUtil.strIsNull(itemize)) { if (i==8) { finalUUID = itemizeFullNameAndUUID.get(itemizFullName); } continue; } //获取上级分项和当前分项全称(如当前分项没有上级:则全称等于名称;如有上级:则全称等于上级全称/名称) 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, "project_uuid = ? AND itemize_full_name=?", new Object[] {projectUUID,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"}, "project_uuid = ? AND itemize_parent_code IS NULL", new Object[] {projectUUID}, false, null); }else { fseMaxProjectItem = baseDao.getFieldSetEntityByFilter(Cmnconst.PRODUCT_PROJECT_ITEM, new String[] {"Max(itemize_code)itemize_code"}, "project_uuid = ? AND itemize_parent_code = ?", new Object[] {projectUUID, 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, projectUUID); 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"}, "project_uuid = ? AND itemize_parent_code IS NULL", new Object[] {projectUUID}, false, null); }else { fseMaxProjectItem = baseDao.getFieldSetEntityByFilter(Cmnconst.PRODUCT_PROJECT_ITEM, new String[] {"Max(itemize_code)itemize_code"}, " project_uuid = ? AND itemize_parent_code=?", new Object[] {projectUUID, 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 projectUUID * @return */ public boolean clearBudget(String projectUUID, String itemizeCode) { //查询对应项目对应分项的出库数据 DataTableEntity dtOutbound; if(BaseUtil.strIsNull(itemizeCode)) { dtOutbound = baseDao.listTable(Cmnconst.PRODUCT_PROJECT_OUTBOUND, "project_uuid=?", new Object[] {projectUUID}); }else { dtOutbound = baseDao.listTable(Cmnconst.PRODUCT_PROJECT_OUTBOUND, "project_uuid=? AND project_itemize IN (SELECT uuid FROM product_project_item WHERE project_uuid=? AND itemize_code LIKE ?)", new Object[] {projectUUID,projectUUID,itemizeCode+"%"}); } //判定出库数据是否存在 if (!BaseUtil.dataTableIsEmpty(dtOutbound)) { throw new BaseException(SystemCode.PROJeCT_BUDGET_CLEAR_FAIL_HAS_OUTBOUND.getValue(), SystemCode.PROJeCT_BUDGET_CLEAR_FAIL_HAS_OUTBOUND.getText()); } if (BaseUtil.strIsNull(itemizeCode)) { return baseDao.executeUpdate("DELETE FROM product_project_budget WHERE project_itemize_uuid IN (SELECT uuid FROM product_project_item WHERE project_uuid=?)", new Object[] {projectUUID}); }else { return baseDao.executeUpdate("DELETE FROM product_project_budget WHERE project_itemize_uuid IN (SELECT uuid FROM product_project_item WHERE project_uuid=? AND itemize_code LIKE ?)", new Object[] {projectUUID,itemizeCode+"%"}); } } }