Bläddra i källkod

Merge remote-tracking branch 'origin/master'
添加日志
防止重复提交
公司通话余额充值,公司名称展示
公司通话余额充值
公司通话余额充值
防止重复点击和添加日志
防止重复点击和添加日志
防止重复点击和添加日志
防止重复点击和添加日志
防止重复点击和添加日志
公司短信充值模块
公司短信充值模块
公司短信充值模块

xdd 10 månader sedan
förälder
incheckning
15c9a1c47a
18 ändrade filer med 359 tillägg och 213 borttagningar
  1. 29 0
      fs-admin/src/main/java/com/fs/company/controller/CompanySmsController.java
  2. 12 1
      fs-admin/src/main/java/com/fs/company/controller/CompanySmsPackageController.java
  3. 27 1
      fs-admin/src/main/java/com/fs/company/controller/CompanyVoiceController.java
  4. 12 1
      fs-admin/src/main/java/com/fs/company/controller/CompanyVoicePackageController.java
  5. 5 4
      fs-admin/src/main/java/com/fs/core/interceptor/impl/SameUrlDataInterceptor.java
  6. 10 5
      fs-company-app/src/main/java/com/fs/core/interceptor/impl/SameUrlDataInterceptor.java
  7. 4 1
      fs-service-system/pom.xml
  8. 17 0
      fs-service-system/src/main/java/com/fs/company/cache/ICompanyCacheService.java
  9. 28 0
      fs-service-system/src/main/java/com/fs/company/cache/impl/ICompanyCacheServiceImpl.java
  10. 5 83
      fs-service-system/src/main/java/com/fs/company/domain/CompanyMoneyLogs.java
  11. 5 47
      fs-service-system/src/main/java/com/fs/company/domain/CompanySms.java
  12. 8 52
      fs-service-system/src/main/java/com/fs/company/domain/CompanyVoice.java
  13. 18 0
      fs-service-system/src/main/java/com/fs/company/dto/CompBuySmsDTO.java
  14. 3 0
      fs-service-system/src/main/java/com/fs/company/mapper/CompanyVoiceMapper.java
  15. 18 8
      fs-service-system/src/main/java/com/fs/company/service/ICompanySmsService.java
  16. 119 2
      fs-service-system/src/main/java/com/fs/company/service/impl/CompanySmsServiceImpl.java
  17. 23 6
      fs-service-system/src/main/java/com/fs/company/service/impl/CompanyVoicePackageOrderServiceImpl.java
  18. 16 2
      fs-service-system/src/main/java/com/fs/company/service/impl/CompanyVoiceServiceImpl.java

+ 29 - 0
fs-admin/src/main/java/com/fs/company/controller/CompanySmsController.java

@@ -2,7 +2,13 @@ package com.fs.company.controller;
 
 import java.util.List;
 
+import com.alibaba.fastjson.JSON;
+import com.fs.common.annotation.RepeatSubmit;
+import com.fs.company.domain.CompanySmsOrder;
+import com.fs.company.dto.CompBuySmsDTO;
 import com.fs.company.vo.CompanySmsListVO;
+import org.apache.commons.lang.exception.ExceptionUtils;
+import org.apache.http.util.Asserts;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.GetMapping;
@@ -35,6 +41,29 @@ public class CompanySmsController extends BaseController
     @Autowired
     private ICompanySmsService companySmsService;
 
+    /**
+     * 查询公司短信列表
+     */
+    @PreAuthorize("@ss.hasPermi('company:companySms:list')")
+    @PostMapping("/buySms")
+    @RepeatSubmit
+    public AjaxResult buySms(CompBuySmsDTO compBuySmsDTO){
+        logger.info("开始执行购买短信接口,请求参数:{}", compBuySmsDTO);
+
+        Asserts.notNull(compBuySmsDTO,"充值短信参数不能为空");
+        Asserts.notNull(compBuySmsDTO.getCompanyId(),"公司id不能为空!");
+        Asserts.notNull(compBuySmsDTO.getPackageId(),"短信套餐id不能为空!");
+
+        CompanySmsOrder companySmsOrder=null;
+        try{
+            companySmsOrder = companySmsService.buySms(compBuySmsDTO);
+        }catch (Exception e){
+            logger.error("购买短信接口异常,异常信息:{}", ExceptionUtils.getFullStackTrace(e));
+            throw e;
+        }
+        return AjaxResult.success(companySmsOrder);
+    }
+
     /**
      * 查询公司短信列表
      */

+ 12 - 1
fs-admin/src/main/java/com/fs/company/controller/CompanySmsPackageController.java

