瀏覽代碼

公式相关:私有引用项目公式同步;G10bug

yangyj 2 年之前
父節點
當前提交
e6537ecfd7

+ 1 - 1
blade-service/blade-manager/src/main/java/org/springblade/manager/formula/impl/FormulaMileage.java

@@ -94,7 +94,7 @@ public class FormulaMileage implements FormulaStrategy {
         }
         if(Func.isNotEmpty(mileageList)){
               List<String>  zhpw =mileageList.stream().filter(Mileage::isChecked).map(Mileage::getZhPw).collect(Collectors.toList());
-            Map<String,String[]> coordinateMap  =  mileageClient.mileage2Coordinate(zhpw,Func.toLong(tec.getConstantMap().get("contractId")));
+            Map<String,String[]> coordinateMap  =  mileageClient.mileage2Coordinate(zhpw,Func.toLong(tec.getContractId()));
             /*G10缓存对象*/
             if(coordinateMap.size()>0){
                 mileageList.forEach(m->{

+ 1 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/service/IWbsTreePrivateService.java

@@ -57,6 +57,7 @@ public interface IWbsTreePrivateService extends BaseService<WbsTreePrivate> {
     boolean submitFullName(String pKeyId, String fullNames);
 
     boolean syncNodeParam(String projectId, String pKeyId);
+    boolean syncPrivateProjectFormula(Long projectId, Long pKeyId);
 
     boolean syncProjectEVisa(String projectId, String pKeyId) throws FileNotFoundException;
 

+ 98 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreePrivateServiceImpl.java

@@ -25,14 +25,18 @@ import org.springblade.core.tool.api.R;
 import org.springblade.core.tool.constant.BladeConstant;
 import org.springblade.core.tool.node.ForestNodeMerger;
 import org.springblade.core.tool.utils.*;
+import org.springblade.manager.dto.FormulaBean;
 import org.springblade.manager.dto.WbsTreePrivateDTO2;
 import org.springblade.manager.dto.WbsTreePrivateDTO3;
 import org.springblade.manager.entity.*;
 import org.springblade.manager.mapper.*;
+import org.springblade.manager.service.IElementFormulaMappingService;
+import org.springblade.manager.service.IFormulaService;
 import org.springblade.manager.service.ITableInfoService;
 import org.springblade.manager.service.IWbsTreePrivateService;
 import org.springblade.manager.vo.*;
 import org.springblade.system.cache.ParamCache;
+import org.springframework.beans.BeanUtils;
 import org.springframework.jdbc.core.BeanPropertyRowMapper;
 import org.springframework.jdbc.core.JdbcTemplate;
 import org.springframework.scheduling.annotation.Async;
@@ -46,6 +50,7 @@ import java.io.FileNotFoundException;
 import java.io.IOException;
 import java.util.*;
 import java.util.function.Function;
+import java.util.stream.Collector;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
@@ -66,6 +71,8 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
     private final JdbcTemplate jdbcTemplate;
     private final TextdictInfoServiceImpl textDictInfoService;
     private final InformationQueryClient informationQueryClient;
+    private final IElementFormulaMappingService elementFormulaMappingService;
+    private final IFormulaService formulaService;
 
     @Override
     public List<WbsTreePrivateVO> tree(String wbsId, String projectId) {
@@ -892,6 +899,97 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
         return false;
     }
 
+    @Override
+    public boolean syncPrivateProjectFormula(Long projectId, Long pKeyId) {
+        if(projectId!=null&&pKeyId!=null){
+            ProjectInfo projectInfo = projectInfoMapper.selectById(projectId);
+            ProjectInfo sourceProject=jdbcTemplate.queryForObject("select a.* from m_project_info a join m_wbs_tree_private b on a.id=b.project_id where b.p_key_id="+projectInfo.getReferenceWbsTemplateId()+" limit 1",new BeanPropertyRowMapper<>(ProjectInfo.class));
+            /*只需要同步私有引用就可以了*/
+            if("private".equals(projectInfo.getReferenceWbsTemplateType())&&sourceProject!=null){
+                WbsTreePrivate selectNodeNow = baseMapper.selectOne(Wrappers.<WbsTreePrivate>lambdaQuery().eq(WbsTreePrivate::getPKeyId, pKeyId).eq(WbsTreePrivate::getStatus, 1));
+                if (selectNodeNow == null) {
+                    throw new ServiceException("未获取到当前选择同步的节点信息,请联系管理员");
+                }
+                List<ElementFormulaMapping> insertList=new ArrayList<>();
+                List<Formula> insertFormulaList=new ArrayList<>();
+                List<Formula> updateFormulaList=new ArrayList<>();
+                /*同步公共部分*/
+                global(sourceProject.getId(),projectInfo.getId(),insertList,insertFormulaList,updateFormulaList);
+                /*同步节点部分,查找模版的叶子节点,查找目标叶子节点,id一样的是关联数据  */
+
+                /*保存记录*/
+                if(!insertList.isEmpty()) {
+                    this.elementFormulaMappingService.saveBatch(insertList);
+                }
+                if(!insertFormulaList.isEmpty()) {
+                    this.formulaService.saveBatch(insertFormulaList);
+                }
+                if(!updateFormulaList.isEmpty()) {
+                    this.formulaService.updateBatchById(updateFormulaList);
+                }
+            }
+        }
+        return false;
+    }
+
+    private void global(Long srcProjectId,Long distProjectId,List<ElementFormulaMapping> insertList, List<Formula> insertFormulaList, List<Formula> updateFormulaList){
+        Map<Long,ElementFormulaMapping> efmListScope10Map=new HashMap<>();
+        Map<Long,Formula> formulaScope10Map = new HashMap<>();
+        List<ElementFormulaMapping> efmListScope10=this.elementFormulaMappingService.list(Wrappers.<ElementFormulaMapping>lambdaQuery().eq(ElementFormulaMapping::getProjectId,distProjectId).eq(ElementFormulaMapping::getScope, FormulaBean.PRO_GLOBAL));
+        if(Func.isNotEmpty(efmListScope10)) {
+            /*全局scope=10 每个元素和efm一对一*/
+            efmListScope10Map = efmListScope10.stream().collect(Collectors.toMap(ElementFormulaMapping::getElementId, o -> o));
+            formulaScope10Map = this.formulaService.listByIds(efmListScope10.stream().map(ElementFormulaMapping::getFormulaId).collect(Collectors.toList())).stream().collect(Collectors.toMap(Formula::getId, f -> f));
+        }
+        Map<Long,ElementFormulaMapping> sourceEfmListScope10Map =new HashMap<>();
+        Map<Long,Formula> sourceFormulaScope10Map = new HashMap<>();
+        List<ElementFormulaMapping> sourceEfmListScope10=this.elementFormulaMappingService.list(Wrappers.<ElementFormulaMapping>lambdaQuery().eq(ElementFormulaMapping::getProjectId,srcProjectId).eq(ElementFormulaMapping::getScope, FormulaBean.PRO_GLOBAL));
+        if(Func.isNotEmpty(sourceEfmListScope10)) {
+            sourceEfmListScope10Map = sourceEfmListScope10.stream().collect(Collectors.toMap(ElementFormulaMapping::getElementId, o -> o));
+            sourceFormulaScope10Map = this.formulaService.listByIds(sourceEfmListScope10.stream().map(ElementFormulaMapping::getFormulaId).collect(Collectors.toList())).stream().collect(Collectors.toMap(Formula::getId, f -> f));
+        }
+
+        String[] exclude= new String[]{"id"};
+        Map<Long, ElementFormulaMapping> finalEfmListScope10Map = efmListScope10Map;
+        Map<Long, Formula> finalFormulaScope10Map = formulaScope10Map;
+        Map<Long, Formula> finalSourceFormulaScope10Map = sourceFormulaScope10Map;
+        sourceEfmListScope10Map.forEach((k, v)->{
+            if(!finalEfmListScope10Map.containsKey(k)){
+                /*不存在*/
+                ElementFormulaMapping target = new ElementFormulaMapping();
+                BeanUtils.copyProperties(v,target,exclude);
+                insertList.add(target);
+                Formula sf= finalFormulaScope10Map.get(v.getFormulaId());
+                Formula target2= new Formula();
+                BeanUtils.copyProperties(sf,target2);
+                Long id=SnowFlakeUtil.getId();
+                target.setFormulaId(id);
+                target2.setId(id);
+                insertFormulaList.add(target2);
+            }else{
+                /*存在则比较,有差异则覆盖*/
+                Formula sf= finalSourceFormulaScope10Map.get(v.getFormulaId());
+                Formula tf= finalFormulaScope10Map.get(finalEfmListScope10Map.get(k).getFormulaId());
+                if(!tf.getFormula().equals(sf.getFormula())){
+                    BeanUtils.copyProperties(sf,tf,exclude);
+                    updateFormulaList.add(tf);
+                }
+
+            }
+        });
+    }
+    private void part(Long srcProjectId,Long distProjectId,List<ElementFormulaMapping> insertList, List<Formula> insertFormulaList, List<Formula> updateFormulaList){
+        /**/
+        Map<String,ElementFormulaMapping> efmListScope20Map=new HashMap<>();
+        Map<String,ElementFormulaMapping> sourceEfmListScope20Map=new HashMap<>();
+        Map<Long,Formula> formulaScope20Map = new HashMap<>();
+        List<ElementFormulaMapping> efmListScope20=this.elementFormulaMappingService.list(Wrappers.<ElementFormulaMapping>lambdaQuery().eq(ElementFormulaMapping::getProjectId,distProjectId).eq(ElementFormulaMapping::getScope, FormulaBean.PRO_PART));
+        List<ElementFormulaMapping>sourceEfmListScope20=this.elementFormulaMappingService.list(Wrappers.<ElementFormulaMapping>lambdaQuery().eq(ElementFormulaMapping::getProjectId,srcProjectId).eq(ElementFormulaMapping::getScope, FormulaBean.PRO_PART));
+        efmListScope20Map= efmListScope20.stream().collect(Collectors.toMap(e->e.getElementId()+""+e.getNodeId(),t->t));
+        sourceEfmListScope20Map= sourceEfmListScope20.stream().collect(Collectors.toMap(e->e.getElementId()+""+e.getNodeId(),t->t));
+
+    }
+
     /**
      * 电签同步-获取所有子级节点、表
      */