Mr.qian преди 1 месец
родител
ревизия
7e6bdc916f

+ 6 - 31
cif-service/src/main/java/com/txz/cif/configurer/ShardingSphereConfig.java

@@ -102,48 +102,23 @@ public class ShardingSphereConfig {
     }
 
     private TableRuleConfiguration getAccountFlowTableRuleConfiguration() {
-        // 原有的基于用户ID的分片配置
-        TableRuleConfiguration result = new TableRuleConfiguration("c_account_flow", "ds$->{0..1}.c_account_flow_$->{0..3}");
+        TableRuleConfiguration result = new TableRuleConfiguration("c_account_flow", "ds${0..1}.c_account_flow_${202501..999912}");
         result.setDatabaseShardingStrategyConfig(new StandardShardingStrategyConfiguration("user_id", new UserIdShardingAlg()));
-        result.setTableShardingStrategyConfig(new StandardShardingStrategyConfiguration("user_id", new UserIdShardingAlg()));
+        result.setTableShardingStrategyConfig(new StandardShardingStrategyConfiguration("create_time", new TimeShardingAlg()));
         return result;
     }
 
     private TableRuleConfiguration getFlowTableRuleConfiguration() {
-        // 原有的基于用户ID的分片配置
-        TableRuleConfiguration result = new TableRuleConfiguration("c_flow", "ds$->{0..1}.c_flow_$->{0..3}");
+        TableRuleConfiguration result = new TableRuleConfiguration("c_flow", "ds${0..1}.c_flow_${202501..999912}");
         result.setDatabaseShardingStrategyConfig(new StandardShardingStrategyConfiguration("user_id", new UserIdShardingAlg()));
-        result.setTableShardingStrategyConfig(new StandardShardingStrategyConfiguration("user_id", new UserIdShardingAlg()));
+        result.setTableShardingStrategyConfig(new StandardShardingStrategyConfiguration("create_time", new TimeShardingAlg()));
         return result;
     }
 
     private TableRuleConfiguration getRedEnvelopeTableRuleConfiguration() {
-        // 原有的基于用户ID的分片配置
-        TableRuleConfiguration result = new TableRuleConfiguration("c_red_envelope", "ds$->{0..1}.c_red_envelope_$->{0..3}");
+        TableRuleConfiguration result = new TableRuleConfiguration("c_red_envelope", "ds${0..1}.c_red_envelope_${202501..999912}");
         result.setDatabaseShardingStrategyConfig(new StandardShardingStrategyConfiguration("user_id", new UserIdShardingAlg()));
-        result.setTableShardingStrategyConfig(new StandardShardingStrategyConfiguration("user_id", new UserIdShardingAlg()));
-        return result;
-    }
-    
-    // 新增基于时间的分表配置方法
-    private TableRuleConfiguration getTimeBasedAccountFlowTableRuleConfiguration() {
-        // 基于时间的分表配置,按月分表
-        TableRuleConfiguration result = new TableRuleConfiguration("c_account_flow_time", "ds$->{0..1}.c_account_flow_$->{202001..202512}");
-        result.setTableShardingStrategyConfig(new StandardShardingStrategyConfiguration("trans_time", new TimeShardingAlg()));
-        return result;
-    }
-    
-    private TableRuleConfiguration getTimeBasedFlowTableRuleConfiguration() {
-        // 基于时间的分表配置,按月分表
-        TableRuleConfiguration result = new TableRuleConfiguration("c_flow_time", "ds$->{0..1}.c_flow_$->{202001..202512}");
-        result.setTableShardingStrategyConfig(new StandardShardingStrategyConfiguration("trans_time", new TimeShardingAlg()));
-        return result;
-    }
-    
-    private TableRuleConfiguration getTimeBasedRedEnvelopeTableRuleConfiguration() {
-        // 基于时间的分表配置,按月分表
-        TableRuleConfiguration result = new TableRuleConfiguration("c_red_envelope_time", "ds$->{0..1}.c_red_envelope_$->{202001..202512}");
-        result.setTableShardingStrategyConfig(new StandardShardingStrategyConfiguration("trans_time", new TimeShardingAlg()));
+        result.setTableShardingStrategyConfig(new StandardShardingStrategyConfiguration("create_time", new TimeShardingAlg()));
         return result;
     }
 }

+ 4 - 4
cif-service/src/main/java/com/txz/cif/configurer/TimeShardingAlg.java