@@ -22,7 +22,7 @@ import com.fs.common.core.page.TableDataInfo;
 
 /**
  * 短信套餐包Controller
- * 
+ *
  * @author fs
  * @date 2023-01-09
  */
@@ -33,6 +33,17 @@ public class CompanySmsPackageController extends BaseController
     @Autowired
     private ICompanySmsPackageService companySmsPackageService;
 
+    /**
+     * 查询短信套餐包列表
+     */
+    @PreAuthorize("@ss.hasPermi('company:companySmsPackage:list')")
+    @GetMapping("/listAll")
+    public AjaxResult listAll(CompanySmsPackage companySmsPackage)
+    {
+        List<CompanySmsPackage> list = companySmsPackageService.selectCompanySmsPackageList(companySmsPackage);
+        return AjaxResult.success(list);
+    }
+
     /**
      * 查询短信套餐包列表
      */

+ 27 - 1
fs-admin/src/main/java/com/fs/company/controller/CompanyVoiceController.java

@@ -13,6 +13,18 @@ import org.springframework.web.bind.annotation.PathVariable;
 import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
+
+import cn.hutool.core.util.ObjectUtil;
+import com.fs.common.annotation.RepeatSubmit;
+import com.fs.common.core.domain.R;
+import com.fs.common.utils.ServletUtils;
+import com.fs.company.cache.ICompanyCacheService;
+import com.fs.company.domain.Company;
+import com.fs.company.param.CompanyPackageBuyParam;
+import com.fs.company.service.ICompanyVoicePackageOrderService;
+import com.fs.company.service.impl.CompanyVoicePackageOrderServiceImpl;
+import com.fs.core.security.LoginUser;
+import org.apache.http.util.Asserts;
 import com.fs.common.annotation.Log;
 import com.fs.common.core.controller.BaseController;
 import com.fs.common.core.domain.AjaxResult;
@@ -34,7 +46,8 @@ public class CompanyVoiceController extends BaseController
 {
     @Autowired
     private ICompanyVoiceService companyVoiceService;
-
+    @Autowired
+    private ICompanyVoicePackageOrderService voicePackageOrderService;
     /**
      * 查询企业通话列表
      */
@@ -50,6 +63,19 @@ public class CompanyVoiceController extends BaseController
         return getDataTable(list);
     }
 
+    @PreAuthorize("@ss.hasPermi('company:companyVoice:buy')")
+    @PostMapping("/buy")
+    @RepeatSubmit
+    public R buy(@RequestBody CompanyPackageBuyParam param)
+    {
+        logger.info("购买语音套餐请求参数: companyId={}, packageId={}", param.getCompanyId(), param.getPackageId());
+        Asserts.notNull(param,"请求参数不能为空!");
+        Asserts.notNull(param.getCompanyId(),"公司id不能为空!");
+        Asserts.notNull(param.getPackageId(),"套餐id不能为空!");
+
+        return voicePackageOrderService.buy(param);
+    }
+
     /**
      * 导出企业通话列表
      */

+ 12 - 1
fs-admin/src/main/java/com/fs/company/controller/CompanyVoicePackageController.java

@@ -22,7 +22,7 @@ import com.fs.common.core.page.TableDataInfo;
 
 /**
  * 套餐Controller
- * 
+ *
  * @author fs
  * @date 2023-02-23
  */
@@ -45,6 +45,17 @@ public class CompanyVoicePackageController extends BaseController
         return getDataTable(list);
     }
 
+    /**
+     * 查询套餐列表
+     */
+    @PreAuthorize("@ss.hasPermi('company:companyVoicePackage:list')")
+    @GetMapping("/listAll")
+    public AjaxResult listAll(CompanyVoicePackage companyVoicePackage)
+    {
+        List<CompanyVoicePackage> list = companyVoicePackageService.selectCompanyVoicePackageList(companyVoicePackage);
+        return AjaxResult.success(list);
+    }
+
     /**
      * 导出套餐列表
      */

+ 5 - 4
fs-admin/src/main/java/com/fs/core/interceptor/impl/SameUrlDataInterceptor.java

@@ -2,6 +2,7 @@ package com.fs.core.interceptor.impl;
 
 import java.util.HashMap;
 import java.util.Map;
+import java.util.TreeMap;
 import java.util.concurrent.TimeUnit;
 import javax.servlet.http.HttpServletRequest;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -18,7 +19,7 @@ import com.fs.core.interceptor.RepeatSubmitInterceptor;
 /**
  * 判断请求url和数据是否和上一次相同,
  * 如果和上次相同,则是重复提交表单。 有效时间为10秒内。
- * 
+ *
  */
 @Component
 public class SameUrlDataInterceptor extends RepeatSubmitInterceptor
