Browse Source

代码更新+更改tomact版本由9.0.60 -> 9.0.89

丁治程 11 months ago
parent
commit
a151a8193e

+ 9 - 9
jeecg-module-system/jeecg-system-start/src/main/resources/application-dev.yml

@@ -130,9 +130,9 @@ spring:
         connectionProperties: druid.stat.mergeSql\=true;druid.stat.slowSqlMillis\=5000
       datasource:
         master: ## 声明第一个数据源所需的数据
-          url: jdbc:mysql://152.136.206.27:3306/kezhikeshi?characterEncoding=UTF-8&useUnicode=true&useSSL=false&tinyInt1isBit=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai&rewriteBatchedStatements=true
-          username: itdm-boot
-          password: itdm-boot@2023
+          url: jdbc:mysql://119.3.168.55:3306/kezhikeshi?characterEncoding=UTF-8&useUnicode=true&useSSL=false&tinyInt1isBit=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai&rewriteBatchedStatements=true
+          username: root
+          password: 302201
           driver-class-name: com.mysql.cj.jdbc.Driver
 #          url: jdbc:mysql://localhost:3306/kezhikeshi?characterEncoding=UTF-8&useUnicode=true&useSSL=false&tinyInt1isBit=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai
 #          username: root
@@ -144,9 +144,9 @@ spring:
           password: 302201
           driver-class-name: com.mysql.cj.jdbc.Driver
         datax: # 第三个数据源
-          url: jdbc:mysql://152.136.206.27:3306/datax_web?characterEncoding=UTF-8&useUnicode=true&useSSL=false&tinyInt1isBit=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai
-          username: itdm-boot
-          password: itdm-boot@2023
+          url: jdbc:mysql://119.3.168.55:3306/datax_web?characterEncoding=UTF-8&useUnicode=true&useSSL=false&tinyInt1isBit=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai
+          username: root
+          password: 302201
           driver-class-name: com.mysql.cj.jdbc.Driver
 #          url: jdbc:mysql://localhost:3306/look?characterEncoding=UTF-8&useUnicode=true&useSSL=false&tinyInt1isBit=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai
 #          username: root
@@ -162,9 +162,9 @@ spring:
           #driver-class-name: com.mysql.cj.jdbc.Driver
   redis:
     database: 0
