lfx преди 6 месеца
родител
ревизия
33c9bccc59

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

@@ -0,0 +1,64 @@
+package com.malk.lanyun.entity;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.alibaba.excel.annotation.format.NumberFormat;
+import lombok.Data;
+
+@Data
+public class Budget {
+
+    @ExcelProperty("科目编码")
+    private String kmbm;
+
+    @ExcelProperty("项               目")
+    private String project;
+
+    @NumberFormat("#")
+    @ExcelProperty("1月")
+    private Double january;
+
+    @NumberFormat("#")
+    @ExcelProperty("2月")
+    private String february;
+
+    @NumberFormat("#")
+    @ExcelProperty("3月")
+    private String march;
+
+    @NumberFormat("#")
+    @ExcelProperty("4月")
+    private String april;
+
+    @NumberFormat("#")
+    @ExcelProperty("5月")
+    private String may;
+
+    @NumberFormat("#")
+    @ExcelProperty("6月")
+    private String june;
+
+    @NumberFormat("#")
+    @ExcelProperty("7月")
+    private String july;
+
+    @NumberFormat("#")
+    @ExcelProperty("8月")
+    private String august;
+
+    @NumberFormat("#")
+    @ExcelProperty("9月")
+    private String september;
+
+    @NumberFormat("#")
+    @ExcelProperty("10月")
+    private String october;
+
+    @NumberFormat("#")
+    @ExcelProperty("11月")
+    private String november;
+
+    @NumberFormat("#")
+    @ExcelProperty("12月")
+    private String december;
+
+}

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

