Parcourir la source

index首页部门收入

longw il y a 1 an
Parent
commit
e556eccbab

+ 5 - 1
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/mapper/SysDepartMapper.java

@@ -1,9 +1,11 @@
 package org.jeecg.modules.system.mapper;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Select;
 import org.apache.ibatis.annotations.Update;
 import org.jeecg.modules.system.entity.SysDepart;
+import org.jeecg.modules.system.entity.SysUser;
 import org.jeecg.modules.system.model.SysDepartTreeModel;
 import org.jeecg.modules.system.model.TreeModel;
 import org.springframework.data.repository.query.Param;
@@ -20,6 +22,7 @@ import java.util.List;
  * @Author: Steve
  * @Since:   2019-01-22
  */
+@Mapper
 public interface SysDepartMapper extends BaseMapper<SysDepart> {
 
 	/**
@@ -97,5 +100,6 @@ public interface SysDepartMapper extends BaseMapper<SysDepart> {
 	@Update("update sys_depart set status = 0 where update_time < #{startDate} and update_time > #{endDate}")
     void updateStatus(@Param("startDate") Date startDate, @Param("endDate") Date endDate);
 
-    List<SysDepart> selectDepartByIds(ArrayList<String> ids);
+	@Select("select depart_name from sys_depart where id in (select dep_id from sys_user_depart where user_id = #{userId})")
+	List<String>  getSysUserOfDepartNameList(String userId);
 }

+ 0 - 4
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/mapper/xml/SysDepartMapper.xml

@@ -51,8 +51,4 @@
     <select id="queryCompByOrgCode" resultType="org.jeecg.modules.system.entity.SysDepart">
 		select * from sys_depart where del_flag = '0' and org_category='1' and org_code= #{orgCode,jdbcType=VARCHAR}
 	</select>
-
-    <select id="selectDepartByIds" parameterType="java.lang.String">
-        select * from sys_depart where id in (#{ids})
-    </select>
 </mapper>

+ 1 - 2
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/ISysDepartService.java

@@ -170,7 +170,6 @@ public interface ISysDepartService extends IService<SysDepart>{
      */
     void updateStatus(Date startDate, Date endDate);
 
-    List<SysDepart> selectDepartByIds(ArrayList<String> ids);
-
     String saveDepartDateAndReturnOrgCode(SysDepart sysDepart, String username);
+
 }

+ 1 - 6
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysDepartServiceImpl.java

@@ -205,7 +205,7 @@ public class SysDepartServiceImpl extends ServiceImpl<SysDepartMapper, SysDepart
 		return null;
 	}
 