-    host: 152.136.206.27
-    port: 6379
-    password: ''
+    host: 119.3.168.55
+    port: 6380
+    password: '123qx'
 #mybatis plus 设置
 mybatis-plus:
   mapper-locations: classpath*:org/jeecg/modules/**/xml/*Mapper.xml

+ 3 - 0
module_kzks/src/main/java/org/jeecg/modules/Index/mapper/IndexKpiMapper.java

@@ -58,4 +58,7 @@ public interface IndexKpiMapper {
     List<IndexKpiCompletByDate> getFinallNum(@Param("finalDateYm") String finalDateYm,@Param("departList") List<String> departList);
 
     List<IndexKpiCompletByDate> getNewNum(@Param("finalDateYm") String finalDateYm,@Param("departList") List<String> departList);
+
+    List<IndexKpiCompletByDate> getHteReceivedZrbmSelectYm(@Param("finalDateYm") String finalDateYm,@Param("finalDateLastYm") String finalDateLastYm,@Param("departList") List<String> zrbmList);
+
 }

+ 31 - 7
module_kzks/src/main/java/org/jeecg/modules/Index/mapper/xml/IndexKpiMapper.xml

@@ -89,10 +89,10 @@
         select e.depart as depart , sum(case when e.contractfpe != 0.00 then e.contractfpe * e.newJd else (e.EstimationCoat*10000)*e.newJd end) as contractAmount ,
         sum(e.received) as received
         from
-        (select k.taskno, k.zrbm as depart, k.contractfpe, k.EstimationCoat,(k.processPercent-m.processPercent)/100 as newJd,k.TaskMoney as received
-        from kzks_project_cost_huiji k
+        (select k.taskno, k.zrbm as depart, k.contractfpe, k.EstimationCoat,(CASE WHEN IFNULL((k.processPercent-m.processPercent)/100,0) <![CDATA[ < ]]> 0 THEN (k.processPercent-m.processPercent) = 0 ELSE IFNULL((k.processPercent-m.processPercent)/100,0) END) as newJd,k.TaskMoney as received
+        from kzks_project_cost k
         left join kzks_kpi_project_month m on k.taskno = m.taskno
-        where k.zrbm in
+        where k.status != '1' and k.zrbm in
         <foreach item='item' index='index' collection='departList' open='(' separator=',' close=')'>
             #{item}
         </foreach>
@@ -102,17 +102,17 @@
     <select id="getNewNum" resultType="org.jeecg.modules.Index.entity.kpi.IndexKpiCompletByDate">
         select zrbm as depart, sum((case when contractfpe != 0.00 then contractfpe * processPercent else (EstimationCoat*10000)*processPercent end) / 100.0) as contractAmount,
         sum(TaskMoney) as received
-        from kzks_project_cost_huiji
-        where zrbm in
+        from kzks_project_cost
+        where status != '1' and zrbm in
         <foreach item='item' index='index' collection='departList' open='(' separator=',' close=')'>
             #{item}
         </foreach>
         and taskno not in (
         select k.taskno
-        from kzks_project_cost_huiji k
+        from kzks_project_cost k
         left join kzks_kpi_project_month m
         on k.taskno = m.taskno
-        where k.zrbm in
+        where k.status != '1' and k.zrbm in
         <foreach item='item' index='index' collection='departList' open='(' separator=',' close=')'>
             #{item}
         </foreach>
@@ -120,4 +120,28 @@
         ) group by zrbm
     </select>
 
+    <select id="getHteReceivedZrbmSelectYm" resultType="org.jeecg.modules.Index.entity.kpi.IndexKpiCompletByDate">
+        select e.depart as depart , sum(case when e.contractfpe != 0.00 then e.contractfpe * e.newJd else (e.EstimationCoat*10000)*e.newJd end) as contractAmount ,
+        sum(e.received) as received
+		from(
+			 select k.taskno, k.zrbm as depart, k.contractfpe, k.EstimationCoat,m.nowjd,m.lastjd,(CASE WHEN IFNULL((m.nowjd-m.lastjd)/100,0) <![CDATA[ < ]]> 0 THEN (m.nowjd-m.lastjd) = 0 ELSE IFNULL((m.nowjd-m.lastjd)/100,0) END) as newJd,k.TaskMoney as received
+             from kzks_project_cost k
+			 left join
+			    (select km.taskno, km.newprocessPercent AS nowjd,IFNULL(kt.newprocessPercent,0) as lastjd
+                 from
+                 (select zrbm,taskno, IFNULL(processPercent,0) AS newprocessPercent from kzks_kpi_project_month where ym = #{finalDateYm}) km
+                 left join
+                 (select taskno, IFNULL(processPercent,0) AS newprocessPercent from kzks_kpi_project_month where ym = #{finalDateLastYm}) kt on km.taskno = kt.taskno
+                 where km.zrbm in
+                <foreach item='item' index='index' collection='departList' open='(' separator=',' close=')'>
+                    #{item}
+                </foreach>
+                 ) m on k.taskno = m.taskno
+             where k.status != '1' and k.zrbm in
+            <foreach item='item' index='index' collection='departList' open='(' separator=',' close=')'>
+                #{item}
+            </foreach>
+        ) e group by e.depart
+    </select>
+
 </mapper>

+ 25 - 18
module_kzks/src/main/java/org/jeecg/modules/Index/service/impl/IndexKpiServiceImpl.java

@@ -426,23 +426,24 @@ public class IndexKpiServiceImpl implements IndexKpiService {
             //责任部门 获取选择年月的数据  合同额、已收款
             CompletableFuture<Map<String, IndexKpiCompletByDate>> getHtereceivedZrbmMapFuture = CompletableFuture.supplyAsync(() -> {
                 Map<String, IndexKpiCompletByDate> htereceivedZrbmMap = new TreeMap<>();//用来保存部门该月合计的合同额、已收款以及责任部门
-                List<IndexKpiCompletByDate> htereceivedZrbmList = indexKpiMapper.getHteReceivedZrbmYm(finalDateYm, zrbmList);
+//                List<IndexKpiCompletByDate> htereceivedZrbmList = indexKpiMapper.getHteReceivedZrbmYm(finalDateYm, zrbmList);
+                List<IndexKpiCompletByDate> htereceivedZrbmList = indexKpiMapper.getHteReceivedZrbmSelectYm(finalDateYm,finalDateLastYm, zrbmList);
                 for(IndexKpiCompletByDate htereceivedZrbm:htereceivedZrbmList){
                     htereceivedZrbmMap.put(htereceivedZrbm.getDepart(), htereceivedZrbm);
                 }
                 return htereceivedZrbmMap;
             });
             //责任部门 获取选择年月上月的数据  合同额、已收款
-            CompletableFuture<Map<String, IndexKpiCompletByDate>> getHtereceivedZrbmLastMapFuture = CompletableFuture.supplyAsync(() -> {
-                Map<String, IndexKpiCompletByDate> htereceivedZrbmLastMap = new TreeMap<>();//用来保存部门上月合计的合同额、已收款以及责任部门
-                if (zrbmList.isEmpty()) return htereceivedZrbmLastMap;
-                //List<IndexKpiCompletByDate> htereceivedZrbmLastList = indexKpiMapper.getHteReceivedZrbmYm(finalDateLastYm, departList);
-                List<IndexKpiCompletByDate> htereceivedZrbmLastList = indexKpiMapper.getHteReceivedZrbmYm(finalDateLastYm, zrbmList);
-                for(IndexKpiCompletByDate htereceivedZrbmLast:htereceivedZrbmLastList){
-                    htereceivedZrbmLastMap.put(htereceivedZrbmLast.getDepart(), htereceivedZrbmLast);
-                }
-                return htereceivedZrbmLastMap;
-            });
+//            CompletableFuture<Map<String, IndexKpiCompletByDate>> getHtereceivedZrbmLastMapFuture = CompletableFuture.supplyAsync(() -> {
+//                Map<String, IndexKpiCompletByDate> htereceivedZrbmLastMap = new TreeMap<>();//用来保存部门上月合计的合同额、已收款以及责任部门
+//                if (zrbmList.isEmpty()) return htereceivedZrbmLastMap;
+//                //List<IndexKpiCompletByDate> htereceivedZrbmLastList = indexKpiMapper.getHteReceivedZrbmYm(finalDateLastYm, departList);
+//                List<IndexKpiCompletByDate> htereceivedZrbmLastList = indexKpiMapper.getHteReceivedZrbmYm(finalDateLastYm, zrbmList);
+//                for(IndexKpiCompletByDate htereceivedZrbmLast:htereceivedZrbmLastList){
+//                    htereceivedZrbmLastMap.put(htereceivedZrbmLast.getDepart(), htereceivedZrbmLast);
+//                }
+//                return htereceivedZrbmLastMap;
+//            });
             // 求下达部门的合同额
             CompletableFuture<Map<String,IndexKpiCompletByDate>> getHtereceivedXdbmHteMapFuture = CompletableFuture.supplyAsync(() -> {
                 Map<String, IndexKpiCompletByDate> htereceivedXdbmHteMap = new TreeMap<>();//用来保存部门上月合计的合同额、已收款以及责任部门
@@ -500,10 +501,10 @@ public class IndexKpiServiceImpl implements IndexKpiService {
                 return htereceivedZrbmNewMap;
             });
 
-            CompletableFuture<Void> future1 = CompletableFuture.allOf(getHtereceivedZrbmMapFuture, getHtereceivedZrbmLastMapFuture,getHtereceivedXdbmHteMapFuture,getHtereceivedXdbmYskMapFuture,getHtereceivedZrbmFinalFuture,getHtereceivedZrbmNewFuture);
+            CompletableFuture<Void> future1 = CompletableFuture.allOf(getHtereceivedZrbmMapFuture,getHtereceivedXdbmHteMapFuture,getHtereceivedXdbmYskMapFuture,getHtereceivedZrbmFinalFuture,getHtereceivedZrbmNewFuture);
             future1.join();
             Map<String, IndexKpiCompletByDate> htereceivedZrbmMap = getHtereceivedZrbmMapFuture.join();
-            Map<String, IndexKpiCompletByDate> htereceivedZrbmLastMap = getHtereceivedZrbmLastMapFuture.join();
+//            Map<String, IndexKpiCompletByDate> htereceivedZrbmLastMap = getHtereceivedZrbmLastMapFuture.join();
             Map<String, IndexKpiCompletByDate> htereceivedXdbmHteMap = getHtereceivedXdbmHteMapFuture.join();
             Map<String, IndexKpiCompletByDate> htereceivedXdbmYskMap = getHtereceivedXdbmYskMapFuture.join();
             Map<String, IndexKpiCompletByDate> htereceivedZrbmFinalMap = getHtereceivedZrbmFinalFuture.join();
@@ -527,13 +528,19 @@ public class IndexKpiServiceImpl implements IndexKpiService {
 
                     }else {
                         IndexKpiCompletByDate htereceivedZrbm = htereceivedZrbmMap.getOrDefault(kpiDataZrbm.getDepart(), kpiDataZrbm);
-                        IndexKpiCompletByDate htereceivedZrbmLast = htereceivedZrbmLastMap.getOrDefault(kpiDataZrbm.getDepart(), kpiDataZrbm);
-                        if(htereceivedZrbm.getContractAmount() == null || htereceivedZrbmLast.getContractAmount() == null){
+                        if (htereceivedZrbm.getContractAmount() == null){
                             kpiDataZrbm.setContractAmount(BigDecimal.valueOf(0).setScale(2, RoundingMode.HALF_UP));
-                        }else {
-                            kpiDataZrbm.setContractAmount(htereceivedZrbm.getContractAmount().subtract(htereceivedZrbmLast.getContractAmount()).setScale(2, RoundingMode.HALF_UP));//合同额
+                        }else{
+                            kpiDataZrbm.setContractAmount(htereceivedZrbm.getContractAmount().setScale(2, RoundingMode.HALF_UP));
                         }
-                        kpiDataZrbm.setReceived(htereceivedZrbm.getReceived().subtract(htereceivedZrbmLast.getReceived()).setScale(2, RoundingMode.HALF_UP));//已收款
+                        kpiDataZrbm.setReceived(htereceivedZrbm.getReceived().setScale(2, RoundingMode.HALF_UP));
+//                        IndexKpiCompletByDate htereceivedZrbmLast = htereceivedZrbmLastMap.getOrDefault(kpiDataZrbm.getDepart(), kpiDataZrbm);
+//                        if(htereceivedZrbm.getContractAmount() == null || htereceivedZrbmLast.getContractAmount() == null){
+//                            kpiDataZrbm.setContractAmount(BigDecimal.valueOf(0).setScale(2, RoundingMode.HALF_UP));
+//                        }else {
+//                            kpiDataZrbm.setContractAmount(htereceivedZrbm.getContractAmount().subtract(htereceivedZrbmLast.getContractAmount()).setScale(2, RoundingMode.HALF_UP));//合同额
+//                        }
+//                        kpiDataZrbm.setReceived(htereceivedZrbm.getReceived().subtract(htereceivedZrbmLast.getReceived()).setScale(2, RoundingMode.HALF_UP));//已收款
                     }
                     //计算完成度  合同额(是计算的某个月或某个年的合同额 增量)/ 指标
                     if(kpiDataZrbm.getDepartKpi() != null){

+ 2 - 0
module_kzks/src/main/java/org/jeecg/modules/Index/util/RedisCacheMethod.java

@@ -19,5 +19,7 @@ public class RedisCacheMethod {
         redisUtil.removeAll(CacheKey.PROJECT_COST_HUIJI + ":*");
         redisUtil.removeAll(CacheKey.PROJECT_COST + ":*");
         redisUtil.removeAll(CacheKey.CLF_COMPARE_RESULT_VOS+":*");
+        redisUtil.removeAll(CacheKey.INDEX_ZRBM_FINAL);
+        redisUtil.removeAll(CacheKey.INDEX_ZRBM_NEW);
     }
 }

+ 17 - 17
module_kzks/src/main/java/org/jeecg/modules/kpiProjectMonth/entity/KpiProjectMonth.java

@@ -40,70 +40,70 @@ public class KpiProjectMonth implements Serializable {
 	@TableId(type = IdType.ASSIGN_ID)
     @ExcelIgnore
     @ApiModelProperty(value = "主键")
-    private java.lang.String id;
+    private String id;
 	/**创建人*/
     @ExcelIgnore
     @ApiModelProperty(value = "创建人")
