Преглед изворни кода

新增导出季度核算表接口 新增季度核算表模板

wzy пре 1 година
родитељ
комит
2b897ea734

+ 23 - 1
mjava-zhixingtongde/src/main/java/com/malk/zhixingtongde/controller/ZxtdReportConroller.java

@@ -1,11 +1,24 @@
 package com.malk.zhixingtongde.controller;
 
+import cn.hutool.core.date.DateUtil;
+import com.alibaba.fastjson.JSONObject;
+import com.malk.server.aliwork.YDConf;
+import com.malk.server.aliwork.YDParam;
 import com.malk.server.common.McR;
+import com.malk.service.aliwork.YDClient;
+import com.malk.utils.UtilMap;
+import com.malk.zhixingtongde.entity.Profit;
 import com.malk.zhixingtongde.service.ZxtdReportService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
 import javax.servlet.http.HttpServletResponse;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
 
 @RestController
 @CrossOrigin
@@ -15,9 +28,12 @@ public class ZxtdReportConroller {
     @Autowired
     private ZxtdReportService zxtdReportService;
 
+    @Autowired
+    private YDClient ydClient;
+
     @GetMapping("/test")
     public McR test(){
-       return McR.success();
+        return McR.success();
     }
 
     @GetMapping("/exportProfit")
@@ -25,5 +41,11 @@ public class ZxtdReportConroller {
         zxtdReportService.exportProfit(response,year);
     }
 
+    @GetMapping("/exportQuarterProfit")
+    public void exportQuarterProfit(HttpServletResponse response,String year){
+        zxtdReportService.exportQuarterProfit(response,year);
+    }
+
+
 
 }

+ 19 - 0
mjava-zhixingtongde/src/main/java/com/malk/zhixingtongde/entity/Profit.java

@@ -21,6 +21,19 @@ public class Profit {
     private String amt12;
     private String totalAmt;
 
+    //季度金额
+    private String quarterAmt1;
+    private String quarterAmt2;
+    private String quarterAmt3;
+    private String quarterAmt4;
+
+    //季度预算
+    private String quarterBudget1;
+    private String quarterBudget2;
+    private String quarterBudget3;
+    private String quarterBudget4;
+    private String totalBudget;
+
     public Profit(String subject){
         this.subject=subject;
     }
@@ -33,4 +46,10 @@ public class Profit {
         this.totalAmt= NumberUtil.add(amt1,amt2,amt3,amt4,amt5,amt6,amt7,amt8,amt9,amt10,amt11,amt12).toString();
         return this;
     }
+
+    public Profit buildTotalBudget(){
+        this.totalBudget= NumberUtil.add(quarterAmt1,quarterBudget2,quarterBudget3,quarterBudget4).toString();
+            return this;
+    }
+
 }

+ 1 - 0
mjava-zhixingtongde/src/main/java/com/malk/zhixingtongde/service/ZxtdReportService.java

@@ -6,4 +6,5 @@ public interface ZxtdReportService {
 
     void exportProfit(HttpServletResponse response,String year);
 
+    void exportQuarterProfit(HttpServletResponse response, String year);
 }

+ 228 - 4
mjava-zhixingtongde/src/main/java/com/malk/zhixingtongde/service/impl/ZxtdReportServiceImpl.java

@@ -1,5 +1,6 @@
 package com.malk.zhixingtongde.service.impl;
 
+import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.util.NumberUtil;
 import cn.hutool.core.util.ReflectUtil;
 import cn.hutool.core.util.StrUtil;
@@ -17,10 +18,9 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
 import javax.servlet.http.HttpServletResponse;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.*;
 
 @Slf4j
 @Service