-	/**
+    /**
 	 * saveDepartData 的调用方法,生成部门编码和部门类型(作废逻辑)
 	 * @deprecated
 	 * @param parentId
@@ -815,9 +815,4 @@ public class SysDepartServiceImpl extends ServiceImpl<SysDepartMapper, SysDepart
     }
     //update-end---author:wangshuai ---date:20200308  for:[JTC-119]在部门管理菜单下设置部门负责人,新增方法添加部门负责人、删除负责部门负责人、查询部门对应的负责人
 
-
-	@Override
-	public List<SysDepart> selectDepartByIds(ArrayList<String> ids) {
-		return sysDepartMapper.selectDepartByIds(ids);
-	}
 }

+ 304 - 0
jeecg-module-system/jeecg-system-start/src/main/resources/application-dev2.yml

@@ -0,0 +1,304 @@
+server:
+  port: 8888
+  tomcat:
+    max-swallow-size: -1
+  error:
+    include-exception: true
+    include-stacktrace: ALWAYS
+    include-message: ALWAYS
+  servlet:
+    context-path: /jeecg-boot
+  compression:
+    enabled: true
+    min-response-size: 1024
+    mime-types: application/javascript,application/json,application/xml,text/html,text/xml,text/plain,text/css,image/*
+
+management:
+  endpoints:
+    web:
+      exposure:
+        include: metrics,httptrace
+
+spring:
+  servlet:
+    multipart:
+      max-file-size: 10MB
+      max-request-size: 10MB
+  mail:
+    host: smtp.163.com
+    username: jeecgos@163.com
+    password: ??
+    properties:
+      mail:
+        smtp:
+          auth: true
+          starttls:
+            enable: true
+            required: true
+  ## quartz定时任务,采用数据库方式
+  quartz:
+    job-store-type: jdbc
+    initialize-schema: embedded
+    #定时任务启动开关,true-开  false-关
+    auto-startup: true
+    #延迟1秒启动定时任务
+    startup-delay: 1s
+    #启动时更新己存在的Job
+    overwrite-existing-jobs: true
+    properties:
+      org:
+        quartz:
+          scheduler:
+            instanceName: MyScheduler
+            instanceId: AUTO
+          jobStore:
+            class: org.springframework.scheduling.quartz.LocalDataSourceJobStore
+            driverDelegateClass: org.quartz.impl.jdbcjobstore.StdJDBCDelegate
+            tablePrefix: QRTZ_
+            isClustered: true
+            misfireThreshold: 12000
+            clusterCheckinInterval: 15000
+          threadPool:
+            class: org.quartz.simpl.SimpleThreadPool
+            threadCount: 10
+            threadPriority: 5
+            threadsInheritContextClassLoaderOfInitializingThread: true
+  #json 时间戳统一转换
+  jackson:
+    date-format: yyyy-MM-dd HH:mm:ss
+    time-zone: GMT+8
+  jpa:
+    open-in-view: false
+  aop:
+    proxy-target-class: true
+  #配置freemarker
+  freemarker:
+    # 设置模板后缀名
+    suffix: .ftl
+    # 设置文档类型
+    content-type: text/html
+    # 设置页面编码格式
+    charset: UTF-8
+    # 设置页面缓存
+    cache: false
+    prefer-file-system-access: false
+    # 设置ftl文件路径
+    template-loader-path:
+      - classpath:/templates
+  # 设置静态文件路径,js,css等
+  mvc:
+    static-path-pattern: /**
+    #Spring Boot 2.6+后映射匹配的默认策略已从AntPathMatcher更改为PathPatternParser,需要手动指定为ant-path-matcher
+    pathmatch:
+      matching-strategy: ant_path_matcher
+  resource:
+    static-locations: classpath:/static/,classpath:/public/
+  autoconfigure:
+    exclude: com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure
+  datasource:
+    druid:
+      stat-view-servlet:
+        enabled: true
+        loginUsername: admin
+        loginPassword: 123456
+        allow:
+      web-stat-filter:
+        enabled: true
+    dynamic:
+      druid: # 全局druid参数,绝大部分值和默认保持一致。(现已支持的参数如下,不清楚含义不要乱设置)
+        # 连接池的配置信息
+        # 初始化大小,最小,最大
+        initial-size: 5
+        min-idle: 5
+        maxActive: 1000
+        # 配置获取连接等待超时的时间
+        maxWait: 60000
+        # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
+        timeBetweenEvictionRunsMillis: 60000
+        # 配置一个连接在池中最小生存的时间,单位是毫秒
+        minEvictableIdleTimeMillis: 300000
+        validationQuery: SELECT 1 FROM DUAL
+        testWhileIdle: true
+        testOnBorrow: false
+        testOnReturn: false
+        # 打开PSCache,并且指定每个连接上PSCache的大小
+        poolPreparedStatements: true
+        maxPoolPreparedStatementPerConnectionSize: 20
+        # 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙
+        filters: stat,wall,slf4j
+        # 通过connectProperties属性来打开mergeSql功能;慢SQL记录
+        connectionProperties: druid.stat.mergeSql\=true;druid.stat.slowSqlMillis\=5000
+      datasource:
+        master:  ## 声明第一个数据源所需的数据
+          url: jdbc:mysql://127.0.0.1:3306/kezhikeshi?characterEncoding=UTF-8&useUnicode=true&useSSL=false&tinyInt1isBit=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai
+          username: root
+          password: Xinxi513513
+          driver-class-name: com.mysql.cj.jdbc.Driver
+#          password: Xinxi513513
+        slave:  # 第二个数据源
+          url: jdbc:mysql://127.0.0.1:3306/look?characterEncoding=UTF-8&useUnicode=true&useSSL=false&tinyInt1isBit=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai
+          username: root
+          password: Xinxi513513
+          driver-class-name: com.mysql.cj.jdbc.Driver
+          # 多数据源配置
+          #multi-datasource1:
+          #url: jdbc:mysql://localhost:3306/jeecg-boot2?useUnicode=true&characterEncoding=utf8&autoReconnect=true&zeroDateTimeBehavior=convertToNull&transformedBitIsBoolean=true&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai
+          #username: root
+          #password: root
+          #driver-class-name: com.mysql.cj.jdbc.Driver
+  #redis 配置
+  redis:
+    database: 9
+    host: 127.0.0.1
+    port: 6379
+    password: ''
+#mybatis plus 设置
+mybatis-plus:
+  mapper-locations: classpath*:org/jeecg/modules/**/xml/*Mapper.xml
+  global-config:
+    # 关闭MP3.0自带的banner
+    banner: false
+    db-config:
+      #主键类型  0:"数据库ID自增",1:"该类型为未设置主键类型", 2:"用户输入ID",3:"全局唯一ID (数字类型唯一ID)", 4:"全局唯一ID UUID",5:"字符串全局唯一ID (idWorker 的字符串表示)";
+      id-type: ASSIGN_ID
+      # 默认数据库表下划线命名
+      table-underline: true
+  configuration:
+    # 这个配置会将执行的sql打印出来,在开发或测试的时候可以用
+    #log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
+    # 返回类型为Map,显示null对应的字段
+    call-setters-on-nulls: true
+#jeecg专用配置
+minidao:
+  base-package: org.jeecg.modules.jmreport.*
+jeecg:
+  # 是否启用安全模式
+  safeMode: false
+  # 签名密钥串(前后端要一致,正式发布请自行修改)
+  signatureSecret: dd05f1c54d63749eda95f9fa6d49v442a
+  # 签名拦截接口
+  signUrls: /sys/dict/getDictItems/*,/sys/dict/loadDict/*,/sys/dict/loadDictOrderByValue/*,/sys/dict/loadDictItem/*,/sys/dict/loadTreeData,/sys/api/queryTableDictItemsByCode,/sys/api/queryFilterTableDictInfo,/sys/api/queryTableDictByKeys,/sys/api/translateDictFromTable,/sys/api/translateDictFromTableByKeys
+  #local\minio\alioss
+  uploadType: local
+  # 前端访问地址
+  domainUrl:
+    pc: http://localhost:3100
+    app: http://localhost:8051
+  path:
+    #文件上传根目录 设置
+    upload: D://kzks/opt/upFiles
+    #webapp文件路径
+    webapp: D://kzks/opt/webapp
+  shiro:
+    excludeUrls: /test/jeecgDemo/demo3,/test/jeecgDemo/redisDemo/**,/category/**,/visual/**,/map/**,/jmreport/bigscreen2/**,/api/getUserInfo
+  #阿里云oss存储和大鱼短信秘钥配置
+  oss:
+    accessKey: ??
+    secretKey: ??
+    endpoint: oss-cn-beijing.aliyuncs.com
+    bucketName: jeecgdev
+    staticDomain: https://static.jeecg.com
+  # ElasticSearch 设置
+  elasticsearch:
+    cluster-name: jeecg-ES
+    cluster-nodes: 127.0.0.1:9200
+    check-enabled: false
+  # 在线预览文件服务器地址配置
+  file-view-domain: http://fileview.jeecg.com
+  # minio文件上传
+  minio:
+    minio_url: http://minio.jeecg.com
+    minio_name: ??
+    minio_pass: ??
+    bucketName: otatest
+  #大屏报表参数设置
+  jmreport:
+    mode: prod
+    #数据字典是否进行saas数据隔离,自己看自己的字典
+    saas: false
+    #是否需要校验token
+    is_verify_token: true
+    #必须校验方法
+    verify_methods: remove,delete,save,add,update
+  #xxl-job配置
+  xxljob:
+    enabled: false
+    adminAddresses: http://127.0.0.1:9080/xxl-job-admin
+    appname: ${spring.application.name}
+    accessToken: ''
+    address: 127.0.0.1:30007
+    ip: 127.0.0.1
+    port: 30007
+    logPath: logs/jeecg/job/jobhandler/
+    logRetentionDays: 30
+  #分布式锁配置
+  redisson:
+    address: 127.0.0.1:6379
+    password:
+    type: STANDALONE
+    enabled: true
+#cas单点登录
+cas:
+  prefixUrl: http://cas.example.org:8443/cas
+#Mybatis输出sql日志
+logging:
+  level:
+    org.jeecg.modules.system.mapper: debug
+#swagger
+knife4j:
+  #开启增强配置
+  enable: true
+  #开启生产环境屏蔽
+  production: false
+  basic:
+    enable: true
+    username: jeecg
+    password: jeecg1314
+#第三方登录
+justauth:
+  enabled: true
+  type:
+    GITHUB:
+      client-id: ??
+      client-secret: ??
+      redirect-uri: http://sso.test.com:8888/jeecg-boot/sys/thirdLogin/github/callback
+    WECHAT_ENTERPRISE:
+      client-id: ??
+      client-secret: ??
+      redirect-uri: http://sso.test.com:8888/jeecg-boot/sys/thirdLogin/wechat_enterprise/callback
+      agent-id: ??
+    DINGTALK:
+      client-id: ??
+      client-secret: ??
+      redirect-uri: http://sso.test.com:8888/jeecg-boot/sys/thirdLogin/dingtalk/callback
+    WECHAT_OPEN:
+      client-id: ??
+      client-secret: ??
+      redirect-uri: http://sso.test.com:8888/jeecg-boot/sys/thirdLogin/wechat_open/callback
+  cache:
+    type: default
+    prefix: 'demo::'
+    timeout: 1h
+#第三方APP对接
+third-app:
+  enabled: false
+  type:
+    #企业微信
+    WECHAT_ENTERPRISE:
+      enabled: false
+      #CORP_ID
+      client-id: ??
+      #SECRET
+      client-secret: ??
+      #自建应用id
+      agent-id: ??
+      #自建应用秘钥(新版企微需要配置)
+      # agent-app-secret: ??
+    #钉钉
+    DINGTALK:
+      enabled: false
+      # appKey
+      client-id: ??
+      # appSecret
+      client-secret: ??
+      agent-id: ??

+ 18 - 1
module_kzks/src/main/java/org/jeecg/modules/Index/controller/IndexController.java

@@ -2,12 +2,29 @@ package org.jeecg.modules.Index.controller;
 
 import io.swagger.annotations.Api;
 import lombok.extern.slf4j.Slf4j;
+import org.jeecg.common.api.vo.Result;
+import org.jeecg.modules.Index.entity.IncomeDataInfoVO;
+import org.jeecg.modules.Index.service.IndexService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
-@Api(tags="首页")
+import javax.servlet.http.HttpServletRequest;
+
+@Api(tags = "首页")
 @RestController
 @RequestMapping("/index")
 @Slf4j
 public class IndexController {
+    @Autowired
+    private IndexService indexService;
+
+    @GetMapping("getTotalIncome")
+    public Result<IncomeDataInfoVO> getTotalIncome(HttpServletRequest request) {
+        IncomeDataInfoVO reslut = indexService.getTotalIncome(request);
+        return Result.ok(reslut);
+    }
+
+
 }

+ 22 - 0
module_kzks/src/main/java/org/jeecg/modules/Index/entity/IncomeDataInfoVO.java

@@ -0,0 +1,22 @@
+package org.jeecg.modules.Index.entity;
+
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+@Data
+public class IncomeDataInfoVO {
+
+    /*年总收入*/
+    private BigDecimal IncomeYearTotal;
+    /*上年同期总收入*/
+    private BigDecimal IncomeYearTq;
+    /*同比增长率*/
+    private BigDecimal IncomeYearTb;
+    /*当月收入*/
+    private BigDecimal IncomeMonthTotal;
+    /*当月同比*/
+    private BigDecimal IncomeMonthTb;
+    /*当月环比*/
+    private BigDecimal IncomeMonthHb;
+}