-    private java.lang.String createBy;
+    private String createBy;
 	/**创建日期*/
     @ExcelIgnore
     @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
     @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
     @ApiModelProperty(value = "创建日期")
-    private java.util.Date createTime;
+    private Date createTime;
 	/**更新人*/
     @ExcelIgnore
     @ApiModelProperty(value = "更新人")
-    private java.lang.String updateBy;
+    private String updateBy;
 	/**更新日期*/
     @ExcelIgnore
     @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
     @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
     @ApiModelProperty(value = "更新日期")
-    private java.util.Date updateTime;
+    private Date updateTime;
 	/**所属部门*/
     @ExcelIgnore
     @ApiModelProperty(value = "所属部门")
-    private java.lang.String sysOrgCode;
+    private String sysOrgCode;
 	/**任务号/来自科研任务*/
     @Excel(name = "任务编号", width = 15)
     @ApiModelProperty(value = "任务号/来自科研任务")
-    private java.lang.String taskno;
+    private String taskno;
 	/**责任部门/来自科研任务*/
     @Excel(name = "责任部门", width = 15)
     @ApiModelProperty(value = "责任部门/来自科研任务")
-    private java.lang.String zrbm;
+    private String zrbm;
 	/**下达部门/来自科研任务*/
     @Excel(name = "下达部门", width = 15)
     @ApiModelProperty(value = "下达部门/来自科研任务")
