ly 1 年間 前
コミット
8c9322a520

+ 12 - 0
pom.xml

@@ -150,6 +150,18 @@
             <version>3.5.1</version>
         </dependency>
 
+        <!-- 分布式锁 -->
+        <dependency>
+            <groupId>org.redisson</groupId>
+            <artifactId>redisson-spring-boot-starter</artifactId>
+            <version>3.13.6</version>
+            <exclusions>
+                <exclusion>
+                    <groupId>org.springframework.boot</groupId>
+                    <artifactId>spring-boot-starter-actuator</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
         <!-- SpringBoot集成mybatis框架
         <dependency>
             <groupId>org.mybatis.spring.boot</groupId>

+ 67 - 0
src/main/java/cn/ezhizao/framework/lock/DistributionLock.java

@@ -0,0 +1,67 @@
+package cn.ezhizao.framework.lock;
+
+
+import cn.ezhizao.common.utils.spring.SpringUtils;
+import org.redisson.api.RLock;
+import org.redisson.api.RedissonClient;
+
+import java.util.concurrent.TimeUnit;
+
+/**
+ * @author 韩方宇
+ */
+public class DistributionLock {
+
+    private final RLock lock;
+
+    public DistributionLock(String name) {
+        RedissonClient client = SpringUtils.getBean(RedissonClient.class);
+        this.lock = client.getLock(name);
+    }
+
+    public DistributionLock(String... names) {
+        RedissonClient client = SpringUtils.getBean(RedissonClient.class);
+
+        RLock[] lockList = new RLock[names.length];
+
+        for (Integer i = 0; i < names.length; i++) {
+            RLock rLock = client.getLock(names[i]);
+            lockList[i] = rLock;
+        }
+        this.lock = client.getMultiLock(lockList);
+    }
+
+    public void lock(Runnable func) {
+        this.lock();
+        try {
+            func.run();
+        } catch (Exception e) {
+            throw e;
+        } finally {
+            this.unlock();
+        }
+    }
+
+    public void lock() {
+        this.lock(5, 30, TimeUnit.SECONDS);
+    }
+
+    public void lock(long leaseTime, TimeUnit unit) {
+        this.lock(-1, leaseTime, unit);
+    }
+
+    public void lock(long waitTime, long leaseTime, TimeUnit unit) {
+        try {
+            boolean result = this.lock.tryLock(waitTime, leaseTime, unit);
+            if (!result) {
+                throw new RuntimeException("加锁失败");
+            }
+        } catch (Exception e) {
+            throw new RuntimeException("加锁失败");
+        }
+    }
+
+    public void unlock() {
+        this.lock.unlock();
+    }
+}

+ 22 - 0
src/main/java/cn/ezhizao/framework/lock/LockKey.java

@@ -0,0 +1,22 @@
+package cn.ezhizao.framework.lock;
+
+public class LockKey {
+
+    public static String join(String prefix, Object... vars) {
+        StringBuilder builder = new StringBuilder(prefix);
+        for (Object var : vars) {
+            builder.append(":");
+            builder.append(var);
+        }
+        return builder.toString();
+    }
+
+    /**
+     * 测试
+     */
+    public static final String DEMO = "lock:demo";
+
+    public static final String SALARYZERO = "lock:salaryZero";
+
+
+}

+ 1 - 0
src/main/java/cn/ezhizao/project/business/finance/IndividualIncomeTax/controller/BizFinancialIndividualIncomeTaxDetailController.java

@@ -279,6 +279,7 @@ public class BizFinancialIndividualIncomeTaxDetailController extends BaseControl
     @PostMapping("/deductionTurnBack")
     @PreAuthorize("@ss.hasPermi('business:individualIncomeTaxDetail:deductionTurnBack')")
     @Transactional(rollbackFor = Exception.class)
