Browse Source

feat(store): 新增立减金购买与管理功能- 新增立减金类型(couponType=3)的优惠券支持
- 实现立减金购买接口,支持用户支付购买立减金- 优化优惠券领取逻辑,区分普通优惠券与立减金查询
- 新增 FsStoreCouponPurchaseParam 参数类用于购买请求
- 扩展 FsStoreCouponIssueScrm 实体类,增加公司、销售、门店ID字段
- 更新 Mapper XML 配置,支持立减金相关字段映射- 完善管理员端立减金列表展示与查询逻辑-为订单模块添加立减金相关字段及处理逻辑
- 增加 selectFsStoreCouponIssueListVOForCash 查询方法支持立减金列表
- 调整优惠券用户表结构,支持立减金类型的识别与展示- 更新支付流程,支持立减金购买支付并记录领取信息
-优化立减金发布逻辑,设置默认有效期限与状态
- 修复部分查询条件错误,确保立减金正确筛选
- 添加事务控制与异常处理,保障购买流程一致性与安全性

xw 1 month ago
parent
commit
85b855f5db
29 changed files with 518 additions and 107 deletions
  1. 10 2
      fs-admin/src/main/java/com/fs/hisStore/controller/FsStoreCouponIssueScrmController.java
  2. 26 11
      fs-admin/src/main/java/com/fs/hisStore/controller/FsStoreCouponScrmController.java
  3. 9 2
      fs-admin/src/main/java/com/fs/hisStore/controller/FsStoreCouponUserScrmController.java
  4. 4 4
      fs-service/src/main/java/com/fs/his/service/IFsStorePaymentService.java
  5. 58 27
      fs-service/src/main/java/com/fs/his/service/impl/FsStorePaymentServiceImpl.java
  6. 44 4
      fs-service/src/main/java/com/fs/hisStore/domain/FsStoreCouponIssueScrm.java
  7. 15 2
      fs-service/src/main/java/com/fs/hisStore/domain/FsStoreCouponUserScrm.java
  8. 9 3
      fs-service/src/main/java/com/fs/hisStore/domain/FsStoreOrderScrm.java
  9. 23 4
      fs-service/src/main/java/com/fs/hisStore/mapper/FsStoreCouponIssueScrmMapper.java
  10. 1 1
      fs-service/src/main/java/com/fs/hisStore/mapper/FsStoreCouponIssueUserScrmMapper.java
  11. 18 3
      fs-service/src/main/java/com/fs/hisStore/mapper/FsStoreCouponUserScrmMapper.java
  12. 1 0
      fs-service/src/main/java/com/fs/hisStore/param/FsStoreCouponPublishParam.java
  13. 12 0
      fs-service/src/main/java/com/fs/hisStore/param/FsStoreCouponPurchaseParam.java
  14. 2 0
      fs-service/src/main/java/com/fs/hisStore/param/FsStoreOrderComputedParam.java
  15. 4 1
      fs-service/src/main/java/com/fs/hisStore/param/FsStoreOrderCreateParam.java
  16. 2 0
      fs-service/src/main/java/com/fs/hisStore/param/FsStoreOrderCreateUserParam.java
  17. 10 0
      fs-service/src/main/java/com/fs/hisStore/param/FsStorePaymentPayParam.java
  18. 8 3
      fs-service/src/main/java/com/fs/hisStore/service/IFsStoreCouponIssueScrmService.java
  19. 5 1
      fs-service/src/main/java/com/fs/hisStore/service/IFsStoreCouponUserScrmService.java
  20. 99 6
      fs-service/src/main/java/com/fs/hisStore/service/impl/FsStoreCouponIssueScrmServiceImpl.java
  21. 10 4
      fs-service/src/main/java/com/fs/hisStore/service/impl/FsStoreCouponUserScrmServiceImpl.java
  22. 100 18
      fs-service/src/main/java/com/fs/hisStore/service/impl/FsStoreOrderScrmServiceImpl.java
  23. 1 1
      fs-service/src/main/java/com/fs/hisStore/vo/FsStoreCouponIssueVO.java
  24. 4 0
      fs-service/src/main/java/com/fs/hisStore/vo/FsStoreCouponUserVO.java
  25. 4 1
      fs-service/src/main/resources/mapper/hisStore/FsStoreCouponIssueScrmMapper.xml
  26. 1 1
      fs-service/src/main/resources/mapper/hisStore/FsStoreCouponUserScrmMapper.xml
  27. 9 2
      fs-service/src/main/resources/mapper/hisStore/FsStoreOrderScrmMapper.xml
  28. 16 5
      fs-user-app/src/main/java/com/fs/app/controller/store/CouponScrmController.java
  29. 13 1
      fs-user-app/src/main/java/com/fs/app/controller/store/StoreOrderScrmController.java

+ 10 - 2
fs-admin/src/main/java/com/fs/hisStore/controller/FsStoreCouponIssueScrmController.java

@@ -29,14 +29,22 @@ public class FsStoreCouponIssueScrmController extends BaseController
     private IFsStoreCouponIssueScrmService fsStoreCouponIssueService;
 
     /**
-     * 查询优惠券领取列表
+     * 查询优惠券/立减金领取列表
+     * 通过 couponType 参数区分:
+     * - couponType=3: 查询立减金
+     * - couponType≠3: 查询优惠券
      */
     @PreAuthorize("@ss.hasPermi('store:storeCouponIssue:list')")
     @GetMapping("/list")
     public TableDataInfo list(FsStoreCouponIssueScrm fsStoreCouponIssue)
     {
         startPage();
-        List<FsStoreCouponIssueVO> list = fsStoreCouponIssueService.selectFsStoreCouponIssueListVO(fsStoreCouponIssue);
+        List<FsStoreCouponIssueVO> list;
+        if (fsStoreCouponIssue.getCouponType() != null && fsStoreCouponIssue.getCouponType() == 3) {
+            list = fsStoreCouponIssueService.selectFsStoreCouponIssueListVOForCash(fsStoreCouponIssue);
+        } else {
+            list = fsStoreCouponIssueService.selectFsStoreCouponIssueListVO(fsStoreCouponIssue);
+        }
         return getDataTable(list);
     }
 

+ 26 - 11
fs-admin/src/main/java/com/fs/hisStore/controller/FsStoreCouponScrmController.java

@@ -108,17 +108,32 @@ public class FsStoreCouponScrmController extends BaseController
     {
         FsStoreCouponScrm coupon=fsStoreCouponService.selectFsStoreCouponById(publishParam.getCouponId());
         FsStoreCouponIssueScrm issue=new FsStoreCouponIssueScrm();
-        issue.setCouponId(publishParam.getCouponId());
-        issue.setCouponName(coupon.getTitle());
-        issue.setCouponType(coupon.getType());
-        issue.setStartTime(publishParam.getStartTime());
-        issue.setLimitTime(publishParam.getLimitTime());
-        issue.setTotalCount(publishParam.getTotalCount());
-        issue.setRemainCount(0);
-        issue.setIsPermanent(0);
-        issue.setStatus(1);
-        issue.setCreateTime(new Date());
-        return toAjax( fsStoreCouponIssueService.insertFsStoreCouponIssue(issue));
+        if (coupon.getType() ==3){
+            issue.setCouponId(publishParam.getCouponId());
+            issue.setCouponName(coupon.getTitle());
+            issue.setCouponType(coupon.getType());
+            issue.setStartTime(new Date());
+            issue.setLimitTime(null);
+            issue.setTotalCount(publishParam.getTotalCount());
+            issue.setRemainCount(publishParam.getTotalCount());
+            issue.setIsPermanent(1);
+            issue.setStatus(1);
+            issue.setCreateTime(new Date());
+            return toAjax(fsStoreCouponIssueService.insertFsStoreCouponIssue(issue));
+        }
+        else {
+            issue.setCouponId(publishParam.getCouponId());
+            issue.setCouponName(coupon.getTitle());
+            issue.setCouponType(coupon.getType());
+            issue.setStartTime(publishParam.getStartTime());
+            issue.setLimitTime(publishParam.getLimitTime());
+            issue.setTotalCount(publishParam.getTotalCount());
+            issue.setRemainCount(0);
+            issue.setIsPermanent(0);
+            issue.setStatus(1);
+            issue.setCreateTime(new Date());
+            return toAjax(fsStoreCouponIssueService.insertFsStoreCouponIssue(issue));
+        }
     }
 
     @PreAuthorize("@ss.hasPermi('store:storeCoupon:batchPublish')")

+ 9 - 2
fs-admin/src/main/java/com/fs/hisStore/controller/FsStoreCouponUserScrmController.java