-    private java.lang.String jycs;
+    private String jycs;
     /**项目进度/来自科研任务*/
     @Excel(name = "项目进度", width = 15)
     //@ExcelProperty(converter = BigDecimalNumberConverter.class)
     @ApiModelProperty(value = "项目进度/来自科研任务")
-    private java.math.BigDecimal processpercent;
+    private BigDecimal processpercent;
 	/**合同额/来自收款合同的合同分配额 */
     @ExcelIgnore
     @ApiModelProperty(value = "合同额/来自收款合同的合同分配额 ")
-    private java.math.BigDecimal contractfpe;
+    private BigDecimal contractfpe;
     /**预估价/来自科研任务*/
-    @Excel(name = "任务下达步骤填写的预估价",width = 15)
+    @Excel(name = "预估价(万)",width = 15)
     @ApiModelProperty(value = "预估价/来自科研任务 ")
-    private java.math.BigDecimal estimationcoat;
+    private BigDecimal estimationcoat;
 	/**已收款/ 来自合同收款详细的任务收款额*/
     @ExcelIgnore
     @ApiModelProperty(value = "已收款/ 来自合同收款详细的任务收款额")
-    private java.math.BigDecimal taskmoney;
+    private BigDecimal taskmoney;
 	/**当前任务进度的年份*/
     @ExcelIgnore
     @ApiModelProperty(value = "当前任务进度的年份")
