Kaynağa Gözat

中间计量公式

yangyj 1 yıl önce
ebeveyn
işleme
85a3410c59

+ 4 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/SubprojectInterimPaymentSummary.java

@@ -2,6 +2,7 @@ package org.springblade.manager.vo;
 
 import com.alibaba.fastjson.annotation.JSONField;
 import lombok.Data;
+import org.springblade.core.tool.utils.StringPool;
 
 import javax.validation.constraints.NotNull;
 import java.math.BigDecimal;
@@ -56,6 +57,9 @@ public class SubprojectInterimPaymentSummary {
     /**比例*/
     @JSONField(name = "key_11",label="比例",ordinal = 11)
     private String payRatio;
+    /**第n页 共m页*/
+    @JSONField(name = "key_12",label="页码",ordinal = 101)
+    private String pageCount;
 
     public SubprojectInterimPaymentSummary(String itemName) {
         this.itemName = itemName;

+ 36 - 7
blade-service/blade-manager/src/main/java/com/mixsmart/utils/FormulaUtils.java

@@ -54,6 +54,7 @@ import org.springblade.manager.vo.BaseInfo;
 import org.springblade.manager.vo.InterimPaymentCertificate;
 import org.springblade.manager.vo.MeterTree;
 import org.springblade.manager.vo.WbsFormElementVO;
+import org.springframework.core.annotation.AnnotationUtils;
 import reactor.core.publisher.Mono;
 
 import java.awt.*;
@@ -361,6 +362,26 @@ public class FormulaUtils {
         return vos;
     }
 
+    public static String getEleKey(Class<?> clazz, String fieldName){
+        try {
+            Field field = clazz.getDeclaredField(fieldName);
+            String TBN = (String)  clazz.getField(TBN_FN).get(null);
+            JSONField jf = AnnotationUtils.findAnnotation(field, JSONField.class);
+            if (jf != null) {
+                return TBN+StringPool.COLON+jf.name();
+            }
+        } catch (Exception e) {
+           e.printStackTrace();
+        }
+        return StringPool.EMPTY;
+    }
+
+
+    /*获取指定模型的页码元素*/
+    public static String getPageCode(Class<?> clazz){
+        return getEleKey(clazz,"pageCount");
+    }
+
     /*根据数据模型实例生成带数据的元素,用于修改*/
     public static <T> LinkedHashMap<String,FormData> toFormDataMap(T bean){
         LinkedHashMap<String,FormData> result = new LinkedHashMap<>();
@@ -434,14 +455,22 @@ public class FormulaUtils {
     /*数据模型按字段生成内容获取函数*/
     public static <T> Map<String,Function<T,Object>> functionMapBuilder(Class<?> clazz){
         Map<String, Function<T, Object>> functionMap = new HashMap<>();
-        for (Field field : clazz.getDeclaredFields()) {
-            JSONField jf = field.getAnnotation(JSONField.class);
-            if(jf!=null) {
-                String key = TBN_FN+ StringPool.COLON +jf.name();
-                String fieldName = field.getName();
-                Function<T, Object> function = getFunction(clazz, fieldName);
-                functionMap.put(key, function);
+        try {
+            String tbn=clazz.getField(TBN_FN).get(null).toString();
+            for (Field field : clazz.getDeclaredFields()) {
+                JSONField jf = field.getAnnotation(JSONField.class);
+                if(jf!=null) {
+                    /*ordinal<=100的情况下才会生成动态行字段输出函数*/
+                    if(jf.ordinal()<=100) {
+                        String key = tbn + StringPool.COLON + jf.name();
+                        String fieldName = field.getName();
+                        Function<T, Object> function = getFunction(clazz, fieldName);
+                        functionMap.put(key, function);
+                    }
+                }
             }
+        }catch (Exception e){
+            e.printStackTrace();
         }
         return functionMap;
     }

+ 3 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/controller/FormulaBaseController.java

@@ -46,6 +46,7 @@ public class FormulaBaseController extends BladeController {
     @ApiOperationSupport(order = 4)
     @ApiOperation(value = "新增或修改", notes = "传入")
     public R save(FormulaBase fb) {
+        this.service.clearCache();
         return R.status(service.save(fb));
     }
 
@@ -56,6 +57,7 @@ public class FormulaBaseController extends BladeController {
     @ApiOperationSupport(order = 5)
     @ApiOperation(value = "修改", notes = "传入脚本")
     public R update(FormulaBase fb) {
+        this.service.clearCache();
         return R.status(service.updateById(fb));
     }
 
@@ -87,6 +89,7 @@ public class FormulaBaseController extends BladeController {
         return R.data(this.service.getTypeMap());
     }
 
+
     @GetMapping("/get-file")
     public void getFile(HttpServletResponse response, String url, String pkeyId) throws IOException {
         if (Func.isNotEmpty(pkeyId)) {

+ 15 - 6
blade-service/blade-manager/src/main/java/org/springblade/manager/formula/impl/ExecutorMeter.java

@@ -1,6 +1,5 @@
 package org.springblade.manager.formula.impl;
 
-import com.mixsmart.utils.CustomFunction;
 import com.mixsmart.utils.FormulaUtils;
 import com.mixsmart.utils.StringUtils;
 import lombok.Data;
@@ -325,7 +324,7 @@ public class ExecutorMeter extends FormulaExecutor {
              }
             /*数据获取end*/
             /*本期实际支付合计计算*/
-            functionMap.put(InterimPaymentCertificate.TBN+ StringPool.COLON+"key_9",(List<InterimPaymentCertificate> list)-> Collections.singletonList(list.stream().map(InterimPaymentCertificate::getCurrentPeriodPay).mapToDouble(Double::parseDouble).sum()));
+            fieldDataFcMap.put(InterimPaymentCertificate.TBN+ StringPool.COLON+"key_9",(List<InterimPaymentCertificate> list)-> Collections.singletonList(list.stream().map(InterimPaymentCertificate::getCurrentPeriodPay).mapToDouble(Double::parseDouble).sum()));
             /*内容输出*/
             putOut();
         }
@@ -481,8 +480,12 @@ public class ExecutorMeter extends FormulaExecutor {
                 sis.setPayRatio(ratioFc.apply(sis.getCurrentPeriodEndPay(),sis.getChangeMoney()));
                 totalList.add(sis);
             }
+
+
             LinkedHashMap<String,List<SubprojectInterimPaymentSummary>> chapterGroup= totalList.stream().collect(Collectors.groupingBy(e->getPrefix(e.getFormNumber()),LinkedHashMap::new,Collectors.toList()));
             AtomicInteger loop = new AtomicInteger(chapterGroup.size());
+            AtomicInteger pn = new AtomicInteger();
+            List<String> pageList= new ArrayList<>();
             chapterGroup.forEach((k,v)->{
                 int extra=loop.getAndDecrement()>0?1:2;
                 /*每章小结或总结等价一行数据*/
@@ -517,12 +520,17 @@ public class ExecutorMeter extends FormulaExecutor {
                     }
                     dataList.addAll(tmp);
                     tmp.clear();
+                    pn.incrementAndGet();
                 }
             });
+            FormData pageFd = fdm.get(FormulaUtils.getPageCode(SubprojectInterimPaymentSummary.class));
+            String pageTmp="第$1页 共"+pn.get()+"页";
+            pageFd.setValues(IntStream.range(0,pn.get()).boxed().map(i->new ElementData(pageTmp.replace("$1",i.toString()))).collect(Collectors.toList()));
             /*内容输出*/
              putOut();
         }
 
+
         public void subtotal(SubprojectInterimPaymentSummary b,  List<SubprojectInterimPaymentSummary> result ,List<SubprojectInterimPaymentSummary> data){
             b.calculate(data);
             result.add(b);
@@ -744,7 +752,7 @@ public class ExecutorMeter extends FormulaExecutor {
         /*数据模型包含的元素*/
         public LinkedHashMap<String,FormData> fdm;
         /*元素内容输出对应的映射函数*/
-        public Map<String,Function<List<T>,List<Object>>> functionMap;
+        public Map<String,Function<List<T>,List<Object>>> fieldDataFcMap;
         /*获取实际输出行数*/
         public Integer capacity;
         /*输出值*/
@@ -752,7 +760,7 @@ public class ExecutorMeter extends FormulaExecutor {
         /*用实例去构建带有初始化数据的元素*/
         public void  builderFormDatas(T bean){
             fdm = FormulaUtils.toFormDataMap(bean);
-            functionMap =FormulaUtils.fieldDataFcMap(bean.getClass());
+            fieldDataFcMap =FormulaUtils.fieldDataFcMap(bean.getClass());
             capacity=getLineSize(new ArrayList<>(fdm.keySet()));
             tec.getFormDataMap().putAll(fdm);
             dataList=new ArrayList<>();
@@ -760,14 +768,14 @@ public class ExecutorMeter extends FormulaExecutor {
         /*用元类class 创建空元素*/
         public void  builderFormDatas(Class<T> clazz){
             fdm = FormulaUtils.toFormDataMap(clazz);
-            functionMap =FormulaUtils.fieldDataFcMap(clazz);
+            fieldDataFcMap =FormulaUtils.fieldDataFcMap(clazz);
             capacity=getLineSize(new ArrayList<>(fdm.keySet()));
             tec.getFormDataMap().putAll(fdm);
             dataList=new ArrayList<>();
         }
         /*写入对应的元素*/
         public void putOut(){
-            FormulaUtils.put2FormData(fdm,functionMap,dataList);
+            FormulaUtils.put2FormData(fdm, fieldDataFcMap,dataList);
         };
     }
     interface  Special{
@@ -775,6 +783,7 @@ public class ExecutorMeter extends FormulaExecutor {
         boolean ready();
         /**解析数据*/
         void parse();
+
     }
     public ExecutorMeter(TableElementConverter tec) {
         super(tec);

+ 9 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/FormulaBaseService.java

@@ -10,6 +10,8 @@ import org.springblade.manager.mapper.FormulaBaseMapper;
 import org.springblade.manager.vo.FormulaBaseVo;
 import org.springblade.manager.vo.FormulaType;
 import org.springframework.beans.BeanUtils;
+import org.springframework.cache.annotation.CacheEvict;
+import org.springframework.cache.annotation.Cacheable;
 import org.springframework.core.io.Resource;
 import org.springframework.stereotype.Service;
 
@@ -30,6 +32,8 @@ import java.util.stream.Collectors;
  */
 @Service
 public class FormulaBaseService extends BaseServiceImpl<FormulaBaseMapper, FormulaBase> {
+
+    @Cacheable(cacheNames = "formula-base")
     public Map<String, List<FormulaBaseVo>> getTypeMap() {
         List<FormulaBase> list = this.list();
         if (CollectionUtil.isNotEmpty(list)) {
@@ -47,6 +51,11 @@ public class FormulaBaseService extends BaseServiceImpl<FormulaBaseMapper, Formu
         return null;
     }
 
+    @CacheEvict(value = "formula-base")
+    public void clearCache(){
+
+    }
+
     public void download(HttpServletResponse response, String url) throws IOException {
         Resource resource = ResourceUtil.getResource(url);
         if (resource.isFile()) {