Selaa lähdekoodia

bugfix:微信支付流程完成

lyx 1 viikko sitten
vanhempi
commit
5fe43337ff

+ 12 - 1
alien-entity/src/main/java/shop/alien/entity/store/vo/StoreInfoVo.java

@@ -1,6 +1,6 @@
 package shop.alien.entity.store.vo;
 
-import com.baomidou.mybatisplus.annotation.TableField;
+import com.alibaba.fastjson2.JSONObject;
 import com.fasterxml.jackson.annotation.JsonFormat;
 import com.fasterxml.jackson.annotation.JsonInclude;
 import io.swagger.annotations.ApiModel;
@@ -230,4 +230,15 @@ public class StoreInfoVo extends StoreInfo {
 
     @ApiModelProperty(value = "是否提供餐食")
     private Integer  mealsFlag;
+
+    @ApiModelProperty(value = "身份证正面")
+    private JSONObject idcardFace;
+    @ApiModelProperty(value = "身份证反面")
+    private JSONObject idcardBack;
+    @ApiModelProperty(value = "经营许可证")
+    private JSONObject jyxkz;
+    @ApiModelProperty(value = "食品经营许可证")
+    private JSONObject foodLicence;
+    @ApiModelProperty(value = "娱乐经营许可证")
+    private JSONObject entertainmentLicence;
 }

+ 64 - 1
alien-entity/src/main/java/shop/alien/mapper/LifeUserOrderMapper.java