@@ -37,7 +37,14 @@ public class FsStoreCouponUserScrmController extends BaseController
     public TableDataInfo list(FsStoreCouponUserScrm fsStoreCouponUser)
     {
         startPage();
-        List<FsStoreCouponUserVO> list = fsStoreCouponUserService.selectFsStoreCouponUserListVO(fsStoreCouponUser);
+        // 设置couponType到查询对象中
+        fsStoreCouponUser.setCouponType(fsStoreCouponUser.getCouponType());
+        List<FsStoreCouponUserVO> list;
+        if (fsStoreCouponUser.getCouponType() != null && fsStoreCouponUser.getCouponType() == 3) {
+            list = fsStoreCouponUserService.selectFsStoreCouponUserListVOForCash(fsStoreCouponUser);
+        } else {
+            list = fsStoreCouponUserService.selectFsStoreCouponUserListVO(fsStoreCouponUser);
+        }
         for (FsStoreCouponUserVO  vo : list){
             vo.setPhone(ParseUtils.parsePhone(vo.getPhone()));
         }
@@ -99,4 +106,4 @@ public class FsStoreCouponUserScrmController extends BaseController
     {
         return toAjax(fsStoreCouponUserService.deleteFsStoreCouponUserByIds(ids));
     }
-}
+}

+ 4 - 4
fs-service/src/main/java/com/fs/his/service/IFsStorePaymentService.java

@@ -1,8 +1,5 @@
 package com.fs.his.service;
 
-import java.util.List;
-import java.util.Map;
-
 import com.alibaba.fastjson.JSONObject;
 import com.fs.common.core.domain.R;
 import com.fs.company.param.FsStoreStatisticsParam;
@@ -15,9 +12,10 @@ import com.fs.his.vo.FsStorePaymentExcelVO;
 import com.fs.his.vo.FsStorePaymentVO;
 import com.fs.hisStore.param.FsStorePaymentGetWxaCodeParam;
 import com.fs.hisStore.param.FsStorePaymentPayParam;
-import me.chanjar.weixin.common.error.WxErrorException;
 
 import javax.servlet.http.HttpServletRequest;
+import java.util.List;
+import java.util.Map;
 
 /**
  * 支付明细Service接口
@@ -120,4 +118,6 @@ public interface IFsStorePaymentService
     R paymentByWxaCode(FsStorePaymentPayParam payment);
 
     R getWxaCodeByPayment(FsStorePaymentGetWxaCodeParam param);
+
+    R payment(FsStorePaymentPayParam payParam);
 }

+ 58 - 27
fs-service/src/main/java/com/fs/his/service/impl/FsStorePaymentServiceImpl.java

@@ -1,10 +1,5 @@
 package com.fs.his.service.impl;
 
-import java.lang.reflect.Field;
-import java.math.BigDecimal;
-import java.text.SimpleDateFormat;
-import java.util.*;
-
 import cn.binarywang.wx.miniapp.api.WxMaService;
 import cn.hutool.core.util.IdUtil;
 import cn.hutool.json.JSONUtil;
@@ -13,15 +8,12 @@ import com.alibaba.fastjson.TypeReference;
 import com.baomidou.mybatisplus.core.conditions.Wrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.fs.common.annotation.DataScope;
-import com.fs.common.annotation.Log;
-import com.fs.common.core.domain.AjaxResult;
 import com.fs.common.core.domain.R;
 import com.fs.common.exception.CustomException;
 import com.fs.common.utils.DateUtils;
 import com.fs.common.utils.ServletUtils;
 import com.fs.common.utils.StringUtils;
 import com.fs.common.utils.ip.IpUtils;
-import com.fs.common.utils.poi.ExcelUtil;
 import com.fs.company.domain.Company;
 import com.fs.company.domain.CompanyUser;
 import com.fs.company.mapper.CompanyConfigMapper;
@@ -33,22 +25,19 @@ import com.fs.config.cloud.CloudHostProper;
 import com.fs.core.config.WxMaConfiguration;
 import com.fs.core.config.WxPayProperties;
 import com.fs.core.utils.OrderCodeUtils;
-import com.fs.course.config.CourseConfig;
 import com.fs.course.config.RedPacketConfig;
-import com.fs.course.domain.FsCourseRedPacketLog;
-import com.fs.course.mapper.FsCourseRedPacketLogMapper;
 import com.fs.course.service.IFsCourseRedPacketLogService;
 import com.fs.course.service.IFsUserCourseOrderService;
 import com.fs.course.service.IFsUserVipOrderService;
-import com.fs.erp.dto.ErpRefundUpdateRequest;
-import com.fs.his.domain.*;
-import com.fs.his.dto.PayConfigDTO;
+import com.fs.his.domain.FsPayConfig;
+import com.fs.his.domain.FsStorePayment;
+import com.fs.his.domain.FsUser;
+import com.fs.his.domain.FsUserWx;
 import com.fs.his.enums.PaymentMethodEnum;
 import com.fs.his.mapper.FsExportTaskMapper;
 import com.fs.his.mapper.FsStorePaymentMapper;
 import com.fs.his.mapper.FsUserMapper;
 import com.fs.his.mapper.FsUserWxMapper;
-import com.fs.his.param.FsStoreOrderParam;
 import com.fs.his.param.FsStorePaymentParam;
 import com.fs.his.param.PayOrderParam;
 import com.fs.his.param.WxSendRedPacketParam;
@@ -59,6 +48,8 @@ import com.fs.his.service.IFsStorePaymentService;
 import com.fs.his.utils.PhoneUtil;
 import com.fs.his.vo.FsStorePaymentExcelVO;
 import com.fs.his.vo.FsStorePaymentVO;
+import com.fs.hisStore.domain.FsStorePaymentScrm;
+import com.fs.hisStore.mapper.FsStorePaymentScrmMapper;
 import com.fs.hisStore.param.FsStorePaymentGetWxaCodeParam;
 import com.fs.hisStore.param.FsStorePaymentPayParam;
 import com.fs.huifuPay.domain.HuiFuCreateOrder;
@@ -74,7 +65,6 @@ import com.fs.system.oss.CloudStorageService;
 import com.fs.system.oss.OSSFactory;
 import com.fs.system.service.ISysConfigService;
 import com.fs.tzBankPay.TzBankService.TzBankService;
-import com.fs.tzBankPay.TzBankService.TzBankServiceImpl.TzBankServiceImpl;
 import com.fs.tzBankPay.doman.*;
 import com.fs.ybPay.domain.CreateWxOrderResult;
 import com.fs.ybPay.domain.OrderResult;
@@ -82,42 +72,35 @@ import com.fs.ybPay.dto.OrderQueryDTO;
 import com.fs.ybPay.dto.RefundDTO;
 import com.fs.ybPay.dto.WxJspayDTO;
 import com.fs.ybPay.service.IPayService;
-import com.github.binarywang.wxpay.bean.merchanttransfer.TransferCreateRequest;
-import com.github.binarywang.wxpay.bean.merchanttransfer.TransferCreateResult;
 import com.github.binarywang.wxpay.bean.notify.SignatureHeader;
 import com.github.binarywang.wxpay.bean.notify.WxPayNotifyResponse;
 import com.github.binarywang.wxpay.bean.notify.WxPayTransferBatchesNotifyV3Result;
 import com.github.binarywang.wxpay.bean.order.WxPayMpOrderResult;
 import com.github.binarywang.wxpay.bean.request.WxPayRefundRequest;
-import com.github.binarywang.wxpay.bean.request.WxPaySendRedpackRequest;
 import com.github.binarywang.wxpay.bean.request.WxPayUnifiedOrderRequest;
 import com.github.binarywang.wxpay.bean.result.WxPayRefundQueryResult;
 import com.github.binarywang.wxpay.bean.result.WxPayRefundResult;
 import com.github.binarywang.wxpay.bean.transfer.*;
 import com.github.binarywang.wxpay.config.WxPayConfig;
 import com.github.binarywang.wxpay.exception.WxPayException;
-import com.github.binarywang.wxpay.service.MerchantTransferService;
-import com.github.binarywang.wxpay.service.RedpackService;
 import com.github.binarywang.wxpay.service.TransferService;
 import com.github.binarywang.wxpay.service.WxPayService;
-import com.github.binarywang.wxpay.service.impl.RedpackServiceImpl;
 import com.github.binarywang.wxpay.service.impl.WxPayServiceImpl;
 import com.google.gson.Gson;
 import com.hc.openapi.tool.fastjson.JSON;
-import com.wechat.pay.java.service.transferbatch.TransferBatchService;
-import com.wechat.pay.java.service.transferbatch.model.InitiateBatchTransferRequest;
-import me.chanjar.weixin.common.bean.WxJsapiSignature;
 import me.chanjar.weixin.common.error.WxErrorException;
-import me.chanjar.weixin.mp.api.WxMpService;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.scheduling.annotation.Async;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import javax.servlet.http.HttpServletRequest;
+import java.lang.reflect.Field;
+import java.math.BigDecimal;
+import java.text.SimpleDateFormat;
+import java.util.*;
 
 /**
  * 支付明细Service业务层处理
@@ -171,6 +154,8 @@ public class FsStorePaymentServiceImpl implements IFsStorePaymentService {
 
     @Autowired
     private CloudHostProper cloudHostProper;
+    @Autowired
+    private FsStorePaymentScrmMapper fsStorePaymentScrmMapper;
 
     /**
      * 查询支付明细
@@ -1214,6 +1199,52 @@ public class FsStorePaymentServiceImpl implements IFsStorePaymentService {
         }
     }
 
+    @Override
+    public R payment(FsStorePaymentPayParam payParam) {
+        FsUser user = userMapper.selectFsUserById(payParam.getUserId());
+        if (user==null){
+            return R.error("用户不存在!");
+        }
+        //判断用户是否绑定了微信
+        if (StringUtils.isBlank(user.getMaOpenId())){
+            return R.error("用户未绑定微信!");
+        }
+        payParam.setCompanyId(302L);
+        Company company = companyService.selectCompanyById(payParam.getCompanyId());
+        if (company==null || company.getStatus()==0){
+            return R.error("服务商不存在,或已被停用!");
+        }
+        if(payParam.getPayMoney().compareTo(new BigDecimal(0.0))<1){
+            return R.error("支付金额必须大于0");
+        }
+        payParam.setCompanyUserId(9590L);
+        if (payParam.getCompanyUserId()!=null){
+            CompanyUser companyUser = companyUserService.selectCompanyUserById(payParam.getCompanyUserId());
+            if(companyUser == null || companyUser.getStatus().equals("1")){
+                return R.error("注册失败客服已停用,或不存在!");
+            }
+        }
+        FsStorePaymentScrm storePayment=new FsStorePaymentScrm();
+        storePayment.setCompanyId(payParam.getCompanyId());
+
+        if (payParam.getCompanyUserId()!=null){
+            storePayment.setCompanyUserId(payParam.getCompanyUserId());
+        }
+        storePayment.setStatus(0);
+        storePayment.setPayCode(IdUtil.getSnowflake(0, 0).nextIdStr());
+        storePayment.setPayMoney(payParam.getPayMoney());
+        storePayment.setCreateTime(new Date());
+        storePayment.setPayTypeCode("weixin");
+        storePayment.setBusinessType(3);
+        storePayment.setRemark("购买立减金");
+        storePayment.setOpenId(user.getMaOpenId());
+        storePayment.setUserId(user.getUserId());
+        //支付订单创建失败
+        if (fsStorePaymentScrmMapper.insertFsStorePayment(storePayment) <= 0) {
+            throw new CustomException("支付订单创建失败");
+        }
+        return R.ok();
+    }
 
 
     @Override

+ 44 - 4
fs-service/src/main/java/com/fs/hisStore/domain/FsStoreCouponIssueScrm.java

@@ -1,11 +1,12 @@
 package com.fs.hisStore.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 java.math.BigDecimal;
+import java.util.Date;
+
 /**
  * 优惠券领取对象 fs_store_coupon_issue
  *
@@ -27,7 +28,7 @@ public class FsStoreCouponIssueScrm extends BaseEntity
     private Long couponId;
 
     /** 优惠券类型 0-通用 1-商品券 */
