Browse Source

feat(app): 添加体育馆包场预览功能

- 在 AppSitePriceRulesMapper 中新增 previewOrderPlaceGymnasiumChartered 方法
- 在 IOrderService 接口中添加 previewOrderPlaceGymnasiumChartered 方法
- 实现 OrderServiceImpl 中的 previewOrderPlaceGymnasiumChartered 方法
- 在 OrderController 中添加预览接口
- 更新相关 VO 类,增加新字段
SheepHy 1 week ago
parent
commit
4f077dfbd4

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

@@ -7,13 +7,12 @@ import lombok.extern.slf4j.Slf4j;
 import org.jeecg.common.api.vo.Result;
 import org.jeecg.common.api.vo.Result;
 import org.jeecg.modules.app.service.IOrderService;
 import org.jeecg.modules.app.service.IOrderService;
 import org.jeecg.modules.app.vo.OrderVO;
 import org.jeecg.modules.app.vo.OrderVO;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestParam;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
 
 
 import javax.annotation.Resource;
 import javax.annotation.Resource;
 import java.util.Date;
 import java.util.Date;
+import java.util.List;
+
 @Slf4j
 @Slf4j
 @Tag(name = "订单相关接口")
 @Tag(name = "订单相关接口")
 @RestController
 @RestController
@@ -61,4 +60,17 @@ public class OrderController {
     public Result<OrderVO.PreviewOrderCourse> previewOrderCourse(@RequestParam("courseId") @Schema(description = "课程ID")String courseId){
     public Result<OrderVO.PreviewOrderCourse> previewOrderCourse(@RequestParam("courseId") @Schema(description = "课程ID")String courseId){
         return Result.ok(appOrderService.previewOrderCourse(courseId));
         return Result.ok(appOrderService.previewOrderCourse(courseId));
     }
     }
+
+    /**
+     * @Author SheepHy
+     * @Description 体育馆包场-预览页
+     * @Date 16:13 2025/7/14
+     * @Param placeId
+     * @return OrderVO.PreviewOrderPlaceGymnasiumChartered {@link OrderVO.PreviewOrderPlaceGymnasiumChartered}
+     **/
+    @Operation(summary="体育馆包场-预览页")
+    @PostMapping("/previewOrderPlaceGymnasiumChartered")
+    public Result<OrderVO.PreviewOrderPlaceGymnasiumChartered> previewOrderPlaceGymnasiumChartered(@RequestParam("courseId") @Schema(description = "课程ID")List<String> rulesId){
+        return Result.ok(appOrderService.previewOrderPlaceGymnasiumChartered(rulesId));
+    }
 }
 }

+ 2 - 1
national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/app/service/IOrderService.java

@@ -3,6 +3,7 @@ package org.jeecg.modules.app.service;
 import org.jeecg.modules.app.vo.OrderVO;
 import org.jeecg.modules.app.vo.OrderVO;
 
 
 import java.util.Date;
 import java.util.Date;