+    @Log(title = "个税详情-退回", businessType = BusinessType.UPDATE)
     @ResponseBody
     public AjaxResult deductionTurnBack(@RequestBody BizFinancialIndividualIncomeTaxDetail detail) {
         detail.setStatus(1);

+ 1 - 0
src/main/java/cn/ezhizao/project/business/housingFund/controller/BizHousingFundDeclareController.java

@@ -352,6 +352,7 @@ public class BizHousingFundDeclareController extends BaseController {
     @PostMapping("/turnBackDetail")
     @PreAuthorize("@ss.hasPermi('business:housingFundDeclare:edit')")
     @Transactional(rollbackFor = Exception.class)
+    @Log(title = "公积金申报任务-退回", businessType = BusinessType.UPDATE)
     @ResponseBody
     public AjaxResult deductionTurnBack(@RequestBody BizHousingFundDeclareDetail detail) {
         detail.setStatus(1);

+ 9 - 26
src/main/java/cn/ezhizao/project/business/productionCompany/controller/BizProductionCompanyController.java

@@ -1,33 +1,18 @@
 package cn.ezhizao.project.business.productionCompany.controller;
 
-import cn.ezhizao.common.utils.StringUtils;
-import cn.ezhizao.common.utils.poi.ExcelUtil;
-import cn.ezhizao.framework.aspectj.lang.annotation.Log;
-import cn.ezhizao.framework.aspectj.lang.enums.BusinessType;
+import cn.ezhizao.framework.lock.DistributionLock;
+import cn.ezhizao.framework.lock.LockKey;
 import cn.ezhizao.framework.web.controller.BaseController;
-import cn.ezhizao.framework.web.domain.AjaxResult;
 import cn.ezhizao.framework.web.page.TableDataInfo;
-
-import cn.ezhizao.project.business.company.domain.BizCompany;
-import cn.ezhizao.project.business.company.domain.DictRegion;
-import cn.ezhizao.project.business.company.service.IBizCompanyService;
-import cn.ezhizao.project.business.company.service.IDictRegionService;
-import cn.ezhizao.project.business.company.service.impl.BizCompanyServiceImpl;
-
 import cn.ezhizao.project.business.productionCompany.domain.BizProductionCompany;
 import cn.ezhizao.project.business.productionCompany.service.IBizProductionCompanyService;
-import cn.ezhizao.project.system.service.ISysUserService;
-import com.alibaba.fastjson2.JSONArray;
-import org.apache.commons.io.IOUtils;
-import org.springframework.security.access.prepost.PreAuthorize;
-import org.springframework.web.bind.annotation.*;
-import org.springframework.web.multipart.MultipartFile;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
 
 import javax.annotation.Resource;
-import javax.servlet.http.HttpServletResponse;
-import java.io.IOException;
-import java.nio.charset.Charset;
 import java.util.List;
+import java.util.UUID;
 
 /**
  * companyController
@@ -37,17 +22,15 @@ import java.util.List;
  */
 @RestController
 @RequestMapping("/business/ProductionCompany")
-public class BizProductionCompanyController extends BaseController
-{
+public class BizProductionCompanyController extends BaseController {
     @Resource
     private IBizProductionCompanyService bizCompanyService;
-    
+
     /**
      * 查询company列表
      */
     @GetMapping("/list")
-    public TableDataInfo list(BizProductionCompany bizCompany) throws NoSuchFieldException, IllegalAccessException
-    {
+    public TableDataInfo list(BizProductionCompany bizCompany) throws NoSuchFieldException, IllegalAccessException {
         setTenantId(bizCompany);
         startPage();
         startOrderBy();

+ 1 - 0
src/main/java/cn/ezhizao/project/business/reportTax/controller/BizFinancialReportTaxNonZeroController.java

@@ -507,6 +507,7 @@ public class BizFinancialReportTaxNonZeroController extends BaseController {
     @PostMapping("/deductionTurnBack")
     @Transactional(rollbackFor = Exception.class)
     @ResponseBody
+    @Log(title = "扣款任务-退回", businessType = BusinessType.UPDATE)
     public AjaxResult deductionTurnBack(@RequestBody BizFinancialReportTaxDetail detail) {
         detail.setStatus(1);
         BizFinancialMerge merge = financialMergeService.query().eq("financial_report_tax_detail_id", detail.getId()).one();

+ 1 - 0
src/main/java/cn/ezhizao/project/business/reportTaxIsZero/controller/BizFinancialReportTaxController.java

@@ -483,6 +483,7 @@ public class BizFinancialReportTaxController extends BaseController {
     @PreAuthorize("@ss.hasPermi('business:financialReportTax:back')")
     @Transactional(rollbackFor = Exception.class)
     @ResponseBody
+    @Log(title = "报税-退回", businessType = BusinessType.UPDATE)
     public AjaxResult deductionTurnBack(@RequestBody BizFinancialReportTaxDetail detail) {
         detail.setStatus(1);
         BizFinancialMerge merge = financialMergeService.query().eq("financial_report_tax_detail_id", detail.getId()).one();

+ 21 - 8
src/main/java/cn/ezhizao/project/business/salary/controller/BizFinancialSalaryZeroController.java

@@ -6,6 +6,8 @@ import cn.ezhizao.common.utils.poi.ExcelUtil;
 import cn.ezhizao.framework.aspectj.lang.annotation.Excel;
 import cn.ezhizao.framework.aspectj.lang.annotation.Log;
 import cn.ezhizao.framework.aspectj.lang.enums.BusinessType;
+import cn.ezhizao.framework.lock.DistributionLock;
+import cn.ezhizao.framework.lock.LockKey;
 import cn.ezhizao.framework.web.controller.BaseController;
 import cn.ezhizao.framework.web.domain.AjaxResult;
 import cn.ezhizao.framework.web.page.TableDataInfo;
@@ -35,6 +37,7 @@ import cn.ezhizao.project.business.workOrder.service.IBizWorkOrderRecordService;
 import cn.ezhizao.project.system.domain.SysUser;
 import cn.ezhizao.project.system.mapper.SysUserMapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import org.apache.tomcat.jni.Lock;
 import org.springframework.beans.BeanUtils;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.transaction.annotation.Transactional;
@@ -244,15 +247,24 @@ public class BizFinancialSalaryZeroController extends BaseController {
     @Log(title = "生产管理-工资零申报-新增", businessType = BusinessType.INSERT)
     @Transactional(rollbackFor = Exception.class)
     public AjaxResult saveDetail(@RequestBody BizFinancialSalaryDetail bizFinancialSalaryDetail) {
-        // 判断之前是否有保存一个明细
-        BizFinancialSalaryDetail conditions = new BizFinancialSalaryDetail();
-        conditions.setFinancialSalaryId(bizFinancialSalaryDetail.getFinancialSalaryId());
-        conditions.setYear(bizFinancialSalaryDetail.getYear());
-        conditions.setMonth(bizFinancialSalaryDetail.getMonth());
-        if (!bizFinancialSalaryDetailService.getList(conditions).isEmpty()) {
-            return error("该月已添加工资信息,请刷新列表。");
+
+        String join = LockKey.join(LockKey.SALARYZERO, getUserId());
+        DistributionLock lock = new DistributionLock(join);
+        try {
+            lock.lock();
+            // 判断之前是否有保存一个明细
+            BizFinancialSalaryDetail conditions = new BizFinancialSalaryDetail();
+            conditions.setFinancialSalaryId(bizFinancialSalaryDetail.getFinancialSalaryId());
+            conditions.setYear(bizFinancialSalaryDetail.getYear());
+            conditions.setMonth(bizFinancialSalaryDetail.getMonth());
+            if (!bizFinancialSalaryDetailService.getList(conditions).isEmpty()) {
+                return error("该月已添加工资信息,请刷新列表。");
+            }
+            return toAjax(bizFinancialSalaryDetailService.save(bizFinancialSalaryDetail) && addRecord(bizFinancialSalaryDetail.getFinancialSalaryId(), bizFinancialSalaryDetail.getYear(), bizFinancialSalaryDetail.getMonth(), SecurityUtils.getUserId(), "填写工资信息"));
+        }finally {
+            lock.unlock();
         }
-        return toAjax(bizFinancialSalaryDetailService.save(bizFinancialSalaryDetail) && addRecord(bizFinancialSalaryDetail.getFinancialSalaryId(), bizFinancialSalaryDetail.getYear(), bizFinancialSalaryDetail.getMonth(), SecurityUtils.getUserId(), "填写工资信息"));
+
     }
 
     @PreAuthorize("@ss.hasPermi('business:salary:edit')")
@@ -309,6 +321,7 @@ public class BizFinancialSalaryZeroController extends BaseController {
     @PreAuthorize("@ss.hasPermi('business:salaryZero:verify')")
     @PostMapping("/turnBackDetail")
     @Transactional(rollbackFor = Exception.class)
+    @Log(title = "生产管理-工资零申报-审核退回", businessType = BusinessType.UPDATE)
     public AjaxResult turnBackDetail(@RequestBody BizFinancialSalaryDetail detail) {
         // 先判断是否收票完成,收票完成状态不能进行工资退回
         BizFinancialReceiveTicketDetail financialReceiveTicketDetail = financialReceiveTicketDetailService.query().eq("company_id", detail.getCompanyId()).eq("year", detail.getYear()).eq("month", detail.getMonth()).one();

+ 1 - 0
src/main/java/cn/ezhizao/project/business/socialSecurity/controller/SocialSecurityDeclareController.java

@@ -367,6 +367,7 @@ public class SocialSecurityDeclareController extends BaseController {
     @PostMapping("/turnBackDetail")
     @Transactional(rollbackFor = Exception.class)
     @ResponseBody
+    @Log(title = "社保申报-退回", businessType = BusinessType.UPDATE)
     public AjaxResult deductionTurnBack(@RequestBody BizSocialSecurityDeclareDetail detail) {
         detail.setStatus(1);
         List<BizDeduction> deductions = deductionService.query().eq("source_table_name", "biz_social_security_declare_detail").eq("source_id", detail.getId()).list();