-    @Excel(name = "优惠券类型 0-通用 1-商品券")
+    @Excel(name = "优惠券类型 0-通用 1-商品券 2-制单卷 3-立减金")
     private Integer couponType;
 
     /** 优惠券领取开启时间 */
@@ -62,6 +63,21 @@ public class FsStoreCouponIssueScrm extends BaseEntity
 
     private BigDecimal couponPrice;
 
+    /**
+     * 公司ID
+     */
+    private Long companyId;
+
+    /**
+     * 销售ID
+     */
+    private Long companyUserId;
+
+    /**
+     * 门店ID
+     */
+    private Long storeId;
+
     public BigDecimal getCouponPrice() {
         return couponPrice;
     }
@@ -70,6 +86,30 @@ public class FsStoreCouponIssueScrm extends BaseEntity
         this.couponPrice = couponPrice;
     }
 
+    public Long getCompanyId() {
+        return companyId;
+    }
+
+    public void setCompanyId(Long companyId) {
+        this.companyId = companyId;
+    }
+
+    public Long getCompanyUserId() {
+        return companyUserId;
+    }
+
+    public void setCompanyUserId(Long companyUserId) {
+        this.companyUserId = companyUserId;
+    }
+
+    public Long getStoreId() {
+        return storeId;
+    }
+
+    public void setStoreId(Long storeId) {
+        this.storeId = storeId;
+    }
+
     public void setId(Long id)
     {
         this.id = id;
@@ -171,4 +211,4 @@ public class FsStoreCouponIssueScrm extends BaseEntity
     public void setLimitTime(Date limitTime) {
         this.limitTime = limitTime;
     }
-}
+}

+ 15 - 2
fs-service/src/main/java/com/fs/hisStore/domain/FsStoreCouponUserScrm.java

@@ -1,11 +1,12 @@
 package com.fs.hisStore.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 java.math.BigDecimal;
+import java.util.Date;
+
 /**
  * 优惠券发放记录对象 fs_store_coupon_user
  * 
@@ -35,6 +36,10 @@ public class FsStoreCouponUserScrm extends BaseEntity
     @Excel(name = "优惠券的面值")
     private BigDecimal couponPrice;
 
+    /** 优惠券类型 */
+    @Excel(name = "优惠券类型" ,readConverterExp = "0=通用,1=商品券,2=制单卷,3=立减金")
+    private Integer couponType;
+
     /** 最低消费多少金额可用优惠券 */
     @Excel(name = "最低消费多少金额可用优惠券")
     private BigDecimal useMinPrice;
@@ -65,6 +70,14 @@ public class FsStoreCouponUserScrm extends BaseEntity
     @Excel(name = "是否有效")
     private Integer isDel;
 
