Browse Source

feat(system): 新增场所相关功能

- 新增 AppSitePlace相关实体和 DTO
- 实现 AppCourses 和 AppSite 的价格规则编辑功能
- 优化 AppGamePriceRules 实体结构
- 移除未使用的 AppSiteCuDTO 类
lix 2 weeks ago
parent
commit
fe44ada65d
22 changed files with 684 additions and 527 deletions
  1. 4 28
      national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/system/app/controller/AppCoursesPriceRulesController.java
  2. 108 108
      national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/system/app/controller/AppSiteController.java
  3. 3 0
      national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/system/app/dto/AppCoursesCuDTO.java
  4. 0 106
      national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/system/app/dto/AppSiteCuDTO.java
  5. 85 10
      national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/system/app/dto/AppSiteDTO.java
  6. 87 0
      national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/system/app/dto/AppSitePlaceCuDTO.java
  7. 29 0
      national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/system/app/dto/AppSitePlaceDTO.java
  8. 24 0
      national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/system/app/dto/AppSitePlacePageDTO.java
  9. 9 1
      national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/system/app/entity/AppGamePriceRules.java
  10. 8 0
      national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/system/app/entity/AppSitePlace.java
  11. 4 4
      national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/system/app/entity/AppSitePriceRules.java
  12. 4 3
      national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/system/app/service/IAppCoursesPriceRulesService.java
  13. 0 1
      national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/system/app/service/IAppGameService.java
  14. 30 0
      national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/system/app/service/IAppSitePlaceService.java
  15. 0 29
      national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/system/app/service/IAppSitePriceRulesService.java
  16. 26 27
      national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/system/app/service/IAppSiteService.java
  17. 17 3
      national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/system/app/service/impl/AppCoureseServiceImpl.java
  18. 66 37
      national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/system/app/service/impl/AppCoursesPriceRulesServiceImpl.java
  19. 74 0
      national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/system/app/service/impl/AppSitePlaceServiceImpl.java
  20. 0 26
      national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/system/app/service/impl/AppSitePriceRulesServiceImpl.java
  21. 87 144
      national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/system/app/service/impl/AppSiteServiceImpl.java
  22. 19 0
      national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/system/app/utils/TimeRangeFinder.java

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

@@ -1,45 +1,21 @@
 package org.jeecg.modules.system.app.controller;
 
-import java.util.Arrays;
-import java.util.HashMap;
 import java.util.List;
-import java.util.Map;
-import java.util.stream.Collectors;
-import java.io.IOException;
-import java.io.UnsupportedEncodingException;
-import java.net.URLDecoder;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
+
 import org.jeecg.common.api.vo.Result;
-import org.jeecg.common.system.query.QueryGenerator;
-import org.jeecg.common.system.query.QueryRuleEnum;
-import org.jeecg.common.util.oConvertUtils;
 import org.jeecg.modules.system.app.dto.AppCoursesRuleDTO;
 import org.jeecg.modules.system.app.entity.AppCoursesPriceRules;
 import org.jeecg.modules.system.app.service.IAppCoursesPriceRulesService;
 
-import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
-import com.baomidou.mybatisplus.core.metadata.IPage;
-import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import lombok.extern.slf4j.Slf4j;
 
-import org.jeecgframework.poi.excel.ExcelImportUtil;
-import org.jeecgframework.poi.excel.def.NormalExcelConstants;
-import org.jeecgframework.poi.excel.entity.ExportParams;
-import org.jeecgframework.poi.excel.entity.ImportParams;
-import org.jeecgframework.poi.excel.view.JeecgEntityExcelView;
 import org.jeecg.common.system.base.controller.JeecgController;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
-import org.springframework.web.multipart.MultipartFile;
-import org.springframework.web.multipart.MultipartHttpServletRequest;
-import org.springframework.web.servlet.ModelAndView;
-import com.alibaba.fastjson.JSON;
 import io.swagger.v3.oas.annotations.tags.Tag;
 import io.swagger.v3.oas.annotations.Operation;
-import org.jeecg.common.aspect.annotation.AutoLog;
-import org.apache.shiro.authz.annotation.RequiresPermissions;
- /**
+
+/**
  * @Description: 课程价格规则表
  * @Author: jeecg-boot
  * @Date:   2025-07-03
@@ -161,7 +137,7 @@ public class AppCoursesPriceRulesController extends JeecgController<AppCoursesPr
 	@Operation(summary="课程价格规则表-编辑保存课时")
 	@PostMapping(value = "/editPriceRules")
 	public Result<String> editPriceRules(List<AppCoursesRuleDTO> dtoList) {
-		return appCoursesPriceRulesService.saveWitchPriceRules(dtoList)?Result.OK("操作成功"):Result.error("保存失败");
+		return appCoursesPriceRulesService.editWitchPriceRules(dtoList)?Result.OK("操作成功"):Result.error("保存失败");
 	}
 //
 //    /**

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

@@ -35,118 +35,118 @@ import org.apache.shiro.authz.annotation.RequiresPermissions;
 @RequestMapping("/appSite")
 @Slf4j
 public class AppSiteController extends JeecgController<AppSite, IAppSiteService> {
-//	@Autowired
-//	private IAppSiteService appSiteService;
-//	@Autowired
-//	private IAppSitePriceRulesService sitePriceRulesService;
-//
-//	/**
-//	 * 分页列表查询
-//	 *
-//	 * @param dto
-//	 * @return
-//	 */
-//	//@AutoLog(value = "场地表-分页列表查询")
-//	@Operation(summary="场地表-分页列表查询")
-//	@GetMapping(value = "/list")
-//	public Result<IPage<AppSiteDTO>> queryPageList(AppSitePageDTO dto) {
-//		return Result.OK(appSiteService.queryWitchPriceRulesPage(dto));
-//	}
-//
-//	/**
-//	 *   添加
-//	 *
-//	 * @param appSiteDTO
-//	 * @return
-//	 */
-//	@AutoLog(value = "场地表-添加")
-//	@Operation(summary="场地表-添加")
-////	@RequiresPermissions("org.jeecg.modules.app:nm_site:add")
-//	@PostMapping(value = "/add")
-//	public Result<String> add(@RequestBody AppSiteDTO appSiteDTO) {
-//		return appSiteService.saveWitchPriceRules(appSiteDTO)?Result.OK("添加成功!"):Result.error("添加失败!");
-//	}
-//
-//	/**
-//	 *  编辑
-//	 *
-//	 * @param appSiteDTO
-//	 * @return
-//	 */
-//	@AutoLog(value = "场地表-编辑")
-//	@Operation(summary="场地表-编辑")
-////	@RequiresPermissions("org.jeecg.modules.app:nm_site:edit")
-//	@RequestMapping(value = "/edit", method = {RequestMethod.PUT,RequestMethod.POST})
-//	public Result<String> edit(@RequestBody AppSiteDTO appSiteDTO) {
-//		return appSiteService.editWitchPriceRules(appSiteDTO)?Result.OK("操作成功!"):Result.error("操作失败!");
-//	}
-//
-//	/**
-//	 *   通过id删除
-//	 *
-//	 * @param id
-//	 * @return
-//	 */
-//	@AutoLog(value = "场地表-通过id删除")
-//	@Operation(summary="场地表-通过id删除")
-////	@RequiresPermissions("org.jeecg.modules.app:nm_site:delete")
-//	@DeleteMapping(value = "/delete")
-//	public Result<String> delete(@RequestParam(name="id",required=true) String id) {
-//
-//		return appSiteService.deleteWitchPriceRulesById(id)? Result.OK("删除成功!"):Result.error("删除失败!");
-//	}
-//
-////	/**
-////	 *  批量删除
-////	 *
-////	 * @param ids
-////	 * @return
-////	 */
-////	@AutoLog(value = "场地表-批量删除")
-////	@Operation(summary="场地表-批量删除")
-////	@RequiresPermissions("org.jeecg.modules.app:nm_site:deleteBatch")
-////	@DeleteMapping(value = "/deleteBatch")
-////	public Result<String> deleteBatch(@RequestParam(name="ids",required=true) String ids) {
-////		this.appSiteService.removeByIds(Arrays.asList(ids.split(",")));
-////		return Result.OK("批量删除成功!");
-////	}
-//
+	@Autowired
+	private IAppSiteService appSiteService;
+	@Autowired
+	private IAppSitePriceRulesService sitePriceRulesService;
+
+	/**
+	 * 分页列表查询
+	 *
+	 * @param dto
+	 * @return
+	 */
+	//@AutoLog(value = "场地表-分页列表查询")
+	@Operation(summary="场地表-分页列表查询")
+	@GetMapping(value = "/list")
+	public Result<IPage<AppSiteDTO>> queryPageList(AppSitePageDTO dto) {
+		return Result.OK(appSiteService.queryWitchPriceRulesPage(dto));
+	}
+
+	/**
+	 *   添加
+	 *
+	 * @param appSiteDTO
+	 * @return
+	 */
+	@AutoLog(value = "场地表-添加")
+	@Operation(summary="场地表-添加")
+//	@RequiresPermissions("org.jeecg.modules.app:nm_site:add")
+	@PostMapping(value = "/add")
+	public Result<String> add(@RequestBody AppSiteDTO appSiteDTO) {
+		return appSiteService.saveWitchPriceRules(appSiteDTO)?Result.OK("添加成功!"):Result.error("添加失败!");
+	}
+
+	/**
+	 *  编辑
+	 *
+	 * @param appSiteDTO
+	 * @return
+	 */
+	@AutoLog(value = "场地表-编辑")
+	@Operation(summary="场地表-编辑")
+//	@RequiresPermissions("org.jeecg.modules.app:nm_site:edit")
+	@RequestMapping(value = "/edit", method = {RequestMethod.PUT,RequestMethod.POST})
+	public Result<String> edit(@RequestBody AppSiteDTO appSiteDTO) {
+		return appSiteService.editWitchPriceRules(appSiteDTO)?Result.OK("操作成功!"):Result.error("操作失败!");
+	}
+
+	/**
+	 *   通过id删除
+	 *
+	 * @param id
+	 * @return
+	 */
+	@AutoLog(value = "场地表-通过id删除")
+	@Operation(summary="场地表-通过id删除")
+//	@RequiresPermissions("org.jeecg.modules.app:nm_site:delete")
+	@DeleteMapping(value = "/delete")
+	public Result<String> delete(@RequestParam(name="id",required=true) String id) {
+
+		return appSiteService.deleteWitchPriceRulesById(id)? Result.OK("删除成功!"):Result.error("删除失败!");
+	}
+
 //	/**