@@ -7,11 +7,10 @@ import java.util.Collection;
 import java.util.Date;
 
 public class TimeShardingAlg implements PreciseShardingAlgorithm<Date> {
-
+    
     @Override
     public String doSharding(Collection<String> availableTargetNames, PreciseShardingValue<Date> shardingValue) {
         Date dateValue = shardingValue.getValue();
-        // 使用月份作为分表依据,例如:202301、202302等
         java.text.SimpleDateFormat sdf = new java.text.SimpleDateFormat("yyyyMM");
         String tableSuffix = sdf.format(dateValue);
         
@@ -20,9 +19,10 @@ public class TimeShardingAlg implements PreciseShardingAlgorithm<Date> {
             if (tableName.endsWith(tableSuffix)) {
                 return tableName;
             }
+            
         }
-        
-        // 如果没有找到匹配的表名,则返回第一个可用的表名
+        // 兜底
         return availableTargetNames.iterator().next();
+        
     }
 }

+ 10 - 10
cif-service/src/main/java/com/txz/cif/service/AccountFlowService.java

@@ -1,25 +1,25 @@
 package com.txz.cif.service;
-import com.txz.cif.model.AccountFlow;
+
 import com.txz.cif.core.Service;
-import com.txz.cif.web.bo.IndexCollectBO;
+import com.txz.cif.model.AccountFlow;
 
 import java.math.BigDecimal;
-import java.util.List;
-import java.util.Map;
 
 /**
  * Created by CodeGenerator on 2022/11/04.
  */
 public interface AccountFlowService extends Service<AccountFlow> {
-
-
+    
+    
     /**
      * 查询某个科目下时间段的出入流水总金额
-     * @param aliases 获取别名(101)
-     * @param type 类型 1出金 2入金
+     *
+     * @param aliases   获取别名(101)
+     * @param type      类型 1出金 2入金
      * @param startTime 开始时间 2022-10-01 00:00:00 包含
-     * @param endTime 结束时间 2022-10-02 00:00:00 不包含
+     * @param endTime   结束时间 2022-10-02 00:00:00 不包含
+     *
      * @return
      */
-    BigDecimal sumOccur(String aliases, int type, String startTime, String endTime);
+    BigDecimal sumOccur(String aliases, int type, String startTime, String endTime, Long userId);
 }

+ 9 - 10
cif-service/src/main/java/com/txz/cif/service/impl/AccountFlowServiceImpl.java

@@ -1,17 +1,15 @@
 package com.txz.cif.service.impl;
 
+import com.txz.cif.core.AbstractService;
 import com.txz.cif.dao.AccountFlowMapper;
 import com.txz.cif.model.AccountFlow;
 import com.txz.cif.service.AccountFlowService;
-import com.txz.cif.core.AbstractService;
-import com.txz.cif.web.bo.IndexCollectBO;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import javax.annotation.Resource;
 import java.math.BigDecimal;
 import java.util.HashMap;