@@ -37,6 +37,8 @@ public class ZxtdReportServiceImpl implements ZxtdReportService {
         if (UtilEnv.getActiveProfile().equals(UtilEnv.ENV_PROD)) {
             formUuid.put("PROFIT", "FORM-32937639BC314882AF45201131EAE4C0YD2L"); // 利润表
             formUuid.put("DOMAIN", "https://nxcyz4.aliwork.com/"); // 宜搭域名
+            formUuid.put("BUDGET","FORM-A0B077B5775341869605B2EB7E79356A7ZX7");// 成本费用预算编制中间表
+            formUuid.put("INCOME_BUDGET","FORM-3563C85B564345C4B2931CB27AE768C6CE73");// 收入预算编制中间表
         } else {
             formUuid.put("DOMAIN", "https://nxcyz4.aliwork.com/");
         }
@@ -71,6 +73,47 @@ public class ZxtdReportServiceImpl implements ZxtdReportService {
         UtilExcel.exportMapAndListByTemplate(response,mainData,dataList, Profit.class, "利润", "Template_profit.xlsx");
     }
 
+    @Override
+    public void exportQuarterProfit(HttpServletResponse response, String year) {
+        // 1.获取宜搭数据
+        Profit[] PROFIT_SUM=new Profit[5];// 分类小计数据
+        List<Profit> dataList=getQuarterData(year,PROFIT_SUM);
+        // 计算主数据
+        Map mainData=new HashMap();
+        mainData.put("year",year);
+        // 计算费用合计 与 净利润
+        String payQuarterTotalKey="payQuarterTotalAmt";
+        String payQuarterTotalAmtTotal="0";
+        String payBudgetQuarterTotalKey="payBudgetQuarterTotalAmt";
+        String payBudgetQuarterTotalAmtTotal="0";
+        String netQuarterProfitKey="netQuarterProfitAmt";
+        String netQuarterProfitTotal="0";
+        String netBudgetQuarterProfitKey="netBudgetQuarterProfitAmt";
+        String netBudgetQuarterProfitTotal="0";
+
+        for (int i = 1; i < 5; i++) {
+            // 费用合计
+            String quarterAmt=addQuarterAmt(PROFIT_SUM,1,4,i);// 第一位数据是收入,不参与计算
+            String budgetQuarterAmt=addBudgetQuarterAmt(PROFIT_SUM,1,4,i);// 第一位数据是收入,不参与计算
+            mainData.put(payQuarterTotalKey+i,quarterAmt);
+            mainData.put(payBudgetQuarterTotalKey+i,budgetQuarterAmt);
+            payQuarterTotalAmtTotal=NumberUtil.add(quarterAmt,payQuarterTotalAmtTotal).toString();
+            payBudgetQuarterTotalAmtTotal=NumberUtil.add(budgetQuarterAmt,payBudgetQuarterTotalAmtTotal).toString();
+            // 净利润
+            String net=subQuarterAmt(PROFIT_SUM,1,4,i);
+            String budgetNet=subBudgetQuarterAmt(PROFIT_SUM,1,4,i);
+            mainData.put(netQuarterProfitKey+i,net);
+            mainData.put(netBudgetQuarterProfitKey+i,budgetNet);
+            netQuarterProfitTotal=NumberUtil.add(netQuarterProfitTotal,net).toString();
+            netBudgetQuarterProfitTotal=NumberUtil.add(netBudgetQuarterProfitTotal,budgetNet).toString();
+        }
+        mainData.put("payQuarterTotalAmtTotal",payQuarterTotalAmtTotal);
+        mainData.put("payBudgetQuarterTotalAmtTotal",payBudgetQuarterTotalAmtTotal);
+        mainData.put("netQuarterProfitTotal",netQuarterProfitTotal);
+        mainData.put("netBudgetQuarterProfitTotal",netBudgetQuarterProfitTotal);
+        UtilExcel.exportMapAndListByTemplate(response,mainData,dataList, Profit.class, "季度利润", "Quarter_Template_profit.xlsx");
+    }
+
     // 按月获取利润表数据
     private List<Profit> getData(String year,Profit[] PROFIT_SUM){
         // 查询宜搭底表数据
@@ -136,6 +179,148 @@ public class ZxtdReportServiceImpl implements ZxtdReportService {
         return profitList;
     }
 
+    private List<Profit> getQuarterData(String year,Profit[] PROFIT_SUM){
+        // 查询宜搭底表数据
+        List<Map> list = (List<Map>) ydClient.queryData(YDParam.builder().formUuid(_matchFormUuid("PROFIT")).searchCondition(
+                JSONObject.toJSONString(UtilMap.map("textField_lqvp89br",year))
+        ).build(), YDConf.FORM_QUERY.retrieve_list).getData();
+        Map<String,Map<String,Profit>> dataMap=new HashMap<>();
+        // 数据预处理(金额数据累加,根据 类型,科目,年月)
+        for (Map map:list){
+            JSONObject formData=JSONObject.parseObject(String.valueOf(map.get("formData")));
+            String classify=formData.getString("textField_lqvp89bt");// 类型
+            String subject=formData.getString("textField_lqvp89bu");// 科目
+            String amt=formData.getString("numberField_lqqhf8yn");// 金额
+            String date=formData.getString("textField_lqvp89br");// 年月 2024-01
+            String month=date.split("-")[1].replaceFirst("^0+(?!$)", "");// 月份(去除前缀0)
+            // 数据累加
+            if(dataMap.containsKey(classify)){
+                Map<String,Profit> classifyMap=dataMap.get(classify);
+                if(classifyMap.containsKey(subject)){
+                    Profit profit=classifyMap.get(subject);
+                    // 获取已有数据
+                    String amtTemp=ReflectUtil.invoke(profit,"getAmt"+month);
+                    ReflectUtil.invoke(profit, "setAmt"+month, NumberUtil.add(amt,amtTemp).toString());
+                    dataMap.get(classify).put(subject, profit);
+                }else{
+                    Profit profit=new Profit(subject);
+                    ReflectUtil.invoke(profit, "setAmt"+month, amt);
+                    dataMap.get(classify).put(subject,profit);
+                }
+            }else{
+                Profit profit=new Profit(subject);
+                ReflectUtil.invoke(profit, "setAmt"+month, amt);
+                Map<String,Profit> classifyMap=new HashMap<>();
+                classifyMap.put(subject,profit);
+                dataMap.put(classify,classifyMap);
+            }
+        }
+        List<Profit> profitList=new ArrayList<>();
+        Profit nullProfit=new Profit();
+        // 根据 类型 处理数据
+        for (int i = 0; i < PROFIT_CLASSIFYS.length; i++) {
+            List<Profit> list1=new ArrayList<>();
+            Profit totalProfit=new Profit(PROFIT_CLASSIFYS[i]+(i==0?"合计":"小计"));
+            if(dataMap.containsKey(PROFIT_CLASSIFYS[i])){
+                for (String str:dataMap.get(PROFIT_CLASSIFYS[i]).keySet()){
+                    List<Map> budgetList = new ArrayList<>();
+                    Date date = new Date();
+                    try {
+                        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
+                        date = dateFormat.parse(year + "-01-01");
+                    }catch (ParseException e){
+                        throw new RuntimeException(e);
+                    }
+                    long beginDate = DateUtil.beginOfYear(date).getTime();
+                    long endDate = DateUtil.endOfYear(date).getTime();
+                    String dateParam = "[" + beginDate + "," + endDate + "]";
+                    Integer quarterBudgetAmt = 0;
+                    int index = 1;
+                    if ("收入".equals(PROFIT_CLASSIFYS[i])){
+                        // 获取科目季度收入预算金额
+                        budgetList = (List<Map>) ydClient.queryData(YDParam.builder().formUuid(_matchFormUuid("INCOME_BUDGET")).searchCondition(
+                                JSONObject.toJSONString(UtilMap.map("selectField_lpax809x, selectField_lptilhxv, dateField_lp83xrh9",String.join(", ",str,"季度",dateParam)))
+                        ).build(), YDConf.FORM_QUERY.retrieve_list).getData();
+                        for (Map map : budgetList) {
+                            Map formData = (Map) map.get("formData");
+                            Integer budget = (Integer) formData.get("numberField_lp83xrhm");
+                            String quarter = formData.get("selectField_lpuyno7x").toString();
+                            quarterBudgetAmt += budget;
+                            if (index == budgetList.size()){
+                                switch (quarter){
+                                    case "1月-3月":dataMap.get(PROFIT_CLASSIFYS[i]).get(str).setQuarterBudget1(quarterBudgetAmt.toString());break;
+                                    case "4月-6月":dataMap.get(PROFIT_CLASSIFYS[i]).get(str).setQuarterBudget2(quarterBudgetAmt.toString());break;
+                                    case "7月-9月":dataMap.get(PROFIT_CLASSIFYS[i]).get(str).setQuarterBudget3(quarterBudgetAmt.toString());break;
+                                    case "10月-12月":dataMap.get(PROFIT_CLASSIFYS[i]).get(str).setQuarterBudget4(quarterBudgetAmt.toString());break;
+                                }
+                            }
+                            index++;
+                        }
+                    }else {
+                        // 获取科目季度支出预算金额
+                        budgetList = (List<Map>) ydClient.queryData(YDParam.builder().formUuid(_matchFormUuid("BUDGET")).searchCondition(
+                                JSONObject.toJSONString(UtilMap.map("selectField_lp7ze5jm, selectField_lptilhxv, dateField_lp7ze5kc", String.join(", ",str,"季度",dateParam)))
+                        ).build(), YDConf.FORM_QUERY.retrieve_list).getData();
+                        for (Map map : budgetList) {
+                            Map formData = (Map) map.get("formData");
+                            Integer budget = (Integer) formData.get("numberField_lp7ze5ju");
+                            String quarter = formData.get("selectField_lpuyno7x").toString();
+                            quarterBudgetAmt += budget;
+                            if (index == budgetList.size()){
+                                switch (quarter){
+                                    case "1月-3月":dataMap.get(PROFIT_CLASSIFYS[i]).get(str).setQuarterBudget1(quarterBudgetAmt.toString());break;
+                                    case "4月-6月":dataMap.get(PROFIT_CLASSIFYS[i]).get(str).setQuarterBudget2(quarterBudgetAmt.toString());break;
+                                    case "7月-9月":dataMap.get(PROFIT_CLASSIFYS[i]).get(str).setQuarterBudget3(quarterBudgetAmt.toString());break;
+                                    case "10月-12月":dataMap.get(PROFIT_CLASSIFYS[i]).get(str).setQuarterBudget4(quarterBudgetAmt.toString());break;
+                                }
+                            }
+                            index++;
+                        }
+                    }
+
+                    list1.add(dataMap.get(PROFIT_CLASSIFYS[i]).get(str).buildTotal().buildTotalBudget());
+                    for (int j = 1; j < 13; j++) {
+                        String amtTemp=ReflectUtil.invoke(dataMap.get(PROFIT_CLASSIFYS[i]).get(str),"getAmt"+j);
+                        String amt=ReflectUtil.invoke(totalProfit,"getAmt"+j);
+                        //获取季度利润
+                        String quarterAmtTemp=ReflectUtil.invoke(dataMap.get(PROFIT_CLASSIFYS[i]).get(str),"getQuarterAmt"+((j + 2) / 3));
+                        //月利润累加到季度利润
+                        ReflectUtil.invoke(dataMap.get(PROFIT_CLASSIFYS[i]).get(str), "setQuarterAmt"+((j + 2) / 3), NumberUtil.add(quarterAmtTemp,amtTemp).toString());
+
+                        ReflectUtil.invoke(totalProfit, "setAmt"+j, NumberUtil.add(amt,amtTemp).toString());
+                        //一个季度结束时
+                        if (j % 3 == 0){
+                            //获取原合计/小计季度利润
+                            String quarterAmt=ReflectUtil.invoke(totalProfit,"getQuarterAmt"+((j + 2) / 3));
+                            //获取当前季度利润
+                            quarterAmtTemp=ReflectUtil.invoke(dataMap.get(PROFIT_CLASSIFYS[i]).get(str),"getQuarterAmt"+((j + 2) / 3));
+                            //累加设置给合计/小计季度利润
+                            ReflectUtil.invoke(totalProfit, "setQuarterAmt"+((j + 2) / 3), NumberUtil.add(quarterAmt,quarterAmtTemp).toString());
+                            //获取原合计/小计季度预算
+                            String quarterBudget = ReflectUtil.invoke(totalProfit, "getQuarterBudget" + ((j + 2) / 3)) == null ? "0" : ReflectUtil.invoke(totalProfit, "getQuarterBudget" + ((j + 2) / 3));
+                            //获取当前季度预算
+                            String quarterBudgetTemp = ReflectUtil.invoke(dataMap.get(PROFIT_CLASSIFYS[i]).get(str),"getQuarterBudget"+((j + 2) / 3)) == null ? "0" : ReflectUtil.invoke(dataMap.get(PROFIT_CLASSIFYS[i]).get(str),"getQuarterBudget"+((j + 2) / 3));
+
+                            //累加设置给合计/小计季度预算
+                            ReflectUtil.invoke(totalProfit, "setQuarterBudget"+((j + 2) / 3), NumberUtil.add(quarterBudget,quarterBudgetTemp).toString());
+
+                        }
+
+                    }
+                }
+            }
+            // 补充空数据
+            for (int j = list1.size(); j < PROFIT_NUMBERS[i]; j++) {
+                list1.add(nullProfit);
+            }
+            // 添加小计
+            PROFIT_SUM[i]=totalProfit.buildTotal().buildTotalBudget();
+            list1.add(PROFIT_SUM[i]);
+            profitList.addAll(list1);
+        }
+        return profitList;
+    }
+
     private String addAmt(Profit[] PROFIT_SUM,int start,int end,int i){
         String result="0";
         for (int j = start; j <= end; j++) {
@@ -154,4 +339,43 @@ public class ZxtdReportServiceImpl implements ZxtdReportService {
         }
         return result;
     }
+
+    private String addQuarterAmt(Profit[] PROFIT_SUM,int start,int end,int i){
+        String result="0";
+        for (int j = start; j <= end; j++) {
+            result = NumberUtil.add(result,ReflectUtil.invoke(PROFIT_SUM[j],"getQuarterAmt"+i)).toString();
+        }
+        return result;
+    }
+
+    private String subQuarterAmt(Profit[] PROFIT_SUM,int start,int end,int i){
+        String result=ReflectUtil.invoke(PROFIT_SUM[0],"getQuarterAmt"+i);// 0 是收入,其他是支出;
+        if(StrUtil.isBlankIfStr(result)){
+            result = "0";
+        }
+        for (int j = start; j <= end; j++) {
+            result = NumberUtil.sub(result,ReflectUtil.invoke(PROFIT_SUM[j],"getQuarterAmt"+i)).toString();
+        }
+        return result;
+    }
+
+    private String addBudgetQuarterAmt(Profit[] PROFIT_SUM,int start,int end,int i){
+        String result="0";
+        for (int j = start; j <= end; j++) {
+            result = NumberUtil.add(result,ReflectUtil.invoke(PROFIT_SUM[j],"getQuarterBudget"+i)).toString();
+        }
+        return result;
+    }
+
+    private String subBudgetQuarterAmt(Profit[] PROFIT_SUM,int start,int end,int i){
+        String result=ReflectUtil.invoke(PROFIT_SUM[0],"getQuarterBudget"+i);// 0 是收入,其他是支出;
+        if(StrUtil.isBlankIfStr(result)){
+            result = "0";
+        }
+        for (int j = start; j <= end; j++) {
+            result = NumberUtil.sub(result,ReflectUtil.invoke(PROFIT_SUM[j],"getQuarterBudget"+i)).toString();
+        }
+        return result;
+    }
+
 }

BIN
mjava-zhixingtongde/src/main/resources/templates/Quarter_Template_profit.xlsx


BIN
mjava-zhixingtongde/src/main/resources/templates/Template_profit.xlsx