-//	 * 通过id查询
+//	 *  批量删除
 //	 *
-//	 * @param id
+//	 * @param ids
 //	 * @return
 //	 */
-//	//@AutoLog(value = "场地表-通过id查询")
-//	@Operation(summary="场地表-通过id查询")
-//	@GetMapping(value = "/queryById")
-//	public Result<AppSiteDTO> queryById(@RequestParam(name="id",required=true) String id) {
-//			return Result.ok(appSiteService.queryWitchPriceRulesById(id));
+//	@AutoLog(value = "场地表-批量删除")
+//	@Operation(summary="场地表-批量删除")
+//	@RequiresPermissions("org.jeecg.modules.app:nm_site:deleteBatch")
+//	@DeleteMapping(value = "/deleteBatch")
+//	public Result<String> deleteBatch(@RequestParam(name="ids",required=true) String ids) {
+//		this.appSiteService.removeByIds(Arrays.asList(ids.split(",")));
+//		return Result.OK("批量删除成功!");
 //	}
-//
-//    /**
-//    * 导出excel
-//    *
-//    * @param request
-//    * @param appSite
-//    */
-//    @RequiresPermissions("org.jeecg.modules.app:nm_site:exportXls")
-//    @RequestMapping(value = "/exportXls")
-//    public ModelAndView exportXls(HttpServletRequest request, AppSite appSite) {
-//        return super.exportXls(request, appSite, AppSite.class, "场地表");
-//    }
-//
-//    /**
-//      * 通过excel导入数据
-//    *
-//    * @param request
-//    * @param response
-//    * @return
-//    */
-//    @RequiresPermissions("org.jeecg.modules.app:nm_site:importExcel")
-//    @RequestMapping(value = "/importExcel", method = RequestMethod.POST)
-//    public Result<?> importExcel(HttpServletRequest request, HttpServletResponse response) {
-//        return super.importExcel(request, response, AppSite.class);
-//    }
+
+	/**
+	 * 通过id查询
+	 *
+	 * @param id
+	 * @return
+	 */
+	//@AutoLog(value = "场地表-通过id查询")
+	@Operation(summary="场地表-通过id查询")
+	@GetMapping(value = "/queryById")
+	public Result<AppSiteDTO> queryById(@RequestParam(name="id",required=true) String id) {
+			return Result.ok(appSiteService.queryWitchPriceRulesById(id));
+	}
+
+    /**
+    * 导出excel
+    *
+    * @param request
+    * @param appSite
+    */
+    @RequiresPermissions("org.jeecg.modules.app:nm_site:exportXls")
+    @RequestMapping(value = "/exportXls")
+    public ModelAndView exportXls(HttpServletRequest request, AppSite appSite) {
+        return super.exportXls(request, appSite, AppSite.class, "场地表");
+    }
+
+    /**
+      * 通过excel导入数据
+    *
+    * @param request
+    * @param response
+    * @return
+    */
+    @RequiresPermissions("org.jeecg.modules.app:nm_site:importExcel")
+    @RequestMapping(value = "/importExcel", method = RequestMethod.POST)
+    public Result<?> importExcel(HttpServletRequest request, HttpServletResponse response) {
+        return super.importExcel(request, response, AppSite.class);
+    }
 
 }

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

@@ -123,4 +123,7 @@ public class AppCoursesCuDTO {
     @Excel(name = "课程进展状态", width = 15)
     @Schema(description = "课程进展状态")
     private Integer coursesStatus;
+
+    @Excel(name = "总节数", width = 15)
+    private Integer totalNum;
 }

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

@@ -1,106 +0,0 @@
-package org.jeecg.modules.system.app.dto;
-
-import com.fasterxml.jackson.annotation.JsonFormat;
-import io.swagger.v3.oas.annotations.media.Schema;
-import lombok.AllArgsConstructor;
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-import lombok.NoArgsConstructor;
-import lombok.experimental.Accessors;
-import org.jeecgframework.poi.excel.annotation.Excel;
-import org.springframework.format.annotation.DateTimeFormat;
-
-import java.math.BigDecimal;
-import java.util.Date;
-
-/**
- * @author DM
- * @date 2025/7/7 17:39
- * @description
- */
-@Data
-@Accessors(chain = true)
-@EqualsAndHashCode(callSuper = false)
-@AllArgsConstructor
-@NoArgsConstructor
-@Schema(description="场地入参自定义DTO")
-public class AppSiteCuDTO {
-    @Schema(description = "id")
-    private String id;
-    /**部门编码*/
-    @Excel(name = "部门编码", width = 15)
-    @Schema(description = "部门编码")
-    private String orgCode;
-    /**关联部门id*/
-    @Excel(name = "关联部门id", width = 15)
-    @Schema(description = "关联部门id")
-    private String tenantId;
-    /**名称*/
-    @Excel(name = "名称", width = 15)
-    @Schema(description = "名称")
-    private String name;
-    /**地址*/
-    @Excel(name = "地址", width = 15)
-    @Schema(description = "地址")
-    private String address;
-    /**0学校 1体育馆*/
-    @Excel(name = "0学校 1体育馆", width = 15)
-    @Schema(description = "0学校 1体育馆")
-    private Integer type;
-    /**经营状态0营业 1休息*/
-    @Excel(name = "经营状态0营业 1休息", width = 15)
-    @Schema(description = "经营状态0营业 1休息")
-    private Integer runStatus;
-    /**开始营业时间 时间为空则全天*/
-    @Excel(name = "开始营业时间", width = 20, format = "yyyy-MM-dd HH:mm:ss")
-    @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
-    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
-    @Schema(description = "开始营业时间")
-    private Date startTime;
-    /**结束营业时间*/
-    @Excel(name = "结束营业时间", width = 20, format = "yyyy-MM-dd HH:mm:ss")
-    @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
-    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
-    @Schema(description = "结束营业时间")
-    private Date endTime;    /**客服电话*/
-    @Excel(name = "客服电话", width = 15)
-    @Schema(description = "客服电话")
-    private String phone;
-    /**运动类目id;多个用逗号分割*/
-    @Excel(name = "运动类目id;多个用逗号分割", width = 15)
-    @Schema(description = "运动类目id;多个用逗号分割")
-    private String categoryId;
-    /**信息/设施*/
-    @Excel(name = "信息/设施", width = 15)
-    @Schema(description = "信息/设施")
-    private String facility;
-    /**图片*/
-    @Excel(name = "图片", width = 15)
-    @Schema(description = "图片")
-    private String cover;
-    /**视频*/
-    @Excel(name = "视频", width = 15)
-    @Schema(description = "视频")
-    private String video;
-    /**好评率*/
-    @Excel(name = "好评率", width = 15)
-    @Schema(description = "好评率")
-    private BigDecimal goodRate;
-    /**纬度*/
-    @Excel(name = "纬度", width = 15)
-    @Schema(description = "纬度")
-    private BigDecimal latitude;
-    /**经度*/
-    @Excel(name = "经度", width = 15)
-    @Schema(description = "经度")
-    private BigDecimal longitude;
-    /**排序*/
-    @Excel(name = "排序", width = 15)
-    @Schema(description = "排序")
-    private Integer sort;
-    /**vr图JSON数据*/
-    @Excel(name = "vr图JSON数据", width = 15)
-    @Schema(description = "vr图JSON数据")
-    private String vr;
-
-}