-import java.util.List;
 import java.util.Map;
 
 /**
@@ -22,16 +20,17 @@ import java.util.Map;
 public class AccountFlowServiceImpl extends AbstractService<AccountFlow> implements AccountFlowService {
     @Resource
     private AccountFlowMapper cAccountFlowMapper;
-
+    
     @Override
     public BigDecimal sumOccur(String aliases, int type, String startTime,
-                               String endTime) {
+                               String endTime, Long userId) {
         Map<String, Object> map = new HashMap<>();
-        map.put("aliases",aliases);
-        map.put("type",type);
-        map.put("startTime",startTime);
-        map.put("endTime",endTime);
+        map.put("aliases", aliases);
+        map.put("type", type);
+        map.put("startTime", startTime);
+        map.put("endTime", endTime);
+        map.put("userId", userId);
         return cAccountFlowMapper.sumOccur(map);
     }
-
+    
 }

+ 68 - 65
cif-service/src/main/java/com/txz/cif/service/impl/DayCutServiceImpl.java

@@ -6,11 +6,9 @@ import cn.hutool.core.util.StrUtil;
 import com.txz.cif.dao.DayCutMapper;
 import com.txz.cif.model.DayCut;
 import com.txz.cif.model.Subject;
-import com.txz.cif.service.AccountFlowService;
-import com.txz.cif.service.AccountService;
-import com.txz.cif.service.DayCutService;
+import com.txz.cif.model.User;
+import com.txz.cif.service.*;
 import com.txz.cif.core.AbstractService;
-import com.txz.cif.service.SubjectService;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
@@ -33,132 +31,137 @@ import java.util.Map;
 public class DayCutServiceImpl extends AbstractService<DayCut> implements DayCutService {
     @Resource
     private DayCutMapper cDayCutMapper;
-
+    
     @Resource
     private SubjectService subjectService;
-
+    
     @Resource
     private AccountService accountService;
-
+    
     @Resource
     private AccountFlowService accountFlowService;
-
+    
+    @Resource
+    private UserService userService;
+    
     public static void main(String[] args) {
         System.out.println(DateUtil.thisDayOfMonth());
     }
-
+    
     @Override
     public void dayCut() {
-        //判断是否已日切
+        // 判断是否已日切
         Condition c = new Condition(DayCut.class);
-        c.createCriteria().andEqualTo("day",DateUtil.format(DateUtil.yesterday(),"yyyy-MM-dd"));
+        c.createCriteria().andEqualTo("day", DateUtil.format(DateUtil.yesterday(), "yyyy-MM-dd"));
         List<DayCut> dayCuts = findByCondition(c);
-        if (CollUtil.isNotEmpty(dayCuts)){
+        if (CollUtil.isNotEmpty(dayCuts)) {
             log.error("[日切]已日切");
             return;
         }
-        //查询叶子科目
+        // 查询叶子科目
         c = new Condition(Subject.class);
-        c.createCriteria().andEqualTo("leaf",1);
+        c.createCriteria().andEqualTo("leaf", 1);
         List<Subject> subjects = subjectService.findByCondition(c);
-        if (CollUtil.isEmpty(subjects)){
+        if (CollUtil.isEmpty(subjects)) {
             log.error("[日切]叶子科目为空");
             return;
         }
         // 判断是否为月初 进行月结
-        if (DateUtil.thisDayOfMonth() == 1){
+        if (DateUtil.thisDayOfMonth() == 1) {
             accountService.innerCarry();
         }
-
-        Date yesterday =  DateUtil.yesterday();
-        //借方余额汇总
+        
+        List<User> all = userService.findAll();
+        
+        Date yesterday = DateUtil.yesterday();
+        // 借方余额汇总
         BigDecimal totalDebit = BigDecimal.ZERO;
-        //贷方余额汇总
+        // 贷方余额汇总
         BigDecimal totalCredit = BigDecimal.ZERO;
-        //资产类余额汇总
+        // 资产类余额汇总
         BigDecimal asset = BigDecimal.ZERO;
-        //负债类余额 + 损益类余额 + 所有者权益余额汇总
+        // 负债类余额 + 损益类余额 + 所有者权益余额汇总
         BigDecimal unAsset = BigDecimal.ZERO;
-
-        for (Subject subject:subjects ) {
-            //初始日余额
+        
+        for (Subject subject : subjects) {
+            // 初始日余额
             BigDecimal initAmount = accountService.sumInit(subject.getAliases());
-            if (initAmount == null){
+            if (initAmount == null) {
                 initAmount = BigDecimal.ZERO;
             }
-            //日余额
+            // 日余额
             BigDecimal endAmount = accountService.sumEnd(subject.getAliases());
-            if (endAmount == null){
+            if (endAmount == null) {
                 endAmount = BigDecimal.ZERO;
             }
-            //类型 1出金 2入金
-            //借方发生额
-            BigDecimal debitAmount = accountFlowService.sumOccur(subject.getAliases(),
-                    StrUtil.equals("D",subject.getDirection())? 2 : 1,
-                    DateUtil.format(yesterday,"yyyy-MM-dd")+" 00:00:00",DateUtil.today()+" 00:00:00");
-            if (debitAmount == null){
-                debitAmount = BigDecimal.ZERO;
-            }
-            //贷方发生额
-            BigDecimal creditAmount = accountFlowService.sumOccur(subject.getAliases(),
-                    StrUtil.equals("C",subject.getDirection())? 2 : 1,
-                    DateUtil.format(yesterday,"yyyy-MM-dd")+" 00:00:00",DateUtil.today()+" 00:00:00");
-            if (creditAmount == null){
-                creditAmount = BigDecimal.ZERO;
+            // 类型 1出金 2入金
+            // 借方发生额
+            BigDecimal debitAmount = BigDecimal.ZERO;
+            BigDecimal creditAmount = BigDecimal.ZERO;
+            for (User user : all) {
+                debitAmount.add(accountFlowService.sumOccur(subject.getAliases(),
+                        StrUtil.equals("D", subject.getDirection()) ? 2 : 1,
+                        DateUtil.format(yesterday, "yyyy-MM-dd") + " 00:00:00", DateUtil.today() + " 00:00:00", user.getId()));
+                
+                // 贷方发生额
+                creditAmount.add(accountFlowService.sumOccur(subject.getAliases(),
+                        StrUtil.equals("C", subject.getDirection()) ? 2 : 1,
+                        DateUtil.format(yesterday, "yyyy-MM-dd") + " 00:00:00", DateUtil.today() + " 00:00:00", user.getId()));
             }
-            //保存日切数据
+            
+            // 保存日切数据
             DayCut dayCut = DayCut.builder().subjectId(subject.getId()).day(yesterday)
                     .creditAmount(creditAmount)
                     .debitAmount(debitAmount)
                     .createTime(DateUtil.date()).endAmount(endAmount)
                     .initAmount(initAmount).build();
             save(dayCut);
-            if (StrUtil.equals("D",subject.getDirection())){
+            if (StrUtil.equals("D", subject.getDirection())) {
                 totalDebit = totalDebit.add(endAmount);
-            } else if (StrUtil.equals("C",subject.getDirection())){
+            } else if (StrUtil.equals("C", subject.getDirection())) {
                 totalCredit = totalCredit.add(endAmount);
             }
-            if (StrUtil.startWith(subject.getAliases(),"1")){
+            if (StrUtil.startWith(subject.getAliases(), "1")) {
                 asset = asset.add(endAmount);
             } else {
-                if (StrUtil.equals("D",subject.getDirection())){
+                if (StrUtil.equals("D", subject.getDirection())) {
                     unAsset = unAsset.subtract(endAmount);
-                } else if (StrUtil.equals("C",subject.getDirection())){
+                } else if (StrUtil.equals("C", subject.getDirection())) {
                     unAsset = unAsset.add(endAmount);
                 }
             }
         }
-        //借贷平衡检查
-        if (totalDebit.compareTo(totalCredit) != 0){
-            log.error("[日切]借贷平衡检查,借贷平衡检查失败:totalDebit:"+totalDebit+",totalCredit:"+totalCredit);
+        // 借贷平衡检查
+        if (totalDebit.compareTo(totalCredit) != 0) {
+            log.error("[日切]借贷平衡检查,借贷平衡检查失败:totalDebit:" + totalDebit + ",totalCredit:" + totalCredit);
         }
-        //资产类=负责类+所有者权益+损益类 平衡检查
-        if (asset.compareTo(unAsset) > 0){
-            log.error("[日切]借贷平衡检查,资产类=负责类+所有者权益+损益类 平衡检查失败:asset:"+asset+",unAsset:"+unAsset);
+        // 资产类=负责类+所有者权益+损益类 平衡检查
+        if (asset.compareTo(unAsset) > 0) {
+            log.error("[日切]借贷平衡检查,资产类=负责类+所有者权益+损益类 平衡检查失败:asset:" + asset + ",unAsset:" + unAsset);
         }
     }
-
+    
     @Override
     public DayCut findByDayAndSubjectId(String time, Integer subjectId) {
         Condition condition = new Condition(DayCut.class);
         Example.Criteria criteria = condition.createCriteria();
-        criteria.andEqualTo("day",time);
-        criteria.andEqualTo("subjectId",subjectId);
+        criteria.andEqualTo("day", time);
+        criteria.andEqualTo("subjectId", subjectId);
         List<DayCut> dayCuts = findByCondition(condition);
-        if (CollUtil.isEmpty(dayCuts)){
+        if (CollUtil.isEmpty(dayCuts)) {
             return null;
         }
         return dayCuts.get(0);
     }
-
+    
     @Override
     public BigDecimal sumAmount(Integer subjectId, String direction, String startTime,
-                                          String endTime) {
-        Map<String,Object> map = new HashMap<>();
-        map.put("subjectId",subjectId);
-        map.put("direction",direction);
-        map.put("startTime",startTime);
-        map.put("endTime",endTime);
+                                String endTime) {
+        Map<String, Object> map = new HashMap<>();
+        map.put("subjectId", subjectId);
+        map.put("direction", direction);
+        map.put("startTime", startTime);
+        map.put("endTime", endTime);
         return cDayCutMapper.sumAmount(map);
     }
 }

+ 0 - 1
cif-service/src/main/resources/mapper/AccountFlowMapper.xml

@@ -29,7 +29,6 @@
     and #{endTime} > create_time  
     and flow_type not in (4,5)  
     and aliases = #{aliases}
-    <!-- 添加分片键以确保查询能正确路由到相应的分片 -->
     and user_id = #{userId}
   </select>