@@ -33,7 +33,7 @@ public interface LifeUserOrderMapper extends BaseMapper<LifeUserOrder> {
 
     LifeUserOrderVo queryUserOrderDetail(@Param("orderId") String orderId,@Param("position") String position);
 
-    @Select("with total_coupon as(\n" +
+/*    @Select("with total_coupon as(\n" +
             "-- 团购\n" +
             "\tselect id coupon_id,2 coupon_type,lgbm.group_name coupon_name, SUBSTRING_INDEX(image_id, ',', 1) AS image_id,effective_date_type,effective_date_value \n" +
             "from life_group_buy_main lgbm \n" +
@@ -63,6 +63,69 @@ public interface LifeUserOrderMapper extends BaseMapper<LifeUserOrder> {
             "left join  store_comment sc on sc.business_id = luo.id and sc.delete_flag = 0 and sc.business_type = 5\n" +
             "left join life_discount_coupon_user ldcu on ldcu .id = luo.quan_id \n" +
             "left join life_discount_coupon ldc on ldc.id = ldcu.coupon_id \n" +
+            "${ew.customSqlSegment}")*/
+    @Select("with total_coupon as(\n" +
+            "-- 团购\n" +
+            "\tselect id coupon_id,2 coupon_type,lgbm.group_name coupon_name, SUBSTRING_INDEX(image_id, ',', 1) AS image_id,effective_date_type,effective_date_value \n" +
+            "\tfrom life_group_buy_main lgbm \n" +
+            "\tunion all\n" +
+            "-- 代金券\n" +
+            "\tselect id coupon_id,1 coupon_type,lc.name coupon_name, SUBSTRING_INDEX(image_path, ',', 1) AS image_id,0 effective_date_type,expiration_date effective_date_value \n" +
+            "\tfrom life_coupon lc \n" +
+            ")\n" +
+            "select \n" +
+            "    luo.id,\n" +
+            "    luo.buy_time,\n" +
+            "    luo.status,\n" +
+            "    luo.price,\n" +
+            "    luo.final_price,\n" +
+            "    luo.user_id,\n" +
+            "    luo.store_id,\n" +
+            "    luo.order_no,\n" +
+            "    luo.pay_time,\n" +
+            "    luo.cancel_time,\n" +
+            "    luo.finish_time,\n" +
+            "    luo.order_str,\n" +
+            "    luo.expert_order_id,\n" +
+            "    luo.order_appraise,\n" +
+            "    -- 店铺表列:用ANY_VALUE包裹(一个订单对应一个店铺,值唯一)\n" +
+            "    ANY_VALUE(si.store_name) as store_name,\n" +
+            "    ANY_VALUE(si.commission_rate) as commission_rate,\n" +
+            "    ANY_VALUE(si.business_section) as store_type,\n" +
+            "    ANY_VALUE(si.store_status) as store_status,\n" +
+            "    ANY_VALUE(si.business_status) as business_status,\n" +
+            "    -- 聚合列:优惠券数量(唯一聚合列,无需处理)\n" +
+            "    count(ocm.coupon_code) as coupon_count,\n" +
+            "    -- 图片表列:用ANY_VALUE包裹(一个优惠券对应一张图片,值唯一)\n" +
+            "    ANY_VALUE(simg.img_url) as img_url,\n" +
+            "    -- 用户表列:用ANY_VALUE包裹(一个订单对应一个用户,值唯一)\n" +
+            "    ANY_VALUE(lu.user_phone) as user_phone,\n" +
+            "    -- 评论状态:用ANY_VALUE包裹(一个订单最多一条评论,值唯一)\n" +
+            "    ANY_VALUE(IF(sc.id is null,false,true)) as hasComment,\n" +
+            "    -- 优惠券CTE列:拆解tc.*为具体列,用ANY_VALUE包裹\n" +
+            "    ANY_VALUE(tc.coupon_id) as coupon_id,\n" +
+            "    ANY_VALUE(tc.coupon_type) as coupon_type,\n" +
+            "    ANY_VALUE(tc.coupon_name) as coupon_name,\n" +
+            "    ANY_VALUE(tc.image_id) as tc_image_id,\n" +
+            "    ANY_VALUE(tc.effective_date_type) as effective_date_type,\n" +
+            "    ANY_VALUE(tc.effective_date_value) as effective_date_value,\n" +
+            "    -- 异常状态标识:用ANY_VALUE包裹\n" +
+            "    ANY_VALUE(CASE\n" +
+            "        WHEN si.delete_flag = 1 OR si.logout_flag = 1 THEN 1\n" +
+            "        ELSE 0\n" +
+            "    END) AS abnormalStateFlag,\n" +
+            "    -- 折扣券列:用ANY_VALUE包裹(一个订单对应一个折扣券,值唯一)\n" +
+            "    ANY_VALUE(ldc.nominal_value) as nominal_value,\n" +
+            "    ANY_VALUE(ldc.type) as type\n" +
+            "from life_user_order luo\n" +
+            "left join store_info si on si.id = luo.store_id  -- 查询店铺相关 \n" +
+            "left join life_user lu on lu.id = luo.user_id and lu.delete_flag = 0 -- 查询用户相关 \n" +
+            "left join order_coupon_middle ocm on ocm.order_id = luo.id \n" +
+            "left join total_coupon tc on tc.coupon_id = ocm.coupon_id and tc.coupon_type = luo.coupon_type\n" +
+            "left join store_img simg on simg.id = tc.image_id and simg.delete_flag = 0 \n" +
+            "left join store_comment sc on sc.business_id = luo.id and sc.delete_flag = 0 and sc.business_type = 5\n" +
+            "left join life_discount_coupon_user ldcu on ldcu.id = luo.quan_id \n" +
+            "left join life_discount_coupon ldc on ldc.id = ldcu.coupon_id \n" +
             "${ew.customSqlSegment}")
     IPage<LifeUserOrderVo> queryUserOrderList(IPage<LifeUserOrderVo> brandedPage,@Param(Constants.WRAPPER) QueryWrapper<LifeUserOrderVo> lifeUserOrderQueryWrapper);
 

+ 269 - 149
alien-store/src/main/java/shop/alien/store/service/LifeUserOrderService.java

@@ -25,14 +25,11 @@ import shop.alien.entity.store.vo.WebSocketVo;
 import shop.alien.mapper.*;
 import shop.alien.store.config.GaoDeMapUtil;
 import shop.alien.store.config.WebSocketProcess;
+import shop.alien.store.strategy.payment.PaymentStrategyFactory;
 import shop.alien.store.util.ali.AliApi;
 import shop.alien.util.ali.AliOSSUtil;
-import shop.alien.util.common.AlipayTradeRefund;
 import shop.alien.util.common.UniqueRandomNumGenerator;
-import shop.alien.util.common.constant.CouponStatusEnum;
-import shop.alien.util.common.constant.CouponTypeEnum;
-import shop.alien.util.common.constant.DiscountCouponEnum;
-import shop.alien.util.common.constant.OrderStatusEnum;
+import shop.alien.util.common.constant.*;
 
 import java.io.File;
 import java.io.IOException;
@@ -40,6 +37,7 @@ import java.math.BigDecimal;
 import java.math.RoundingMode;
 import java.text.DecimalFormat;
 import java.time.Instant;
+import java.time.LocalDate;
 import java.time.LocalDateTime;
 import java.time.ZoneId;
 import java.time.format.DateTimeFormatter;
@@ -58,12 +56,8 @@ public class LifeUserOrderService extends ServiceImpl<LifeUserOrderMapper, LifeU
 
     private final StoreInfoMapper storeInfoMapper;
 
-    private final AlipayTradeRefund alipayTradeRefund;
-
     private final LifeUserService lifeUserService;
 
-    private final StoreIncomeDetailsRecordMapper storeIncomeDetailsRecordMapper;
-
     private final GaoDeMapUtil gaoDeMapUtil;
 
     private final LifeFansMapper lifeFansMapper;
@@ -77,12 +71,17 @@ public class LifeUserOrderService extends ServiceImpl<LifeUserOrderMapper, LifeU
     private final StoreImgMapper storeImgMapper;
 
     private final StoreUserMapper storeUserMapper;
+
     private final LifeDiscountCouponUserMapper lifeDiscountCouponUserMapper;
+
     private final OrderCouponMiddleService orderCouponMiddleService;
 
     private final AliOSSUtil aliOSSUtil;
+
     private final OrderCouponMiddleMapper orderCouponMiddleMapper;
+
     private final LifeGroupBuyMainMapper lifeGroupBuyMainMapper;
+
     private final AliApi aliApi;
 
     private final LifeDiscountCouponMapper lifeDiscountCouponMapper;
@@ -91,12 +90,11 @@ public class LifeUserOrderService extends ServiceImpl<LifeUserOrderMapper, LifeU
 
     @Value("${spring.web.resources.excel-path}")
     private String excelPath;
-    @Value("${spring.web.resources.excel-clearing-receipt}")
-    private String excelClearingReceipt;
+
     @Value("${spring.web.resources.excel-generate-path}")
     private String excelGeneratePath;
-    @Value("${spring.web.resources.url}")
-    private String fileUrl;
+
+    private final PaymentStrategyFactory paymentStrategyFactory;
 
     public List<Map<String, Object>> getOrderListByStatus(Integer page, Integer size, String userId, String status,
                                                           String quanNameSearch, Integer storeType, String baojiaStatus, String orderNo, Integer storeId) {
@@ -412,22 +410,19 @@ public class LifeUserOrderService extends ServiceImpl<LifeUserOrderMapper, LifeU
      * @return
      */
     @Transactional(rollbackFor = Exception.class)
-    public Map<String, Object> requestRefund(LifeRefundOrder refundOrder) {
-        Map<String, Object> returnMap = new HashMap<>();
-        if (StringUtils.isEmpty(refundOrder.getRefundMoney()) ) {
-            returnMap.put("fail", "退款金额为null");
-            return returnMap;
+    public R<String> requestRefund(LifeRefundOrder refundOrder) {
+        if (StringUtils.isEmpty(refundOrder.getRefundMoney())) {
+            return R.fail("退款金额为null");
         }
         List<OrderCouponMiddle> orderCouponMiddles = orderCouponMiddleMapper.selectList(new QueryWrapper<OrderCouponMiddle>()
-                .eq("order_id", refundOrder.getOrderId()).eq("delete_flag",0));
+                .eq("order_id", refundOrder.getOrderId()).eq("delete_flag", 0));
         // 1.查询订单信息  订单表 + 中间表
         LifeUserOrder order = lifeUserOrderMapper.selectById(refundOrder.getOrderId());
         Integer refundCouponAmount = refundOrder.getRefundCouponAmount();
         // 待使用的券(可退款的券 || 退款失败的券 目前没做失败的券状态更新 暂时不加)
         List<OrderCouponMiddle> orderCouponMiddles1 = orderCouponMiddles.stream().filter(orderCouponMiddle -> orderCouponMiddle.getStatus() == OrderStatusEnum.WAIT_USE.getStatus()).collect(Collectors.toList());
         if (orderCouponMiddles1.size() < refundCouponAmount) {
-            returnMap.put("fail", "退款券数不足");
-            return returnMap;
+            return R.fail("退款券数不足");
         }
         // 判断累计退款金额
         BigDecimal totalRefundMoney = new BigDecimal(refundOrder.getRefundMoney());
@@ -439,25 +434,49 @@ public class LifeUserOrderService extends ServiceImpl<LifeUserOrderMapper, LifeU
             totalRefundMoney = totalRefundMoney.add(new BigDecimal(lifeRefundOrder.getRefundMoney()));
             refundCouponCount += lifeRefundOrder.getRefundCouponAmount();
         }
-        if(totalRefundMoney.compareTo(new BigDecimal(order.getFinalPrice()))>0){
-            returnMap.put("fail","退款金额(已退+当前退)不能大于订单金额");
-            return returnMap;
+        if (totalRefundMoney.compareTo(new BigDecimal(order.getFinalPrice())) > 0) {
+            return R.fail("退款金额(已退+当前退)不能大于订单金额");
         }
         Date now = new Date();
         boolean ifPartialRefund = false;
         String PartialRefundCode = "";
         // 只要本次退款不是全退都是部分退
-        if (refundCouponAmount != orderCouponMiddles.size()){
+        if (refundCouponAmount != orderCouponMiddles.size()) {
             ifPartialRefund = true;
             PartialRefundCode = UniqueRandomNumGenerator.generateUniqueCode(12);
         }
-        String result = aliApi.processRefund(order.getOrderNo(), refundOrder.getRefundMoney(), refundOrder.getDescription(),PartialRefundCode);
+        // TODO 微信/支付宝退款接口
+        // 获取paymethod 并且构建 请求参数
+        String payMethod = order.getPayMethod();
+        String payType = "";
+        Map<String, String> params = new HashMap<>();
+        if("支付宝支付".equals(payMethod)) {
+            payType = PaymentEnum.ALIPAY.getType();
+            params.put("outTradeNo", order.getOrderNo());
+            params.put("refundAmount", refundOrder.getRefundMoney());
+            params.put("refundReason", refundOrder.getDescription());
+            params.put("partialRefundCode",PartialRefundCode);
+        } else {
+            payType = PaymentEnum.WECHAT_PAY.getType();
+            params.put("outTradeNo", order.getOrderNo());
+            params.put("reason", refundOrder.getReason() == null ? "退款" : refundOrder.getReason());
+            params.put("refundAmount", String.valueOf(new BigDecimal(refundOrder.getRefundMoney()).multiply(new BigDecimal(100)).longValue()));
+            params.put("totalAmount", String.valueOf(new BigDecimal(order.getFinalPrice()).multiply(new BigDecimal(100)).longValue()));
+        }
+        // 调用支付策略
+        String result = "";
+        try {
+            result = paymentStrategyFactory.getStrategy(payType).handleRefund(params);
+        } catch (Exception e) {
+            log.error(String.format("LifeUserOrderService requestRefund error, payType: %s, params: %s, error: %s", payType, params, e.getMessage()));
+            return R.fail(e.getMessage());
+        }
         String refundMessage = "";
 
         // 更新的中间表id
         List<Integer> updateIds = orderCouponMiddles1.stream().limit(refundCouponAmount).map(x -> x.getId()).collect(Collectors.toList());
         if (!result.equals("调用成功")) {
-            refundMessage = "编号为"+order.getOrderNo()+"的订单退款失败,请重新发起申请。";
+            refundMessage = "编号为" + order.getOrderNo() + "的订单退款失败,请重新发起申请。";
             // TODO 退款失败目前不做处理
             /*orderCouponMiddleMapper.update(null,new UpdateWrapper<OrderCouponMiddle>().in("id",updateIds)
                     .set("status",OrderStatusEnum.REFUND_FAILED.getStatus())
@@ -466,39 +485,38 @@ public class LifeUserOrderService extends ServiceImpl<LifeUserOrderMapper, LifeU
                     .set("refund_reason",refundOrder.getReason()));
             // 退款记录
             refundOrder.setApplicationTime(now).setRefundTime(now).setStatus(1);*/
-            returnMap.put("success", refundMessage);
-            return returnMap;
+            return R.fail(refundMessage);
         } else {
-            refundMessage = "编号为"+order.getOrderNo()+"的订单已退款成功,退款金额"+refundOrder.getRefundMoney()+"元,已返还至您的支付渠道,请注意查收";
-            orderCouponMiddleMapper.update(null,new UpdateWrapper<OrderCouponMiddle>().in("id",updateIds)
-                    .set("status",OrderStatusEnum.REFUND.getStatus())
-                    .set("refund_time",now)
-                    .set(ifPartialRefund,"partial_refund_code",PartialRefundCode)
-                    .set("refund_reason",refundOrder.getReason()));
+            refundMessage = "编号为" + order.getOrderNo() + "的订单已退款成功,退款金额" + refundOrder.getRefundMoney() + "元,已返还至您的支付渠道,请注意查收";
+            orderCouponMiddleMapper.update(null, new UpdateWrapper<OrderCouponMiddle>().in("id", updateIds)
+                    .set("status", OrderStatusEnum.REFUND.getStatus())
+                    .set("refund_time", now)
+                    .set(ifPartialRefund, "partial_refund_code", PartialRefundCode)
+                    .set("refund_reason", refundOrder.getReason()));
             // 退款记录
             refundOrder.setApplicationTime(now).setRefundTime(now).setStatus(0);
-            if(ifPartialRefund){
+            if (ifPartialRefund) {
                 refundOrder.setPartialRefundCode(PartialRefundCode);
             }
         }
         // 更新总订单数据(中间表数据+订单表数据:当已退款个数+当前退款个数=已使用的券数时,订单状态改为已退款)
         if (refundCouponCount + refundCouponAmount == orderCouponMiddles.size()) {
-            lifeUserOrderMapper.update(null,new UpdateWrapper<LifeUserOrder>().eq("id",order.getId())
-                    .set("status",OrderStatusEnum.REFUND.getStatus())
-                    .set("refund_time",now)
-                    .set("finish_time",now));
+            lifeUserOrderMapper.update(null, new UpdateWrapper<LifeUserOrder>().eq("id", order.getId())
+                    .set("status", OrderStatusEnum.REFUND.getStatus())
+                    .set("refund_time", now)
+                    .set("finish_time", now));
             if (null != order.getQuanId()) {
-                lifeDiscountCouponUserMapper.update(null,new UpdateWrapper<LifeDiscountCouponUser>().eq("id",order.getQuanId())
-                        .set("status",DiscountCouponEnum.WAITING_USED.getValue()).set("use_time",null));
-            }   else {
+                lifeDiscountCouponUserMapper.update(null, new UpdateWrapper<LifeDiscountCouponUser>().eq("id", order.getQuanId())
+                        .set("status", DiscountCouponEnum.WAITING_USED.getValue()).set("use_time", null));
+            } else {
                 // 处理 quanId 为 null 的情况,例如日志记录
                 log.error("更新优惠券状态失败");
             }
         } else if (refundCouponCount + refundCouponAmount != orderCouponMiddles.size() && refundCouponAmount == orderCouponMiddles1.size()) {
             // 累计退券个数+当前退券个数!=总个数 且 当前退券数量 = 可退券数
-            lifeUserOrderMapper.update(null,new UpdateWrapper<LifeUserOrder>().eq("id",order.getId())
-                    .set("status",OrderStatusEnum.COMPLETE.getStatus())
-                    .set("finish_time",now));
+            lifeUserOrderMapper.update(null, new UpdateWrapper<LifeUserOrder>().eq("id", order.getId())
+                    .set("status", OrderStatusEnum.COMPLETE.getStatus())
+                    .set("finish_time", now));
         }
 
         // 将退款记录插入到数据库中
@@ -513,6 +531,7 @@ public class LifeUserOrderService extends ServiceImpl<LifeUserOrderMapper, LifeU
             lifeMessage.setSenderId("system");
             lifeMessage.setIsRead(0);
             lifeMessage.setNoticeType(2);
+            lifeMessage.setTitle("退款成功");
             lifeNoticeMapper.insert(lifeMessage);
 
             WebSocketVo websocketVo = new WebSocketVo();
@@ -534,19 +553,19 @@ public class LifeUserOrderService extends ServiceImpl<LifeUserOrderMapper, LifeU
         Integer couponId = orderCouponMiddle.getCouponId();
 
         restoreInventory(couponType, refundCouponAmount, couponId);
-        returnMap.put("success", refundMessage);
-        return returnMap;
+        return R.success(refundMessage);
     }
 
     /**
      * 退款,取消订单时候,恢复库存
-     * @param couponType 类型 1-代金券,2-团购
+     *
+     * @param couponType         类型 1-代金券,2-团购
      * @param refundCouponAmount 团购券/代金券张数
-     * @param couponId 团购券/代金券id
+     * @param couponId           团购券/代金券id
      */
     private void restoreInventory(Integer couponType, Integer refundCouponAmount, Integer couponId) {
-        try{
-            if( CouponTypeEnum.COUPON.getCode() == couponType){
+        try {
+            if (CouponTypeEnum.COUPON.getCode() == couponType) {
                 // 代金券信息
                 lifeCouponMapper.update(null, new LambdaUpdateWrapper<LifeCoupon>()
                         .setSql("single_qty=single_qty+" + refundCouponAmount)
@@ -554,13 +573,11 @@ public class LifeUserOrderService extends ServiceImpl<LifeUserOrderMapper, LifeU
 
                 //判断当前时间在开始时间start_date和结束时间end_date之间,并且库存single_qty大于0,则修改状态status为5
                 lifeCouponMapper.update(null, new LambdaUpdateWrapper<LifeCoupon>()
-                        .set(LifeCoupon::getStatus, 5)
+                        .set(LifeCoupon::getStatus, CouponStatusEnum.ONGOING.getCode())
                         .eq(LifeCoupon::getId, couponId)
-                        .le(LifeCoupon::getStartDate, LocalDateTime.now())
-                        .ge(LifeCoupon::getEndDate, LocalDateTime.now())
+                        .le(LifeCoupon::getStartDate, LocalDate.now())
+                        .ge(LifeCoupon::getEndDate, LocalDate.now())
                         .gt(LifeCoupon::getSingleQty, 0));
-
-
             } else {
                 // 团购信息
                 lifeGroupBuyMainMapper.update(null, new LambdaUpdateWrapper<LifeGroupBuyMain>()
@@ -569,10 +586,10 @@ public class LifeUserOrderService extends ServiceImpl<LifeUserOrderMapper, LifeU
 
                 //判断当前时间在开始时间start_date和结束时间end_date之间,并且库存single_qty大于0,则修改状态status为5
                 lifeGroupBuyMainMapper.update(null, new LambdaUpdateWrapper<LifeGroupBuyMain>()
-                        .set(LifeGroupBuyMain::getStatus, 5)
+                        .set(LifeGroupBuyMain::getStatus, CouponStatusEnum.ONGOING.getCode())
                         .eq(LifeGroupBuyMain::getId, couponId)
-                        .le(LifeGroupBuyMain::getStartTimeValue, LocalDateTime.now())
-                        .ge(LifeGroupBuyMain::getEndTime, LocalDateTime.now())
+                        .le(LifeGroupBuyMain::getStartTimeValue, LocalDate.now())
+                        .ge(LifeGroupBuyMain::getEndTime, LocalDate.now())
                         .gt(LifeGroupBuyMain::getInventoryNum, 0));
             }
         } catch (Exception e) {
@@ -583,13 +600,14 @@ public class LifeUserOrderService extends ServiceImpl<LifeUserOrderMapper, LifeU
 
     /**
      * 退款检查
+     *
      * @param refundOrder
      * @return
      */
-    public Map<String, Object> refundCheck(Map<String,String> refundOrder) {
+    public Map<String, Object> refundCheck(Map<String, String> refundOrder) {
         Map<String, Object> returnMap = new HashMap<>();
         LifeUserOrder order = lifeUserOrderMapper.selectById(refundOrder.get("orderId"));
-        if( null == order){
+        if (null == order) {
             returnMap.put("success", "不可退款");
             returnMap.put("reason", "未查询到订单");
             return returnMap;
@@ -616,7 +634,7 @@ public class LifeUserOrderService extends ServiceImpl<LifeUserOrderMapper, LifeU
      */
     public Integer getAvailableOrderNumByOrderNo(String orderNo) {
         // 统计可用优惠劵数量
-        return orderCouponMiddleMapper.selectCount(new QueryWrapper<OrderCouponMiddle>().inSql("id","select id from life_user_order where order_no = " + orderNo ));
+        return orderCouponMiddleMapper.selectCount(new QueryWrapper<OrderCouponMiddle>().inSql("id", "select id from life_user_order where order_no = " + orderNo));
     }
 
     public String exportExcel(String orderNo, String storeId, String quanName, String baojiaStatus, String status) throws IOException {
@@ -659,24 +677,44 @@ public class LifeUserOrderService extends ServiceImpl<LifeUserOrderMapper, LifeU
             String orderNum = orderDetails.toString();
             List<LifeUserOrder> order = orderDetailsGrouped.getOrDefault(orderNum, Collections.emptyList());
             LifeUserOrder lifeUserOrder = order.get(0);
-            LifeCoupon quan = lifeCouponMapper.selectById(lifeUserOrder.getQuanId());
+            LifeUserOrderExcelVo lifeUserOrderExcelVo = new LifeUserOrderExcelVo();
+            if (lifeUserOrder.getCouponType() == 1) {
+                if (null != lifeUserOrder.getQuanId() && !"".equals(lifeUserOrder.getQuanId())) {
+                    LifeDiscountCouponUser lifeDiscountCouponUser = lifeDiscountCouponUserMapper.selectById(lifeUserOrder.getQuanId());
+                    LifeCoupon quan = lifeCouponMapper.selectById(lifeDiscountCouponUser.getCouponId());
+                    if (null != quan) {
+                        lifeUserOrderExcelVo.setCouponName(quan.getName());
+                        lifeUserOrderExcelVo.setImage(quan.getImagePath());
+                        lifeUserOrderExcelVo.setPrice("¥" + quan.getPrice());
+                    }
+                }
+            } else {
+                OrderCouponMiddle orderCouponMiddle = orderCouponMiddleMapper.selectOne(new LambdaQueryWrapper<OrderCouponMiddle>().eq(OrderCouponMiddle::getOrderId, lifeUserOrder.getId()));
+                LifeGroupBuyMain lifeGroupBuyMain = lifeGroupBuyMainMapper.selectOne(new LambdaQueryWrapper<LifeGroupBuyMain>().eq(LifeGroupBuyMain::getId, orderCouponMiddle.getCouponId()));
+                lifeUserOrderExcelVo.setCouponName(lifeGroupBuyMain.getGroupName());
+                lifeUserOrderExcelVo.setImage(storeImgMapper.selectById(Integer.parseInt(lifeGroupBuyMain.getImageId())).getImgUrl());
+                lifeUserOrderExcelVo.setPrice("¥" + lifeGroupBuyMain.getPreferentialPrice());
+            }
             QueryWrapper<StoreInfoVo> queryWrapper = new QueryWrapper<>();
             queryWrapper.eq("a.id", lifeUserOrder.getStoreId());
             StoreInfoVo storeInfoVoOne = storeInfoMapper.getStoreInfoVoOne(queryWrapper);
-            LifeUserOrderExcelVo lifeUserOrderExcelVo = new LifeUserOrderExcelVo();
             lifeUserOrderExcelVo.setSerialNumber(++serialNumber);
             lifeUserOrderExcelVo.setOrderNo(lifeUserOrder.getOrderNo());
             lifeUserOrderExcelVo.setStoreId(lifeUserOrder.getStoreId());
-            lifeUserOrderExcelVo.setCouponName(quan.getName());
-            lifeUserOrderExcelVo.setImage(quan.getImagePath());
-            lifeUserOrderExcelVo.setPrice("¥" + quan.getPrice());
+
             lifeUserOrderExcelVo.setStoreContact(storeInfoVoOne.getStoreContact());
             lifeUserOrderExcelVo.setPhone(storeInfoVoOne.getStorePhone());
-            Instant instant = lifeUserOrder.getPayTime().toInstant();
-            // 格式化时间
-            String formattedTime = instant.atZone(ZoneId.systemDefault()).toLocalDateTime().format(formatter);
-            lifeUserOrderExcelVo.setPayTime(formattedTime);
-            lifeUserOrderExcelVo.setFinishTime(formattedTime);
+            if (lifeUserOrder.getStatus() == 4) {
+                Instant instant = lifeUserOrder.getCancelTime().toInstant();
+                String formattedTime = instant.atZone(ZoneId.systemDefault()).toLocalDateTime().format(formatter);
+                lifeUserOrderExcelVo.setCancelTime(formattedTime);
+            } else if(lifeUserOrder.getStatus() != 0){
+                Instant instant = lifeUserOrder.getPayTime().toInstant();
+                // 格式化时间
+                String formattedTime = instant.atZone(ZoneId.systemDefault()).toLocalDateTime().format(formatter);
+                lifeUserOrderExcelVo.setPayTime(formattedTime);
+                lifeUserOrderExcelVo.setFinishTime(formattedTime);
+            }
             lifeUserOrderExcelVo.setOrderStatus(String.valueOf(lifeUserOrder.getStatus()));
             // 订单状态转换
             switch (lifeUserOrder.getStatus()) {
@@ -713,10 +751,11 @@ public class LifeUserOrderService extends ServiceImpl<LifeUserOrderMapper, LifeU
 
     /**
      * 创建用户订单
+     *
      * @param lifeUserOrderDto 构造数据用
      */
     @Transactional(rollbackFor = Exception.class)
-    public Map<String, Object> createUserOrder(LifeUserOrderDto lifeUserOrderDto) {
+    public R createUserOrder(LifeUserOrderDto lifeUserOrderDto) {
         Date date = new Date();
         //1.创建订单
         LifeUserOrder lifeUserOrder = new LifeUserOrder();
@@ -805,14 +844,14 @@ public class LifeUserOrderService extends ServiceImpl<LifeUserOrderMapper, LifeU
         }
 // 判断库存扣减结果
         if (updateRows == 0) {
-            log.error("couponid:"+lifeUserOrderDto.getCouponId()+" 库存不足,当前购买数量:"+ buyCount);
+            log.error("couponid:" + lifeUserOrderDto.getCouponId() + " 库存不足,当前购买数量:" + buyCount);
             // 手动抛出异常,触发事务回滚(回滚之前创建的订单和优惠券状态变更)
-            throw new RuntimeException("库存不足,下单失败");
+            return R.fail("库存不足,下单失败");
         }
         returnMap.put("success", "下单成功");
         returnMap.put("orderNo", lifeUserOrderDto.getOrderNo());
         returnMap.put("lifeUserOrder", lifeUserOrder);
-        return returnMap;
+        return R.data(returnMap);
     }
 
     /**
@@ -824,32 +863,32 @@ public class LifeUserOrderService extends ServiceImpl<LifeUserOrderMapper, LifeU
     public boolean updateUserOrder(LifeUserOrderDto lifeUserOrderDto) {
         Date date = new Date();
         LifeUserOrder lifeUserOrder = lifeUserOrderMapper.selectById(lifeUserOrderDto.getId());
-        if ( null == lifeUserOrder){
+        if (null == lifeUserOrder) {
             log.error("updateUserOrder未查询到订单");
             return false;
         }
         UpdateWrapper<OrderCouponMiddle> orderCouponMiddleUpdateWrapper = new UpdateWrapper<>();
-        orderCouponMiddleUpdateWrapper.eq("order_id",lifeUserOrderDto.getId());
+        orderCouponMiddleUpdateWrapper.eq("order_id", lifeUserOrderDto.getId());
         // 根据状态判断怎么更新数据 目前只进行已支付,已取消,已过期判断
-        switch (lifeUserOrderDto.getStatus()){
+        switch (lifeUserOrderDto.getStatus()) {
             case 1:
                 lifeUserOrder.setPayTime(date);
                 lifeUserOrder.setPayMethod(lifeUserOrderDto.getPayMethod());
                 lifeUserOrder.setStatus(lifeUserOrderDto.getStatus());
                 lifeUserOrder.setOrderNo(lifeUserOrderDto.getOrderNo());
-                orderCouponMiddleUpdateWrapper.set("status",lifeUserOrderDto.getStatus());
+                orderCouponMiddleUpdateWrapper.set("status", lifeUserOrderDto.getStatus());
                 break;
             case 3:
             case 4:
                 lifeUserOrder.setStatus(lifeUserOrderDto.getStatus());
                 lifeUserOrder.setCancelTime(date);
                 lifeUserOrder.setFinishTime(date);
-                orderCouponMiddleUpdateWrapper.set("status",lifeUserOrderDto.getStatus());
+                orderCouponMiddleUpdateWrapper.set("status", lifeUserOrderDto.getStatus());
                 break;
         }
         // 查询券id->查询一个
         int updateNum = orderCouponMiddleMapper.update(null, orderCouponMiddleUpdateWrapper);
-        if(1 != lifeUserOrderDto.getStatus()) {
+        if (1 != lifeUserOrderDto.getStatus()) {
             List<OrderCouponMiddle> orderCouponMiddles = orderCouponMiddleMapper.selectList(new QueryWrapper<OrderCouponMiddle>().eq("order_id", lifeUserOrderDto.getId()));
             if (0 != updateNum && orderCouponMiddles.size() > 0) {
                 Integer couponId = orderCouponMiddles.get(0).getCouponId();
@@ -866,12 +905,13 @@ public class LifeUserOrderService extends ServiceImpl<LifeUserOrderMapper, LifeU
 
     /**
      * 删除用户订单,删除需要判断订单状态并且删除中间关系
+     *
      * @param orderId 订单id
      */
     @Transactional
     public boolean deleteUserOrder(String orderId) {
         LifeUserOrder lifeUserOrder = lifeUserOrderMapper.selectById(orderId);
-        if ( null == lifeUserOrder){
+        if (null == lifeUserOrder) {
             log.error("deleteUserOrder未查询到订单");
             return false;
         }
@@ -883,32 +923,33 @@ public class LifeUserOrderService extends ServiceImpl<LifeUserOrderMapper, LifeU
         }
         // 删除中间关系
         UpdateWrapper<OrderCouponMiddle> orderCouponMiddleUpdateWrapper = new UpdateWrapper<>();
-        orderCouponMiddleUpdateWrapper.eq("order_id",orderId);
+        orderCouponMiddleUpdateWrapper.eq("order_id", orderId);
         return this.removeById(orderId) && orderCouponMiddleService.remove(orderCouponMiddleUpdateWrapper);
     }
 
     /**
      * 查询用户订单列表
-     * @param page 页码
-     * @param size 每页数量
-     * @param userId 用户id
+     *
+     * @param page       页码
+     * @param size       每页数量
+     * @param userId     用户id
      * @param couponType 订单类型
-     * @param name 店铺名称
+     * @param name       店铺名称
      */
-    public IPage<LifeUserOrderVo> queryUserOrderList(Integer page, Integer size, String userId, String storeId, String couponType,String orderStatus, String name, String startTime, String endTime) {
+    public IPage<LifeUserOrderVo> queryUserOrderList(Integer page, Integer size, String userId, String storeId, String couponType, String orderStatus, String name, String startTime, String endTime) {
         IPage<LifeUserOrderVo> brandedPage = new Page<>(page, size);
         QueryWrapper<LifeUserOrderVo> lifeUserOrderQueryWrapper = new QueryWrapper<>();
-        lifeUserOrderQueryWrapper.eq(org.apache.commons.lang3.StringUtils.isNotBlank(userId),"luo.user_id",userId);
-        lifeUserOrderQueryWrapper.eq(org.apache.commons.lang3.StringUtils.isNotBlank(storeId),"luo.store_id",storeId);
-        lifeUserOrderQueryWrapper.eq(null != couponType && !"-1".equals(couponType),"luo.coupon_type",couponType);
+        lifeUserOrderQueryWrapper.eq(org.apache.commons.lang3.StringUtils.isNotBlank(userId), "luo.user_id", userId);
+        lifeUserOrderQueryWrapper.eq(org.apache.commons.lang3.StringUtils.isNotBlank(storeId), "luo.store_id", storeId);
+        lifeUserOrderQueryWrapper.eq(null != couponType && !"-1".equals(couponType), "luo.coupon_type", couponType);
 
         // 提取SQL基础部分,避免重复定义
         String baseSql = "select DISTINCT ocm1.order_id from order_coupon_middle ocm1 where 1=1";
         // TODO 应该可以直接判断总表
         if (!"-1".equals(orderStatus)) {
             // 非-1状态:直接添加状态条件
-                String sql = baseSql + " and ocm1.status = " + orderStatus;
-            if("2".equals(orderStatus)){
+            String sql = baseSql + " and ocm1.status = " + orderStatus;
+            if ("2".equals(orderStatus)) {
                 // 已完成进行特殊处理,
                 sql = sql + " and ocm1.order_id not in (\n" +
                         "\tselect\n" +
@@ -924,34 +965,35 @@ public class LifeUserOrderService extends ServiceImpl<LifeUserOrderMapper, LifeU
             // -1状态且storeId不为空时添加条件
             if (org.apache.commons.lang3.StringUtils.isNotBlank(storeId)) {
                 // 注意:原代码中的concat不会修改原字符串,需要重新赋值
-                String sql = baseSql + " and ocm1.status not in  ("+OrderStatusEnum.WAIT_PAY.getStatus()
-                        +","+OrderStatusEnum.EXPIRE.getStatus()
-                        +","+OrderStatusEnum.CANCEL.getStatus()
-                        +")";
+                String sql = baseSql + " and ocm1.status not in  (" + OrderStatusEnum.WAIT_PAY.getStatus()
+                        + "," + OrderStatusEnum.EXPIRE.getStatus()
+                        + "," + OrderStatusEnum.CANCEL.getStatus()
+                        + "," + OrderStatusEnum.REFUND.getStatus()
+                        + ")";
                 lifeUserOrderQueryWrapper.inSql("luo.id", sql);
             }
         }
-        lifeUserOrderQueryWrapper.like(org.apache.commons.lang3.StringUtils.isNotBlank(name),"tc.coupon_name",name);
-        lifeUserOrderQueryWrapper.gt(org.apache.commons.lang3.StringUtils.isNotBlank(startTime),"luo.created_time",startTime + " 00:00:00");
-        lifeUserOrderQueryWrapper.lt(org.apache.commons.lang3.StringUtils.isNotBlank(endTime),"luo.created_time",endTime + " 23:59:59");
-        lifeUserOrderQueryWrapper.eq("luo.delete_flag",0);
+        lifeUserOrderQueryWrapper.like(org.apache.commons.lang3.StringUtils.isNotBlank(name), "tc.coupon_name", name);
+        lifeUserOrderQueryWrapper.gt(org.apache.commons.lang3.StringUtils.isNotBlank(startTime), "luo.created_time", startTime + " 00:00:00");
+        lifeUserOrderQueryWrapper.lt(org.apache.commons.lang3.StringUtils.isNotBlank(endTime), "luo.created_time", endTime + " 23:59:59");
+        lifeUserOrderQueryWrapper.eq("luo.delete_flag", 0);
         lifeUserOrderQueryWrapper.orderByDesc("luo.created_time");
-        lifeUserOrderQueryWrapper.groupBy("luo.coupon_type","luo.id");
+        lifeUserOrderQueryWrapper.groupBy("luo.coupon_type", "luo.id");
         IPage<LifeUserOrderVo> lifeUserOrderVoIPage = lifeUserOrderMapper.queryUserOrderList(brandedPage, lifeUserOrderQueryWrapper);
         if (!"-1".equals(orderStatus)) {
-            lifeUserOrderVoIPage.getRecords().forEach(x->x.setStatus(Integer.parseInt(orderStatus)));
+            lifeUserOrderVoIPage.getRecords().forEach(x -> x.setStatus(Integer.parseInt(orderStatus)));
         }
         // 计算退款金额
         for (LifeUserOrderVo record : lifeUserOrderVoIPage.getRecords()) {
-            record.setOrderCouponMiddleList(orderCouponMiddleMapper.selectList(new QueryWrapper<OrderCouponMiddle>().eq("order_id",record.getId())));
+            record.setOrderCouponMiddleList(orderCouponMiddleMapper.selectList(new QueryWrapper<OrderCouponMiddle>().eq("order_id", record.getId())));
             calcExpectIncome(record);
             // 如果代金券为平台优惠券并且是商户查询,则需要计算代金券金额
-            if("3".equals(record.getType()) && org.apache.commons.lang3.StringUtils.isNotBlank(record.getStoreId())){
+            if ("3".equals(record.getType()) && org.apache.commons.lang3.StringUtils.isNotBlank(record.getStoreId())) {
                 // 如果付款为0,商家收入为套餐原价
-                if(record.getFinalPrice().equals("0")){
+                if (record.getFinalPrice().equals("0")) {
                     // 如果付款为0,商家收入为套餐原价*数量
                     record.setFinalPrice(new BigDecimal(record.getPrice()).multiply(new BigDecimal(record.getCouponCount().toString())).toString());
-                }else {
+                } else {
                     record.setFinalPrice(record.getNominalValue().add(new BigDecimal(record.getFinalPrice())).toString());
                 }
             }
@@ -961,12 +1003,13 @@ public class LifeUserOrderService extends ServiceImpl<LifeUserOrderMapper, LifeU
 
     /**
      * 查询用户订单详情
+     *
      * @param orderId
      * @return
      */
-    public R<LifeUserOrderVo> queryUserOrderDetail(String orderId,String longitude, String latitude) {
-        LifeUserOrderVo lifeUserOrderVo = lifeUserOrderMapper.queryUserOrderDetail(orderId,org.apache.commons.lang3.StringUtils.isNotBlank(longitude) && org.apache.commons.lang3.StringUtils.isNotBlank(latitude)?longitude+","+latitude:"");
-        if ( null == lifeUserOrderVo){
+    public R<LifeUserOrderVo> queryUserOrderDetail(String orderId, String longitude, String latitude) {
+        LifeUserOrderVo lifeUserOrderVo = lifeUserOrderMapper.queryUserOrderDetail(orderId, org.apache.commons.lang3.StringUtils.isNotBlank(longitude) && org.apache.commons.lang3.StringUtils.isNotBlank(latitude) ? longitude + "," + latitude : "");
+        if (null == lifeUserOrderVo) {
             log.error("queryUserOrderDetail未查询到订单");
             return R.fail("未查询到订单");
         }
@@ -982,14 +1025,14 @@ public class LifeUserOrderService extends ServiceImpl<LifeUserOrderMapper, LifeU
         // 预计收入
         // 退款金额
         BigDecimal refundAmount = new BigDecimal(0);
-        if(!CollectionUtils.isEmpty(refundList)){
+        if (!CollectionUtils.isEmpty(refundList)) {
             refundAmount = refundList.stream().map(OrderCouponMiddle::getPrice).reduce(BigDecimal.ZERO, BigDecimal::add);
         }
         // 预计收入
         BigDecimal expectIncome = BigDecimal.ZERO;
         // 如果使用了平台优惠券则预计收入特殊处理
-        if("3".equals(lifeUserOrderVo.getType())){
-            if(lifeUserOrderVo.getFinalPrice().equals("0")){
+        if ("3".equals(lifeUserOrderVo.getType())) {
+            if (lifeUserOrderVo.getFinalPrice().equals("0")) {
                 // 如果付款为0,商家收入为套餐原价*数量
                 expectIncome = new BigDecimal(lifeUserOrderVo.getPrice()).multiply(new BigDecimal(orderCouponMiddleList.size()));
             } else {
@@ -1022,33 +1065,34 @@ public class LifeUserOrderService extends ServiceImpl<LifeUserOrderMapper, LifeU
 
     /**
      * 平台端-查询订单列表
-     * @param page 页码
-     * @param size 每页数量
-     * @param orderNo 订单号
-     * @param orderStatus 订单状态
-     * @param couponName 优惠券名称
-     * @param couponType 优惠券类型
-     * @param storeName 店铺名称
-     * @param buyStartTime 购买时间开始
-     * @param buyEndTime 购买时间结束
-     * @param payStartTime 支付时间开始
-     * @param payEndTime 支付时间结束
+     *
+     * @param page            页码
+     * @param size            每页数量
+     * @param orderNo         订单号
+     * @param orderStatus     订单状态
+     * @param couponName      优惠券名称
+     * @param couponType      优惠券类型
+     * @param storeName       店铺名称
+     * @param buyStartTime    购买时间开始
+     * @param buyEndTime      购买时间结束
+     * @param payStartTime    支付时间开始
+     * @param payEndTime      支付时间结束
      * @param finishStartTime 完成时间开始
-     * @param finishEndTime 完成时间结束
+     * @param finishEndTime   完成时间结束
      */
     public IPage<LifeUserOrderVo> queryOrderList(Integer page, Integer size, String orderNo, String orderStatus, String couponName, String couponType, String storeName, String buyStartTime, String buyEndTime, String payStartTime, String payEndTime, String finishStartTime, String finishEndTime) {
         IPage<LifeUserOrderVo> brandedPage = new Page<>(page, size);
         QueryWrapper<LifeUserOrderVo> lifeUserOrderQueryWrapper = new QueryWrapper<>();
-        lifeUserOrderQueryWrapper.like(org.apache.commons.lang3.StringUtils.isNotBlank(orderNo),"luo.order_no",orderNo);
-        lifeUserOrderQueryWrapper.like(org.apache.commons.lang3.StringUtils.isNotBlank(couponName),"tc.coupon_name",couponName);
-        lifeUserOrderQueryWrapper.eq(org.apache.commons.lang3.StringUtils.isNotBlank(couponType),"tc.coupon_type",couponType);
-        lifeUserOrderQueryWrapper.like(org.apache.commons.lang3.StringUtils.isNotBlank(storeName),"si.store_name",storeName);
-        lifeUserOrderQueryWrapper.gt(org.apache.commons.lang3.StringUtils.isNotBlank(buyStartTime),"luo.buy_time",buyStartTime + " 00:00:00");
-        lifeUserOrderQueryWrapper.lt(org.apache.commons.lang3.StringUtils.isNotBlank(buyEndTime),"luo.buy_time",buyEndTime + " 23:59:59");
-        lifeUserOrderQueryWrapper.gt(org.apache.commons.lang3.StringUtils.isNotBlank(payStartTime),"luo.pay_time",payStartTime + " 00:00:00");
-        lifeUserOrderQueryWrapper.lt(org.apache.commons.lang3.StringUtils.isNotBlank(payEndTime),"luo.pay_time",payEndTime + " 23:59:59");
-        lifeUserOrderQueryWrapper.gt(org.apache.commons.lang3.StringUtils.isNotBlank(finishStartTime),"luo.finish_time",finishStartTime + " 00:00:00");
-        lifeUserOrderQueryWrapper.lt(org.apache.commons.lang3.StringUtils.isNotBlank(finishEndTime),"luo.finish_time",finishEndTime + " 23:59:59");
+        lifeUserOrderQueryWrapper.like(org.apache.commons.lang3.StringUtils.isNotBlank(orderNo), "luo.order_no", orderNo);
+        lifeUserOrderQueryWrapper.like(org.apache.commons.lang3.StringUtils.isNotBlank(couponName), "tc.coupon_name", couponName);
+        lifeUserOrderQueryWrapper.eq(org.apache.commons.lang3.StringUtils.isNotBlank(couponType), "tc.coupon_type", couponType);
+        lifeUserOrderQueryWrapper.like(org.apache.commons.lang3.StringUtils.isNotBlank(storeName), "si.store_name", storeName);
+        lifeUserOrderQueryWrapper.gt(org.apache.commons.lang3.StringUtils.isNotBlank(buyStartTime), "luo.buy_time", buyStartTime + " 00:00:00");
+        lifeUserOrderQueryWrapper.lt(org.apache.commons.lang3.StringUtils.isNotBlank(buyEndTime), "luo.buy_time", buyEndTime + " 23:59:59");
+        lifeUserOrderQueryWrapper.gt(org.apache.commons.lang3.StringUtils.isNotBlank(payStartTime), "luo.pay_time", payStartTime + " 00:00:00");
+        lifeUserOrderQueryWrapper.lt(org.apache.commons.lang3.StringUtils.isNotBlank(payEndTime), "luo.pay_time", payEndTime + " 23:59:59");
+        lifeUserOrderQueryWrapper.gt(org.apache.commons.lang3.StringUtils.isNotBlank(finishStartTime), "luo.finish_time", finishStartTime + " 00:00:00");
+        lifeUserOrderQueryWrapper.lt(org.apache.commons.lang3.StringUtils.isNotBlank(finishEndTime), "luo.finish_time", finishEndTime + " 23:59:59");
 //            @ApiImplicitParam(name = "orderStatus", value = "订单状态,-1,全部(可以不传);0,待支付;1,已支付/待使用;2,已核销;3,已过期;4,已取消;5.已退款,全退款了才算", required = false),
         // 提取SQL基础部分,避免重复定义
 //        String baseSql = "select DISTINCT ocm1.order_id from order_coupon_middle ocm1 where 1=1";
@@ -1057,42 +1101,114 @@ public class LifeUserOrderService extends ServiceImpl<LifeUserOrderMapper, LifeU
             // 非-1状态:直接添加状态条件
 //            String sql = baseSql + " and ocm1.status = " + orderStatus;
 //            lifeUserOrderQueryWrapper.inSql("luo.id", sql);
-            lifeUserOrderQueryWrapper.eq("ocm.status",orderStatus);
+            lifeUserOrderQueryWrapper.eq("luo.status", orderStatus);
         }
         lifeUserOrderQueryWrapper.groupBy("luo.id");
         IPage<LifeUserOrderVo> lifeUserOrderVoIPage = lifeUserOrderMapper.queryUserOrderList(brandedPage, lifeUserOrderQueryWrapper);
 
         if (!"-1".equals(orderStatus)) {
-            lifeUserOrderVoIPage.getRecords().forEach(x->x.setStatus(Integer.parseInt(orderStatus)));
+            lifeUserOrderVoIPage.getRecords().forEach(x -> x.setStatus(Integer.parseInt(orderStatus)));
+        }
+        return lifeUserOrderVoIPage;
+    }
+
+    /**
+     * 平台-查询订单列表
+     *
+     * @param page            页码
+     * @param size            每页数量
+     * @param orderNo         订单号
+     * @param orderStatus     订单状态
+     * @param couponName      优惠券名称
+     * @param couponType      优惠券类型
+     * @param storeName       店铺名称
+     * @param buyStartTime    购买时间开始
+     * @param buyEndTime      购买时间结束
+     * @param payStartTime    支付时间开始
+     * @param payEndTime      支付时间结束
+     * @param finishStartTime 完成时间开始
+     * @param finishEndTime   完成时间结束
+     */
+    public IPage<LifeUserOrderVo> queryPlatformOrderList(Integer page, Integer size, String orderNo, String orderStatus, String couponName, String couponType, String storeName, String buyStartTime, String buyEndTime, String payStartTime, String payEndTime, String finishStartTime, String finishEndTime) {
+        IPage<LifeUserOrderVo> brandedPage = new Page<>(page, size);
+        QueryWrapper<LifeUserOrderVo> lifeUserOrderQueryWrapper = new QueryWrapper<>();
+        lifeUserOrderQueryWrapper.like(org.apache.commons.lang3.StringUtils.isNotBlank(orderNo), "luo.order_no", orderNo);
+        lifeUserOrderQueryWrapper.like(org.apache.commons.lang3.StringUtils.isNotBlank(couponName), "tc.coupon_name", couponName);
+        lifeUserOrderQueryWrapper.eq(org.apache.commons.lang3.StringUtils.isNotBlank(couponType), "tc.coupon_type", couponType);
+        lifeUserOrderQueryWrapper.like(org.apache.commons.lang3.StringUtils.isNotBlank(storeName), "si.store_name", storeName);
+        lifeUserOrderQueryWrapper.gt(org.apache.commons.lang3.StringUtils.isNotBlank(buyStartTime), "luo.buy_time", buyStartTime + " 00:00:00");
+        lifeUserOrderQueryWrapper.lt(org.apache.commons.lang3.StringUtils.isNotBlank(buyEndTime), "luo.buy_time", buyEndTime + " 23:59:59");
+        lifeUserOrderQueryWrapper.gt(org.apache.commons.lang3.StringUtils.isNotBlank(payStartTime), "luo.pay_time", payStartTime + " 00:00:00");
+        lifeUserOrderQueryWrapper.lt(org.apache.commons.lang3.StringUtils.isNotBlank(payEndTime), "luo.pay_time", payEndTime + " 23:59:59");
+        lifeUserOrderQueryWrapper.gt(org.apache.commons.lang3.StringUtils.isNotBlank(finishStartTime), "luo.finish_time", finishStartTime + " 00:00:00");
+        lifeUserOrderQueryWrapper.lt(org.apache.commons.lang3.StringUtils.isNotBlank(finishEndTime), "luo.finish_time", finishEndTime + " 23:59:59");
+
+//            @ApiImplicitParam(name = "orderStatus", value = "订单状态,-1,全部(可以不传);0,待支付;1,已支付/待使用;2,已核销;3,已过期;4,已取消;5.已退款,全退款了才算", required = false),
+        // 提取SQL基础部分,避免重复定义
+//        String baseSql = "select DISTINCT ocm1.order_id from order_coupon_middle ocm1 where 1=1";
+
+        if (!"-1".equals(orderStatus)) {
+            // 非-1状态:直接添加状态条件
+//            String sql = baseSql + " and ocm1.status = " + orderStatus;
+//            lifeUserOrderQueryWrapper.inSql("luo.id", sql);
+            lifeUserOrderQueryWrapper.eq("luo.status", orderStatus);
+        } else {
+            lifeUserOrderQueryWrapper.in("luo.status", 0,1,4,5,7);
+        }
+
+        lifeUserOrderQueryWrapper.groupBy("luo.id");
+        IPage<LifeUserOrderVo> lifeUserOrderVoIPage = lifeUserOrderMapper.queryPlatformOrderList(brandedPage, lifeUserOrderQueryWrapper);
+
+        if (!"-1".equals(orderStatus)) {
+            lifeUserOrderVoIPage.getRecords().forEach(x -> x.setStatus(Integer.parseInt(orderStatus)));
         }
         return lifeUserOrderVoIPage;
     }
 
     /**
      * 平台端-查询订单详情
+     *
      * @param orderId
      * @return
      */
     public R queryOrderDetail(String orderId) {
-        LifeUserOrderVo lifeUserOrderVo = lifeUserOrderMapper.queryUserOrderDetail(orderId,null);
-        if ( null == lifeUserOrderVo){
+        LifeUserOrderVo lifeUserOrderVo = lifeUserOrderMapper.queryUserOrderDetail(orderId, null);
+        if (null == lifeUserOrderVo) {
             log.error("queryUserOrderDetail未查询到订单");
             return R.fail("未查询到订单");
         }
         // 退款记录
         calcExpectIncome(lifeUserOrderVo);
         lifeUserOrderVo.setCouponCount(lifeUserOrderVo.getOrderCouponMiddleList().size());
+        // 查询订单图片列表
+        String imgIds = lifeUserOrderVo.getImgIds();
+        if(StringUtils.isNotEmpty(imgIds)){
+            LambdaQueryWrapper<StoreImg> storeImgLambdaQueryWrapper = new LambdaQueryWrapper<>();
+            List<String> imgIdList = Arrays.stream(imgIds.split(","))
+                    .map(String::trim)
+                    .collect(Collectors.toList());
+            storeImgLambdaQueryWrapper.in(StoreImg::getId, imgIdList);
+            List<StoreImg> storeImgList = storeImgMapper.selectList(storeImgLambdaQueryWrapper);
+            if(CollectionUtils.isNotEmpty(storeImgList)){
+                List<String> imgUrlList = storeImgList.stream()    // 转换为 Stream
+                        .map(StoreImg::getImgUrl)                  // 映射,提取 name 字段
+                        .collect(Collectors.toList());
+                lifeUserOrderVo.setImgUrls(imgUrlList);
+            }
+        }
         return R.data(lifeUserOrderVo);
     }
+
     /**
      * 团购/代金券-校验用户是否可以购买
-     * @param couponId 团购/代金券id
+     *
+     * @param couponId   团购/代金券id
      * @param couponType 团购/代金券类型
-     * @param userId 用户id
-     * @param count 购买数量
+     * @param userId     用户id
+     * @param count      购买数量
      * @return
      */
-    public Map<String, Object> buyCouponCheck(String couponId, Integer couponType, String userId,String storeId, Integer count) {
+    public Map<String, Object> buyCouponCheck(String couponId, Integer couponType, String userId, String storeId, Integer count) {
         Map<String, Object> returnMap = new HashMap<>();
         // 获取团购/代金券信息
         Integer status = 0;
@@ -1114,7 +1230,7 @@ public class LifeUserOrderService extends ServiceImpl<LifeUserOrderMapper, LifeU
                 buyLimit = Integer.parseInt(lifeGroupBuyMain.getQuotaValue());
                 // 已购数量
                 buyCount = orderCouponMiddleMapper.selectCount(new QueryWrapper<OrderCouponMiddle>().eq("coupon_id", couponId).notIn("status", OrderStatusEnum.CANCEL.getStatus(), OrderStatusEnum.REFUND.getStatus())
-                        .inSql("order_id", "select order_id from life_user_order where user_id = " + userId + " and store_id = " + storeId));
+                        .inSql("order_id", "select id from life_user_order where user_id = " + userId + " and store_id = " + storeId));
             }
             // 库存 inventory_num
             stockQty = lifeGroupBuyMain.getInventoryNum();
@@ -1127,7 +1243,7 @@ public class LifeUserOrderService extends ServiceImpl<LifeUserOrderMapper, LifeU
             buyLimit = Integer.parseInt(lifeCoupon.getPurchaseLimitCode());
             // 已购数量
             buyCount = orderCouponMiddleMapper.selectCount(new QueryWrapper<OrderCouponMiddle>().eq("coupon_id", couponId).notIn("status", OrderStatusEnum.CANCEL.getStatus(), OrderStatusEnum.REFUND.getStatus())
-                    .inSql("order_id", "select order_id from life_user_order where user_id = " + userId + " and store_id = " + storeId));
+                    .inSql("order_id", "select id from life_user_order where user_id = " + userId + " and store_id = " + storeId));
             stockQty = lifeCoupon.getSingleQty();
             endTime = lifeCoupon.getEndDate();
         } else {
@@ -1139,14 +1255,18 @@ public class LifeUserOrderService extends ServiceImpl<LifeUserOrderMapper, LifeU
         // 状态(0草稿/1待审核/2未开始/3审核拒绝/4已售罄/5进行中/6已下架/7已结束/8=2+手动下架)
         if (status != CouponStatusEnum.ONGOING.getCode()) {
             returnMap.put("success", false);
-            returnMap.put("reason", "团购/代金券未开始");
+            if (status == CouponStatusEnum.SOLD_OUT.getCode()) {
+                returnMap.put("reason", "团购/代金券已售罄");
+            } else {
+                returnMap.put("reason", "团购/代金券未开始");
+            }
             return returnMap;
         }
         // 限购
         if (0 != buyLimit) {
             if (buyCount + count > buyLimit) {
                 returnMap.put("success", false);
-                returnMap.put("reason", "购买数量大于限购数量");
+                returnMap.put("reason", "已达限购上限");
                 return returnMap;
             }
         }

+ 41 - 0
alien-store/src/main/java/shop/alien/store/service/impl/StoreInfoServiceImpl.java

@@ -1782,6 +1782,14 @@ public class StoreInfoServiceImpl extends ServiceImpl<StoreInfoMapper, StoreInfo
         if (!storeDictionaries.isEmpty()) {
             result.setBusinessStatusStr(storeDictionaries.get(0).getDictDetail());
         }
+        // TODO 之后修改********** 正常OcrType由前端传存储ocr表要加新字段。传参要由前端传。
+        // 查询并设置各类证件OCR信息
+        result.setJyxkz(convertOcrResultToJson(storeUser.getId(), "BUSINESS_LICENSE", "娱乐", true));
+        result.setIdcardFace(convertOcrResultToJson(storeUser.getId(), "ID_CARD", "face", true));
+        result.setIdcardBack(convertOcrResultToJson(storeUser.getId(), "ID_CARD", "back", true));
+        result.setFoodLicence(convertOcrResultToJson(storeUser.getId(), "FOOD_MANAGE_LICENSE", null, true));
+        result.setEntertainmentLicence(convertOcrResultToJson(storeUser.getId(), "BUSINESS_LICENSE", "营业执照", false));
+
         return result;
     }
 
@@ -4955,5 +4963,38 @@ public class StoreInfoServiceImpl extends ServiceImpl<StoreInfoMapper, StoreInfo
         return resultPage;
     }
 
+    /**
+     * 查询OCR图片上传记录并转换为JSONObject
+     *
+     * @param storeUserId 店铺用户ID
+     * @param ocrType     OCR类型
+     * @param likeKeyword 模糊查询关键词,可为null
+     * @param includeImageUrl 是否包含imageUrl字段
+     * @return JSONObject,如果查询结果为空则返回空的JSONObject
+     */
+    private com.alibaba.fastjson2.JSONObject convertOcrResultToJson(Integer storeUserId, String ocrType, String likeKeyword, boolean includeImageUrl) {
+        LambdaQueryWrapper<OcrImageUpload> wrapper = new LambdaQueryWrapper<OcrImageUpload>()
+                .eq(OcrImageUpload::getStoreUserId, storeUserId)
+                .eq(OcrImageUpload::getOcrType, ocrType)
+                .orderByDesc(OcrImageUpload::getCreateTime)
+                .last("limit 1");
+        
+        if (StringUtils.isNotEmpty(likeKeyword)) {
+            wrapper.like(OcrImageUpload::getOcrResult, likeKeyword);
+        }
+        
+        OcrImageUpload ocrImageUpload = ocrImageUploadMapper.selectOne(wrapper);
+        
+        if (ocrImageUpload == null || StringUtils.isEmpty(ocrImageUpload.getOcrResult())) {
+            return new com.alibaba.fastjson2.JSONObject();
+        }
+        
+        com.alibaba.fastjson2.JSONObject jsonObject = com.alibaba.fastjson2.JSONObject.parseObject(ocrImageUpload.getOcrResult());
+        if (includeImageUrl && StringUtils.isNotEmpty(ocrImageUpload.getImageUrl())) {
+            jsonObject.put("imageUrl", ocrImageUpload.getImageUrl());
+        }
+        
+        return jsonObject;
+    }
 
 }