@@ -36,10 +37,10 @@ public class SameUrlDataInterceptor extends RepeatSubmitInterceptor
 
     /**
      * 间隔时间,单位:秒 默认10秒
-     * 
+     *
      * 两次相同参数的请求,如果间隔时间大于该参数,系统不会认定为重复提交的数据
      */
-    private int intervalTime = 10;
+    private int intervalTime = 3;
 
     public void setIntervalTime(int intervalTime)
     {
@@ -60,7 +61,7 @@ public class SameUrlDataInterceptor extends RepeatSubmitInterceptor
         // body参数为空,获取Parameter的数据
         if (StringUtils.isEmpty(nowParams))
         {
-            nowParams = JSONObject.toJSONString(request.getParameterMap());
+            nowParams = JSONObject.toJSONString(new TreeMap<>(request.getParameterMap()));
         }
         Map<String, Object> nowDataMap = new HashMap<String, Object>();
         nowDataMap.put(REPEAT_PARAMS, nowParams);

+ 10 - 5
fs-company-app/src/main/java/com/fs/core/interceptor/impl/SameUrlDataInterceptor.java

@@ -1,6 +1,8 @@
 package com.fs.core.interceptor.impl;
 
+import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
+import com.alibaba.fastjson.serializer.SerializerFeature;
 import com.fs.common.constant.Constants;
 import com.fs.common.core.redis.RedisCache;
 import com.fs.common.filter.RepeatedlyRequestWrapper;
@@ -14,20 +16,21 @@ import org.springframework.stereotype.Component;
 import javax.servlet.http.HttpServletRequest;
 import java.util.HashMap;
 import java.util.Map;
+import java.util.TreeMap;
 import java.util.concurrent.TimeUnit;
 
 /**
  * 判断请求url和数据是否和上一次相同,
  * 如果和上次相同,则是重复提交表单。 有效时间为10秒内。
- * 
+ *
 
  */
 @Component
 public class SameUrlDataInterceptor extends RepeatSubmitInterceptor
 {
-    public final String REPEAT_PARAMS = "repeatParams";
+    private final String REPEAT_PARAMS = "repeatParams";
 
-    public final String REPEAT_TIME = "repeatTime";
+    private final String REPEAT_TIME = "repeatTime";
 
     // 令牌自定义标识
     @Value("${fs.jwt.header}")
@@ -38,7 +41,7 @@ public class SameUrlDataInterceptor extends RepeatSubmitInterceptor
 
     /**
      * 间隔时间,单位:秒 默认10秒
-     * 
+     *
      * 两次相同参数的请求,如果间隔时间大于该参数,系统不会认定为重复提交的数据
      */
     private int intervalTime = 10;
@@ -62,7 +65,9 @@ public class SameUrlDataInterceptor extends RepeatSubmitInterceptor
         // body参数为空,获取Parameter的数据
         if (StringUtils.isEmpty(nowParams))
         {
-            nowParams = JSONObject.toJSONString(request.getParameterMap());
+            // TreeMap保证有序
+            Map<String, String[]> sortedParams = new TreeMap<>(request.getParameterMap());
+            nowParams = JSON.toJSONString(sortedParams, SerializerFeature.WriteMapNullValue);
         }
         Map<String, Object> nowDataMap = new HashMap<String, Object>();
         nowDataMap.put(REPEAT_PARAMS, nowParams);

+ 4 - 1
fs-service-system/pom.xml

@@ -204,7 +204,10 @@
             <artifactId>redisson-spring-boot-starter</artifactId>
             <version>3.13.6</version>
         </dependency>
-
+        <dependency>
+            <groupId>com.github.ben-manes.caffeine</groupId>
+            <artifactId>caffeine</artifactId>
+        </dependency>
 
     </dependencies>
 </project>

+ 17 - 0
fs-service-system/src/main/java/com/fs/company/cache/ICompanyCacheService.java

@@ -0,0 +1,17 @@
+package com.fs.company.cache;
+
+
+import com.fs.company.domain.Company;
+
+import java.util.concurrent.TimeUnit;
+
+public interface ICompanyCacheService {
+    /**
+     * 查询企业
+     *
+     * @param companyId 企业ID
+     * @return 企业
+     */
+    public Company selectCompanyById(Long companyId);
+
+}

+ 28 - 0
fs-service-system/src/main/java/com/fs/company/cache/impl/ICompanyCacheServiceImpl.java

@@ -0,0 +1,28 @@
+package com.fs.company.cache.impl;
+
+import com.fs.company.cache.ICompanyCacheService;
+import com.fs.company.domain.Company;
+import com.fs.company.service.ICompanyService;
+import com.github.benmanes.caffeine.cache.Cache;
+import com.github.benmanes.caffeine.cache.Caffeine;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.concurrent.TimeUnit;
+
+@Service
+@Slf4j
+public class ICompanyCacheServiceImpl implements ICompanyCacheService {
+    @Autowired
+    private ICompanyService companyService;
+
+    private static final Cache<Long, Company> COMPANY_CACHE = Caffeine.newBuilder()
+            .maximumSize(1000)
+            .expireAfterWrite(10, TimeUnit.SECONDS)
+            .build();
+    @Override
+    public Company selectCompanyById(Long companyId) {
+        return COMPANY_CACHE.get(companyId,e-> companyService.selectCompanyById(companyId));
+    }
+}

+ 5 - 83
fs-service-system/src/main/java/com/fs/company/domain/CompanyMoneyLogs.java

@@ -3,15 +3,19 @@ package com.fs.company.domain;
 import java.math.BigDecimal;
 import com.fs.common.annotation.Excel;
 import com.fs.common.core.domain.BaseEntity;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
 import org.apache.commons.lang3.builder.ToStringBuilder;
 import org.apache.commons.lang3.builder.ToStringStyle;
 
 /**
  * 企业账户记录对象 company_money_logs
- * 
+ *
  * @author fs
  * @date 2021-10-04
  */
+@EqualsAndHashCode(callSuper = true)
+@Data
 public class CompanyMoneyLogs extends BaseEntity
 {
     private static final long serialVersionUID = 1L;
@@ -39,86 +43,4 @@ public class CompanyMoneyLogs extends BaseEntity
 
     private Integer type;
 
-    public Integer getType() {
-        return type;
-    }
-
-    public void setType(Integer type) {
-        this.type = type;
-    }
-
-    public String getBusinessId() {
-        return businessId;
-    }
-
-    public void setBusinessId(String businessId) {
-        this.businessId = businessId;
-    }
-
-    public Integer getLogsType() {
-        return logsType;
-    }
-
-    public void setLogsType(Integer logsType) {
-        this.logsType = logsType;
-    }
-
-    public BigDecimal getBalance() {
-        return balance;
-    }
-
-    public void setBalance(BigDecimal balance) {
-        this.balance = balance;
-    }
-
-    @Override
-    public String getRemark() {
-        return remark;
-    }
-
-    @Override
-    public void setRemark(String remark) {
-        this.remark = remark;
-    }
-
-    public void setLogsId(Long logsId)
-    {
-        this.logsId = logsId;
-    }
-
-    public Long getLogsId() 
-    {
-        return logsId;
-    }
-    public void setCompanyId(Long companyId) 
-    {
-        this.companyId = companyId;
-    }
-
-    public Long getCompanyId() 
-    {
-        return companyId;
-    }
-    public void setMoney(BigDecimal money) 
-    {
-        this.money = money;
-    }
-
-    public BigDecimal getMoney() 
-    {
-        return money;
-    }
-
-
-
-    @Override
-    public String toString() {
-        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
-            .append("logsId", getLogsId())
-            .append("companyId", getCompanyId())
-            .append("money", getMoney())
-            .append("remark", getRemark())
-            .append("createTime", getCreateTime())
-            .toString();
-    }
 }

+ 5 - 47
fs-service-system/src/main/java/com/fs/company/domain/CompanySms.java

@@ -2,15 +2,19 @@ package com.fs.company.domain;
 
 import com.fs.common.annotation.Excel;
 import com.fs.common.core.domain.BaseEntity;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
 import org.apache.commons.lang3.builder.ToStringBuilder;
 import org.apache.commons.lang3.builder.ToStringStyle;
 
 /**
  * 公司短信对象 company_sms
- * 
+ *
  * @author fs
  * @date 2023-01-09
  */
+@EqualsAndHashCode(callSuper = true)
+@Data
 public class CompanySms extends BaseEntity
 {
     private static final long serialVersionUID = 1L;
@@ -30,50 +34,4 @@ public class CompanySms extends BaseEntity
     @Excel(name = "总短信数")
     private Long totalSmsCount;
 
-    public void setSmsId(Long smsId) 
-    {
-        this.smsId = smsId;
-    }
-
-    public Long getSmsId() 
-    {
-        return smsId;
-    }
-    public void setCompanyId(Long companyId) 
-    {
-        this.companyId = companyId;
-    }
-
-    public Long getCompanyId() 
-    {
-        return companyId;
-    }
-    public void setRemainSmsCount(Long remainSmsCount) 
-    {
-        this.remainSmsCount = remainSmsCount;
-    }
-
-    public Long getRemainSmsCount() 
-    {
-        return remainSmsCount;
-    }
-    public void setTotalSmsCount(Long totalSmsCount) 
-    {
-        this.totalSmsCount = totalSmsCount;
-    }
-
-    public Long getTotalSmsCount() 
-    {
-        return totalSmsCount;
-    }
-
-    @Override
-    public String toString() {
-        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
-            .append("smsId", getSmsId())
-            .append("companyId", getCompanyId())
-            .append("remainSmsCount", getRemainSmsCount())
-            .append("totalSmsCount", getTotalSmsCount())
-            .toString();
-    }
 }

+ 8 - 52
fs-service-system/src/main/java/com/fs/company/domain/CompanyVoice.java

@@ -2,6 +2,8 @@ package com.fs.company.domain;
 
 import com.fs.common.annotation.Excel;
 import com.fs.common.core.domain.BaseEntity;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
 import org.apache.commons.lang3.builder.ToStringBuilder;
 import org.apache.commons.lang3.builder.ToStringStyle;
 
@@ -11,6 +13,8 @@ import org.apache.commons.lang3.builder.ToStringStyle;
  * @author fs
  * @date 2023-02-23
  */
+@EqualsAndHashCode(callSuper = true)
+@Data
 public class CompanyVoice extends BaseEntity
 {
     private static final long serialVersionUID = 1L;
@@ -21,6 +25,10 @@ public class CompanyVoice extends BaseEntity
     /** 公司ID */
     @Excel(name = "公司ID")
     private Long companyId;
+    /**
+     * 公司名称
+     */
+    private String companyName;
 
     private Long merchantId;
 
@@ -32,57 +40,5 @@ public class CompanyVoice extends BaseEntity
     @Excel(name = "累计时长 分")
     private Long totalTimes;
 
-    public void setVoiceId(Long voiceId)
-    {
-        this.voiceId = voiceId;
-    }
 
-    public Long getVoiceId()
-    {
-        return voiceId;
-    }
-    public void setCompanyId(Long companyId)
-    {
-        this.companyId = companyId;
-    }
-
-    public Long getCompanyId()
-    {
-        return companyId;
-    }
-    public void setTimes(Long times)
-    {
-        this.times = times;
-    }
-
-    public Long getTimes()
-    {
-        return times;
-    }
-    public void setTotalTimes(Long totalTimes)
-    {
-        this.totalTimes = totalTimes;
-    }
-
-    public Long getTotalTimes() {
-        return totalTimes;
-    }
-
-    public Long getMerchantId() {
-        return merchantId;
-    }
-
-    public void setMerchantId(Long merchantId) {
-        this.merchantId = merchantId;
-    }
-
-    @Override
-    public String toString() {
-        return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE)
-            .append("voiceId", getVoiceId())
-            .append("companyId", getCompanyId())
-            .append("times", getTimes())
-            .append("totalTimes", getTotalTimes())
-            .toString();
-    }
 }

+ 18 - 0
fs-service-system/src/main/java/com/fs/company/dto/CompBuySmsDTO.java

@@ -0,0 +1,18 @@
+package com.fs.company.dto;
+
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+public class CompBuySmsDTO implements Serializable {
+    /**
+     * 公司id
+     */
+    private String companyId;
+    /**
+     * 套餐id
+     */
+    private String packageId;
+}

+ 3 - 0
fs-service-system/src/main/java/com/fs/company/mapper/CompanyVoiceMapper.java

@@ -78,4 +78,7 @@ public interface CompanyVoiceMapper
     CompanyVoice selectCompanyVoiceByCompanyId(Long companyId);
     @Update("update company_voice set times=times+#{times} where company_id=#{companyId}")
     int updateCompanyVoiceRemainTimes(@Param("companyId") Long companyId,@Param("times")Long times);
+
+    @Select("select * from company_voice where company_id=#{companyId} for update")
+    CompanyVoice selectCompanyVoiceByCompanyIdForUpdate(Long companyId);
 }

