Sfoglia il codice sorgente

refactor(app): 优化订单和验票相关功能

-撤销验票记录时更新订单状态为待使用
- 查询订单时增加用户电话字段
- 创建订单时增加重复预约检查
- 优化订单信息展示,增加场地名称和预约提示信息
-调整订单创建逻辑,适应不同产品类型
wzq 3 settimane fa
parent
commit
a85714227a

+ 2 - 2
national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/app/controller/OrderController.java

@@ -16,8 +16,8 @@ import org.jeecg.modules.app.service.IOrderService;
 import org.jeecg.modules.app.vo.OrderVO;
 import org.jeecg.modules.app.vo.PageOrdersVO;
 import org.jeecg.modules.app.vo.QueryOrderVerifyRecordsVO;
-import org.simpleframework.xml.core.Validate;
 import org.springframework.format.annotation.DateTimeFormat;
+import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 
 import javax.annotation.Resource;
@@ -127,7 +127,7 @@ public class OrderController {
     @Operation(summary = "订单-创建")
     @RepeatSubmit(serviceId = "createOrder", limitType = RepeatSubmit.Type.PARAM, lockTime = 3)
     @PostMapping("/createOrder")
-    public Result<UserPayForm> createOrder(@Validate @RequestBody CreateOrderForm createOrderForm) throws IOException {
+    public Result<UserPayForm> createOrder(@Validated @RequestBody CreateOrderForm createOrderForm) throws IOException {
         return Result.ok(appOrderService.createOrder(createOrderForm));
     }
 

+ 0 - 12
national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/app/controller/commercial/CommercialController.java

@@ -25,7 +25,6 @@ import org.jeecg.modules.system.app.form.VerifyForm;
 import org.jeecg.modules.system.app.service.*;
 import org.springframework.web.bind.annotation.*;
 
-import javax.servlet.http.HttpServletRequest;
 import java.text.ParseException;
 import java.util.ArrayList;
 import java.util.Comparator;
@@ -241,17 +240,6 @@ public class CommercialController {
         return Result.OK(appIsinService.repealVerifyRecord(appIsinId));
     }
 
-    /**
-     * 支付异步通知
-     *
-     * @param request
-     * @return
-     */
-    @PostMapping("/payNotify")
-    public String wechatPayNotify(HttpServletRequest request) {
-        return "支付回调成功";
-    }
-
     private final RedissonDelayQueue redissonDelayQueue;
     /**
      * 测试超时未支付延时任务

+ 2 - 0
national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/app/dto/AppOrderInfoDTO.java

@@ -141,6 +141,8 @@ public class AppOrderInfoDTO implements Serializable {
     @Schema(description = "提示/须知")
     private String reminder;
 
+    @Schema(description = "预约:0否 1是")
+    private Integer orSubscribe;
     //提前预约时间:0免预约 单位:时
     @Schema(description = "提前预约时间:0免预约 单位:时")
     private Integer advanceTime;

+ 29 - 0
national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/app/service/impl/AppIsinServiceImpl.java

@@ -1,16 +1,24 @@
 package org.jeecg.modules.app.service.impl;
 
 import cn.hutool.core.util.ObjectUtil;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import lombok.extern.log4j.Log4j2;
+import org.jeecg.common.constant.CommonConstant;
 import org.jeecg.common.exception.JeecgBootException;
 import org.jeecg.modules.app.service.IAppIsinService;
 import org.jeecg.modules.app.vo.AppIsinVerifyVO;
 import org.jeecg.modules.system.app.entity.AppIsin;
+import org.jeecg.modules.system.app.entity.AppOrder;
+import org.jeecg.modules.system.app.entity.AppOrderProInfo;
 import org.jeecg.modules.system.app.mapper.AppIsinMapper;
+import org.jeecg.modules.system.app.mapper.AppOrderMapper;
+import org.jeecg.modules.system.app.mapper.AppOrderProInfoMapper;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 
+import javax.annotation.Resource;
 import java.text.ParseException;
 import java.text.SimpleDateFormat;
 import java.util.Calendar;
@@ -19,12 +27,19 @@ import java.util.Date;
 @Service
 @Log4j2
 public class AppIsinServiceImpl extends ServiceImpl<AppIsinMapper, AppIsin> implements IAppIsinService {
+
+    @Resource
+    private AppOrderProInfoMapper appOrderProInfoMapper;
+    @Resource
+    private AppOrderMapper appOrderMapper;
+
     @Override
     public Page<AppIsinVerifyVO> pageAppIsinVerifyRecords(Page<AppIsinVerifyVO> page, String orgCode) {
         return baseMapper.pageAppIsinVerifyRecords(page,orgCode);
     }
 
     @Override
+    @Transactional(rollbackFor = Exception.class)
     public String repealVerifyRecord(String appIsinId) throws ParseException {
 
         AppIsin appIsin = this.getById(appIsinId);
@@ -51,6 +66,20 @@ public class AppIsinServiceImpl extends ServiceImpl<AppIsinMapper, AppIsin> impl
             appIsin.setIsinStatus(2);
         }
         this.updateById(appIsin);
+
+       //查询订单,修改订单状态为待使用
+        AppOrderProInfo appOrderProInfo = appOrderProInfoMapper.selectOne(Wrappers.<AppOrderProInfo>lambdaQuery().eq(AppOrderProInfo::getTicketNo, appIsin.getTicketNo()));
+        if(ObjectUtil.isNotEmpty(appOrderProInfo)){
+            appOrderProInfo.setOrderStatus(1);
+            appOrderProInfoMapper.updateById(appOrderProInfo);
+        }
+        String orderId = appOrderProInfo.getOrderId();
+        AppOrder appOrder = appOrderMapper.selectById(orderId);
+        if (ObjectUtil.isNotEmpty(appOrder)){
+            appOrder.setOrderStatus(CommonConstant.ORDER_STATUS_1);
+            appOrderMapper.updateById(appOrder);
+        }
+
         return "撤销成功!";
     }
 

+ 25 - 2
national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/app/service/impl/OrderServiceImpl.java

@@ -526,6 +526,17 @@ public class OrderServiceImpl implements IOrderService {
 
                     String productId = createOrderForm.getProductIds();
 
+                    //判断是否已下单
+                    List<String> familyIds = Arrays.stream(createOrderForm.getFamilyIds().split(",")).collect(Collectors.toList());
+                    AppOrderProInfo proInfo = appOrderProInfoMapper.selectOne(Wrappers.<AppOrderProInfo>lambdaQuery()
+                            .eq(AppOrderProInfo::getProductId, productId)
+                            .in(AppOrderProInfo::getFamilyUserId, familyIds)
+                    );
+                    if (ObjectUtil.isNotEmpty(proInfo)) {
+                        String userName = proInfo.getUserName();
+                        throw new JeecgBootException(userName + "已预约过该场地的同一日期和时段,无需重复预约,请直接进场。");
+                    }
+
                     productKey = "ORDER_TYPE_1_PRODUCT_" + productId; // ORDER_TYPE_1_PRODUCT_N001
                     stockKey = "ORDER_TYPE_1_PRODUCT_STOCK_" + productId; // ORDER_TYPE_1_PRODUCT_STOCK_N001
 
@@ -638,8 +649,9 @@ public class OrderServiceImpl implements IOrderService {
                         appOrderProInfo.setProductName(date.substring(5) + " " + startTime + "-" + endTime + "|" + appSitePlace.getName());
                         appOrderProInfo.setProductImage(appSitePlace.getCover());
                         appOrderProInfo.setExpireTime(expireTime);
-                        appOrderProInfo.setAddress(appSite.getAddress());
+                        appOrderProInfo.setAddress(appSite.getName());
                         appOrderProInfo.setType(CommonConstant.ORDER_PRO_INFO_TYPE_1);
+                        appOrderProInfo.setProductImage(appSite.getCover());
                         appOrderProInfo.setOriginalPrice(priceRule.getOriginalPrice());
                         appOrderProInfo.setPrice(priceRule.getSellingPrice());
                         appOrderProInfo.setOrderStatus(0);
@@ -817,6 +829,15 @@ public class OrderServiceImpl implements IOrderService {
 
                     String familyUserId = createOrderForm.getFamilyIds().split(",")[i - 1];
                     FamilyMembers familyMembers = familyMembersMapper.selectById(familyUserId);
+
+                    //判断当前课程是否已下过单
+                    List<AppOrderProInfo> infos = appOrderProInfoMapper.selectList(Wrappers.<AppOrderProInfo>lambdaQuery()
+                            .eq(AppOrderProInfo::getProductId, appCourse.getId())
+                            .eq(AppOrderProInfo::getFamilyUserId, familyUserId)
+                            .eq(AppOrderProInfo::getOrFreePro, CommonConstant.STATUS_1_INT));
+                    if (ObjectUtil.isNotEmpty(infos)) {
+                        throw new JeecgBootException("当前课程已下过单,请勿重复下单");
+                    }
                     AppOrderProInfo appOrderProInfo = new AppOrderProInfo();
                     appOrderProInfo.setProductId(createOrderForm.getProductIds());
                     appOrderProInfo.setProductName(appCourse.getName());
@@ -1003,7 +1024,7 @@ public class OrderServiceImpl implements IOrderService {
                         .setExpireTime(appOrderProInfo.getExpireTime())
                         //生成10位随机券号
                         .setTicketNo(appOrderProInfo.getTicketNo())
-                        .setIsinStatus(CommonConstant.ISIN_STATUS_1);
+                        .setIsinStatus(CommonConstant.ISIN_STATUS_0);
                 appIsinMapper.insert(appIsin);
             }
             if (Objects.equals(appOrderProInfo.getType(), CommonConstant.ORDER_PRO_INFO_TYPE_0)) {
@@ -1319,6 +1340,8 @@ public class OrderServiceImpl implements IOrderService {
                 appOrderInfoDTO.setStartTime(site.getStartTime());
                 appOrderInfoDTO.setEndTime(site.getEndTime());
                 appOrderInfoDTO.setRefundType(appSitePlace.getRefundType());
+                appOrderInfoDTO.setOrSubscribe(appSitePlace.getOrSubscribe());
+                appOrderInfoDTO.setAdvanceTime(appSitePlace.getAdvanceTime());
                 //地址信息
                 appOrderInfoDTO.setSchoolAddress(site.getAddress());
                 appOrderInfoDTO.setLatitude(site.getLatitude());

+ 11 - 6
national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/system/app/mapper/xml/AppOrderMapper.xml

@@ -3,22 +3,25 @@
 <mapper namespace="org.jeecg.modules.system.app.mapper.AppOrderMapper">
 
     <select id="queryPage" resultType="org.jeecg.modules.system.app.vo.OrderPageVO">
-        SELECT
+        SELECT b.* FROM (SELECT
         o.id,
         o.order_code,
         o.create_time,
         s.`name` siteName,
         o.amount,
-        o.price
+        o.price,
+        GROUP_CONCAT( DISTINCT opi.user_phone ) userPhone
         FROM
         nm_order o
         LEFT JOIN nm_site s ON s.org_code = o.org_code
+        LEFT JOIN nm_order_pro_info opi ON opi.order_id = o.id
         <where>
+            o.del_flag = 0
             <if test="appOrderPageForm.orgCode != null and appOrderPageForm.orgCode !=''">
                 and o.org_code like CONCAT(#{appOrderPageForm.orgCode},'%')
             </if>
             <if test="appOrderPageForm.userPhone != null and appOrderPageForm.userPhone !=''">
-                and o.user_phone LIKE CONCAT('%',#{appOrderPageForm.userPhone},'%')
+                and opi.user_phone LIKE CONCAT('%',#{appOrderPageForm.userPhone},'%')
             </if>
             <if test="appOrderPageForm.orderCode != null and appOrderPageForm.orderCode !=''">
                 and o.order_code LIKE CONCAT('%',#{appOrderPageForm.orderCode},'%')
@@ -30,13 +33,15 @@
                 and o.after_sale_status = #{appOrderPageForm.afterSaleStatus}
             </if>
             <if test="appOrderPageForm.startTime != null">
-                and DATE_FORMAT(create_time,'%Y-%m-%d %H:%i:%s') <![CDATA[ >= ]]> #{appOrderPageForm.startTime}
+                and DATE_FORMAT(o.create_time,'%Y-%m-%d %H:%i:%s') <![CDATA[ >= ]]> #{appOrderPageForm.startTime}
             </if>
             <if test="appOrderPageForm.endTime != null">
-                and DATE_FORMAT(create_time,'%Y-%m-%d %H:%i:%s') <![CDATA[ <= ]]> #{appOrderPageForm.endTime}
+                and DATE_FORMAT(o.create_time,'%Y-%m-%d %H:%i:%s') <![CDATA[ <= ]]> #{appOrderPageForm.endTime}
             </if>
         </where>
-        ORDER BY o.create_time DESC
+        GROUP BY o.id
+        ORDER BY o.create_time DESC) AS b
+
     </select>
     <select id="countTypeAndProductIds" resultType="java.lang.Integer">
         select  count(1) from nm_order where product_ids in

+ 11 - 9
national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/system/app/service/impl/AppOrderServiceImpl.java

@@ -113,7 +113,6 @@ public class AppOrderServiceImpl extends ServiceImpl<AppOrderMapper, AppOrder> i
         Page<OrderPageVO> page = new Page<>(appOrderPageForm.getPageNo(), appOrderPageForm.getPageSize());
 
         Page<OrderPageVO> voPage = baseMapper.queryPage(page, appOrderPageForm);
-
         voPage.getRecords().forEach(vo -> {
             List<AppOrderProInfo> proInfoList = appOrderProInfoMapper.selectList(Wrappers.<AppOrderProInfo>lambdaQuery().eq(AppOrderProInfo::getOrderId, vo.getId()));
             vo.setOrderProInfoList(proInfoList);
@@ -177,7 +176,7 @@ public class AppOrderServiceImpl extends ServiceImpl<AppOrderMapper, AppOrder> i
         //核销记录
         List<VerificationRecordDTO> verificationRecordDTOList = new ArrayList<>();
 
-        List<AppIsin> appIsinList = appIsinMapper.selectList(Wrappers.<AppIsin>lambdaQuery().eq(AppIsin::getOrderId, orderId).eq(AppIsin::getIsinStatus, 2));
+        List<AppIsin> appIsinList = appIsinMapper.selectList(Wrappers.<AppIsin>lambdaQuery().eq(AppIsin::getOrderId, orderId).eq(AppIsin::getIsinStatus, CommonConstant.ISIN_STATUS_1));
         if (CollUtil.isNotEmpty(appIsinList)) {
             Map<IsinUserInfoDTO, List<AppIsin>> map =
                     appIsinList.stream()
@@ -240,7 +239,9 @@ public class AppOrderServiceImpl extends ServiceImpl<AppOrderMapper, AppOrder> i
         AppSite site = appSiteMapper.selectOne(Wrappers.<AppSite>lambdaQuery().eq(AppSite::getOrgCode, appOrder.getOrgCode()));
 
         ScanCodeQueryOrderVO scanCodeQueryOrderVO = new ScanCodeQueryOrderVO();
-        scanCodeQueryOrderVO.setSiteName(site.getName());
+        if (ObjectUtil.isNotEmpty(site)){
+            scanCodeQueryOrderVO.setSiteName(site.getName());
+        }
         scanCodeQueryOrderVO.setAmount(appOrder.getAmount());
 
         List<AppOrderProInfoVerifyVO> orderProInfoVOList = new ArrayList<>();
@@ -273,13 +274,14 @@ public class AppOrderServiceImpl extends ServiceImpl<AppOrderMapper, AppOrder> i
             }
         }
         if (appOrder.getType() == 1){
-                AppGamePriceRules appGamePriceRules = appGamePriceRulesMapper.selectById(appOrder.getProductIds());
-                AppGame appGame = appGameMapper.selectById(appGamePriceRules.getGameId());
+            AppGamePriceRules appGamePriceRules = appGamePriceRulesMapper.selectById(appOrder.getProductIds());
+            AppGame appGame = appGameMapper.findByPriceRules(appGamePriceRules.getId());
 
-                scanCodeQueryOrderVO.setProductName(appGame.getName());
-                scanCodeQueryOrderVO.setProductImage(appGame.getCover());
-                scanCodeQueryOrderVO.setGameType(appGamePriceRules.getType());
-                scanCodeQueryOrderVO.setPrice(appGamePriceRules.getSellingPrice());
+            scanCodeQueryOrderVO.setProductName(appGame.getName());
+            scanCodeQueryOrderVO.setProductImage(appGame.getCover());
+            scanCodeQueryOrderVO.setGameType(appGamePriceRules.getType());
+            scanCodeQueryOrderVO.setPrice(appGamePriceRules.getSellingPrice());
+            scanCodeQueryOrderVO.setSiteName(appGame.getSiteAddress());
         }
 
         if (appOrder.getType() == 2) {

+ 3 - 0
national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/system/app/vo/OrderPageVO.java

@@ -44,6 +44,9 @@ public class OrderPageVO implements Serializable {
     @Schema(description = "实际支付价")
     private BigDecimal price;
 
+    @Schema(description = "用户电话")
+    private String usersPhone;
+
     @Schema(description = "子订单信息")
     private List<AppOrderProInfo> orderProInfoList;
 }