纪新园 1 год назад
Родитель
Сommit
665f129168
32 измененных файлов с 1011 добавлено и 157 удалено
  1. 80 0
      blade-service-api/blade-los-api/src/main/java/org/springblade/los/feign/ILosClient.java
  2. 2 0
      blade-service/blade-los/src/main/java/org/springblade/los/LosApplication.java
  3. 7 3
      blade-service/blade-los/src/main/java/org/springblade/los/business/aea/mapper/AeaBillsMapper.java
  4. 60 0
      blade-service/blade-los/src/main/java/org/springblade/los/business/aea/mapper/AeaBillsMapper.xml
  5. 14 0
      blade-service/blade-los/src/main/java/org/springblade/los/business/aea/service/impl/AeaBillsServiceImpl.java
  6. 4 0
      blade-service/blade-los/src/main/java/org/springblade/los/business/customsDeclaration/mapper/CustomsDeclarationMapper.java
  7. 77 0
      blade-service/blade-los/src/main/java/org/springblade/los/business/customsDeclaration/mapper/CustomsDeclarationMapper.xml
  8. 8 5
      blade-service/blade-los/src/main/java/org/springblade/los/business/sea/mapper/BillsMapper.java
  9. 62 0
      blade-service/blade-los/src/main/java/org/springblade/los/business/sea/mapper/BillsMapper.xml
  10. 0 2
      blade-service/blade-los/src/main/java/org/springblade/los/business/sea/mapper/ContainersBillsMapper.java
  11. 0 77
      blade-service/blade-los/src/main/java/org/springblade/los/business/sea/mapper/ContainersBillsMapper.xml
  12. 41 26
      blade-service/blade-los/src/main/java/org/springblade/los/business/sea/service/impl/BillsServiceImpl.java
  13. 4 1
      blade-service/blade-los/src/main/java/org/springblade/los/check/controller/AuditPathsActsController.java
  14. 4 1
      blade-service/blade-los/src/main/java/org/springblade/los/check/controller/AuditPathsController.java
  15. 4 1
      blade-service/blade-los/src/main/java/org/springblade/los/check/controller/AuditProecessController.java
  16. 96 0
      blade-service/blade-los/src/main/java/org/springblade/los/feign/LosClient.java
  17. 71 0
      blade-service/blade-los/src/main/java/org/springblade/los/statisticAnalysis/controller/IndexStatisticsController.java
  18. 8 0
      blade-service/blade-los/src/main/java/org/springblade/los/statisticAnalysis/service/IStatisticAnalysisService.java
  19. 278 3
      blade-service/blade-los/src/main/java/org/springblade/los/statisticAnalysis/service/impl/StatisticAnalysisServiceImpl.java
  20. 6 0
      blade-service/blade-system/pom.xml
  21. 9 1
      blade-service/blade-system/src/main/java/org/springblade/system/controller/TenantController.java
  22. 4 0
      blade-service/blade-system/src/main/java/org/springblade/system/mapper/DictBizMapper.java
  23. 7 0
      blade-service/blade-system/src/main/java/org/springblade/system/mapper/DictBizMapper.xml
  24. 3 1
      blade-service/blade-system/src/main/java/org/springblade/system/mapper/RoleMapper.java
  25. 3 0
      blade-service/blade-system/src/main/java/org/springblade/system/mapper/RoleMapper.xml
  26. 2 0
      blade-service/blade-system/src/main/java/org/springblade/system/service/IDictBizService.java
  27. 1 0
      blade-service/blade-system/src/main/java/org/springblade/system/service/IRoleService.java
  28. 2 0
      blade-service/blade-system/src/main/java/org/springblade/system/service/ITenantService.java
  29. 5 0
      blade-service/blade-system/src/main/java/org/springblade/system/service/impl/DictBizServiceImpl.java
  30. 5 0
      blade-service/blade-system/src/main/java/org/springblade/system/service/impl/RoleServiceImpl.java
  31. 108 0
      blade-service/blade-system/src/main/java/org/springblade/system/service/impl/TenantServiceImpl.java
  32. 36 36
      blade-service/blade-system/src/main/resources/log/logback-dev.xml

+ 80 - 0
blade-service-api/blade-los-api/src/main/java/org/springblade/los/feign/ILosClient.java

@@ -0,0 +1,80 @@
+package org.springblade.los.feign;
+
+import org.springblade.core.tool.api.R;
+import org.springblade.los.basic.business.entity.BusinessType;
+import org.springblade.los.billno.entity.BusinessBillNo;
+import org.springblade.los.check.entity.LosAuditPaths;
+import org.springblade.los.check.entity.LosAuditPathsActs;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+
+import java.util.List;
+
+/**
+ * @author caifc
+ * @date 2023年8月14日10:18:34
+ */
+@FeignClient(
+	value = "blade-los"
+)
+public interface ILosClient {
+	String API_PREFIX = "/blade-los";
+	String GET_LOS_AUDIT_PATHS = API_PREFIX + "/getLosAuditPaths";
+	String GET_LOS_AUDIT_PATHS_ACTS = API_PREFIX + "/getLosAuditPathsActs";
+	String ADD_LOS_AUDIT_PATHS_LIST = API_PREFIX + "/addLosAuditPathsList";
+	String ADD_LOS_AUDIT_PATHS_ACTS_LIST = API_PREFIX + "/addLosAuditPathsActsList";
+	String GET_BUSINESS_TYPE = API_PREFIX + "/getBusinessType";
+	String GET_BUSINESS_BILL_NO = API_PREFIX + "/getBusinessBillNo";
+	String ADD_BUSINESS_TYPE = API_PREFIX + "/addBusinessTypeList";
+	String ADD_BUSINESS_BILL_NO = API_PREFIX + "/addBusinessBillNoList";
+
+
+	/**
+	 * 审批流配置主表实体类
+	 */
+	@GetMapping(GET_LOS_AUDIT_PATHS)
+	List<LosAuditPaths> getLosAuditPaths(@RequestBody LosAuditPaths losAuditPaths);
+
+	/**
+	 * 审批流配置明细表实体类
+	 */
+	@GetMapping(GET_LOS_AUDIT_PATHS_ACTS)
+	List<LosAuditPathsActs> getLosAuditPathsActs(@RequestBody LosAuditPathsActs losAuditPathsActs);
+
+	/**
+	 * 保存审批流配置主表实体类
+	 */
+	@GetMapping(ADD_LOS_AUDIT_PATHS_LIST)
+	R addLosAuditPathsList(@RequestBody List<LosAuditPaths> losAuditPathsList);
+
+	/**
+	 * 保存审批流配置明细表实体类
+	 */
+	@GetMapping(ADD_LOS_AUDIT_PATHS_ACTS_LIST)
+	R addLosAuditPathsActsList(@RequestBody List<LosAuditPathsActs> losAuditPathsActsList);
+
+	/**
+	 * 业务类型
+	 */
+	@GetMapping(GET_BUSINESS_TYPE)
+	List<BusinessType> getBusinessType(@RequestBody BusinessType businessType);
+
+	/**
+	 * 业务类型编号格式
+	 */
+	@GetMapping(GET_BUSINESS_BILL_NO)
+	List<BusinessBillNo> getBusinessBillNo(@RequestBody BusinessBillNo businessBillNo);
+
+	/**
+	 * 保存业务类型
+	 */
+	@GetMapping(ADD_BUSINESS_TYPE)
+	R addBusinessTypeList(@RequestBody List<BusinessType> businessTypeList);
+
+	/**
+	 * 保存业务类型编号格式
+	 */
+	@GetMapping(ADD_BUSINESS_BILL_NO)
+	R addBusinessBillNoList(@RequestBody List<BusinessBillNo> businessBillNoList);
+}

+ 2 - 0
blade-service/blade-los/src/main/java/org/springblade/los/LosApplication.java

@@ -21,6 +21,7 @@ import org.springblade.core.cloud.feign.EnableBladeFeign;
 import org.springblade.core.launch.BladeApplication;
 import org.springblade.core.transaction.annotation.SeataCloudApplication;
 import org.springframework.cloud.client.SpringCloudApplication;
+import org.springframework.cloud.openfeign.EnableFeignClients;
 
 /**
  * 启动器
@@ -30,6 +31,7 @@ import org.springframework.cloud.client.SpringCloudApplication;
 @EnableBladeFeign
 @SpringCloudApplication
 @SeataCloudApplication
+@EnableFeignClients({"org.springblade", "org.springblade.los.*"})
 public class LosApplication {
 
 	public static void main(String[] args) {

+ 7 - 3
blade-service/blade-los/src/main/java/org/springblade/los/business/aea/mapper/AeaBillsMapper.java

@@ -16,14 +16,15 @@
  */
 package org.springblade.los.business.aea.mapper;
 
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
 import org.apache.ibatis.annotations.Param;
 import org.springblade.los.business.aea.entity.AeaBills;
 import org.springblade.los.business.aea.vo.AeaBillsVO;
-import com.baomidou.mybatisplus.core.mapper.BaseMapper;
-import com.baomidou.mybatisplus.core.metadata.IPage;
 import org.springblade.los.statisticAnalysis.FinanceProfit;
 
 import java.util.List;
+import java.util.Map;
 
 /**
  * 业务-空运进出口 Mapper 接口
@@ -42,5 +43,8 @@ public interface AeaBillsMapper extends BaseMapper<AeaBills> {
 	 */
 	List<AeaBillsVO> selectAeaBillsPage(IPage page, AeaBillsVO aeaBills);
 
-    List<FinanceProfit> financeProfit(@Param("data")FinanceProfit financeProfit);
+	List<FinanceProfit> financeProfit(@Param("data") FinanceProfit financeProfit);
+
+	List<Map<String, Object>> trend(@Param("tenantId") String tenantId, @Param("deptPid") Long deptPid, @Param("postId") String postId,
+									@Param("date") String dateStart);
 }

+ 60 - 0
blade-service/blade-los/src/main/java/org/springblade/los/business/aea/mapper/AeaBillsMapper.xml

@@ -297,5 +297,65 @@
         ORDER BY
         seb.create_time
     </select>