-    private java.lang.Integer year;
+    private Integer year;
 	/**当前任务进度的月份*/
     @ExcelIgnore
     @ApiModelProperty(value = "当前任务进度的月份")
-    private java.lang.Integer month;
+    private Integer month;
 	/**当前任务进度的年月*/
     @ExcelIgnore
     @ApiModelProperty(value = "当前任务进度的年月")
-    private java.lang.String ym;
+    private String ym;
 }

+ 24 - 7
module_kzks/src/main/java/org/jeecg/modules/kpiProjectMonth/listener/KpiProjectMonthListener.java

@@ -1,8 +1,10 @@
 package org.jeecg.modules.kpiProjectMonth.listener;
 
+import cn.hutool.core.util.ObjectUtil;
 import com.alibaba.excel.context.AnalysisContext;
 import com.alibaba.excel.event.AnalysisEventListener;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.ObjectUtils;
 import org.jeecg.common.util.DateUtils;
 import org.jeecg.modules.comContractInfoExchangeNew.service.IComContractInfoExchangeNewService;
 import org.jeecg.modules.kpiProjectMonth.entity.KpiProjectMonth;
@@ -12,10 +14,7 @@ import org.jeecg.modules.wzOutboundOrderBNew.entity.WzOutboundOrderBNew;
 import java.math.BigDecimal;
 import java.util.ArrayList;
 import java.util.List;