+    public Integer getCouponType() {
+        return couponType;
+    }
+
+    public void setCouponType(Integer couponType) {
+        this.couponType = couponType;
+    }
+
     public void setId(Long id) 
     {
         this.id = id;

+ 9 - 3
fs-service/src/main/java/com/fs/hisStore/domain/FsStoreOrderScrm.java

@@ -1,14 +1,14 @@
 package com.fs.hisStore.domain;
 
-import java.math.BigDecimal;
-import java.util.Date;
-
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.fasterxml.jackson.annotation.JsonFormat;
 import com.fs.common.annotation.Excel;
 import com.fs.common.core.domain.BaseEntity;
 import lombok.Data;
 
+import java.math.BigDecimal;
+import java.util.Date;
+
 /**
  * 订单对象 fs_store_order
  *
@@ -88,6 +88,12 @@ public class FsStoreOrderScrm extends BaseEntity
     /** 优惠券金额 */
     private BigDecimal couponPrice;
 
+    /** 立减金优惠券id */
+    private Long deductionCouponId;
+
+    /** 立减金金额 */
+    private BigDecimal deductionCouponPrice;
+
     /** 支付状态 */
     @Excel(name = "支付状态 1已支付 0未支付 2支付中")
     private Integer paid;

+ 23 - 4
fs-service/src/main/java/com/fs/hisStore/mapper/FsStoreCouponIssueScrmMapper.java

@@ -1,13 +1,15 @@
 package com.fs.hisStore.mapper;
 
-import java.util.List;
 import com.fs.hisStore.domain.FsStoreCouponIssueScrm;
 import com.fs.hisStore.param.FsCouponIssueParam;
 import com.fs.hisStore.vo.FsStoreCouponIssueVO;
+import org.apache.ibatis.annotations.Insert;
 import org.apache.ibatis.annotations.Param;
 import org.apache.ibatis.annotations.Select;
 import org.apache.ibatis.annotations.Update;
 
+import java.util.List;
+
 /**
  * 优惠券领取Mapper接口
  *
@@ -85,12 +87,12 @@ public interface FsStoreCouponIssueScrmMapper
     void updateFsStoreCouponIssueCount(Long id);
     @Select({"<script> " +
             "select i.*,c.coupon_price,c.use_min_price,c.coupon_time   from fs_store_coupon_issue_scrm i left join fs_store_coupon_scrm c on c.coupon_id=i.coupon_id  " +
-            "where i.limit_time &gt; now() and i.is_del=0 and i.status=1   " +
+            "where i.limit_time &gt; now() and i.is_del=0 and i.status=1  and i.coupon_type= !3  " +
             "<if test = 'maps.cateId != null and maps.cateId!=0     '> " +
             "and find_in_set(#{maps.cateId},c.package_cate_ids) " +
             "</if>" +
             "<if test = 'maps.couponType != null     '> " +
-            "and i.coupon_type= #{maps.couponType} " +
+            "and i.coupon_type in (0,1,2) " +
             "</if>" +
             "<if test = 'maps.couponPrice != null     '> " +
             "and c.coupon_price =  #{maps.couponPrice} " +
@@ -105,7 +107,7 @@ public interface FsStoreCouponIssueScrmMapper
     FsStoreCouponIssueVO selectFsStoreCouponIssueVOById(Long id);
     @Select({"<script> " +
             "select i.*,c.coupon_price,c.use_min_price,c.coupon_time  from fs_store_coupon_issue_scrm i left join fs_store_coupon_scrm c on c.coupon_id=i.coupon_id  " +
-            "where i.limit_time &gt; now() " +
+            "where i.coupon_type !=3 and i.limit_time &gt; now() " +
             "<if test = 'maps.isDel != null     '> " +
             "and i.is_del =#{maps.isDel} " +
             "</if>" +
@@ -130,4 +132,21 @@ public interface FsStoreCouponIssueScrmMapper
             " order by c.coupon_price "+
             "</script>"})
     List<FsStoreCouponIssueVO> selectFsStoreCouponIssueListVO(@Param("maps") FsStoreCouponIssueScrm fsStoreCouponIssue);
+    /**
+     * 查询代金券领取列表
+     * @param fsStoreCouponIssue
+     * @return
+     */
+    @Select({"<script> " +
+            "select i.*,c.coupon_price,c.use_min_price,c.coupon_time  from fs_store_coupon_issue_scrm i left join fs_store_coupon_scrm c on c.coupon_id=i.coupon_id  " +
+            "where i.coupon_type =3 " +
+            "<if test = 'maps.isDel != null     '> " +
+            "and i.is_del =#{maps.isDel} " +
+            "</if>" +
+            "<if test = 'maps.status != null     '> " +
+            "and i.status =#{maps.status} " +
+            "</if>" +
+            " order by c.coupon_price "+
+            "</script>"})
+    List<FsStoreCouponIssueVO> selectFsStoreCouponIssueListVOForCash(@Param("maps") FsStoreCouponIssueScrm fsStoreCouponIssue);
 }

+ 1 - 1
fs-service/src/main/java/com/fs/hisStore/mapper/FsStoreCouponIssueUserScrmMapper.java

@@ -62,4 +62,4 @@ public interface FsStoreCouponIssueUserScrmMapper
     public int deleteFsStoreCouponIssueUserByIds(Long[] ids);
     @Select("select ifnull(count(1),0) from fs_store_coupon_issue_user_scrm where user_id=#{userId} and issue_id=#{id} ")
     int checkReceive(@Param("userId") String userId,@Param("id") Long id);
-}
+}

+ 18 - 3
fs-service/src/main/java/com/fs/hisStore/mapper/FsStoreCouponUserScrmMapper.java

@@ -1,6 +1,5 @@
 package com.fs.hisStore.mapper;
 
-import java.util.List;
 import com.fs.hisStore.domain.FsStoreCouponUserScrm;
 import com.fs.hisStore.param.FsCouponUserEnableParam;
 import com.fs.hisStore.vo.FsStoreCouponUserVO;
@@ -8,6 +7,8 @@ import org.apache.ibatis.annotations.Param;
 import org.apache.ibatis.annotations.Select;
 import org.apache.ibatis.annotations.Update;
 
+import java.util.List;
+
 /**
  * 优惠券发放记录Mapper接口
  *
@@ -67,7 +68,7 @@ public interface FsStoreCouponUserScrmMapper
     @Update("update fs_store_coupon_user_scrm set status=2 where status=0 and limit_time<now() ")
     int updateFsCouponByExpire();
     @Select({"<script> " +
-            "select cu.* from fs_store_coupon_user_scrm cu inner join fs_store_coupon_scrm c on c.coupon_id=cu.coupon_id  " +
+            "select cu.* from fs_store_coupon_user_scrm cu inner join fs_store_coupon_scrm c on c.coupon_id=cu.coupon_id  LEFT JOIN fs_store_coupon_issue_scrm i ON i.coupon_id = cu.coupon_id  " +
             "where cu.status=0 and cu.is_del=0 " +
             "<if test = 'maps.userId != null     '> " +
             "and cu.user_id =#{maps.userId} " +
@@ -79,7 +80,7 @@ public interface FsStoreCouponUserScrmMapper
             "and cu.use_min_price &lt; #{maps.useMinPrice} " +
             "</if>" +
             "<if test = 'maps.couponType != null     '> " +
-            "and c.type = #{maps.couponType} " +
+            "and i.coupon_type = 3 " +
             "</if>" +
             "</script>"})
     List<FsStoreCouponUserScrm> selectFsStoreCouponUserListByEnable(@Param("maps")FsCouponUserEnableParam param);
@@ -101,4 +102,18 @@ public interface FsStoreCouponUserScrmMapper
             "order by cu.id desc " +
             "</script>"})
     List<FsStoreCouponUserVO> selectFsStoreCouponUserListVO(@Param("maps") FsStoreCouponUserScrm fsStoreCouponUser);
+    @Select({"<script> " +
+            "select cu.*,u.nickname,u.phone from fs_store_coupon_user_scrm cu inner join fs_user u  on u.user_id=cu.user_id inner join fs_store_coupon_scrm c on c.coupon_id = cu.coupon_id   " +
+            "where  cu.is_del=0 and c.type=3 " +
+            "<if test = 'maps.status != null     '> " +
+            "and cu.status =#{maps.status} " +
+            "</if>" +
+            "<if test = 'maps.isDel != null     '> " +
+            "and cu.is_del =#{maps.isDel} " +
+            "</if>" +
+            "</script>"})
+    List<FsStoreCouponUserVO> selectFsStoreCouponUserListVOForCash(@Param("maps")FsStoreCouponUserScrm fsStoreCouponUser);
+
+
+
 }

+ 1 - 0
fs-service/src/main/java/com/fs/hisStore/param/FsStoreCouponPublishParam.java

@@ -22,5 +22,6 @@ public class FsStoreCouponPublishParam implements Serializable
 
     private String ids;
 
+    private Integer couponType;
 
 }

+ 12 - 0
fs-service/src/main/java/com/fs/hisStore/param/FsStoreCouponPurchaseParam.java

@@ -0,0 +1,12 @@
+package com.fs.hisStore.param;
+
+import lombok.Data;
+import lombok.extern.slf4j.Slf4j;
+
+@Slf4j
+@Data
+public class FsStoreCouponPurchaseParam {
+
+    private Long id;
+    private String code;
+}

+ 2 - 0
fs-service/src/main/java/com/fs/hisStore/param/FsStoreOrderComputedParam.java

@@ -18,6 +18,8 @@ public class FsStoreOrderComputedParam implements Serializable
     private Integer useIntegral;
     @ApiModelProperty(value = "优惠券")
     private Long couponUserId;
+    @ApiModelProperty(value = "立减金优惠券用户ID")
+    private Long deductionCouponUserId;
 
     private String createOrderKey;
 

+ 4 - 1
fs-service/src/main/java/com/fs/hisStore/param/FsStoreOrderCreateParam.java

@@ -41,6 +41,9 @@ public class FsStoreOrderCreateParam implements Serializable
     @ApiModelProperty(value = "优惠券")
     private Long couponUserId;
 
+    @ApiModelProperty(value = "立减金")
+    private Long deductionCouponUserId;
+
     private Long tuiUserId;
 
     private String createOrderKey;
@@ -56,4 +59,4 @@ public class FsStoreOrderCreateParam implements Serializable
     private Integer orderMedium; //媒体来源
 
     private Boolean isUserApp = true;
-}
+}

+ 2 - 0
fs-service/src/main/java/com/fs/hisStore/param/FsStoreOrderCreateUserParam.java

@@ -32,4 +32,6 @@ public class FsStoreOrderCreateUserParam implements Serializable
     private BigDecimal amount; //货到付款代收金额
     private Integer orderType; //订单类型
     private Integer orderMedium; //媒体来源
+    private Long couponUserId; //优惠券ID
+    private Long deductionCouponUserId; //立减金优惠券用户ID
 }

+ 10 - 0
fs-service/src/main/java/com/fs/hisStore/param/FsStorePaymentPayParam.java

@@ -20,4 +20,14 @@ public class FsStorePaymentPayParam implements Serializable
     private Long companyUserId;
 
     private String code;
+
+
+    // 业务类型
+    private Integer businessType;
+
+    // 立减金id
+    private Long couponId;
+
+    // 立减金金额
+    private BigDecimal couponPrice;
 }

+ 8 - 3
fs-service/src/main/java/com/fs/hisStore/service/IFsStoreCouponIssueScrmService.java

@@ -1,13 +1,14 @@
 package com.fs.hisStore.service;
 
-import java.util.List;
-
 import com.fs.common.core.domain.R;
 import com.fs.hisStore.domain.FsStoreCouponIssueScrm;
 import com.fs.hisStore.param.FsCouponIssueParam;
+import com.fs.hisStore.param.FsStoreCouponPurchaseParam;
 import com.fs.hisStore.param.FsStoreCouponReceiveParam;
 import com.fs.hisStore.vo.FsStoreCouponIssueVO;
 
+import java.util.List;
+
 /**
  * 优惠券领取Service接口
  * 
@@ -73,4 +74,8 @@ public interface IFsStoreCouponIssueScrmService
     FsStoreCouponIssueVO selectFsStoreCouponIssueVOById(Long id);
 
     List<FsStoreCouponIssueVO> selectFsStoreCouponIssueListVO(FsStoreCouponIssueScrm fsStoreCouponIssue);
-}
+
+    List<FsStoreCouponIssueVO> selectFsStoreCouponIssueListVOForCash(FsStoreCouponIssueScrm fsStoreCouponIssue);
+
+    R purchaseCashCoupon(String userId, FsStoreCouponPurchaseParam param);
+}

+ 5 - 1
fs-service/src/main/java/com/fs/hisStore/service/IFsStoreCouponUserScrmService.java

@@ -1,10 +1,11 @@
 package com.fs.hisStore.service;
 
-import java.util.List;
 import com.fs.hisStore.domain.FsStoreCouponUserScrm;
 import com.fs.hisStore.param.FsCouponUserEnableParam;
 import com.fs.hisStore.vo.FsStoreCouponUserVO;
 
+import java.util.List;
+
 /**
  * 优惠券发放记录Service接口
  * 
@@ -66,4 +67,7 @@ public interface IFsStoreCouponUserScrmService
     List<FsStoreCouponUserScrm> selectFsStoreCouponUserListByEnable(FsCouponUserEnableParam param);
 
     List<FsStoreCouponUserVO> selectFsStoreCouponUserListVO(FsStoreCouponUserScrm fsStoreCouponUser);
+
+    List<FsStoreCouponUserVO> selectFsStoreCouponUserListVOForCash(FsStoreCouponUserScrm fsStoreCouponUser);
+
 }

+ 99 - 6
fs-service/src/main/java/com/fs/hisStore/service/impl/FsStoreCouponIssueScrmServiceImpl.java

@@ -1,29 +1,35 @@
 package com.fs.hisStore.service.impl;
 
-import java.util.Calendar;
-import java.util.Date;
-import java.util.List;
-
 import com.fs.common.core.domain.R;
 import com.fs.common.core.redis.RedisCache;
+import com.fs.common.exception.CustomException;
 import com.fs.common.utils.DateUtils;
+import com.fs.his.service.IFsStorePaymentService;
 import com.fs.hisStore.domain.*;
 import com.fs.hisStore.mapper.*;
 import com.fs.hisStore.param.FsCouponIssueParam;
+import com.fs.hisStore.param.FsStoreCouponPurchaseParam;
 import com.fs.hisStore.param.FsStoreCouponReceiveParam;
+import com.fs.hisStore.param.FsStorePaymentPayParam;
+import com.fs.hisStore.service.IFsStoreCouponIssueScrmService;
 import com.fs.hisStore.vo.FsStoreCouponIssueVO;
 import lombok.Synchronized;
+import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
-import com.fs.hisStore.service.IFsStoreCouponIssueScrmService;
 import org.springframework.transaction.annotation.Transactional;
 
+import java.util.Calendar;
+import java.util.Date;
+import java.util.List;
+
 /**
  * 优惠券领取Service业务层处理
  *
  * @author fs
  * @date 2022-03-15
  */
