wangxy 3 дней назад
Родитель
Сommit
6510a43fea

+ 11 - 0
fs-company/src/main/java/com/fs/company/controller/store/FsInquiryOrderController.java

@@ -23,6 +23,7 @@ import com.fs.his.param.FsInquiryOrderCreateParam;
 import com.fs.his.param.FsInquiryOrderManuallyParam;
 import com.fs.his.param.FsInquiryOrderParam;
 import com.fs.his.param.FsInquiryOrderRefundParam;
+import com.fs.his.param.FsPreOrderComputeParam;
 import com.fs.his.service.IFsDoctorService;
 import com.fs.his.service.IFsExportTaskService;
 import com.fs.his.service.IFsInquiryOrderLogsService;
@@ -291,6 +292,16 @@ public class FsInquiryOrderController extends BaseController
         return fsPreOrderService.createInquiryPreOrderLink(param, param.getCompanyId(), param.getCompanyUserId());
     }
 
+    @PreAuthorize("@ss.hasPermi('store:inquiryOrder:add')")
+    @Log(title = "问诊订单预制单金额计算", businessType = BusinessType.OTHER)
+    @PostMapping("/preOrder/compute")
+    public R computePreOrderAmount(@RequestBody FsPreOrderComputeParam param) {
+        LoginUser loginUser = SecurityUtils.getLoginUser();
+        param.setPreOrderType(2);
+        param.setCompanyId(loginUser.getCompany().getCompanyId());
+        return fsPreOrderService.computePreOrderAmount(param);
+    }
+
     @GetMapping("/preOrder/{preOrderId}")
     public R getPreOrder(@PathVariable("preOrderId") Long preOrderId)
     {

+ 11 - 0
fs-company/src/main/java/com/fs/company/controller/store/FsPackageOrderController.java

@@ -16,6 +16,7 @@ import com.fs.his.domain.FsPackageOrder;
 import com.fs.his.param.FsPackageOrderAddParam;
 import com.fs.his.param.FsPackageOrderManuallyParam;
 import com.fs.his.param.FsPackageOrderParam;
+import com.fs.his.param.FsPreOrderComputeParam;
 import com.fs.his.service.IFsExportTaskService;
 import com.fs.his.service.IFsPackageOrderService;
 import com.fs.his.service.IFsPreOrderService;
@@ -213,6 +214,16 @@ public class FsPackageOrderController extends BaseController
         return fsPreOrderService.createPackagePreOrderLink(fsPackageOrder, fsPackageOrder.getCompanyId(), fsPackageOrder.getCompanyUserId());
     }
 
+    @PreAuthorize("@ss.hasPermi('store:packageOrder:add')")
+    @Log(title = "套餐订单预制单金额计算", businessType = BusinessType.OTHER)
+    @PostMapping("/preOrder/compute")
+    public R computePreOrderAmount(@RequestBody FsPreOrderComputeParam param) {
+        LoginUser loginUser = SecurityUtils.getLoginUser();
+        param.setPreOrderType(1);
+        param.setCompanyId(loginUser.getCompany().getCompanyId());
+        return fsPreOrderService.computePreOrderAmount(param);
+    }
+
     @GetMapping("/preOrder/{preOrderId}")
     public R getPreOrder(@PathVariable("preOrderId") Long preOrderId)
     {

+ 13 - 0
fs-service/src/main/java/com/fs/his/domain/FsInquiryOrder.java

@@ -145,6 +145,19 @@ public class FsInquiryOrder extends BaseEntity
 
     private Long triageUserId;
 
+    /**
+     * 预制单id
+     */
+    private Long preOrderId;
+
+    public Long getPreOrderId() {
+        return preOrderId;
+    }
+
+    public void setPreOrderId(Long preOrderId) {
+        this.preOrderId = preOrderId;
+    }
+
     public Long getTriageUserId() {
         return triageUserId;
     }

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

@@ -159,4 +159,9 @@ public class FsPackageOrder extends BaseEntity
     private String icdCode;
     //订单来源 1:小程序 2:app  3:H5 4:代制单
     private Integer source;
+
+    /**
+     * 预制单id
+     */
+    private  Long  preOrderId;
 }

+ 6 - 0
fs-service/src/main/java/com/fs/his/domain/FsPreOrder.java

