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