|
@@ -5,9 +5,8 @@ import cn.hutool.core.util.HashUtil;
|
|
|
import cn.hutool.log.StaticLog;
|
|
|
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
|
|
import com.jfireel.expression.Expression;
|
|
|
-import com.jfireel.expression.node.CalculateNode;
|
|
|
import com.mixsmart.utils.*;
|
|
|
-import lombok.AllArgsConstructor;
|
|
|
+import lombok.RequiredArgsConstructor;
|
|
|
import org.springblade.core.mp.base.BaseServiceImpl;
|
|
|
import org.springblade.core.tool.utils.BeanUtil;
|
|
|
import org.springblade.core.tool.utils.CollectionUtil;
|
|
@@ -16,13 +15,12 @@ import org.springblade.core.tool.utils.StringPool;
|
|
|
import org.springblade.manager.dto.ElementData;
|
|
|
import org.springblade.manager.dto.FormData;
|
|
|
import org.springblade.manager.dto.LocalVariable;
|
|
|
+import org.springblade.manager.dto.RangeInfo;
|
|
|
import org.springblade.manager.entity.ContractInfo;
|
|
|
import org.springblade.manager.entity.Formula;
|
|
|
import org.springblade.manager.entity.WbsParam;
|
|
|
import org.springblade.manager.entity.WbsTreeContract;
|
|
|
-import org.springblade.manager.formula.Container;
|
|
|
import org.springblade.manager.formula.FormulaStrategyFactory;
|
|
|
-import org.springblade.manager.formula.ITableElementConverter;
|
|
|
import org.springblade.manager.formula.KeyMapper;
|
|
|
import org.springblade.manager.formula.impl.CompositeDataAccess;
|
|
|
import org.springblade.manager.formula.impl.TableElementConverter;
|
|
@@ -31,8 +29,6 @@ import org.springblade.manager.service.*;
|
|
|
import org.springblade.manager.vo.AppWbsTreeContractVO;
|
|
|
import org.springframework.jdbc.core.JdbcTemplate;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
-
|
|
|
-import java.io.File;
|
|
|
import java.util.*;
|
|
|
import java.util.regex.Matcher;
|
|
|
import java.util.regex.Pattern;
|
|
@@ -45,7 +41,7 @@ import java.util.stream.Collectors;
|
|
|
*/
|
|
|
|
|
|
@Service
|
|
|
-@AllArgsConstructor
|
|
|
+@RequiredArgsConstructor
|
|
|
public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula> implements IFormulaService {
|
|
|
|
|
|
private final IWbsParamService wpService;
|
|
@@ -54,7 +50,11 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
|
|
|
private final IProjectInfoService projectInfoService;
|
|
|
private final IWbsTreeContractService wbsTreeContractService;
|
|
|
private final JdbcTemplate jdbcTemplate;
|
|
|
- private final Container env;
|
|
|
+ /** private final Container env;*/
|
|
|
+ private TableElementConverter tec;
|
|
|
+ private Map<String,Object> constantMap;
|
|
|
+ private List<FormData> formDataList;
|
|
|
+ private Map<Long,Map<String,Object>> crossDataMap;
|
|
|
|
|
|
|
|
|
|
|
@@ -72,7 +72,7 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
|
|
|
public static final String ELE_CODE_REG= "(?<=E\\[)[^]]+(?=\\])";
|
|
|
public static final Pattern P = Pattern.compile(ELE_CODE_REG);
|
|
|
public static final Pattern P2= Pattern.compile("(?<=E\\[)[^];]+:[^];]+:[^];]+(?=\\])");
|
|
|
- public static final String POLY_REG= "(checkpoints|avg|min|max|sum|join|repeat|removeEmpty|listAt)\\(([^)]+)\\)";
|
|
|
+ public static final String POLY_REG= "(checkpoints|quantity|avg|min|max|sum|join|repeat|removeEmpty|listAt)\\(([^)]+)\\)";
|
|
|
public static final Pattern POLY = Pattern.compile(POLY_REG);
|
|
|
public final static String CTI="ContractInfo";
|
|
|
public final static String PJI="ProjectInfo";
|
|
@@ -90,46 +90,41 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
|
|
|
**/
|
|
|
@Override
|
|
|
public void execute(TableElementConverter tec) {
|
|
|
- this.env.tec=tec;
|
|
|
+ this.tec=tec;
|
|
|
/*初始化变量>>依赖排序>>预处理>>特殊公式>>通用公式执行>>数据格式化*/
|
|
|
- this.init()
|
|
|
- .sort()
|
|
|
- .pre()
|
|
|
- .special()
|
|
|
- .calculate()
|
|
|
- .format();
|
|
|
+ this.init().sort().pre().special().calculate().format();
|
|
|
// WbsTreeContract one= this.wbsTreeContractService.getOne(Wrappers.<WbsTreeContract>lambdaQuery().eq(WbsTreeContract::getPKeyId,tec.getNodeId()));
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
public IFormulaService init() {
|
|
|
- List<FormData> list =this.env.tec.getFds() ;
|
|
|
- Long contractId=this.env.tec.getContractId();
|
|
|
- WbsTreeContract one = this.env.tec.getOne();
|
|
|
+ List<FormData> list =this.tec.getFds();
|
|
|
+ Long contractId=this.tec.getContractId();
|
|
|
+ WbsTreeContract one = this.tec.getOne();
|
|
|
Long id =Func.isNotEmpty(one.getOldId())?Long.parseLong(one.getOldId()):one.getParentId();
|
|
|
Long primaryKeyId=one.getPKeyId();
|
|
|
- this.env.constantMap=new HashMap<>(100);
|
|
|
- this.env.formDataList=list;
|
|
|
- this.env.constantMap.put("contractId",contractId);
|
|
|
- keyWord(this.env.constantMap);
|
|
|
+ this.constantMap=new HashMap<>(100);
|
|
|
+ this.formDataList=list;
|
|
|
+ this.constantMap.put("contractId",contractId);
|
|
|
+ keyWord(this.constantMap);
|
|
|
ContractInfo info =this.contractInfoService.getById(contractId);
|
|
|
/*合同段信息*/
|
|
|
- this.env.constantMap.put(CTI,info);
|
|
|
+ this.constantMap.put(CTI,info);
|
|
|
/*项目信息*/
|
|
|
- this.env.constantMap.put(PJI,this.projectInfoService.getById(info.getPId()));
|
|
|
+ this.constantMap.put(PJI,this.projectInfoService.getById(info.getPId()));
|
|
|
/*wbs节点链*/
|
|
|
List<WbsTreeContract> nodes = wpService.chain(contractId,id,primaryKeyId,null);
|
|
|
- this.env.constantMap.put(CHAIN,nodes.stream().map(WbsTreeContract::getNodeName).collect(Collectors.toList()));
|
|
|
+ this.constantMap.put(CHAIN,nodes.stream().map(WbsTreeContract::getNodeName).collect(Collectors.toList()));
|
|
|
/*节点参数*/
|
|
|
- this.env.constantMap.put(WP,getWpMap(id,primaryKeyId));
|
|
|
+ this.constantMap.put(WP,getWpMap(id,primaryKeyId));
|
|
|
/*表格名称*/
|
|
|
List<AppWbsTreeContractVO> tableList =wbsTreeContractService.searchNodeAllTable(primaryKeyId.toString(), "1", contractId.toString(),info.getPId());
|
|
|
- this.env.constantMap.put(TABLE_LIST,tableList);
|
|
|
+ this.constantMap.put(TABLE_LIST,tableList);
|
|
|
/*通过判断元素名称来确定,加入汇总公式延后执行*/
|
|
|
- this.env.constantMap.put("tableNames",tableList.stream().map(WbsTreeContract::getFullName).collect(Collectors.toList()));
|
|
|
+ this.constantMap.put("tableNames",tableList.stream().map(WbsTreeContract::getFullName).collect(Collectors.toList()));
|
|
|
/*检查是否有跨节点数据*/
|
|
|
List<FormData> crossNodeFd=new ArrayList<>();
|
|
|
- this.env.formDataList.forEach(fd->{
|
|
|
+ this.formDataList.forEach(fd->{
|
|
|
if(fd.executable()){
|
|
|
Matcher matcher=P2.matcher(fd.getFormula().getFormula());
|
|
|
while (matcher.find()){
|
|
@@ -139,7 +134,7 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
|
|
|
/*暂时先只取第一个满足条件的*/
|
|
|
if(Func.isNotEmpty(targets)){
|
|
|
WbsTreeContract cross = targets.get(0);
|
|
|
- Map<String,Object> dataMap= this.env.crossDataMap.computeIfAbsent(cross.getPKeyId(),(k)->this.jdbcTemplate.queryForMap("select * from " + arr[1] + " where p_key_id=" + k));
|
|
|
+ Map<String,Object> dataMap= this.crossDataMap.computeIfAbsent(cross.getPKeyId(),(k)->this.jdbcTemplate.queryForMap("select * from " + arr[1] + " where p_key_id=" + k));
|
|
|
if(dataMap.size()>0){
|
|
|
String v= StringUtils.handleNull(dataMap.get(arr[2]));
|
|
|
if(StringUtils.isNotEmpty(v)){
|
|
@@ -159,15 +154,18 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
|
|
|
});
|
|
|
if(!crossNodeFd.isEmpty()){
|
|
|
System.out.println("跨节点元素:"+crossNodeFd.stream().map(FormData::getCode).collect(Collectors.joining(",")));
|
|
|
- this.env.formDataList.addAll(crossNodeFd);
|
|
|
+ this.formDataList.addAll(crossNodeFd);
|
|
|
}
|
|
|
/*实测值参数*/
|
|
|
- List<Map<String,Object>> textInfoMap= this.jdbcTemplate.queryForList("SELECT b.tab_id pkId, b.col_key ekey,b.col_name val ,c.init_table_name " +
|
|
|
+ List<Map<String,Object>> textInfoMap= this.jdbcTemplate.queryForList("SELECT b.tab_id pkId, b.col_key ekey,b.col_name val ,c.init_table_name tableName " +
|
|
|
"from m_wbs_tree_contract a " +
|
|
|
"inner join m_textdict_info b on a.p_key_id=b.tab_id " +
|
|
|
"INNER JOIN m_wbs_tree c on (a.id=c.id or a.old_id=bc.id) " +
|
|
|
- "where a.p_key_id in("+ this.env.tec.getTableAll().stream().map(AppWbsTreeContractVO::getPKeyId).map(Func::toStr).collect(Collectors.joining(","))+") and b.type=8");
|
|
|
-
|
|
|
+ "where a.p_key_id in("+ this.tec.getTableAll().stream().map(AppWbsTreeContractVO::getPKeyId).map(Func::toStr).collect(Collectors.joining(","))+") and b.type=8");
|
|
|
+ if(Func.isNotEmpty(textInfoMap)){
|
|
|
+ Map<String,List<Map<String,Object>>> tmap = textInfoMap.stream().collect(Collectors.groupingBy(m->m.get("tableName")+StringPool.COLON+m.get("ekey")));
|
|
|
+ this.constantMap.put("tmap",tmap);
|
|
|
+ }
|
|
|
/*检查项目*/
|
|
|
return this;
|
|
|
}
|
|
@@ -209,26 +207,26 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
|
|
|
|
|
|
@Override
|
|
|
public IFormulaService sort() {
|
|
|
- Map<Boolean,List<FormData>> map = this.env.formDataList.stream().collect(Collectors.partitioningBy(e->Func.isNotEmpty(e.getFormula())&&e.getFormula().getFormula().contains("E[")));
|
|
|
- this.env.formDataList.clear();
|
|
|
+ Map<Boolean,List<FormData>> map = this.formDataList.stream().collect(Collectors.partitioningBy(e->Func.isNotEmpty(e.getFormula())&&e.getFormula().getFormula().contains("E[")));
|
|
|
+ this.formDataList.clear();
|
|
|
/*没有依赖的*/
|
|
|
List<FormData> simple=map.get(false);
|
|
|
if(CollectionUtil.isNotEmpty(simple)){
|
|
|
- this.env.formDataList.addAll(simple);
|
|
|
+ this.formDataList.addAll(simple);
|
|
|
}
|
|
|
/*有依赖的*/
|
|
|
List<FormData> rely= map.get(true);
|
|
|
if(CollectionUtil.isNotEmpty(rely)){
|
|
|
sort(rely,((rely.size()+1)/2)*rely.size());
|
|
|
- this.env.formDataList.addAll(rely);
|
|
|
+ this.formDataList.addAll(rely);
|
|
|
}
|
|
|
return this;
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
public IFormulaService pre() {
|
|
|
- if(CollectionUtil.isNotEmpty(this.env.formDataList)){
|
|
|
- for(FormData fd:this.env.formDataList){
|
|
|
+ if(CollectionUtil.isNotEmpty(this.formDataList)){
|
|
|
+ for(FormData fd:this.formDataList){
|
|
|
/*预处理公式脚本*/
|
|
|
if(!fd.executable()){
|
|
|
/*不存公式,则认为执行完成,不会再主动执行*/
|
|
@@ -261,7 +259,7 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
|
|
|
}
|
|
|
if(CHECK_ITEMS.equals(tmp)){
|
|
|
/*获取type=1的检验单或者type=4的监表*/
|
|
|
- List<WbsTreeContract> tableList= (List<WbsTreeContract>) this.env.getConstantMap().get(TABLE_LIST);
|
|
|
+ List<WbsTreeContract> tableList= (List<WbsTreeContract>) this.constantMap.get(TABLE_LIST);
|
|
|
Optional<WbsTreeContract> wop=tableList.stream().filter(e->e.getTableType()==1||e.getTableType()==4).findAny();
|
|
|
if(wop.isPresent()){
|
|
|
this.jdbcTemplate.queryForList("select c.e_name name ,c.init_table_name tableName,c.e_key ekey from m_wbs_tree_contract a INNER JOIN m_wbs_tree b on (a.id=b.id or a.old_id=b.id) INNER join m_wbs_form_element c on b.init_table_id=c.f_id where a.id={} \n");
|
|
@@ -278,9 +276,9 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
|
|
|
|
|
|
@Override
|
|
|
public IFormulaService special() {
|
|
|
- for(FormData fd:this.env.formDataList) {
|
|
|
+ for(FormData fd:this.formDataList) {
|
|
|
if(Func.isNotEmpty(fd.getFormula())) {
|
|
|
- formulaStrategyFactory.get(fd).forEach(e -> e.execute(this.env.formDataList, this.env.constantMap));
|
|
|
+ formulaStrategyFactory.get(fd).forEach(e -> e.execute(this.formDataList, this.constantMap));
|
|
|
}
|
|
|
}
|
|
|
return this;
|
|
@@ -291,17 +289,17 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
|
|
|
/*公式执行*/
|
|
|
/*先处理聚合类的方法*/
|
|
|
/*每次执行都会构造一个只有依赖的的集合*/
|
|
|
- for(FormData fd:this.env.formDataList){
|
|
|
+ for(FormData fd:this.formDataList){
|
|
|
if(fd.verify()){
|
|
|
Formula formula =fd.getFormula();
|
|
|
String f=formula.getFormula();
|
|
|
if(Func.isNotBlank(f)){
|
|
|
/*聚合运算*/
|
|
|
polymerization();
|
|
|
- Map<String, Object> currentMap = new HashMap<>(this.env.constantMap);
|
|
|
+ Map<String, Object> currentMap = new HashMap<>(this.constantMap);
|
|
|
List<String> relyList = fd.getFormula().getRelyList();
|
|
|
if(CollectionUtil.isNotEmpty(relyList)){
|
|
|
- List<FormData> ele = this.env.formDataList.stream().filter(e->relyList.contains(e.getCode())).collect(Collectors.toList());
|
|
|
+ List<FormData> ele = this.formDataList.stream().filter(e->relyList.contains(e.getCode())).collect(Collectors.toList());
|
|
|
if(ele.size()<relyList.size()){
|
|
|
System.out.println("不满足依赖要求");
|
|
|
}
|
|
@@ -313,7 +311,7 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
|
|
|
List<LocalVariable> local= new ArrayList<>();
|
|
|
while (cda.hasNext()){
|
|
|
LinkedHashMap<String,ElementData> tip= cda.next();
|
|
|
- Map<String, Object> variable = new HashMap<>(this.env.constantMap);
|
|
|
+ Map<String, Object> variable = new HashMap<>(this.constantMap);
|
|
|
Map<String,Object> E=getMap(variable,"E");
|
|
|
for(Map.Entry<String,ElementData> se:tip.entrySet()){
|
|
|
E.put(se.getKey(),se.getValue().getValue());
|
|
@@ -321,7 +319,7 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
|
|
|
local.add(new LocalVariable(0,f,variable));
|
|
|
}
|
|
|
if(local.size()>0){
|
|
|
- List<Object> values = slice( local,this.env.constantMap,f);
|
|
|
+ List<Object> values = slice( local,this.constantMap,f);
|
|
|
if(values.size()>fd.getValues().size()){
|
|
|
/*当生成的数据超过实际容量的时候,会自动合并到第一个单元格*/
|
|
|
fd.getValues().get(0).setValue(values.stream().filter(Func::isNotEmpty).map(StringUtils::handleNull).collect(Collectors.joining("、")));
|
|
@@ -382,7 +380,7 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
|
|
|
|
|
|
@Override
|
|
|
public void format() {
|
|
|
- for(FormData fd:this.env.formDataList){
|
|
|
+ for(FormData fd:this.formDataList){
|
|
|
if(fd.verify()){
|
|
|
/*保留小数位*/
|
|
|
Formula f = fd.getFormula();
|
|
@@ -510,7 +508,7 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
|
|
|
* 先把公式脚本需要聚合部分预处理
|
|
|
* */
|
|
|
public void polymerization(){
|
|
|
- for(FormData fd:this.env.formDataList){
|
|
|
+ for(FormData fd:this.formDataList){
|
|
|
Formula formula = fd.getFormula();
|
|
|
if(Func.isNotEmpty(formula)){
|
|
|
String f=formula.getFormula();
|
|
@@ -522,17 +520,27 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
|
|
|
/*聚合*/
|
|
|
Matcher m = POLY.matcher(f);
|
|
|
while (m.find()) {
|
|
|
- Map<String, Object> currentMap = new HashMap<>(this.env.constantMap);
|
|
|
- List<String> relyList = fd.getFormula().getRelyList();
|
|
|
- List<FormData> tmp = this.env.formDataList.stream().filter(e -> relyList.contains(e.getCode())).collect(Collectors.toList());
|
|
|
- Map<String, Object> E = getMap(currentMap, "E");
|
|
|
- tmp.forEach(e -> E.put(e.getCode(), e.getValues().stream().map(ElementData::getValue).collect(Collectors.toList())));
|
|
|
- Object data = Expression.parse(CustomFunction.CLASS_CALL + m.group()).calculate(currentMap);
|
|
|
-// if(StringUtils.isNotEmpty(data)) {
|
|
|
-// data = CustomFunction.setScale(data, StringUtils.getScale(data));
|
|
|
-// }
|
|
|
+ Object data=null;
|
|
|
+ if(f.contains("quantity(")){
|
|
|
+ String s = m.group(1).replace("'","");
|
|
|
+ Map<String,List<Map<String,Object>>> tmap= (Map<String, List<Map<String, Object>>>) this.constantMap.getOrDefault("tmap",new HashMap<>());
|
|
|
+ List<Map<String,Object>> tableColKeyVal= tmap.get(s);
|
|
|
+ if(Func.isNotEmpty(tableColKeyVal)){
|
|
|
+ data = tableColKeyVal.stream().map(map->{RangeInfo rangeInfo=BeanUtil.toBean((Map) map.get("val"), RangeInfo.class);return rangeInfo.getSize();}).collect(Collectors.toList());
|
|
|
+ }else{
|
|
|
+ /*手动计算*/
|
|
|
+ System.out.println("");
|
|
|
+ }
|
|
|
+ }else{
|
|
|
+ Map<String, Object> currentMap = new HashMap<>(this.constantMap);
|
|
|
+ List<String> relyList = fd.getFormula().getRelyList();
|
|
|
+ List<FormData> tmp = this.formDataList.stream().filter(e -> relyList.contains(e.getCode())).collect(Collectors.toList());
|
|
|
+ Map<String, Object> E = getMap(currentMap, "E");
|
|
|
+ tmp.forEach(e -> E.put(e.getCode(), e.getValues().stream().map(ElementData::getValue).collect(Collectors.toList())));
|
|
|
+ data = Expression.parse(CustomFunction.CLASS_CALL + m.group()).calculate(currentMap);
|
|
|
+ }
|
|
|
String key ="HA"+HashUtil.identityHashCode(data);
|
|
|
- this.env.constantMap.put(key,data);
|
|
|
+ this.constantMap.put(key,data);
|
|
|
f = f.replace(CustomFunction.CLASS_CALL + m.group(), key);
|
|
|
fd.getFormula().setFormula(f);
|
|
|
/*更新依赖*/
|