+ 18 - 8
fs-service-system/src/main/java/com/fs/company/service/ICompanySmsService.java

@@ -2,19 +2,21 @@ package com.fs.company.service;
 
 import java.util.List;
 import com.fs.company.domain.CompanySms;
+import com.fs.company.domain.CompanySmsOrder;
+import com.fs.company.dto.CompBuySmsDTO;
 import com.fs.company.vo.CompanySmsListVO;
 
 /**
  * 公司短信Service接口
- * 
+ *
  * @author fs
  * @date 2023-01-09
  */
-public interface ICompanySmsService 
+public interface ICompanySmsService
 {
     /**
      * 查询公司短信
-     * 
+     *
      * @param smsId 公司短信ID
      * @return 公司短信
      */
@@ -22,7 +24,7 @@ public interface ICompanySmsService
 
     /**
      * 查询公司短信列表
-     * 
+     *
      * @param companySms 公司短信
      * @return 公司短信集合
      */
@@ -30,7 +32,7 @@ public interface ICompanySmsService
 
     /**
      * 新增公司短信
-     * 
+     *
      * @param companySms 公司短信
      * @return 结果
      */
@@ -38,7 +40,7 @@ public interface ICompanySmsService
 
     /**
      * 修改公司短信
-     * 
+     *
      * @param companySms 公司短信
      * @return 结果
      */
@@ -46,7 +48,7 @@ public interface ICompanySmsService
 
     /**
      * 批量删除公司短信
-     * 
+     *
      * @param smsIds 需要删除的公司短信ID
      * @return 结果
      */
@@ -54,7 +56,7 @@ public interface ICompanySmsService
 
     /**
      * 删除公司短信信息
-     * 
+     *
      * @param smsId 公司短信ID
      * @return 结果
      */
@@ -68,4 +70,12 @@ public interface ICompanySmsService
     int addCompanySms(Long companyId, int number);
 
     CompanySms selectCompanySmsByCompanyIdForUpdate(Long companyId);
+    /**
+     * 公司充值短信套餐
+     *
+     * @param compBuySmsDTO 请求参数
+     * @return CompanySmsOrder 订单数据
+     */
+    CompanySmsOrder buySms(CompBuySmsDTO compBuySmsDTO);
+
 }

