浏览代码

Merge remote-tracking branch 'origin/master'

# Conflicts:
#	leromro-common/src/main/java/com/leromro/common/core/domain/BaseEntity.java
LiRong 1 月之前
父节点
当前提交
0375623843

+ 3 - 1
leromro-common/src/main/java/com/leromro/common/core/domain/BaseEntity.java

@@ -5,7 +5,6 @@ import java.util.Date;
 import java.util.HashMap;
 import java.util.Map;
 
-import cn.hutool.core.date.DateTime;
 import com.baomidou.mybatisplus.annotation.FieldFill;
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.fasterxml.jackson.annotation.JsonFormat;
@@ -27,6 +26,7 @@ public class BaseEntity implements Serializable
     private String searchValue;
 
     /** 创建者 */
+    @TableField(fill = FieldFill.INSERT)
     private String createBy;
 
     /** 创建时间 */
@@ -35,10 +35,12 @@ public class BaseEntity implements Serializable
     private Date createTime;
 
     /** 更新者 */
+    @TableField(fill = FieldFill.UPDATE)
     private String updateBy;
 
     /** 更新时间 */
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @TableField(fill = FieldFill.UPDATE)
     private Date updateTime;
 
     /** 备注 */

+ 25 - 3
leromro-core/src/main/java/com/leromro/core/controller/VolunteerWorkDateController.java

@@ -3,14 +3,19 @@ package com.leromro.core.controller;
 import java.time.LocalDate;
 import java.util.Date;
 import java.util.List;
+import java.util.stream.Collectors;
 import javax.servlet.http.HttpServletResponse;
 
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.leromro.common.core.domain.R;
 import com.leromro.core.domain.VolunteerReservationTime;
+import com.leromro.core.domain.dto.AddReservationTimesDTO;
+import com.leromro.core.domain.vo.VolunteerReservationTimeVO;
 import com.leromro.core.facade.VolunteerWorkDateFacade;
 import com.leromro.core.service.IVolunteerReservationTimeService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
+import org.springframework.format.annotation.DateTimeFormat;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
@@ -44,7 +49,6 @@ public class VolunteerWorkDateController extends BaseController
      * 修改志愿者排班日期
      */
     @ApiOperation("修改志愿者排班日期")
-//    @PreAuthorize("@ss.hasPermi('volunteer:work-date:edit')")
     @Log(title = "志愿者排班日期", businessType = BusinessType.UPDATE)
     @PutMapping
     public AjaxResult edit(@RequestBody List<VolunteerWorkDate> list)
@@ -55,16 +59,34 @@ public class VolunteerWorkDateController extends BaseController
     /**
      * 根据志愿者id获取志愿者所有排班日期
      */
+    @ApiOperation("根据志愿者id获取志愿者所有排班日期")
+    @GetMapping("/getVolunteerWorkDate")
+    public R<List<LocalDate>> getVolunteerWorkDate(@RequestParam("volunteerId") Long volunteerId) {
+        List<LocalDate> list = volunteerWorkDateService.list(new LambdaQueryWrapper<VolunteerWorkDate>()
+                .eq(VolunteerWorkDate::getVolunteerId, volunteerId))
+                .stream().map(VolunteerWorkDate::getWorkDate).sorted().collect(Collectors.toList());
+        return R.ok(list);
+    }
+
 
     /**
      * 根据日期获取志愿者工作时间
      */
     @ApiOperation("根据日期获取志愿者工作时间")
     @GetMapping("/getTimesByDate")
-    public R<List<VolunteerReservationTime>> getTimesByDate(@RequestParam("volunteerId") Long volunteerId,
-                                                            @RequestParam("date") LocalDate date) {
+    public R<List<VolunteerReservationTimeVO>> getTimesByDate(@RequestParam("volunteerId") Long volunteerId,
+                                                              @RequestParam("date")  @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate date) {
         return workDateFacade.getTimesByDate(volunteerId,date);
 
     }
 
+    /**
+     * 新增预约志愿者时间
+     */
+//    @ApiOperation("新增预约志愿者时间")
+//    @PostMapping("/addReservationTimes")
+//    public R<Boolean> addReservationTimes(@RequestBody AddReservationTimesDTO dto) {
+//        return workDateFacade.addReservationTimes(dto);
+//    }
+
 }