+ 5 - 0
module_kzks/src/main/java/org/jeecg/modules/Index/service/IndexService.java

@@ -1,4 +1,9 @@
 package org.jeecg.modules.Index.service;
 
+import org.jeecg.modules.Index.entity.IncomeDataInfoVO;
+
+import javax.servlet.http.HttpServletRequest;
+
 public interface IndexService {
+    IncomeDataInfoVO getTotalIncome(HttpServletRequest request);
 }

+ 204 - 0
module_kzks/src/main/java/org/jeecg/modules/Index/service/impl/IndexServiceImpl.java

@@ -1,8 +1,212 @@
 package org.jeecg.modules.Index.service.impl;
 
+import org.apache.commons.lang3.ObjectUtils;
+import org.jeecg.common.system.api.ISysBaseAPI;
+import org.jeecg.common.system.util.JwtUtil;
+import org.jeecg.common.system.vo.LoginUser;
+import org.jeecg.common.util.RedisUtil;
+import org.jeecg.modules.Index.entity.IncomeDataInfoVO;
+import org.jeecg.modules.Index.mapper.IndexMapper;
 import org.jeecg.modules.Index.service.IndexService;
+import org.jeecg.modules.projectCost.mapper.ProjectCostMapper;
+import org.jeecg.modules.system.mapper.SysDepartMapper;
+import org.jeecg.modules.xmcbDetail.mapper.ComContractInfoExchangeMapper;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import javax.servlet.http.HttpServletRequest;
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.text.SimpleDateFormat;
+import java.util.*;
+import java.util.concurrent.CompletableFuture;
+
 @Service
 public class IndexServiceImpl implements IndexService {
+
+    @Autowired
+    private IndexMapper indexMapper;
+
+    @Autowired
+    private ISysBaseAPI sysBaseApi;
+
+    @Autowired
+    private SysDepartMapper sysDepartMapper;
+
+    @Autowired
+    private ProjectCostMapper projectCostMapper;
+
+    @Autowired
+    private ComContractInfoExchangeMapper exchangeMapper;
+
+    @Autowired
+    private RedisUtil redisUtil;
+
+    private static final String INCOME_DATA_REDIS_KEY = "incomeDataRedisKey:";
+
+    @Override
+    public IncomeDataInfoVO getTotalIncome(HttpServletRequest request) {
+        //首页收入渲染对象
+        BigDecimal initValue = BigDecimal.valueOf(0);
+        IncomeDataInfoVO incomeDataInfoVO = new IncomeDataInfoVO();
+        incomeDataInfoVO.setIncomeYearTotal(initValue);
+        incomeDataInfoVO.setIncomeYearTq(initValue);
+        incomeDataInfoVO.setIncomeYearTb(initValue);
+        incomeDataInfoVO.setIncomeMonthTotal(initValue);
+        incomeDataInfoVO.setIncomeMonthHb(initValue);
+        incomeDataInfoVO.setIncomeMonthTb(initValue);
+
+        String userNameByToken = JwtUtil.getUserNameByToken(request);
+        LoginUser sysUser = sysBaseApi.getUserByName(userNameByToken);
+
+        List<String> departNames = sysDepartMapper.getSysUserOfDepartNameList(sysUser.getId());
+        if (departNames.isEmpty()) return incomeDataInfoVO;
+
+        StringBuilder stringBuilder = new StringBuilder();
+        for (String departName : departNames) {
+            stringBuilder.append(departName).append("|");
+        }
+        String depart = stringBuilder.toString();
+        IncomeDataInfoVO cacheObject = (IncomeDataInfoVO)redisUtil.get(INCOME_DATA_REDIS_KEY + depart);
+        if (ObjectUtils.isNotEmpty(cacheObject)) {
+            incomeDataInfoVO = cacheObject;
+            return incomeDataInfoVO;
+        }
+
+        ArrayList<String> tasknoList = new ArrayList<>();
+        List<String> ZrbmTasknoList = projectCostMapper.queryZrbmTasknoListbydepartNames(departNames);
+        List<String> XdbmTasknoList = projectCostMapper.queryXdbmTasknoListbydepartNames(departNames);
+        tasknoList.addAll(ZrbmTasknoList);
+        tasknoList.addAll(XdbmTasknoList);
+        if (tasknoList.isEmpty()) return incomeDataInfoVO;
+
+
+        Calendar instance = Calendar.getInstance();
+
+        Date currentYearEndDate = instance.getTime();
+        setZeroYear(instance);
+        Date currentYearBeginDate = instance.getTime();
+
+        List<BigDecimal> currentYearIncomeList = new ArrayList<>();
+        IncomeDataInfoVO finalIncomeDataInfoVO = incomeDataInfoVO;
+        CompletableFuture.runAsync(() -> {
+            //根据年份和当前部门对应的任务号查询,部门当前年的年收入
+            BigDecimal currentYearTotal = exchangeMapper.getIncomeYearTotalByTasknoListAndByQsrqRange(tasknoList, currentYearBeginDate, currentYearEndDate);
+            if (ObjectUtils.isEmpty(currentYearTotal)) currentYearTotal = BigDecimal.valueOf(0);
+            finalIncomeDataInfoVO.setIncomeYearTotal(currentYearTotal);
+            currentYearIncomeList.add(currentYearTotal);
+        }).join();
+
+        instance.setTime(new Date());
+        instance.add(Calendar.YEAR, -1);
+        //去年的今日
+        Date LastTqEndDate = instance.getTime();
+        setZeroYear(instance);
+        Date LastYearBeginDate = instance.getTime();
+
+        ArrayList<BigDecimal> lastYearTqIncomeList = new ArrayList<>();
+        //根据年份和当前部门对应的任务号查询,部门去年同期年收入
+        CompletableFuture.runAsync(() -> {
+            BigDecimal lastYearTqTotal = exchangeMapper.getIncomeYearTotalByTasknoListAndByQsrqRange(tasknoList, LastYearBeginDate, LastTqEndDate);
+            if (ObjectUtils.isEmpty(lastYearTqTotal)) lastYearTqTotal = BigDecimal.valueOf(0);
+            finalIncomeDataInfoVO.setIncomeYearTq(lastYearTqTotal);
+            lastYearTqIncomeList.add(lastYearTqTotal);
+        }).join();
+
+
+        instance.setTime(new Date());
+        Date currentMothEndDate = instance.getTime();
+        setZeroMonth(instance);
+        Date currentMothBginDate = instance.getTime();
+
+        ArrayList<BigDecimal> currentMonthTotalList = new ArrayList<>();
+
+        CompletableFuture.runAsync(() -> {
+            BigDecimal currentMonthTotal = exchangeMapper.getIncomeYearTotalByTasknoListAndByQsrqRange(tasknoList, currentMothBginDate, currentMothEndDate);
+            if (ObjectUtils.isEmpty(currentMonthTotal)) currentMonthTotal = BigDecimal.valueOf(0);
+            finalIncomeDataInfoVO.setIncomeMonthTotal(currentMonthTotal);
+            currentMonthTotalList.add(currentMonthTotal);
+        }).join();
+
+
+        instance.setTime(new Date());
+        instance.add(Calendar.MONTH, -1);
+        Date LastMothTqEndDate = instance.getTime();
+        setZeroMonth(instance);
+        Date LastMothTqBeginDate = instance.getTime();
+
+        ArrayList<BigDecimal> lastMothTqTotalList = new ArrayList<>();
+        CompletableFuture.runAsync(() -> {
+            BigDecimal lastMothTqTotal = exchangeMapper.getIncomeYearTotalByTasknoListAndByQsrqRange(tasknoList, LastMothTqBeginDate, LastMothTqEndDate);
+            if (ObjectUtils.isEmpty(lastMothTqTotal)) lastMothTqTotal = BigDecimal.valueOf(0);
+            lastMothTqTotalList.add(lastMothTqTotal);
+        }).join();
+
+
+        instance.setTime(new Date());
+        instance.add(Calendar.YEAR, -1);
+        Date lastYearMonthTqEndDate = instance.getTime();
+        setZeroMonth(instance);
+        Date lastYearMonthTqBeginDate = instance.getTime();
+
+        ArrayList<BigDecimal> lastYearMonthTqTotalList = new ArrayList<>();
+        CompletableFuture.runAsync(() -> {
+            BigDecimal lastYearMonthTqTotal = exchangeMapper.getIncomeYearTotalByTasknoListAndByQsrqRange(tasknoList, lastYearMonthTqBeginDate, lastYearMonthTqEndDate);
+            if (ObjectUtils.isEmpty(lastYearMonthTqTotal)) lastYearMonthTqTotal = BigDecimal.valueOf(0);
+            lastYearMonthTqTotalList.add(lastYearMonthTqTotal);
+        }).join();
+
+
+        CompletableFuture.runAsync(() -> {
+            BigDecimal currentYearTotal = currentYearIncomeList.get(0);
+            BigDecimal lastYearTqTotal = lastYearTqIncomeList.get(0);
+            //去年同比
+            BigDecimal YearDifference = currentYearTotal.subtract(lastYearTqTotal);
+            BigDecimal incomeYearTb = BigDecimal.valueOf(0);
+            if (lastYearTqTotal.compareTo(BigDecimal.valueOf(0)) != 0)
+                incomeYearTb = YearDifference.divide(lastYearTqTotal, 2, RoundingMode.HALF_UP);
+            finalIncomeDataInfoVO.setIncomeYearTb(incomeYearTb);
+        }).join();
+
+        CompletableFuture.runAsync(() -> {
+            BigDecimal currentMonthTotal = currentMonthTotalList.get(0);
+            BigDecimal lastMothTqTotal = lastMothTqTotalList.get(0);
+            BigDecimal MothDifference = currentMonthTotal.subtract(lastMothTqTotal);
+            BigDecimal incomeMothHb = BigDecimal.valueOf(0);
+            if (lastMothTqTotal.compareTo(BigDecimal.valueOf(0)) != 0)
+                incomeMothHb = MothDifference.divide(lastMothTqTotal, 2, RoundingMode.HALF_UP);
+            finalIncomeDataInfoVO.setIncomeMonthHb(incomeMothHb);
+        }).join();
+
+        CompletableFuture.runAsync(() -> {
+            BigDecimal currentMonthTotal = currentMonthTotalList.get(0);
+            BigDecimal lastYearMonthTqTotal = lastYearMonthTqTotalList.get(0);
+            BigDecimal yearMothDifference = currentMonthTotal.subtract(lastYearMonthTqTotal);
+            BigDecimal incomeYearMothTb = BigDecimal.valueOf(0);
+            if (lastYearMonthTqTotal.compareTo(BigDecimal.valueOf(0)) != 0)
+                incomeYearMothTb = yearMothDifference.divide(lastYearMonthTqTotal, 2, RoundingMode.HALF_UP);
+            finalIncomeDataInfoVO.setIncomeMonthTb(incomeYearMothTb);
+        }).join();
+
+        redisUtil.set(INCOME_DATA_REDIS_KEY + depart, finalIncomeDataInfoVO, 1000L * 60 * 60 * 2);
+
+        return finalIncomeDataInfoVO;
+    }
+
+    public void setZeroYear(Calendar instance) {
+        instance.set(Calendar.MONTH, 0);
+        instance.set(Calendar.DAY_OF_MONTH, 0);
+        instance.set(Calendar.HOUR_OF_DAY, 0);
+        instance.set(Calendar.MINUTE, 0);
+        instance.set(Calendar.SECOND, 0);
+        instance.set(Calendar.MILLISECOND, 0);
+    }
+
+    public void setZeroMonth(Calendar instance) {
+        instance.set(Calendar.DAY_OF_MONTH, 0);
+        instance.set(Calendar.HOUR_OF_DAY, 0);
+        instance.set(Calendar.MINUTE, 0);
+        instance.set(Calendar.SECOND, 0);
+        instance.set(Calendar.MILLISECOND, 0);
+    }
 }

