소스 검색

Merge remote-tracking branch 'origin/Payment-Configuration' into Payment-Configuration

xgb 3 주 전
부모
커밋
dfaa08398d
30개의 변경된 파일1524개의 추가작업 그리고 49개의 파일을 삭제
  1. 95 0
      fs-admin/src/main/java/com/fs/company/controller/RechargeRecordController.java
  2. 20 0
      fs-admin/src/main/java/com/fs/live/controller/LiveSensitiveWordsController.java
  3. 130 0
      fs-company/src/main/java/com/fs/company/controller/company/RechargeRecordController.java
  4. 2 2
      fs-company/src/main/java/com/fs/company/controller/live/LiveController.java
  5. 18 0
      fs-company/src/main/java/com/fs/user/FsUserAdminController.java
  6. 6 0
      fs-service/src/main/java/com/fs/company/domain/Company.java
  7. 179 0
      fs-service/src/main/java/com/fs/company/domain/RechargeRecord.java
  8. 86 0
      fs-service/src/main/java/com/fs/company/mapper/RechargeRecordMapper.java
  9. 62 0
      fs-service/src/main/java/com/fs/company/service/IRechargeRecordService.java
  10. 156 0
      fs-service/src/main/java/com/fs/company/service/impl/RechargeRecordServiceImpl.java
  11. 8 0
      fs-service/src/main/java/com/fs/course/mapper/FsUserCompanyUserMapper.java
  12. 5 0
      fs-service/src/main/java/com/fs/his/domain/FsUser.java
  13. 2 1
      fs-service/src/main/java/com/fs/his/enums/PaymentMethodEnum.java
  14. 0 1
      fs-service/src/main/java/com/fs/his/mapper/MerchantAppConfigMapper.java
  15. 20 0
      fs-service/src/main/java/com/fs/hisStore/config/RechargeRecordConfig.java
  16. 15 0
      fs-service/src/main/java/com/fs/hisStore/domain/FsUserScrm.java
  17. 96 4
      fs-service/src/main/java/com/fs/hisStore/service/impl/FsStoreAfterSalesScrmServiceImpl.java
  18. 104 9
      fs-service/src/main/java/com/fs/hisStore/service/impl/FsStoreOrderScrmServiceImpl.java
  19. 189 7
      fs-service/src/main/java/com/fs/hisStore/service/impl/FsStorePaymentScrmServiceImpl.java
  20. 9 0
      fs-service/src/main/java/com/fs/live/service/ILiveSensitiveWordsService.java
  21. 107 14
      fs-service/src/main/java/com/fs/live/service/impl/LiveOrderServiceImpl.java
  22. 44 0
      fs-service/src/main/java/com/fs/live/service/impl/LiveSensitiveWordsServiceImpl.java
  23. 1 1
      fs-service/src/main/resources/application-druid-zkzh-test.yml
  24. 8 7
      fs-service/src/main/resources/application-druid-zkzh.yml
  25. 6 1
      fs-service/src/main/resources/mapper/company/CompanyMapper.xml
  26. 129 0
      fs-service/src/main/resources/mapper/company/RechargeRecordMapper.xml
  27. 9 0
      fs-service/src/main/resources/mapper/course/FsUserCompanyUserMapper.xml
  28. 5 1
      fs-service/src/main/resources/mapper/his/FsUserMapper.xml
  29. 2 1
      fs-service/src/main/resources/mapper/hisStore/FsUserScrmMapper.xml
  30. 11 0
      fs-user-app/src/main/java/com/fs/app/controller/app/AppController.java

+ 95 - 0
fs-admin/src/main/java/com/fs/company/controller/RechargeRecordController.java