+ 85 - 10
national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/system/app/dto/AppSiteDTO.java

@@ -1,20 +1,21 @@
 package org.jeecg.modules.system.app.dto;
 
-import io.swagger.v3.oas.annotations.media.ArraySchema;
+import com.fasterxml.jackson.annotation.JsonFormat;
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.AllArgsConstructor;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 import lombok.NoArgsConstructor;
 import lombok.experimental.Accessors;
-import org.jeecg.modules.system.app.entity.AppSite;
-import org.jeecg.modules.system.app.entity.AppSitePriceRules;
+import org.jeecgframework.poi.excel.annotation.Excel;
+import org.springframework.format.annotation.DateTimeFormat;
 
-import java.util.List;
+import java.math.BigDecimal;
+import java.util.Date;
 
 /**
  * @author DM
- * @date 2025/7/4 10:20
+ * @date 2025/7/7 17:39
  * @description
  */
 @Data
@@ -22,10 +23,84 @@ import java.util.List;
 @EqualsAndHashCode(callSuper = false)
 @AllArgsConstructor
 @NoArgsConstructor
-@Schema(description="场地入参DTO")
+@Schema(description="商户补充信息入参自定义DTO")
 public class AppSiteDTO {
-    @Schema(description = "场地主信息")
-    private AppSiteCuDTO site;
-    @ArraySchema(schema = @Schema(implementation = AppSiteRuleDTO.class),  minItems = 1)
-    private List<AppSiteRuleDTO> priceRulesList;
+    @Schema(description = "id")
+    private String id;
+    /**部门编码*/
+    @Excel(name = "部门编码", width = 15)
+    @Schema(description = "部门编码")
+    private String orgCode;
+    /**关联部门id*/
+    @Excel(name = "关联部门id", width = 15)
+    @Schema(description = "关联部门id")
+    private String tenantId;
+    /**名称*/
+    @Excel(name = "名称", width = 15)
+    @Schema(description = "名称")
+    private String name;
+    /**地址*/
+    @Excel(name = "地址", width = 15)
+    @Schema(description = "地址")
+    private String address;
+    /**0学校 1体育馆*/
+    @Excel(name = "0学校 1体育馆", width = 15)
+    @Schema(description = "0学校 1体育馆")
+    private Integer type;
+    /**经营状态0营业 1休息*/
+    @Excel(name = "经营状态0营业 1休息", width = 15)
+    @Schema(description = "经营状态0营业 1休息")
+    private Integer runStatus;
+    /**开始营业时间 时间为空则全天*/
+    @Excel(name = "开始营业时间", width = 20, format = "yyyy-MM-dd HH:mm:ss")
+    @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+    @Schema(description = "开始营业时间")
+    private Date startTime;
+    /**结束营业时间*/
+    @Excel(name = "结束营业时间", width = 20, format = "yyyy-MM-dd HH:mm:ss")
+    @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+    @Schema(description = "结束营业时间")
+    private Date endTime;    /**客服电话*/
+    @Excel(name = "客服电话", width = 15)
+    @Schema(description = "客服电话")
+    private String phone;
+    /**运动类目id;多个用逗号分割*/
+    @Excel(name = "运动类目id;多个用逗号分割", width = 15)
+    @Schema(description = "运动类目id;多个用逗号分割")
+    private String categoryId;
+    /**信息/设施*/
+    @Excel(name = "信息/设施", width = 15)
+    @Schema(description = "信息/设施")
+    private String facility;
+    /**图片*/
+    @Excel(name = "图片", width = 15)
+    @Schema(description = "图片")
+    private String cover;
+    /**视频*/
+    @Excel(name = "视频", width = 15)
+    @Schema(description = "视频")
+    private String video;
+    /**好评率*/
+    @Excel(name = "好评率", width = 15)
+    @Schema(description = "好评率")
+    private BigDecimal goodRate;
+    /**纬度*/
+    @Excel(name = "纬度", width = 15)
+    @Schema(description = "纬度")
+    private BigDecimal latitude;
+    /**经度*/
+    @Excel(name = "经度", width = 15)
+    @Schema(description = "经度")
+    private BigDecimal longitude;
+    /**排序*/
+    @Excel(name = "排序", width = 15)
+    @Schema(description = "排序")
+    private Integer sort;
+    /**vr图JSON数据*/
+    @Excel(name = "vr图JSON数据", width = 15)
+    @Schema(description = "vr图JSON数据")
+    private String vr;
+
 }

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

@@ -0,0 +1,87 @@
+package org.jeecg.modules.system.app.dto;
+
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+import org.jeecgframework.poi.excel.annotation.Excel;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.util.Date;
+
+/**
+ * @author DM
+ * @date 2025/7/9 17:30
+ * @description
+ */
+
+@Data
+@Accessors(chain = true)
+@EqualsAndHashCode(callSuper = false)
+@AllArgsConstructor
+@NoArgsConstructor
+@Schema(description="场所入参自定义DTO")
+public class AppSitePlaceCuDTO {
+    @Schema(description = "id")
+    private String id;
+    /**部门id*/
+    @Excel(name = "部门id", width = 15)
+    @Schema(description = "部门id")
+    private String tenantId;
+    /**部门编码*/
+    @Excel(name = "部门编码", width = 15)
+    @Schema(description = "部门编码")
+    private String orgCode;
+    /**商户补充信息id*/
+    @Excel(name = "商户补充信息id", width = 15)
+    @Schema(description = "商户补充信息id")
+    private String siteId;
+    /**名称*/
+    @Excel(name = "名称", width = 15)
+    @Schema(description = "名称")
+    private String name;
+    /**封面*/
+    @Excel(name = "封面", width = 15)
+    @Schema(description = "封面")
+    private String cover;
+    /**保险id,逗号分割*/
+    @Excel(name = "保险id,逗号分割", width = 15)
+    @Schema(description = "保险id,逗号分割")
+    private String insureIds;
+    /**退款类型;0可退/到期自动退 1限时退 2不可退*/
+    @Excel(name = "退款类型;0可退/到期自动退 1限时退 2不可退", width = 15)
+    @Schema(description = "退款类型;0可退/到期自动退 1限时退 2不可退")
+    private Integer refundType;
+    /**体育馆包场提前退款时间;单位:分钟*/
+    @Excel(name = "体育馆包场提前退款时间;单位:分钟", width = 15)
+    @Schema(description = "体育馆包场提前退款时间;单位:分钟")
+    private Integer earlyRefundTime;
+    /**适用人数*/
+    @Excel(name = "适用人数", width = 15)
+    @Schema(description = "适用人数")
+    private Integer usableCount;
+    /**提示/须知*/
+    @Excel(name = "提示/须知", width = 15)
+    @Schema(description = "提示/须知")
+    private String reminder;
+    /**不可用日期;多个逗号分割*/
+    @Excel(name = "不可用日期;多个逗号分割", width = 15)
+    @Schema(description = "不可用日期;多个逗号分割")
+    private String downTime;
+    /**提前预约时间:0免预约 单位:时*/
+    @Excel(name = "提前预约时间:0免预约 单位:时", width = 15)
+    @Schema(description = "提前预约时间:0免预约 单位:时")
+    private Integer advanceTime;
+    /**购买限制*/
+    @Excel(name = "购买限制", width = 15)
+    @Schema(description = "购买限制")
+    private Integer buyLimit;
+    /**有效期;单位:天*/
+    @Excel(name = "有效期;单位:天", width = 15)
+    @Schema(description = "有效期;单位:天")
+    private Integer indate;
+}

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