+ 6 - 0
module_kzks/src/main/java/org/jeecg/modules/projectCost/mapper/ProjectCostMapper.java

@@ -1,7 +1,9 @@
 package org.jeecg.modules.projectCost.mapper;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
+import org.apache.ibatis.annotations.Select;
 import org.jeecg.modules.projectCost.entity.ProjectCost;
 import org.jeecg.modules.projectCost.vo.ProjectCostVO;
 
@@ -13,6 +15,7 @@ import java.util.List;
  * @Date:   2023-08-15
  * @Version: V1.0
  */
+@Mapper
 public interface ProjectCostMapper extends BaseMapper<ProjectCost> {
 
     /**根据任务号查询项目成本的主任务及组批后的主任务*/
@@ -26,4 +29,7 @@ public interface ProjectCostMapper extends BaseMapper<ProjectCost> {
      */
     public List<ProjectCost> compareListByIds(@Param("ids") List<String> ids);
 
+    List<String>  queryZrbmTasknoListbydepartNames(@Param("departNames") List<String>  departNames);
+
+    List<String>  queryXdbmTasknoListbydepartNames(@Param("departNames") List<String>  departNames);
 }

+ 12 - 0
module_kzks/src/main/java/org/jeecg/modules/projectCost/mapper/xml/ProjectCostMapper.xml

@@ -35,5 +35,17 @@
             #{id}
         </foreach>
     </select>
+    <select id="queryZrbmTasknoListbydepartNames" resultType="java.lang.String">
+        select taskno from kzks_project_cost where zrbm in
+        <foreach item='item' index='index' collection='departNames' open='(' separator=',' close=')'>
+            #{item}
+        </foreach>
+    </select>
+    <select id="queryXdbmTasknoListbydepartNames" resultType="java.lang.String">
+        select taskno from kzks_project_cost where jycs in
+        <foreach item='item' index='index' collection='departNames' open='(' separator=',' close=')'>
+            #{item}
+        </foreach>
+    </select>
 
 </mapper>

+ 1 - 0
module_kzks/src/main/java/org/jeecg/modules/projectCost/service/IProjectCostService.java

@@ -33,4 +33,5 @@ public interface IProjectCostService extends IService<ProjectCost> {
      */
     public List<ProjectCost> compareListByIds(List<String> ids);
 
+
 }

+ 6 - 0
module_kzks/src/main/java/org/jeecg/modules/xmcbDetail/mapper/ComContractInfoExchangeMapper.java

@@ -1,12 +1,15 @@
 package org.jeecg.modules.xmcbDetail.mapper;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
 import org.apache.ibatis.annotations.Select;
 import org.jeecg.modules.xmcbDetail.entity.ComContractInfoExchange;
 import org.jeecg.modules.xmcbDetail.vo.ComContractInfoExchangeHTEVO;
 import org.jeecg.modules.xmcbDetail.vo.ComContractInfoExchangeYSKVO;
 
+import java.math.BigDecimal;
+import java.util.Date;
 import java.util.List;
 
 /**
@@ -15,6 +18,7 @@ import java.util.List;
  * @Date:   2023-08-16
  * @Version: V1.0
  */
+@Mapper
 public interface ComContractInfoExchangeMapper extends BaseMapper<ComContractInfoExchange> {
 
 
@@ -30,4 +34,6 @@ public interface ComContractInfoExchangeMapper extends BaseMapper<ComContractInf
             "jeskzkp,rwskje,dkhpdqrq,sklx,skkmdm,pzh,ywy,lrsqr,qclrsqrq from com_contract_info_exchange " +
             "where sjly=40 AND DATE_FORMAT(`dkhpdqrq`,'%Y') > '2015' and rwbh=#{taskno}")
     public List<ComContractInfoExchangeYSKVO> getCrmYskDetail(@Param("taskno") String taskno);
+
+    BigDecimal getIncomeYearTotalByTasknoListAndByQsrqRange(@Param("tasknoList") List<String>   tasknoList,@Param("beginDate") Date beginDate,@Param("endDate") Date endDate);
 }

+ 11 - 1
module_kzks/src/main/java/org/jeecg/modules/xmcbDetail/mapper/xml/ComContractInfoExchangeMapper.xml

@@ -2,4 +2,14 @@
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="org.jeecg.modules.xmcbDetail.mapper.ComContractInfoExchangeMapper">
 
-</mapper>
+    <select id="getIncomeYearTotalByTasknoListAndByQsrqRange" resultType="java.math.BigDecimal">
+        select sum(a.htfpe)
+        from (select rwbh,htfpe,qsrq from com_contract_info_exchange where sjly = 20) a
+        where a.qsrq &gt; #{beginDate}
+        and a.qsrq &lt; #{endDate}
+        and a.rwbh in
+        <foreach item='item' index='index' collection='tasknoList' open='(' separator=',' close=')'>
+            #{item}
+        </foreach>
+    </select>
+</mapper>