+ 119 - 2
fs-service-system/src/main/java/com/fs/company/service/impl/CompanySmsServiceImpl.java

@@ -1,13 +1,25 @@
 package com.fs.company.service.impl;
 
+import java.math.BigDecimal;
+import java.util.Date;
 import java.util.List;
 
+import cn.hutool.core.util.IdUtil;
+import cn.hutool.core.util.ObjectUtil;
+import com.fs.common.annotation.RepeatSubmit;
+import com.fs.common.core.domain.R;
+import com.fs.common.exception.CustomException;
+import com.fs.company.domain.*;
+import com.fs.company.dto.CompBuySmsDTO;
+import com.fs.company.mapper.*;
 import com.fs.company.vo.CompanySmsListVO;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.http.util.Asserts;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
-import com.fs.company.mapper.CompanySmsMapper;
-import com.fs.company.domain.CompanySms;
 import com.fs.company.service.ICompanySmsService;
+import org.springframework.transaction.annotation.Propagation;
+import org.springframework.transaction.annotation.Transactional;
 
 /**
  * 公司短信Service业务层处理
@@ -15,12 +27,24 @@ import com.fs.company.service.ICompanySmsService;
  * @author fs
  * @date 2023-01-09
  */
+@Slf4j
 @Service
 public class CompanySmsServiceImpl implements ICompanySmsService
 {
     @Autowired
     private CompanySmsMapper companySmsMapper;
 
+    @Autowired
+    private CompanyMapper companyMapper;
+
+    @Autowired
+    private CompanySmsPackageMapper companySmsPackageMapper;
+
+    @Autowired
+    private CompanySmsOrderMapper companySmsOrderMapper;
+
+    @Autowired
+    private CompanyMoneyLogsMapper companyMoneyLogsMapper;
     /**
      * 查询公司短信
      *
@@ -119,4 +143,97 @@ public class CompanySmsServiceImpl implements ICompanySmsService
     public CompanySms selectCompanySmsByCompanyIdForUpdate(Long companyId) {
         return companySmsMapper.selectCompanySmsByCompanyIdForUpdate(companyId);
     }
+
+    /**
+     * 公司充值短信套餐
+     *
+     * @param compBuySmsDTO 请求参数
+     * @return CompanySmsOrder 订单数据
+     */
+    @Override
+    @Transactional(rollbackFor = Throwable.class,propagation = Propagation.REQUIRED)
+    public CompanySmsOrder buySms(CompBuySmsDTO compBuySmsDTO) {
+        String companyId = compBuySmsDTO.getCompanyId();
+        String packageId = compBuySmsDTO.getPackageId();
+        log.info("开始购买短信服务,公司ID:{},套餐ID:{}", companyId, packageId);
+
+        Company company = companyMapper.selectCompanyByIdForUpdate(Long.valueOf(companyId));
+        Asserts.notNull(company,"该公司没有不存在!");
+        log.info("查询公司信息,公司ID:{},公司信息:{}", companyId, company);
+
+        CompanySmsPackage companySmsPackage = companySmsPackageMapper.selectCompanySmsPackageById(Long.valueOf(packageId));
+        Asserts.notNull(companySmsPackage, "该套餐不存在!");
+        log.info("查询短信套餐信息,套餐ID:{},套餐信息:{}", packageId, companySmsPackage);
+
+        if(ObjectUtil.notEqual(companySmsPackage.getStatus(),1L)){
+            log.error("购买短信套餐失败,套餐已禁用,套餐ID:{}", packageId);
+            throw new CustomException("该套餐已经禁用!");
+        }
+        if(ObjectUtil.isNull(company.getMoney())){
+            company.setMoney(BigDecimal.ZERO);
+        }
+
+        if(ObjectUtil.isNull(companySmsPackage.getPrice())){
+            companySmsPackage.setPrice(BigDecimal.ZERO);
+        }
+
+        // 检查公司余额是否足够
+        if(ObjectUtil.equal(company.getMoney().compareTo(companySmsPackage.getPrice()),-1)) {
+            log.error("购买短信套餐失败,公司余额不足,公司ID:{},当前余额:{},套餐价格:{}", companyId, company.getMoney(), companySmsPackage.getPrice());
+            throw new CustomException("当前公司余额不足以完成支付本次购买!");
+        }
+
+
+        // 创建订单
+        CompanySmsOrder order = new CompanySmsOrder();
+        order.setCompanyId(Long.valueOf(companyId));
+        order.setPackageId(Long.valueOf(packageId));
+        order.setSmsCount(companySmsPackage.getSmsCount());
+        order.setPrice(companySmsPackage.getPrice());
+        order.setPayMoney(companySmsPackage.getPrice());
+        order.setOrderCode(IdUtil.getSnowflake(0, 0).nextIdStr());
+        order.setStatus(1);
+        order.setPayTime(new Date());
+        companySmsOrderMapper.insertCompanySmsOrder(order);
+
+
+        // 套餐数量变化
+        CompanySms companySms = companySmsMapper.selectCompanySmsByCompanyIdForUpdate(Long.valueOf(companyId));
+        if(ObjectUtil.isNull(companySms)){
+            companySms = new CompanySms();
+            companySms.setCompanyId(Long.valueOf(companyId));
+            companySms.setRemainSmsCount(companySmsPackage.getSmsCount());
+            companySms.setTotalSmsCount(companySmsPackage.getSmsCount());
+            companySmsMapper.insertCompanySms(companySms);
+            log.info("首次购买短信,插入公司短信余量记录,公司ID:{}", companyId);
+        } else {
+            companySms.setRemainSmsCount(companySms.getRemainSmsCount() + companySmsPackage.getSmsCount());
+            companySms.setTotalSmsCount(companySms.getTotalSmsCount() + companySmsPackage.getSmsCount());
+            companySmsMapper.updateCompanySms(companySms);
+            log.info("更新公司短信余量记录,公司ID:{},更新后短信余量:{}", companyId, companySms.getRemainSmsCount());
+        }
+
+        // 公司余额扣减
+        company.setMoney(company.getMoney().subtract(companySmsPackage.getPrice()));
+        companyMapper.updateCompany(company);
+        log.info("更新公司余额,公司ID:{},更新后余额:{}", companyId, company.getMoney());
+
+
+        // 新增公司账户记录
+        CompanyMoneyLogs companyMoneyLogs = new CompanyMoneyLogs();
+        companyMoneyLogs.setCompanyId(Long.valueOf(companyId));
+        companyMoneyLogs.setMoney(companySmsPackage.getPrice());
+        companyMoneyLogs.setBalance(company.getMoney());
+
+        companyMoneyLogs.setRemark("短信充值");
+
+        companyMoneyLogs.setBusinessId(String.valueOf(order.getOrderId()));
+        companyMoneyLogs.setLogsType(11);
+
+        companyMoneyLogsMapper.insertCompanyMoneyLogs(companyMoneyLogs);
+        log.info("插入公司账户记录,公司ID:{},业务ID(订单ID):{}", companyId, order.getOrderId());
+        log.info("购买短信服务成功,订单号:{}", order.getOrderCode());
+
+        return order;
+    }
 }