@@ -0,0 +1,29 @@
+package org.jeecg.modules.system.app.dto;
+
+import io.swagger.v3.oas.annotations.media.ArraySchema;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+
+import java.util.List;
+
+/**
+ * @author DM
+ * @date 2025/7/9 17:38
+ * @description
+ */
+@Data
+@Accessors(chain = true)
+@EqualsAndHashCode(callSuper = false)
+@AllArgsConstructor
+@NoArgsConstructor
+@Schema(description="场所-价格入参自定义DTO")
+public class AppSitePlaceDTO {
+    private AppSitePlaceCuDTO appSitePlaceCuDTO;
+    @ArraySchema(arraySchema = @Schema(description = "场地价格规则"))
+    private List<AppSiteRuleDTO> siteRuleDTOS;
+
+}

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

@@ -0,0 +1,24 @@
+package org.jeecg.modules.system.app.dto;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+
+/**
+ * @author DM
+ * @date 2025/7/9 17:59
+ * @description
+ */
+@Data
+@Accessors(chain = true)
+@EqualsAndHashCode(callSuper = false)
+@AllArgsConstructor
+@NoArgsConstructor
+@Schema(description="场所分页入参自定义DTO")
+public class AppSitePlacePageDTO extends BasePageDTO{
+    @Schema(description = "名称")
+    private String name;
+}

+ 9 - 1
national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/system/app/entity/AppGamePriceRules.java