@@ -34,6 +34,12 @@ public class FsPreOrder extends BaseEntity {
     /** 优惠券ID */
     private Long couponId;
 
+    /** 优惠券名称 */
+    private String couponName;
+
+    /** 优惠金额 */
+    private BigDecimal discountMoney;
+
     /** 支付类型 */
     private Integer payType;
 

+ 8 - 0
fs-service/src/main/java/com/fs/his/param/FsInquiryOrderCreateParam.java

@@ -6,6 +6,7 @@ import lombok.Data;
 
 import javax.validation.constraints.*;
 import java.io.Serializable;
+import java.math.BigDecimal;
 import java.util.Date;
 
 @Data
@@ -48,7 +49,14 @@ public class FsInquiryOrderCreateParam implements Serializable {
     private Long companyId;
     private Long companyUserId;
     private Integer source;//订单来源 1:小程序 2:app  3:H5 4:代制单
+    private BigDecimal payMoney;
+    private BigDecimal payableAmount;
 
     /** 优惠券id */
     private Long couponId;
+
+    /**
+     * 预制单id
+     */
+    private Long preOrderId;
 }

+ 4 - 0
fs-service/src/main/java/com/fs/his/param/FsPackageOrderCreateParam.java

@@ -23,6 +23,10 @@ public class FsPackageOrderCreateParam implements Serializable {
     private Integer payType;
     private Integer isUserInformation = 0;
     private Long userInformationId;
+    /**
+     * 预制单id
+     */
+    private  Long preOrderId;
 
 
 

+ 2 - 0
fs-service/src/main/java/com/fs/his/param/FsPackageOrderPayParam.java

@@ -16,5 +16,7 @@ public class FsPackageOrderPayParam implements Serializable {
     Integer payType;
 
     Long userId;
+
+    Long preOrderId;
     private String createPackageOrderKey;
 }

+ 29 - 0
fs-service/src/main/java/com/fs/his/param/FsPreOrderComputeParam.java

@@ -0,0 +1,29 @@
+package com.fs.his.param;
+
+import lombok.Data;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+@Data
+public class FsPreOrderComputeParam implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    /** 预制单类型:1套餐包,2问诊订单 */
+    private Integer preOrderType;
+
+    /** 用户ID */
+    private Long userId;
+
+    /** 优惠券ID:套餐传优惠券ID,问诊传用户优惠券ID */
+    private Long couponId;
+
+    /** 支付金额 */
+    private BigDecimal payMoney;
+
+    /** 应付金额 */
+    private BigDecimal payableAmount;
+
+    /** 公司ID */
+    private Long companyId;
+}

+ 3 - 0
fs-service/src/main/java/com/fs/his/service/IFsPreOrderService.java

@@ -3,6 +3,7 @@ package com.fs.his.service;
 import com.fs.common.core.domain.R;
 import com.fs.his.param.FsInquiryOrderCreateParam;
 import com.fs.his.param.FsPackageOrderAddParam;
+import com.fs.his.param.FsPreOrderComputeParam;
 
 /**
  * 预制单Service接口
@@ -12,5 +13,7 @@ public interface IFsPreOrderService {
 
     R createInquiryPreOrderLink(FsInquiryOrderCreateParam param, Long companyId, Long companyUserId);
 
+    R computePreOrderAmount(FsPreOrderComputeParam param);
+
     R getPreOrder(Long preOrderId);
 }

+ 12 - 0
fs-service/src/main/java/com/fs/his/service/impl/FsInquiryOrderServiceImpl.java

@@ -166,6 +166,8 @@ public class FsInquiryOrderServiceImpl implements IFsInquiryOrderService
     @Autowired
     FsPackageOrderMapper fsPackageOrderMapper;
     @Autowired
+    private FsPreOrderMapper fsPreOrderMapper;
+    @Autowired
     private ICompanyService companyService;
     @Autowired
     private ISysConfigService configService;
@@ -658,6 +660,7 @@ public class FsInquiryOrderServiceImpl implements IFsInquiryOrderService
         if (param.getSource()!=null){
             order.setSource(param.getSource());
         }
+        order.setPreOrderId(param.getPreOrderId());
         FsInquiryOrderReport report=null;
         String json=configService.selectConfigByKey("his.inquiryConfig");
         InquiryConfigDTO configDTO=JSONUtil.toBean(json, InquiryConfigDTO.class);
@@ -787,6 +790,15 @@ public class FsInquiryOrderServiceImpl implements IFsInquiryOrderService
 
             }
         }
+        if (param.getPreOrderId() != null) {
+            FsPreOrder preOrder = fsPreOrderMapper.selectFsPreOrderById(param.getPreOrderId());
+            if (preOrder == null) {
+                return R.error("预制单不存在");
+            }
+            BigDecimal payableAmount = preOrder.getPayableAmount() == null ? preOrder.getPayMoney() : preOrder.getPayableAmount();
+            order.setMoney(payableAmount == null ? BigDecimal.ZERO : payableAmount);
+            order.setPayMoney(preOrder.getPayMoney() == null ? BigDecimal.ZERO : preOrder.getPayMoney());
+        }
         order.setPatientJson(JSONUtil.toJsonStr(dto));
         if(fsInquiryOrderMapper.insertFsInquiryOrder(order)>0){
             if(report!=null){

+ 46 - 16
fs-service/src/main/java/com/fs/his/service/impl/FsPackageOrderServiceImpl.java

@@ -114,6 +114,9 @@ public class FsPackageOrderServiceImpl implements IFsPackageOrderService
     @Autowired
     private FsPackageOrderMapper fsPackageOrderMapper;
 
+    @Autowired
+    private FsPreOrderMapper fsPreOrderMapper;
+
     @Autowired
     private FsPackageMapper fsPackageMapper;
 
@@ -643,6 +646,7 @@ public class FsPackageOrderServiceImpl implements IFsPackageOrderService
         if (param.getSource()!=null){
             order.setSource(param.getSource());
         }
+        order.setPreOrderId(param.getPreOrderId());
         Calendar calendar = Calendar.getInstance();
         calendar.setTime(new Date());
         SysConfig sysConfig = sysConfigMapper.selectConfigByConfigKey("his.package");
@@ -748,29 +752,55 @@ public class FsPackageOrderServiceImpl implements IFsPackageOrderService
             }
         }
 
-        FsPackageOrderComputeParam computeParam=new FsPackageOrderComputeParam();
-        BeanUtil.copyProperties(param,computeParam);
-        if (order.getUserCouponId()!=null&&order.getUserCouponId()>0){
-            computeParam.setUserCouponId(order.getUserCouponId());
-        }
+        Long useUserCouponId = null;
+        if (param.getPreOrderId() != null) {
+            FsPreOrder preOrder = fsPreOrderMapper.selectFsPreOrderById(param.getPreOrderId());
+            if (preOrder == null) {
+                return R.error("预制单不存在");
+            }
+            BigDecimal payMoney = preOrder.getPayMoney() == null ? BigDecimal.ZERO : preOrder.getPayMoney();
+            BigDecimal payPrice = preOrder.getPayableAmount() == null ? BigDecimal.ZERO : preOrder.getPayableAmount();
+            fsPackageOrder.setPayMoney(payMoney);
+            fsPackageOrder.setPayPrice(payPrice);
+            fsPackageOrder.setPayDelivery(BigDecimal.ZERO);
+            fsPackageOrder.setDiscountMoney(preOrder.getDiscountMoney() == null ? BigDecimal.ZERO : preOrder.getDiscountMoney());
+            if(preOrder.getPayType()==3||preOrder.getPayType()==2){
+                BigDecimal payRemain = payPrice.subtract(payMoney);
+                fsPackageOrder.setPayRemain(payRemain.compareTo(BigDecimal.ZERO) < 0 ? BigDecimal.ZERO : payRemain);
+            }else {
+                fsPackageOrder.setPayRemain(BigDecimal.ZERO);
+            }
+            fsPackageOrder.setPreOrderId(preOrder.getPreOrderId());
+            useUserCouponId = param.getUserCouponId();
+            if (useUserCouponId != null && useUserCouponId > 0) {
+                fsPackageOrder.setUserCouponId(useUserCouponId);
+            }
+        } else {
+            FsPackageOrderComputeParam computeParam=new FsPackageOrderComputeParam();
+            BeanUtil.copyProperties(param,computeParam);
+            if (order.getUserCouponId()!=null&&order.getUserCouponId()>0){
+                computeParam.setUserCouponId(order.getUserCouponId());
+            }
 
-        Map<String,Object> moneys=computeOrderMoney(order.getTotalPrice(),computeParam);
-        fsPackageOrder.setPayMoney((BigDecimal)moneys.get("payMoney"));
-        fsPackageOrder.setPayPrice((BigDecimal)moneys.get("payPrice"));
-        fsPackageOrder.setPayDelivery((BigDecimal)moneys.get("payDelivery"));
-        if (param.getUserCouponId()!=null&&param.getUserCouponId()>0){
-            fsPackageOrder.setUserCouponId(param.getUserCouponId());
+            Map<String,Object> moneys=computeOrderMoney(order.getTotalPrice(),computeParam);
+            fsPackageOrder.setPayMoney((BigDecimal)moneys.get("payMoney"));
+            fsPackageOrder.setPayPrice((BigDecimal)moneys.get("payPrice"));
+            fsPackageOrder.setPayDelivery((BigDecimal)moneys.get("payDelivery"));
+            if (param.getUserCouponId()!=null&&param.getUserCouponId()>0){
+                useUserCouponId = param.getUserCouponId();
+                fsPackageOrder.setUserCouponId(param.getUserCouponId());
 
+            }
+            fsPackageOrder.setDiscountMoney((BigDecimal)moneys.get("discountMoney"));
+            fsPackageOrder.setPayRemain((BigDecimal)moneys.get("payRemain"));
         }
-        fsPackageOrder.setDiscountMoney((BigDecimal)moneys.get("discountMoney"));
-        fsPackageOrder.setPayRemain((BigDecimal)moneys.get("payRemain"));
         fsPackageOrder.setPayType(param.getPayType());
         fsPackageOrderMapper.updateFsPackageOrder(fsPackageOrder);
 
-        if (param.getUserCouponId()!=null&&param.getUserCouponId()>0){
-            FsUserCoupon userCoupon=userCouponService.selectFsUserCouponById(param.getUserCouponId());
+        if (useUserCouponId!=null&&useUserCouponId>0){
+            FsUserCoupon userCoupon=userCouponService.selectFsUserCouponById(useUserCouponId);
             FsCoupon coupon=couponService.selectFsCouponByCouponId(userCoupon.getCouponId());
-            if(coupon.getMinPrice().compareTo(order.getPayPrice())==1){
+            if(coupon.getMinPrice().compareTo(fsPackageOrder.getPayPrice())==1){
                 return R.error("优惠劵最低金额大于订单金额");
             }
             userCoupon.setUseTime(new Date());

+ 161 - 57
fs-service/src/main/java/com/fs/his/service/impl/FsPreOrderServiceImpl.java

@@ -5,6 +5,7 @@ import cn.hutool.json.JSONUtil;
 import com.alibaba.fastjson.JSON;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.fs.common.core.domain.R;
+import com.fs.common.core.redis.RedisCache;
 import com.fs.company.domain.CompanyMiniapp;
 import com.fs.company.service.ICompanyMiniappService;
 import com.fs.course.service.IFsCourseLinkService;
@@ -14,9 +15,11 @@ import com.fs.his.dto.InquiryConfigDTO;
 import com.fs.his.mapper.*;
 import com.fs.his.param.FsInquiryOrderCreateParam;
 import com.fs.his.param.FsPackageOrderAddParam;
+import com.fs.his.param.FsPreOrderComputeParam;
 import com.fs.his.service.IFsPreOrderService;
 import com.fs.system.service.ISysConfigService;
 import lombok.AllArgsConstructor;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
@@ -26,6 +29,7 @@ import java.net.URLEncoder;
 import java.nio.charset.StandardCharsets;
 import java.util.Date;
 import java.util.List;
+import java.util.concurrent.TimeUnit;
 import java.util.stream.Collectors;
 
 /**
@@ -48,6 +52,9 @@ public class FsPreOrderServiceImpl implements IFsPreOrderService {
     private final ISysConfigService configService;
     private final ICompanyMiniappService companyMiniappService;
 
+    @Autowired
+    RedisCache redisCache;
+
     @Override
     @Transactional(rollbackFor = Exception.class)
     public R createPackagePreOrderLink(FsPackageOrderAddParam param, Long companyId, Long companyUserId) {
@@ -74,20 +81,14 @@ public class FsPreOrderServiceImpl implements IFsPreOrderService {
             return R.error("地址错误");
         }
         //支付金额
-        BigDecimal totalPrice =param.getPayMoney();
-        BigDecimal payableAmount = param.getPayableAmount() != null ? param.getPayableAmount(): fsPackage.getTotalPrice();
+        BigDecimal payMoney = param.getPayMoney();
+        BigDecimal payableAmount = param.getPayableAmount() != null ? param.getPayableAmount() : fsPackage.getTotalPrice();
+        FsCoupon coupon = null;
         if (param.getCouponId() != null) {
-            R couponCheck = checkPackageCoupon(param.getCouponId(), param.getUserId(), fsPackage);
-            if (couponCheck != null) {
-                return couponCheck;
-            }
-            FsCoupon coupon = fsCouponMapper.selectFsCouponByCouponId(param.getCouponId());
-            payableAmount = payableAmount.subtract(coupon.getPrice() == null ? BigDecimal.ZERO : coupon.getPrice());
-            if (payableAmount.compareTo(BigDecimal.ZERO) < 0) {
-                payableAmount = BigDecimal.ZERO;
-            }
+            coupon = fsCouponMapper.selectFsCouponByCouponId(param.getCouponId());
         }
-        FsPreOrder preOrder = buildPackagePreOrder(param, companyId, companyUserId, totalPrice, payableAmount);
+        FsPreOrder preOrder = buildPackagePreOrder(param, companyId, companyUserId, payMoney, payableAmount);
+        setPreOrderCouponInfo(preOrder, coupon, fsPackage.getTotalPrice(), payableAmount);
         return createPreOrderLink(preOrder, "/pages_index/packageDetails.html");
     }
 
@@ -101,35 +102,36 @@ public class FsPreOrderServiceImpl implements IFsPreOrderService {
         if (patient == null) {
             return R.error("请提交患者信息");
         }
-        BigDecimal payableAmount = BigDecimal.ZERO;
+        BigDecimal payMoney = param.getPayMoney();
+        BigDecimal payableAmount = param.getPayableAmount() != null ? param.getPayableAmount() : getInquiryPrice(param.getDoctorId(), param.getOrderType());
+        FsCoupon coupon = null;
         if (param.getDoctorId() != null) {
             FsDoctor doctor = fsDoctorMapper.selectFsDoctorByDoctorId(param.getDoctorId());
             if (doctor == null) {
                 return R.error("医生不存在");
             }
-            payableAmount = getInquiryPrice(param.getDoctorId(), param.getOrderType());
         }
         if (param.getCouponId() != null) {
-            R couponCheck = checkInquiryCoupon(param.getCouponId(), param.getUserId(), payableAmount, companyId);
-            if (couponCheck != null) {
-                return couponCheck;
-            }
             FsUserCoupon userCoupon = fsUserCouponMapper.selectFsUserCouponById(param.getCouponId());
+            if (userCoupon == null) {
+                userCoupon = fsUserCouponMapper.selectByCouponIdAndUserId(param.getCouponId(), param.getUserId());
+            }
             if (userCoupon != null) {
-                FsCoupon coupon = fsCouponMapper.selectFsCouponByCouponId(userCoupon.getCouponId());
-                if (coupon != null) {
-                    BigDecimal couponPrice = coupon.getPrice() == null ? BigDecimal.ZERO : coupon.getPrice();
-                    payableAmount = payableAmount.subtract(couponPrice);
-                    if (payableAmount.compareTo(BigDecimal.ZERO) < 0) {
-                        payableAmount = BigDecimal.ZERO;
-                    }
-                }
+                coupon = fsCouponMapper.selectFsCouponByCouponId(userCoupon.getCouponId());
             }
         }
-        FsPreOrder preOrder = buildInquiryPreOrder(param, companyId, companyUserId, payableAmount);
+        FsPreOrder preOrder = buildInquiryPreOrder(param, companyId, companyUserId, payMoney, payableAmount);
+        setPreOrderCouponInfo(preOrder, coupon, getInquiryPrice(param.getDoctorId(), param.getOrderType()), payableAmount);
+        setPreOrderkey(preOrder);
         return createPreOrderLink(preOrder, "/pages_order/inquiryForm1.html");
     }
 
+    private  void setPreOrderkey(FsPreOrder preOrder){
+        String uuid = IdUtil.randomUUID();
+        preOrder.setOrderKey(uuid);
+        redisCache.setCacheObject("orderKey:"+uuid,uuid,200, TimeUnit.MINUTES);
+    }
+
     @Override
     public R getPreOrder(Long preOrderId) {
         if (preOrderId == null) {
@@ -139,7 +141,44 @@ public class FsPreOrderServiceImpl implements IFsPreOrderService {
         if (preOrder == null) {
             return R.error("预制单不存在");
         }
-        return R.ok().put("data", preOrder);
+        Long userCouponId = getUserCouponId(preOrder.getCouponId(), preOrder.getUserId());
+        return R.ok()
+                .put("data", preOrder)
+                .put("userCouponId", userCouponId);
+    }
+
+    @Override
+    public R computePreOrderAmount(FsPreOrderComputeParam param) {
+        if (param == null) {
+            return R.error("参数不能为空");
+        }
+        BigDecimal payMoney = param.getPayMoney() == null ? BigDecimal.ZERO : param.getPayMoney();
+        BigDecimal originalPayableAmount = param.getPayableAmount() == null ? payMoney : param.getPayableAmount();
+        BigDecimal payableAmount = originalPayableAmount;
+        BigDecimal discountMoney = BigDecimal.ZERO;
+        String couponName = null;
+        FsCoupon coupon = getPreOrderCoupon(param);
+        if (param.getCouponId() != null && coupon == null) {
+            return R.error("优惠券不存在");
+        }
+        if (coupon != null) {
+            R couponCheck = checkPreOrderCoupon(param, coupon, originalPayableAmount);
+            if (couponCheck != null) {
+                return couponCheck;
+            }
+            couponName = coupon.getTitle();
+            discountMoney = calculateDiscountMoney(param, coupon, originalPayableAmount);
+            payableAmount = originalPayableAmount.subtract(discountMoney);
+            if (payableAmount.compareTo(BigDecimal.ZERO) < 0) {
+                payableAmount = BigDecimal.ZERO;
+            }
+        }
+        return R.ok()
+                .put("payMoney", payMoney)
+                .put("payableAmount", payableAmount)
+                .put("discountMoney", discountMoney)
+                .put("couponName", couponName)
+                .put("couponId", param.getCouponId());
     }
 
     private R createPreOrderLink(FsPreOrder preOrder, String pagePath){
@@ -182,7 +221,19 @@ public class FsPreOrderServiceImpl implements IFsPreOrderService {
                 .put("linkStr", linkStr)
                 .put("shareLink", shareLink);
     }
-
+    private Long getUserCouponId(Long couponId, Long userId) {
+        if (couponId == null) {
+            return null;
+        }
+        FsUserCoupon userCoupon = null;
+        if (userId != null) {
+            userCoupon = fsUserCouponMapper.selectByCouponIdAndUserId(couponId, userId);
+        }
+        if (userCoupon == null) {
+            userCoupon = fsUserCouponMapper.selectFsUserCouponById(couponId);
+        }
+        return userCoupon == null ? null : userCoupon.getId();
+    }
     private String getCompanyFirstAppId(Long companyId) {
         if (companyId == null) {
             return null;
@@ -213,13 +264,12 @@ public class FsPreOrderServiceImpl implements IFsPreOrderService {
         return preOrder;
     }
 
-    private FsPreOrder buildInquiryPreOrder(FsInquiryOrderCreateParam param, Long companyId, Long companyUserId, BigDecimal payableAmount) {
+    private FsPreOrder buildInquiryPreOrder(FsInquiryOrderCreateParam param, Long companyId, Long companyUserId, BigDecimal payMoney, BigDecimal payableAmount) {
         FsPreOrder preOrder = new FsPreOrder();
         preOrder.setPreOrderType(TYPE_INQUIRY);
         preOrder.setCompanyId(companyId);
         preOrder.setCompanyUserId(companyUserId);
         preOrder.setUserId(param.getUserId());
-        preOrder.setOrderKey(param.getOrderKey() == null ? IdUtil.randomUUID() : param.getOrderKey());
         preOrder.setPatientId(param.getPatientId());
         preOrder.setCouponId(param.getCouponId());
         preOrder.setTitle(param.getTitle());
@@ -240,58 +290,112 @@ public class FsPreOrderServiceImpl implements IFsPreOrderService {
         preOrder.setMedication(param.getMedication());
         preOrder.setUsage(param.getUsage());
         preOrder.setSource(param.getSource());
+        preOrder.setPayMoney(payMoney);
         preOrder.setPayableAmount(payableAmount);
         return preOrder;
     }
 
-    private R checkPackageCoupon(Long couponId, Long userId, FsPackage fsPackage) {
-        FsCoupon coupon = fsCouponMapper.selectFsCouponByCouponId(couponId);
+    private void setPreOrderCouponInfo(FsPreOrder preOrder, FsCoupon coupon, BigDecimal payMoney, BigDecimal payableAmount) {
         if (coupon == null) {
-            return R.error("优惠券配置不存在");
+            preOrder.setDiscountMoney(BigDecimal.ZERO);
+            return;
         }
-        if (!Integer.valueOf(5).equals(coupon.getCouponType())) {
-            return R.error("优惠券类型不正确,仅支持套餐优惠券");
+        preOrder.setCouponName(coupon.getTitle());
+        BigDecimal baseAmount = payMoney == null ? BigDecimal.ZERO : payMoney;
+        BigDecimal discountMoney = baseAmount.subtract(payableAmount == null ? BigDecimal.ZERO : payableAmount);
+        if (discountMoney.compareTo(BigDecimal.ZERO) < 0) {
+            discountMoney = BigDecimal.ZERO;
+        }
+        preOrder.setDiscountMoney(discountMoney);
+    }
+
+    private FsCoupon getPreOrderCoupon(FsPreOrderComputeParam param) {
+        if (param.getCouponId() == null) {
+            return null;
+        }
+        if (Integer.valueOf(TYPE_INQUIRY).equals(param.getPreOrderType())) {
+            FsUserCoupon userCoupon = fsUserCouponMapper.selectFsUserCouponById(param.getCouponId());
+            if (userCoupon == null) {
+                userCoupon = fsUserCouponMapper.selectByCouponIdAndUserId(param.getCouponId(), param.getUserId());
+            }
+            return userCoupon == null ? null : fsCouponMapper.selectFsCouponByCouponId(userCoupon.getCouponId());
+        }
+        return fsCouponMapper.selectFsCouponByCouponId(param.getCouponId());
+    }
+
+    private R checkPreOrderCoupon(FsPreOrderComputeParam param, FsCoupon coupon, BigDecimal amount) {
+        R commonCheck = checkCouponConfig(coupon, amount);
+        if (commonCheck != null) {
+            return commonCheck;
+        }
+        if (Integer.valueOf(TYPE_INQUIRY).equals(param.getPreOrderType())) {
+            FsUserCoupon userCoupon = fsUserCouponMapper.selectFsUserCouponById(param.getCouponId());
+            if (userCoupon == null) {
+                userCoupon = fsUserCouponMapper.selectByCouponIdAndUserId(param.getCouponId(), param.getUserId());
+            }
+            return checkUserCoupon(userCoupon, param.getUserId(), coupon);
+        }
+        FsUserCoupon userCoupon = null;
+        if (param.getCouponId() != null && param.getUserId() != null) {
+            userCoupon = fsUserCouponMapper.selectByCouponIdAndUserId(param.getCouponId(), param.getUserId());
+        }
+        return checkUserCoupon(userCoupon, param.getUserId(), coupon);
+    }
+
+    private R checkCouponConfig(FsCoupon coupon, BigDecimal amount) {
+        if (!Integer.valueOf(1).equals(coupon.getStatus())) {
+            return R.error("优惠券已停用");
         }
         if (coupon.getLimitTime() != null && coupon.getLimitTime().before(new Date())) {
             return R.error("优惠券已过期");
         }
-        FsUserCoupon userCoupon = fsUserCouponMapper.selectByCouponIdAndUserId(couponId, userId);
-        if (userCoupon == null) {
-            return R.error("该用户的优惠券不存在");
+        if (coupon.getRemainNumber() != null && coupon.getRemainNumber() <= 0) {
+            return R.error("优惠券剩余数量不足");
         }
-        if (!Integer.valueOf(0).equals(userCoupon.getStatus())) {
-            return R.error("优惠券已使用或已过期");
+        if (coupon.getNumber() != null && coupon.getNumber() <= 0) {
+            return R.error("优惠券数量不足");
+        }
+        BigDecimal baseAmount = amount == null ? BigDecimal.ZERO : amount;
+        if (coupon.getMinPrice() != null && coupon.getMinPrice().compareTo(baseAmount) > 0) {
+            return R.error("未达到优惠券最低消费金额");
         }
         return null;
     }
 
-    private R checkInquiryCoupon(Long userCouponId, Long userId, BigDecimal money, Long companyId) {
-        if (companyId != null && companyId > 0) {
-            return R.error("此订单不能使用优惠券");
-        }
-        FsUserCoupon userCoupon = fsUserCouponMapper.selectFsUserCouponById(userCouponId);
+    private R checkUserCoupon(FsUserCoupon userCoupon, Long userId, FsCoupon coupon) {
         if (userCoupon == null) {
-            return R.error("优惠券不存在");
-        }
-        if (!Integer.valueOf(0).equals(userCoupon.getStatus())) {
-            return R.error("优惠券已过期或已使用");
+            return R.error("该用户的优惠券不存在");
         }
         if (userId != null && userCoupon.getUserId() != null && !userId.equals(userCoupon.getUserId())) {
             return R.error("该用户的优惠券不存在");
         }
-        FsCoupon coupon = fsCouponMapper.selectFsCouponByCouponId(userCoupon.getCouponId());
-        if (coupon == null) {
-            return R.error("优惠券不存在");
+        if (!Integer.valueOf(0).equals(userCoupon.getStatus())) {
+            return R.error("优惠券已使用或已过期");
         }
-        if (Integer.valueOf(2).equals(coupon.getCouponType()) || Integer.valueOf(5).equals(coupon.getCouponType())) {
-            return R.error("此优惠券不可用于问诊订单");
+        if (userCoupon.getLimitTime() != null && userCoupon.getLimitTime().before(new Date())) {
+            return R.error("优惠券已过期");
         }
-        if (Integer.valueOf(1).equals(coupon.getCouponType()) && coupon.getMinPrice() != null && coupon.getMinPrice().compareTo(money) == 1) {
-            return R.error("此优惠券不可用");
+        if (coupon.getCouponId() != null && userCoupon.getCouponId() != null && !coupon.getCouponId().equals(userCoupon.getCouponId())) {
+            return R.error("优惠券不存在");
         }
         return null;
     }
 
+    private BigDecimal calculateDiscountMoney(FsPreOrderComputeParam param, FsCoupon coupon, BigDecimal amount) {
+        BigDecimal baseAmount = amount == null ? BigDecimal.ZERO : amount;
+        if (Integer.valueOf(TYPE_INQUIRY).equals(param.getPreOrderType())) {
+            return baseAmount;
+        }
+        if (Integer.valueOf(2).equals(coupon.getCouponType()) || Integer.valueOf(3).equals(coupon.getCouponType())) {
+            return baseAmount;
+        }
+        if (coupon.getMinPrice() != null && coupon.getMinPrice().compareTo(baseAmount) > 0) {
+            return BigDecimal.ZERO;
+        }
+        BigDecimal couponPrice = coupon.getPrice() == null ? BigDecimal.ZERO : coupon.getPrice();
+        return couponPrice.compareTo(baseAmount) > 0 ? baseAmount : couponPrice;
+    }
+
     private BigDecimal getInquiryPrice(Long doctorId, Integer orderType) {
         String json = configService.selectConfigByKey("his.inquiryConfig");
         InquiryConfigDTO configDTO = JSONUtil.toBean(json, InquiryConfigDTO.class);

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

@@ -45,10 +45,11 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <result property="doctorRemark"    column="doctor_remark"    />
         <result property="source"    column="source"    />
         <result property="triageUserId"    column="triage_user_id"    />
+        <result property="preOrderId"    column="pre_order_id"    />
     </resultMap>
 
     <sql id="selectFsInquiryOrderVo">
-        select order_id,doctor_remark,source,triage_user_id, user_coupon_id,dept_id,company_deduct_money,company_id,company_user_id,company_user_remark,is_send_sms,package_order_id,discount_money, order_sn, title, imgs, user_id, patient_id, order_type, money, pay_money, pay_type, is_pay, doctor_id, create_time, pay_time, status, start_time, finish_time, remark, is_ping, department_id, inquiry_type, inquiry_sub_type, patient_json, is_receive, trade_no, is_audit, audit_user_id, audit_time from fs_inquiry_order
+        select order_id,doctor_remark,source,triage_user_id,pre_order_id, user_coupon_id,dept_id,company_deduct_money,company_id,company_user_id,company_user_remark,is_send_sms,package_order_id,discount_money, order_sn, title, imgs, user_id, patient_id, order_type, money, pay_money, pay_type, is_pay, doctor_id, create_time, pay_time, status, start_time, finish_time, remark, is_ping, department_id, inquiry_type, inquiry_sub_type, patient_json, is_receive, trade_no, is_audit, audit_user_id, audit_time from fs_inquiry_order
     </sql>
 
     <select id="selectFsInquiryOrderList" parameterType="FsInquiryOrder" resultMap="FsInquiryOrderResult">
@@ -131,6 +132,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="doctorRemark != null">doctor_remark,</if>
             <if test="source != null">source,</if>
             <if test="triageUserId != null">triage_user_id,</if>
+            <if test="preOrderId != null">pre_order_id,</if>
         </trim>
         <trim prefix="values (" suffix=")" suffixOverrides=",">
             <if test="orderSn != null">#{orderSn},</if>
@@ -172,6 +174,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="doctorRemark != null">#{doctorRemark},</if>
             <if test="source != null">#{source},</if>
             <if test="triageUserId != null">#{triageUserId},</if>
+            <if test="preOrderId != null">#{preOrderId},</if>
          </trim>
     </insert>
 
@@ -217,6 +220,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="doctorRemark != null">doctor_remark = #{doctorRemark},</if>
             <if test="source != null">source = #{source},</if>
             <if test="triageUserId != null">triage_user_id = #{triageUserId},</if>
+            <if test="preOrderId != null">pre_order_id = #{preOrderId},</if>
         </trim>
         where order_id = #{orderId}
     </update>

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

@@ -60,10 +60,11 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <result property="userCouponId"    column="user_coupon_id"    />
         <result property="icdCode"    column="icd_code"    />
         <result property="source"    column="source"    />
+        <result property="preOrderId"    column="pre_order_id"    />
     </resultMap>
 
     <sql id="selectFsPackageOrderVo">
-        select order_id,icd_code,source,pay_price,user_coupon_id,follow_temp_id,doctor_remark,dept_id,prescribe_price,follow_doctor_id,follow_rate,follow_time,follow_num,package_sub_type,cycle,product_cost_price,inquiry_cost_price,total_cost_price,cost_discount_money,follow_count,pay_remain,pay_delivery,discount_money, order_sn,refund_status,store_id,total_price,address_json,pay_type,remark,inquiry_order_id,pay_time,package_json,patient_json,refund_img,refund_explain,refund_reason,refund_time,refund_money,store_order_id, user_id,form_json, company_id,company_user_id,doctor_id, package_id, package_name,package_second_name, pay_money, is_pay, days, status, start_time, finish_time, create_time from fs_package_order
+        select order_id,icd_code,source,pre_order_id,pay_price,user_coupon_id,follow_temp_id,doctor_remark,dept_id,prescribe_price,follow_doctor_id,follow_rate,follow_time,follow_num,package_sub_type,cycle,product_cost_price,inquiry_cost_price,total_cost_price,cost_discount_money,follow_count,pay_remain,pay_delivery,discount_money, order_sn,refund_status,store_id,total_price,address_json,pay_type,remark,inquiry_order_id,pay_time,package_json,patient_json,refund_img,refund_explain,refund_reason,refund_time,refund_money,store_order_id, user_id,form_json, company_id,company_user_id,doctor_id, package_id, package_name,package_second_name, pay_money, is_pay, days, status, start_time, finish_time, create_time from fs_package_order
     </sql>
 
     <select id="selectFsPackageOrderList" parameterType="FsPackageOrder" resultMap="FsPackageOrderResult">
@@ -148,6 +149,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="userCouponId != null">user_coupon_id,</if>
             <if test="icdCode != null">icd_code,</if>
             <if test="source != null">source,</if>
+            <if test="preOrderId != null">pre_order_id,</if>
          </trim>
         <trim prefix="values (" suffix=")" suffixOverrides=",">
             <if test="orderSn != null">#{orderSn},</if>
@@ -204,6 +206,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="userCouponId != null">#{userCouponId},</if>
             <if test="icdCode != null">#{icdCode},</if>
             <if test="source != null">#{source},</if>
+            <if test="preOrderId != null">#{preOrderId},</if>
         </trim>
     </insert>
 
@@ -264,6 +267,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="userCouponId != null">user_coupon_id = #{userCouponId},</if>
             <if test="icdCode != null">icd_code = #{icdCode},</if>
             <if test="source != null">source = #{source},</if>
+            <if test="preOrderId != null">pre_order_id = #{preOrderId},</if>
         </trim>
         where order_id = #{orderId}
     </update>

+ 6 - 0
fs-service/src/main/resources/mapper/his/FsPreOrderMapper.xml

@@ -13,6 +13,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <result property="patientId" column="patient_id" />
         <result property="packageId" column="package_id" />
         <result property="couponId" column="coupon_id" />
+        <result property="couponName" column="coupon_name" />
+        <result property="discountMoney" column="discount_money" />
         <result property="payType" column="pay_type" />
         <result property="payMoney" column="pay_money" />
         <result property="payableAmount" column="payable_amount" />
@@ -58,6 +60,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="patientId != null">patient_id,</if>
             <if test="packageId != null">package_id,</if>
             <if test="couponId != null">coupon_id,</if>
+            <if test="couponName != null">coupon_name,</if>
+            <if test="discountMoney != null">discount_money,</if>
             <if test="payType != null">pay_type,</if>
             <if test="payMoney != null">pay_money,</if>
             <if test="payableAmount != null">payable_amount,</if>
@@ -96,6 +100,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="patientId != null">#{patientId},</if>
             <if test="packageId != null">#{packageId},</if>
             <if test="couponId != null">#{couponId},</if>
+            <if test="couponName != null">#{couponName},</if>
+            <if test="discountMoney != null">#{discountMoney},</if>
             <if test="payType != null">#{payType},</if>
             <if test="payMoney != null">#{payMoney},</if>
             <if test="payableAmount != null">#{payableAmount},</if>

+ 5 - 5
fs-user-app/src/main/java/com/fs/app/controller/H5Controller.java

@@ -1,12 +1,14 @@
 package com.fs.app.controller;
 
 import cn.hutool.json.JSONUtil;
+import com.fs.common.core.domain.R;
 import com.fs.his.config.AgreementConfig;
 import com.fs.system.service.ISysConfigService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Controller;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
 import org.springframework.web.servlet.ModelAndView;
 
 @Controller
@@ -87,14 +89,12 @@ public class H5Controller
     }
 
     @GetMapping("/orderConfirm")
-    public ModelAndView orderConfirm( )
+    @ResponseBody
+    public R orderConfirm( )
     {
         String json=configService.selectConfigByKey("his.agreementConfig");
         AgreementConfig config= JSONUtil.toBean(json, AgreementConfig.class);
-        ModelAndView mv=new ModelAndView();
-        mv.addObject("orderConfirm", config.getOrderConfirm());
-        mv.setViewName("orderConfirm");
-        return mv;
+        return R.ok().put("orderConfirm", config.getOrderConfirm());
     }