+@Slf4j
 @Service
 public class FsStoreCouponIssueScrmServiceImpl implements IFsStoreCouponIssueScrmService
 {
@@ -39,6 +45,8 @@ public class FsStoreCouponIssueScrmServiceImpl implements IFsStoreCouponIssueScr
     private FsStoreCouponUserScrmMapper fsStoreCouponUserMapper;
     @Autowired
     private FsUserScrmMapper userMapper;
+    @Autowired
+    private IFsStorePaymentService storePaymentService;
     /**
      * 查询优惠券领取
      *
@@ -181,5 +189,90 @@ public class FsStoreCouponIssueScrmServiceImpl implements IFsStoreCouponIssueScr
         return fsStoreCouponIssueMapper.selectFsStoreCouponIssueListVO(fsStoreCouponIssue);
     }
 
+    @Override
+    public List<FsStoreCouponIssueVO> selectFsStoreCouponIssueListVOForCash(FsStoreCouponIssueScrm fsStoreCouponIssue) {
+        return fsStoreCouponIssueMapper.selectFsStoreCouponIssueListVOForCash(fsStoreCouponIssue);
+    }
+
+    @Override
+    @Synchronized
+    @Transactional(rollbackFor = Exception.class)
+    public R purchaseCashCoupon(String userId, FsStoreCouponPurchaseParam param) {
+        // 检查立减金是否存在和有效性
+        FsStoreCouponIssueScrm couponIssue = fsStoreCouponIssueMapper.selectFsStoreCouponIssueById(param.getId());
+        if (couponIssue == null) {
+            return R.error("立减金不存在");
+        }
+
+        // 检查立减金是否为立减金类型
+        if (couponIssue.getCouponType() == null || couponIssue.getCouponType() != 3) {
+            return R.error("该优惠券不是立减金");
+        }
+
+        // 检查立减金状态
+        if (couponIssue.getStatus().equals(0)) {
+            return R.error("此立减金已停止购买");
+        }
+
+//        // 检查用户是否已购买过
+//        if (fsStoreCouponIssueUserMapper.checkReceive(userId, param.getId()) > 0) {
+//            return R.error("您已购买此立减金,使用后再购买哦!");
+//        }
+
+        // 获取立减金详细信息
+        FsStoreCouponScrm coupon = couponMapper.selectFsStoreCouponById(couponIssue.getCouponId());
+        if (coupon == null) {
+            return R.error("立减金详情不存在");
+        }
+        // 创建支付参数并调用支付接口
+        FsStorePaymentPayParam payParam = new FsStorePaymentPayParam();
+        payParam.setCouponId(param.getId()); // 使用立减金ID作为业务ID
+        payParam.setCouponPrice(coupon.getCouponPrice()); // 支付金额为立减金面额
+        payParam.setBusinessType(3); // 设置业务类型为3,表示购买立减金
+        payParam.setUserId(Long.parseLong(userId));
+//        payParam.setCompanyId(couponIssue.getCompanyId());
+//        payParam.setCompanyUserId(couponIssue.getCompanyUserId());
+        payParam.setPayMoney(coupon.getCouponPrice()); // 支付金额为立减金面额
+
+        try {
+            // 调用支付服务
+            R payResult = storePaymentService.payment(payParam);
+
+            // 检查支付结果
+            if (payResult == null || !payResult.get("code").equals(200)) {
+                return R.error("支付失败: " + (payResult != null ? payResult.get("msg") : "未知错误"));
+            }
+
+            // 支付成功后,写入领取记录表
+            FsStoreCouponIssueUserScrm couponIssueUser = new FsStoreCouponIssueUserScrm();
+            couponIssueUser.setUserId(Long.parseLong(userId));
+            couponIssueUser.setIssueId(param.getId());
+            couponIssueUser.setIsDel(0);
+            couponIssueUser.setCreateTime(new Date());
+            fsStoreCouponIssueUserMapper.insertFsStoreCouponIssueUser(couponIssueUser);
+
+            // 写入用户优惠券表
+            FsStoreCouponUserScrm couponUser = new FsStoreCouponUserScrm();
+            couponUser.setCouponId(couponIssue.getCouponId());
+            couponUser.setUserId(Long.parseLong(userId));
+            couponUser.setCouponTitle(couponIssue.getCouponName());
+            couponUser.setCouponPrice(coupon.getCouponPrice());
+            couponUser.setUseMinPrice(coupon.getUseMinPrice());
+            couponUser.setCouponType(3); // 设置为立减金类型
+
+            // 设置立减金有效期
+            couponUser.setLimitTime(null);
+            couponUser.setCreateTime(new Date());
+            couponUser.setType("purchase"); // 设置获取方式为购买
+            couponUser.setStatus(0); // 设置为未使用状态
+            fsStoreCouponUserMapper.insertFsStoreCouponUser(couponUser);
+            return R.ok("购买成功").put("data", payResult.get("data"));
+
+        } catch (Exception e) {
+            // 记录详细日志并触发支付退款
+            log.error("立减金购买异常,触发退款: userId={}, couponIssueId={}", userId, param.getId(), e);
+            throw new CustomException("购买失败,联系售后退款");
+        }
+    }
 
-}
+}

+ 10 - 4
fs-service/src/main/java/com/fs/hisStore/service/impl/FsStoreCouponUserScrmServiceImpl.java

@@ -1,14 +1,15 @@
 package com.fs.hisStore.service.impl;
 
-import java.util.List;
 import com.fs.common.utils.DateUtils;
+import com.fs.hisStore.domain.FsStoreCouponUserScrm;
+import com.fs.hisStore.mapper.FsStoreCouponUserScrmMapper;
 import com.fs.hisStore.param.FsCouponUserEnableParam;
+import com.fs.hisStore.service.IFsStoreCouponUserScrmService;
 import com.fs.hisStore.vo.FsStoreCouponUserVO;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
-import com.fs.hisStore.mapper.FsStoreCouponUserScrmMapper;
-import com.fs.hisStore.domain.FsStoreCouponUserScrm;
-import com.fs.hisStore.service.IFsStoreCouponUserScrmService;
+
+import java.util.List;
 
 /**
  * 优惠券发放记录Service业务层处理
@@ -110,4 +111,9 @@ public class FsStoreCouponUserScrmServiceImpl implements IFsStoreCouponUserScrmS
     public List<FsStoreCouponUserVO> selectFsStoreCouponUserListVO(FsStoreCouponUserScrm fsStoreCouponUser) {
         return fsStoreCouponUserMapper.selectFsStoreCouponUserListVO(fsStoreCouponUser);
     }
+
+    @Override
+    public List<FsStoreCouponUserVO> selectFsStoreCouponUserListVOForCash(FsStoreCouponUserScrm fsStoreCouponUser) {
+        return fsStoreCouponUserMapper.selectFsStoreCouponUserListVOForCash(fsStoreCouponUser);
+    }
 }

+ 100 - 18
fs-service/src/main/java/com/fs/hisStore/service/impl/FsStoreOrderScrmServiceImpl.java

@@ -1,9 +1,9 @@
 package com.fs.hisStore.service.impl;
 
+import cn.binarywang.wx.miniapp.api.WxMaService;
 import cn.binarywang.wx.miniapp.bean.shop.request.shipping.*;
 import cn.binarywang.wx.miniapp.bean.shop.response.WxMaOrderShippingInfoGetResponse;
 import cn.hutool.core.date.DateTime;
-import cn.binarywang.wx.miniapp.api.WxMaService;
 import cn.hutool.core.net.URLDecoder;
 import cn.hutool.core.util.IdUtil;
 import cn.hutool.core.util.NumberUtil;
@@ -27,13 +27,11 @@ import com.fs.common.exception.CustomException;
 import com.fs.common.exception.ServiceException;
 import com.fs.common.utils.DateUtils;
 import com.fs.common.utils.StringUtils;
-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.CompanyDeptMapper;
 import com.fs.company.mapper.CompanyMapper;
 import com.fs.company.mapper.CompanyMoneyLogsMapper;
+import com.fs.company.mapper.CompanyTagMapper;
 import com.fs.company.service.ICompanyDeptService;
 import com.fs.company.service.ICompanyService;
 import com.fs.company.service.ICompanyUserService;
@@ -43,29 +41,44 @@ import com.fs.core.utils.OrderCodeUtils;
 import com.fs.course.dto.FsOrderDeliveryNoteDTO;
 import com.fs.course.dto.OrderOpenIdTransDTO;
 import com.fs.erp.domain.*;
-import com.fs.erp.dto.*;
+import com.fs.erp.dto.ErpOrderQueryRequert;
+import com.fs.erp.dto.ErpOrderQueryResponse;
+import com.fs.erp.dto.ErpOrderResponse;
+import com.fs.erp.dto.ErpRefundUpdateRequest;
 import com.fs.erp.mapper.FsErpFinishPushMapper;
 import com.fs.erp.service.IErpOrderService;
 import com.fs.his.config.FsSysConfig;
-import com.fs.his.domain.*;
+import com.fs.his.domain.FsInquiryOrder;
+import com.fs.his.domain.FsPackageOrder;
+import com.fs.his.domain.FsPrescribe;
+import com.fs.his.domain.FsPrescribeDrug;
 import com.fs.his.dto.FsPrescribeUsageDTO;
 import com.fs.his.dto.FsProdItemDTO;
 import com.fs.his.dto.FsStoreOrderItemDTO;
 import com.fs.his.enums.FsStoreOrderLogEnum;
 import com.fs.his.enums.FsStoreOrderStatusEnum;
-import com.fs.his.mapper.*;
+import com.fs.his.mapper.FsInquiryOrderMapper;
+import com.fs.his.mapper.FsPackageOrderMapper;
+import com.fs.his.mapper.FsPrescribeDrugMapper;
+import com.fs.his.mapper.FsPrescribeMapper;
 import com.fs.his.param.FsStoreOrderSalesParam;
 import com.fs.his.service.IFsPrescribeService;
 import com.fs.his.service.IFsUserWatchService;
 import com.fs.his.utils.ConfigUtil;
 import com.fs.his.vo.FsInquiryOrderVO;
+import com.fs.his.vo.FsPrescribeVO;
 import com.fs.his.vo.FsStoreOrderExcelVO;
 import com.fs.hisStore.config.FsErpConfig;
+import com.fs.hisStore.config.StoreConfig;
+import com.fs.hisStore.config.StoreIntegralConfig;
+import com.fs.hisStore.constants.StoreConstants;
+import com.fs.hisStore.domain.*;
 import com.fs.hisStore.dto.*;
+import com.fs.hisStore.enums.*;
 import com.fs.hisStore.mapper.*;
 import com.fs.hisStore.param.*;
+import com.fs.hisStore.service.*;
 import com.fs.hisStore.vo.*;
-import com.fs.his.vo.FsPrescribeVO;
 import com.fs.hisapi.domain.ApiResponse;
 import com.fs.hisapi.param.CreateOrderParam;
 import com.fs.hisapi.param.RecipeDetailParam;
@@ -76,13 +89,6 @@ import com.fs.huifuPay.sdk.opps.core.request.V2TradePaymentScanpayRefundRequest;
 import com.fs.huifuPay.service.HuiFuService;
 import com.fs.pay.pay.dto.RefundDTO;
 import com.fs.pay.service.IPayService;
-import com.fs.hisStore.config.StoreConfig;
-import com.fs.hisStore.config.StoreIntegralConfig;
-import com.fs.hisStore.constants.StoreConstants;
-import com.fs.hisStore.domain.*;
-import com.fs.hisStore.enums.*;
-import com.fs.hisStore.service.*;
-import com.fs.system.domain.SysConfig;
 import com.fs.system.mapper.SysConfigMapper;
 import com.fs.system.service.ISysConfigService;
 import com.fs.ybPay.domain.RefundResult;
@@ -93,7 +99,6 @@ import com.github.binarywang.wxpay.bean.result.WxPayRefundResult;
 import com.github.binarywang.wxpay.config.WxPayConfig;
 import com.github.binarywang.wxpay.exception.WxPayException;
 import com.github.binarywang.wxpay.service.WxPayService;
-import com.google.gson.Gson;
 import lombok.Synchronized;
 import lombok.extern.slf4j.Slf4j;
 import me.chanjar.weixin.common.error.WxErrorException;
@@ -323,6 +328,12 @@ public class FsStoreOrderScrmServiceImpl implements IFsStoreOrderScrmService {
     @Autowired
     private SysConfigMapper sysConfigMapper;
 
+    @Autowired
+    private CompanyTagMapper companyTagMapper;
+
+    @Autowired
+    private IFsUserProjectTagScrmService userProjectTagService;
+
     /**
      * 查询订单
      *
@@ -580,6 +591,16 @@ public class FsStoreOrderScrmServiceImpl implements IFsStoreOrderScrmService {
             }
         }
 
+        //立减金
+        if (param.getDeductionCouponUserId() != null) {
+            FsStoreCouponUserScrm deductionCouponUser = couponUserService.selectFsStoreCouponUserById(param.getDeductionCouponUserId());
+            if (deductionCouponUser != null && deductionCouponUser.getStatus() == 0) {
+                if (deductionCouponUser.getUseMinPrice().compareTo(priceGroup.getTotalPrice()) == -1) {
+                    payPrice = payPrice.subtract(deductionCouponUser.getCouponPrice());
+                }
+            }
+        }
+
         return FsStoreOrderComputeDTO.builder()
                 .totalPrice(priceGroup.getTotalPrice())
                 .payPrice(payPrice)
@@ -705,6 +726,19 @@ public class FsStoreOrderScrmServiceImpl implements IFsStoreOrderScrmService {
                     couponUserService.updateFsStoreCouponUser(couponUser);
                 }
             }
+
+            //立减金处理
+            if (param.getDeductionCouponUserId() != null) {
+                FsStoreCouponUserScrm deductionCouponUser = couponUserService.selectFsStoreCouponUserById(param.getDeductionCouponUserId());
+                if (deductionCouponUser != null && deductionCouponUser.getStatus() == 0) {
+                    storeOrder.setDeductionCouponId(deductionCouponUser.getId());
+                    storeOrder.setDeductionCouponPrice(deductionCouponUser.getCouponPrice());
+                    //更新立减金优惠券状态
+                    deductionCouponUser.setStatus(1);
+                    deductionCouponUser.setUseTime(new Date());
+                    couponUserService.updateFsStoreCouponUser(deductionCouponUser);
+                }
+            }
             //处理推荐人
             FsUserScrm user = userService.selectFsUserById(storeOrder.getUserId());
             if (user.getSpreadUserId() != null && user.getSpreadUserId() > 0) {
@@ -1038,6 +1072,8 @@ public class FsStoreOrderScrmServiceImpl implements IFsStoreOrderScrmService {
             this.refundIntegral(order);
             //退回优惠券
             this.refundCoupon(order);
+            //退回立减金
+            this.refundDeductionCoupon(order);
             //退回库存
             this.refundStock(order);
             fsStoreOrderMapper.cancelOrder(orderId);
@@ -1072,6 +1108,10 @@ public class FsStoreOrderScrmServiceImpl implements IFsStoreOrderScrmService {
             this.refundIntegral(order);
             //退回库存
             this.refundStock(order);
+            //退回优惠券
+            this.refundCoupon(order);
+            //退回立减金
+            this.refundDeductionCoupon(order);
             fsStoreOrderMapper.cancelOrder(orderId);
             //退佣金
             if (order.getTuiUserId() != null && order.getTuiUserId() > 0) {
@@ -1135,6 +1175,18 @@ public class FsStoreOrderScrmServiceImpl implements IFsStoreOrderScrmService {
         }
     }
 
+    //退回立减金
+    private void refundDeductionCoupon(FsStoreOrderScrm order) {
+        if (order.getDeductionCouponId() != null) {
+            FsStoreCouponUserScrm couponUser = couponUserService.selectFsStoreCouponUserById(order.getDeductionCouponId());
+            if (couponUser != null && couponUser.getCouponType() == 3) { // 3表示立减金
+                couponUser.setStatus(0);
+                couponUser.setUseTime(null);
+                couponUserService.updateFsStoreCouponUser(couponUser);
+            }
+        }
+    }
+
     //已支付退款
     @Override
     public void refundOrder(Long orderId) {
@@ -1145,6 +1197,10 @@ public class FsStoreOrderScrmServiceImpl implements IFsStoreOrderScrmService {
             this.refundIntegral(order);
             //退回库存
             this.refundStock(order);
+            //退回优惠券
+            this.refundCoupon(order);
+            //退回立减金
+            this.refundDeductionCoupon(order);
             fsStoreOrderMapper.cancelOrder(orderId);
         }
     }
@@ -1315,6 +1371,8 @@ public class FsStoreOrderScrmServiceImpl implements IFsStoreOrderScrmService {
             createParam.setOrderCreateType(3); //后台制单
             createParam.setOrderType(param.getOrderType());
             createParam.setOrderMedium(param.getOrderMedium()); //后台制单
+            createParam.setCouponUserId(param.getCouponUserId()); //设置优惠券ID
+            createParam.setDeductionCouponUserId(param.getDeductionCouponUserId()); //设置立减金优惠券用户ID
             return this.createOrder(param.getUserId(), createParam);
         } else {
             throw new CustomException("创建失败");
@@ -1577,6 +1635,30 @@ public class FsStoreOrderScrmServiceImpl implements IFsStoreOrderScrmService {
             fsStoreOrderMapper.updateFsStoreOrder(order);
             orderStatusService.create(order.getId(), OrderLogEnum.FINISH_ORDER.getValue(),
                     OrderLogEnum.FINISH_ORDER.getDesc());
+            // 为完成订单的客户打上"营养师推荐"标签
+            try{
+                //查询或者创建“营养师推荐”标签
+                HashMap<String, Object> params = new HashMap<>();
+                params.put("companyId", order.getCompanyId());
+                params.put("tag", "营养师推荐");
+                List<CompanyTag> tags = companyTagMapper.selectCompanyTagListByMap(params);
+
+                Long tagId;
+                if(tags == null || tags.isEmpty()){
+                    //如果标签不存在,创建新标签
+                    CompanyTag newTag = new CompanyTag();
+                    newTag.setCompanyId(order.getCompanyId());
+                    newTag.setTag("营养师推荐");
+                    companyTagMapper.insertCompanyTag(newTag);
+                    tagId = newTag.getTagId();
+                }else {
+                    tagId = tags.get(0).getTagId();
+                }
+                userProjectTagService.addUserProjectTag(order.getCompanyUserId(), Arrays.asList(tagId));
+            }
+            catch (Exception e){
+                log.error("为订单用户打标签时发生错误:"+e.getMessage(),e);
+            }
             //写入公司余额 条件是只有全款订单才分,非全款后台导入
             if (order.getCompanyId() != null && order.getCompanyId() > 0 && order.getPayDelivery().compareTo(new BigDecimal(0)) == 0) {
                 if (order.getTuiMoneyStatus() == null || order.getTuiMoneyStatus() != 1) {
@@ -4057,4 +4139,4 @@ public class FsStoreOrderScrmServiceImpl implements IFsStoreOrderScrmService {
         }
         return start < len ? str.substring(start) : "";
     }
-}
+}

+ 1 - 1
fs-service/src/main/java/com/fs/hisStore/vo/FsStoreCouponIssueVO.java

@@ -18,7 +18,7 @@ public class FsStoreCouponIssueVO implements Serializable
     /** 优惠券ID */
     private Long couponId;
 
-    /** 优惠券类型 0-通用 1-商品券 */
+    /** 优惠券类型 0-通用 1-商品券 2-制单卷 3-立减金*/
     private Integer couponType;
 
     /** 优惠券领取开启时间 */

+ 4 - 0
fs-service/src/main/java/com/fs/hisStore/vo/FsStoreCouponUserVO.java

@@ -62,6 +62,10 @@ public class FsStoreCouponUserVO implements Serializable
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     private Date createTime;
 
+    /** 优惠券类型 */
+    @Excel(name = "优惠券类型")
+    private Integer couponType;
+
 
 
 }