+ 2 - 3
leromro-core/src/main/java/com/leromro/core/domain/VolunteerReservationTime.java

@@ -46,13 +46,12 @@ public class VolunteerReservationTime extends BaseEntity
     private LocalDate reservationDate;
 
     /** 预约时间 */
-    @JsonFormat(pattern = "yyyy-MM-dd")
+    @JsonFormat(pattern = "H:mm")
     @ApiModelProperty("预约时间")
     private LocalTime reservationTime;
 
     /** 客户id */
-    @Excel(name = "客户id")
-    @ApiModelProperty("客户id")
+    @ApiModelProperty("预约客户id")
     private Long clientId;
 
 

+ 2 - 4
leromro-core/src/main/java/com/leromro/core/domain/VolunteerWorkDate.java

@@ -36,7 +36,6 @@ public class VolunteerWorkDate extends BaseEntity
     private Long volunteerWorkDateId;
 
     /** 志愿者id */
-    @Excel(name = "志愿者id")
     @ApiModelProperty("志愿者id")
     private Long volunteerId;
 
@@ -46,17 +45,16 @@ public class VolunteerWorkDate extends BaseEntity
     private LocalDate workDate;
 
     /** 工作开始时间 */
-    @JsonFormat(pattern = "HH:mm")
+    @JsonFormat(pattern = "H:mm")
     @ApiModelProperty("工作开始时间")
     private LocalTime workStartTime;
 
     /** 工作结束时间 */
-    @JsonFormat(pattern = "HH:mm")
+    @JsonFormat(pattern = "H:mm")
     @ApiModelProperty("工作结束时间")
     private LocalTime workEndTime;
 
     /** 是否预约0否1是 */
-    @Excel(name = "是否预约0否1是")
     @ApiModelProperty("是否预约0否1是")
     private Integer hasReservation;
 

+ 35 - 0
leromro-core/src/main/java/com/leromro/core/domain/dto/AddReservationTimesDTO.java

@@ -0,0 +1,35 @@
+package com.leromro.core.domain.dto;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.time.LocalDate;
+import java.time.LocalTime;
+import java.util.List;
+
+@Data
+public class AddReservationTimesDTO {
+
+    @ApiModelProperty("志愿者id")
+    private Long volunteerId;
+
+    @ApiModelProperty("预约客户id")
+    private Long clientId;
+
+    @ApiModelProperty("预约客户id")
+    private List<ReservationInfo> infos;
+
+    @Data
+    public static class ReservationInfo {
+
+        @JsonFormat(pattern = "yyyy-MM-dd")
+        @ApiModelProperty("预约日期")
+        private LocalDate reservationDate;
+
+        @JsonFormat(pattern = "H:mm")
+        @ApiModelProperty("预约时间")
+        private List<LocalTime> reservationTimes;
+
+    }
+}

+ 26 - 0
leromro-core/src/main/java/com/leromro/core/domain/vo/VolunteerReservationTimeVO.java

@@ -0,0 +1,26 @@
+package com.leromro.core.domain.vo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Builder;
+import lombok.Data;
+
+import java.time.LocalTime;
+
+/**
+ * 返回指定日期的时间段状态,用于用户下单时查看志愿者空余时间
+ */
+@Data
+@Builder
+public class VolunteerReservationTimeVO {
+
+    @JsonFormat(pattern = "H:mm")
+    @ApiModelProperty("预约时间")
+    private LocalTime reservationTime;
+
+    @ApiModelProperty("预约客户id")
+    private Long clientId;
+
+    @ApiModelProperty("是否预约0否1是")
+    private Integer hasReservation;
+}

+ 86 - 16
leromro-core/src/main/java/com/leromro/core/facade/VolunteerWorkDateFacade.java

