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