+ 4 - 1
fs-service/src/main/resources/mapper/hisStore/FsStoreCouponIssueScrmMapper.xml

@@ -18,10 +18,13 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <result property="isDel"    column="is_del"    />
         <result property="createTime"    column="create_time"    />
         <result property="updateTime"    column="update_time"    />
+        <result property="companyId"    column="company_id"    />
+        <result property="companyUserId"    column="company_user_id"    />
+        <result property="storeId"    column="store_id"    />
     </resultMap>
 
     <sql id="selectFsStoreCouponIssueVo">
-        select id, coupon_name, coupon_id, coupon_type, start_time, limit_time, total_count, remain_count, is_permanent, status, is_del, create_time, update_time from fs_store_coupon_issue_scrm
+        select id, coupon_name, coupon_id, coupon_type, start_time, limit_time, total_count, remain_count, is_permanent, status, is_del, create_time, update_time, company_id, company_user_id, store_id from fs_store_coupon_issue_scrm
     </sql>
 
     <select id="selectFsStoreCouponIssueList" parameterType="FsStoreCouponIssueScrm" resultMap="FsStoreCouponIssueResult">

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

@@ -112,5 +112,5 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             #{id}
         </foreach>
     </delete>
-    
+
 </mapper>

+ 9 - 2
fs-service/src/main/resources/mapper/hisStore/FsStoreOrderScrmMapper.xml