+ 23 - 6
fs-service-system/src/main/java/com/fs/company/service/impl/CompanyVoicePackageOrderServiceImpl.java

@@ -4,7 +4,9 @@ import java.math.BigDecimal;
 import java.util.Date;
 import java.util.List;
 
+import cn.hutool.core.util.ObjectUtil;
 import com.fs.common.core.domain.R;
+import com.fs.common.exception.CustomException;
 import com.fs.common.utils.DateUtils;
 import com.fs.common.utils.OrderUtils;
 import com.fs.company.domain.*;
@@ -13,10 +15,13 @@ import com.fs.company.param.CompanyPackageBuyParam;
 import com.fs.company.param.CompanyVoicePackageOrderListParam;
 import com.fs.company.vo.CompanyVoicePackageOrderListVO;
 import lombok.Synchronized;
+import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import com.fs.company.service.ICompanyVoicePackageOrderService;
+import org.springframework.transaction.annotation.Propagation;
 import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.ObjectUtils;
 
 /**
  * 套餐订单Service业务层处理
@@ -25,6 +30,7 @@ import org.springframework.transaction.annotation.Transactional;
  * @date 2023-02-23
  */
 @Service
+@Slf4j
 public class CompanyVoicePackageOrderServiceImpl implements ICompanyVoicePackageOrderService
 {
     @Autowired
@@ -118,13 +124,21 @@ public class CompanyVoicePackageOrderServiceImpl implements ICompanyVoicePackage
     }
 
     @Override