@@ -0,0 +1,158 @@
+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.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 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 BudgetListener 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 type;
+    private String yearStr;
+    private String year;
+
+    /**
+     * 如果使用了spring,请使用这个构造方法。每次创建Listener的时候需要把spring管理的类传进来
+     *
+     * @param ydClient
+     */
+    public BudgetListener(YDClient ydClient,String type,String yearStr,String year) {
+        System.out.println("开始解析数据");
+        System.out.println("开始解析数据....");
+        this.ydClient = ydClient;
+        this.type = type;
+        this.yearStr = yearStr;
+        this.year = year;
+    }
+
+    /**
+     * 这个每一条数据解析都会来调用
+     *
+     * @param data
+     *            one row value. Is is same as {@link AnalysisContext#readRowHolder()}
+     * @param context
+     */
+    @Override
+    public void invoke(Budget data, AnalysisContext context) {
+        if(data.getKmbm()==null||data.getKmbm().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"};
+        String totalYearYs="0";
+        for (Budget budget:list){
+            String totalYs="0";
+            String kmdl=budget.getProject().split("-")[0];
+            String kmmc=budget.getProject();
+            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 data=ReflectUtil.invoke(budget, keys[i]);
+                if(data!=null&&!data.equals("")&&!data.equals("0")){
+                    System.out.println("月份:"+i+"科目编码:"+budget.getKmbm()+"数据值:"+data);
+                    totalYs= NumberUtil.add(totalYs,data.replaceAll(",","")).toString();
+                    saveYearAndKmbmAndMonth(data,budget.getKmbm(),yearMonth,yearMonthStr,kmdl,kmmc);
+                }
+            }
+            totalYearYs= NumberUtil.add(totalYs,totalYs).toString();
+            if(!totalYs.equals("0")){
+                saveYearAndKmbm(totalYs,budget.getKmbm(),kmdl,kmmc);
+            }
+        }
+        saveYear(totalYearYs);
+        System.out.println("存储数据库成功!");
+    }
+
+    private void saveYear(String totalYs){
+        Map map=new HashMap();
+        map.put("selectField_lzb398bv",type); //项目/部门(成本分摊)
+        map.put("textField_lw7s6z0x",yearStr); //年度
+        map.put("numberField_lrni7snm",totalYs); // 预算总额
+        map.put("numberField_kuv80spl",totalYs); // 剩余预算
+        ydClient.operateData(YDParam.builder().formUuid("FORM-E0894D05F7124ABE9A633A4580EBBEDEJIJL").appType("APP_ERBDTFS82HOVBPL3NFH0")
+                .systemToken("RRB66F91T97H1WN89QZYC47PKLZO2ZQOUMOQLP").formDataJson(JSON.toJSONString(map)).build(), YDConf.FORM_OPERATION.create);
+    }
+
+    private void saveYearAndKmbm(String totalYs,String kmbm,String kmdl,String kmmc){
+        Map map=new HashMap();
+        map.put("selectField_ly7257rv",type); //项目/部门(成本分摊)
+        map.put("textField_lw7sg8ho",yearStr); //年度文本
+        map.put("dateField_lvxkipwr",year); //年度
+        map.put("textField_lrni7snh",kmbm); // 科目编码
+        map.put("selectField_lw7rawmr",kmdl); // 科目大类
+        map.put("selectField_lw7rawms",kmmc); // 科目名称
+        map.put("numberField_lozfr2gg",totalYs); // 预算总额
+        map.put("numberField_kuv80spl",totalYs); // 剩余预算
+        map.put("selectField_lw8tykcu","可用"); // 状态
+        ydClient.operateData(YDParam.builder().formUuid("FORM-59B17AE6684D4ADBB550671CA20A3562V5C8").appType("APP_ERBDTFS82HOVBPL3NFH0")
+                .systemToken("RRB66F91T97H1WN89QZYC47PKLZO2ZQOUMOQLP").formDataJson(JSON.toJSONString(map)).build(), YDConf.FORM_OPERATION.create);
+    }
+
+    private void saveYearAndKmbmAndMonth(String totalYs,String kmbm,String yearMonth,String yearMonthStr,String kmdl,String kmmc){
+        Map map=new HashMap();
+        map.put("selectField_ly7257rv",type); //项目/部门(成本分摊)
+        map.put("textField_lw7sg8ho",yearStr); //年度
+        map.put("textField_lw7sg8hq",yearMonthStr); //年月文本
+        map.put("dateField_lvxkipwr",yearMonth); // 年月
+        map.put("textField_lrni7snh",kmbm); // 科目编码
+        map.put("selectField_lw7rawmr",kmdl); // 科目大类
+        map.put("selectField_lw7rawms",kmmc); // 科目名称
+        map.put("numberField_lozfr2gg",totalYs); // 预算总额
+        map.put("numberField_kuv80spl",totalYs); // 剩余预算
+        map.put("selectField_lw8tykcu","可用"); // 状态
+        ydClient.operateData(YDParam.builder().formUuid("FORM-9009F2638CD44FED8FF3065B44C78433WH6V").appType("APP_ERBDTFS82HOVBPL3NFH0")
+                .systemToken("RRB66F91T97H1WN89QZYC47PKLZO2ZQOUMOQLP").formDataJson(JSON.toJSONString(map)).build(), YDConf.FORM_OPERATION.create);
+    }
+
+}

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

@@ -0,0 +1,44 @@
+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() {
+    }
+}

+ 31 - 0
mjava-lanyun/src/test/java/ysTest.java

@@ -0,0 +1,31 @@
+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.service.aliwork.YDClient;
+import lombok.extern.slf4j.Slf4j;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.junit4.SpringRunner;
+
+@Slf4j
+@RunWith(SpringRunner.class)
+@SpringBootTest(classes = Boot.class)
+public class ysTest {
+
+    @Autowired
+    private YDClient ydClient;
+
+    @Test
+    public void test(){
+        String fileName = "/home/lanyunys - 副本.xlsx";
+        // 这里默认读取第一个sheet
+        EasyExcel.read(fileName, Budget.class, new BudgetListener(ydClient,"测试","2048","2147512448000")).sheet().headRowNumber(3).doRead();
+//        EasyExcel.read(fileName,new NoModleDataListener()).sheet().headRowNumber(3).doRead();
+    }
+
+
+}