|
@@ -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);
|
|
|
+ }
|
|
|
+
|
|
|
+}
|