+    <select id="trend" resultType="java.util.Map">
+        SELECT
+        m.id moon,
+        IFNULL( n.money, 0 ) money
+        FROM
+        (
+        SELECT
+        1 AS id UNION
+        SELECT
+        2 UNION
+        SELECT
+        3 UNION
+        SELECT
+        4 UNION
+        SELECT
+        5 UNION
+        SELECT
+        6 UNION
+        SELECT
+        7 UNION
+        SELECT
+        8 UNION
+        SELECT
+        9 UNION
+        SELECT
+        10 UNION
+        SELECT
+        11 UNION
+        SELECT
+        12
+        ) m
+        LEFT JOIN (
+        SELECT
+        DATE_FORMAT( aea.bill_date, '%m' ) AS moon,
+        ROUND( IFNULL( SUM( aea.measurement ), 0 ), 2 ) AS money
+        FROM
+        los_aea_bills aea
+        WHERE
+        aea.is_deleted = 0
+        <if test="deptPid!=null">
+            AND aea.branch_id = #{deptPid}
+        </if>
+        <if test="postId!=null and postId != ''">
+            AND find_in_set(aea.team_id,#{postId})
+        </if>
+        <if test="tenantId!=null and tenantId != ''">
+            AND aea.tenant_id = #{tenantId}
+        </if>
+        <if test="date==null or date == ''">
+            AND YEAR ( aea.bill_date ) = YEAR (NoW())
+        </if>
+        <if test="date!=null and date != ''">
+            AND YEAR ( aea.bill_date ) = #{date}
+        </if>
+        GROUP BY
+        DATE_FORMAT( aea.bill_date, '%m' )
+        ) n ON m.id = n.moon
+        ORDER BY
+        m.id
+    </select>
 
 </mapper>

+ 14 - 0
blade-service/blade-los/src/main/java/org/springblade/los/business/aea/service/impl/AeaBillsServiceImpl.java

@@ -41,6 +41,7 @@ import org.springblade.los.business.aea.service.IAeaBillsService;
 import org.springblade.los.business.aea.vo.AeaBillsVO;
 import org.springblade.los.business.files.entity.FilesCenter;
 import org.springblade.los.business.files.service.IFilesCenterService;
+import org.springblade.los.business.sea.entity.Bills;
 import org.springblade.los.check.dto.LosAuditProecessDTO;
 import org.springblade.los.check.entity.LosAuditPathsActs;
 import org.springblade.los.check.entity.LosAuditPathsLevels;
@@ -742,6 +743,19 @@ public class AeaBillsServiceImpl extends ServiceImpl<AeaBillsMapper, AeaBills> i
 		if (feeCenterList.isEmpty()) {
 			throw new RuntimeException("请维护费用信息");
 		}
+		if ("MM".equals(declare.getBillType())) {
+			List<AeaBills> billsList = baseMapper.selectList(new LambdaQueryWrapper<AeaBills>()
+				.eq(AeaBills::getTenantId, AuthUtil.getTenantId())
+				.eq(AeaBills::getIsDeleted, 0)
+				.eq(AeaBills::getMasterId, declare.getId()));
+			List<FeeCenter> feeCenters = feeCenterService.list(new LambdaQueryWrapper<FeeCenter>()
+				.eq(FeeCenter::getTenantId, AuthUtil.getTenantId())
+				.eq(FeeCenter::getIsDeleted, 0)
+				.in(FeeCenter::getPid, billsList.stream().map(AeaBills::getId).collect(Collectors.toList())));
+			if (!feeCenters.isEmpty()) {
+				feeCenterList.addAll(feeCenters);
+			}
+		}
 		List<FeeCenter> feeCenterListPS = feeCenterList.stream().filter(e -> e.getFeeCnName().equals("PS")).collect(Collectors.toList());
 		List<FeeCenter> feeCenterListKY = feeCenterList.stream().filter(e -> e.getFeeCnName().equals("空运费")).collect(Collectors.toList());
 		if (!feeCenterListPS.isEmpty()&& !feeCenterListKY.isEmpty()) {

+ 4 - 0
blade-service/blade-los/src/main/java/org/springblade/los/business/customsDeclaration/mapper/CustomsDeclarationMapper.java

@@ -16,10 +16,13 @@
  */
 package org.springblade.los.business.customsDeclaration.mapper;
 
+import org.apache.ibatis.annotations.Param;
 import org.springblade.los.business.customsDeclaration.entity.CustomsDeclaration;
 import org.springblade.los.business.customsDeclaration.vo.CustomsDeclarationVO;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import org.springblade.los.statisticAnalysis.FinanceProfit;
+
 import java.util.List;
 
 /**
@@ -39,4 +42,5 @@ public interface CustomsDeclarationMapper extends BaseMapper<CustomsDeclaration>
 	 */
 	List<CustomsDeclarationVO> selectCustomsDeclarationPage(IPage page, CustomsDeclarationVO customsDeclaration);
 
+	List<FinanceProfit> financeProfit(@Param("data")FinanceProfit financeProfit);
 }

+ 77 - 0
blade-service/blade-los/src/main/java/org/springblade/los/business/customsDeclaration/mapper/CustomsDeclarationMapper.xml

@@ -120,5 +120,82 @@
     <select id="selectCustomsDeclarationPage" resultMap="customsDeclarationResultMap">
         select * from los_customs_declaration where is_deleted = 0
     </select>
+    <select id="financeProfit" resultType="org.springblade.los.statisticAnalysis.FinanceProfit">
+        SELECT
+        seb.business_type AS billType,
+        seb.bill_no AS billNo,
+        seb.mblno AS mBlNo,
+        seb.corp_cn_name AS corpName,
+        seb.bill_date AS statisticsDate,
+        seb.src_cn_name AS salesman,
+        seb.vessel_cn_name AS vesselCnName,
+        SUM(IF(feeDU.amount,feeDU.amount,0.00)) AS amountDrUsd,
+        SUM(IF(feeDU.stl_ttl_amount,feeDU.stl_ttl_amount,0.00)) AS realAmountDrUsd,
+        SUM(IF(feeDC.amount,feeDC.amount,0.00)) AS amountDr,
+        SUM(IF(feeDC.stl_ttl_amount,feeDC.stl_ttl_amount,0.00)) AS realAmountDr,
+        SUM(IF(feeCU.amount,feeCU.amount,0.00)) AS amountCrUsd,
+        SUM(IF(feeCU.stl_ttl_amount,feeCU.stl_ttl_amount,0.00)) AS realAmountCrUsd,
+        SUM(IF(feeCC.amount,feeCC.amount,0.00)) AS amountCr,
+        SUM(IF(feeCC.stl_ttl_amount,feeCC.stl_ttl_amount,0.00)) AS realAmountCr,
+        seb.amount_profit_loc AS amountProfitLoc
+        FROM
+        los_customs_declaration seb
+        LEFT JOIN los_fee_center feeCC ON seb.id = feeCC.pid
+        AND feeCC.dc = 'C' and feeCC.cur_code = 'CNY' AND feeCC.is_deleted = '0'
+        LEFT JOIN los_fee_center feeCU ON seb.id = feeCU.pid
+        AND feeCU.dc = 'C' and feeCU.cur_code = 'USD' AND feeCU.is_deleted = '0'
+        LEFT JOIN los_fee_center feeDC ON seb.id = feeDC.pid
+        AND feeDC.dc = 'D' and feeDC.cur_code = 'CNY'  AND feeDC.is_deleted = '0'
+        LEFT JOIN los_fee_center feeDU ON seb.id = feeDU.pid
+        AND feeDU.dc = 'D' and feeDU.cur_code = 'USD'  AND feeDU.is_deleted = '0'
+        WHERE
+        seb.is_deleted = '0'
+        <if test="data.billType != null and data.billType != ''">
+            and find_in_set(seb.business_type,#{data.billType})
+        </if>
+        <if test="data.billNo != null and data.billNo != ''">
+            and seb.bill_no like concat('%', #{data.billNo}, '%')
+        </if>
+        <if test="data.mBlNo != null and data.mBlNo != ''">
+            and seb.mblNo like concat('%', #{data.mBlNo}, '%')
+        </if>
+        <if test='data.corpId != null'>
+            and seb.corp_id = #{data.corpId}
+        </if>
+        <if test="data.voyageNo != null and data.voyageNo != ''">
+            and seb.voyage_no = #{data.voyageNo}
+        </if>
+        <if test="data.srcType != null and data.srcType != ''">
+            and seb.src_type = #{data.srcType}
+        </if>
+        <if test='data.srcId != null'>
+            and seb.src_id = #{data.srcId}
+        </if>
+        <if test="data.examine != null and data.examine != ''">
+            and seb.status = 3
+        </if>
+        <if test="data.examineDate != null and data.examineDate != ''">
+            <if test='data.statisticsDateStart != null and data.statisticsDateStart != null'>
+                and seb.approved_date &gt;= #{data.statisticsDateStart}
+            </if>
+            <if test='data.statisticsDateEnd != null and data.statisticsDateEnd != null'>
+                and seb.approved_date &lt;= #{data.statisticsDateStart}
+            </if>
+        </if>
+        <if test="data.examineDate == null or data.examineDate == ''">
+            <if test='data.statisticsDateStart != null and data.statisticsDateStart != null'>
+                and seb.bill_date &gt;= #{data.statisticsDateStart}
+            </if>
+            <if test='data.statisticsDateEnd != null and data.statisticsDateEnd != null'>
+                and seb.bill_date &lt;= #{data.statisticsDateStart}
+            </if>
+        </if>
+        <if test="data.costMerge != null and data.costMerge != ''">
+            GROUP BY
+            seb.bill_no
+        </if>
+        ORDER BY
+        seb.create_time
+    </select>
 
 </mapper>

+ 8 - 5
blade-service/blade-los/src/main/java/org/springblade/los/business/sea/mapper/BillsMapper.java

@@ -16,14 +16,14 @@
  */
 package org.springblade.los.business.sea.mapper;
 
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
 import org.apache.ibatis.annotations.Param;
-import org.springblade.los.statisticAnalysis.DecisionAnalysis;
 import org.springblade.los.business.sea.entity.Bills;
 import org.springblade.los.business.sea.vo.BillsVO;
-import com.baomidou.mybatisplus.core.mapper.BaseMapper;
-import com.baomidou.mybatisplus.core.metadata.IPage;
 import org.springblade.los.finance.fee.entity.ListAccBillVO;
 import org.springblade.los.finance.fee.vo.FinAccBillsVO;
+import org.springblade.los.statisticAnalysis.DecisionAnalysis;
 import org.springblade.los.statisticAnalysis.FinanceProfit;
 
 import java.util.List;
@@ -46,7 +46,7 @@ public interface BillsMapper extends BaseMapper<Bills> {
 	 */
 	List<BillsVO> selectBillsPage(IPage page, BillsVO bills);
 
-    List<FinAccBillsVO> listAccBill(@Param("acc") ListAccBillVO finAccBills);
+	List<FinAccBillsVO> listAccBill(@Param("acc") ListAccBillVO finAccBills);
 
 	List<DecisionAnalysis> decisionAnalysis(@Param("data") DecisionAnalysis decisionAnalysis, IPage<DecisionAnalysis> page);
 
@@ -56,5 +56,8 @@ public interface BillsMapper extends BaseMapper<Bills> {
 
 	FinAccBillsVO listByAccBillId(@Param("acc") ListAccBillVO finAccBills);
 
-	List<FinanceProfit> financeProfit(@Param("data")FinanceProfit financeProfit);
+	List<FinanceProfit> financeProfit(@Param("data") FinanceProfit financeProfit);
+
+	List<Map<String, Object>> trend(@Param("tenantId") String tenantId, @Param("deptPid") Long deptPid, @Param("postId") String postId,
+									@Param("date") String date);
 }

+ 62 - 0
blade-service/blade-los/src/main/java/org/springblade/los/business/sea/mapper/BillsMapper.xml

@@ -791,5 +791,67 @@
         ORDER BY
             seb.create_time
     </select>
+    <select id="trend" resultType="java.util.Map">
+        SELECT
+            m.id moon,
+            IFNULL( n.money, 0 ) money
+        FROM
+            (
+                SELECT
+                    1 AS id UNION
+                SELECT
+                    2 UNION
+                SELECT
+                    3 UNION
+                SELECT
+                    4 UNION
+                SELECT
+                    5 UNION
+                SELECT
+                    6 UNION
+                SELECT
+                    7 UNION
+                SELECT
+                    8 UNION
+                SELECT
+                    9 UNION
+                SELECT
+                    10 UNION
+                SELECT
+                    11 UNION
+                SELECT
+                    12
+            ) m
+                LEFT JOIN (
+                SELECT
+                    DATE_FORMAT( sea.bill_date, '%m' ) AS moon,
+                    ROUND( IFNULL( SUM( pre.TEU * pre.quantity ), 0 ), 2 ) AS money
+                FROM
+                    los_sea_bills sea
+                        LEFT JOIN los_sea_pre_containers pre ON sea.id = pre.pid
+                WHERE
+                    sea.is_deleted = 0
+                  AND pre.is_deleted = 0
+        <if test="deptPid!=null">
+            AND sea.branch_id = #{deptPid}
+        </if>
+        <if test="postId!=null and postId != ''">
+            AND find_in_set(sea.team_id,#{postId})
+        </if>
+        <if test="tenantId!=null and tenantId != ''">
+            AND sea.tenant_id = #{tenantId}
+        </if>
+        <if test="date==null or date == ''">
+            AND YEAR ( sea.bill_date ) = YEAR (NoW())
+        </if>
+        <if test="date!=null and date != ''">
+            AND YEAR ( sea.bill_date ) = #{date}
+        </if>
+                GROUP BY
+                    DATE_FORMAT( sea.bill_date, '%m' )
+            ) n ON m.id = n.moon
+        ORDER BY
+            m.id
+    </select>
 
 </mapper>

+ 0 - 2
blade-service/blade-los/src/main/java/org/springblade/los/business/sea/mapper/ContainersBillsMapper.java

@@ -43,6 +43,4 @@ public interface ContainersBillsMapper extends BaseMapper<ContainersBills> {
 	List<ContainersBillsVO> selectContainersBillsPage(IPage page, ContainersBillsVO containersBills);
 
 	void removeByPid(@Param("ids")List<Long> ids);
-
-    List<FinanceProfit> financeProfit(@Param("data")FinanceProfit financeProfit);
 }

+ 0 - 77
blade-service/blade-los/src/main/java/org/springblade/los/business/sea/mapper/ContainersBillsMapper.xml

@@ -62,82 +62,5 @@
     <select id="selectContainersBillsPage" resultMap="containersBillsResultMap">
         select * from los_sea_containers_bills where is_deleted = 0
     </select>
-    <select id="financeProfit" resultType="org.springblade.los.statisticAnalysis.FinanceProfit">
-        SELECT
-        seb.business_type AS billType,
-        seb.bill_no AS billNo,
-        seb.mblno AS mBlNo,
-        seb.corp_cn_name AS corpName,
-        seb.bill_date AS statisticsDate,
-        seb.src_cn_name AS salesman,
-        seb.vessel_cn_name AS vesselCnName,
-        SUM(IF(feeDU.amount,feeDU.amount,0.00)) AS amountDrUsd,
-        SUM(IF(feeDU.stl_ttl_amount,feeDU.stl_ttl_amount,0.00)) AS realAmountDrUsd,
-        SUM(IF(feeDC.amount,feeDC.amount,0.00)) AS amountDr,
-        SUM(IF(feeDC.stl_ttl_amount,feeDC.stl_ttl_amount,0.00)) AS realAmountDr,
-        SUM(IF(feeCU.amount,feeCU.amount,0.00)) AS amountCrUsd,
-        SUM(IF(feeCU.stl_ttl_amount,feeCU.stl_ttl_amount,0.00)) AS realAmountCrUsd,
-        SUM(IF(feeCC.amount,feeCC.amount,0.00)) AS amountCr,
-        SUM(IF(feeCC.stl_ttl_amount,feeCC.stl_ttl_amount,0.00)) AS realAmountCr,
-        seb.amount_profit_loc AS amountProfitLoc
-        FROM
-        los_customs_declaration seb
-        LEFT JOIN los_fee_center feeCC ON seb.id = feeCC.pid
-        AND feeCC.dc = 'C' and feeCC.cur_code = 'CNY' AND feeCC.is_deleted = '0'
-        LEFT JOIN los_fee_center feeCU ON seb.id = feeCU.pid
-        AND feeCU.dc = 'C' and feeCU.cur_code = 'USD' AND feeCU.is_deleted = '0'
-        LEFT JOIN los_fee_center feeDC ON seb.id = feeDC.pid
-        AND feeDC.dc = 'D' and feeDC.cur_code = 'CNY'  AND feeDC.is_deleted = '0'
-        LEFT JOIN los_fee_center feeDU ON seb.id = feeDU.pid
-        AND feeDU.dc = 'D' and feeDU.cur_code = 'USD'  AND feeDU.is_deleted = '0'
-        WHERE
-        seb.is_deleted = '0'
-        <if test="data.billType != null and data.billType != ''">
-            and find_in_set(seb.business_type,#{data.billType})
-        </if>
-        <if test="data.billNo != null and data.billNo != ''">
-            and seb.bill_no like concat('%', #{data.billNo}, '%')
-        </if>
-        <if test="data.mBlNo != null and data.mBlNo != ''">
-            and seb.mblNo like concat('%', #{data.mBlNo}, '%')
-        </if>
-        <if test='data.corpId != null'>
-            and seb.corp_id = #{data.corpId}
-        </if>
-        <if test="data.voyageNo != null and data.voyageNo != ''">
-            and seb.voyage_no = #{data.voyageNo}
-        </if>
-        <if test="data.srcType != null and data.srcType != ''">
-            and seb.src_type = #{data.srcType}
-        </if>
-        <if test='data.srcId != null'>
-            and seb.src_id = #{data.srcId}
-        </if>
-        <if test="data.examine != null and data.examine != ''">
-            and seb.status = 3
-        </if>
-        <if test="data.examineDate != null and data.examineDate != ''">
-            <if test='data.statisticsDateStart != null and data.statisticsDateStart != null'>
-                and seb.approved_date &gt;= #{data.statisticsDateStart}
-            </if>
-            <if test='data.statisticsDateEnd != null and data.statisticsDateEnd != null'>
-                and seb.approved_date &lt;= #{data.statisticsDateStart}
-            </if>
-        </if>
-        <if test="data.examineDate == null or data.examineDate == ''">
-            <if test='data.statisticsDateStart != null and data.statisticsDateStart != null'>
-                and seb.bill_date &gt;= #{data.statisticsDateStart}
-            </if>
-            <if test='data.statisticsDateEnd != null and data.statisticsDateEnd != null'>
-                and seb.bill_date &lt;= #{data.statisticsDateStart}
-            </if>
-        </if>
-        <if test="data.costMerge != null and data.costMerge != ''">
-            GROUP BY
-            seb.bill_no
-        </if>
-        ORDER BY
-        seb.create_time
-    </select>
 
 </mapper>

+ 41 - 26
blade-service/blade-los/src/main/java/org/springblade/los/business/sea/service/impl/BillsServiceImpl.java

@@ -357,34 +357,36 @@ public class BillsServiceImpl extends ServiceImpl<BillsMapper, Bills> implements
 		Integer GP45 = 0;
 		Integer GP48 = 0;
 		StringBuilder boxTypeSum = new StringBuilder();
-		if (ObjectUtils.isNotNull(bills.getPreContainersList())) {
-			BigDecimal teu = new BigDecimal("0.00");
-			for (PreContainers item : bills.getPreContainersList()) {
-				item.setPid(bills.getId());
-				if ("20GP".equals(item.getCntrTypeCode())) {
-					GP20 += item.getQuantity();
-				} else if ("40GP".equals(item.getCntrTypeCode())) {
-					GP40 += item.getQuantity();
-				} else if ("40HC".equals(item.getCntrTypeCode())) {
-					HC40 += item.getQuantity();
-				} else if ("45GP".equals(item.getCntrTypeCode())) {
-					GP45 += item.getQuantity();
-				} else if ("48GP".equals(item.getCntrTypeCode())) {
-					GP48 += item.getQuantity();
+		if (ObjectUtils.isNull(bills.getCfsQuantity()) || bills.getCfsQuantity().compareTo(new BigDecimal("0.00")) == 0) {
+			if (ObjectUtils.isNotNull(bills.getPreContainersList())) {
+				BigDecimal teu = new BigDecimal("0.00");
+				for (PreContainers item : bills.getPreContainersList()) {
+					item.setPid(bills.getId());
+					if ("20GP".equals(item.getCntrTypeCode())) {
+						GP20 += item.getQuantity();
+					} else if ("40GP".equals(item.getCntrTypeCode())) {
+						GP40 += item.getQuantity();
+					} else if ("40HC".equals(item.getCntrTypeCode())) {
+						HC40 += item.getQuantity();
+					} else if ("45GP".equals(item.getCntrTypeCode())) {
+						GP45 += item.getQuantity();
+					} else if ("48GP".equals(item.getCntrTypeCode())) {
+						GP48 += item.getQuantity();
+					}
+					boxTypeSum.append(item.getCntrTypeCode()).append("*").append(item.getQuantity()).append(",");
+					if (ObjectUtils.isNotNull(item.getQuantity()) && ObjectUtils.isNotNull(item.getTeu())) {
+						teu = teu.add(new BigDecimal(item.getQuantity()).multiply(item.getTeu()));
+					}
 				}
-				boxTypeSum.append(item.getCntrTypeCode()).append("*").append(item.getQuantity()).append(",");
-				if (ObjectUtils.isNotNull(item.getQuantity()) && ObjectUtils.isNotNull(item.getTeu())) {
-					teu = teu.add(new BigDecimal(item.getQuantity()).multiply(item.getTeu()));
+				bills.setTeu(teu.intValue());
+				R res = preContainersService.submitList(bills.getPreContainersList());
+				if (!res.isSuccess()) {
+					throw new RuntimeException("保存失败");
+				}
+				if (boxTypeSum.length() > 0) {
+					boxTypeSum = new StringBuilder(boxTypeSum.substring(0, boxTypeSum.length() - 1));
+					bills.setQuantityCntrDescr(boxTypeSum.toString());
 				}
-			}
-			bills.setTeu(teu.intValue());
-			R res = preContainersService.submitList(bills.getPreContainersList());
-			if (!res.isSuccess()) {
-				throw new RuntimeException("保存失败");
-			}
-			if (boxTypeSum.length() > 0) {
-				boxTypeSum = new StringBuilder(boxTypeSum.substring(0, boxTypeSum.length() - 1));
-				bills.setQuantityCntrDescr(boxTypeSum.toString());
 			}
 		}
 		bills.setQuantityV20(GP20);
@@ -1100,6 +1102,19 @@ public class BillsServiceImpl extends ServiceImpl<BillsMapper, Bills> implements
 		if (feeCenterList.isEmpty()) {
 			throw new RuntimeException("请维护费用信息");
 		}
+		if ("MM".equals(declare.getBillType())) {
+			List<Bills> billsList = baseMapper.selectList(new LambdaQueryWrapper<Bills>()
+				.eq(Bills::getTenantId, AuthUtil.getTenantId())
+				.eq(Bills::getIsDeleted, 0)
+				.eq(Bills::getMasterId, declare.getId()));
+			List<FeeCenter> feeCenters = feeCenterService.list(new LambdaQueryWrapper<FeeCenter>()
+				.eq(FeeCenter::getTenantId, AuthUtil.getTenantId())
+				.eq(FeeCenter::getIsDeleted, 0)
+				.in(FeeCenter::getPid, billsList.stream().map(Bills::getId).collect(Collectors.toList())));
+			if (!feeCenters.isEmpty()) {
+				feeCenterList.addAll(feeCenters);
+			}
+		}
 		List<FeeCenter> feeCenterListPS = feeCenterList.stream().filter(e -> e.getFeeCnName().equals("PS")).collect(Collectors.toList());
 		List<FeeCenter> feeCenterListHY = feeCenterList.stream().filter(e -> e.getFeeCnName().equals("海运费")).collect(Collectors.toList());
 		if (!feeCenterListPS.isEmpty() && !feeCenterListHY.isEmpty()) {

+ 4 - 1
blade-service/blade-los/src/main/java/org/springblade/los/check/controller/AuditPathsActsController.java

@@ -30,6 +30,7 @@ import org.springblade.core.mp.support.Condition;
 import org.springblade.core.mp.support.Query;
 import org.springblade.core.secure.utils.AuthUtil;
 import org.springblade.core.tool.api.R;
+import org.springblade.los.Util.IDeptUtils;
 import org.springblade.los.check.entity.LosAuditPaths;
 import org.springblade.los.check.entity.LosAuditPathsActs;
 import org.springblade.los.check.entity.LosAuditPathsLevels;
@@ -58,6 +59,8 @@ public class AuditPathsActsController extends BladeController {
 
 	private final IAuditPathsService pathsService;
 
+	private final IDeptUtils deptUtils;
+
 
 	@GetMapping("/list")
 	@ApiOperationSupport(order = 2)
@@ -68,7 +71,7 @@ public class AuditPathsActsController extends BladeController {
 		lambdaQueryWrapper.eq(LosAuditPathsActs::getTenantId, AuthUtil.getTenantId());
 		lambdaQueryWrapper.like(StringUtils.isNotBlank(auditPathsActs.getActName()),LosAuditPathsActs::getActName,auditPathsActs.getActName());
 		if (!AuthUtil.getUserRole().contains("admin")) {
-			lambdaQueryWrapper.eq(LosAuditPathsActs::getSalesCompanyId, AuthUtil.getDeptId());//公司
+			lambdaQueryWrapper.eq(LosAuditPathsActs::getSalesCompanyId, deptUtils.getDeptPid());//公司
 		}
 		IPage<LosAuditPathsActs> pages = auditPathsActsService.page(Condition.getPage(query), lambdaQueryWrapper);
 		List<LosAuditPathsActs> records = pages.getRecords();

+ 4 - 1
blade-service/blade-los/src/main/java/org/springblade/los/check/controller/AuditPathsController.java

@@ -31,6 +31,7 @@ import org.springblade.core.secure.utils.AuthUtil;
 import org.springblade.core.tool.api.R;
 import org.springblade.core.tool.utils.Func;
 import org.springblade.core.tool.utils.ObjectUtil;
+import org.springblade.los.Util.IDeptUtils;
 import org.springblade.los.check.entity.LosAuditPaths;
 import org.springblade.los.check.entity.LosAuditPathsActs;
 import org.springblade.los.check.entity.LosAuditPathsLevels;
@@ -63,6 +64,8 @@ public class AuditPathsController extends BladeController {
 
 	private final IAuditPathsActsService auditPathsActsService;
 
+	private final IDeptUtils deptUtils;
+
 	/**
 	 * 详情
 	 */
@@ -88,7 +91,7 @@ public class AuditPathsController extends BladeController {
 			.eq(LosAuditPaths::getTenantId, AuthUtil.getTenantId())
 			.orderByDesc(LosAuditPaths::getOpDate);
 		if (!AuthUtil.getUserRole().contains("admin")) {
-			lambdaQueryWrapper.eq(LosAuditPaths::getSalesCompanyId, AuthUtil.getDeptId());//公司
+			lambdaQueryWrapper.eq(LosAuditPaths::getSalesCompanyId, deptUtils.getDeptPid());//公司
 		}
 		IPage<LosAuditPaths> pages = auditPathsService.page(Condition.getPage(query),lambdaQueryWrapper);
 		return R.data(pages);

+ 4 - 1
blade-service/blade-los/src/main/java/org/springblade/los/check/controller/AuditProecessController.java

@@ -35,6 +35,7 @@ import org.springblade.core.secure.utils.SecureUtil;
 import org.springblade.core.tool.api.R;
 import org.springblade.core.tool.utils.BeanUtil;
 import org.springblade.core.tool.utils.ObjectUtil;
+import org.springblade.los.Util.IDeptUtils;
 import org.springblade.los.basic.corps.entity.BCorps;
 import org.springblade.los.basic.corps.service.IBCorpsService;
 import org.springblade.los.check.dto.LosAuditProecessDTO;
@@ -67,6 +68,8 @@ public class AuditProecessController extends BladeController {
 
 	private final IBCorpsService bCorpsService;
 
+	private final IDeptUtils deptUtils;
+
 	/**
 	 * 分页 审批流记录
 	 */
@@ -91,7 +94,7 @@ public class AuditProecessController extends BladeController {
 		}
 		lambdaQueryWrapper.ne(StringUtils.isBlank(auditProecess.getAuditStatus()), LosAuditProecess::getAuditStatus, "N");
 		if (!AuthUtil.getUserRole().contains("admin")) {
-			lambdaQueryWrapper.eq(LosAuditProecess::getSalesCompanyId, AuthUtil.getDeptId());//公司
+			lambdaQueryWrapper.eq(LosAuditProecess::getSalesCompanyId, deptUtils.getDeptPid());//公司
 		}
 		IPage pages = auditProecessService.page(Condition.getPage(query), lambdaQueryWrapper);
 		List<LosAuditProecess> auditProecessList = pages.getRecords();

+ 96 - 0
blade-service/blade-los/src/main/java/org/springblade/los/feign/LosClient.java

@@ -0,0 +1,96 @@
+package org.springblade.los.feign;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import lombok.AllArgsConstructor;
+import org.springblade.core.tenant.annotation.NonDS;
+import org.springblade.core.tenant.annotation.TenantIgnore;
+import org.springblade.core.tool.api.R;
+import org.springblade.los.basic.business.entity.BusinessType;
+import org.springblade.los.basic.business.service.IBusinessTypeService;
+import org.springblade.los.billno.entity.BusinessBillNo;
+import org.springblade.los.billno.service.IBusinessBillNoService;
+import org.springblade.los.check.entity.LosAuditPaths;
+import org.springblade.los.check.entity.LosAuditPathsActs;
+import org.springblade.los.check.service.IAuditPathsActsService;
+import org.springblade.los.check.service.IAuditPathsService;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RestController;
+import springfox.documentation.annotations.ApiIgnore;
+
+import java.util.List;
+
+@NonDS
+@ApiIgnore()
+@RestController
+@AllArgsConstructor
+public class LosClient implements ILosClient {
+
+	private final IAuditPathsService auditPathsService;
+
+	private final IAuditPathsActsService auditPathsActsService;
+
+	private final IBusinessTypeService bBusinessTypeService;
+
+	private final IBusinessBillNoService businessBillNoService;
+
+
+	@Override
+	@TenantIgnore
+	@GetMapping(GET_LOS_AUDIT_PATHS)
+	public List<LosAuditPaths> getLosAuditPaths(LosAuditPaths losAuditPaths) {
+		return auditPathsService.list(new LambdaQueryWrapper<LosAuditPaths>()
+			.eq(LosAuditPaths::getTenantId, losAuditPaths.getTenantId()));
+	}
+
+	@Override
+	@TenantIgnore
+	@GetMapping(GET_LOS_AUDIT_PATHS_ACTS)
+	public List<LosAuditPathsActs> getLosAuditPathsActs(LosAuditPathsActs losAuditPathsActs) {
+		return auditPathsActsService.list(new LambdaQueryWrapper<LosAuditPathsActs>()
+			.eq(LosAuditPathsActs::getTenantId, losAuditPathsActs.getTenantId()));
+	}
+
+	@Override
+	@TenantIgnore
+	@GetMapping(ADD_LOS_AUDIT_PATHS_LIST)
+	public R addLosAuditPathsList(List<LosAuditPaths> losAuditPathsList) {
+		return R.data(auditPathsService.saveOrUpdateBatch(losAuditPathsList));
+	}
+
+	@Override
+	@TenantIgnore
+	@GetMapping(ADD_LOS_AUDIT_PATHS_ACTS_LIST)
+	public R addLosAuditPathsActsList(List<LosAuditPathsActs> losAuditPathsActsList) {
+		return R.data(auditPathsActsService.saveOrUpdateBatch(losAuditPathsActsList));
+	}
+
+	@Override
+	@TenantIgnore
+	@GetMapping(GET_BUSINESS_TYPE)
+	public List<BusinessType> getBusinessType(BusinessType businessType) {
+		return bBusinessTypeService.list(new LambdaQueryWrapper<BusinessType>()
+			.eq(BusinessType::getTenantId, businessType.getTenantId()));
+	}
+
+	@Override
+	@TenantIgnore
+	@GetMapping(GET_BUSINESS_BILL_NO)
+	public List<BusinessBillNo> getBusinessBillNo(BusinessBillNo businessBillNo) {
+		return businessBillNoService.list(new LambdaQueryWrapper<BusinessBillNo>()
+			.eq(BusinessBillNo::getTenantId, businessBillNo.getTenantId()));
+	}
+
+	@Override
+	@TenantIgnore
+	@GetMapping(ADD_BUSINESS_TYPE)
+	public R addBusinessTypeList(List<BusinessType> businessTypeList) {
+		return R.data(bBusinessTypeService.saveOrUpdateBatch(businessTypeList));
+	}
+
+	@Override
+	@TenantIgnore
+	@GetMapping(ADD_BUSINESS_BILL_NO)
+	public R addBusinessBillNoList(List<BusinessBillNo> businessBillNoList) {
+		return R.data(businessBillNoService.saveOrUpdateBatch(businessBillNoList));
+	}
+}

+ 71 - 0
blade-service/blade-los/src/main/java/org/springblade/los/statisticAnalysis/controller/IndexStatisticsController.java

@@ -0,0 +1,71 @@
+package org.springblade.los.statisticAnalysis.controller;
+
+/**
+ * @author :jixinyuan
+ * @date : 2024/1/25
+ */
+
+import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.AllArgsConstructor;
+import org.springblade.core.tool.api.R;
+import org.springblade.los.statisticAnalysis.service.IStatisticAnalysisService;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+import java.util.Map;
+
+@RestController
+@AllArgsConstructor
+@RequestMapping("/indexStatistics")
+@Api(value = "首页统计", tags = "首页统计")
+public class IndexStatisticsController {
+
+	private final IStatisticAnalysisService statisticAnalysisService;
+
+	/**
+	 * 首页 审批数据
+	 */
+	@GetMapping("/approvalData")
+	@ApiOperationSupport(order = 2)
+	@ApiOperation(value = "审批数据")
+	public R<Map<String, Object>> approvalData(@RequestParam("dateStart")String dateStart, @RequestParam("dateEnd")String dateEnd) {
+		return statisticAnalysisService.approvalData(dateStart, dateEnd);
+	}
+
+
+	/**
+	 * 首页 实时数据
+	 */
+	@GetMapping("/businessSum")
+	@ApiOperationSupport(order = 2)
+	@ApiOperation(value = "实时数据")
+	public R<Map<String, Object>> businessSum(@RequestParam("dateStart") String dateStart, @RequestParam("dateEnd")String dateEnd) {
+		return statisticAnalysisService.businessSum(dateStart, dateEnd);
+	}
+
+	/**
+	 * 首页 完成率
+	 */
+	@GetMapping("/completionRate")
+	@ApiOperationSupport(order = 2)
+	@ApiOperation(value = "完成率")
+	public R<Map<String, Object>> completionRate(@RequestParam("dateStart")String dateStart, @RequestParam("dateEnd")String dateEnd) {
+		return statisticAnalysisService.completionRate(dateStart, dateEnd);
+	}
+
+	/**
+	 * 首页 趋势图
+	 */
+	@GetMapping("/trend")
+	@ApiOperationSupport(order = 2)
+	@ApiOperation(value = "完成率")
+	public R<List<Map<String, Object>>> trend(@RequestParam("date")String date, @RequestParam("type")String type) {
+		return statisticAnalysisService.trend(date,type);
+	}
+
+}

+ 8 - 0
blade-service/blade-los/src/main/java/org/springblade/los/statisticAnalysis/service/IStatisticAnalysisService.java

@@ -46,4 +46,12 @@ public interface IStatisticAnalysisService {
 	R<List<Map<String, Object>>> decisionAnalysisByYWY();
 
     R<IPage<FinanceProfit>> financeProfit(FinanceProfit financeProfit, IPage<FinanceProfit> page);
+
+	R<Map<String, Object>> businessSum(String dateStart, String dateEnd);
+
+	R<Map<String, Object>> approvalData(String dateStart, String dateEnd);
+
+	R<Map<String, Object>> completionRate(String dateStart, String dateEnd);
+
+	R<List<Map<String, Object>>> trend(String date, String type);
 }

+ 278 - 3
blade-service/blade-los/src/main/java/org/springblade/los/statisticAnalysis/service/impl/StatisticAnalysisServiceImpl.java

@@ -6,21 +6,31 @@ import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
 import lombok.AllArgsConstructor;
 import org.springblade.core.secure.utils.AuthUtil;
 import org.springblade.core.tool.api.R;
+import org.springblade.los.Util.IDeptUtils;
 import org.springblade.los.basic.cur.service.IBCurrencyService;
+import org.springblade.los.business.aea.entity.AeaBills;
 import org.springblade.los.business.aea.mapper.AeaBillsMapper;
 import org.springblade.los.business.amends.entity.Amends;
 import org.springblade.los.business.amends.mapper.AmendsMapper;
+import org.springblade.los.business.customsDeclaration.entity.CustomsDeclaration;
+import org.springblade.los.business.customsDeclaration.mapper.CustomsDeclarationMapper;
+import org.springblade.los.business.sea.entity.Bills;
 import org.springblade.los.business.sea.mapper.BillsMapper;
-import org.springblade.los.business.sea.mapper.ContainersBillsMapper;
 import org.springblade.los.finance.fee.entity.FeeCenter;
 import org.springblade.los.finance.fee.mapper.FeeCenterMapper;
+import org.springblade.los.finance.invoices.entity.FinInvoices;
+import org.springblade.los.finance.invoices.mapper.FinInvoicesMapper;
+import org.springblade.los.finance.stl.entity.FinStlBills;
+import org.springblade.los.finance.stl.mapper.FinStlBillsMapper;
 import org.springblade.los.statisticAnalysis.DecisionAnalysis;
 import org.springblade.los.statisticAnalysis.FinanceProfit;
 import org.springblade.los.statisticAnalysis.service.IStatisticAnalysisService;
 import org.springframework.stereotype.Service;
 
 import java.math.BigDecimal;
+import java.math.RoundingMode;
 import java.text.DateFormat;
+import java.text.NumberFormat;
 import java.text.ParseException;
 import java.text.SimpleDateFormat;
 import java.util.*;
@@ -36,10 +46,14 @@ public class StatisticAnalysisServiceImpl implements IStatisticAnalysisService {
 
 	private final BillsMapper billsMapper;
 	private final AeaBillsMapper aeaBillsMapper;
-	private final ContainersBillsMapper containersBillsMapper;
+	private final CustomsDeclarationMapper customsDeclarationMapper;
 	private final AmendsMapper amendsMapper;
 	private final FeeCenterMapper feeCenterMapper;
 	private final IBCurrencyService bCurrencyService;
+	private final FinStlBillsMapper finStlBillsMapper;
+	private final FinInvoicesMapper finInvoicesMapper;
+
+	private final IDeptUtils deptUtils;
 
 	@Override
 	public R<IPage<DecisionAnalysis>> decisionAnalysis(DecisionAnalysis decisionAnalysis, IPage<DecisionAnalysis> page) {
@@ -73,7 +87,7 @@ public class StatisticAnalysisServiceImpl implements IStatisticAnalysisService {
 			}
 		} else if (financeProfit.getBillType().contains("BGSE") || financeProfit.getBillType().contains("BGSI")
 			|| financeProfit.getBillType().contains("BGAE") || financeProfit.getBillType().contains("BGAI")) {
-			List<FinanceProfit> financeProfitListBg = containersBillsMapper.financeProfit(financeProfit);
+			List<FinanceProfit> financeProfitListBg = customsDeclarationMapper.financeProfit(financeProfit);
 			if (!financeProfitListBg.isEmpty()) {
 				financeProfitList.addAll(financeProfitListBg);
 			}
@@ -248,4 +262,265 @@ public class StatisticAnalysisServiceImpl implements IStatisticAnalysisService {
 		}
 		return R.data(page.setRecords(financeProfitList));
 	}
+
+	@Override
+	public R<Map<String, Object>> businessSum(String dateStart, String dateEnd) {
+		long HYJK;
+		long HYCK;
+		long KYJK;
+		long KYCK;
+		LambdaQueryWrapper<Bills> lambdaQueryWrapper = new LambdaQueryWrapper<>();
+		lambdaQueryWrapper.eq(Bills::getTenantId, AuthUtil.getTenantId())
+			.eq(Bills::getIsDeleted, 0)
+			.lt(Bills::getBillDate, dateStart)
+			.gt(Bills::getBillDate, dateEnd);
+		if (!AuthUtil.getUserRole().contains("admin") && !AuthUtil.getUserRole().contains("财务")) {
+			lambdaQueryWrapper.apply("find_in_set(team_id,'" + AuthUtil.getPostId() + "')");
+		}
+		if (!AuthUtil.getUserRole().contains("admin")) {
+			lambdaQueryWrapper.eq(Bills::getBranchId, deptUtils.getDeptPid());
+		}
+		lambdaQueryWrapper.eq(Bills::getBusinessType, "SE");
+		HYCK = billsMapper.selectCount(lambdaQueryWrapper);
+		lambdaQueryWrapper.eq(Bills::getBusinessType, "SI");
+		HYJK = billsMapper.selectCount(lambdaQueryWrapper);
+
+		LambdaQueryWrapper<AeaBills> aeaBillsLambdaQueryWrapper = new LambdaQueryWrapper<>();
+		aeaBillsLambdaQueryWrapper.eq(AeaBills::getTenantId, AuthUtil.getTenantId())
+			.eq(AeaBills::getIsDeleted, 0)
+			.lt(AeaBills::getBillDate, dateStart)
+			.gt(AeaBills::getBillDate, dateEnd);
+		if (!AuthUtil.getUserRole().contains("admin") && !AuthUtil.getUserRole().contains("财务")) {
+			aeaBillsLambdaQueryWrapper.apply("find_in_set(team_id,'" + AuthUtil.getPostId() + "')");
+		}
+		if (!AuthUtil.getUserRole().contains("admin")) {
+			aeaBillsLambdaQueryWrapper.eq(AeaBills::getBranchId, deptUtils.getDeptPid());
+		}
+		aeaBillsLambdaQueryWrapper.eq(AeaBills::getBusinessType, "AE");
+		KYCK = aeaBillsMapper.selectCount(aeaBillsLambdaQueryWrapper);
+		aeaBillsLambdaQueryWrapper.eq(AeaBills::getBusinessType, "AI");
+		KYJK = aeaBillsMapper.selectCount(aeaBillsLambdaQueryWrapper);
+		Map<String, Object> map = new HashMap<>();
+		map.put("HYJK", HYJK);
+		map.put("HYCK", HYCK);
+		map.put("KYJK", KYJK);
+		map.put("KYCK", KYCK);
+		return R.data(map);
+	}
+
+	@Override
+	public R<Map<String, Object>> approvalData(String dateStart, String dateEnd) {
+		long HYJK;
+		long HYCK;
+		long KYJK;
+		long KYCK;
+		long SEA;
+		long SIA;
+		long AEA;
+		long AIA;
+		long BGSE;
+		long BGSI;
+		long BGAE;
+		long BGAI;
+		long FFSQ;
+		long FPSQ;
+		//海运进出口
+		LambdaQueryWrapper<Bills> lambdaQueryWrapper = new LambdaQueryWrapper<>();
+		lambdaQueryWrapper.eq(Bills::getTenantId, AuthUtil.getTenantId())
+			.eq(Bills::getIsDeleted, 0)
+			.lt(Bills::getBillDate, dateStart)
+			.gt(Bills::getBillDate, dateEnd)
+			.apply("find_in_set(status,'1,2')");
+		if (!AuthUtil.getUserRole().contains("admin") && !AuthUtil.getUserRole().contains("财务")) {
+			lambdaQueryWrapper.apply("find_in_set(team_id,'" + AuthUtil.getPostId() + "')");
+		}
+		if (!AuthUtil.getUserRole().contains("admin")) {
+			lambdaQueryWrapper.eq(Bills::getBranchId, deptUtils.getDeptPid());
+		}
+		lambdaQueryWrapper.eq(Bills::getBusinessType, "SE");
+		HYCK = billsMapper.selectCount(lambdaQueryWrapper);
+		lambdaQueryWrapper.eq(Bills::getBusinessType, "SI");
+		HYJK = billsMapper.selectCount(lambdaQueryWrapper);
+
+		//空运进出口
+		LambdaQueryWrapper<AeaBills> aeaBillsLambdaQueryWrapper = new LambdaQueryWrapper<>();
+		aeaBillsLambdaQueryWrapper.eq(AeaBills::getTenantId, AuthUtil.getTenantId())
+			.eq(AeaBills::getIsDeleted, 0)
+			.lt(AeaBills::getBillDate, dateStart)
+			.gt(AeaBills::getBillDate, dateEnd)
+			.apply("find_in_set(status,'1,2')");
+		if (!AuthUtil.getUserRole().contains("admin") && !AuthUtil.getUserRole().contains("财务")) {
+			aeaBillsLambdaQueryWrapper.apply("find_in_set(team_id,'" + AuthUtil.getPostId() + "')");
+		}
+		if (!AuthUtil.getUserRole().contains("admin")) {
+			aeaBillsLambdaQueryWrapper.eq(AeaBills::getBranchId, deptUtils.getDeptPid());
+		}
+		aeaBillsLambdaQueryWrapper.eq(AeaBills::getBusinessType, "AE");
+		KYCK = aeaBillsMapper.selectCount(aeaBillsLambdaQueryWrapper);
+		aeaBillsLambdaQueryWrapper.eq(AeaBills::getBusinessType, "AI");
+		KYJK = aeaBillsMapper.selectCount(aeaBillsLambdaQueryWrapper);
+
+		//Amends 海、空运进出口
+		LambdaQueryWrapper<Amends> amendsLambdaQueryWrapper = new LambdaQueryWrapper<>();
+		amendsLambdaQueryWrapper.eq(Amends::getTenantId, AuthUtil.getTenantId())
+			.eq(Amends::getIsDeleted, 0)
+			.lt(Amends::getBillDate, dateStart)
+			.gt(Amends::getBillDate, dateEnd)
+			.apply("find_in_set(status,'1,2')");
+		if (!AuthUtil.getUserRole().contains("admin") && !AuthUtil.getUserRole().contains("财务")) {
+			amendsLambdaQueryWrapper.apply("find_in_set(team_id,'" + AuthUtil.getPostId() + "')");
+		}
+		if (!AuthUtil.getUserRole().contains("admin")) {
+			amendsLambdaQueryWrapper.eq(Amends::getBranchId, deptUtils.getDeptPid());
+		}
+		amendsLambdaQueryWrapper.eq(Amends::getBusinessType, "SEA");
+		SEA = amendsMapper.selectCount(amendsLambdaQueryWrapper);
+		amendsLambdaQueryWrapper.eq(Amends::getBusinessType, "SIA");
+		SIA = amendsMapper.selectCount(amendsLambdaQueryWrapper);
+		amendsLambdaQueryWrapper.eq(Amends::getBusinessType, "AEA");
+		AEA = amendsMapper.selectCount(amendsLambdaQueryWrapper);
+		amendsLambdaQueryWrapper.eq(Amends::getBusinessType, "AIA");
+		AIA = amendsMapper.selectCount(amendsLambdaQueryWrapper);
+
+		//报关 海、空运进出口
+		LambdaQueryWrapper<CustomsDeclaration> customsDeclarationLambdaQueryWrapper = new LambdaQueryWrapper<>();
+		customsDeclarationLambdaQueryWrapper.eq(CustomsDeclaration::getTenantId, AuthUtil.getTenantId())
+			.eq(CustomsDeclaration::getIsDeleted, 0)
+			.lt(CustomsDeclaration::getBillDate, dateStart)
+			.gt(CustomsDeclaration::getBillDate, dateEnd)
+			.apply("find_in_set(status,'1,2')");
+		if (!AuthUtil.getUserRole().contains("admin") && !AuthUtil.getUserRole().contains("财务")) {
+			customsDeclarationLambdaQueryWrapper.apply("find_in_set(team_id,'" + AuthUtil.getPostId() + "')");
+		}
+		if (!AuthUtil.getUserRole().contains("admin")) {
+			customsDeclarationLambdaQueryWrapper.eq(CustomsDeclaration::getBranchId, deptUtils.getDeptPid());
+		}
+		customsDeclarationLambdaQueryWrapper.eq(CustomsDeclaration::getBusinessType, "BGSE");
+		BGSE = customsDeclarationMapper.selectCount(customsDeclarationLambdaQueryWrapper);
+		customsDeclarationLambdaQueryWrapper.eq(CustomsDeclaration::getBusinessType, "BGSI");
+		BGSI = customsDeclarationMapper.selectCount(customsDeclarationLambdaQueryWrapper);
+		customsDeclarationLambdaQueryWrapper.eq(CustomsDeclaration::getBusinessType, "BGAE");
+		BGAE = customsDeclarationMapper.selectCount(customsDeclarationLambdaQueryWrapper);
+		customsDeclarationLambdaQueryWrapper.eq(CustomsDeclaration::getBusinessType, "BGAI");
+		BGAI = customsDeclarationMapper.selectCount(customsDeclarationLambdaQueryWrapper);
+
+		//付费申请
+		LambdaQueryWrapper<FinStlBills> finStlBillsLambdaQueryWrapper = new LambdaQueryWrapper<>();
+		finStlBillsLambdaQueryWrapper.eq(FinStlBills::getTenantId, AuthUtil.getTenantId())
+			.eq(FinStlBills::getIsDeleted, 0)
+			.lt(FinStlBills::getBillDate, dateStart)
+			.gt(FinStlBills::getBillDate, dateEnd)
+			.apply("find_in_set(status,'1,2')");
+		if (!AuthUtil.getUserRole().contains("admin")) {
+			finStlBillsLambdaQueryWrapper.eq(FinStlBills::getBranchId, deptUtils.getDeptPid());
+		}
+		finStlBillsLambdaQueryWrapper.eq(FinStlBills::getBusinessType, "FFSQ");
+		FFSQ = finStlBillsMapper.selectCount(finStlBillsLambdaQueryWrapper);
+
+		//发票申请
+		LambdaQueryWrapper<FinInvoices> finInvoicesLambdaQueryWrapper = new LambdaQueryWrapper<>();
+		finInvoicesLambdaQueryWrapper.eq(FinInvoices::getTenantId, AuthUtil.getTenantId())
+			.eq(FinInvoices::getIsDeleted, 0)
+			.lt(FinInvoices::getBillDate, dateStart)
+			.gt(FinInvoices::getBillDate, dateEnd)
+			.apply("find_in_set(status,'1,2')");
+		if (!AuthUtil.getUserRole().contains("admin")) {
+			finInvoicesLambdaQueryWrapper.eq(FinInvoices::getBranchId, deptUtils.getDeptPid());
+		}
+		finInvoicesLambdaQueryWrapper.eq(FinInvoices::getType, "申请");
+		FPSQ = finInvoicesMapper.selectCount(finInvoicesLambdaQueryWrapper);
+		Map<String, Object> map = new HashMap<>();
+		map.put("HYJK", HYJK);
+		map.put("HYCK", HYCK);
+		map.put("KYJK", KYJK);
+		map.put("KYCK", KYCK);
+		map.put("SEA", SEA);
+		map.put("SIA", SIA);
+		map.put("AEA", AEA);
+		map.put("AIA", AIA);
+		map.put("BGSE", BGSE);
+		map.put("BGSI", BGSI);
+		map.put("BGAE", BGAE);
+		map.put("BGAI", BGAI);
+		map.put("FFSQ", FFSQ);
+		map.put("FPSQ", FPSQ);
+		return R.data(map);
+	}
+
+	@Override
+	public R<Map<String, Object>> completionRate(String dateStart, String dateEnd) {
+		long sum;
+		long refurbishment;
+		long complete;
+		LambdaQueryWrapper<Bills> lambdaQueryWrapper = new LambdaQueryWrapper<>();
+		lambdaQueryWrapper.eq(Bills::getTenantId, AuthUtil.getTenantId())
+			.eq(Bills::getIsDeleted, 0)
+			.lt(Bills::getBillDate, dateStart)
+			.gt(Bills::getBillDate, dateEnd);
+		if (!AuthUtil.getUserRole().contains("admin") && !AuthUtil.getUserRole().contains("财务")) {
+			lambdaQueryWrapper.apply("find_in_set(team_id,'" + AuthUtil.getPostId() + "')");
+		}
+		if (!AuthUtil.getUserRole().contains("admin")) {
+			lambdaQueryWrapper.eq(Bills::getBranchId, deptUtils.getDeptPid());
+		}
+		lambdaQueryWrapper.eq(Bills::getBusinessType, "SE");
+		List<Bills> HYCKList = billsMapper.selectList(lambdaQueryWrapper);
+		lambdaQueryWrapper.eq(Bills::getBusinessType, "SI");
+		List<Bills> HYJKList = billsMapper.selectList(lambdaQueryWrapper);
+
+		LambdaQueryWrapper<AeaBills> aeaBillsLambdaQueryWrapper = new LambdaQueryWrapper<>();
+		aeaBillsLambdaQueryWrapper.eq(AeaBills::getTenantId, AuthUtil.getTenantId())
+			.eq(AeaBills::getIsDeleted, 0)
+			.lt(AeaBills::getBillDate, dateStart)
+			.gt(AeaBills::getBillDate, dateEnd);
+		if (!AuthUtil.getUserRole().contains("admin") && !AuthUtil.getUserRole().contains("财务")) {
+			aeaBillsLambdaQueryWrapper.apply("find_in_set(team_id,'" + AuthUtil.getPostId() + "')");
+		}
+		if (!AuthUtil.getUserRole().contains("admin")) {
+			aeaBillsLambdaQueryWrapper.eq(AeaBills::getBranchId, deptUtils.getDeptPid());
+		}
+		aeaBillsLambdaQueryWrapper.eq(AeaBills::getBusinessType, "AE");
+		List<AeaBills> KYCKList = aeaBillsMapper.selectList(aeaBillsLambdaQueryWrapper);
+		aeaBillsLambdaQueryWrapper.eq(AeaBills::getBusinessType, "AI");
+		List<AeaBills> KYJKList = aeaBillsMapper.selectList(aeaBillsLambdaQueryWrapper);
+		Map<String, Object> map = new HashMap<>();
+		sum = HYCKList.size() + HYJKList.size() + KYCKList.size() + KYJKList.size();
+		refurbishment = HYCKList.stream().filter(e -> e.getBillStatus() == 1).count() +
+			HYJKList.stream().filter(e -> e.getBillStatus() == 1).count() +
+			KYCKList.stream().filter(e -> e.getBillStatus() == 1).count() +
+			KYJKList.stream().filter(e -> e.getBillStatus() == 1).count();
+		complete = HYCKList.stream().filter(e -> e.getStatus() == 3).count() +
+			HYJKList.stream().filter(e -> e.getStatus() == 3).count() +
+			KYCKList.stream().filter(e -> e.getStatus() == 3).count() +
+			KYJKList.stream().filter(e -> e.getStatus() == 3).count();
+		map.put("sum", sum);
+		map.put("refurbishment", refurbishment);
+		map.put("complete", complete);
+		NumberFormat nf = NumberFormat.getNumberInstance();
+		nf.setMaximumFractionDigits(2);
+		nf.setMinimumFractionDigits(2);
+		nf.setRoundingMode(RoundingMode.HALF_UP);
+		nf.setGroupingUsed(false);
+		if (sum == 0) {
+			map.put("rate", 0);
+		} else {
+			map.put("rate", nf.format((complete / sum * 100)));
+		}
+		return R.data(map);
+	}
+
+	@Override
+	public R<List<Map<String, Object>>> trend(String date, String type) {
+		if ("1".equals(type)) {
+			List<Map<String, Object>> mapList = billsMapper.trend(AuthUtil.getTenantId(), deptUtils.getDeptPid(),
+				AuthUtil.getPostId(), date);
+			return R.data(mapList);
+		} else if ("2".equals(type)) {
+			List<Map<String, Object>> mapList = aeaBillsMapper.trend(AuthUtil.getTenantId(), deptUtils.getDeptPid(),
+				AuthUtil.getPostId(), date);
+			return R.data(mapList);
+		} else {
+			return R.fail("参数错误");
+		}
+	}
 }

+ 6 - 0
blade-service/blade-system/pom.xml

@@ -42,6 +42,12 @@
             <artifactId>blade-resource-api</artifactId>
             <version>2.8.2.RELEASE</version>
         </dependency>
+        <dependency>
+            <groupId>org.springblade</groupId>
+            <artifactId>blade-los-api</artifactId>
+            <version>2.8.2.RELEASE</version>
+            <scope>compile</scope>
+        </dependency>
     </dependencies>
 
     <build>

+ 9 - 1
blade-service/blade-system/src/main/java/org/springblade/system/controller/TenantController.java

@@ -158,7 +158,7 @@ public class TenantController extends BladeController {
 	@ApiOperationSupport(order = 8)
 	@PreAuth(RoleConstant.HAS_ROLE_ADMINISTRATOR)
 	@ApiOperation(value = "数据源配置", notes = "传入datasource_id")
-	public R datasource(@ApiParam(value = "租户ID", required = true) @RequestParam String tenantId, @ApiParam(value = "数据源ID", required = true) @RequestParam Long datasourceId){
+	public R datasource(@ApiParam(value = "租户ID", required = true) @RequestParam String tenantId, @ApiParam(value = "数据源ID", required = true) @RequestParam Long datasourceId) {
 		CacheUtil.evict(TENANT_DATASOURCE_CACHE, TENANT_DATASOURCE_EXIST_KEY, tenantId, Boolean.FALSE);
 		return R.status(tenantService.update(Wrappers.<Tenant>update().lambda().set(Tenant::getDatasourceId, datasourceId).eq(Tenant::getTenantId, tenantId)));
 	}
@@ -196,6 +196,14 @@ public class TenantController extends BladeController {
 		return R.data(kv);
 	}
 
+	/**
+	 * 复制数据
+	 */
+	@GetMapping("/copyData")
+	@ApiOperation(value = "复制数据")
+	public R info(String tenantId, String tenantIdCopy, String type) {
+		return tenantService.copyData(tenantId, tenantIdCopy, type);
+	}
 
 
 }

+ 4 - 0
blade-service/blade-system/src/main/java/org/springblade/system/mapper/DictBizMapper.java

@@ -18,6 +18,8 @@ package org.springblade.system.mapper;
 
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import feign.Param;
+import org.springblade.core.tenant.annotation.TenantIgnore;
 import org.springblade.system.entity.DictBiz;
 import org.springblade.system.vo.DictBizVO;
 
@@ -78,4 +80,6 @@ public interface DictBizMapper extends BaseMapper<DictBiz> {
 	 * @return
 	 */
 	String getOneValue(String code, String dictKey, String tenantId);
+	@TenantIgnore
+	List<DictBiz> selectListByTenantId(@Param("parentId")Long parentId ,@Param("tenantIdCopy") String tenantIdCopy);
 }

+ 7 - 0
blade-service/blade-system/src/main/java/org/springblade/system/mapper/DictBizMapper.xml

@@ -58,4 +58,11 @@
             distinct dict_value
         from blade_dict_biz where code = #{param1} and dict_key = #{param2} and tenant_id = #{param3} and is_deleted = 0
     </select>
+    <select id="selectListByTenantId" resultType="org.springblade.system.entity.DictBiz">
+        select *
+        from blade_dict_biz
+        where is_deleted = 0
+          and parent_id = #{parentId}
+          and tenant_id = #{tenantIdCopy}
+    </select>
 </mapper>

+ 3 - 1
blade-service/blade-system/src/main/java/org/springblade/system/mapper/RoleMapper.java

@@ -18,6 +18,7 @@ package org.springblade.system.mapper;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import org.springblade.core.tenant.annotation.TenantIgnore;
 import org.springblade.system.entity.Role;
 import org.springblade.system.vo.RoleVO;
 
@@ -63,5 +64,6 @@ public interface RoleMapper extends BaseMapper<Role> {
 	 * @return
 	 */
 	List<String> getRoleAliases(Long[] ids);
-
+	@TenantIgnore
+    List<Role> selectListByTenantId(String tenantIdCopy);
 }

+ 3 - 0
blade-service/blade-system/src/main/java/org/springblade/system/mapper/RoleMapper.xml

@@ -59,5 +59,8 @@
         </foreach>
         and is_deleted = 0
     </select>
+    <select id="selectListByTenantId" resultType="org.springblade.system.entity.Role">
+        select * from blade_role where is_deleted = 0  and tenant_id = #{param1}
+    </select>
 
 </mapper>

+ 2 - 0
blade-service/blade-system/src/main/java/org/springblade/system/service/IDictBizService.java

@@ -126,4 +126,6 @@ public interface IDictBizService extends IService<DictBiz> {
 	 * @return
 	 */
 	R<String> getOneByValue(String code, String dictValue, String tenantId);
+
+    List<DictBiz> selectList(Long parentId ,String tenantIdCopy);
 }

+ 1 - 0
blade-service/blade-system/src/main/java/org/springblade/system/service/IRoleService.java

@@ -110,4 +110,5 @@ public interface IRoleService extends IService<Role> {
 	 */
 	List<RoleVO> search(String roleName, Long parentId);
 
+    List<Role> selectList(String tenantIdCopy);
 }

+ 2 - 0
blade-service/blade-system/src/main/java/org/springblade/system/service/ITenantService.java

@@ -18,6 +18,7 @@ package org.springblade.system.service;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import org.springblade.core.mp.base.BaseService;
+import org.springblade.core.tool.api.R;
 import org.springblade.system.entity.Tenant;
 
 import java.util.Date;
@@ -73,4 +74,5 @@ public interface ITenantService extends BaseService<Tenant> {
 	 */
 	boolean setting(Integer accountNumber, Date expireTime, String ids);
 
+    R copyData(String tenantId, String tenantIdCopy, String type);
 }

+ 5 - 0
blade-service/blade-system/src/main/java/org/springblade/system/service/impl/DictBizServiceImpl.java

@@ -149,4 +149,9 @@ public class DictBizServiceImpl extends ServiceImpl<DictBizMapper, DictBiz> impl
 		DictBiz dictBiz = baseMapper.selectOne(lambdaQueryWrapper);
 		return R.data(dictBiz.getDictKey());
 	}
+
+	@Override
+	public List<DictBiz> selectList(Long parentId ,String tenantIdCopy) {
+		return baseMapper.selectListByTenantId( parentId ,tenantIdCopy);
+	}
 }

+ 5 - 0
blade-service/blade-system/src/main/java/org/springblade/system/service/impl/RoleServiceImpl.java

@@ -233,4 +233,9 @@ public class RoleServiceImpl extends ServiceImpl<RoleMapper, Role> implements IR
 		return RoleWrapper.build().listNodeVO(roleList);
 	}
 
+	@Override
+	public List<Role> selectList(String tenantIdCopy) {
+		return baseMapper.selectListByTenantId(tenantIdCopy);
+	}
+
 }

+ 108 - 0
blade-service/blade-system/src/main/java/org/springblade/system/service/impl/TenantServiceImpl.java

@@ -31,6 +31,11 @@ import org.springblade.core.tool.support.Kv;
 import org.springblade.core.tool.utils.DesUtil;
 import org.springblade.core.tool.utils.Func;
 import org.springblade.core.tool.utils.StringUtil;
+import org.springblade.los.basic.business.entity.BusinessType;
+import org.springblade.los.billno.entity.BusinessBillNo;
+import org.springblade.los.check.entity.LosAuditPaths;
+import org.springblade.los.check.entity.LosAuditPathsActs;
+import org.springblade.los.feign.ILosClient;
 import org.springblade.resource.feign.IOssClient;
 import org.springblade.system.cache.ParamCache;
 import org.springblade.system.entity.*;
@@ -69,6 +74,7 @@ public class TenantServiceImpl extends BaseServiceImpl<TenantMapper, Tenant> imp
 	private final IDictBizService dictBizService;
 	private final IUserClient userClient;
 	private final IOssClient ossClient;
+	private final ILosClient losClient;
 
 	@Override
 	public IPage<Tenant> selectTenantPage(IPage<Tenant> page, Tenant tenant) {
@@ -202,6 +208,82 @@ public class TenantServiceImpl extends BaseServiceImpl<TenantMapper, Tenant> imp
 		return true;
 	}
 
+	@Override
+	@Transactional(rollbackFor = Exception.class)
+	public R copyData(String tenantId, String tenantIdCopy, String type) {
+		if (type.contains("1")) {
+			// 业务字典
+			LinkedList<DictBiz> dictBizs = new LinkedList<>();
+			List<DictBiz> dictBizList = getDictBizsV0(tenantId, tenantIdCopy, dictBizs);
+			dictBizService.saveBatch(dictBizList);
+		} else if (type.contains("2")) {
+			// 角色
+			List<Role> roleLinkedList = new ArrayList<>();
+			List<Role> roleList = roleService.selectList(tenantIdCopy);
+			for (Role item : roleList) {
+				item.setId(null);
+				item.setTenantId(tenantId);
+				roleLinkedList.add(item);
+			}
+			roleService.saveBatch(roleLinkedList);
+		} else if (type.contains("3")) {
+			// 审批流程
+			List<LosAuditPaths> losAuditPaths = new ArrayList<>();
+			LosAuditPaths losAuditPath = new LosAuditPaths();
+			losAuditPath.setTenantId(tenantIdCopy);
+			List<LosAuditPaths> losAuditPathsList = losClient.getLosAuditPaths(losAuditPath);
+			for (LosAuditPaths item : losAuditPathsList) {
+				Long oldParentId = item.getId();
+				Long newParentId = IdWorker.getId();
+				item.setId(newParentId);
+				item.setTenantId(tenantId);
+				losAuditPaths.add(item);
+				recursionLosAuditPathsActs(tenantId, tenantIdCopy, oldParentId, newParentId);
+			}
+			losClient.addLosAuditPathsList(losAuditPaths);
+		} else if (type.contains("4")) {
+			// 编号配置
+			List<BusinessBillNo> businessBillNos = new ArrayList<>();
+			BusinessBillNo businessBillNo = new BusinessBillNo();
+			businessBillNo.setTenantId(tenantIdCopy);
+			List<BusinessBillNo> businessBillNoList = losClient.getBusinessBillNo(businessBillNo);
+			for (BusinessBillNo item : businessBillNoList) {
+				item.setId(null);
+				item.setTenantId(tenantId);
+				businessBillNos.add(item);
+			}
+			losClient.addBusinessBillNoList(businessBillNos);
+		} else if (type.contains("5")) {
+			// 业务类型
+			List<BusinessType> businessTypes = new ArrayList<>();
+			BusinessType businessType = new BusinessType();
+			businessType.setTenantId(tenantIdCopy);
+			List<BusinessType> businessTypeList = losClient.getBusinessType(businessType);
+			for (BusinessType item : businessTypeList) {
+				item.setId(null);
+				item.setTenantId(tenantId);
+				businessTypes.add(item);
+			}
+			losClient.addBusinessTypeList(businessTypes);
+		}
+		return R.data("操作成功");
+	}
+
+	private void recursionLosAuditPathsActs(String tenantId, String tenantIdCopy, Long oldParentId, Long newParentId) {
+		LosAuditPathsActs losAuditPathsActs = new LosAuditPathsActs();
+		losAuditPathsActs.setTenantId(tenantIdCopy);
+		losAuditPathsActs.setPathId(oldParentId);
+		List<LosAuditPathsActs> losAuditPathsActsList = new ArrayList<>();
+		List<LosAuditPathsActs> list = losClient.getLosAuditPathsActs(losAuditPathsActs);
+		for (LosAuditPathsActs item : list) {
+			item.setId(IdWorker.getId());
+			item.setTenantId(tenantId);
+			item.setPathId(newParentId);
+			losAuditPathsActsList.add(item);
+		}
+		losClient.addLosAuditPathsActsList(losAuditPathsActsList);
+	}
+
 	private String getTenantId(List<String> codes) {
 		String code = tenantId.generate();
 		if (codes.contains(code)) {
@@ -253,5 +335,31 @@ public class TenantServiceImpl extends BaseServiceImpl<TenantMapper, Tenant> imp
 		});
 	}
 
+	private List<DictBiz> getDictBizsV0(String tenantId, String tenantIdCopy, LinkedList<DictBiz> dictBizs) {
+		List<DictBiz> dictBizList = dictBizService.selectList(BladeConstant.TOP_PARENT_ID, tenantIdCopy);
+		dictBizList.forEach(dictBiz -> {
+			Long oldParentId = dictBiz.getId();
+			Long newParentId = IdWorker.getId();
+			dictBiz.setId(newParentId);
+			dictBiz.setTenantId(tenantId);
+			dictBizs.add(dictBiz);
+			recursionDictBizV0(tenantId, tenantIdCopy, oldParentId, newParentId, dictBizs);
+		});
+		return dictBizs;
+	}
+
+	private void recursionDictBizV0(String tenantId, String tenantIdCopy, Long oldParentId, Long newParentId, LinkedList<DictBiz> dictBizs) {
+		List<DictBiz> dictBizList = dictBizService.selectList(oldParentId, tenantIdCopy);
+		dictBizList.forEach(dictBiz -> {
+			Long oldSubParentId = dictBiz.getId();
+			Long newSubParentId = IdWorker.getId();
+			dictBiz.setId(newSubParentId);
+			dictBiz.setTenantId(tenantId);
+			dictBiz.setParentId(newParentId);
+			dictBizs.add(dictBiz);
+			recursionDictBizV0(tenantId, tenantIdCopy, oldSubParentId, newSubParentId, dictBizs);
+		});
+	}
+
 
 }

+ 36 - 36
blade-service/blade-system/src/main/resources/log/logback-dev.xml

@@ -58,56 +58,56 @@
     </if>
 
     <!-- 日志输出级别 -->
-    <root level="ERROR">
+    <root level="INFO">
         <appender-ref ref="STDOUT"/>
         <appender-ref ref="${STDOUT_APPENDER}"/>
     </root>
 
-    <logger name="net.sf.ehcache" level="ERROR"/>
-    <logger name="druid.sql" level="ERROR"/>
+    <logger name="net.sf.ehcache" level="INFO"/>
+    <logger name="druid.sql" level="INFO"/>
 
 
     <!-- MyBatis log configure -->
-    <logger name="com.apache.ibatis" level="ERROR"/>
-    <logger name="org.mybatis.spring" level="ERROR"/>
-    <logger name="java.sql.Connection" level="ERROR"/>
-    <logger name="java.sql.Statement" level="ERROR"/>
-    <logger name="java.sql.PreparedStatement" level="ERROR"/>
+    <logger name="com.apache.ibatis" level="INFO"/>
+    <logger name="org.mybatis.spring" level="INFO"/>
+    <logger name="java.sql.Connection" level="INFO"/>
+    <logger name="java.sql.Statement" level="INFO"/>
+    <logger name="java.sql.PreparedStatement" level="INFO"/>
 
     <!-- 减少部分debug日志 -->
-    <logger name="druid.sql" level="ERROR"/>
-    <logger name="org.apache.shiro" level="ERROR"/>
-    <logger name="org.mybatis.spring" level="ERROR"/>
-    <logger name="org.springframework" level="ERROR"/>
-    <logger name="org.springframework.context" level="ERROR"/>
-    <logger name="org.springframework.beans" level="ERROR"/>
-    <logger name="com.baomidou.mybatisplus" level="ERROR"/>
-    <logger name="org.apache.ibatis.io" level="ERROR"/>
-    <logger name="org.apache.velocity" level="ERROR"/>
-    <logger name="org.eclipse.jetty" level="ERROR"/>
-    <logger name="io.undertow" level="ERROR"/>
-    <logger name="org.xnio.nio" level="ERROR"/>
-    <logger name="org.thymeleaf" level="ERROR"/>
-    <logger name="springfox.documentation" level="ERROR"/>
-    <logger name="org.hibernate.validator" level="ERROR"/>
-    <logger name="com.netflix.loadbalancer" level="ERROR"/>
-    <logger name="com.netflix.hystrix" level="ERROR"/>
-    <logger name="com.netflix.zuul" level="ERROR"/>
-    <logger name="de.codecentric" level="ERROR"/>
+    <logger name="druid.sql" level="INFO"/>
+    <logger name="org.apache.shiro" level="INFO"/>
+    <logger name="org.mybatis.spring" level="INFO"/>
+    <logger name="org.springframework" level="INFO"/>
+    <logger name="org.springframework.context" level="INFO"/>
+    <logger name="org.springframework.beans" level="INFO"/>
+    <logger name="com.baomidou.mybatisplus" level="INFO"/>
+    <logger name="org.apache.ibatis.io" level="INFO"/>
+    <logger name="org.apache.velocity" level="INFO"/>
+    <logger name="org.eclipse.jetty" level="INFO"/>
+    <logger name="io.undertow" level="INFO"/>
+    <logger name="org.xnio.nio" level="INFO"/>
+    <logger name="org.thymeleaf" level="INFO"/>
+    <logger name="springfox.documentation" level="INFO"/>
+    <logger name="org.hibernate.validator" level="INFO"/>
+    <logger name="com.netflix.loadbalancer" level="INFO"/>
+    <logger name="com.netflix.hystrix" level="INFO"/>
+    <logger name="com.netflix.zuul" level="INFO"/>
+    <logger name="de.codecentric" level="INFO"/>
     <!-- cache INFO -->
-    <logger name="net.sf.ehcache" level="ERROR"/>
-    <logger name="org.springframework.cache" level="ERROR"/>
+    <logger name="net.sf.ehcache" level="INFO"/>
+    <logger name="org.springframework.cache" level="INFO"/>
     <!-- cloud -->
-    <logger name="org.apache.http" level="ERROR"/>
-    <logger name="com.netflix.discovery" level="ERROR"/>
-    <logger name="com.netflix.eureka" level="ERROR"/>
+    <logger name="org.apache.http" level="INFO"/>
+    <logger name="com.netflix.discovery" level="INFO"/>
+    <logger name="com.netflix.eureka" level="INFO"/>
     <!-- 业务日志 -->
-    <Logger name="org.springblade" level="ERROR"/>
-    <Logger name="org.springblade.core.tenant" level="ERROR"/>
-    <Logger name="org.springblade.core.version" level="ERROR"/>
+    <Logger name="org.springblade" level="INFO"/>
+    <Logger name="org.springblade.core.tenant" level="INFO"/>
+    <Logger name="org.springblade.core.version" level="INFO"/>
 
     <!-- 减少nacos日志 -->
-    <logger name="com.alibaba.nacos" level="ERROR"/>
+    <logger name="com.alibaba.nacos" level="INFO"/>
 
 
 </configuration>