@@ -56,7 +56,15 @@ public class AppGamePriceRules implements Serializable {
 	/**售价*/
 	@Excel(name = "售价", width = 15)
     @Schema(description = "售价")
-    private String sellingPrice;
+    private BigDecimal sellingPrice;
+	/**人数*/
+	@Excel(name = "人数", width = 15)
+    @Schema(description = "人数")
+    private Integer peopleNum;
+	/**比赛类型;0个人1团队*/
+	@Excel(name = "比赛类型;0个人1团队", width = 15)
+    @Schema(description = "比赛类型;0个人1团队")
+    private Integer type;
 	/**乐观锁*/
 	@Excel(name = "乐观锁", width = 15)
     @Schema(description = "乐观锁")

+ 8 - 0
national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/system/app/entity/AppSitePlace.java

@@ -45,6 +45,14 @@ public class AppSitePlace implements Serializable {
 	@Excel(name = "部门编码", width = 15)
     @Schema(description = "部门编码")
     private String orgCode;
+	/**商户补充信息id*/
+	@Excel(name = "商户补充信息id", width = 15)
+    @Schema(description = "商户补充信息id")
+    private String siteId;
+    /**名称*/
+    @Excel(name = "名称", width = 15)
+    @Schema(description = "名称")
+    private String name;
 	/**乐观锁*/
 	@Excel(name = "乐观锁", width = 15)
     @Schema(description = "乐观锁")

+ 4 - 4
national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/system/app/entity/AppSitePriceRules.java

@@ -41,10 +41,10 @@ public class AppSitePriceRules implements Serializable {
     @Excel(name = "关联编码id", width = 15)
     @Schema(description = "关联编码id")
     private String tenantId;
-    /**场*/
-    @Excel(name = "场", width = 15)
-    @Schema(description = "场")
-    private String siteId;
+    /**场*/
+    @Excel(name = "场", width = 15)
+    @Schema(description = "场")
+    private String sitePlaceId;
     /**运动类型*/
     @Excel(name = "运动类型", width = 15)
     @Schema(description = "运动类型")

+ 4 - 3
national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/system/app/service/IAppCoursesPriceRulesService.java

@@ -9,11 +9,12 @@ import java.util.List;
 /**
  * @Description: 课程价格规则表
  * @Author: jeecg-boot
- * @Date:   2025-07-03
+ * @Date: 2025-07-03
  * @Version: V1.0
  */
 public interface IAppCoursesPriceRulesService extends IService<AppCoursesPriceRules> {
 
-List<AppCoursesRuleDTO> queryCoursesPriceRulesList(String courseId);
-Boolean saveWitchPriceRules(List<AppCoursesRuleDTO> dtoList);
+    List<AppCoursesRuleDTO> queryCoursesPriceRulesList(String courseId);
+
+    Boolean editWitchPriceRules(List<AppCoursesRuleDTO> dtoList);
 }

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

@@ -3,7 +3,6 @@ package org.jeecg.modules.system.app.service;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import org.jeecg.modules.system.app.dto.AppGameDTO;
 import org.jeecg.modules.system.app.dto.AppGamePageDTO;
-import org.jeecg.modules.system.app.dto.AppSiteDTO;
 import org.jeecg.modules.system.app.entity.AppGame;
 import com.baomidou.mybatisplus.extension.service.IService;
 

+ 30 - 0
national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/system/app/service/IAppSitePlaceService.java

@@ -1,6 +1,10 @@
 package org.jeecg.modules.system.app.service;
 
+import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.IService;
+import org.jeecg.modules.system.app.dto.AppSitePlaceCuDTO;
+import org.jeecg.modules.system.app.dto.AppSitePlaceDTO;
+import org.jeecg.modules.system.app.dto.AppSitePlacePageDTO;
 import org.jeecg.modules.system.app.entity.AppSitePlace;
 
 /**
@@ -10,5 +14,31 @@ import org.jeecg.modules.system.app.entity.AppSitePlace;
  * @Version: V1.0
  */
 public interface IAppSitePlaceService extends IService<AppSitePlace> {
+    /**
+     *场所新增
+     * @param placeDTO
+     * @return
+     */
+    Boolean saveWitchPriceRules(AppSitePlaceDTO placeDTO);
+    /**
+     * 商户修改
+     * @param placeDTO
+     * @return
+     */
+    Boolean editWitchPriceRules(AppSitePlaceDTO placeDTO);
+    /**
+     * 通过id查询商户
+     * @param id
+     * @return
+     */
+    AppSitePlaceCuDTO queryWitchPriceRulesById(String id);
+    /**
+     * 删除商户
+     * @param id
+     * @return
+     */
+    Boolean deleteWitchPriceRulesById(String id);
+
+    IPage<AppSitePlaceCuDTO> queryWitchPriceRulesPage(AppSitePlacePageDTO dto);
 
 }

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

@@ -1,8 +1,5 @@
 package org.jeecg.modules.system.app.service;
 
-import com.baomidou.mybatisplus.core.metadata.IPage;
-import org.jeecg.modules.system.app.dto.AppSiteDTO;
-import org.jeecg.modules.system.app.dto.AppSitePageDTO;
 import org.jeecg.modules.system.app.entity.AppSitePriceRules;
 import com.baomidou.mybatisplus.extension.service.IService;
 
@@ -13,31 +10,5 @@ import com.baomidou.mybatisplus.extension.service.IService;
  * @Version: V1.0
  */
 public interface IAppSitePriceRulesService extends IService<AppSitePriceRules> {
-    /**
-     *新增包场
-     * @param appSiteDTO
-     * @return
-     */
-    Boolean saveWitchPriceRules(AppSiteDTO appSiteDTO);
-    /**
-     * 修改场地表
-     * @param appSiteDTO
-     * @return
-     */
-    Boolean editWitchPriceRules(AppSiteDTO appSiteDTO);
-    /**
-     * 通过id查询场地表
-     * @param id
-     * @return
-     */
-    AppSiteDTO queryWitchPriceRulesById(String id);
-    /**
-     * 删除场地表
-     * @param id
-     * @return
-     */
-    Boolean deleteWitchPriceRulesById(String id);
-
-    IPage<AppSiteDTO> queryWitchPriceRulesPage(AppSitePageDTO dto);
 
 }

+ 26 - 27
national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/system/app/service/IAppSiteService.java

@@ -1,7 +1,6 @@
 package org.jeecg.modules.system.app.service;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
-import org.jeecg.modules.system.app.dto.AppSiteCuDTO;
 import org.jeecg.modules.system.app.dto.AppSiteDTO;
 import org.jeecg.modules.system.app.dto.AppSitePageDTO;
 import org.jeecg.modules.system.app.entity.AppSite;
@@ -15,31 +14,31 @@ import com.baomidou.mybatisplus.extension.service.IService;
  */
 public interface IAppSiteService extends IService<AppSite> {
 
-//    /**
-//     *商户新增
-//     * @param appSiteDTO
-//     * @return
-//     */
-//    Boolean saveWitchPriceRules(AppSiteCuDTO appSiteDTO);
-//    /**
-//     * 商户修改
-//     * @param appSiteDTO
-//     * @return
-//     */
-//    Boolean editWitchPriceRules(AppSiteDTO appSiteDTO);
-//    /**
-//     * 通过id查询商户
-//     * @param id
-//     * @return
-//     */
-//    AppSiteDTO queryWitchPriceRulesById(String id);
-//    /**
-//     * 删除商户
-//     * @param id
-//     * @return
-//     */
-//    Boolean deleteWitchPriceRulesById(String id);
-//
-//    IPage<AppSiteDTO> queryWitchPriceRulesPage(AppSitePageDTO dto);
+    /**
+     *商户新增
+     * @param appSiteDTO
+     * @return
+     */
+    Boolean saveWitchPriceRules(AppSiteDTO appSiteDTO);
+    /**
+     * 商户修改
+     * @param appSiteDTO
+     * @return
+     */
+    Boolean editWitchPriceRules(AppSiteDTO appSiteDTO);
+    /**
+     * 通过id查询商户
+     * @param id
+     * @return
+     */
+    AppSiteDTO queryWitchPriceRulesById(String id);
+    /**
+     * 删除商户
+     * @param id
+     * @return
+     */
+    Boolean deleteWitchPriceRulesById(String id);
+
+    IPage<AppSiteDTO> queryWitchPriceRulesPage(AppSitePageDTO dto);
 
 }

+ 17 - 3
national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/system/app/service/impl/AppCoureseServiceImpl.java

@@ -6,6 +6,7 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.shiro.SecurityUtils;
+import org.dom4j.rule.RuleManager;
 import org.jeecg.common.exception.JeecgBootException;
 import org.jeecg.common.system.vo.LoginUser;
 import org.jeecg.modules.system.app.dto.AppCoursesCuDTO;
@@ -24,8 +25,7 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import org.springframework.transaction.annotation.Transactional;
 
 import javax.annotation.Resource;
-import java.util.ArrayList;
-import java.util.List;
+import java.util.*;
 
 import static org.jeecg.common.constant.CommonConstant.SC_INTERNAL_SERVER_ERROR_500;
 
@@ -51,11 +51,23 @@ public class AppCoureseServiceImpl extends ServiceImpl<AppCoursesMapper, AppCour
         appCourses.setOrgCode(loginUser.getOrgCode());
         appCourses.setTenantId(loginUser.getOrgId());
         appCourses.setUserId(loginUser.getId());
+        List<AppCoursesRuleDTO> coursesRuleDTOS= appCoursesDTO.getPriceRulesList();
+        //起止时间计算
+        Optional<Date> minStartTime = coursesRuleDTOS.stream()
+                .map(AppCoursesRuleDTO::getStartTime)
+                .filter(Objects::nonNull)
+                .min(Date::compareTo);
+
+        Optional<Date> maxEndTime = coursesRuleDTOS.stream()
+                .map(AppCoursesRuleDTO::getEndTime)
+                .filter(Objects::nonNull)
+                .max(Date::compareTo);
+        appCourses.setStartTime(minStartTime.orElse(null));
+        appCourses.setEndTime(maxEndTime.orElse(null));
         int saveCourseResult = baseMapper.insert(appCourses);
         if (saveCourseResult < 1) {
             throw new JeecgBootException("课程信息保存失败");
         }
-        List<AppCoursesRuleDTO>coursesRuleDTOS= appCoursesDTO.getPriceRulesList();
         for (AppCoursesRuleDTO rule : coursesRuleDTOS) {
             AppCoursesPriceRules appCoursesPriceRules = new AppCoursesPriceRules();
             BeanUtils.copyProperties(rule, appCoursesPriceRules);
@@ -135,6 +147,8 @@ public class AppCoureseServiceImpl extends ServiceImpl<AppCoursesMapper, AppCour
         return resultPage.convert(record -> {
             AppCoursesCuDTO cuDTO = new AppCoursesCuDTO();
             BeanUtils.copyProperties(record,cuDTO);
+            Long l = priceRulesMapper.selectCount(Wrappers.<AppCoursesPriceRules>lambdaQuery().eq(AppCoursesPriceRules::getCoursesId, record.getId()));
+            cuDTO.setTotalNum(l.intValue());
             return cuDTO;
         });
     }

+ 66 - 37
national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/system/app/service/impl/AppCoursesPriceRulesServiceImpl.java

@@ -4,17 +4,21 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import org.jeecg.common.exception.JeecgBootException;
 import org.jeecg.modules.system.app.dto.AppCoursesRuleDTO;
 import org.jeecg.modules.system.app.dto.AppSiteRuleDTO;
+import org.jeecg.modules.system.app.entity.AppCourses;
 import org.jeecg.modules.system.app.entity.AppCoursesPriceRules;
 import org.jeecg.modules.system.app.entity.AppSitePriceRules;
+import org.jeecg.modules.system.app.mapper.AppCoursesMapper;
 import org.jeecg.modules.system.app.mapper.AppCoursesPriceRulesMapper;
 import org.jeecg.modules.system.app.service.IAppCoursesPriceRulesService;
 import org.springframework.beans.BeanUtils;
 import org.springframework.stereotype.Service;
 
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.transaction.annotation.Transactional;
 
-import java.util.ArrayList;
-import java.util.List;
+import javax.annotation.Resource;
+import java.util.*;
+import java.util.stream.Collectors;
 
 /**
  * @Description: 课程价格规则表
@@ -25,6 +29,9 @@ import java.util.List;
 @Service
 public class AppCoursesPriceRulesServiceImpl extends ServiceImpl<AppCoursesPriceRulesMapper, AppCoursesPriceRules> implements IAppCoursesPriceRulesService {
 
+    @Resource
+    AppCoursesMapper appCoursesMapper;
+
     @Override
     public List<AppCoursesRuleDTO> queryCoursesPriceRulesList(String courseId) {
         List<AppCoursesRuleDTO> ruleDTOS = new ArrayList<>();
@@ -37,43 +44,65 @@ public class AppCoursesPriceRulesServiceImpl extends ServiceImpl<AppCoursesPrice
     }
 
     @Override
-    public Boolean saveWitchPriceRules(List<AppCoursesRuleDTO> dtoList) {
+    @Transactional(rollbackFor = Exception.class)
+    public Boolean editWitchPriceRules(List<AppCoursesRuleDTO> dtoList) {
         if (dtoList.isEmpty()) throw new JeecgBootException("课时列表不能为空");
+        Optional<Date> minStartTime = dtoList.stream()
+                .map(AppCoursesRuleDTO::getStartTime)
+                .filter(Objects::nonNull)
+                .min(Date::compareTo);
 
-//        List<AppCoursesRuleDTO> dtoList = dto.getPriceRulesList();
-//        List<AppSitePriceRules> dbRules = baseMapper.getBySiteId(siteId);
-//
-//// 1. 找出需删除的(db中有,new中没有)
-//        List<String> newIds = dtoList.stream().map(AppSiteRuleDTO::getId).collect(Collectors.toList());
-//        List<AppSiteRuleEntity> toDelete = dbRules.stream()
-//                .filter(e -> !newIds.contains(e.getId()))
-//                .collect(Collectors.toList());
-//
-//// 2. 找出需更新的(db中有,new中也有)
-//        List<AppSiteRuleDTO> toUpdate = dtoList.stream()
-//                .filter(r -> r.getId() != null && dbRules.stream().anyMatch(e -> e.getId().equals(r.getId())))
-//                .collect(Collectors.toList());
-//
-//// 3. 找出需新增的(new中有,db中没有)
-//        List<AppSiteRuleDTO> toInsert = dtoList.stream()
-//                .filter(r -> r.getId() == null || dbRules.stream().noneMatch(e -> e.getId().equals(r.getId())))
-//                .collect(Collectors.toList());
-//
-//// 分别执行 delete/update/insert
-//
-//        for (AppCoursesRuleDTO rule : dtoList) {
-//            AppCoursesPriceRules appCoursesPriceRules = new AppCoursesPriceRules();
-//            BeanUtils.copyProperties(rule, appCoursesPriceRules);
-//            if (rule.getId() != null){
-//                baseMapper.insert( rule)
-//            }
-//
-//            int savePriceResult = baseMapper.(appCoursesPriceRules);
-//            if (savePriceResult < 1) {
-//                throw new JeecgBootException("课时保存失败");
-//            }
-//        }
-        return true;
+        Optional<Date> maxEndTime = dtoList.stream()
+                .map(AppCoursesRuleDTO::getEndTime)
+                .filter(Objects::nonNull)
+                .max(Date::compareTo);
+        AppCourses appCourses = appCoursesMapper.selectById(dtoList.get(0).getCoursesId());
+        appCourses.setStartTime(minStartTime.orElse(null));
+        appCourses.setEndTime(maxEndTime.orElse(null));
+        int saveCourseResult = appCoursesMapper.updateById(appCourses);
+        if (saveCourseResult < 1) {
+            throw new JeecgBootException("课程信息更新失败");
+        }
+        List<AppCoursesPriceRules> priceRules = baseMapper.selectList(Wrappers.<AppCoursesPriceRules>lambdaQuery().eq(AppCoursesPriceRules::getCoursesId, appCourses.getId()));
+        //删除的
+        List<AppCoursesPriceRules> deletePriceRules = priceRules.stream()
+                .filter(db -> dtoList.stream().noneMatch(nr -> nr.getId() != null && nr.getId().equals(db.getId())))
+                .collect(Collectors.toList());
+        deletePriceRules.forEach(
+                db -> {
+                    int deleteResult = baseMapper.deleteById(db.getId());
+                    if (deleteResult < 1) {
+                        throw new JeecgBootException("课程价格规则删除失败");
+                    }
+                }
+        );
+        //保存的
+        List<AppCoursesPriceRules> savePriceRules = dtoList.stream()
+                .filter(dto -> dto.getId() == null)
+                .map(dto -> {
+                    AppCoursesPriceRules appCoursesPriceRules = new AppCoursesPriceRules();
+                    BeanUtils.copyProperties(dto, appCoursesPriceRules);
+                    appCoursesPriceRules.setCoursesId(appCourses.getId());
+                    return appCoursesPriceRules;
+                })
+                .collect(Collectors.toList());
+        savePriceRules.forEach(rule -> {
+            int savePriceResult = baseMapper.insert(rule);
+            if (savePriceResult < 1) {
+                throw new JeecgBootException("课程价格规则保存失败");
+            }
+        });
+        //修改的
+        List<AppCoursesRuleDTO> toUpdate = dtoList.stream()
+                .filter(dto -> dto.getId() != null && priceRules.stream().anyMatch(db -> db.getId().equals(dto.getId())))
+                .collect(Collectors.toList());
+        toUpdate.forEach(dto -> {
+            AppCoursesPriceRules entity = new AppCoursesPriceRules();
+            BeanUtils.copyProperties(entity, dto);
+            int result = baseMapper.updateById(entity);
+            if (result < 1) throw new JeecgBootException("课时更新失败");
+        });
+        return Boolean.TRUE;
     }
 
 }

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

@@ -1,11 +1,29 @@
 package org.jeecg.modules.system.app.service.impl;
 
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import org.apache.shiro.SecurityUtils;
+import org.jeecg.common.exception.JeecgBootException;
+import org.jeecg.common.system.vo.LoginUser;
+import org.jeecg.modules.system.app.dto.AppSitePlaceCuDTO;
+import org.jeecg.modules.system.app.dto.AppSitePlaceDTO;
+import org.jeecg.modules.system.app.dto.AppSitePlacePageDTO;
+import org.jeecg.modules.system.app.dto.AppSiteRuleDTO;
+import org.jeecg.modules.system.app.entity.AppSite;
 import org.jeecg.modules.system.app.entity.AppSitePlace;
+import org.jeecg.modules.system.app.entity.AppSitePriceRules;
 import org.jeecg.modules.system.app.mapper.AppSitePlaceMapper;
+import org.jeecg.modules.system.app.mapper.AppSitePriceRulesMapper;
 import org.jeecg.modules.system.app.service.IAppSitePlaceService;
+import org.springframework.beans.BeanUtils;
 import org.springframework.stereotype.Service;
 
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.annotation.Resource;
+import java.util.List;
+
+import static org.jeecg.common.constant.CommonConstant.SC_INTERNAL_SERVER_ERROR_500;
 
 /**
  * @Description: 商户场所表
@@ -15,5 +33,61 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
  */
 @Service
 public class AppSitePlaceServiceImpl extends ServiceImpl<AppSitePlaceMapper, AppSitePlace> implements IAppSitePlaceService {
+    @Resource
+    AppSitePriceRulesMapper appSitePriceRulesMapper;
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public Boolean saveWitchPriceRules(AppSitePlaceDTO placeDTO) {
+//        AppSitePlaceCuDTO appSitePlaceCuDTO = placeDTO.getAppSitePlaceCuDTO();
+//        LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
+//        if (null == appSitePlaceCuDTO.getSiteId()) throw new JeecgBootException("商户补充信息id不能为空", SC_INTERNAL_SERVER_ERROR_500);
+//        AppSitePlace appSitePlace = new AppSitePlace();
+//        BeanUtils.copyProperties(appSitePlaceCuDTO, appSitePlace);
+//        appSitePlace.setOrgCode(sysUser.getOrgCode());
+//        appSitePlace.setTenantId(sysUser.getOrgId());
+//        appSitePlace.setSiteId(appSitePlaceCuDTO.getSiteId());
+//        int insert = baseMapper.insert(appSitePlace);
+//        if (insert<1) {
+//            throw new JeecgBootException("商户场所保存失败");
+//        }
+//        placeDTO.getSiteRuleDTOS().forEach(rule -> {
+//            AppSitePriceRules appSitePriceRules = new AppSitePriceRules();
+//            BeanUtils.copyProperties(rule, appSitePriceRules);
+//            appSitePriceRules.setSitePlaceId(appSitePlace.getId());
+//            appSitePriceRules.setOrgCode(appSitePlace.getOrgCode());
+//            appSitePriceRules.setTenantId(appSitePlace.getTenantId());
+//            int savePriceResult = baseMapper.insert(appSitePriceRules);
+//        });
+
+        return null;
+    }
+
+    @Override
+    public Boolean editWitchPriceRules(AppSitePlaceDTO placeDTO) {
+        return null;
+    }
+
+    @Override
+    public AppSitePlaceCuDTO queryWitchPriceRulesById(String id) {
+        return null;
+    }
+
+    @Override
+    public Boolean deleteWitchPriceRulesById(String id) {
+        return null;
+    }
 
+    @Override
+    public IPage<AppSitePlaceCuDTO> queryWitchPriceRulesPage(AppSitePlacePageDTO dto) {
+        return null;
+    }
+    /**
+     * 权限校验
+     * @param place
+     * @param sysUser
+     */
+    private void checkPermission(AppSitePlace place, LoginUser sysUser ){
+        if (!sysUser.getOrgCode().equals(place.getOrgCode())) throw new JeecgBootException("无权限操作", SC_INTERNAL_SERVER_ERROR_500);
+    }
 }

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

@@ -1,8 +1,5 @@
 package org.jeecg.modules.system.app.service.impl;
 
-import com.baomidou.mybatisplus.core.metadata.IPage;
-import org.jeecg.modules.system.app.dto.AppSiteDTO;
-import org.jeecg.modules.system.app.dto.AppSitePageDTO;
 import org.jeecg.modules.system.app.entity.AppSitePriceRules;
 import org.jeecg.modules.system.app.mapper.AppSitePriceRulesMapper;
 import org.jeecg.modules.system.app.service.IAppSitePriceRulesService;
@@ -19,28 +16,5 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 @Service
 public class AppSitePriceRulesServiceImpl extends ServiceImpl<AppSitePriceRulesMapper, AppSitePriceRules> implements IAppSitePriceRulesService {
 
-    @Override
-    public Boolean saveWitchPriceRules(AppSiteDTO appSiteDTO) {
-        return null;
-    }
 
-    @Override
-    public Boolean editWitchPriceRules(AppSiteDTO appSiteDTO) {
-        return null;
-    }
-
-    @Override
-    public AppSiteDTO queryWitchPriceRulesById(String id) {
-        return null;
-    }
-
-    @Override
-    public Boolean deleteWitchPriceRulesById(String id) {
-        return null;
-    }
-
-    @Override
-    public IPage<AppSiteDTO> queryWitchPriceRulesPage(AppSitePageDTO dto) {
-        return null;
-    }
 }

+ 87 - 144
national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/system/app/service/impl/AppSiteServiceImpl.java

@@ -10,7 +10,6 @@ import org.jeecg.common.exception.JeecgBootException;
 import org.jeecg.common.system.vo.LoginUser;
 import org.jeecg.modules.system.app.dto.*;
 import org.jeecg.modules.system.app.entity.AppSite;
-import org.jeecg.modules.system.app.entity.AppSitePriceRules;
 import org.jeecg.modules.system.app.mapper.AppSiteMapper;
 import org.jeecg.modules.system.app.mapper.AppSitePriceRulesMapper;
 import org.jeecg.modules.system.app.service.IAppSiteService;
@@ -21,9 +20,6 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import org.springframework.transaction.annotation.Transactional;
 
 import javax.annotation.Resource;
-import java.math.BigDecimal;
-import java.util.ArrayList;
-import java.util.List;
 
 import static org.jeecg.common.constant.CommonConstant.SC_INTERNAL_SERVER_ERROR_500;
 
@@ -35,144 +31,91 @@ import static org.jeecg.common.constant.CommonConstant.SC_INTERNAL_SERVER_ERROR_
  */
 @Service
 public class AppSiteServiceImpl extends ServiceImpl<AppSiteMapper, AppSite> implements IAppSiteService {
-//    @Resource
-//    private AppSitePriceRulesMapper priceRulesMapper;
-//
-//    @Override
-//    @Transactional(rollbackFor = Exception.class)
-//    public Boolean saveWitchPriceRules(AppSiteCuDTO appSiteDTO) {
-//        if (null == appSiteDTO.getType()) throw new JeecgBootException("商户类型不能为空", SC_INTERNAL_SERVER_ERROR_500);
-//        LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
-//        AppSite site = new AppSite();
-//        BeanUtils.copyProperties(siteCuDTO, site);
-//        site.setOrgCode(sysUser.getOrgCode());//部门默认登录用户部门
-//        site.setTenantId(sysUser.getOrgId());
-//        int saveSiteResult = baseMapper.insert(site);
-//        // 如果插入失败,抛出自定义异常提示“场地信息保存失败”
-//        if (saveSiteResult < 1) {
-//            throw new JeecgBootException("场地信息保存失败", SC_INTERNAL_SERVER_ERROR_500);
-//        }
-//
-////        // 获取价格规则列表
-////        List<AppSiteRuleDTO> priceRulesList = appSiteDTO.getPriceRulesList();
-////        for (AppSiteRuleDTO rule : priceRulesList) {
-////            if (rule.getSellingPrice().compareTo(BigDecimal.ZERO)<=0)throw new JeecgBootException("保存失败:价格不能为0", SC_INTERNAL_SERVER_ERROR_500);
-////            // 设置当前规则对应的场地 ID
-////            AppSitePriceRules appSitePriceRules = new AppSitePriceRules();
-////            BeanUtils.copyProperties(rule, appSitePriceRules);
-////            appSitePriceRules.setSiteId(site.getId());
-////            appSitePriceRules.setOrgCode(site.getOrgCode());
-////            appSitePriceRules.setTenantId(site.getTenantId());
-////            // 调用 priceRulesMapper 插入价格规则
-////            int savePriceResult = priceRulesMapper.insert(appSitePriceRules);
-////            // 如果插入失败,抛出自定义异常提示“场地价格规则保存失败”
-////            if (savePriceResult < 1) {
-////                throw new JeecgBootException("场地价格规则保存失败", SC_INTERNAL_SERVER_ERROR_500);
-////            }
-////        }
-//
-//        // 所有操作成功完成后返回 true
-//        return Boolean.TRUE;
-//    }
-//
-//    @Override
-//    @Transactional(rollbackFor = Exception.class)
-//    public Boolean editWitchPriceRules(AppSiteDTO appSiteDTO) {
-//        AppSiteCuDTO siteCuDTO = appSiteDTO.getSite();
-//        AppSite site = new AppSite();
-//        BeanUtils.copyProperties(siteCuDTO, site);
-//        if (null == site.getType()) throw new JeecgBootException("场地类型不能为空", SC_INTERNAL_SERVER_ERROR_500);
-//        AppSite dbSite = baseMapper.selectById(site.getId());
-//        if (null==dbSite) throw new JeecgBootException("未找到对应数据", SC_INTERNAL_SERVER_ERROR_500);
-//        LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
-////        checkPermission(dbSite,sysUser);
-//        site.setOrgCode(sysUser.getOrgCode());//部门默认登录用户部门
-//        site.setTenantId(sysUser.getOrgId());
-//        int updateSiteResult = baseMapper.updateById(site);
-//        if (updateSiteResult < 1) {
-//            throw new JeecgBootException("场地信息保存失败", SC_INTERNAL_SERVER_ERROR_500);
-//        }
-//
-//        List<AppSiteRuleDTO> priceRulesList = appSiteDTO.getPriceRulesList();
-//        for (AppSiteRuleDTO rule : priceRulesList) {
-//            AppSitePriceRules appSitePriceRules = new AppSitePriceRules();
-//            BeanUtils.copyProperties(rule, appSitePriceRules);
-//            appSitePriceRules.setSiteId(site.getId());
-//            appSitePriceRules.setOrgCode(site.getOrgCode());
-//            appSitePriceRules.setTenantId(site.getTenantId());
-//            int savePriceResult = priceRulesMapper.updateById(appSitePriceRules); // 保证每个操作都在事务中
-//            if (savePriceResult < 1) {
-//                throw new JeecgBootException("场地价格规则保存失败", SC_INTERNAL_SERVER_ERROR_500);
-//            }
-//        }
-//
-//        return Boolean.TRUE;
-//    }
-//
-//    @Override
-//    public AppSiteDTO queryWitchPriceRulesById(String id) {
-//        AppSite dbSite = baseMapper.selectById(id);
-//        if (null==dbSite) throw new JeecgBootException("未找到对应数据", SC_INTERNAL_SERVER_ERROR_500);
-//        AppSiteCuDTO appSiteCuDTO = new AppSiteCuDTO();
-//        BeanUtils.copyProperties(dbSite, appSiteCuDTO);
-//        LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
-////        checkPermission(dbSite,sysUser);
-//        List<AppSitePriceRules> priceRulesList = priceRulesMapper.selectList(Wrappers.<AppSitePriceRules>lambdaQuery().eq(AppSitePriceRules::getSiteId, id));
-//        List<AppSiteRuleDTO> priceRulesDTOList = new ArrayList<>();
-//        priceRulesList.forEach(rule-> {
-//            AppSiteRuleDTO appSiteRuleDTO = new AppSiteRuleDTO();
-//            BeanUtils.copyProperties(rule, appSiteRuleDTO);
-//            priceRulesDTOList.add(appSiteRuleDTO);
-//        });
-//        return new AppSiteDTO(appSiteCuDTO,priceRulesDTOList);
-//    }
-//
-//    @Override
-//    @Transactional(rollbackFor = Exception.class)
-//    public Boolean deleteWitchPriceRulesById(String id) {
-//        AppSite dbSite = baseMapper.selectById(id);
-//        if (null==dbSite) throw new JeecgBootException("未找到对应数据", SC_INTERNAL_SERVER_ERROR_500);
-//        LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
-////        checkPermission(dbSite,sysUser);
-//        int deleteSiteResult = baseMapper.deleteById(id);
-//        if (deleteSiteResult>0){
-//            int deletePriceResult = priceRulesMapper.delete(Wrappers.<AppSitePriceRules>lambdaQuery().eq(AppSitePriceRules::getSiteId, id));
-//            if (deletePriceResult<1) throw new JeecgBootException("场地价格规则删除失败", SC_INTERNAL_SERVER_ERROR_500);
-//        }else{
-//            throw new JeecgBootException("场地信息删除失败", SC_INTERNAL_SERVER_ERROR_500);
-//        }
-//        return Boolean.TRUE;
-//    }
-//
-//    @Override
-//    public IPage<AppSiteDTO> queryWitchPriceRulesPage(AppSitePageDTO dto) {
-//        Page<AppSite> page = new Page<>(dto.getPageNum(), dto.getPageSize());
-//        LambdaQueryWrapper<AppSite> wrapper = Wrappers.<AppSite>lambdaQuery()
-//                .like(StringUtils.isNotBlank(dto.getName()), AppSite::getName, dto.getName());
-//        IPage<AppSite> resultPage = baseMapper.selectPage(page, wrapper);
-//
-//        return resultPage.convert(record -> {
-//            AppSiteCuDTO cuDTO = new AppSiteCuDTO();
-//            BeanUtils.copyProperties(record, cuDTO);
-//            List<AppSitePriceRules> priceRulesList = priceRulesMapper.selectList(
-//                    Wrappers.<AppSitePriceRules>lambdaQuery().eq(AppSitePriceRules::getSiteId, record.getId()));
-//            List<AppSiteRuleDTO> priceRulesDTOList = new ArrayList<>();
-//            priceRulesList.forEach(rule-> {
-//                AppSiteRuleDTO appSiteRuleDTO = new AppSiteRuleDTO();
-//                BeanUtils.copyProperties(rule, appSiteRuleDTO);
-//                priceRulesDTOList.add(appSiteRuleDTO);
-//            });
-//
-//            return new AppSiteDTO(cuDTO, priceRulesDTOList);
-//        });
-//    }
-//
-//    /**
-//     * 权限校验
-//     * @param site
-//     * @param sysUser
-//     */
-//    private void checkPermission(AppSite site,LoginUser sysUser ){
-//        if (!sysUser.getOrgCode().equals(site.getOrgCode())) throw new JeecgBootException("无权限操作", SC_INTERNAL_SERVER_ERROR_500);
-//    }
+    @Resource
+    private AppSitePriceRulesMapper priceRulesMapper;
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public Boolean saveWitchPriceRules(AppSiteDTO siteCuDTO) {
+        if (null == siteCuDTO.getType()) throw new JeecgBootException("商户类型不能为空", SC_INTERNAL_SERVER_ERROR_500);
+        LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
+        AppSite site = new AppSite();
+        BeanUtils.copyProperties(siteCuDTO, site);
+        site.setOrgCode(sysUser.getOrgCode());//部门默认登录用户部门
+        site.setTenantId(sysUser.getOrgId());
+        int saveSiteResult = baseMapper.insert(site);
+        // 如果插入失败,抛出自定义异常提示“场地信息保存失败”
+        if (saveSiteResult < 1) {
+            throw new JeecgBootException("场地信息保存失败", SC_INTERNAL_SERVER_ERROR_500);
+        }
+        // 所有操作成功完成后返回 true
+        return Boolean.TRUE;
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public Boolean editWitchPriceRules(AppSiteDTO siteCuDTO) {
+        AppSite site = new AppSite();
+        BeanUtils.copyProperties(siteCuDTO, site);
+        if (null == site.getType()) throw new JeecgBootException("场地类型不能为空", SC_INTERNAL_SERVER_ERROR_500);
+        AppSite dbSite = baseMapper.selectById(site.getId());
+        if (null==dbSite) throw new JeecgBootException("未找到对应数据", SC_INTERNAL_SERVER_ERROR_500);
+        LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
+//        checkPermission(dbSite,sysUser);
+        site.setOrgCode(sysUser.getOrgCode());//部门默认登录用户部门
+        site.setTenantId(sysUser.getOrgId());
+        int updateSiteResult = baseMapper.updateById(site);
+        if (updateSiteResult < 1) {
+            throw new JeecgBootException("场地信息保存失败", SC_INTERNAL_SERVER_ERROR_500);
+        }
+        return Boolean.TRUE;
+    }
+
+    @Override
+    public AppSiteDTO queryWitchPriceRulesById(String id) {
+        AppSite dbSite = baseMapper.selectById(id);
+        if (null==dbSite) throw new JeecgBootException("未找到对应数据", SC_INTERNAL_SERVER_ERROR_500);
+        AppSiteDTO appSiteDTO = new AppSiteDTO();
+        BeanUtils.copyProperties(dbSite, appSiteDTO);
+        LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
+//        checkPermission(dbSite,sysUser);
+        return appSiteDTO;
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public Boolean deleteWitchPriceRulesById(String id) {
+        AppSite dbSite = baseMapper.selectById(id);
+        if (null==dbSite) throw new JeecgBootException("未找到对应数据", SC_INTERNAL_SERVER_ERROR_500);
+        LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
+//        checkPermission(dbSite,sysUser);
+        int deleteSiteResult = baseMapper.deleteById(id);
+        if (deleteSiteResult<1){
+            throw new JeecgBootException("商户信息删除失败", SC_INTERNAL_SERVER_ERROR_500);
+        }
+        return Boolean.TRUE;
+    }
+
+    @Override
+    public IPage<AppSiteDTO> queryWitchPriceRulesPage(AppSitePageDTO dto) {
+        Page<AppSite> page = new Page<>(dto.getPageNum(), dto.getPageSize());
+        LambdaQueryWrapper<AppSite> wrapper = Wrappers.<AppSite>lambdaQuery()
+                .like(StringUtils.isNotBlank(dto.getName()), AppSite::getName, dto.getName());
+        IPage<AppSite> resultPage = baseMapper.selectPage(page, wrapper);
+
+        return resultPage.convert(record -> {
+            AppSiteDTO cuDTO = new AppSiteDTO();
+            BeanUtils.copyProperties(record, cuDTO);
+            return cuDTO;
+        });
+    }
+
+    /**
+     * 权限校验
+     * @param site
+     * @param sysUser
+     */
+    private void checkPermission(AppSite site,LoginUser sysUser ){
+        if (!sysUser.getOrgCode().equals(site.getOrgCode())) throw new JeecgBootException("无权限操作", SC_INTERNAL_SERVER_ERROR_500);
+    }
 }

+ 19 - 0
national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/system/app/utils/TimeRangeFinder.java

@@ -0,0 +1,19 @@
+package org.jeecg.modules.system.app.utils;
+
+import org.apache.poi.ss.formula.functions.T;
+import org.jeecg.modules.system.app.dto.AppCoursesRuleDTO;
+import org.w3c.dom.stylesheets.LinkStyle;
+
+import java.util.Date;
+import java.util.List;
+import java.util.Optional;
+
+/**
+ * @author DM
+ * @date 2025/7/9 16:21
+ * @description
+ */
+public class TimeRangeFinder {
+
+
+}