Sfoglia il codice sorgente

预算导入添加项目点

lfx 8 mesi fa
parent
commit
6163848e8a

+ 7 - 2
mjava-lanyun/src/main/java/com/malk/lanyun/controller/YdYsController.java

@@ -7,6 +7,7 @@ import com.alibaba.excel.EasyExcel;
 import com.alibaba.fastjson.JSONObject;
 import com.malk.lanyun.entity.Budget;
 import com.malk.lanyun.listener.BudgetListener;
+import com.malk.lanyun.listener.BudgetListenerForProject;
 import com.malk.server.common.McException;
 import com.malk.server.common.McR;
 import com.malk.service.aliwork.YDClient;
@@ -34,12 +35,16 @@ public class YdYsController {
     @PostMapping("saveYsDataByFile")
     public McR saveYsDataByFile(@RequestBody JSONObject param) {
         log.info("解析预算文件,入参: {} ", param);
-        McException.assertParamException_Null(param,"url","type","yearStr","year");
+        McException.assertParamException_Null(param,"url","type","yearStr","year","importType");
         String id= UUID.randomUUID().toString();
         String fileName = "/home/"+id+".xlsx";
         String url=ydClient.convertTemporaryUrl(param.getString("url"));
         HttpUtil.downloadFile(url,fileName);
-        EasyExcel.read(fileName, Budget.class, new BudgetListener(ydClient,param.getString("type"),param.getString("yearStr"),param.getString("year"))).sheet().headRowNumber(3).doRead();
+        if(param.getString("importType").equals("项目点")){
+            EasyExcel.read(fileName, Budget.class, new BudgetListenerForProject(ydClient,param.getString("type"),param.getString("yearStr"))).sheet().headRowNumber(3).doRead();
+        }else{
+            EasyExcel.read(fileName, Budget.class, new BudgetListener(ydClient,param.getString("type"),param.getString("yearStr"),param.getString("year"))).sheet().headRowNumber(3).doRead();
+        }
         FileUtil.del(fileName);
         return McR.success();
     }

+ 3 - 0
mjava-lanyun/src/main/java/com/malk/lanyun/entity/Budget.java

@@ -10,6 +10,9 @@ public class Budget {
     @ExcelProperty("科目编码")
     private String kmbm;
 
+    @ExcelProperty("类型")
+    private String type;
+
     @ExcelProperty("项               目")
     private String project;
 

+ 0 - 1
mjava-lanyun/src/main/java/com/malk/lanyun/listener/BudgetListener.java

@@ -10,7 +10,6 @@ import com.malk.lanyun.entity.Budget;
 import com.malk.server.aliwork.YDConf;
 import com.malk.server.aliwork.YDParam;
 import com.malk.service.aliwork.YDClient;
-import com.malk.utils.UtilDateTime;
 import com.malk.utils.UtilMap;
 
 import java.time.LocalDate;

+ 166 - 0
mjava-lanyun/src/main/java/com/malk/lanyun/listener/BudgetListenerForProject.java

@@ -0,0 +1,166 @@
+package com.malk.lanyun.listener;
+
+import cn.hutool.core.util.NumberUtil;
+import cn.hutool.core.util.ReflectUtil;
+import com.alibaba.excel.context.AnalysisContext;
+import com.alibaba.excel.event.AnalysisEventListener;
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.malk.lanyun.entity.Budget;
+import com.malk.server.aliwork.YDConf;
+import com.malk.server.aliwork.YDParam;
+import com.malk.service.aliwork.YDClient;
+import com.malk.utils.UtilMap;
+
+import java.time.LocalDate;
+import java.time.ZoneOffset;
+import java.time.format.DateTimeFormatter;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+public class BudgetListenerForProject extends AnalysisEventListener<Budget> {
+
+    /**
+     * 每隔5条存储数据库,实际使用中可以3000条,然后清理list ,方便内存回收
+     */
+    private static final int BATCH_COUNT = 5;
+    List<Budget> list = new ArrayList<Budget>();
+    /**
+     * 假设这个是一个DAO,当然有业务逻辑这个也可以是一个service。当然如果不用存储这个对象没用。
+     */
+    private YDClient ydClient;
+    private String projectId;
+    private String yearStr;
+
+    /**
+     * 如果使用了spring,请使用这个构造方法。每次创建Listener的时候需要把spring管理的类传进来
+     *
+     * @param ydClient
+     */
+    public BudgetListenerForProject(YDClient ydClient, String projectId, String yearStr) {
+        System.out.println("开始解析数据");
+        System.out.println("开始解析数据....");
+        this.ydClient = ydClient;
+        this.projectId = projectId;
+        this.yearStr = yearStr;
+    }
+
+    /**
+     * 这个每一条数据解析都会来调用
+     *
+     * @param data
+     *            one row value. Is is same as {@link AnalysisContext#readRowHolder()}
+     * @param context
+     */
+    @Override
+    public void invoke(Budget data, AnalysisContext context) {
+        if(data.getType()==null||data.getType().equals("")){
+            return;
+        }
+        System.out.println("解析到一条数据:"+ JSON.toJSONString(data));
+        list.add(data);
+        // 达到BATCH_COUNT了,需要去存储一次数据库,防止数据几万条数据在内存,容易OOM
+//        if (list.size() >= BATCH_COUNT) {
+//            saveData();
+//            // 存储完成清理 list
+//            list.clear();
+//        }
+    }
+
+    /**
+     * 所有数据解析完成了 都会来调用
+     *
+     * @param context
+     */
+    @Override
+    public void doAfterAllAnalysed(AnalysisContext context) {
+        // 这里也要保存数据,确保最后遗留的数据也存储到数据库
+        saveData();
+        System.out.println("所有数据解析完成!");
+    }
+
+    /**
+     * 加上存储数据库
+     */
+    private void saveData() {
+        System.out.println(list.size()+"条数据,开始存储数据库!");
+
+        String[] keys={"getJanuary","getFebruary","getMarch","getApril","getMay","getJune","getJuly","getAugust","getSeptember","getOctober","getNovember","getDecember"};
+        List<Map> resultdata=new ArrayList<>();
+        for (int i = 0; i < 12; i++) {
+            LocalDate date=LocalDate.of(Integer.parseInt(yearStr),i+1,1);
+            String yearMonthStr=date.format(DateTimeFormatter.ofPattern("yyyy-MM"));
+            String yearMonth= String.valueOf(date.atStartOfDay().toInstant(ZoneOffset.of("+8")).toEpochMilli());
+            String type1="0",type2="0",type3="0",type4="0";// 收入、人工、材料、其他
+            for (Budget budget:list){
+                String data=ReflectUtil.invoke(budget, keys[i]);
+                if(data!=null&&!data.equals("")&&!data.equals("0")){
+                    System.out.println("月份:"+i+"类型:"+budget.getType()+"数据值:"+data);
+                    switch (budget.getType()){
+                        case "收入":
+                            type1= NumberUtil.add(type1,data).toString();
+                            break;
+                        case "人工成本":
+                            type2= NumberUtil.add(type2,data).toString();
+                            break;
+                        case "材料费":
+                            type3= NumberUtil.add(type3,data).toString();
+                            break;
+                        case "其他":
+                            type4= NumberUtil.add(type4,data).toString();
+                            break;
+                        default:
+                            break;
+                    }
+                }
+            }
+            resultdata.add(UtilMap.map("yearMonth, type1, type2, type3, type4",yearMonth,type1,type2,type3,type4));
+        }
+        saveData(resultdata);
+        System.out.println("存储数据库成功!");
+    }
+
+    private void saveData(List<Map> resultdata){
+        List<Map> list=(List<Map>) ydClient.queryData(YDParam.builder().formUuid("FORM-97BA6C6C8C50416A9E5854F2F4B5C3F3R4WC").appType("APP_ERBDTFS82HOVBPL3NFH0")
+                .systemToken("RRB66F91T97H1WN89QZYC47PKLZO2ZQOUMOQLP").searchCondition(JSONObject.toJSONString(UtilMap.map("textField_ltxrn8h1",projectId))).build(),
+                YDConf.FORM_QUERY.retrieve_list_all).getData();
+        System.out.println(list.size());
+        if(list==null||list.size()<1){
+            return;
+        }
+        Map data=list.get(0);
+        String formInstId=UtilMap.getString(data,"formInstanceId");
+        List<Map> table=UtilMap.getList(UtilMap.getMap(data,"formData"),"tableField_lrru2tnq");
+        Map<String,Map> tableMap=new HashMap<>();
+        for (int i = 0; i < table.size(); i++) {
+            Map map=table.get(i);
+            map.put("index",i);
+            tableMap.put(UtilMap.getString(map,"dateField_lrru2tnr"),map);
+        }
+        for (Map map:resultdata){
+            String yearMonth = UtilMap.getString(map,"yearMonth");
+            if(tableMap.containsKey(yearMonth)){
+                Map detail=tableMap.get(yearMonth);
+                table.get(UtilMap.getInt(detail,"index")).put("numberField_lrru2tns",map.get("type1")); // 收入定额
+                table.get(UtilMap.getInt(detail,"index")).put("numberField_lrru2tnt",map.get("type2")); // 人工定额
+                table.get(UtilMap.getInt(detail,"index")).put("numberField_lrru2tnu",map.get("type3")); // 物耗定额
+                table.get(UtilMap.getInt(detail,"index")).put("numberField_lrru2tnx",map.get("type4")); // 其他定额
+            }else{
+                Map detail=new HashMap();
+                detail.put("dateField_lrru2tnr",yearMonth);
+                detail.put("numberField_lrru2tns",map.get("type1")); // 收入定额
+                detail.put("numberField_lrru2tnt",map.get("type2")); // 人工定额
+                detail.put("numberField_lrru2tnu",map.get("type3")); // 物耗定额
+                detail.put("numberField_lrru2tnx",map.get("type4")); // 其他定额
+                table.add(detail);
+            }
+        }
+        System.out.println(JSONObject.toJSONString(table));
+        ydClient.operateData(YDParam.builder().formUuid("FORM-97BA6C6C8C50416A9E5854F2F4B5C3F3R4WC").appType("APP_ERBDTFS82HOVBPL3NFH0")
+                .systemToken("RRB66F91T97H1WN89QZYC47PKLZO2ZQOUMOQLP").updateFormDataJson(JSON.toJSONString(UtilMap.map("tableField_lrru2tnq",table))).formInstanceId(formInstId)
+                .build(), YDConf.FORM_OPERATION.update);
+    }
+
+}

+ 0 - 44
mjava-lanyun/src/main/java/com/malk/lanyun/listener/NoModleDataListener.java

@@ -1,44 +0,0 @@
-package com.malk.lanyun.listener;
-
-import com.alibaba.excel.context.AnalysisContext;
-import com.alibaba.excel.event.AnalysisEventListener;
-import com.alibaba.fastjson.JSON;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-
-/**
- * 直接用map接收数据
- *
- * @author Jiaju Zhuang
- */
-public class NoModleDataListener extends AnalysisEventListener<Map<Integer, String>> {
-    /**
-     * 每隔5条存储数据库,实际使用中可以3000条,然后清理list ,方便内存回收
-     */
-    private static final int BATCH_COUNT = 5;
-    List<Map<Integer, String>> list = new ArrayList<Map<Integer, String>>();
-
-    @Override
-    public void invoke(Map<Integer, String> data, AnalysisContext context) {
-        System.out.println("解析到一条数据:"+ JSON.toJSONString(data));
-        System.out.println(JSON.toJSONString(context));
-        list.add(data);
-        if (list.size() >= BATCH_COUNT) {
-            saveData();
-            list.clear();
-        }
-    }
-
-    @Override
-    public void doAfterAllAnalysed(AnalysisContext context) {
-        saveData();
-    }
-
-    /**
-     * 加上存储数据库
-     */
-    private void saveData() {
-    }
-}

+ 6 - 3
mjava-lanyun/src/test/java/ysTest.java

@@ -4,7 +4,7 @@ import com.alibaba.excel.EasyExcel;
 import com.malk.lanyun.Boot;
 import com.malk.lanyun.entity.Budget;
 import com.malk.lanyun.listener.BudgetListener;
-import com.malk.lanyun.listener.NoModleDataListener;
+import com.malk.lanyun.listener.BudgetListenerForProject;
 import com.malk.service.aliwork.YDClient;
 import lombok.extern.slf4j.Slf4j;
 import org.junit.Test;
@@ -28,9 +28,12 @@ public class ysTest {
         String url=ydClient.convertTemporaryUrl("/ossFileHandle?appType=APP_ERBDTFS82HOVBPL3NFH0&fileName=APP_ERBDTFS82HOVBPL3NFH0_MDk1MzU4MDE2Ni0xNDE2MzIxNDg1XzlFQTY2OUQxMzFRUUgxWEI4MUJWWjc3ODE3TTcyWVIwQTE3NE1USg$$.xlsx&instId=&type=download");
         HttpUtil.downloadFile(url,fileName);
         EasyExcel.read(fileName, Budget.class, new BudgetListener(ydClient,"测试","2048","2147512448000")).sheet().headRowNumber(3).doRead();
-//        EasyExcel.read(fileName,new NoModleDataListener()).sheet().headRowNumber(3).doRead();
-
+    }
 
+    @Test
+    public void test2(){
+        String fileName = "/home/lanyunys预算模版信息部.xlsx";
+        EasyExcel.read(fileName, Budget.class, new BudgetListenerForProject(ydClient,"PM99006","2024")).sheet().headRowNumber(3).doRead();
     }