+import java.util.List;
 
 
 public interface IOrderService {
 public interface IOrderService {
 
 
@@ -49,5 +50,5 @@ public interface IOrderService {
      * @Param placeId
      * @Param placeId
      * @return OrderVO.PreviewOrderPlaceGymnasiumChartered {@link OrderVO.PreviewOrderPlaceGymnasiumChartered}
      * @return OrderVO.PreviewOrderPlaceGymnasiumChartered {@link OrderVO.PreviewOrderPlaceGymnasiumChartered}
      **/
      **/
-    OrderVO.PreviewOrderPlaceGymnasiumChartered previewOrderPlaceGymnasiumChartered(String placeId);
+    OrderVO.PreviewOrderPlaceGymnasiumChartered previewOrderPlaceGymnasiumChartered(List<String> rulesId);
 }
 }

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

@@ -85,6 +85,12 @@ public class DetailServiceImpl implements IDetailService {
             for (AppInstructor instructor : appInstructors) {
             for (AppInstructor instructor : appInstructors) {
                 PlaceInfoVO.InstructorVO vo = new PlaceInfoVO.InstructorVO();
                 PlaceInfoVO.InstructorVO vo = new PlaceInfoVO.InstructorVO();
                 BeanUtils.copyProperties(instructor,vo); // 注意参数顺序
                 BeanUtils.copyProperties(instructor,vo); // 注意参数顺序
+                List<String> category = new ArrayList<>();
+                Arrays.stream(instructor.getTrainingPrograms().split(",")).forEach(categoryId -> {
+                    AppCategory appCategory = appCategoryMapper.selectById(categoryId);
+                    category.add(appCategory.getName());
+                });
+                vo.setCategory(category);
                 SysUser sysUser = sysUserMapper.selectById(instructor.getUserId());
                 SysUser sysUser = sysUserMapper.selectById(instructor.getUserId());
                 vo.setName(sysUser.getUsername()).setAvatar(sysUser.getAvatar());
                 vo.setName(sysUser.getUsername()).setAvatar(sysUser.getAvatar());
                 instructorVOList.add(vo);
                 instructorVOList.add(vo);

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

@@ -9,10 +9,13 @@ import org.jeecg.modules.app.vo.OrderVO;
 import org.jeecg.modules.system.app.entity.AppCourses;
 import org.jeecg.modules.system.app.entity.AppCourses;
 import org.jeecg.modules.system.app.entity.AppOrder;
 import org.jeecg.modules.system.app.entity.AppOrder;
 import org.jeecg.modules.system.app.entity.AppSitePlace;
 import org.jeecg.modules.system.app.entity.AppSitePlace;
+import org.jeecg.modules.system.app.entity.AppSitePriceRules;
 import org.jeecg.modules.system.app.mapper.AppCoursesMapper;
 import org.jeecg.modules.system.app.mapper.AppCoursesMapper;
 import org.jeecg.modules.system.app.mapper.AppOrderMapper;
 import org.jeecg.modules.system.app.mapper.AppOrderMapper;
 import org.jeecg.modules.system.app.mapper.AppSitePlaceMapper;
 import org.jeecg.modules.system.app.mapper.AppSitePlaceMapper;
 import org.jeecg.modules.system.app.mapper.AppSitePriceRulesMapper;
 import org.jeecg.modules.system.app.mapper.AppSitePriceRulesMapper;
+import org.jeecg.modules.system.entity.SysDepart;
+import org.jeecg.modules.system.mapper.SysDepartMapper;
 import org.springframework.stereotype.Service;
 import org.springframework.stereotype.Service;
 
 
 import javax.annotation.Resource;
 import javax.annotation.Resource;
@@ -33,6 +36,8 @@ public class OrderServiceImpl implements IOrderService {
     private AppCoursesMapper appCoursesMapper;
     private AppCoursesMapper appCoursesMapper;
     @Resource
     @Resource
     private AppOrderMapper appOrderMapper;
     private AppOrderMapper appOrderMapper;
+    @Resource
+    private SysDepartMapper sysDepartMapper;
 
 
     @Override
     @Override
     public boolean checkCourseLimitNum(String courseId, int limitNum) {
     public boolean checkCourseLimitNum(String courseId, int limitNum) {
@@ -75,8 +80,34 @@ public class OrderServiceImpl implements IOrderService {
     }
     }
 
 
     @Override
     @Override
-    public OrderVO.PreviewOrderPlaceGymnasiumChartered previewOrderPlaceGymnasiumChartered(String placeId) {
-        return null;
+    public OrderVO.PreviewOrderPlaceGymnasiumChartered previewOrderPlaceGymnasiumChartered(List<String> rulesId) {
+        LoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal();
+        OrderVO.PreviewOrderPlaceGymnasiumChartered result = new OrderVO.PreviewOrderPlaceGymnasiumChartered();
+        List<AppSitePriceRules> priceRules = appSitePriceRulesMapper.selectList(Wrappers.<AppSitePriceRules>lambdaQuery()
+                .in(AppSitePriceRules::getId, rulesId));
+        BigDecimal totalPrice = priceRules.stream()
+                .map(AppSitePriceRules::getSellingPrice)
+                .reduce(BigDecimal.ZERO, BigDecimal::add);
+        if (priceRules.isEmpty()) {
+            throw new IllegalArgumentException("未找到对应的价格规则");
+        }
+        AppSitePlace sitePlace = appSitePlaceMapper.selectById(priceRules.get(0).getSitePlaceId());
+        if (sitePlace == null) {
+            throw new IllegalStateException("关联场地不存在");
+        }
+        List<OrderVO.PreviewOrderTimePeriod> timePeriod = appSitePriceRulesMapper.previewOrderPlaceGymnasiumChartered(rulesId);
+        SysDepart depart = sysDepartMapper.selectOne(Wrappers.<SysDepart>lambdaQuery()
+                .eq(SysDepart::getOrgCode, sitePlace.getOrgCode()));
+        return result.setTimePeriod(timePeriod)
+                .setEarlyRefundTime(sitePlace.getEarlyRefundTime())
+                .setPlaceId(sitePlace.getId())
+                .setPlaceName(sitePlace.getName())
+                .setReminder(sitePlace.getReminder())
+                .setRefundRule(sitePlace.getEarlyRefundTime())
+                .setMobile(user.getPhone())
+                .setTotalPrice(totalPrice)  // 总价即为所有价格之和
+                .setSubtotal(totalPrice)    // 小计与总价相同
+                .setStoreName(depart != null ? depart.getDepartName() : "未知门店");
     }
     }
 
 
     /**
     /**

+ 1 - 1
national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/app/vo/OrderVO.java

@@ -89,7 +89,7 @@ public class OrderVO {
         @Schema(description = "提示")
         @Schema(description = "提示")
         private String reminder;
         private String reminder;
         @Schema(description = "退改规则")
         @Schema(description = "退改规则")
-        private String refundRule;
+        private int refundRule;
         @Schema(description="体育馆包场-时间段-预览页")
         @Schema(description="体育馆包场-时间段-预览页")
         private List<PreviewOrderTimePeriod> timePeriod;
         private List<PreviewOrderTimePeriod> timePeriod;
 
 

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

@@ -147,6 +147,8 @@ public class PlaceInfoVO {
         private String avatar;
         private String avatar;
         @Schema(description = "擅长说明")
         @Schema(description = "擅长说明")
         private String excelMsg;
         private String excelMsg;
+        @Schema(description = "类目")
+        private List<String> category;
     }
     }
 
 
     @Data
     @Data

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

@@ -28,4 +28,6 @@ public interface AppSitePriceRulesMapper extends BaseMapper<AppSitePriceRules> {
 
 
     List<OrderVO.PreviewOrderPlaceSchoolChild> timeSlot(@Param("placeId")String placeId,@Param("startTime")Date startTime);
     List<OrderVO.PreviewOrderPlaceSchoolChild> timeSlot(@Param("placeId")String placeId,@Param("startTime")Date startTime);
 
 
+    List<OrderVO.PreviewOrderTimePeriod> previewOrderPlaceGymnasiumChartered(@Param("rulesId")List<String> rulesId);
+
 }
 }

+ 26 - 0
national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/system/app/mapper/xml/AppSitePriceRulesMapper.xml

@@ -68,4 +68,30 @@
             date_of_sale = #{startTime}
             date_of_sale = #{startTime}
           AND site_place_id = #{placeId};
           AND site_place_id = #{placeId};
     </select>
     </select>
+    <select id="previewOrderPlaceGymnasiumChartered" resultType="org.jeecg.modules.app.vo.OrderVO$PreviewOrderTimePeriod">
+        SELECT
+        CONCAT(
+        DATE_FORMAT(a.date_of_sale, '%m-%d'),
+        CASE
+        WHEN DATE(a.date_of_sale) = CURDATE() THEN '(今天)'
+        WHEN DATE(a.date_of_sale) = DATE_ADD(CURDATE(), INTERVAL 1 DAY) THEN '(明天)'
+        WHEN DATE(a.date_of_sale) = DATE_ADD(CURDATE(), INTERVAL 2 DAY) THEN '(后天)'
+        ELSE ''
+        END,
+        TIME_FORMAT(a.start_time, '%H:%i'), '-', TIME_FORMAT(a.end_time, '%H:%i'), ' | ', b.[name](file://F:\IdeaProject\national-motion\national-motion-backend\national-motion-module-system\national-motion-system-biz\src\main\java\org\jeecg\modules\app\vo\PlaceVO.java#L18-L19)
+        ) AS `name`
+        a.id,
+        a.start_time,
+        a.end_time
+        FROM
+        `nm_site_price_rules` a
+        LEFT JOIN nm_site_place b ON a.site_place_id = b.id
+        WHERE
+        a.id IN
+        <foreach collection="rulesId" item="id" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+        ORDER BY
+        a.date_of_sale ASC
+    </select>
 </mapper>
 </mapper>