-import java.util.concurrent.CopyOnWriteArrayList;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
-import java.util.concurrent.TimeUnit;
+import java.util.concurrent.*;
 
 /**
  * @author dzc
@@ -51,9 +50,27 @@ public class KpiProjectMonthListener extends AnalysisEventListener<KpiProjectMon
         kpiProjectMonth.setYear(jdYear);
         kpiProjectMonth.setMonth(jdMonth);
         kpiProjectMonth.setYm(jdYearMonth);
-        kpiProjectMonth.setEstimationcoat(kpiProjectMonth.getEstimationcoat().multiply(BigDecimal.valueOf(10000)));
-        kpiProjectMonth.setContractfpe(exchangeNewService.getHteByTaskno(kpiProjectMonth.getTaskno()));
-        kpiProjectMonth.setTaskmoney(exchangeNewService.getYskByTaskno(kpiProjectMonth.getTaskno()));
+        if (ObjectUtil.isNotNull(kpiProjectMonth.getEstimationcoat())){
+            kpiProjectMonth.setEstimationcoat(kpiProjectMonth.getEstimationcoat().multiply(BigDecimal.valueOf(10000)));
+        }else {
+            kpiProjectMonth.setEstimationcoat(BigDecimal.valueOf(0));
+        }
+//
+//        CompletableFuture<BigDecimal> getHteFuture = CompletableFuture.supplyAsync(() -> {
+//           return exchangeNewService.getHteByTaskno(kpiProjectMonth.getTaskno());
+//        });
+//
+//        CompletableFuture<BigDecimal> getYskFuture = CompletableFuture.supplyAsync(() -> {
+//            return exchangeNewService.getYskByTaskno(kpiProjectMonth.getTaskno());
+//        });
+//
+//        CompletableFuture<Void> future = CompletableFuture.allOf(getHteFuture,getYskFuture);
+//        future.join();
+//        BigDecimal hte = getHteFuture.join();
+//        BigDecimal ysk = getYskFuture.join();
+//
+//        kpiProjectMonth.setContractfpe(hte);
+//        kpiProjectMonth.setTaskmoney(ysk);
         kpiMonthList.add(kpiProjectMonth);
         if (kpiMonthList.size() == BIG_SIZE){
             batchSaveInfo(kpiMonthList);

+ 5 - 1
module_kzks/src/main/java/org/jeecg/modules/kyTaskInfoNew/entity/KyTaskInfoNew.java

@@ -355,6 +355,10 @@ public class KyTaskInfoNew implements Serializable {
     @DateTimeFormat(pattern="yyyy-MM-dd")
     @ApiModelProperty(value = "提交完成审核时间")
     private Date processdate;
+    /**预估价*/
+    @Excel(name = "预估价(万)", width = 15)
+    @ApiModelProperty(value = "预估价(万)")
+    private String estimationcoat;
 	/**考核扣款*/
 	@Excel(name = "考核扣款", width = 15)
     @ApiModelProperty(value = "考核扣款")
@@ -362,7 +366,7 @@ public class KyTaskInfoNew implements Serializable {
 	/**任务下达步骤填写的预估价*/
 	@Excel(name = "任务下达步骤填写的预估价", width = 15)
     @ApiModelProperty(value = "任务下达步骤填写的预估价")
-    private String estimationcoat;
+    private String xdestimationcoat;
 	/**成本详情*/
 	@Excel(name = "成本详情", width = 15)
     @ApiModelProperty(value = "成本详情")

+ 9 - 0
pom.xml

@@ -67,6 +67,8 @@
 		<lombok.mapstruct.binding.version>0.2.0</lombok.mapstruct.binding.version>
 		<poiti.version>1.10.5</poiti.version>
 		<zxing.version>3.5.1</zxing.version>
+
+		<tomcat.version>9.0.89</tomcat.version>
 	</properties>
 
 	<modules>
@@ -107,6 +109,13 @@
 	</repositories>
 
 	<dependencies>
+
+		<dependency>
+			<groupId>org.apache.tomcat.embed</groupId>
+			<artifactId>tomcat-embed-core</artifactId>
+			<version>${tomcat.version}</version>
+		</dependency>
+
 		<dependency>
 			<groupId>org.springframework.boot</groupId>
 			<artifactId>spring-boot-starter-test</artifactId>