-    @Transactional
-    @Synchronized
+    @Transactional(rollbackFor = Throwable.class,propagation = Propagation.REQUIRED)
     public R buy(CompanyPackageBuyParam param) {
-        Company company=companyMapper.selectCompanyById(param.getCompanyId());
+        // 查找公司和套餐
+        CompanyVoice companyVoice = voiceMapper.selectCompanyVoiceByCompanyIdForUpdate(param.getCompanyId());
+        if(ObjectUtils.isEmpty(companyVoice)){
+            companyVoice = new CompanyVoice();
+            companyVoice.setCompanyId(param.getCompanyId());
+            companyVoice.setTimes(0L);
+            companyVoice.setTotalTimes(0L);
+            log.info("新增公司通话信息:{}",companyVoice);
+        }
+        Company company=companyMapper.selectCompanyByIdForUpdate(param.getCompanyId());
         CompanyVoicePackage companyPackage=voicePackageMapper.selectCompanyVoicePackageById(param.getPackageId());
-        if(company.getMoney().compareTo(companyPackage.getPrice())==-1){
-            return R.error("余额不足");
+        if(ObjectUtil.equal(company.getMoney().compareTo(companyPackage.getPrice()),-1)){
+            throw new CustomException("余额不足!");
         }
 
         CompanyVoicePackageOrder order=new CompanyVoicePackageOrder();
@@ -153,7 +167,10 @@ public class CompanyVoicePackageOrderServiceImpl implements ICompanyVoicePackage
         log.setBalance(company.getMoney());
         moneyLogsMapper.insertCompanyMoneyLogs(log);
         companyMapper.updateCompany(company);
-        voiceMapper.updateCompanyVoiceTimes(company.getCompanyId(),companyPackage.getTimes());
+
+        companyVoice.setTimes(companyVoice.getTimes() + companyPackage.getTimes());
+        companyVoice.setTotalTimes(companyVoice.getTotalTimes() + companyPackage.getTimes());
+        voiceMapper.updateCompanyVoice(companyVoice);
         return R.ok("购买成功");
     }
 }