@@ -0,0 +1,95 @@
+package com.fs.company.controller;
+
+import cn.hutool.core.util.ObjectUtil;
+import com.fs.common.annotation.Log;
+import com.fs.common.core.controller.BaseController;
+import com.fs.common.core.domain.AjaxResult;
+import com.fs.common.core.domain.R;
+import com.fs.common.core.page.TableDataInfo;
+import com.fs.common.enums.BusinessType;
+import com.fs.common.utils.ServletUtils;
+import com.fs.common.utils.poi.ExcelUtil;
+import com.fs.company.domain.Company;
+import com.fs.company.domain.RechargeRecord;
+import com.fs.company.service.ICompanyService;
+import com.fs.company.service.IRechargeRecordService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
+
+import java.io.IOException;
+import java.util.List;
+
+/**
+ * 储值支付记录Controller
+ *
+ * @author ruoyi
+ * @date 2026-03-17
+ */
+@RestController
+@RequestMapping("/company/rechargeRecord")
+public class RechargeRecordController extends BaseController
+{
+    @Autowired
+    private IRechargeRecordService rechargeRecordService;
+
+    @Autowired
+    private ICompanyService companyService;
+
+    /**
+     * 查询储值支付记录列表
+     */
+    @PreAuthorize("@ss.hasPermi('company:rechargeRecord:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(RechargeRecord rechargeRecord)
+    {
+        startPage();
+        List<RechargeRecord> list = rechargeRecordService.selectRechargeRecordList(rechargeRecord);
+        return getDataTable(list);
+    }
+
+    /**
+     * 导出储值支付记录列表
+     */
+    @PreAuthorize("@ss.hasPermi('company:rechargeRecord:export')")
+    @Log(title = "储值支付记录", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public AjaxResult export(@RequestBody RechargeRecord rechargeRecord) throws IOException {
+        List<RechargeRecord> list = rechargeRecordService.selectRechargeRecordList(rechargeRecord);
+        ExcelUtil<RechargeRecord> util = new ExcelUtil<RechargeRecord>(RechargeRecord.class);
+        return util.exportExcel(list, "储值支付记录数据");
+    }
+
+    /**
+     * 获取储值支付记录详细信息
+     */
+    @PreAuthorize("@ss.hasPermi('company:rechargeRecord:query')")
+    @GetMapping(value = "/{id}")
+    public R getInfo(@PathVariable("id") Long id)
+    {
+        return R.ok().put("data", rechargeRecordService.selectRechargeRecordById(id));
+    }
+
+
+    /**
+     * 修改储值支付记录
+     */
+    @PreAuthorize("@ss.hasPermi('company:rechargeRecord:edit')")
+    @Log(title = "储值支付记录", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public AjaxResult edit(@RequestBody RechargeRecord rechargeRecord)
+    {
+        return toAjax(rechargeRecordService.updateRechargeRecord(rechargeRecord));
+    }
+
+    /**
+     * 删除储值支付记录
+     */
+    @PreAuthorize("@ss.hasPermi('company:rechargeRecord:remove')")
+    @Log(title = "储值支付记录", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{ids}")
+    public AjaxResult remove(@PathVariable Long[] ids)
+    {
+        return toAjax(rechargeRecordService.deleteRechargeRecordByIds(ids));
+    }
+}

+ 20 - 0
fs-admin/src/main/java/com/fs/live/controller/LiveSensitiveWordsController.java

@@ -6,11 +6,13 @@ import com.fs.common.core.domain.AjaxResult;
 import com.fs.common.core.page.TableDataInfo;
 import com.fs.common.enums.BusinessType;
 import com.fs.common.utils.poi.ExcelUtil;
+import com.fs.his.domain.FsChineseMedicine;
 import com.fs.live.domain.LiveSensitiveWords;
 import com.fs.live.service.ILiveSensitiveWordsService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
 
 import java.util.List;
 
@@ -95,4 +97,22 @@ public class LiveSensitiveWordsController extends BaseController
     {
         return toAjax(liveSensitiveWordsService.deleteLiveSensitiveWordsByWordIds(wordIds));
     }
+
+    @GetMapping("/importTemplate")
+    public AjaxResult importTemplate()
+    {
+        ExcelUtil<LiveSensitiveWords> util = new ExcelUtil<>(LiveSensitiveWords.class);
+        return util.importTemplateExcel("导入模板");
+    }
+
+
+    @Log(title = "导入", businessType = BusinessType.IMPORT)
+    @PostMapping("/importData")
+    public AjaxResult importData(MultipartFile file) throws Exception
+    {
+        ExcelUtil<LiveSensitiveWords> util = new ExcelUtil<>(LiveSensitiveWords.class);
+        List<LiveSensitiveWords> list = util.importExcel(file.getInputStream());
+        String message = liveSensitiveWordsService.importData(list);
+        return AjaxResult.success(message);
+    }
 }

+ 130 - 0
fs-company/src/main/java/com/fs/company/controller/company/RechargeRecordController.java

@@ -0,0 +1,130 @@
+package com.fs.company.controller.company;
+
+import java.io.IOException;
+import java.util.List;
+import javax.servlet.http.HttpServletResponse;
+
+import cn.hutool.core.util.ObjectUtil;
+import com.fs.common.annotation.Log;
+import com.fs.common.core.controller.BaseController;
+import com.fs.common.core.domain.AjaxResult;
+import com.fs.common.core.domain.R;
+import com.fs.common.core.page.TableDataInfo;
+import com.fs.common.enums.BusinessType;
+import com.fs.common.utils.ServletUtils;
+import com.fs.common.utils.poi.ExcelUtil;
+import com.fs.company.domain.Company;
+import com.fs.company.domain.RechargeRecord;
+import com.fs.company.service.ICompanyService;
+import com.fs.company.service.IRechargeRecordService;
+import com.fs.framework.security.LoginUser;
+import com.fs.framework.service.TokenService;
+import com.fs.sop.domain.QwSop;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.DeleteMapping;
+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;
+
+/**
+ * 储值支付记录Controller
+ *
+ * @author ruoyi
+ * @date 2026-03-17
+ */
+@RestController
+@RequestMapping("/company/rechargeRecord")
+public class RechargeRecordController extends BaseController
+{
+    @Autowired
+    private IRechargeRecordService rechargeRecordService;
+
+    @Autowired
+    private ICompanyService companyService;
+
+    @Autowired
+    private TokenService tokenService;
+    /**
+     * 查询储值支付记录列表
+     */
+    @PreAuthorize("@ss.hasPermi('company:rechargeRecord:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(RechargeRecord rechargeRecord)
+    {
+        LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
+        Long companyId = loginUser.getUser().getCompanyId();
+        rechargeRecord.setCompanyId(companyId);
+
+        startPage();
+        List<RechargeRecord> list = rechargeRecordService.selectRechargeRecordList(rechargeRecord);
+        return getDataTable(list);
+    }
+
+    /**
+     * 导出储值支付记录列表
+     */
+    @PreAuthorize("@ss.hasPermi('company:rechargeRecord:export')")
+    @Log(title = "储值支付记录", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public AjaxResult export(@RequestBody RechargeRecord rechargeRecord) throws IOException {
+        List<RechargeRecord> list = rechargeRecordService.selectRechargeRecordList(rechargeRecord);
+        ExcelUtil<RechargeRecord> util = new ExcelUtil<RechargeRecord>(RechargeRecord.class);
+        return util.exportExcel(list, "储值支付记录数据");
+    }
+
+    /**
+     * 获取储值支付记录详细信息
+     */
+    @PreAuthorize("@ss.hasPermi('company:rechargeRecord:query')")
+    @GetMapping(value = "/{id}")
+    public R getInfo(@PathVariable("id") Long id)
+    {
+        return R.ok().put("data", rechargeRecordService.selectRechargeRecordById(id));
+    }
+
+    /**
+     * 新增储值支付记录
+     */
+    @PreAuthorize("@ss.hasPermi('company:rechargeRecord:add')")
+    @Log(title = "储值支付记录", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@RequestBody RechargeRecord rechargeRecord)
+    {
+        LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
+        Long companyId = loginUser.getUser().getCompanyId();
+        Company company = companyService.selectCompanyById(companyId);
+        if (ObjectUtil.isNotEmpty(company)&&company.getIsOpenStoredPay().equals(0)){
+            throw new RuntimeException("储值支付暂时没有开放!请联系管理员!");
+        }
+        rechargeRecord.setCompanyId(company.getCompanyId());
+        rechargeRecord.setCompanyName(company.getCompanyName());
+        return toAjax(rechargeRecordService.insertRechargeRecord(rechargeRecord));
+    }
+
+    /**
+     * 修改储值支付记录
+     */
+    @PreAuthorize("@ss.hasPermi('company:rechargeRecord:edit')")
+    @Log(title = "储值支付记录", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public AjaxResult edit(@RequestBody RechargeRecord rechargeRecord)
+    {
+        return toAjax(rechargeRecordService.updateRechargeRecord(rechargeRecord));
+    }
+
+    /**
+     * 删除储值支付记录
+     */
+    @PreAuthorize("@ss.hasPermi('company:rechargeRecord:remove')")
+    @Log(title = "储值支付记录", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{ids}")
+    public AjaxResult remove(@PathVariable Long[] ids)
+    {
+        return toAjax(rechargeRecordService.deleteRechargeRecordByIds(ids));
+    }
+}

+ 2 - 2
fs-company/src/main/java/com/fs/company/controller/live/LiveController.java

@@ -183,8 +183,8 @@ public class LiveController extends BaseController
         CompanyUser user = SecurityUtils.getLoginUser().getUser();
         live.setCompanyUserId(user.getUserId());
         live.setCompanyId(user.getCompanyId());
-        return R.ok();
-//        return liveService.startLive(live);
+//        return R.ok();
+        return liveService.startLive(live);
     }
 
     /**

+ 18 - 0
fs-company/src/main/java/com/fs/user/FsUserAdminController.java

@@ -20,6 +20,7 @@ import com.fs.framework.service.TokenService;
 import com.fs.his.domain.FsUser;
 import com.fs.his.service.IFsUserService;
 import com.fs.his.utils.PhoneUtil;
+import com.fs.his.vo.FsUserVO;
 import com.fs.im.dto.OpenImResponseDTO;
 import com.fs.im.service.OpenIMService;
 import com.fs.qw.domain.CustomerTransferApproval;
@@ -103,6 +104,23 @@ public class FsUserAdminController extends BaseController {
         return fsUserService.selectFsUserPageListNew(param);
     }
 
+    @PreAuthorize("@ss.hasPermi('user:fsUser:myList')")
+    @PostMapping("/myUserList")
+    @ApiOperation("我的会员列表")
+    public TableDataInfo pageMyUserList(@RequestBody FsUser param) {
+
+        LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
+        param.setCompanyId(loginUser.getCompany().getCompanyId());
+        param.setCompanyUserId(loginUser.getUser().getUserId());
+
+        if(param.getCompanyUserId() == null) {
+            throw new IllegalArgumentException("当前销售不存在!");
+        }
+        startPage();
+        List<FsUser> list = fsUserService.selectFsUserList(param);
+        return getDataTable(list);
+    }
+
     @PostMapping("/auditUser")
     @ApiOperation("审核用户(移除小黑屋)")
     public R auditUser(@RequestBody String[] userIds) {

+ 6 - 0
fs-service/src/main/java/com/fs/company/domain/Company.java

@@ -141,6 +141,12 @@ public class Company extends BaseEntity
     // 控制休息提示是否打开要暂停  0-关闭 1-打开 null-默认打开
     private Integer isOpenRestReminder;
 
+
+    /**
+     * 储值支付 0-关闭 1-打开
+     */
+    private Integer isOpenStoredPay;
+
     @TableField(exist = false)
     private List<Long> ids;
 }

+ 179 - 0
fs-service/src/main/java/com/fs/company/domain/RechargeRecord.java

@@ -0,0 +1,179 @@
+package com.fs.company.domain;
+
+import java.math.BigDecimal;
+import java.util.Date;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fs.common.annotation.Excel;
+import com.fs.common.core.domain.BaseEntity;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+
+/**
+ * 储值支付记录对象 recharge_record
+ *
+ * @author ruoyi
+ * @date 2026-03-17
+ */
+public class RechargeRecord extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    /** 主键ID */
+    private Long id;
+
+    /** 用户ID */
+    @Excel(name = "用户ID")
+    private Long userId;
+
+    /** 用户姓名 */
+    @Excel(name = "用户姓名")
+    private String userName;
+
+    /** 储值金额 */
+    @Excel(name = "储值金额")
+    private BigDecimal totalAmount;
+
+    /** 交易流水号 */
+    @Excel(name = "交易流水号")
+    private String transactionId;
+
+    /** 订单ID */
+    private Long orderId;
+
+    /** 订单编号 */
+    private String orderNo;
+
+    /** 业务类型:0-充值,1-消费 */
+    @Excel(name = "业务类型", readConverterExp = "0=充值,1=消费")
+    private Integer businessType;
+
+    /** 公司ID */
+    @Excel(name = "公司ID")
+    private Long companyId;
+
+    /** 公司名称 */
+    @Excel(name = "公司名称")
+    private String companyName;
+
+    /** 删除标志:0-未删除,1-已删除 */
+    private String delFlag;
+
+    public void setId(Long id)
+    {
+        this.id = id;
+    }
+
+    public Long getId()
+    {
+        return id;
+    }
+    public void setUserId(Long userId)
+    {
+        this.userId = userId;
+    }
+
+    public Long getUserId()
+    {
+        return userId;
+    }
+    public void setUserName(String userName)
+    {
+        this.userName = userName;
+    }
+
+    public String getUserName()
+    {
+        return userName;
+    }
+    public void setTotalAmount(BigDecimal totalAmount)
+    {
+        this.totalAmount = totalAmount;
+    }
+
+    public BigDecimal getTotalAmount()
+    {
+        return totalAmount;
+    }
+    public void setTransactionId(String transactionId)
+    {
+        this.transactionId = transactionId;
+    }
+
+    public String getTransactionId()
+    {
+        return transactionId;
+    }
+    public Integer getBusinessType()
+    {
+        return businessType;
+    }
+
+    public void setBusinessType(Integer businessType)
+    {
+        this.businessType = businessType;
+    }
+    public Long getCompanyId()
+    {
+        return companyId;
+    }
+
+    public void setCompanyId(Long companyId)
+    {
+        this.companyId = companyId;
+    }
+    public String getCompanyName()
+    {
+        return companyName;
+    }
+
+    public void setCompanyName(String companyName)
+    {
+        this.companyName = companyName;
+    }
+    public String getDelFlag()
+    {
+        return delFlag;
+    }
+    public void setDelFlag(String delFlag)
+    {
+        this.delFlag = delFlag;
+    }
+
+    public Long getOrderId() {
+        return orderId;
+    }
+
+    public RechargeRecord setOrderId(Long orderId) {
+        this.orderId = orderId;
+        return this;
+    }
+
+    public String getOrderNo() {
+        return orderNo;
+    }
+
+    public RechargeRecord setOrderNo(String orderNo) {
+        this.orderNo = orderNo;
+        return this;
+    }
+
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
+                .append("id", getId())
+                .append("userId", getUserId())
+                .append("userName", getUserName())
+                .append("totalAmount", getTotalAmount())
+                .append("transactionId", getTransactionId())
+                .append("businessType", getBusinessType())
+                .append("companyId", getCompanyId())
+                .append("companyName", getCompanyName())
+                .append("remark", getRemark())
+                .append("createBy", getCreateBy())
+                .append("createTime", getCreateTime())
+                .append("updateBy", getUpdateBy())
+                .append("updateTime", getUpdateTime())
+                .append("delFlag", getDelFlag())
+                .toString();
+    }
+}

+ 86 - 0
fs-service/src/main/java/com/fs/company/mapper/RechargeRecordMapper.java

@@ -0,0 +1,86 @@
+package com.fs.company.mapper;
+
+import com.fs.company.domain.RechargeRecord;
+import org.apache.ibatis.annotations.Param;
+
+import java.math.BigDecimal;
+import java.time.LocalDate;
+import java.util.List;
+
+/**
+ * 储值支付记录Mapper接口
+ *
+ * @author ruoyi
+ * @date 2026-03-17
+ */
+public interface RechargeRecordMapper
+{
+    /**
+     * 查询储值支付记录
+     *
+     * @param id 储值支付记录主键
+     * @return 储值支付记录
+     */
+    public RechargeRecord selectRechargeRecordById(Long id);
+
+    /**
+     * 查询储值支付记录列表
+     *
+     * @param rechargeRecord 储值支付记录
+     * @return 储值支付记录集合
+     */
+    public List<RechargeRecord> selectRechargeRecordList(RechargeRecord rechargeRecord);
+
+    /**
+     * 新增储值支付记录
+     *
+     * @param rechargeRecord 储值支付记录
+     * @return 结果
+     */
+    public int insertRechargeRecord(RechargeRecord rechargeRecord);
+
+    /**
+     * 修改储值支付记录
+     *
+     * @param rechargeRecord 储值支付记录
+     * @return 结果
+     */
+    public int updateRechargeRecord(RechargeRecord rechargeRecord);
+
+    /**
+     * 删除储值支付记录
+     *
+     * @param id 储值支付记录主键
+     * @return 结果
+     */
+    public int deleteRechargeRecordById(Long id);
+
+    /**
+     * 批量删除储值支付记录
+     *
+     * @param ids 需要删除的数据主键集合
+     * @return 结果
+     */
+    public int deleteRechargeRecordByIds(Long[] ids);
+
+
+    /**
+     * 根据用户查询充值金额
+     *
+     * @param userId
+     * @param date
+     * @return
+     */
+    BigDecimal selectTodayRechargeAmount(@Param("userId") Long userId, @Param("date") LocalDate date);
+
+    /**
+     * 根据用户查询充值次数
+     *
+     * @param userId
+     * @param date
+     * @return
+     */
+    Integer selectTodayRechargeCount(@Param("userId") Long userId, @Param("date") LocalDate date);
+
+
+}

+ 62 - 0
fs-service/src/main/java/com/fs/company/service/IRechargeRecordService.java

@@ -0,0 +1,62 @@
+package com.fs.company.service;
+
+import com.fs.company.domain.RechargeRecord;
+
+import java.util.List;
+
+/**
+ * 储值支付记录Service接口
+ *
+ * @author ruoyi
+ * @date 2026-03-17
+ */
+public interface IRechargeRecordService
+{
+    /**
+     * 查询储值支付记录
+     *
+     * @param id 储值支付记录主键
+     * @return 储值支付记录
+     */
+    public RechargeRecord selectRechargeRecordById(Long id);
+
+    /**
+     * 查询储值支付记录列表
+     *
+     * @param rechargeRecord 储值支付记录
+     * @return 储值支付记录集合
+     */
+    public List<RechargeRecord> selectRechargeRecordList(RechargeRecord rechargeRecord);
+
+    /**
+     * 新增储值支付记录
+     *
+     * @param rechargeRecord 储值支付记录
+     * @return 结果
+     */
+    public int insertRechargeRecord(RechargeRecord rechargeRecord);
+
+    /**
+     * 修改储值支付记录
+     *
+     * @param rechargeRecord 储值支付记录
+     * @return 结果
+     */
+    public int updateRechargeRecord(RechargeRecord rechargeRecord);
+
+    /**
+     * 批量删除储值支付记录
+     *
+     * @param ids 需要删除的储值支付记录主键集合
+     * @return 结果
+     */
+    public int deleteRechargeRecordByIds(Long[] ids);
+
+    /**
+     * 删除储值支付记录信息
+     *
+     * @param id 储值支付记录主键
+     * @return 结果
+     */
+    public int deleteRechargeRecordById(Long id);
+}

+ 156 - 0
fs-service/src/main/java/com/fs/company/service/impl/RechargeRecordServiceImpl.java

@@ -0,0 +1,156 @@
+package com.fs.company.service.impl;
+
+import java.math.BigDecimal;
+import java.time.LocalDate;
+import java.util.List;
+
+import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.json.JSONUtil;
+import com.fs.chat.config.QwConfig;
+import com.fs.company.domain.CompanyConfig;
+import com.fs.company.domain.RechargeRecord;
+import com.fs.company.mapper.CompanyConfigMapper;
+import com.fs.company.mapper.RechargeRecordMapper;
+import com.fs.company.service.ICompanyConfigService;
+import com.fs.company.service.IRechargeRecordService;
+import com.fs.erp.dto.sdk.df.utils.StringUtils;
+import com.fs.his.domain.FsUser;
+import com.fs.his.mapper.FsUserMapper;
+import com.fs.his.service.IFsUserService;
+import com.fs.hisStore.config.RechargeRecordConfig;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+/**
+ * 储值支付记录Service业务层处理
+ *
+ * @author ruoyi
+ * @date 2026-03-17
+ */
+@Service
+public class RechargeRecordServiceImpl implements IRechargeRecordService
+{
+    @Autowired
+    private RechargeRecordMapper rechargeRecordMapper;
+    @Autowired
+    private FsUserMapper userMapper;
+    @Autowired
+    private CompanyConfigMapper companyConfigMapper;
+    /**
+     * 查询储值支付记录
+     *
+     * @param id 储值支付记录主键
+     * @return 储值支付记录
+     */
+    @Override
+    public RechargeRecord selectRechargeRecordById(Long id)
+    {
+        return rechargeRecordMapper.selectRechargeRecordById(id);
+    }
+
+    /**
+     * 查询储值支付记录列表
+     *
+     * @param rechargeRecord 储值支付记录
+     * @return 储值支付记录
+     */
+    @Override
+    public List<RechargeRecord> selectRechargeRecordList(RechargeRecord rechargeRecord)
+    {
+        return rechargeRecordMapper.selectRechargeRecordList(rechargeRecord);
+    }
+
+    /**
+     * 新增储值支付记录
+     *
+     * @param rechargeRecord 储值支付记录
+     * @return 结果
+     */
+    @Override
+    public int insertRechargeRecord(RechargeRecord rechargeRecord) {
+        // 1. 校验用户
+        FsUser fsUser = userMapper.selectFsUserById(rechargeRecord.getUserId());
+        if (fsUser == null) {
+            throw new RuntimeException("用户不存在!");
+        }
+        if (StringUtils.isEmpty(rechargeRecord.getRemark())){
+            rechargeRecord.setRemark("用户充值");
+        }
+        // 2. 获取配置
+        CompanyConfig config = companyConfigMapper.selectCompanyConfigByKey(
+                rechargeRecord.getCompanyId(), "recharge:record:config");
+        RechargeRecordConfig rechargeRecordConfig = JSONUtil.toBean(
+                config.getConfigValue(), RechargeRecordConfig.class);
+        if (ObjectUtil.isEmpty(rechargeRecordConfig)){
+            throw new RuntimeException("请先联系管理员进行配置限额金额!");
+        }
+
+        // 3. 统计当天充值金额和次数
+        BigDecimal todayRechargedAmount = rechargeRecordMapper.selectTodayRechargeAmount(
+                fsUser.getUserId(), LocalDate.now());
+
+        Integer todayRechargeCount = rechargeRecordMapper.selectTodayRechargeCount(
+                fsUser.getUserId(), LocalDate.now());
+
+        // 4. 每日额度校验
+        if (rechargeRecordConfig.getDailyLimit() != null
+                && rechargeRecordConfig.getDailyLimit().compareTo(BigDecimal.ZERO) > 0) {
+            BigDecimal totalAmount = todayRechargedAmount.add(rechargeRecord.getTotalAmount());
+            if (totalAmount.compareTo(rechargeRecordConfig.getDailyLimit()) > 0) {
+                throw new RuntimeException(
+                        "每日充值限额" + rechargeRecordConfig.getDailyLimit() +
+                                "元,今日已充值" + todayRechargedAmount + "元");
+            }
+        }
+
+        // 5. 每日次数校验
+        if (rechargeRecordConfig.getDailyCount() != null
+                    && rechargeRecordConfig.getDailyCount() > 0) {
+            if (todayRechargeCount >= rechargeRecordConfig.getDailyCount()) {
+                throw new RuntimeException(
+                        "每日充值次数限制" + rechargeRecordConfig.getDailyCount() +
+                                "次,今日已充值" + todayRechargeCount + "次");
+            }
+        }
+        fsUser.setRechargeBalance(fsUser.getRechargeBalance().add(rechargeRecord.getTotalAmount()));
+        userMapper.updateFsUser(fsUser);
+        return rechargeRecordMapper.insertRechargeRecord(rechargeRecord);
+    }
+
+
+    /**
+     * 修改储值支付记录
+     *
+     * @param rechargeRecord 储值支付记录
+     * @return 结果
+     */
+    @Override
+    public int updateRechargeRecord(RechargeRecord rechargeRecord)
+    {
+        return rechargeRecordMapper.updateRechargeRecord(rechargeRecord);
+    }
+
+    /**
+     * 批量删除储值支付记录
+     *
+     * @param ids 需要删除的储值支付记录主键
+     * @return 结果
+     */
+    @Override
+    public int deleteRechargeRecordByIds(Long[] ids)
+    {
+        return rechargeRecordMapper.deleteRechargeRecordByIds(ids);
+    }
+
+    /**
+     * 删除储值支付记录信息
+     *
+     * @param id 储值支付记录主键
+     * @return 结果
+     */
+    @Override
+    public int deleteRechargeRecordById(Long id)
+    {
+        return rechargeRecordMapper.deleteRechargeRecordById(id);
+    }
+}

+ 8 - 0
fs-service/src/main/java/com/fs/course/mapper/FsUserCompanyUserMapper.java

@@ -111,4 +111,12 @@ public interface FsUserCompanyUserMapper extends BaseMapper<FsUserCompanyUser>{
      * @return
      */
     List<Long> selectIdListByCompanyUserId(FsUserPageListParam param);
+
+
+    /**
+     * 根据userId查询最开始的数据
+     * @param userId
+     * @return
+     */
+    FsUserCompanyUser selectFsUserCompanyUserByUserId(@Param("userId") Long userId);
 }

+ 5 - 0
fs-service/src/main/java/com/fs/his/domain/FsUser.java

@@ -251,6 +251,11 @@ public class FsUser extends BaseEntity
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     private Date appCreateTime;
 
+    /**
+     * 储值金额
+     */
+    private BigDecimal rechargeBalance;
+
 //    /**
 //     * 搜索关键词-电话号码/会员id/会员昵称
 //     * **/

+ 2 - 1
fs-service/src/main/java/com/fs/his/enums/PaymentMethodEnum.java

@@ -11,7 +11,8 @@ public enum PaymentMethodEnum {
     WX_APP("wx_app"),      // H5微信支付
     T_NATIVE("t_native"),      // H5微信支付
     ALIPAY("alipay"),         // 支付宝支付
-    H5_ALIPAY("alipay");       // H5支付宝支付
+    H5_ALIPAY("alipay"),       // H5支付宝支付
+    CZ_PAY("cz_pay");       // H5支付宝支付
 
     private final String desc;
 }

+ 0 - 1
fs-service/src/main/java/com/fs/his/mapper/MerchantAppConfigMapper.java

@@ -33,7 +33,6 @@ public interface MerchantAppConfigMapper extends BaseMapper<MerchantAppConfig>{
      * @param id 商户应用配置主键
      * @return 商户应用配置
      */
-    @DataSource(DataSourceType.SLAVE)
     MerchantAppConfig selectMerchantAppConfigById(Long id);
 
     /**

+ 20 - 0
fs-service/src/main/java/com/fs/hisStore/config/RechargeRecordConfig.java

@@ -0,0 +1,20 @@
+package com.fs.hisStore.config;
+
+import lombok.Data;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+@Data
+public class RechargeRecordConfig implements Serializable {
+
+    /**
+     * 每日充值额度限制
+     */
+    private BigDecimal dailyLimit;
+
+    /**
+     * 每月充值限制次数
+     */
+    private Integer dailyCount;
+}

+ 15 - 0
fs-service/src/main/java/com/fs/hisStore/domain/FsUserScrm.java

@@ -131,6 +131,12 @@ public class FsUserScrm extends BaseEntity
     @Excel(name = "余额")
     private BigDecimal balance;
 
+    /**
+     * 储值金额
+     */
+    @Excel(name = "储值金额")
+    private BigDecimal rechargeBalance;
+
     /** 连续签到天数 */
     @Excel(name = "连续签到天数")
     private Long signNum;
@@ -187,6 +193,15 @@ public class FsUserScrm extends BaseEntity
      */
     private String appId;
 
+    public BigDecimal getRechargeBalance() {
+        return rechargeBalance;
+    }
+
+    public FsUserScrm setRechargeBalance(BigDecimal rechargeBalance) {
+        this.rechargeBalance = rechargeBalance;
+        return this;
+    }
+
     public String getAppId() {
         return appId;
     }

+ 96 - 4
fs-service/src/main/java/com/fs/hisStore/service/impl/FsStoreAfterSalesScrmServiceImpl.java

@@ -16,6 +16,9 @@ import com.fs.common.utils.CloudHostUtils;
 import com.fs.common.utils.DateUtils;
 import com.fs.common.utils.StringUtils;
 import com.fs.common.utils.spring.SpringUtils;
+import com.fs.company.domain.Company;
+import com.fs.company.domain.RechargeRecord;
+import com.fs.company.mapper.RechargeRecordMapper;
 import com.fs.company.service.ICompanyService;
 import com.fs.config.cloud.CloudHostProper;
 import com.fs.core.config.WxPayProperties;
@@ -110,7 +113,8 @@ public class FsStoreAfterSalesScrmServiceImpl implements IFsStoreAfterSalesScrmS
     private ICompanyService companyService;
     @Autowired
     private FsStoreAfterSalesScrmMapper fsStoreAfterSalesMapper;
-
+    @Autowired
+    private RechargeRecordMapper rechargeRecordMapper;
 
     @Autowired
     private FsCoursePlaySourceConfigMapper fsCoursePlaySourceConfigMapper;
@@ -865,7 +869,7 @@ public class FsStoreAfterSalesScrmServiceImpl implements IFsStoreAfterSalesScrmS
                 AppConfig config = new Gson().fromJson(sysConfig.getConfigValue(), AppConfig.class);
 
                 for(FsStorePaymentScrm payment:payments){
-                    if (order.getPayType().equals("99")){
+                    if (order.getPayType().equals("99")||order.getPayType().equals("5")){
                         payment.setAppId(config.getAppId());
                     }
                     if (StringUtils.isBlank(payment.getAppId())) {
@@ -875,10 +879,11 @@ public class FsStoreAfterSalesScrmServiceImpl implements IFsStoreAfterSalesScrmS
                     if ("wxApp".equals(payment.getPayMode())){
                         payType = "wx";
                     }
-                    MerchantAppConfig merchantAppConfig = merchantAppConfigMapper.selectMerchantAppConfigByAppId(payment.getAppId(),payType);
-                    FsPayConfig fsPayConfig = JSON.parseObject(merchantAppConfig.getDataJson(), FsPayConfig.class);
 
                     if (payment.getPayMode()==null||payment.getPayMode().equals("wx")){
+                        MerchantAppConfig merchantAppConfig = merchantAppConfigMapper.selectMerchantAppConfigByAppId(payment.getAppId(),payType);
+                        FsPayConfig fsPayConfig = JSON.parseObject(merchantAppConfig.getDataJson(), FsPayConfig.class);
+
                         WxPayConfig payConfig = new WxPayConfig();
                         payConfig.setAppId(payment.getAppId());
                         payConfig.setMchId(fsPayConfig.getWxMchId());
@@ -910,6 +915,9 @@ public class FsStoreAfterSalesScrmServiceImpl implements IFsStoreAfterSalesScrmS
                             return R.error("退款请求失败"+e.getErrCodeDes());
                         }
                     }else if (payment.getPayMode()!=null&&payment.getPayMode().equals("hf")){
+                        MerchantAppConfig merchantAppConfig = merchantAppConfigMapper.selectMerchantAppConfigByAppId(payment.getAppId(),payType);
+                        FsPayConfig fsPayConfig = JSON.parseObject(merchantAppConfig.getDataJson(), FsPayConfig.class);
+
                         String huifuId="";
                         if (payment.getAppId() != null) {
                             if (merchantAppConfig == null){
@@ -979,6 +987,16 @@ public class FsStoreAfterSalesScrmServiceImpl implements IFsStoreAfterSalesScrmS
                             throw new CustomException("退款请求失败" + e);
                         }
 
+                    }else if (payment.getPayMode()!=null&&payment.getPayMode().equals("cz")) {
+                        FsStorePaymentScrm paymentMap = new FsStorePaymentScrm();
+                        paymentMap.setPaymentId(payment.getPaymentId());
+                        paymentMap.setStatus(-1);
+                        paymentMap.setRefundTime(DateUtils.getNowDate());
+                        paymentMap.setRefundMoney(payment.getPayMoney());
+                        paymentService.updateFsStorePayment(paymentMap);
+                        FsUserScrm fsUserScrm = userService.selectFsUserById(order.getUserId());
+                        processStoreRechargePayment(payment,fsUserScrm,order);
+
                     } else {
                         TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
                         return R.error("支付类型异常");
@@ -1000,6 +1018,80 @@ public class FsStoreAfterSalesScrmServiceImpl implements IFsStoreAfterSalesScrmS
         this.deletePurchaseLimitRecordsForStoreOrder(order);
         return R.ok();
     }
+
+    /**
+     * 处理商城储值支付
+     * @param storePayment 商城订单支付信息
+     * @param user 用户信息
+     * @return 支付处理结果
+     */
+    private R processStoreRechargePayment(FsStorePaymentScrm storePayment, FsUserScrm user, FsStoreOrderScrm fsStoreOrderScrm) {
+
+        Company company = companyService.selectCompanyById(fsStoreOrderScrm.getCompanyId());
+
+        // 增加用户储值余额
+        addUserRechargeBalance(user, storePayment.getPayMoney());
+
+        // 创建消费记录
+        return R.ok().put("data", createConsumptionRecord(
+                fsStoreOrderScrm.getId(),
+                fsStoreOrderScrm.getOrderCode(),
+                user.getUserId(),
+                user.getNickName(),
+                storePayment.getPayMoney(),
+                company
+        ));
+    }
+
+    /**
+     * 增加用户储值余额
+     * @param user 用户信息
+     * @param amount 扣减金额
+     */
+    private void addUserRechargeBalance(FsUserScrm user, BigDecimal amount) {
+        user.setRechargeBalance(user.getRechargeBalance().add(amount));
+        userService.updateFsUser(user);
+    }
+    /**
+     * 订单支付成功后,增加消费记录
+     * @param orderId 订单ID
+     * @param orderNo 订单编号
+     * @param userId 用户ID
+     * @param userName 用户姓名
+     * @param amount 消费金额
+     * @return 影响行数
+     */
+    public int createConsumptionRecord(Long orderId, String orderNo, Long userId,
+                                       String userName, BigDecimal amount,Company company
+    ) {
+        RechargeRecord record = new RechargeRecord();
+        record.setUserId(userId);
+        record.setUserName(userName);
+        record.setTotalAmount(amount);
+        record.setTransactionId(generateTransactionId());
+        record.setOrderId(orderId);
+        record.setOrderNo(orderNo);
+        record.setBusinessType(2); // 1-消费
+        if (ObjectUtil.isEmpty(company)){
+            record.setRemark("订单退款,自主下单没有归属公司");
+        }else {
+            record.setCompanyId(company.getCompanyId());
+            record.setCompanyName(company.getCompanyName());
+            record.setRemark("订单退款");
+        }
+        record.setCreateTime(new Date());
+        record.setDelFlag("0");
+
+        return rechargeRecordMapper.insertRechargeRecord(record);
+    }
+
+    /**
+     * 生成交易流水号
+     * @return 交易流水号
+     */
+    private String generateTransactionId() {
+        return "TTK" + System.currentTimeMillis() + UUID.randomUUID().toString().substring(0, 8).toUpperCase();
+    }
     /**
      * 封装微信参数
      *

+ 104 - 9
fs-service/src/main/java/com/fs/hisStore/service/impl/FsStoreOrderScrmServiceImpl.java

@@ -36,10 +36,7 @@ import com.fs.common.utils.StringUtils;
 import com.fs.common.utils.ip.IpUtils;
 import com.fs.common.utils.spring.SpringUtils;
 import com.fs.company.domain.*;
-import com.fs.company.mapper.CompanyDeptMapper;
-import com.fs.company.mapper.CompanyMapper;
-import com.fs.company.mapper.CompanyMoneyLogsMapper;
-import com.fs.company.mapper.CompanyUserUserMapper;
+import com.fs.company.mapper.*;
 import com.fs.company.service.ICompanyDeptService;
 import com.fs.company.service.ICompanyService;
 import com.fs.company.service.ICompanyUserService;
@@ -48,9 +45,11 @@ import com.fs.core.config.WxMaConfiguration;
 import com.fs.core.config.WxPayProperties;
 import com.fs.core.utils.OrderCodeUtils;
 import com.fs.course.domain.FsCoursePlaySourceConfig;
+import com.fs.course.domain.FsUserCompanyUser;
 import com.fs.course.dto.FsOrderDeliveryNoteDTO;
 import com.fs.course.dto.OrderOpenIdTransDTO;
 import com.fs.course.mapper.FsCoursePlaySourceConfigMapper;
+import com.fs.course.mapper.FsUserCompanyUserMapper;
 import com.fs.erp.domain.*;
 import com.fs.erp.dto.*;
 import com.fs.erp.dto.df.*;
@@ -192,7 +191,8 @@ public class FsStoreOrderScrmServiceImpl implements IFsStoreOrderScrmService {
     private CompanyMoneyLogsMapper moneyLogsMapper;
     @Autowired
     private IFsStorePaymentScrmService storePaymentService;
-
+    @Autowired
+    private RechargeRecordMapper rechargeRecordMapper;
     @Autowired
     private CompanyUserUserMapper companyUserUserMapper;
     @Autowired
@@ -259,6 +259,9 @@ public class FsStoreOrderScrmServiceImpl implements IFsStoreOrderScrmService {
 
     @Autowired
     private ICompanyUserService companyUserService;
+
+    @Autowired
+    private FsUserCompanyUserMapper fsUserCompanyUserMapper;
     @Autowired
     private IFsStoreProductAttrValueScrmService attrValueService;
     @Autowired
@@ -857,6 +860,13 @@ public class FsStoreOrderScrmServiceImpl implements IFsStoreOrderScrmService {
     @Override
     @Transactional
     public R createOrder(long userId, FsStoreOrderCreateParam param) {
+
+        FsUserCompanyUser fsUserCompanyUser = fsUserCompanyUserMapper.selectFsUserCompanyUserByUserId(userId);
+        if (ObjectUtil.isNotEmpty(fsUserCompanyUser)){
+            param.setCompanyId(fsUserCompanyUser.getCompanyId());
+            param.setCompanyUserId(fsUserCompanyUser.getCompanyUserId());
+        }
+
         if (!CloudHostUtils.hasCloudHostName("鹤颜堂")){
             log.error("进入到数据");
             if (ObjectUtil.isEmpty(param.getAddressId())){
@@ -2514,7 +2524,7 @@ public class FsStoreOrderScrmServiceImpl implements IFsStoreOrderScrmService {
             }
 
         }
-        if (order.getPayType().equals(3)) {
+        if (order.getPayType().equals("3")) {
             //货到付款
         } else {
             //将钱退还给用户
@@ -2524,7 +2534,7 @@ public class FsStoreOrderScrmServiceImpl implements IFsStoreOrderScrmService {
                 AppConfig config = new Gson().fromJson(sysConfig.getConfigValue(), AppConfig.class);
 
                 for (FsStorePaymentScrm payment : payments) {
-                    if (order.getPayType().equals("99")){
+                    if (order.getPayType().equals("99")||order.getPayType().equals("5")){
                         payment.setAppId(config.getAppId());
                     }
                     if (StringUtils.isBlank(payment.getAppId())) {
@@ -2534,10 +2544,11 @@ public class FsStoreOrderScrmServiceImpl implements IFsStoreOrderScrmService {
                     if ("wxApp".equals(payment.getPayMode())){
                         payType = "wx";
                     }
-                    MerchantAppConfig merchantAppConfig = merchantAppConfigMapper.selectMerchantAppConfigByAppId(payment.getAppId(),payType);
-                    FsPayConfig fsPayConfig = JSON.parseObject(merchantAppConfig.getDataJson(), FsPayConfig.class);
 
                     if (payment.getPayMode() == null || payment.getPayMode().equals("wx")) {
+                        MerchantAppConfig merchantAppConfig = merchantAppConfigMapper.selectMerchantAppConfigByAppId(payment.getAppId(),payType);
+                        FsPayConfig fsPayConfig = JSON.parseObject(merchantAppConfig.getDataJson(), FsPayConfig.class);
+
                         WxPayConfig payConfig = new WxPayConfig();
                         payConfig.setAppId(payment.getAppId());
                         payConfig.setMchId(fsPayConfig.getWxMchId());
@@ -2568,6 +2579,9 @@ public class FsStoreOrderScrmServiceImpl implements IFsStoreOrderScrmService {
                             return R.error("退款请求失败" + e.getErrCodeDes());
                         }
                     } else if (payment.getPayMode() != null && payment.getPayMode().equals("hf")) {
+                        MerchantAppConfig merchantAppConfig = merchantAppConfigMapper.selectMerchantAppConfigByAppId(payment.getAppId(),payType);
+                        FsPayConfig fsPayConfig = JSON.parseObject(merchantAppConfig.getDataJson(), FsPayConfig.class);
+
                         String huifuId="";
                         if (payment.getAppId() != null) {
                             if (merchantAppConfig == null){
@@ -2642,6 +2656,15 @@ public class FsStoreOrderScrmServiceImpl implements IFsStoreOrderScrmService {
                             throw new CustomException("退款请求失败" + e);
                         }
 
+                    }else if (payment.getPayMode()!=null&&payment.getPayMode().equals("cz")) {
+                        FsStorePaymentScrm paymentMap = new FsStorePaymentScrm();
+                        paymentMap.setPaymentId(payment.getPaymentId());
+                        paymentMap.setStatus(-1);
+                        paymentMap.setRefundTime(DateUtils.getNowDate());
+                        paymentMap.setRefundMoney(payment.getPayMoney());
+                        paymentService.updateFsStorePayment(paymentMap);
+                        FsUserScrm fsUserScrm = userService.selectFsUserById(order.getUserId());
+                        processStoreRechargePayment(payment,fsUserScrm,order);
                     } else {
                         TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
                         return R.error("支付类型异常");
@@ -2726,7 +2749,79 @@ public class FsStoreOrderScrmServiceImpl implements IFsStoreOrderScrmService {
         return R.ok();
 
     }
+    /**
+     * 处理商城储值支付
+     * @param storePayment 商城订单支付信息
+     * @param user 用户信息
+     * @return 支付处理结果
+     */
+    private R processStoreRechargePayment(FsStorePaymentScrm storePayment, FsUserScrm user, FsStoreOrderScrm fsStoreOrderScrm) {
+
+        Company company = companyService.selectCompanyById(fsStoreOrderScrm.getCompanyId());
+
+        // 增加用户储值余额
+        addUserRechargeBalance(user, storePayment.getPayMoney());
+
+        // 创建消费记录
+        return R.ok().put("data", createConsumptionRecord(
+                fsStoreOrderScrm.getId(),
+                fsStoreOrderScrm.getOrderCode(),
+                user.getUserId(),
+                user.getNickName(),
+                storePayment.getPayMoney(),
+                company
+        ));
+    }
 
+    /**
+     * 增加用户储值余额
+     * @param user 用户信息
+     * @param amount 扣减金额
+     */
+    private void addUserRechargeBalance(FsUserScrm user, BigDecimal amount) {
+        user.setRechargeBalance(user.getRechargeBalance().add(amount));
+        userService.updateFsUser(user);
+    }
+    /**
+     * 订单支付成功后,增加消费记录
+     * @param orderId 订单ID
+     * @param orderNo 订单编号
+     * @param userId 用户ID
+     * @param userName 用户姓名
+     * @param amount 消费金额
+     * @return 影响行数
+     */
+    public int createConsumptionRecord(Long orderId, String orderNo, Long userId,
+                                       String userName, BigDecimal amount,Company company
+    ) {
+        RechargeRecord record = new RechargeRecord();
+        record.setUserId(userId);
+        record.setUserName(userName);
+        record.setTotalAmount(amount);
+        record.setTransactionId(generateTransactionId());
+        record.setOrderId(orderId);
+        record.setOrderNo(orderNo);
+        record.setBusinessType(2); // 1-消费
+        if (ObjectUtil.isEmpty(company)){
+            record.setRemark("订单退款,自主下单没有归属公司");
+        }else {
+            record.setCompanyId(company.getCompanyId());
+            record.setCompanyName(company.getCompanyName());
+            record.setRemark("订单退款");
+        }
+        record.setCreateTime(new Date());
+        record.setDelFlag("0");
+
+        return rechargeRecordMapper.insertRechargeRecord(record);
+    }
+
+    /**
+     * 生成交易流水号
+     * @return 交易流水号
+     */
+    private String generateTransactionId() {
+        return "TTK" + System.currentTimeMillis() + UUID.randomUUID().toString().substring(0, 8).toUpperCase();
+    }
     /**
      * 封装微信参数
      *

+ 189 - 7
fs-service/src/main/java/com/fs/hisStore/service/impl/FsStorePaymentScrmServiceImpl.java

@@ -3,6 +3,7 @@ package com.fs.hisStore.service.impl;
 
 import java.math.BigDecimal;
 
+import java.time.LocalDateTime;
 import java.time.ZoneId;
 import java.time.ZonedDateTime;
 import java.time.format.DateTimeFormatter;
@@ -14,6 +15,7 @@ import cn.binarywang.wx.miniapp.api.WxMaService;
 import cn.binarywang.wx.miniapp.bean.WxMaJscode2SessionResult;
 import cn.binarywang.wx.miniapp.bean.shop.request.shipping.*;
 import cn.hutool.core.util.IdUtil;
+import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.json.JSONUtil;
 import com.alibaba.fastjson.JSONObject;
 import com.alibaba.fastjson.TypeReference;
@@ -30,7 +32,9 @@ import com.fs.common.utils.StringUtils;
 import com.fs.common.utils.ip.IpUtils;
 import com.fs.company.domain.Company;
 import com.fs.company.domain.CompanyUser;
+import com.fs.company.domain.RechargeRecord;
 import com.fs.company.mapper.CompanyConfigMapper;
+import com.fs.company.mapper.RechargeRecordMapper;
 import com.fs.company.service.ICompanyService;
 import com.fs.company.service.ICompanyUserService;
 import com.fs.core.config.WxMaConfiguration;
@@ -53,14 +57,19 @@ import com.fs.his.service.IFsUserService;
 import com.fs.his.service.IFsUserWxService;
 import com.fs.his.utils.ConfigUtil;
 import com.fs.hisStore.config.StoreConfig;
+import com.fs.hisStore.domain.FsStoreOrderScrm;
+import com.fs.hisStore.enums.OrderInfoEnum;
 import com.fs.hisStore.enums.SysConfigEnum;
+import com.fs.hisStore.mapper.FsStoreOrderScrmMapper;
 import com.fs.hisStore.param.*;
 import com.fs.hisStore.vo.FsStorePaymentUsetVo;
 import com.fs.huifuPay.domain.HuiFuCreateOrder;
 import com.fs.huifuPay.domain.HuifuCreateOrderResult;
 import com.fs.huifuPay.sdk.opps.core.utils.HuiFuUtils;
 import com.fs.huifuPay.service.HuiFuService;
+import com.fs.live.domain.LiveOrder;
 import com.fs.live.domain.LiveOrderPayment;
+import com.fs.live.mapper.LiveOrderMapper;
 import com.fs.live.mapper.LiveOrderPaymentMapper;
 import com.fs.pay.pay.dto.WxJspayDTO;
 import com.fs.hisStore.vo.FsStorePaymentStatisticsVO;
@@ -126,7 +135,14 @@ public class FsStorePaymentScrmServiceImpl implements IFsStorePaymentScrmService
     private LiveOrderPaymentMapper liveOrderPaymentMapper;
     @Autowired
     private IFsUserScrmService userService;
+    @Autowired
+    private RechargeRecordMapper rechargeRecordMapper;
+
+    @Autowired
+    private FsStoreOrderScrmMapper storeOrderScrmMapper;
 
+    @Autowired
+    private LiveOrderMapper liveOrderMapper;
     @Autowired
     private ICompanyUserService companyUserService;
     @Autowired
@@ -1134,6 +1150,11 @@ public class FsStorePaymentScrmServiceImpl implements IFsStorePaymentScrmService
         if (Objects.isNull(user)) {
             throw new CustomException("用户不存在");
         }
+        if (PaymentMethodEnum.CZ_PAY == payOrderParam.getPaymentMethod()) {
+            if (user.getRechargeBalance().compareTo(BigDecimal.ZERO) <= 0) {
+                throw new CustomException("余额不足!请先充值。");
+            }
+        }
         String type = null;
         FsPayConfig payConfig = new FsPayConfig();
         if (PaymentMethodEnum.WX_APP == payOrderParam.getPaymentMethod()) {
@@ -1148,7 +1169,7 @@ public class FsStorePaymentScrmServiceImpl implements IFsStorePaymentScrmService
             String json = configService.selectConfigByKey("his.pay");
             PayConfigDTO payConfigDTO = JSONUtil.toBean(json, PayConfigDTO.class);
             payConfig.setType(payConfigDTO.getType());
-        } else {
+        }else if(!(PaymentMethodEnum.CZ_PAY == payOrderParam.getPaymentMethod())){
             if (StringUtils.isBlank(payOrderParam.getAppId())) {
                 throw new IllegalArgumentException("appId不能为空");
             }
@@ -1183,20 +1204,170 @@ public class FsStorePaymentScrmServiceImpl implements IFsStorePaymentScrmService
             }
         }
 
-        // 创建记录 TODO 根据type创建支付
         FsStorePaymentScrm storePayment = new FsStorePaymentScrm();
+
+        // 1. 根据业务类型创建对应的支付对象
         if (payOrderParam.getBusinessType().getPrefix().equals("live")) {
+            // 处理直播业务支付
             LiveOrderPayment liveOrderPayment = createLiveStorePayment(payConfig, user, payOrderParam);
             BeanUtils.copyProperties(liveOrderPayment, storePayment);
+
+            // 处理储值支付
+            if (isRechargePayment(payOrderParam)) {
+                return processLiveRechargePayment(liveOrderPayment, user);
+            }
         } else {
+            // 处理商城业务支付
             storePayment = createStorePaymentScrm(payConfig, user, payOrderParam);
-        }
 
+            // 处理储值支付
+            if (isRechargePayment(payOrderParam)) {
+                return processStoreRechargePayment(storePayment, user);
+            }
+        }
         // 根据配置类型创建第三方支付订单
         return createThirdPartyPaymentScrm(payConfig, storePayment, user, payOrderParam);
     }
 
+    /**
+     * 判断是否为储值支付
+     * @param payOrderParam 支付订单参数
+     * @return true:储值支付 false:其他支付方式
+     */
+    private boolean isRechargePayment(PayOrderParam payOrderParam) {
+        return PaymentMethodEnum.CZ_PAY == payOrderParam.getPaymentMethod();
+    }
+
+    /**
+     * 处理直播储值支付
+     * @param liveOrderPayment 直播订单支付信息
+     * @param user 用户信息
+     * @return 支付处理结果
+     */
+    private R processLiveRechargePayment(LiveOrderPayment liveOrderPayment, FsUserScrm user) {
+        // 查询直播订单信息
+        LiveOrder liveOrder = liveOrderMapper.selectLiveOrderByOrderId(liveOrderPayment.getBusinessId());
+        Company company = companyService.selectCompanyById(liveOrder.getCompanyId());
+
+        // 扣减用户储值余额
+        deductUserRechargeBalance(user, liveOrder.getPayMoney());
+
+        // 更新直播订单状态
+        updateLiveOrderStatus(liveOrder);
+
+        // 创建消费记录
+        return R.ok().put("data", createConsumptionRecord(
+                liveOrder.getOrderId(),
+                liveOrder.getOrderCode(),
+                user.getUserId(),
+                user.getNickName(),
+                liveOrderPayment.getPayMoney(),
+                company
+        ));
+    }
+
+    /**
+     * 处理商城储值支付
+     * @param storePayment 商城订单支付信息
+     * @param user 用户信息
+     * @return 支付处理结果
+     */
+    private R processStoreRechargePayment(FsStorePaymentScrm storePayment, FsUserScrm user) {
+        // 查询商城订单信息
+        FsStoreOrderScrm fsStoreOrderScrm = storeOrderScrmMapper.selectFsStoreOrderById(storePayment.getOrderId());
+        Company company = companyService.selectCompanyById(fsStoreOrderScrm.getCompanyId());
+
+        // 扣减用户储值余额
+        deductUserRechargeBalance(user, storePayment.getPayMoney());
+
+        // 更新商城订单状态
+        updateStoreOrderStatus(fsStoreOrderScrm);
+
+        // 创建消费记录
+        return R.ok().put("data", createConsumptionRecord(
+                fsStoreOrderScrm.getId(),
+                fsStoreOrderScrm.getOrderCode(),
+                user.getUserId(),
+                user.getNickName(),
+                storePayment.getPayMoney(),
+                company
+        ));
+    }
+
+    /**
+     * 扣减用户储值余额
+     * @param user 用户信息
+     * @param amount 扣减金额
+     */
+    private void deductUserRechargeBalance(FsUserScrm user, BigDecimal amount) {
+        user.setRechargeBalance(user.getRechargeBalance().subtract(amount));
+        userService.updateFsUser(user);
+    }
 
+    /**
+     * 更新直播订单状态
+     * @param liveOrder 直播订单
+     */
+    private void updateLiveOrderStatus(LiveOrder liveOrder) {
+        liveOrder.setStatus(OrderInfoEnum.STATUS_1.getValue());
+        liveOrder.setPayTime(LocalDateTime.now());
+        liveOrder.setIsPay("1");
+        liveOrderMapper.updateLiveOrder(liveOrder);
+    }
+
+    /**
+     * 更新商城订单状态
+     * @param storeOrder 商城订单
+     */
+    private void updateStoreOrderStatus(FsStoreOrderScrm storeOrder) {
+        storeOrder.setPaid(OrderInfoEnum.PAY_STATUS_1.getValue());
+        storeOrder.setStatus(OrderInfoEnum.STATUS_1.getValue());
+        storeOrder.setPayTime(new Date());
+        storeOrderScrmMapper.updateFsStoreOrder(storeOrder);
+    }
+
+
+
+    /**
+     * 订单支付成功后,增加消费记录
+     * @param orderId 订单ID
+     * @param orderNo 订单编号
+     * @param userId 用户ID
+     * @param userName 用户姓名
+     * @param amount 消费金额
+     * @return 影响行数
+     */
+    public int createConsumptionRecord(Long orderId, String orderNo, Long userId,
+                                       String userName, BigDecimal amount,Company company
+    ) {
+        RechargeRecord record = new RechargeRecord();
+        record.setUserId(userId);
+        record.setUserName(userName);
+        record.setTotalAmount(amount);
+        record.setTransactionId(generateTransactionId());
+        record.setOrderId(orderId);
+        record.setOrderNo(orderNo);
+        record.setBusinessType(1); // 1-消费
+        if (ObjectUtil.isEmpty(company)){
+            record.setRemark("订单消费,自主下单没有归属公司");
+        }else {
+            record.setCompanyId(company.getCompanyId());
+            record.setCompanyName(company.getCompanyName());
+            record.setRemark("订单消费");
+        }
+        record.setCreateTime(new Date());
+        record.setDelFlag("0");
+
+        return rechargeRecordMapper.insertRechargeRecord(record);
+    }
+
+    /**
+     * 生成交易流水号
+     * @return 交易流水号
+     */
+    private String generateTransactionId() {
+        return "TXF" + System.currentTimeMillis() + UUID.randomUUID().toString().substring(0, 8).toUpperCase();
+    }
     /**
      * 直播订单支付信息
      *
@@ -1212,9 +1383,15 @@ public class FsStorePaymentScrmServiceImpl implements IFsStorePaymentScrmService
         }
 
         LiveOrderPayment storePayment = new LiveOrderPayment();
-        storePayment.setStatus(0);
+
+        if (PaymentMethodEnum.CZ_PAY == payOrderParam.getPaymentMethod()){
+            storePayment.setStatus(1);
+            storePayment.setPayMode("cz");
+        }else {
+            storePayment.setStatus(0);
+            storePayment.setPayMode(payConfig.getType());
+        }
         storePayment.setAppId(payConfig.getAppId());
-        storePayment.setPayMode(payConfig.getType());
         storePayment.setBusinessCode(payOrderParam.getOrderCode());
         storePayment.setPayCode(payCode);
         storePayment.setPayMoney(payOrderParam.getAmount());
@@ -1436,10 +1613,15 @@ public class FsStorePaymentScrmServiceImpl implements IFsStorePaymentScrmService
         }
 
         FsStorePaymentScrm storePayment = new FsStorePaymentScrm();
-        storePayment.setStatus(0);
+        if (PaymentMethodEnum.CZ_PAY == payOrderParam.getPaymentMethod()){
+            storePayment.setStatus(1);
+            storePayment.setPayMode("cz");
+        }else {
+            storePayment.setStatus(0);
+            storePayment.setPayMode(payConfig.getType());
+        }
         storePayment.setAppId(payConfig.getAppId());
         storePayment.setOrderId(payOrderParam.getOrderId());
-        storePayment.setPayMode(payConfig.getType());
         storePayment.setBusinessCode(payOrderParam.getOrderCode());
         storePayment.setPayCode(payCode);
         storePayment.setPayMoney(payOrderParam.getAmount());

+ 9 - 0
fs-service/src/main/java/com/fs/live/service/ILiveSensitiveWordsService.java

@@ -1,6 +1,7 @@
 package com.fs.live.service;
 
 
+import com.fs.his.domain.FsChineseMedicine;
 import com.fs.live.domain.LiveSensitiveWords;
 
 import java.util.List;
@@ -64,4 +65,12 @@ public interface ILiveSensitiveWordsService {
      * 查询所有敏感词
      */
     List<String> selectAllWords();
+
+    /**
+     * 导入直播敏感词
+     *
+     * @param list
+     * @return
+     */
+        String importData(List<LiveSensitiveWords> list);
 }

+ 107 - 14
fs-service/src/main/java/com/fs/live/service/impl/LiveOrderServiceImpl.java

@@ -45,11 +45,9 @@ import com.fs.common.exception.ServiceException;
 import com.fs.common.utils.*;
 import com.fs.common.utils.ip.IpUtils;
 import com.fs.common.utils.spring.SpringUtils;
-import com.fs.company.domain.Company;
-import com.fs.company.domain.CompanyDept;
-import com.fs.company.domain.CompanyMoneyLogs;
-import com.fs.company.domain.CompanyUser;
+import com.fs.company.domain.*;
 import com.fs.company.mapper.CompanyMoneyLogsMapper;
+import com.fs.company.mapper.RechargeRecordMapper;
 import com.fs.company.service.ICompanyDeptService;
 import com.fs.company.service.ICompanyService;
 import com.fs.company.service.ICompanyUserService;
@@ -57,9 +55,11 @@ import com.fs.config.cloud.CloudHostProper;
 import com.fs.core.config.WxMaConfiguration;
 import com.fs.core.utils.OrderCodeUtils;
 import com.fs.course.domain.FsCoursePlaySourceConfig;
+import com.fs.course.domain.FsUserCompanyUser;
 import com.fs.course.dto.FsOrderDeliveryNoteDTO;
 import com.fs.course.dto.OrderOpenIdTransDTO;
 import com.fs.course.mapper.FsCoursePlaySourceConfigMapper;
+import com.fs.course.mapper.FsUserCompanyUserMapper;
 import com.fs.erp.domain.*;
 import com.fs.erp.dto.*;
 import com.fs.erp.mapper.FsErpFinishPushMapper;
@@ -168,13 +168,17 @@ import static com.fs.hisStore.constants.StoreConstants.DELIVERY;
 public class LiveOrderServiceImpl implements ILiveOrderService {
 
     private final RedisCache redisCache;
+
+    @Autowired
+    private FsUserCompanyUserMapper fsUserCompanyUserMapper;
     @Autowired
     private LiveOrderMapper baseMapper;
     @Autowired
     private FsUserWxMapper fsUserWxMapper;
     @Autowired
     private RocketMQTemplate rocketMQTemplate;
-
+    @Autowired
+    private RechargeRecordMapper rechargeRecordMapper;
     @Autowired
     private FsCoursePlaySourceConfigMapper fsCoursePlaySourceConfigMapper;
 
@@ -1468,7 +1472,7 @@ public class LiveOrderServiceImpl implements ILiveOrderService {
                 SysConfig sysConfig = configService.selectConfigByConfigKey("app.config");
                 AppConfig config = new Gson().fromJson(sysConfig.getConfigValue(), AppConfig.class);
                 for (LiveOrderPayment payment : payments) {
-                    if (order.getPayType().equals("99")){
+                    if (order.getPayType().equals("99")||order.getPayType().equals("5")){
                         payment.setAppId(config.getAppId());
                     }
 //                   payment.setAppId(config.getAppId());
@@ -1477,11 +1481,11 @@ public class LiveOrderServiceImpl implements ILiveOrderService {
                     if ("wxApp".equals(payment.getPayMode())){
                         payType = "wx";
                     }
-                    MerchantAppConfig merchantAppConfig = merchantAppConfigMapper.selectMerchantAppConfigByAppId(payment.getAppId(),payType);
-
-                    FsPayConfig fsPayConfig = JSON.parseObject(merchantAppConfig.getDataJson(), FsPayConfig.class);
 
                     if (payment.getPayMode() == null || "wx".equals(payment.getPayMode())) {
+                        MerchantAppConfig merchantAppConfig = merchantAppConfigMapper.selectMerchantAppConfigByAppId(payment.getAppId(),payType);
+                        FsPayConfig fsPayConfig = JSON.parseObject(merchantAppConfig.getDataJson(), FsPayConfig.class);
+
                         WxPayConfig payConfig = new WxPayConfig();
                         payConfig.setAppId(fsPayConfig.getAppId());
                         payConfig.setMchId(fsPayConfig.getWxMchId());
@@ -1514,6 +1518,9 @@ public class LiveOrderServiceImpl implements ILiveOrderService {
                             return R.error("退款请求失败" + e.getErrCodeDes());
                         }
                     } else if (payment.getPayMode() != null && "hf".equals(payment.getPayMode())) {
+                        MerchantAppConfig merchantAppConfig = merchantAppConfigMapper.selectMerchantAppConfigByAppId(payment.getAppId(),payType);
+                        FsPayConfig fsPayConfig = JSON.parseObject(merchantAppConfig.getDataJson(), FsPayConfig.class);
+
                         String huifuId = "";
                         if (payment.getAppId() != null) {
                             if (merchantAppConfig != null) {
@@ -1584,6 +1591,15 @@ public class LiveOrderServiceImpl implements ILiveOrderService {
                             throw new CustomException("退款请求失败" + e);
                         }
 
+                    }else if (payment.getPayMode()!=null&&payment.getPayMode().equals("cz")) {
+                        LiveOrderPayment paymentMap = new LiveOrderPayment();
+                        paymentMap.setPaymentId(payment.getPaymentId());
+                        paymentMap.setStatus(-1);
+                        paymentMap.setRefundTime(DateUtils.getNowDate());
+                        paymentMap.setRefundMoney(payment.getPayMoney());
+                        liveOrderPaymentMapper.updateLiveOrderPayment(paymentMap);
+                        FsUserScrm fsUserScrm = userService.selectFsUserById(Long.valueOf(order.getUserId()));
+                        processLiveRechargePayment(payment,fsUserScrm,order);
                     } else {
                         TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
                         return R.error("支付类型异常");
@@ -1614,7 +1630,68 @@ public class LiveOrderServiceImpl implements ILiveOrderService {
         return R.ok();
     }
 
+    /**
+     * 处理直播储值支付
+     * @param liveOrderPayment 直播订单支付信息
+     * @param user 用户信息
+     * @return 支付处理结果
+     */
+    private R processLiveRechargePayment(LiveOrderPayment liveOrderPayment, FsUserScrm user,LiveOrder liveOrder) {
+        // 查询直播订单信息
+        Company company = companyService.selectCompanyById(liveOrder.getCompanyId());
+
+        // 创建消费记录
+        return R.ok().put("data", createConsumptionRecord(
+                liveOrder.getOrderId(),
+                liveOrder.getOrderCode(),
+                user.getUserId(),
+                user.getNickName(),
+                liveOrderPayment.getPayMoney(),
+                company
+        ));
+    }
+
+    /**
+     * 订单支付成功后,增加消费记录
+     * @param orderId 订单ID
+     * @param orderNo 订单编号
+     * @param userId 用户ID
+     * @param userName 用户姓名
+     * @param amount 消费金额
+     * @return 影响行数
+     */
+    public int createConsumptionRecord(Long orderId, String orderNo, Long userId,
+                                       String userName, BigDecimal amount,Company company
+    ) {
+        RechargeRecord record = new RechargeRecord();
+        record.setUserId(userId);
+        record.setUserName(userName);
+        record.setTotalAmount(amount);
+        record.setTransactionId(generateTransactionId());
+        record.setOrderId(orderId);
+        record.setOrderNo(orderNo);
+        record.setBusinessType(2); // 1-消费
+        if (ObjectUtil.isEmpty(company)){
+            record.setRemark("直播订单退款,自主下单没有归属公司");
+        }else {
+            record.setCompanyId(company.getCompanyId());
+            record.setCompanyName(company.getCompanyName());
+            record.setRemark("直播订单退款");
+        }
+        record.setCreateTime(new Date());
+        record.setDelFlag("0");
+
+        return rechargeRecordMapper.insertRechargeRecord(record);
+    }
+
 
+    /**
+     * 生成交易流水号
+     * @return 交易流水号
+     */
+    private String generateTransactionId() {
+        return "TTK" + System.currentTimeMillis() + UUID.randomUUID().toString().substring(0, 8).toUpperCase();
+    }
     /**
      * 封装微信参数
      *
@@ -1748,7 +1825,7 @@ public class LiveOrderServiceImpl implements ILiveOrderService {
                 AppConfig config = new Gson().fromJson(sysConfig.getConfigValue(), AppConfig.class);
 
                 for (LiveOrderPayment payment : payments) {
-                    if (order.getPayType().equals("99")){
+                    if (order.getPayType().equals("99")||order.getPayType().equals("5")){
                         payment.setAppId(config.getAppId());
                     }
                     if (StringUtils.isBlank(payment.getAppId())) {
@@ -1758,10 +1835,10 @@ public class LiveOrderServiceImpl implements ILiveOrderService {
                     if ("wxApp".equals(payment.getPayMode())){
                         payType = "wx";
                     }
-                    MerchantAppConfig merchantAppConfig = merchantAppConfigMapper.selectMerchantAppConfigByAppId(payment.getAppId(),payType);
-                    FsPayConfig fsPayConfig = JSON.parseObject(merchantAppConfig.getDataJson(), FsPayConfig.class);
 
                     if (payment.getPayMode() == null || "wx".equals(payment.getPayMode())) {
+                        MerchantAppConfig merchantAppConfig = merchantAppConfigMapper.selectMerchantAppConfigByAppId(payment.getAppId(),payType);
+                        FsPayConfig fsPayConfig = JSON.parseObject(merchantAppConfig.getDataJson(), FsPayConfig.class);
                         WxPayConfig payConfig = new WxPayConfig();
                         payConfig.setAppId(payment.getAppId());
                         payConfig.setMchId(fsPayConfig.getWxMchId());
@@ -1792,6 +1869,8 @@ public class LiveOrderServiceImpl implements ILiveOrderService {
                             return R.error("退款请求失败" + e.getErrCodeDes());
                         }
                     } else if (payment.getPayMode() != null && "hf".equals(payment.getPayMode())) {
+                        MerchantAppConfig merchantAppConfig = merchantAppConfigMapper.selectMerchantAppConfigByAppId(payment.getAppId(),payType);
+                        FsPayConfig fsPayConfig = JSON.parseObject(merchantAppConfig.getDataJson(), FsPayConfig.class);
                         String huifuId = "";
                         if (payment.getAppId() != null) {
                             if (merchantAppConfig == null){
@@ -1863,6 +1942,14 @@ public class LiveOrderServiceImpl implements ILiveOrderService {
                             throw new CustomException("退款请求失败" + e);
                         }
 
+                    }else if (payment.getPayMode()!=null&&payment.getPayMode().equals("cz")) {
+//                      TODO 储值退款
+                        LiveOrderPayment paymentMap = new LiveOrderPayment();
+                        paymentMap.setPaymentId(payment.getPaymentId());
+                        paymentMap.setStatus(-1);
+                        paymentMap.setRefundTime(DateUtils.getNowDate());
+                        paymentMap.setRefundMoney(payment.getPayMoney());
+                        liveOrderPaymentMapper.updateLiveOrderPayment(paymentMap);
                     } else {
                         TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
                         return R.error("支付类型异常");
@@ -4365,6 +4452,12 @@ public class LiveOrderServiceImpl implements ILiveOrderService {
 //        if (StringUtils.isEmpty(orderKey)) {
 //            return R.error("订单已过期");
 //        }
+        FsUserCompanyUser fsUserCompanyUser = fsUserCompanyUserMapper.selectFsUserCompanyUserByUserId(Long.valueOf(liveOrder.getUserId()));
+        if (ObjectUtil.isNotEmpty(fsUserCompanyUser)){
+            liveOrder.setCompanyId(fsUserCompanyUser.getCompanyId());
+            liveOrder.setCompanyUserId(fsUserCompanyUser.getCompanyUserId());
+        }
+
         if (liveOrder.getLiveId() == null) return R.error("直播ID不能为空");
         if (liveOrder.getProductId() == null) return R.error("购物商品ID不能为空");
         if (liveOrder.getUserName() == null) return R.error("用户名不能为空");
@@ -4451,8 +4544,8 @@ public class LiveOrderServiceImpl implements ILiveOrderService {
 
         LiveUserFirstEntry liveUserFirstEntry = liveUserFirstEntryService.selectEntityByLiveIdUserId(liveOrder.getLiveId(), Long.parseLong(liveOrder.getUserId()));
         if (ObjectUtil.isNotEmpty(liveUserFirstEntry)) {
-            liveOrder.setCompanyId(liveUserFirstEntry.getCompanyId());
-            liveOrder.setCompanyUserId(liveUserFirstEntry.getCompanyUserId());
+//            liveOrder.setCompanyId(liveUserFirstEntry.getCompanyId());
+//            liveOrder.setCompanyUserId(liveUserFirstEntry.getCompanyUserId());
             liveOrder.setTuiUserId(liveUserFirstEntry.getCompanyUserId());
         }
         String orderSn = OrderCodeUtils.getOrderSn();

+ 44 - 0
fs-service/src/main/java/com/fs/live/service/impl/LiveSensitiveWordsServiceImpl.java

@@ -1,6 +1,9 @@
 package com.fs.live.service.impl;
 
 
+import com.fs.common.exception.ServiceException;
+import com.fs.common.utils.DateUtils;
+import com.fs.his.domain.FsInquiryDisease;
 import com.fs.live.domain.LiveSensitiveWords;
 import com.fs.live.mapper.LiveSensitiveWordsMapper;
 import com.fs.live.service.ILiveSensitiveWordsService;
@@ -102,4 +105,45 @@ public class LiveSensitiveWordsServiceImpl implements ILiveSensitiveWordsService
     public List<String> selectAllWords() {
         return baseMapper.selectAllWords();
     }
+
+    @Override
+    public String importData(List<LiveSensitiveWords> list) {
+        if (com.fs.common.utils.StringUtils.isNull(list) || list.size() == 0)
+        {
+            throw new ServiceException("导入数据不能为空!");
+        }
+        int successNum = 0;
+        int failureNum = 0;
+        StringBuilder successMsg = new StringBuilder();
+        StringBuilder failureMsg = new StringBuilder();
+        for (LiveSensitiveWords vo : list)
+        {
+            try
+            {
+                vo.setCreateTime(DateUtils.getNowDate());
+                int i = baseMapper.insertLiveSensitiveWords(vo);
+
+                successNum++;
+                successMsg.append("<br/>" + successNum + "、名称 " + vo.getWord() + " 导入成功");
+
+            }
+            catch (Exception e)
+            {
+
+                failureNum++;
+                String msg = "<br/>" + failureNum + "、名称 " +vo.getWord() + " 导入失败:";
+                failureMsg.append(msg + e.getMessage());
+            }
+        }
+        if (failureNum > 0)
+        {
+            failureMsg.insert(0, "很抱歉,导入失败!共 " + failureNum + " 条数据格式不正确,错误如下:");
+            throw new ServiceException(failureMsg.toString());
+        }
+        else
+        {
+            successMsg.insert(0, "恭喜您,数据已全部导入成功!共 " + successNum + " 条,数据如下:");
+        }
+        return successMsg.toString();
+    }
 }

+ 1 - 1
fs-service/src/main/resources/application-druid-zkzh-test.yml

@@ -30,7 +30,7 @@ spring:
             druid:
                 # 主库数据源
                 master:
-                    url: jdbc:mysql://47.111.26.148:2345/jz_store_v2?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
+                    url: jdbc:mysql://47.111.26.148:2345/jz_store_v2?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&allowMultiQueries=true
                     username: root
                     password: Zkhj951753@#
                 # 从库数据源

+ 8 - 7
fs-service/src/main/resources/application-druid-zkzh.yml

@@ -30,7 +30,7 @@ spring:
             druid:
                 # 主库数据源
                 master:
-                    url: jdbc:mysql://rm-bp1l45210q9m4m83u.mysql.rds.aliyuncs.com:3306/jz_store_v2?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
+                    url: jdbc:mysql://rm-bp1l45210q9m4m83u.mysql.rds.aliyuncs.com:3306/jz_store_v2?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&allowMultiQueries=true
                     username: root
                     password: Zkhj951753@#
                 # 从库数据源
@@ -128,14 +128,15 @@ spring:
                         config:
                             multi-statement-allow: true
 rocketmq:
-    name-server: rmq-16e437k44e.rocketmq.cd.qcloud.tencenttdmq.com:8080 # 替换为实际的
+    name-server: rmq-1243b25nj.rocketmq.gz.public.tencenttdmq.com:8080 # RocketMQ NameServer 地址
     producer:
-        group: conversion-tracking-group
-        access-key: ak16e437k44e83e6c22f3b48 # 替换为实际的 accessKey
-        secret-key: ske995168f7b31620b # 替换为实际的 secretKey
+        group: my-producer-group
+        access-key: ak1243b25nj17d4b2dc1a03 # 替换为实际的 accessKey
+        secret-key: sk08a7ea1f9f4b0237 # 替换为实际的 secretKey
     consumer:
-        access-key: ak16e437k44e83e6c22f3b48 # 替换为实际的 accessKey
-        secret-key: ske995168f7b31620b # 替换为实际的 secretKey
+        group: test-group
+        access-key: ak1243b25nj17d4b2dc1a03 # 替换为实际的 accessKey
+        secret-key: sk08a7ea1f9f4b0237 # 替换为实际的 secretKey
 cloud_host:
     company_name: 中康智慧
 openIM:

+ 6 - 1
fs-service/src/main/resources/mapper/company/CompanyMapper.xml

@@ -42,6 +42,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <result property="groupName"    column="group_name"    />
         <result property="maxPadNum"    column="max_pad_num"    />
         <result property="deptId"   column="dept_id" />
+        <result property="isOpenStoredPay"   column="is_open_stored_pay" />
     </resultMap>
 
     <sql id="selectCompanyVo">
@@ -65,6 +66,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="courseMiniAppId != null "> and course_mini_app_id = #{courseMiniAppId}</if>
             <if test="deptId != null">and dept_id = #{deptId}</if>
             <if test="customMiniAppId != null "> and custom_mini_app_id = #{customMiniAppId}</if>
+            <if test="isOpenStoredPay != null "> and is_open_stored_pay = #{isOpenStoredPay}</if>
         </where>
     </select>
 
@@ -123,6 +125,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="maxPadNum != null">max_pad_num,</if>
             <if test="deptId != null">dept_id,</if>
             <if test="isOpenRestReminder != null">is_open_rest_reminder,</if>
+            <if test="isOpenStoredPay != null">is_open_stored_pay,</if>
         </trim>
         <trim prefix="values (" suffix=")" suffixOverrides=",">
             <if test="companyName != null">#{companyName},</if>
@@ -159,7 +162,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="groupName != null">#{groupName},</if>
             <if test="maxPadNum != null">#{maxPadNum},</if>
             <if test="deptId != null">#{deptId},</if>
-            <if test="isOpenRestReminder != null">is_open_rest_reminder = #{isOpenRestReminder},</if>
+            <if test="isOpenRestReminder != null">#{isOpenRestReminder},</if>
+            <if test="isOpenStoredPay != null">#{isOpenStoredPay},</if>
          </trim>
     </insert>
 
@@ -204,6 +208,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="deptId != null">dept_id = #{deptId},</if>
             <if test="redPackageMoney != null">red_package_money = #{redPackageMoney},</if>
             <if test="isOpenRestReminder != null">is_open_rest_reminder = #{isOpenRestReminder},</if>
+            <if test="isOpenStoredPay != null">is_open_stored_pay = #{isOpenStoredPay},</if>
         </trim>
         where company_id = #{companyId}
     </update>

+ 129 - 0
fs-service/src/main/resources/mapper/company/RechargeRecordMapper.xml

@@ -0,0 +1,129 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.fs.company.mapper.RechargeRecordMapper">
+
+    <resultMap type="RechargeRecord" id="RechargeRecordResult">
+        <result property="id"    column="id"    />
+        <result property="userId"    column="user_id"    />
+        <result property="userName"    column="user_name"    />
+        <result property="totalAmount"    column="total_amount"    />
+        <result property="transactionId"    column="transaction_id"    />
+        <result property="businessType"    column="business_type"    />
+        <result property="orderId" column="order_id"/>
+        <result property="orderNo" column="order_no"/>
+        <result property="companyId"    column="company_id"    />
+        <result property="companyName"    column="company_name"    />
+        <result property="remark"    column="remark"    />
+        <result property="createBy"    column="create_by"    />
+        <result property="createTime"    column="create_time"    />
+        <result property="updateBy"    column="update_by"    />
+        <result property="updateTime"    column="update_time"    />
+        <result property="delFlag"    column="del_flag"    />
+    </resultMap>
+
+    <sql id="selectRechargeRecordVo">
+        select id, user_id, user_name, total_amount, transaction_id, business_type, company_id, company_name, remark, create_by, create_time, update_by, update_time, del_flag from recharge_record
+    </sql>
+
+    <select id="selectRechargeRecordList" parameterType="RechargeRecord" resultMap="RechargeRecordResult">
+        <include refid="selectRechargeRecordVo"/>
+        <where>
+            and del_flag = '0'
+            <if test="userId != null "> and user_id = #{userId}</if>
+            <if test="userName != null  and userName != ''"> and user_name like concat('%', #{userName}, '%')</if>
+            <if test="transactionId != null  and transactionId != ''"> and transaction_id like concat('%', #{transactionId}, '%')</if>
+            <if test="businessType != null"> and business_type = #{businessType}</if>
+            <if test="companyId != null"> and company_id = #{companyId}</if>
+            <if test="companyName != null and companyName != ''"> and company_name like concat('%', #{companyName}, '%')</if>
+        </where>
+        order by create_time desc
+    </select>
+
+    <select id="selectRechargeRecordById" parameterType="Long" resultMap="RechargeRecordResult">
+        <include refid="selectRechargeRecordVo"/>
+        where id = #{id}
+    </select>
+
+    <insert id="insertRechargeRecord" parameterType="RechargeRecord" useGeneratedKeys="true" keyProperty="id">
+        insert into recharge_record
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="userId != null">user_id,</if>
+            <if test="userName != null and userName != ''">user_name,</if>
+            <if test="totalAmount != null">total_amount,</if>
+            <if test="transactionId != null and transactionId != ''">transaction_id,</if>
+            <if test="businessType != null">business_type,</if>
+            <if test="companyId != null">company_id,</if>
+            <if test="companyName != null and companyName != ''">company_name,</if>
+            <if test="remark != null">remark,</if>
+            <if test="createBy != null">create_by,</if>
+            <if test="orderId != null">order_id,</if>
+            <if test="orderNo != null">order_no,</if>
+            create_time
+        </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="userId != null">#{userId},</if>
+            <if test="userName != null and userName != ''">#{userName},</if>
+            <if test="totalAmount != null">#{totalAmount},</if>
+            <if test="transactionId != null and transactionId != ''">#{transactionId},</if>
+            <if test="businessType != null">#{businessType},</if>
+            <if test="companyId != null">#{companyId},</if>
+            <if test="companyName != null and companyName != ''">#{companyName},</if>
+            <if test="remark != null">#{remark},</if>
+            <if test="createBy != null">#{createBy},</if>
+            <if test="orderId != null">#{orderId},</if>
+            <if test="orderNo != null">#{orderNo},</if>
+            sysdate()
+        </trim>
+    </insert>
+
+    <update id="updateRechargeRecord" parameterType="RechargeRecord">
+        update recharge_record
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="userId != null">user_id = #{userId},</if>
+            <if test="userName != null and userName != ''">user_name = #{userName},</if>
+            <if test="totalAmount != null">total_amount = #{totalAmount},</if>
+            <if test="transactionId != null and transactionId != ''">transaction_id = #{transactionId},</if>
+            <if test="businessType != null">business_type = #{businessType},</if>
+            <if test="companyId != null">company_id = #{companyId},</if>
+            <if test="companyName != null and companyName != ''">company_name = #{companyName},</if>
+            <if test="remark != null">remark = #{remark},</if>
+            <if test="updateBy != null">update_by = #{updateBy},</if>
+            <if test="orderId != null">order_id = #{orderId},</if>
+            <if test="orderNo != null">order_no = #{orderNo},</if>
+            update_time = sysdate()
+        </trim>
+        where id = #{id}
+    </update>
+
+    <delete id="deleteRechargeRecordById" parameterType="Long">
+        update recharge_record set del_flag = '1' where id = #{id}
+    </delete>
+
+    <delete id="deleteRechargeRecordByIds" parameterType="String">
+        update recharge_record set del_flag = '1' where id in
+        <foreach item="id" collection="array" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+    </delete>
+
+
+    <select id="selectTodayRechargeAmount" resultType="java.math.BigDecimal">
+        SELECT IFNULL(SUM(total_amount), 0)
+        FROM recharge_record
+        WHERE user_id = #{userId}
+          AND DATE(create_time) = #{date}
+          AND business_type = 0 and del_flag =0
+    </select>
+
+
+    <select id="selectTodayRechargeCount" resultType="java.lang.Integer">
+        SELECT COUNT(*)
+        FROM recharge_record
+        WHERE user_id = #{userId}
+          AND DATE(create_time) = #{date}
+          AND business_type = 0 and del_flag =0
+    </select>
+
+</mapper>

+ 9 - 0
fs-service/src/main/resources/mapper/course/FsUserCompanyUserMapper.xml

@@ -239,4 +239,13 @@
         </where>
     </select>
 
+
+    <select id="selectFsUserCompanyUserByUserId"  resultMap="FsUserCompanyUserResult">
+        SELECT a.*
+        FROM fs_user_company_user a
+                 LEFT JOIN fs_user ON a.user_id = fs_user.user_id
+        WHERE a.user_id = #{userId}
+        ORDER BY a.create_time ASC
+        LIMIT 1
+    </select>
 </mapper>

+ 5 - 1
fs-service/src/main/resources/mapper/his/FsUserMapper.xml

@@ -53,10 +53,11 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <result property="isShow" column="is_show"/>
         <result property="appOpenId"    column="app_open_id"    />
         <result property="appleKey"    column="apple_key"    />
+        <result property="rechargeBalance"    column="recharge_balance"    />
     </resultMap>
 
     <sql id="selectFsUserVo">
-        select user_id,qw_ext_id,sex,is_buy,`level`,course_ma_open_id,is_push,is_add_qw,source,login_device,is_individuation_push,store_open_id,password,jpush_id, is_vip,vip_start_date,vip_end_date,vip_level,vip_status,nick_name,integral_status, avatar, phone, integral,sign_num, status, tui_user_id, tui_time, tui_user_count, ma_open_id, mp_open_id, union_id, is_del, user_code, remark, create_time, update_time, last_ip, balance,is_weixin_auth,parent_id,qw_user_id,app_id,company_id,company_user_id,is_promoter,now_money,brokerage_price,spread_user_id, spread_time,pay_count, spread_count,user_type,invited_by_sales_id,app_open_id,apple_key from fs_user
+        select user_id,qw_ext_id,recharge_balance,sex,is_buy,`level`,course_ma_open_id,is_push,is_add_qw,source,login_device,is_individuation_push,store_open_id,password,jpush_id, is_vip,vip_start_date,vip_end_date,vip_level,vip_status,nick_name,integral_status, avatar, phone, integral,sign_num, status, tui_user_id, tui_time, tui_user_count, ma_open_id, mp_open_id, union_id, is_del, user_code, remark, create_time, update_time, last_ip, balance,is_weixin_auth,parent_id,qw_user_id,app_id,company_id,company_user_id,is_promoter,now_money,brokerage_price,spread_user_id, spread_time,pay_count, spread_count,user_type,invited_by_sales_id,app_open_id,apple_key from fs_user
     </sql>
 
     <select id="selectFsUserList" parameterType="FsUser" resultMap="FsUserResult">
@@ -64,6 +65,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <where>
             <if test="userId != null">and user_id = #{userId}</if>
             <if test="nickName != null  and nickName != ''"> and nick_name like concat( #{nickName}, '%')</if>
+            <if test="nickname != null  and nickname != ''"> and nick_name like concat( #{nickname}, '%')</if>
             <if test="avatar != null  and avatar != ''"> and avatar = #{avatar}</if>
             <if test="phone != null  and phone != ''"> and phone = #{phone}</if>
             <if test="integral != null "> and integral = #{integral}</if>
@@ -95,6 +97,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="registerCode != null   and registerCode != '' ">and register_code = #{registerCode}</if>
             <if test="source != null  and source != '' ">and source = #{source}</if>
             <if test="isShow != null  ">and is_show = #{isShow}</if>
+            <if test="rechargeBalance != null  ">and recharge_balance = #{rechargeBalance}</if>
             <!--<if test="qwRepeat != null  ">and qw_repeat = #{qwRepeat}</if>
             <if test="userRepeat != null  ">and user_repeat = #{userRepeat}</if>-->
 <!--            <if test="payOrder != null  ">and pay_order = #{payOrder}</if>-->
@@ -715,6 +718,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="invitedBySalesId != null">invited_by_sales_id = #{invitedBySalesId},</if>
             <if test="appOpenId != null">app_open_id = #{appOpenId},</if>
             <if test="appleKey != null">apple_key = #{appleKey},</if>
+            <if test="rechargeBalance != null">recharge_balance = #{rechargeBalance},</if>
             <if test="appCreateTime != null">app_create_time = #{appCreateTime},</if>
         </trim>
         where user_id = #{userId}

+ 2 - 1
fs-service/src/main/resources/mapper/hisStore/FsUserScrmMapper.xml

@@ -75,7 +75,7 @@
     </resultMap>
 
     <sql id="selectFsUserVo">
-        select user_id, username, nick_name, avatar, phone, integral, status, `level`, spread_user_id, spread_time, user_type, is_promoter, pay_count, spread_count, addres, tui_user_id, tui_time, tui_user_count, ma_open_id, mp_open_id, union_id, is_del, user_code, remark, nickname, create_time, update_time, last_ip, now_money, brokerage_price, balance, sign_num, integral_status, is_buy, password, real_name, birthday, id_card, jpush_id, is_vip, vip_start_date, vip_end_date, vip_level, vip_status, sex, store_open_id, is_official_account_auth, is_push, is_individuation_push, is_weixin_auth, company_id, company_user_id, register_date, register_code, test, login_device, source, is_add_qw, qw_user_id, is_show, parent_id, course_ma_open_id, history_app, qw_ext_id, `rank`, react,order_count,bind_company_user_id,app_id from fs_user
+        select user_id, username, nick_name, avatar, phone, integral, status, `level`, spread_user_id, spread_time, user_type, is_promoter, pay_count, spread_count, addres, tui_user_id, recharge_balance,tui_time, tui_user_count, ma_open_id, mp_open_id, union_id, is_del, user_code, remark, nickname, create_time, update_time, last_ip, now_money, brokerage_price, balance, sign_num, integral_status, is_buy, password, real_name, birthday, id_card, jpush_id, is_vip, vip_start_date, vip_end_date, vip_level, vip_status, sex, store_open_id, is_official_account_auth, is_push, is_individuation_push, is_weixin_auth, company_id, company_user_id, register_date, register_code, test, login_device, source, is_add_qw, qw_user_id, is_show, parent_id, course_ma_open_id, history_app, qw_ext_id, `rank`, react,order_count,bind_company_user_id,app_id from fs_user
     </sql>
 
     <select id="selectFsUserList" parameterType="FsUserScrm" resultMap="FsUserResult">
@@ -568,6 +568,7 @@
             <if test="spreadUserId != null">spread_user_id = #{spreadUserId},</if>
             <if test="brokeragePrice != null">brokerage_price = #{brokeragePrice},</if>
             <if test="appId != null">app_id = #{appId},</if>
+            <if test="rechargeBalance != null">recharge_balance = #{rechargeBalance},</if>
         </trim>
         where user_id = #{userId}
     </update>

+ 11 - 0
fs-user-app/src/main/java/com/fs/app/controller/app/AppController.java

@@ -71,4 +71,15 @@ public class AppController extends AppBaseController {
         param.setUserId(Long.parseLong(getUserId()));
         return fsStoreOrderScrmService.payment(param, PaymentMethodEnum.WX_APP);
     }
+
+
+    @Login
+    @RepeatSubmit
+    @ApiOperation("储值支付")
+    @PostMapping("/czPayment")
+    public R czPayment(@Validated @RequestBody FsIntegralOrderDoPayParam param) {
+        param.setUserId(Long.parseLong(getUserId()));
+//        param.setUserId(735199L);
+        return fsStoreOrderScrmService.payment(param, PaymentMethodEnum.CZ_PAY);
+    }
 }