@@ -89,10 +89,13 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <result property="orderVisit"    column="order_visit"    />
         <result property="serviceFee"    column="service_fee"    />
         <!--<result property="orderMedium"    column="order_medium"    />-->
+        <result property="deductionCouponUserId"    column="deduction_coupon_user_id"    />
+        <result property="deductionCouponId"    column="deduction_coupon_id"    />
+        <result property="deductionCouponPrice"    column="deduction_coupon_price"    />
     </resultMap>
 
     <sql id="selectFsStoreOrderVo">
-        select id, order_code,service_fee, extend_order_id,pay_order_id,bank_order_id, user_id,order_visit, real_name, user_phone, user_address, cart_id, freight_price, total_num, total_price, total_postage, pay_price, pay_postage,pay_delivery,pay_money, deduction_price, coupon_id, coupon_price, paid, pay_time, pay_type, create_time, update_time, status, refund_status, refund_reason_wap_img, refund_reason_wap_explain, refund_reason_time, refund_reason_wap, refund_reason, refund_price, delivery_sn, delivery_name, delivery_type, delivery_id, gain_integral, use_integral, pay_integral, back_integral, mark, is_del, remark, cost, verify_code, store_id, shipping_type, is_channel, is_remind, is_sys_del,is_prescribe,prescribe_id ,company_id,company_user_id,is_package,package_json,item_json,order_type,package_id,finish_time,delivery_status,delivery_pay_status,delivery_time,delivery_pay_time,delivery_pay_money,tui_money,tui_money_status,delivery_import_time,tui_user_id,tui_user_money_status,order_create_type,store_house_code,dept_id,is_edit_money,customer_id,is_pay_remain,delivery_send_time,certificates,schedule_id from fs_store_order_scrm
+        select id, order_code,service_fee, extend_order_id,pay_order_id,bank_order_id, user_id,order_visit, real_name, user_phone, user_address, cart_id, freight_price, total_num, total_price, total_postage, pay_price, pay_postage,pay_delivery,pay_money, deduction_price, coupon_id, coupon_price, paid, pay_time, pay_type, create_time, update_time, status, refund_status, refund_reason_wap_img, refund_reason_wap_explain, refund_reason_time, refund_reason_wap, refund_reason, refund_price, delivery_sn, delivery_name, delivery_type, delivery_id, gain_integral, use_integral, pay_integral, back_integral, mark, is_del, remark, cost, verify_code, store_id, shipping_type, is_channel, is_remind, is_sys_del,is_prescribe,prescribe_id ,company_id,company_user_id,is_package,package_json,item_json,order_type,package_id,finish_time,delivery_status,delivery_pay_status,delivery_time,delivery_pay_time,delivery_pay_money,tui_money,tui_money_status,delivery_import_time,tui_user_id,tui_user_money_status,order_create_type,store_house_code,dept_id,is_edit_money,customer_id,is_pay_remain,delivery_send_time,certificates,schedule_id,deduction_coupon_user_id,deduction_coupon_id,deduction_coupon_price  from fs_store_order_scrm
     </sql>
 
     <select id="selectFsStoreOrderList" parameterType="FsStoreOrderScrm" resultMap="FsStoreOrderResult">