+ 16 - 2
fs-service-system/src/main/java/com/fs/company/service/impl/CompanyVoiceServiceImpl.java

@@ -8,7 +8,10 @@ import org.springframework.stereotype.Service;
 import com.fs.company.mapper.CompanyVoiceMapper;
 import com.fs.company.domain.CompanyVoice;
 import com.fs.company.service.ICompanyVoiceService;
-
+import cn.hutool.core.util.ObjectUtil;
+import com.fs.company.cache.ICompanyCacheService;
+import com.fs.company.cache.impl.ICompanyCacheServiceImpl;
+import com.fs.company.domain.Company;
 /**
  * 企业通话Service业务层处理
  *
@@ -20,6 +23,8 @@ public class CompanyVoiceServiceImpl implements ICompanyVoiceService
 {
     @Autowired
     private CompanyVoiceMapper companyVoiceMapper;
+    @Autowired
+    private ICompanyCacheService companyCacheService;
 
     /**
      * 查询企业通话
@@ -42,7 +47,16 @@ public class CompanyVoiceServiceImpl implements ICompanyVoiceService
     @Override
     public List<CompanyVoice> selectCompanyVoiceList(CompanyVoice companyVoice)
     {
-        return companyVoiceMapper.selectCompanyVoiceList(companyVoice);
+        List<CompanyVoice> companyVoices = companyVoiceMapper.selectCompanyVoiceList(companyVoice);
+        for (CompanyVoice voice : companyVoices) {
+            if(ObjectUtil.isNotNull(voice.getCompanyId())){
+                Company company = companyCacheService.selectCompanyById(voice.getCompanyId());
+                if(ObjectUtil.isNotNull(company)){
+                    voice.setCompanyName(company.getCompanyName());
+                }
+            }
+        }
+        return companyVoices;
     }
 
     /**