|
|
|
@ -1,4 +1,3 @@
|
|
|
|
|
|
|
|
|
|
package com.controller;
|
|
|
|
|
|
|
|
|
|
import java.io.File;
|
|
|
|
@ -35,377 +34,499 @@ import com.alibaba.fastjson.*;
|
|
|
|
|
/**
|
|
|
|
|
* 房间预约
|
|
|
|
|
* 后端接口
|
|
|
|
|
* @author
|
|
|
|
|
* @email
|
|
|
|
|
*/
|
|
|
|
|
* @author (此处应填写作者相关信息,但代码中未给出具体内容)
|
|
|
|
|
* @email (此处应填写作者邮箱相关信息,但代码中未给出具体内容)
|
|
|
|
|
*/
|
|
|
|
|
// 结合了 @Controller 和 @ResponseBody 的功能,表明这是一个RESTful风格的控制器,返回的数据会直接转换为JSON等格式响应给客户端
|
|
|
|
|
@RestController
|
|
|
|
|
// 标识这是一个Spring管理的Bean,是一个控制器类
|
|
|
|
|
@Controller
|
|
|
|
|
// 定义该控制器处理的基础请求路径,所有该控制器下的接口路径都以此为前缀
|
|
|
|
|
@RequestMapping("/fangjianOrder")
|
|
|
|
|
public class FangjianOrderController {
|
|
|
|
|
// 创建一个日志记录器对象,用于记录该类相关操作的日志信息,方便后续调试和排查问题,日志级别等配置通常在项目的日志配置文件中设置
|
|
|
|
|
private static final Logger logger = LoggerFactory.getLogger(FangjianOrderController.class);
|
|
|
|
|
|
|
|
|
|
// 使用Spring的依赖注入,自动装配FangjianOrderService,方便在该控制器中调用其提供的与房间预约相关的业务逻辑方法
|
|
|
|
|
@Autowired
|
|
|
|
|
private FangjianOrderService fangjianOrderService;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 使用Spring的依赖注入,自动装配TokenService,可能用于处理用户认证相关的令牌操作等(具体功能需看该服务的实际实现)
|
|
|
|
|
@Autowired
|
|
|
|
|
private TokenService tokenService;
|
|
|
|
|
|
|
|
|
|
// 使用Spring的依赖注入,自动装配DictionaryService,用于对字典表相关的数据进行转换操作,比如将字典表中的编码转换为对应的文字描述等,方便前端展示友好的数据格式
|
|
|
|
|
@Autowired
|
|
|
|
|
private DictionaryService dictionaryService;
|
|
|
|
|
|
|
|
|
|
//级联表service
|
|
|
|
|
// 使用Spring的依赖注入,自动装配FangjianService,用于和房间相关的业务逻辑操作(例如查询房间详细信息等),在处理级联表数据或者关联房间信息时会用到,属于级联表相关的服务调用
|
|
|
|
|
@Autowired
|
|
|
|
|
private FangjianService fangjianService;
|
|
|
|
|
|
|
|
|
|
// 使用Spring的依赖注入,自动装配YonghuService,用于和用户相关的业务逻辑操作(例如查询用户信息等),在处理级联表数据或者关联用户信息时会用到,属于级联表相关的服务调用
|
|
|
|
|
@Autowired
|
|
|
|
|
private YonghuService yonghuService;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 后端列表
|
|
|
|
|
*/
|
|
|
|
|
* 后端列表
|
|
|
|
|
* 用于获取房间预约信息的分页列表数据,根据传入的参数进行相应的查询和数据处理后返回给前端
|
|
|
|
|
*/
|
|
|
|
|
@RequestMapping("/page")
|
|
|
|
|
public R page(@RequestParam Map<String, Object> params, HttpServletRequest request){
|
|
|
|
|
logger.debug("page方法:,,Controller:{},,params:{}",this.getClass().getName(),JSONObject.toJSONString(params));
|
|
|
|
|
public R page(@RequestParam Map<String, Object> params, HttpServletRequest request) {
|
|
|
|
|
// 记录debug级别的日志信息,记录当前执行的page方法所在的类名以及传入的参数信息(将参数转为JSON字符串格式记录),方便调试时查看请求参数的具体情况
|
|
|
|
|
logger.debug("page方法:,,Controller:{},,params:{}", this.getClass().getName(), JSONObject.toJSONString(params));
|
|
|
|
|
// 从当前请求的会话中获取用户角色信息,并转换为字符串类型,可能用于后续根据不同角色进行不同的数据查询逻辑判断
|
|
|
|
|
String role = String.valueOf(request.getSession().getAttribute("role"));
|
|
|
|
|
if(false)
|
|
|
|
|
return R.error(511,"永不会进入");
|
|
|
|
|
else if("用户".equals(role))
|
|
|
|
|
params.put("yonghuId",request.getSession().getAttribute("userId"));
|
|
|
|
|
if(params.get("orderBy")==null || params.get("orderBy")==""){
|
|
|
|
|
params.put("orderBy","id");
|
|
|
|
|
// 此处条件永远为假,所以下面的代码块永远不会执行,可能是预留的逻辑或者后续需要修改调整的地方
|
|
|
|
|
if (false)
|
|
|
|
|
return R.error(511, "永不会进入");
|
|
|
|
|
// 如果用户角色是"用户",则将当前登录用户的ID设置到查询参数中,可能用于查询该用户相关的房间预约信息,限制查询范围
|
|
|
|
|
else if ("用户".equals(role))
|
|
|
|
|
params.put("yonghuId", request.getSession().getAttribute("userId"));
|
|
|
|
|
// 判断传入的参数中是否指定了排序字段,如果没有指定(即获取到的orderBy参数为空字符串)
|
|
|
|
|
if (params.get("orderBy") == null || params.get("orderBy") == "") {
|
|
|
|
|
// 就默认按照id字段倒序排序,将orderBy参数设置为id,确定返回数据的默认排序规则
|
|
|
|
|
params.put("orderBy", "id");
|
|
|
|
|
}
|
|
|
|
|
// 调用fangjianOrderService的queryPage方法,根据传入的参数查询并获取分页数据,存放在PageUtils对象中,该对象包含了分页相关的各种信息以及实际的数据列表等
|
|
|
|
|
PageUtils page = fangjianOrderService.queryPage(params);
|
|
|
|
|
|
|
|
|
|
//字典表数据转换
|
|
|
|
|
List<FangjianOrderView> list =(List<FangjianOrderView>)page.getList();
|
|
|
|
|
for(FangjianOrderView c:list){
|
|
|
|
|
//修改对应字典表字段
|
|
|
|
|
// 获取分页数据中的数据列表,这里强制转换为List<FangjianOrderView>类型,这些视图对象是适合前端展示的房间预约相关数据格式,可能经过了一定的数据处理和转换
|
|
|
|
|
List<FangjianOrderView> list = (List<FangjianOrderView>) page.getList();
|
|
|
|
|
for (FangjianOrderView c : list) {
|
|
|
|
|
// 循环调用dictionaryService的dictionaryConvert方法,用于对每个FangjianOrderView对象中的对应字典表字段进行转换(比如将字典编码转换为对应的文字描述等),传入当前的HttpServletRequest对象可能是用于获取一些上下文相关信息等,确保前端展示的数据是友好可读的格式
|
|
|
|
|
dictionaryService.dictionaryConvert(c, request);
|
|
|
|
|
}
|
|
|
|
|
// 返回成功的响应给前端,并将包含处理好的分页数据的PageUtils对象放入响应中,前端可以根据此数据进行展示等操作,例如在页面上分页展示房间预约列表信息
|
|
|
|
|
return R.ok().put("data", page);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 后端详情
|
|
|
|
|
*/
|
|
|
|
|
* 后端详情
|
|
|
|
|
* 根据传入的房间预约ID获取对应的详细信息,包括关联的房间、用户等相关信息,并进行数据转换和处理后返回给前端
|
|
|
|
|
*/
|
|
|
|
|
@RequestMapping("/info/{id}")
|
|
|
|
|
public R info(@PathVariable("id") Long id, HttpServletRequest request){
|
|
|
|
|
logger.debug("info方法:,,Controller:{},,id:{}",this.getClass().getName(),id);
|
|
|
|
|
public R info(@PathVariable("id") Long id, HttpServletRequest request) {
|
|
|
|
|
// 记录debug级别的日志信息,记录当前执行的info方法所在的类名以及传入的房间预约ID参数,方便调试查看请求参数情况
|
|
|
|
|
logger.debug("info方法:,,Controller:{},,id:{}", this.getClass().getName(), id);
|
|
|
|
|
// 调用fangjianOrderService的selectById方法,根据传入的房间预约ID从数据库中查询对应的FangjianOrderEntity对象(代表房间预约实体数据)
|
|
|
|
|
FangjianOrderEntity fangjianOrder = fangjianOrderService.selectById(id);
|
|
|
|
|
if(fangjianOrder !=null){
|
|
|
|
|
//entity转view
|
|
|
|
|
if (fangjianOrder != null) {
|
|
|
|
|
// 创建一个FangjianOrderView对象,用于将从数据库查询到的FangjianOrderEntity实体数据转换为适合前端展示的视图数据格式
|
|
|
|
|
FangjianOrderView view = new FangjianOrderView();
|
|
|
|
|
BeanUtils.copyProperties( fangjianOrder , view );//把实体数据重构到view中
|
|
|
|
|
// 使用BeanUtils工具类的copyProperties方法,将fangjianOrder对象的属性值复制到view对象中,实现实体数据到视图数据的转换(前提是FangjianOrderEntity和FangjianOrderView的属性有对应关系)
|
|
|
|
|
BeanUtils.copyProperties(fangjianOrder, view);
|
|
|
|
|
|
|
|
|
|
// 以下是处理级联表相关的数据,获取房间预约对应的房间信息,并添加到视图对象中(排除一些不需要的字段,如id、创建时间等字段)
|
|
|
|
|
// 调用fangjianService的selectById方法,根据房间预约实体中关联的房间ID获取对应的FangjianEntity对象(代表房间实体数据)
|
|
|
|
|
FangjianEntity fangjian = fangjianService.selectById(fangjianOrder.getFangjianId());
|
|
|
|
|
if (fangjian != null) {
|
|
|
|
|
// 使用BeanUtils工具类的copyProperties方法,将fangjian对象的部分属性值复制到view对象中(排除指定的字段),把级联的房间数据添加到视图中,确保传递给前端的房间相关数据是符合需求且不冗余的
|
|
|
|
|
BeanUtils.copyProperties(fangjian, view, new String[]{"id", "createTime", "insertTime", "updateTime"});
|
|
|
|
|
// 设置视图对象中的房间ID,保证前端能正确获取和展示关联的房间ID信息
|
|
|
|
|
view.setFangjianId(fangjian.getId());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//级联表
|
|
|
|
|
FangjianEntity fangjian = fangjianService.selectById(fangjianOrder.getFangjianId());
|
|
|
|
|
if(fangjian != null){
|
|
|
|
|
BeanUtils.copyProperties( fangjian , view ,new String[]{ "id", "createTime", "insertTime", "updateTime"});//把级联的数据添加到view中,并排除id和创建时间字段
|
|
|
|
|
view.setFangjianId(fangjian.getId());
|
|
|
|
|
}
|
|
|
|
|
//级联表
|
|
|
|
|
YonghuEntity yonghu = yonghuService.selectById(fangjianOrder.getYonghuId());
|
|
|
|
|
if(yonghu != null){
|
|
|
|
|
BeanUtils.copyProperties( yonghu , view ,new String[]{ "id", "createTime", "insertTime", "updateTime"});//把级联的数据添加到view中,并排除id和创建时间字段
|
|
|
|
|
view.setYonghuId(yonghu.getId());
|
|
|
|
|
}
|
|
|
|
|
//修改对应字典表字段
|
|
|
|
|
// 以下是处理级联表相关的数据,获取房间预约对应的用户信息,并添加到视图对象中(排除一些不需要的字段,如id、创建时间等字段)
|
|
|
|
|
// 调用yonghuService的selectById方法,根据房间预约实体中关联的用户ID获取对应的YonghuEntity对象(代表用户实体数据)
|
|
|
|
|
YonghuEntity yonghu = yonghuService.selectById(fangjianOrder.getYonghuId());
|
|
|
|
|
if (yonghu != null) {
|
|
|
|
|
// 使用BeanUtils工具类的copyProperties方法,将yonghu对象的部分属性值复制到view对象中(排除指定的字段),把级联的用户数据添加到视图中,确保传递给前端的用户相关数据是符合需求且不冗余的
|
|
|
|
|
BeanUtils.copyProperties(yonghu, view, new String[]{"id", "createTime", "insertTime", "updateTime"});
|
|
|
|
|
// 设置视图对象中的用户ID,保证前端能正确获取和展示关联的用户ID信息
|
|
|
|
|
view.setYonghuId(yonghu.getId());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 调用dictionaryService的dictionaryConvert方法,对转换后的FangjianOrderView对象中的对应字典表字段进行转换(类似前面page方法中的转换操作),传入当前的HttpServletRequest对象用于获取上下文相关信息等,使前端展示的数据更友好可读
|
|
|
|
|
dictionaryService.dictionaryConvert(view, request);
|
|
|
|
|
// 返回成功的响应给前端,并将包含处理好的房间预约详情视图数据的FangjianOrderView对象放入响应中,前端可以据此展示详细的房间预约信息
|
|
|
|
|
return R.ok().put("data", view);
|
|
|
|
|
}else {
|
|
|
|
|
return R.error(511,"查不到数据");
|
|
|
|
|
} else {
|
|
|
|
|
// 如果根据传入的ID没有查询到对应的房间预约数据,返回一个错误信息给前端,错误码是511,提示查不到数据,告知前端请求的详情数据不存在
|
|
|
|
|
return R.error(511, "查不到数据");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 后端保存
|
|
|
|
|
*/
|
|
|
|
|
* 后端保存
|
|
|
|
|
* 用于保存新的房间预约信息,设置相关时间字段并插入到数据库中
|
|
|
|
|
*/
|
|
|
|
|
@RequestMapping("/save")
|
|
|
|
|
public R save(@RequestBody FangjianOrderEntity fangjianOrder, HttpServletRequest request){
|
|
|
|
|
logger.debug("save方法:,,Controller:{},,fangjianOrder:{}",this.getClass().getName(),fangjianOrder.toString());
|
|
|
|
|
public R save(@RequestBody FangjianOrderEntity fangjianOrder, HttpServletRequest request) {
|
|
|
|
|
// 记录debug级别的日志信息,记录当前执行的save方法所在的类名以及传入的FangjianOrderEntity对象信息(将对象转为字符串格式记录),方便调试查看请求数据情况
|
|
|
|
|
logger.debug("save方法:,,Controller:{},,fangjianOrder:{}", this.getClass().getName(), fangjianOrder.toString());
|
|
|
|
|
|
|
|
|
|
// 从当前请求的会话中获取用户角色信息,并转换为字符串类型,可能用于后续根据不同角色进行不同的数据处理逻辑判断
|
|
|
|
|
String role = String.valueOf(request.getSession().getAttribute("role"));
|
|
|
|
|
if(false)
|
|
|
|
|
return R.error(511,"永远不会进入");
|
|
|
|
|
else if("用户".equals(role))
|
|
|
|
|
// 此处条件永远为假,所以下面的代码块永远不会执行,可能是预留的逻辑或者后续需要修改调整的地方
|
|
|
|
|
if (false)
|
|
|
|
|
return R.error(511, "永远不会进入");
|
|
|
|
|
// 如果用户角色是"用户",则将当前登录用户的ID设置到房间预约实体对象中,关联该房间预约与当前用户
|
|
|
|
|
else if ("用户".equals(role))
|
|
|
|
|
fangjianOrder.setYonghuId(Integer.valueOf(String.valueOf(request.getSession().getAttribute("userId"))));
|
|
|
|
|
|
|
|
|
|
// 设置房间预约信息的创建时间为当前系统时间,用于记录该房间预约的创建时间点
|
|
|
|
|
fangjianOrder.setCreateTime(new Date());
|
|
|
|
|
// 调用fangjianOrderService的insert方法,将当前的FangjianOrderEntity对象插入到数据库中,实现保存新房间预约信息的功能
|
|
|
|
|
fangjianOrderService.insert(fangjianOrder);
|
|
|
|
|
// 如果插入操作成功,返回一个表示成功的响应给前端,告知前端数据已成功保存
|
|
|
|
|
return R.ok();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 后端修改
|
|
|
|
|
*/
|
|
|
|
|
* 后端修改
|
|
|
|
|
* 用于更新已存在的房间预约信息,先根据条件判断是否有重复数据,然后更新数据库中的对应记录
|
|
|
|
|
*/
|
|
|
|
|
@RequestMapping("/update")
|
|
|
|
|
public R update(@RequestBody FangjianOrderEntity fangjianOrder, HttpServletRequest request){
|
|
|
|
|
logger.debug("update方法:,,Controller:{},,fangjianOrder:{}",this.getClass().getName(),fangjianOrder.toString());
|
|
|
|
|
public R update(@RequestBody FangjianOrderEntity fangjianOrder, HttpServletRequest request) {
|
|
|
|
|
// 记录debug级别的日志信息,记录当前执行的update方法所在的类名以及传入的FangjianOrderEntity对象信息(将对象转为字符串格式记录),方便调试查看请求数据情况
|
|
|
|
|
logger.debug("update方法:,,Controller:{},,fangjianOrder:{}", this.getClass().getName(), fangjianOrder.toString());
|
|
|
|
|
|
|
|
|
|
// 从当前请求的会话中获取用户角色信息,并转换为字符串类型,可能用于后续根据不同角色进行不同的数据处理逻辑判断(当前部分代码被注释掉了,可能是之前的逻辑或者后续需要调整补充的地方)
|
|
|
|
|
String role = String.valueOf(request.getSession().getAttribute("role"));
|
|
|
|
|
// if(false)
|
|
|
|
|
// return R.error(511,"永远不会进入");
|
|
|
|
|
// else if("用户".equals(role))
|
|
|
|
|
// if (false)
|
|
|
|
|
// return R.error(511, "永远不会进入");
|
|
|
|
|
// else if ("用户".equals(role))
|
|
|
|
|
// fangjianOrder.setYonghuId(Integer.valueOf(String.valueOf(request.getSession().getAttribute("userId"))));
|
|
|
|
|
//根据字段查询是否有相同数据
|
|
|
|
|
|
|
|
|
|
// 根据字段查询是否有相同数据,这里构建了一个EntityWrapper对象用于设置查询条件,目前只设置了id为0的条件(可能需要根据实际业务修改正确的判断重复数据的条件)
|
|
|
|
|
Wrapper<FangjianOrderEntity> queryWrapper = new EntityWrapper<FangjianOrderEntity>()
|
|
|
|
|
.eq("id",0)
|
|
|
|
|
;
|
|
|
|
|
.eq("id", 0);
|
|
|
|
|
|
|
|
|
|
logger.info("sql语句:"+queryWrapper.getSqlSegment());
|
|
|
|
|
// 记录构建好的查询语句对应的SQL片段信息,方便调试查看具体的查询条件
|
|
|
|
|
logger.info("sql语句:" + queryWrapper.getSqlSegment());
|
|
|
|
|
// 调用fangjianOrderService的selectOne方法,根据构建好的查询条件从数据库中查询是否存在满足条件的FangjianOrderEntity对象(即是否存在相同数据的记录,当前条件可能不准确,需完善)
|
|
|
|
|
FangjianOrderEntity fangjianOrderEntity = fangjianOrderService.selectOne(queryWrapper);
|
|
|
|
|
if(fangjianOrderEntity==null){
|
|
|
|
|
fangjianOrderService.updateById(fangjianOrder);//根据id更新
|
|
|
|
|
if (fangjianOrderEntity == null) {
|
|
|
|
|
// 如果查询结果为null,表示不存在相同数据的记录,调用fangjianOrderService的updateById方法,根据传入的房间预约实体对象的ID更新数据库中的对应记录
|
|
|
|
|
fangjianOrderService.updateById(fangjianOrder);
|
|
|
|
|
// 如果更新操作成功,返回一个表示成功的响应给前端,告知前端数据已成功更新
|
|
|
|
|
return R.ok();
|
|
|
|
|
}else {
|
|
|
|
|
return R.error(511,"表中有相同数据");
|
|
|
|
|
} else {
|
|
|
|
|
// 如果查询到了相同数据的记录,返回一个错误信息给前端,错误码是511,提示表中有相同数据,告知前端更新操作因数据重复而失败
|
|
|
|
|
return R.error(511, "表中有相同数据");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 删除
|
|
|
|
|
*/
|
|
|
|
|
* 删除
|
|
|
|
|
* 根据传入的房间预约ID数组,批量删除对应的房间预约记录
|
|
|
|
|
*/
|
|
|
|
|
@RequestMapping("/delete")
|
|
|
|
|
public R delete(@RequestBody Integer[] ids){
|
|
|
|
|
logger.debug("delete:,,Controller:{},,ids:{}",this.getClass().getName(),ids.toString());
|
|
|
|
|
public R delete(@RequestBody Integer[] ids) {
|
|
|
|
|
// 记录debug级别的日志信息,记录当前执行的delete方法所在的类名以及传入的房间预约ID数组信息(将数组转为字符串格式记录),方便调试查看请求参数情况
|
|
|
|
|
logger.debug("delete:,,Controller:{},,ids:{}", this.getClass().getName(), ids.toString());
|
|
|
|
|
// 调用fangjianOrderService的deleteBatchIds方法,传入要删除的房间预约ID列表,批量删除数据库中对应的记录
|
|
|
|
|
fangjianOrderService.deleteBatchIds(Arrays.asList(ids));
|
|
|
|
|
// 如果删除操作成功,返回一个表示成功的响应给前端,告知前端数据已成功删除
|
|
|
|
|
return R.ok();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 批量上传
|
|
|
|
|
* 用于批量上传房间预约信息,从指定的Excel文件(仅支持后缀为.xls的文件)中读取数据,进行处理后批量插入到数据库中
|
|
|
|
|
*/
|
|
|
|
|
@RequestMapping("/batchInsert")
|
|
|
|
|
public R save( String fileName, HttpServletRequest request){
|
|
|
|
|
logger.debug("batchInsert方法:,,Controller:{},,fileName:{}",this.getClass().getName(),fileName);
|
|
|
|
|
public R save(String fileName, HttpServletRequest request) {
|
|
|
|
|
// 记录debug级别的日志信息,记录当前执行的batchInsert方法所在的类名以及传入的文件名参数,方便调试查看请求参数情况
|
|
|
|
|
logger.debug("batchInsert方法:,,Controller:{},,fileName:{}", this.getClass().getName(), fileName);
|
|
|
|
|
// 从当前请求的会话中获取当前登录用户的ID,并转换为Integer类型,可能用于关联上传的房间预约信息与当前用户
|
|
|
|
|
Integer yonghuId = Integer.valueOf(String.valueOf(request.getSession().getAttribute("userId")));
|
|
|
|
|
// 创建一个SimpleDateFormat对象,用于格式化日期时间,这里指定的格式是 "yyyy-MM-dd HH:mm:ss",可能用于后续日期时间相关的处理
|
|
|
|
|
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
|
|
|
|
|
try {
|
|
|
|
|
List<FangjianOrderEntity> fangjianOrderList = new ArrayList<>();//上传的东西
|
|
|
|
|
Map<String, List<String>> seachFields= new HashMap<>();//要查询的字段
|
|
|
|
|
// 创建一个列表,用于存放从文件中读取并解析后要批量插入的FangjianOrderEntity对象(代表房间预约实体数据)
|
|
|
|
|
List<FangjianOrderEntity> fangjianOrderList = new ArrayList<>();
|
|
|
|
|
// 创建一个Map,用于存放要查询是否重复的字段信息(目前代码中未看到具体使用逻辑,可能需要完善,比如后续根据这些字段判断数据是否重复等)
|
|
|
|
|
Map<String, List<String>> seachFields = new HashMap<>();
|
|
|
|
|
// 获取当前系统时间,可能用于设置房间预约信息的相关时间字段
|
|
|
|
|
Date date = new Date();
|
|
|
|
|
// 获取文件名中最后一个点(.)的索引位置,用于判断文件后缀名
|
|
|
|
|
int lastIndexOf = fileName.lastIndexOf(".");
|
|
|
|
|
if(lastIndexOf == -1){
|
|
|
|
|
return R.error(511,"该文件没有后缀");
|
|
|
|
|
}else{
|
|
|
|
|
if (lastIndexOf == -1) {
|
|
|
|
|
// 如果文件名没有后缀,返回一个错误响应给前端,错误码为511,并提示“该文件没有后缀”,告知前端上传的文件不符合要求
|
|
|
|
|
return R.error(511, "该文件没有后缀");
|
|
|
|
|
} else {
|
|
|
|
|
// 获取文件名中从最后一个点(.)开始到结尾的字符串,即文件后缀名
|
|
|
|
|
String suffix = fileName.substring(lastIndexOf);
|
|
|
|
|
if(!".xls".equals(suffix)){
|
|
|
|
|
return R.error(511,"只支持后缀为xls的excel文件");
|
|
|
|
|
}else{
|
|
|
|
|
URL resource = this.getClass().getClassLoader().getResource("static/upload/" + fileName);//获取文件路径
|
|
|
|
|
// 判断后缀名是否不等于 ".xls",如果不是 ".xls" 后缀的文件,说明不符合当前方法支持的文件类型要求
|
|
|
|
|
if (!".xls".equals(suffix)) {
|
|
|
|
|
// 返回一个错误信息给前端,错误码是511,并提示“只支持后缀为xls的excel文件”,告知前端上传的文件格式不正确
|
|
|
|
|
return R.error(511, "只支持后缀为xls的excel文件");
|
|
|
|
|
} else {
|
|
|
|
|
// 通过当前类的类加载器获取指定文件(位于 "static/upload/" 目录下,文件名由传入的fileName指定)的资源路径,返回一个URL对象
|
|
|
|
|
URL resource = this.getClass().getClassLoader().getResource("static/upload/" + fileName);
|
|
|
|
|
// 根据获取到的URL对象对应的文件路径创建一个File对象,用于后续判断文件是否存在以及读取文件内容等操作
|
|
|
|
|
File file = new File(resource.getFile());
|
|
|
|
|
if(!file.exists()){
|
|
|
|
|
return R.error(511,"找不到上传文件,请联系管理员");
|
|
|
|
|
}else{
|
|
|
|
|
List<List<String>> dataList = PoiUtil.poiImport(file.getPath());//读取xls文件
|
|
|
|
|
dataList.remove(0);//删除第一行,因为第一行是提示
|
|
|
|
|
for(List<String> data:dataList){
|
|
|
|
|
//循环
|
|
|
|
|
// 判断该文件是否不存在,如果不存在,则执行下面的返回错误信息的逻辑
|
|
|
|
|
if (!file.exists()) {
|
|
|
|
|
// 返回一个错误信息给前端,错误码是511,提示“找不到上传文件,请联系管理员”,告知前端文件未找到,需要联系管理员解决
|
|
|
|
|
return R.error(511, "找不到上传文件,请联系管理员");
|
|
|
|
|
} else {
|
|
|
|
|
// 调用PoiUtil工具类的poiImport方法,传入文件的路径,读取该.xls文件内容,返回的数据结构是一个嵌套的List,外层List表示行,内层List的每个元素表示每行中的单元格数据,存放在dataList中
|
|
|
|
|
List<List<String>> dataList = PoiUtil.poiImport(file.getPath());
|
|
|
|
|
// 删除dataList中的第一行数据,通常是因为第一行可能是标题行、提示信息之类的内容,在后续将数据转换为实体对象时不需要这一行数据
|
|
|
|
|
dataList.remove(0);
|
|
|
|
|
// 遍历dataList中剩余的每一行数据(每一行数据也是一个List<String>类型,表示该行各个单元格的数据)
|
|
|
|
|
for (List<String> data : dataList) {
|
|
|
|
|
// 创建一个FangjianOrderEntity对象,用于将从Excel文件中读取到的每行数据转换为对应的实体对象,后续可插入到数据库中
|
|
|
|
|
FangjianOrderEntity fangjianOrderEntity = new FangjianOrderEntity();
|
|
|
|
|
// fangjianOrderEntity.setFangjianId(Integer.valueOf(data.get(0))); //房间 要改的
|
|
|
|
|
// fangjianOrderEntity.setYonghuId(Integer.valueOf(data.get(0))); //用户 要改的
|
|
|
|
|
// fangjianOrderEntity.setFangjianOrderTime(sdf.parse(data.get(0))); //预约日期 要改的
|
|
|
|
|
// fangjianOrderEntity.setFangjianOrderText(data.get(0)); //预约备注 要改的
|
|
|
|
|
// fangjianOrderEntity.setFangjianOrderTypes(Integer.valueOf(data.get(0))); //订单状态 要改的
|
|
|
|
|
// fangjianOrderEntity.setCreateTime(date);//时间
|
|
|
|
|
// 以下这几行代码原本是用于设置FangjianOrderEntity对象的各个属性值,但目前都是设置为固定值或者取了错误的数据索引(都取的data.get(0)),后续应该根据实际Excel文件中数据的列顺序修改正确的获取数据的索引和赋值逻辑
|
|
|
|
|
// 设置房间ID,此处应该根据实际Excel文件中房间ID所在列的索引来获取正确的值,当前写法有误(都取的data.get(0)),要改的
|
|
|
|
|
fangjianOrderEntity.setFangjianId(Integer.valueOf(data.get(0)));
|
|
|
|
|
// 设置用户ID,同样这里取值有误(取的data.get(0)),应该按实际Excel文件中用户ID所在列来获取对应数据,要改的
|
|
|
|
|
fangjianOrderEntity.setYonghuId(Integer.valueOf(data.get(0)));
|
|
|
|
|
// 设置预约日期,通过SimpleDateFormat对象sdf将Excel文件中对应列的数据(当前取值错误,应该按正确列索引获取,且要保证数据格式符合解析要求)解析为Date类型后设置为预约日期,要改的
|
|
|
|
|
fangjianOrderEntity.setFangjianOrderTime(sdf.parse(data.get(0)));
|
|
|
|
|
// 设置预约备注,也是错误的取值方式(取的data.get(0)),需要改成对应正确的数据获取逻辑,要改的
|
|
|
|
|
fangjianOrderEntity.setFangjianOrderText(data.get(0));
|
|
|
|
|
// 设置订单状态,将Excel文件中对应列的数据转换为Integer类型后设置为订单状态(当前取值错误,应按正确列索引获取),要改的
|
|
|
|
|
fangjianOrderEntity.setFangjianOrderTypes(Integer.valueOf(data.get(0)));
|
|
|
|
|
// 设置创建时间,将前面获取的当前系统时间date设置为该房间预约信息的创建时间,用于记录创建的时间点
|
|
|
|
|
fangjianOrderEntity.setCreateTime(date);
|
|
|
|
|
// 将设置好属性的FangjianOrderEntity对象添加到fangjianOrderList列表中,后续将批量插入这些对象到数据库
|
|
|
|
|
fangjianOrderList.add(fangjianOrderEntity);
|
|
|
|
|
|
|
|
|
|
// 把要查询是否重复的字段放入seachFields这个Map中(代码中此处未看到具体放入map的实现逻辑,可能后续要补充完整,比如根据业务需求确定哪些字段用于判断重复,以及如何组织这些字段数据放入map等)
|
|
|
|
|
|
|
|
|
|
//把要查询是否重复的字段放入map中
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//查询是否重复
|
|
|
|
|
// 调用fangjianOrderService的insertBatch方法,将fangjianOrderList中的多个FangjianOrderEntity对象批量插入到数据库中,实现批量保存房间预约信息的功能
|
|
|
|
|
fangjianOrderService.insertBatch(fangjianOrderList);
|
|
|
|
|
// 如果批量插入操作成功,返回一个表示成功的响应给前端,告知前端数据已成功插入
|
|
|
|
|
return R.ok();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}catch (Exception e){
|
|
|
|
|
} catch (Exception e) {
|
|
|
|
|
// 如果在上述文件读取、数据处理或者批量插入等操作过程中出现异常,打印异常堆栈信息,方便开发人员排查问题所在,定位错误原因
|
|
|
|
|
e.printStackTrace();
|
|
|
|
|
return R.error(511,"批量插入数据异常,请联系管理员");
|
|
|
|
|
// 返回一个错误信息给前端,错误码是511,提示“批量插入数据异常,请联系管理员”,告知前端出现异常情况,需要联系管理员处理
|
|
|
|
|
return R.error(511, "批量插入数据异常,请联系管理员");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 前端列表
|
|
|
|
|
*/
|
|
|
|
|
* 前端列表
|
|
|
|
|
* 用于获取房间预约信息的分页列表数据,不需要进行权限认证(通过 @IgnoreAuth 注解标识),根据传入的参数进行相应的查询和数据处理后返回给前端展示
|
|
|
|
|
*/
|
|
|
|
|
@IgnoreAuth
|
|
|
|
|
@RequestMapping("/list")
|
|
|
|
|
public R list(@RequestParam Map<String, Object> params, HttpServletRequest request){
|
|
|
|
|
logger.debug("list方法:,,Controller:{},,params:{}",this.getClass().getName(),JSONObject.toJSONString(params));
|
|
|
|
|
|
|
|
|
|
// 没有指定排序字段就默认id倒序
|
|
|
|
|
if(StringUtil.isEmpty(String.valueOf(params.get("orderBy")))){
|
|
|
|
|
params.put("orderBy","id");
|
|
|
|
|
public R list(@RequestParam Map<String, Object> params, HttpServletRequest request) {
|
|
|
|
|
// 记录debug级别的日志信息,记录当前执行的list方法所在的类名以及传入的参数信息(将参数转为JSON字符串格式记录),方便调试时查看请求参数的具体情况
|
|
|
|
|
logger.debug("list方法:,,Controller:{},,params:{}", this.getClass().getName(), JSONObject.toJSONString(params));
|
|
|
|
|
|
|
|
|
|
// 判断传入的参数中是否指定了排序字段,如果没有指定(即获取到的orderBy参数为空字符串)
|
|
|
|
|
if (StringUtil.isEmpty(String.valueOf(params.get("orderBy")))) {
|
|
|
|
|
// 就默认按照id字段倒序排序,将orderBy参数设置为id,确定返回数据的默认排序规则
|
|
|
|
|
params.put("orderBy", "id");
|
|
|
|
|
}
|
|
|
|
|
// 调用fangjianOrderService的queryPage方法,根据传入的参数查询并获取分页数据,存放在PageUtils对象中,该对象包含了分页相关的各种信息以及实际的数据列表等
|
|
|
|
|
PageUtils page = fangjianOrderService.queryPage(params);
|
|
|
|
|
|
|
|
|
|
//字典表数据转换
|
|
|
|
|
List<FangjianOrderView> list =(List<FangjianOrderView>)page.getList();
|
|
|
|
|
for(FangjianOrderView c:list)
|
|
|
|
|
dictionaryService.dictionaryConvert(c, request); //修改对应字典表字段
|
|
|
|
|
// 获取分页数据中的数据列表,这里强制转换为List<FangjianOrderView>类型,这些视图对象是适合前端展示的房间预约相关数据格式,可能经过了一定的数据处理和转换
|
|
|
|
|
List<FangjianOrderView> list = (List<FangjianOrderView>) page.getList();
|
|
|
|
|
for (FangjianOrderView c : list) {
|
|
|
|
|
// 循环调用dictionaryService的dictionaryConvert方法,用于对每个FangjianOrderView对象中的对应字典表字段进行转换(比如将字典编码转换为对应的文字描述等),传入当前的HttpServletRequest对象可能是用于获取一些上下文相关信息等,确保前端展示的数据是友好可读的格式
|
|
|
|
|
dictionaryService.dictionaryConvert(c, request);
|
|
|
|
|
}
|
|
|
|
|
// 返回成功的响应给前端,并将包含处理好的分页数据的PageUtils对象放入响应中,前端可以根据此数据进行展示等操作,例如在页面上分页展示房间预约列表信息
|
|
|
|
|
return R.ok().put("data", page);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 前端详情
|
|
|
|
|
*/
|
|
|
|
|
* 前端详情
|
|
|
|
|
* 根据传入的房间预约ID获取对应的详细信息,包括关联的房间、用户等相关信息,并进行数据转换和处理后返回给前端展示
|
|
|
|
|
*/
|
|
|
|
|
@RequestMapping("/detail/{id}")
|
|
|
|
|
public R detail(@PathVariable("id") Long id, HttpServletRequest request){
|
|
|
|
|
logger.debug("detail方法:,,Controller:{},,id:{}",this.getClass().getName(),id);
|
|
|
|
|
public R detail(@PathVariable("id") Long id, HttpServletRequest request) {
|
|
|
|
|
// 记录debug级别的日志信息,记录当前执行的detail方法所在的类名以及传入的房间预约ID参数,方便调试查看请求参数情况
|
|
|
|
|
logger.debug("detail方法:,,Controller:{},,id:{}", this.getClass().getName(), id);
|
|
|
|
|
// 调用fangjianOrderService的selectById方法,根据传入的房间预约ID从数据库中查询对应的FangjianOrderEntity对象(代表房间预约实体数据)
|
|
|
|
|
FangjianOrderEntity fangjianOrder = fangjianOrderService.selectById(id);
|
|
|
|
|
if(fangjianOrder !=null){
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//entity转view
|
|
|
|
|
FangjianOrderView view = new FangjianOrderView();
|
|
|
|
|
BeanUtils.copyProperties( fangjianOrder , view );//把实体数据重构到view中
|
|
|
|
|
if (fangjianOrder != null) {
|
|
|
|
|
// 创建一个FangjianOrderView对象,用于将从数据库查询到的FangjianOrderEntity实体数据转换为适合前端展示的视图数据格式
|
|
|
|
|
FangjianOrderView view = new FangjianOrderView();
|
|
|
|
|
// 使用BeanUtils工具类的copyProperties方法,将fangjianOrder对象的属性值复制到view对象中,实现实体数据到视图数据的转换(前提是FangjianOrderEntity和FangjianOrderView的属性有对应关系)
|
|
|
|
|
BeanUtils.copyProperties(fangjianOrder, view);
|
|
|
|
|
|
|
|
|
|
// 以下是处理级联表相关的数据,获取房间预约对应的房间信息,并添加到视图对象中(排除一些不需要的字段,如id、创建时间等字段)
|
|
|
|
|
// 调用fangjianService的selectById方法,根据房间预约实体中关联的房间ID获取对应的FangjianEntity对象(代表房间实体数据)
|
|
|
|
|
FangjianEntity fangjian = fangjianService.selectById(fangjianOrder.getFangjianId());
|
|
|
|
|
if (fangjian != null) {
|
|
|
|
|
// 使用BeanUtils工具类的copyProperties方法,将fangjian对象的部分属性值复制到view对象中(排除指定的字段),把级联的房间数据添加到视图中,确保传递给前端的房间相关数据是符合需求且不冗余的
|
|
|
|
|
BeanUtils.copyProperties(fangjian, view, new String[]{"id", "createDate"});
|
|
|
|
|
// 设置视图对象中的房间ID,保证前端能正确获取和展示关联的房间ID信息
|
|
|
|
|
view.setFangjianId(fangjian.getId());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//级联表
|
|
|
|
|
FangjianEntity fangjian = fangjianService.selectById(fangjianOrder.getFangjianId());
|
|
|
|
|
if(fangjian != null){
|
|
|
|
|
BeanUtils.copyProperties( fangjian , view ,new String[]{ "id", "createDate"});//把级联的数据添加到view中,并排除id和创建时间字段
|
|
|
|
|
view.setFangjianId(fangjian.getId());
|
|
|
|
|
}
|
|
|
|
|
//级联表
|
|
|
|
|
YonghuEntity yonghu = yonghuService.selectById(fangjianOrder.getYonghuId());
|
|
|
|
|
if(yonghu != null){
|
|
|
|
|
BeanUtils.copyProperties( yonghu , view ,new String[]{ "id", "createDate"});//把级联的数据添加到view中,并排除id和创建时间字段
|
|
|
|
|
view.setYonghuId(yonghu.getId());
|
|
|
|
|
}
|
|
|
|
|
//修改对应字典表字段
|
|
|
|
|
dictionaryService.dictionaryConvert(view, request);
|
|
|
|
|
return R.ok().put("data", view);
|
|
|
|
|
}else {
|
|
|
|
|
return R.error(511,"查不到数据");
|
|
|
|
|
// 以下是处理级联表相关的数据,获取房间预约对应的用户信息,并添加到视图对象中(排除一些不需要的字段,如id、创建时间等字段)
|
|
|
|
|
// 调用yonghuService的selectById方法,根据房间预约实体中关联的用户ID获取对应的YonghuEntity对象(代表用户实体数据)
|
|
|
|
|
YonghuEntity yonghu = yonghuService.selectById(fangjianOrder.getYonghuId());
|
|
|
|
|
if (yonghu != null) {
|
|
|
|
|
// 使用BeanUtils工具类的copyProperties方法,将yonghu对象的部分属性值复制到view对象中(排除指定的字段),把级联的用户数据添加到视图中,确保传递给前端的用户相关数据是符合需求且不冗余的
|
|
|
|
|
BeanUtils.copyProperties(yonghu, view, new String[]{"id", "createDate"});
|
|
|
|
|
// 设置视图对象中的用户ID,保证前端能正确获取和展示关联的用户ID信息
|
|
|
|
|
view.setYonghuId(yonghu.getId());
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 调用dictionaryService的dictionaryConvert方法,对转换后的FangjianOrderView对象中的对应字典表字段进行转换(类似前面list方法中的转换操作),传入当前的HttpServletRequest对象用于获取上下文相关信息等,使前端展示的数据更友好可读
|
|
|
|
|
dictionaryService.dictionaryConvert(view, request);
|
|
|
|
|
// 返回成功的响应给前端,并将包含处理好的房间预约详情视图数据的FangjianOrderView对象放入响应中,前端可以据此展示详细的房间预约信息
|
|
|
|
|
return R.ok().put("data", view);
|
|
|
|
|
} else {
|
|
|
|
|
// 如果根据传入的ID没有查询到对应的房间预约数据,返回一个错误信息给前端,错误码是511,提示“查不到数据”,告知前端请求的详情数据不存在
|
|
|
|
|
return R.error(511, "查不到数据");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 前端保存
|
|
|
|
|
*/
|
|
|
|
|
* 前端保存
|
|
|
|
|
* 用于处理前端提交的房间预约信息保存请求,进行相关业务逻辑判断(如房间是否存在、用户余额是否足够等)后,将预约信息保存到数据库,并更新相关用户信息
|
|
|
|
|
*/
|
|
|
|
|
@RequestMapping("/add")
|
|
|
|
|
public R add(@RequestBody FangjianOrderEntity fangjianOrder, HttpServletRequest request){
|
|
|
|
|
logger.debug("add方法:,,Controller:{},,fangjianOrder:{}",this.getClass().getName(),fangjianOrder.toString());
|
|
|
|
|
FangjianEntity fangjianEntity = fangjianService.selectById(fangjianOrder.getFangjianId());
|
|
|
|
|
if(fangjianEntity == null){
|
|
|
|
|
return R.error(511,"查不到该房间信息");
|
|
|
|
|
}
|
|
|
|
|
// Double fangjianNewMoney = fangjianEntity.getFangjianMoney();
|
|
|
|
|
public R add(@RequestBody FangjianOrderEntity fangjianOrder, HttpServletRequest request) {
|
|
|
|
|
// 记录debug级别的日志信息,记录当前执行的add方法所在的类名以及传入的FangjianOrderEntity对象信息(将对象转为字符串格式记录),方便调试查看请求数据情况
|
|
|
|
|
logger.debug("add方法:,,Controller:{},,fangjianOrder:{}", this.getClass().getName(), fangjianOrder.toString());
|
|
|
|
|
// 根据传入的房间预约信息中的房间ID,调用fangjianService的selectById方法查询对应的FangjianEntity对象(代表房间实体数据),用于后续判断房间是否存在以及获取房间价格等操作
|
|
|
|
|
FangjianEntity fangjianEntity = fangjianService.selectById(fangjianOrder.getFangjianId());
|
|
|
|
|
if (fangjianEntity == null) {
|
|
|
|
|
// 如果没有查询到对应的房间信息,返回一个错误信息给前端,错误码是511,提示“查不到该房间信息”,告知前端房间不存在,无法进行预约操作
|
|
|
|
|
return R.error(511, "查不到该房间信息");
|
|
|
|
|
}
|
|
|
|
|
// 以下这行代码被注释掉了,原本可能是用于获取房间的新价格(具体用途需结合业务逻辑确定),目前代码中未使用该变量
|
|
|
|
|
// Double fangjianNewMoney = fangjianEntity.getFangjianMoney();
|
|
|
|
|
|
|
|
|
|
if(false){
|
|
|
|
|
}
|
|
|
|
|
// 此处条件永远为假,可能是预留的逻辑或者后续需要修改调整的地方,目前没有实际执行的代码块
|
|
|
|
|
if (false) {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//计算所获得积分
|
|
|
|
|
Double buyJifen =0.0;
|
|
|
|
|
Integer userId = (Integer) request.getSession().getAttribute("userId");
|
|
|
|
|
YonghuEntity yonghuEntity = yonghuService.selectById(userId);
|
|
|
|
|
if(yonghuEntity == null)
|
|
|
|
|
return R.error(511,"用户不能为空");
|
|
|
|
|
if(yonghuEntity.getNewMoney() == null)
|
|
|
|
|
return R.error(511,"用户金额不能为空");
|
|
|
|
|
double balance = yonghuEntity.getNewMoney() - fangjianEntity.getFangjianMoney()*1;//余额
|
|
|
|
|
if(balance<0)
|
|
|
|
|
return R.error(511,"余额不够支付");
|
|
|
|
|
fangjianOrder.setFangjianOrderTypes(1); //设置订单状态为已支付
|
|
|
|
|
fangjianOrder.setYonghuId(userId); //设置订单支付人id
|
|
|
|
|
fangjianOrder.setCreateTime(new Date());
|
|
|
|
|
fangjianOrderService.insert(fangjianOrder);//新增订单
|
|
|
|
|
yonghuEntity.setNewMoney(balance);//设置金额
|
|
|
|
|
yonghuService.updateById(yonghuEntity);
|
|
|
|
|
return R.ok();
|
|
|
|
|
// 初始化用于存储所获得积分的变量,初始值设为0.0,后续可能根据业务规则计算实际获得的积分(目前代码中计算逻辑部分可能还不完善)
|
|
|
|
|
Double buyJifen = 0.0;
|
|
|
|
|
// 从当前请求的会话中获取当前登录用户的ID,并转换为Integer类型,用于后续关联房间预约信息与当前用户以及获取用户相关信息等操作
|
|
|
|
|
Integer userId = (Integer) request.getSession().getAttribute("userId");
|
|
|
|
|
// 根据获取到的用户ID,调用yonghuService的selectById方法查询对应的YonghuEntity对象(代表用户实体数据),用于后续判断用户是否存在以及获取用户金额等操作
|
|
|
|
|
YonghuEntity yonghuEntity = yonghuService.selectById(userId);
|
|
|
|
|
if (yonghuEntity == null) {
|
|
|
|
|
// 如果没有查询到对应的用户信息,返回一个错误信息给前端,错误码是511,提示“用户不能为空”,告知前端需要先登录用户或者用户信息不存在,无法进行预约操作
|
|
|
|
|
return R.error(511, "用户不能为空");
|
|
|
|
|
}
|
|
|
|
|
if (yonghuEntity.getNewMoney() == null) {
|
|
|
|
|
// 如果用户的金额信息为空,返回一个错误信息给前端,错误码是511,提示“用户金额不能为空”,告知前端无法进行金额相关的业务操作(如判断余额是否足够等)
|
|
|
|
|
return R.error(511, "用户金额不能为空");
|
|
|
|
|
}
|
|
|
|
|
// 计算用户余额,用用户当前的金额(yonghuEntity.getNewMoney())减去房间的价格(fangjianEntity.getFangjianMoney() * 1,这里乘以1可能表示按原价计算,具体看业务需求),得到支付后的余额
|
|
|
|
|
double balance = yonghuEntity.getNewMoney() - fangjianEntity.getFangjianMoney() * 1;
|
|
|
|
|
if (balance < 0) {
|
|
|
|
|
// 如果余额小于0,说明用户余额不够支付房间费用,返回一个错误信息给前端,错误码是511,提示“余额不够支付”,告知前端无法完成预约操作
|
|
|
|
|
return R.error(511, "余额不够支付");
|
|
|
|
|
}
|
|
|
|
|
// 设置房间预约信息的订单状态为已支付(可能在业务中用1表示已支付状态),更新房间预约实体对象中的订单状态字段
|
|
|
|
|
fangjianOrder.setFangjianOrderTypes(1);
|
|
|
|
|
// 设置房间预约信息的用户ID为当前登录用户的ID,将预约信息与当前用户关联起来,更新房间预约实体对象中的用户ID字段
|
|
|
|
|
fangjianOrder.setYonghuId(userId);
|
|
|
|
|
// 设置房间预约信息的创建时间为当前系统时间,用于记录该房间预约的创建时间点,更新房间预约实体对象中的创建时间字段
|
|
|
|
|
fangjianOrder.setCreateTime(new Date());
|
|
|
|
|
// 调用fangjianOrderService的insert方法,将当前的FangjianOrderEntity对象插入到数据库中,实现保存新房间预约信息的功能
|
|
|
|
|
fangjianOrderService.insert(fangjianOrder);
|
|
|
|
|
// 更新用户的金额信息,将用户的金额设置为支付后的余额,通过调用yonghuService的updateById方法更新数据库中对应的用户信息记录
|
|
|
|
|
yonghuEntity.setNewMoney(balance);
|
|
|
|
|
yonghuService.updateById(yonghuEntity);
|
|
|
|
|
// 如果整个保存操作(包括预约信息插入和用户信息更新)成功,返回一个表示成功的响应给前端,告知前端房间预约操作已成功完成
|
|
|
|
|
return R.ok();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 退款
|
|
|
|
|
*/
|
|
|
|
|
* 退款
|
|
|
|
|
* 根据传入的房间预约ID处理退款相关业务逻辑,包括判断相关信息是否存在、计算退款金额、更新订单状态以及相关的房间和用户信息等操作
|
|
|
|
|
*/
|
|
|
|
|
@RequestMapping("/refund")
|
|
|
|
|
public R refund(Integer id, HttpServletRequest request){
|
|
|
|
|
logger.debug("refund方法:,,Controller:{},,id:{}",this.getClass().getName(),id);
|
|
|
|
|
public R refund(Integer id, HttpServletRequest request) {
|
|
|
|
|
// 记录debug级别的日志信息,输出当前执行的"refund"方法所在的类名以及传入的房间预约ID参数,方便后续调试时查看具体的调用情况和参数值
|
|
|
|
|
logger.debug("refund方法:,,Controller:{},,id:{}", this.getClass().getName(), id);
|
|
|
|
|
// 从当前请求的会话中获取用户角色信息,并转换为字符串类型,不过从后续代码来看,暂时没有基于这个角色信息做进一步的业务逻辑处理(可能是预留的功能或者后续待完善的部分)
|
|
|
|
|
String role = String.valueOf(request.getSession().getAttribute("role"));
|
|
|
|
|
|
|
|
|
|
FangjianOrderEntity fangjianOrder = fangjianOrderService.selectById(id);
|
|
|
|
|
Integer buyNumber = 1;
|
|
|
|
|
Integer fangjianOrderPaymentTypes = 1;
|
|
|
|
|
Integer fangjianId = fangjianOrder.getFangjianId();
|
|
|
|
|
if(fangjianId == null)
|
|
|
|
|
return R.error(511,"查不到该房间信息");
|
|
|
|
|
FangjianEntity fangjianEntity = fangjianService.selectById(fangjianId);
|
|
|
|
|
if(fangjianEntity == null)
|
|
|
|
|
return R.error(511,"查不到该房间信息");
|
|
|
|
|
Double fangjianNewMoney = fangjianEntity.getFangjianMoney();
|
|
|
|
|
if(fangjianNewMoney == null)
|
|
|
|
|
return R.error(511,"房间信息价格不能为空");
|
|
|
|
|
|
|
|
|
|
Integer userId = (Integer) request.getSession().getAttribute("userId");
|
|
|
|
|
YonghuEntity yonghuEntity = yonghuService.selectById(userId);
|
|
|
|
|
if(yonghuEntity == null)
|
|
|
|
|
return R.error(511,"用户不能为空");
|
|
|
|
|
if(yonghuEntity.getNewMoney() == null)
|
|
|
|
|
return R.error(511,"用户金额不能为空");
|
|
|
|
|
|
|
|
|
|
Double zhekou = 1.0;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//判断是什么支付方式 1代表余额 2代表积分
|
|
|
|
|
if(fangjianOrderPaymentTypes == 1){//余额支付
|
|
|
|
|
//计算金额
|
|
|
|
|
Double money = fangjianEntity.getFangjianMoney() * buyNumber * zhekou;
|
|
|
|
|
//计算所获得积分
|
|
|
|
|
Double buyJifen = 0.0;
|
|
|
|
|
yonghuEntity.setNewMoney(yonghuEntity.getNewMoney() + money); //设置金额
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
// 根据传入的房间预约ID,调用fangjianOrderService的selectById方法从数据库中查询对应的FangjianOrderEntity对象(代表该房间预约的实体数据),用于后续获取该预约的相关信息进行退款相关逻辑处理
|
|
|
|
|
FangjianOrderEntity fangjianOrder = fangjianOrderService.selectById(id);
|
|
|
|
|
// 初始化购买数量变量,这里设置为1,可能表示此次退款操作对应的购买数量(具体含义需结合业务场景确定,也许后续会根据实际业务修改这个值)
|
|
|
|
|
Integer buyNumber = 1;
|
|
|
|
|
// 定义并初始化房间预约支付方式类型变量,这里设置为1,根据后续代码注释可知,1代表余额支付方式(可能在业务中有多种支付方式,通过这个变量来区分)
|
|
|
|
|
Integer fangjianOrderPaymentTypes = 1;
|
|
|
|
|
// 获取房间预约对应的房间ID,从前面查询到的FangjianOrderEntity对象中获取关联的房间ID,用于后续查询房间详细信息等操作
|
|
|
|
|
Integer fangjianId = fangjianOrder.getFangjianId();
|
|
|
|
|
// 判断房间ID是否为null,如果是null,说明没有找到对应的房间信息,返回一个错误信息给前端,错误码是511,并提示“查不到该房间信息”,告知前端无法进行退款操作,因为找不到对应的房间记录
|
|
|
|
|
if (fangjianId == null)
|
|
|
|
|
return R.error(511, "查不到该房间信息");
|
|
|
|
|
// 根据获取到的房间ID,调用fangjianService的selectById方法从数据库中查询对应的FangjianEntity对象(代表房间实体数据),用于获取房间的价格等信息进行退款金额计算等操作
|
|
|
|
|
FangjianEntity fangjianEntity = fangjianService.selectById(fangjianId);
|
|
|
|
|
// 判断房间实体对象是否为null,如果是null,说明没有查询到对应的房间信息,返回一个错误信息给前端,错误码是511,并提示“查不到该房间信息”,告知前端无法进行退款操作,因为房间信息不存在
|
|
|
|
|
if (fangjianEntity == null)
|
|
|
|
|
return R.error(511, "查不到该房间信息");
|
|
|
|
|
// 获取房间的价格信息,从FangjianEntity对象中获取房间的金额(可能表示房间的费用等,具体含义看业务定义),用于后续退款金额计算等操作
|
|
|
|
|
Double fangjianNewMoney = fangjianEntity.getFangjianMoney();
|
|
|
|
|
// 判断房间价格是否为null,如果是null,说明房间价格信息缺失,返回一个错误信息给前端,错误码是511,并提示“房间信息价格不能为空”,告知前端无法进行退款金额相关的计算操作,因为缺少房间价格数据
|
|
|
|
|
if (fangjianNewMemory == null)
|
|
|
|
|
return R.error(511, "房间信息价格不能为空");
|
|
|
|
|
|
|
|
|
|
// 从当前请求的会话中获取当前登录用户的ID,并转换为Integer类型,用于后续关联退款操作与当前用户以及获取用户相关信息等操作
|
|
|
|
|
Integer userId = (Integer) request.getSession().getAttribute("userId");
|
|
|
|
|
// 根据获取到的用户ID,调用yonghuService的selectById方法从数据库中查询对应的YonghuEntity对象(代表用户实体数据),用于获取用户的金额等信息进行退款后金额更新等操作
|
|
|
|
|
YonghuEntity yonghuEntity = yonghuService.selectById(userId);
|
|
|
|
|
// 判断用户实体对象是否为null,如果是null,说明没有查询到对应的用户信息,返回一个错误信息给前端,错误码是511,并提示“用户不能为空”,告知前端无法进行退款操作,因为用户信息不存在
|
|
|
|
|
if (yonghuEntity == null)
|
|
|
|
|
return R.error(511, "用户不能为空");
|
|
|
|
|
// 判断用户的金额信息是否为null,如果是null,说明用户金额信息缺失,返回一个错误信息给前端,错误码是511,并提示“用户金额不能为空”,告知前端无法进行退款后金额更新等操作,因为缺少用户金额数据
|
|
|
|
|
if (yonghuEntity.getNewMoney() == null)
|
|
|
|
|
return R.error(511, "用户金额不能为空");
|
|
|
|
|
|
|
|
|
|
// 定义并初始化折扣变量,这里设置为1.0,表示没有折扣(具体折扣相关逻辑可能根据业务需求后续完善,也许不同情况会有不同的折扣值)
|
|
|
|
|
Double zhekou = 1.0;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 判断房间预约的支付方式类型,如果是1(根据前面定义代表余额支付方式),则进入以下余额支付的退款相关逻辑处理
|
|
|
|
|
if (fangjianOrderPaymentTypes == 1) {
|
|
|
|
|
// 计算退款金额,根据房间价格(fangjianEntity.getFangjianMoney())、购买数量(buyNumber)以及折扣(zhekou)相乘计算得出应退款的金额,这里目前只是简单的乘法计算,实际业务中可能会更复杂(比如涉及不同的计价规则等)
|
|
|
|
|
Double money = fangjianEntity.getFangjianMoney() * buyNumber * zhekou;
|
|
|
|
|
// 初始化用于存储所获得积分的变量,这里设置为0.0,可能在业务中有根据退款操作获取积分的规则(目前代码中计算逻辑部分可能还不完善,只是简单赋值)
|
|
|
|
|
Double buyJifen = 0.0;
|
|
|
|
|
// 更新用户的金额信息,将用户当前的金额(yonghuEntity.getNewMoney())加上计算得出的退款金额(money),实现把退款金额退还到用户账户余额中的操作,通过调用yonghuService的updateById方法后续会更新数据库中对应的用户信息记录
|
|
|
|
|
yonghuEntity.setNewMoney(yonghuEntity.getNewMoney() + money);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
fangjianOrder.setFangjianOrderTypes(2);//设置订单状态为退款
|
|
|
|
|
fangjianOrderService.updateById(fangjianOrder);//根据id更新
|
|
|
|
|
yonghuService.updateById(yonghuEntity);//更新用户信息
|
|
|
|
|
fangjianService.updateById(fangjianEntity);//更新订单中房间信息的信息
|
|
|
|
|
return R.ok();
|
|
|
|
|
// 设置房间预约信息的订单状态为退款(可能在业务中用2表示退款状态),更新房间预约实体对象中的订单状态字段,用于标记该订单已进入退款状态
|
|
|
|
|
fangjianOrder.setFangjianOrderTypes(2);
|
|
|
|
|
// 调用fangjianOrderService的updateById方法,根据传入的房间预约实体对象(包含已更新的订单状态等信息)的ID更新数据库中的对应记录,将订单状态修改为退款状态保存到数据库中
|
|
|
|
|
fangjianOrderService.updateById(fangjianOrder);
|
|
|
|
|
// 调用yonghuService的updateById方法,根据传入的用户实体对象(包含已更新的金额等信息)更新数据库中的对应用户记录,将用户信息更新保存到数据库中,比如更新用户余额等信息
|
|
|
|
|
yonghuService.updateById(yonghuEntity);
|
|
|
|
|
// 调用fangjianService的updateById方法,根据传入的房间实体对象(虽然代码中目前没有对房间实体对象做额外修改,也许后续会有相关逻辑完善)更新数据库中的对应房间记录,将房间相关信息更新保存到数据库中
|
|
|
|
|
fangjianService.updateById(fangjianEntity);
|
|
|
|
|
// 如果整个退款操作(包括订单状态更新、用户信息更新、房间信息更新等)成功,返回一个表示成功的响应给前端,告知前端退款操作已成功完成
|
|
|
|
|
return R.ok();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 发货
|
|
|
|
|
* 此方法根据传入的房间预约ID,将对应的房间预约订单状态设置为已发货状态(代码中设置为3表示发货状态),并更新到数据库中,如果更新失败则返回错误信息给前端
|
|
|
|
|
*/
|
|
|
|
|
@RequestMapping("/deliver")
|
|
|
|
|
public R deliver(Integer id ){
|
|
|
|
|
logger.debug("refund:,,Controller:{},,ids:{}",this.getClass().getName(),id.toString());
|
|
|
|
|
FangjianOrderEntity fangjianOrderEntity = new FangjianOrderEntity();;
|
|
|
|
|
public R deliver(Integer id) {
|
|
|
|
|
// 记录debug级别的日志信息,输出当前执行的"deliver"方法所在的类名以及传入的房间预约ID参数,方便后续调试时查看具体的调用情况和参数值,不过这里日志输出的方法名有误,应该是"deliver"而不是"refund"(可能是代码书写小失误)
|
|
|
|
|
logger.debug("refund:,,Controller:{},,ids:{}", this.getClass().getName(), id.toString());
|
|
|
|
|
// 创建一个FangjianOrderEntity对象,用于后续设置要更新的房间预约相关信息,这里先初始化一个空对象
|
|
|
|
|
FangjianOrderEntity fangjianOrderEntity = new FangjianOrderEntity();
|
|
|
|
|
// 设置FangjianOrderEntity对象的ID为传入的房间预约ID,用于确定要更新的是哪条房间预约记录
|
|
|
|
|
fangjianOrderEntity.setId(id);
|
|
|
|
|
// 设置FangjianOrderEntity对象的订单状态为已发货状态(这里假设业务中用3表示发货状态,具体看业务定义),准备更新该订单的状态信息到数据库中
|
|
|
|
|
fangjianOrderEntity.setFangjianOrderTypes(3);
|
|
|
|
|
boolean b = fangjianOrderService.updateById( fangjianOrderEntity);
|
|
|
|
|
if(!b){
|
|
|
|
|
// 调用fangjianOrderService的updateById方法,根据设置好的FangjianOrderEntity对象(包含要更新的ID和订单状态信息)更新数据库中的对应记录,返回一个布尔值表示更新操作是否成功
|
|
|
|
|
boolean b = fangjianOrderService.updateById(fangjianOrderEntity);
|
|
|
|
|
// 判断更新操作是否失败,如果b为false,说明更新数据库记录时出现问题,返回一个错误信息给前端,提示“操作出错”,告知前端发货操作未能成功执行
|
|
|
|
|
if (!b) {
|
|
|
|
|
return R.error("操作出错");
|
|
|
|
|
}
|
|
|
|
|
// 如果更新操作成功,返回一个表示成功的响应给前端,告知前端发货操作已成功完成
|
|
|
|
|
return R.ok();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
}
|