Explorar o código

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

xdd hai 2 meses
pai
achega
15c9a1c47a
Modificáronse 18 ficheiros con 359 adicións e 213 borrados
  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;
     }
 
     /**