@@ -249,6 +252,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="followTime != null">follow_time,</if>
             <if test="followDoctorId != null">follow_doctor_id,</if>
             <if test="cycle != null">cycle,</if>
+            <if test="deductionCouponId != null">deduction_coupon_id,</if>
+            <if test="deductionCouponPrice != null">deduction_coupon_price,</if>
          </trim>
         <trim prefix="values (" suffix=")" suffixOverrides=",">
             <if test="orderCode != null and orderCode != ''">#{orderCode},</if>
@@ -336,6 +341,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="followTime != null">#{followTime},</if>
             <if test="followDoctorId != null">#{followDoctorId},</if>
             <if test="cycle != null">#{cycle},</if>
+            <if test="deductionCouponId != null">#{deductionCouponId},</if>
+            <if test="deductionCouponPrice != null">#{deductionCouponPrice},</if>
          </trim>
     </insert>
 
@@ -1102,4 +1109,4 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
           AND o.paid = 1
           AND o.is_del = 0
     </select>
-</mapper>
+</mapper>

+ 16 - 5
fs-user-app/src/main/java/com/fs/app/controller/store/CouponScrmController.java

@@ -10,10 +10,7 @@ import com.fs.common.param.BaseQueryParam;
 import com.fs.common.utils.StringUtils;
 import com.fs.hisStore.domain.FsStoreCouponIssueScrm;
 import com.fs.hisStore.domain.FsStoreCouponUserScrm;
-import com.fs.hisStore.param.FsCouponIssueParam;
-import com.fs.hisStore.param.FsCouponUserEnableParam;
-import com.fs.hisStore.param.FsCouponUserParam;
-import com.fs.hisStore.param.FsStoreCouponReceiveParam;
+import com.fs.hisStore.param.*;
 import com.fs.hisStore.service.IFsStoreCouponIssueScrmService;
 import com.fs.hisStore.service.IFsStoreCouponScrmService;
 import com.fs.hisStore.service.IFsStoreCouponUserScrmService;
@@ -91,7 +88,14 @@ public class CouponScrmController extends AppBaseController {
     public R getCompanyCouponIssueList(FsCouponIssueParam param, HttpServletRequest request){
         PageHelper.startPage(param.getPage(), param.getPageSize());
         try {
-            List<FsStoreCouponIssueVO> list=fsStoreCouponIssueService.getCompanyCouponIssueList(param);
+            List<FsStoreCouponIssueVO> list;
+            if (param.getCouponType() != null && param.getCouponType() == 3) {
+                // 处理 couponType=3 的情况,调用专门查询立减金的方法
+                list = fsStoreCouponIssueService.selectFsStoreCouponIssueListVOForCash(new FsStoreCouponIssueScrm());
+            } else {
+                // 处理其他 couponType 的情况
+                list = fsStoreCouponIssueService.getCompanyCouponIssueList(param);
+            }
             PageInfo<FsStoreCouponIssueVO> listPageInfo=new PageInfo<>(list);
             return R.ok().put("data",listPageInfo);
         } catch (Exception e){
@@ -121,6 +125,13 @@ public class CouponScrmController extends AppBaseController {
         return fsStoreCouponIssueService.receive(getUserId(),param);
     }
 
+    @Login
+    @ApiOperation("购买立减金")
+    @PostMapping("/purchaseCashCoupon")
+    public R purchaseCashCoupon(@RequestBody FsStoreCouponPurchaseParam param, HttpServletRequest request) {
+        return fsStoreCouponIssueService.purchaseCashCoupon(getUserId(), param);
+    }
+
 
     @Login
     @ApiOperation("获取我的优惠券列表")

+ 13 - 1
fs-user-app/src/main/java/com/fs/app/controller/store/StoreOrderScrmController.java

@@ -231,6 +231,18 @@ public class StoreOrderScrmController extends AppBaseController {
         else if(order.getStatus()==1||order.getStatus()==2){
             isAfterSales=1;
         }
+
+        // 计算总优惠金额 = 优惠券优惠金额 + 立减金优惠金额
+        BigDecimal totalDiscountPrice = BigDecimal.ZERO;
+        if (order.getCouponPrice() != null) {
+            totalDiscountPrice = totalDiscountPrice.add(order.getCouponPrice());
+        }
+        if (order.getDeductionCouponPrice() != null) {
+            totalDiscountPrice = totalDiscountPrice.add(order.getDeductionCouponPrice());
+        }
+        // 将总优惠金额设置到deductionPrice字段中
+        order.setDeductionPrice(totalDiscountPrice);
+
         return R.ok().put("isAfterSales",isAfterSales).put("order",order).put("items",list).put("payLimitTime",payLimitTime).put("prescribe",prescribe).put("transactionId",transactionId);
     }
 
@@ -944,4 +956,4 @@ public class StoreOrderScrmController extends AppBaseController {
     public R queryReceiptType(){
         return orderService.queryReceiptType();
     }
-}
+}