@@ -2,16 +2,23 @@ package com.leromro.core.facade;
 
 import cn.hutool.core.util.ObjectUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.leromro.common.core.domain.R;
 import com.leromro.core.domain.VolunteerReservationTime;
 import com.leromro.core.domain.VolunteerWorkDate;
+import com.leromro.core.domain.dto.AddReservationTimesDTO;
+import com.leromro.core.domain.vo.VolunteerReservationTimeVO;
 import com.leromro.core.service.IVolunteerReservationTimeService;
 import com.leromro.core.service.IVolunteerWorkDateService;
 import lombok.RequiredArgsConstructor;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 
 import java.time.LocalDate;
+import java.time.LocalTime;
+import java.util.ArrayList;
 import java.util.List;
+import java.util.Map;
 import java.util.stream.Collectors;
 
 @Service
@@ -28,21 +35,84 @@ public class VolunteerWorkDateFacade {
      * @param date
      * @return
      */
-    public R<List<VolunteerReservationTime>> getTimesByDate(Long volunteerId,LocalDate date) {
-//        //判断志愿者当前日期是否排班
-//        VolunteerWorkDate dateInfo = workDateService.getOne(new LambdaQueryWrapper<VolunteerWorkDate>()
-//                .eq(VolunteerWorkDate::getVolunteerId, volunteerId)
-//                .eq(VolunteerWorkDate::getWorkDate, date));
-//        if (ObjectUtil.isNull(dateInfo)){
-//            return R.fail("该志愿者当前日期未排班");
-//        }
-//        //获取当前志愿者所有预约时间
-//        List<VolunteerReservationTime> reservationTimes = reservationTimeService.list(new LambdaQueryWrapper<VolunteerReservationTime>()
-//                .eq(VolunteerReservationTime::getVolunteerId, volunteerId)
-//                .eq(VolunteerReservationTime::getReservationDate, date));
-//        reservationTimes.stream().collect(Collectors.toCollection())
-//        //按照开始时间到结束时间生成数组,间隔为30分钟,第一个时间为整点,第二个时间为整点加30分钟,第三个时间为整点加60分钟,以此类推
-
-        return null;
+    public R<List<VolunteerReservationTimeVO>> getTimesByDate(Long volunteerId, LocalDate date) {
+        //判断志愿者当前日期是否排班
+        VolunteerWorkDate dateInfo = workDateService.getOne(new LambdaQueryWrapper<VolunteerWorkDate>()
+                .eq(VolunteerWorkDate::getVolunteerId, volunteerId)
+                .eq(VolunteerWorkDate::getWorkDate, date));
+        if (ObjectUtil.isNull(dateInfo)){
+            return R.fail("该志愿者当前日期未排班");
+        }
+        LocalTime startTime = roundToNearest30Minutes(dateInfo.getWorkStartTime());
+        LocalTime endTime = dateInfo.getWorkEndTime();
+        List<VolunteerReservationTimeVO> list = new ArrayList<>();
+        //获取当前志愿者所有预约时间
+        List<VolunteerReservationTime> reservationTimes = reservationTimeService.list(new LambdaQueryWrapper<VolunteerReservationTime>()
+                .eq(VolunteerReservationTime::getVolunteerId, volunteerId)
+                .eq(VolunteerReservationTime::getReservationDate, date));
+        List<LocalTime> times = reservationTimes.stream().map(VolunteerReservationTime::getReservationTime).collect(Collectors.toList());
+        Map<LocalTime, Long> timeMapUser = reservationTimes.stream().collect(Collectors.toMap(VolunteerReservationTime::getReservationTime, VolunteerReservationTime::getClientId));
+        //按照开始时间到结束时间生成数组,间隔为30分钟,第一个时间为整点,第二个时间为整点加30分钟,第三个时间为整点加60分钟,以此类推
+        while (startTime.isBefore(endTime)){
+            VolunteerReservationTimeVO vo = VolunteerReservationTimeVO.builder()
+                    .reservationTime(startTime)
+                    .build();
+            if (times.contains(startTime)){
+                vo.setHasReservation(1);
+                vo.setClientId(timeMapUser.get(startTime));
+            }else {
+                vo.setHasReservation(0);
+            }
+            list.add(vo);
+            startTime = startTime.plusMinutes(30);
+        }
+        return R.ok(list);
+    }
+
+    /**
+     * 新增预约志愿者时间
+     */
+    @Transactional(rollbackFor = Exception.class)
+    public R<Boolean> addReservationTimes(AddReservationTimesDTO dto) {
+        //todo 目前不做校验,后续做校验
+        //修改当前志愿者的排班日期为已预约
+        List<AddReservationTimesDTO.ReservationInfo> infos = dto.getInfos();
+        workDateService.update(new LambdaUpdateWrapper<VolunteerWorkDate>()
+                .eq(VolunteerWorkDate::getVolunteerId, dto.getVolunteerId())
+                .in(VolunteerWorkDate::getWorkDate, infos.stream().map(AddReservationTimesDTO.ReservationInfo::getReservationDate).collect(Collectors.toList()))
+                .set(VolunteerWorkDate::getHasReservation, 1));
+        //组装预约时间
+        List<VolunteerReservationTime> list = new ArrayList<>();
+        for (AddReservationTimesDTO.ReservationInfo info : infos) {
+            List<LocalTime> times = info.getReservationTimes();
+            for (LocalTime time : times) {
+                VolunteerReservationTime volunteerReservationTime = VolunteerReservationTime.builder()
+                        .volunteerId(dto.getVolunteerId())
+                        .clientId(dto.getClientId())
+                        .reservationDate(info.getReservationDate())
+                        .reservationTime(time)
+                        .build();
+                list.add(volunteerReservationTime);
+            }
+        }
+        //批量保存预约时间
+        reservationTimeService.saveBatch(list);
+        return R.ok();
+    }
+
+    public static LocalTime roundToNearest30Minutes(LocalTime time) {
+        // 获取当前时间的分钟数
+        int minutes = time.getMinute();
+
+        // 计算最接近的 30 分钟间隔
+        int roundedMinutes = (minutes + 15) / 30 * 30;
+
+        // 如果分钟数为 60,则需要进位到下一个整点
+        if (roundedMinutes == 60) {
+            return time.plusHours(1).withMinute(0).withSecond(0).withNano(0);
+        }
+
+        // 返回取整后的时间
+        return time.withMinute(roundedMinutes).withSecond(0).withNano(0);
     }
 }

+ 39 - 0
leromro-framework/src/main/java/com/leromro/framework/config/MyMetaObjectHandler.java

@@ -0,0 +1,39 @@
+package com.leromro.framework.config;
+
+import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
+import com.leromro.common.utils.SecurityUtils;
+import org.apache.ibatis.reflection.MetaObject;
+import org.springframework.stereotype.Component;
+
+import java.util.Date;
+
+@Component
+public class MyMetaObjectHandler implements MetaObjectHandler {
+
+    @Override
+    public void insertFill(MetaObject metaObject) {
+        // 设置创建时间和修改时间为当前时间
+        this.strictInsertFill(metaObject, "createTime", Date.class, new Date());
+        this.strictInsertFill(metaObject, "updateTime", Date.class, new Date());
+
+        // 设置创建人和修改人为当前登录用户,这里假设从某个地方获取当前用户
+        String currentUser = getCurrentUser();
+        this.strictInsertFill(metaObject, "createBy", String.class, currentUser);
+        this.strictInsertFill(metaObject, "updateBy", String.class, currentUser);
+    }
+
+    @Override
+    public void updateFill(MetaObject metaObject) {
+        // 设置修改时间为当前时间
+        this.strictUpdateFill(metaObject, "updateTime", Date.class, new Date());
+
+        // 设置修改人为当前登录用户,这里假设从某个地方获取当前用户
+        String currentUser = getCurrentUser();
+        this.strictUpdateFill(metaObject, "updateBy", String.class, currentUser);
+    }
+
+    private String getCurrentUser() {
+        // 这里可以根据实际情况获取当前登录用户,例如从 SecurityContext 中获取
+        return SecurityUtils.getUsername(); // 示例返回值
+    }
+}