Przeglądaj źródła

用车申请,付款管理

sangwenwei 1 rok temu
rodzic
commit
06e59118bf

+ 16 - 0
jeeplus-modules/jeeplus-business/src/main/java/com/jeeplus/business/drive/controller/DriveController.java

@@ -30,7 +30,9 @@ import org.springframework.web.bind.annotation.*;
 import javax.annotation.Resource;
 import javax.servlet.http.HttpServletResponse;
 import java.util.ArrayList;
+import java.util.Date;
 import java.util.List;
+import java.util.Map;
 import java.util.stream.Collectors;
 
 @Slf4j
@@ -180,6 +182,20 @@ public class DriveController {
 
     }
 
+    @ApiOperation(value = "获取审核中的用车时间")
+    @GetMapping(value = "/getUserTime")
+    public List<Map<String,Object>> getUseTime(){
+        List<Map<String,Object>> dateList = driveApplyService.getUseTime();
+        return dateList;
+    }
+
+    @ApiOperation(value = "校验时间区间")
+    @GetMapping(value = "/checkTimeRange")
+    public Boolean checkTimeRange(Date useStartTime,Date useEndTime){
+        Boolean data = driveApplyService.checkTimeRange(useStartTime,useEndTime);
+        return data;
+    }
+
 
 
 

+ 2 - 0
jeeplus-modules/jeeplus-business/src/main/java/com/jeeplus/business/drive/mapper/DriveApplyMapper.java

@@ -31,4 +31,6 @@ public interface DriveApplyMapper extends BaseMapper<DriveApply> {
 
     @InterceptorIgnore(tenantLine = "true")
     void updateInfoById(@Param("driveApply") DriveApply driveApply);
+
+    List<DriveApplyDTO> getUseTime();
 }

+ 12 - 0
jeeplus-modules/jeeplus-business/src/main/java/com/jeeplus/business/drive/mapper/xml/JyDriveApplyMapper.xml

@@ -134,6 +134,18 @@
     </update>
 
 
+    <select id="getUseTime" resultType="com.jeeplus.business.drive.service.dto.DriveApplyDTO">
+        select
+            id,
+            use_start_time,
+            use_end_time
+        from
+            jy_drive_apply
+        where status in ('2')
+        order by create_time DESC
+    </select>
+
+
 
 
 </mapper>

+ 67 - 7
jeeplus-modules/jeeplus-business/src/main/java/com/jeeplus/business/drive/service/DriveApplyService.java

@@ -36,6 +36,7 @@ import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import javax.annotation.Resource;
+import java.text.SimpleDateFormat;
 import java.util.*;
 
 @Service
@@ -262,9 +263,7 @@ public class DriveApplyService {
      * @return
      */
     public DriveApplyDTO findById(String id) {
-        DriveApplyDTO applyDTO = new DriveApplyDTO();
         DriveApplyDTO driveApplyDTO=driveApplyMapper.findById(id);
-        BeanUtils.copyProperties(driveApplyDTO, applyDTO);
         if (ObjectUtil.isNotEmpty(driveApplyDTO)){
             //查询项目信息
             if (StringUtils.isNotBlank(driveApplyDTO.getProjectId())){
@@ -274,14 +273,14 @@ public class DriveApplyService {
                     JyProject jyProject=jyProjectMapper.getById(s);
                     projects.add(jyProject);
                 }
-                applyDTO.setProjectList(projects);
+                driveApplyDTO.setProjectList(projects);
             }
             //设置用车起使时间
             if (ObjectUtil.isNotEmpty(driveApplyDTO.getUseStartTime()) && ObjectUtil.isNotEmpty(driveApplyDTO.getUseEndTime())){
                 Date[] dates = new Date[2];
                 dates[0]=driveApplyDTO.getUseStartTime();
                 dates[1]=driveApplyDTO.getUseEndTime();
-                applyDTO.setUseDate(dates);
+                driveApplyDTO.setUseDate(dates);
             }
             // 查询附件信息
             List<WorkAttachmentInfo> files = driveApplyMapper.findDtos(id);
@@ -289,7 +288,7 @@ public class DriveApplyService {
                 for (WorkAttachmentInfo i : files) {
                     i.setCreateBy(SpringUtil.getBean ( IUserApi.class ).getById(i.getBy()));
                 }
-                applyDTO.setFiles(files);
+                driveApplyDTO.setFiles(files);
             }
             //查询结算附件信息
             List<WorkAttachmentInfo> files1 = driveApplyMapper.findDtos(driveApplyDTO.getAccountId());
@@ -297,10 +296,10 @@ public class DriveApplyService {
                 for (WorkAttachmentInfo i : files1) {
                     i.setCreateBy(SpringUtil.getBean ( IUserApi.class ).getById(i.getBy()));
                 }
-                applyDTO.setAccountFiles(files1);
+                driveApplyDTO.setAccountFiles(files1);
             }
         }
-        return applyDTO;
+        return driveApplyDTO;
     }
 
     /**
@@ -443,4 +442,65 @@ public class DriveApplyService {
         map.put("currentToken", TokenProvider.getCurrentToken ( ));
         SpringUtil.getBean ( IWorkAttachmentApi.class ).saveOrUpdateFileList(map);
     }
+
+    /**
+     * 获取审核中的用车时间
+     * @return
+     */
+    public List<Map<String,Object>> getUseTime() {
+        //获取审核中的用车时间
+        List<DriveApplyDTO> dtoList=driveApplyMapper.getUseTime();
+
+        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
+        ArrayList<Map<String,Object>> dates = new ArrayList<>();
+        for (DriveApplyDTO applyDTO : dtoList) {
+            HashMap<String, Object> map = new HashMap<>();
+            map.put("startTime",simpleDateFormat.format(applyDTO.getUseStartTime()));
+            map.put("endTime",simpleDateFormat.format(applyDTO.getUseEndTime()));
+            dates.add(map);
+        }
+        return dates;
+    }
+
+    /**
+     * 校验用车时间
+     * @param useStartTime
+     * @param useEndTime
+     * @return
+     */
+    public Boolean checkTimeRange(Date useStartTime, Date useEndTime) {
+        //获取审核中的用车时间
+        List<DriveApplyDTO> dtoList=driveApplyMapper.getUseTime();
+
+        if (CollectionUtils.isNotEmpty(dtoList)){
+            for (DriveApplyDTO applyDTO : dtoList) {
+                Date applyStartTime = applyDTO.getUseStartTime();
+                Date applyEndTime = applyDTO.getUseEndTime();
+                //判断传进来的时间段中是否存在已经在审核中的时间,如果存在,则返回
+                if (isTimeRangeOverlapping(useStartTime, useEndTime, applyStartTime, applyEndTime)) {
+                    return true;
+                }
+            }
+        }
+        return false;
+    }
+
+    private boolean isTimeRangeOverlapping(Date start1, Date end1, Date start2, Date end2) {
+        // 确保两个时间段的开始和结束时间是按照升序排列的
+        if (start1.after(end1)) {
+            Date temp = start1;
+            start1 = end1;
+            end1 = temp;
+        }
+        if (start2.after(end2)) {
+            Date temp = start2;
+            start2 = end2;
+            end2 = temp;
+        }
+
+        // 检查两个时间段是否有重叠
+        return !(end1.before(start2) || end2.before(start1));
+    }
+
+
 }

+ 4 - 4
jeeplus-modules/jeeplus-business/src/main/java/com/jeeplus/business/drive/service/dto/DriveApplyDTO.java

@@ -34,16 +34,16 @@ public class DriveApplyDTO extends BaseDTO {
     /**
      * 用车起使时间
      */
-    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
-    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd")
     @Excel(name = "用车开始时间",width = 16,exportFormat = "yyyy-MM-dd")
     private Date useStartTime;
 
     /**
      * 用车截至时间
      */
-    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
-    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd")
     @Excel(name = "用车结束时间",width = 16,exportFormat = "yyyy-MM-dd")
     private Date useEndTime;
 

+ 34 - 87
jeeplus-modules/jeeplus-business/src/main/java/com/jeeplus/business/meetingRoom/service/MeetingRoomService.java

@@ -171,6 +171,8 @@ public class MeetingRoomService {
 
         DateTimeFormatter formatter = DateTimeFormatter.ofPattern("HH:mm:ss");
 
+        LocalDate curDate = LocalDate.now();//当前日期
+
 
         //限制会议选择的时间 并转为time类型
         LocalTime time1 = LocalTime.of(9, 0, 0); // 9:00:00
@@ -191,107 +193,52 @@ public class MeetingRoomService {
         if (ObjectUtil.isNotEmpty(meetingRooms)){
             List<Map<String, String>> meetingRoomMaps = new ArrayList<>();
             for (MeetingRoom meetingRoom : meetingRooms) {
-                HashMap<String, String> hashMap = new HashMap<>();
-                //判断会议结束后的半小时是否在规定范围内
-                LocalTime newEndTime = meetingRoom.getEndTime().toLocalTime().plus(30 * 60, ChronoUnit.SECONDS);
-                String format = newEndTime.format(formatter);
-                Time endTime = Time.valueOf(format);
-                if ((endTime.after(am1) && endTime.before(am2)) || (endTime.after(pm1) && endTime.before(pm2))) {
-                    //创建集合将获取到的开始时间存到集合中
-                    LocalTime localTime = meetingRoom.getStartTime().toLocalTime();
-                    hashMap.put("0", meetingRoom.getStartTime().toString());
-                    //将开始时间之后的每半小时的时间存到map中
-                    for (int i = 0; i < 48; i++) {
-                        int minute = localTime.getMinute();
-                        if (minute < 30) {
-                            localTime = localTime.withMinute(30);
-                        } else {
-                            localTime = localTime.withMinute(0).plusHours(1);
-                        }
-                        hashMap.put((i + 1) + "", localTime.format(formatter));
-                        //当新时间与会议结束时间一致时,在延续半小时,循环结束
-                        Time time = Time.valueOf(localTime.format(formatter));
-                        if (time.equals(meetingRoom.getEndTime())) {
-                            int m = localTime.getMinute();
-                            if (m < 30) {
-                                localTime = localTime.withMinute(30);
-                            } else {
-                                localTime = localTime.withMinute(0).plusHours(1);
-                            }
-                            hashMap.put((i + 2) + "", localTime.format(formatter));
-                            break;
-                        }
-                    }
-
-                }else {
-                    Map<String, String> emptyMap = new HashMap<>();
-                    meetingRoomMaps.add(emptyMap);
-                }
-                hashMap.put("0", meetingRoom.getStartTime().toString());
-                meetingRoomMaps.add(hashMap); // 将当前会议的映射添加到列表中
-            }
-            //将找到的时间重新存入到新的map中
-            if (ObjectUtils.isNotEmpty(meetingRoomMaps)){
-                for (Map<String, String> map : meetingRoomMaps) {
-                    for (Map.Entry<String, String> entry : map.entrySet()) {
-                        String key = entry.getKey();
-                        String value = entry.getValue();
-                        if (mergedMap.containsKey(key)) {
-                            int size = mergedMap.size();
-                            mergedMap.put((size+1)+"",value);
-                        } else {
-                            mergedMap.put(key, value);
-                        }
-                    }
+                //将获取到的开始时间和结束时间转为LocalDateTime格式,用以比较
+                LocalTime startTimeLocal  = meetingRoom.getStartTime().toLocalTime();
+                LocalTime endTimeLocal   = meetingRoom.getEndTime().toLocalTime();
+
+                LocalDateTime startDateTime = LocalDateTime.of(curDate, startTimeLocal);
+                LocalDateTime endDateTime = LocalDateTime.of(curDate, endTimeLocal);
+
+                LocalDateTime current = startDateTime;
+                //确保开始时间在结束时间之前
+                while (!current.isAfter(endDateTime)) {
+                    String start = current.format(formatter);
+                    mergedMap.put(start,start);
+                    //计算半小时之后的时间
+                    LocalDateTime truncatedTime = current.truncatedTo(ChronoUnit.HOURS).plusMinutes(current.getMinute() / 30 * 30);
+                    String truncatedTimeStr = truncatedTime.format(formatter);
+                    //存到map中
+                    mergedMap.put(truncatedTimeStr,truncatedTimeStr);
+
+                    current = current.plusMinutes(30); // 移到下一个半小时的时间点
                 }
             }
-
         }
-            //获取当天日期
-            LocalDate today = LocalDate.now();
+
             //获取会议预约日期
             DateTimeFormatter formatte = DateTimeFormatter.ofPattern("yyyy-MM-dd");
             LocalDate startDate1 = LocalDate.parse(startDate, formatte);
         //比较两个日期,
-        if (today.equals(startDate1)){
+        if (curDate.equals(startDate1)){
             //获取当前时间
             LocalTime now = LocalTime.now();
-            String format1 = now.format(formatter);
-            Time nowDate = Time.valueOf(format1);
+            LocalDateTime nowDate = LocalDateTime.of(curDate, now);//当前时间
             ArrayList<LocalTime> dateList = new ArrayList<>();
-            //判断当前时间在哪个范围内
-            if ((nowDate.after(am1) && nowDate.before(am2)) || (nowDate.after(am2) && nowDate.before(pm1)) || nowDate.after(pm2)){
-                // 获取时间段内的所有时间
+            LocalDateTime morning=LocalDateTime.of(curDate, time1); //上午九点
+            //将上午九点开始,截止到当前时间,中间的每半个小时存放到集合中
+            while (nowDate.isAfter(morning) || nowDate.isEqual(morning)){
                 LocalTime currentTime = time1;
                 dateList.add(currentTime);
-                while (currentTime.isBefore(time2)) {
-                    currentTime = currentTime.plus(30 * 60, ChronoUnit.SECONDS); // 每隔半小时
-                    dateList.add(currentTime);
-                }
-                //将每半个小时的时间进行遍历,与当前时间比较
-                for (LocalTime localTime : dateList) {
-                    Time time = Time.valueOf(localTime);
-                    //如果当前时间在每半小时间隔之后,则将之前的存到map中
-                    if (nowDate.after(time)){
-                        mergedMap.put(time+"",localTime.format(formatter));
-                    }
+                // 循环直到当前时间或者下一个半点的开始时间
+                while (LocalDateTime.of(curDate, currentTime).isBefore(nowDate.truncatedTo(ChronoUnit.HOURS))) {
+                    currentTime = currentTime.plus(30, ChronoUnit.MINUTES); // 每隔半小时
+                    dateList.add(currentTime); // 添加半小时后的时间点
                 }
             }
-            if ((nowDate.after(pm1) && nowDate.before(pm2)) || nowDate.after(pm2)){
-                // 获取时间段内的所有时间
-                LocalTime currentTime = time3;
-                while (currentTime.isBefore(time4)) {
-                    currentTime = currentTime.plus(30 * 60, ChronoUnit.SECONDS); // 每隔半小时
-                    dateList.add(currentTime);
-                }
-                //将每半个小时的时间进行遍历,与当前时间比较
-                for (LocalTime localTime : dateList) {
-                    Time time = Time.valueOf(localTime);
-                    //如果当前时间在每半小时间隔之后,则将之前的存到map中
-                    if (nowDate.after(time)){
-                        mergedMap.put(time+"",localTime.format(formatter));
-                    }
-                }
+            //将获取到的时间存到map中
+            for (LocalTime localTime : dateList) {
+                mergedMap.put(localTime.format(formatter),localTime.format(formatter));
             }
         }
 

+ 2 - 0
jeeplus-modules/jeeplus-business/src/main/java/com/jeeplus/business/payment/domain/Payment.java

@@ -18,6 +18,8 @@ public class Payment extends BaseEntity {
      */
     private String projectId;
 
+    //项目名称
+    private String projectName;
     /**
      * 付款编号
      */

+ 1 - 0
jeeplus-modules/jeeplus-business/src/main/java/com/jeeplus/business/payment/mapper/xml/PaymentMapper.xml

@@ -45,6 +45,7 @@
             a.create_by_id,
             a.no,
             a.project_id,
+            a.project_name,
             a.proceed_type,
             a.duty_number,
             a.amount_paid,

+ 27 - 3
jeeplus-modules/jeeplus-business/src/main/java/com/jeeplus/business/payment/service/PaymentService.java

@@ -124,6 +124,15 @@ public class PaymentService {
                 projects.add(project);
             }
             paymentDTO.setProjectDTOList(projects);
+        }else {
+            String[] split = paymentDTO.getProjectName().split(",");
+            ArrayList<JyProject> projects = new ArrayList<>();
+            for (String s : split) {
+                JyProject project = new JyProject();
+                project.setName(s);
+                projects.add(project);
+            }
+            paymentDTO.setProjectDTOList(projects);
         }
         // 查询附件信息
         List<WorkAttachmentInfo> files = paymentMapper.findFiles(id);
@@ -158,12 +167,20 @@ public class PaymentService {
         Payment payment = new Payment();
         //获取项目id
         String projectId="";
+        String projectName="";
         if (ObjectUtils.isNotEmpty(paymentDTO.getProjectDTOList())){
             for (JyProject jyProject : paymentDTO.getProjectDTOList()) {
-                projectId+=jyProject.getProjectId()+",";
+                if (StringUtils.isNotBlank(jyProject.getProjectId())){
+                    projectId+=jyProject.getProjectId()+",";
+                    projectName+=jyProject.getName()+",";
+                }else {
+                    projectName+=jyProject.getName()+",";
+                }
+
             }
         }
         payment.setProjectId(projectId);
+        payment.setProjectName(projectName);
         payment.setNo(No);
         payment.setId(id);
         payment.setProceedType(paymentDTO.getProceedType());//收款类别
@@ -234,12 +251,19 @@ public class PaymentService {
         Payment payment = new Payment();
         //获取项目id
         String projectId="";
+        String projectName="";
         if (ObjectUtils.isNotEmpty(paymentDTO.getProjectDTOList())){
             for (JyProject jyProject : paymentDTO.getProjectDTOList()) {
-                projectId+=jyProject.getProjectId()+",";
+                if (StringUtils.isNotBlank(jyProject.getProjectId())){
+                    projectId+=jyProject.getProjectId()+",";
+                    projectName+=jyProject.getName()+",";
+                }else {
+                    projectName+=jyProject.getName()+",";
+                }
             }
         }
-        payment.setProjectId(projectId);//项目
+        payment.setProjectId(projectId);//项目id
+        payment.setProjectName(projectName);//项目名称
         payment.setProceedType(paymentDTO.getProceedType());//收款类别
         payment.setProceedOfficeId(paymentDTO.getProceedOfficeId());//收款单位
         payment.setDutyNumber(paymentDTO.getDutyNumber()); //税号

+ 3 - 0
jeeplus-modules/jeeplus-business/src/main/java/com/jeeplus/business/payment/service/dto/PaymentDTO.java

@@ -22,6 +22,9 @@ public class PaymentDTO extends BaseEntity {
      */
     private String projectId;
 
+    //项目名称
+    private String projectName;
+
     /**
      * 付款编号
      */

+ 102 - 0
jeeplus-modules/jeeplus-flowable/src/main/java/com/jeeplus/modules/flowable/listener/UseCarListener.java

@@ -0,0 +1,102 @@
+package com.jeeplus.modules.flowable.listener;
+
+import cn.hutool.extra.spring.SpringUtil;
+import com.jeeplus.extension.domain.FlowCopy;
+import com.jeeplus.extension.service.FlowCopyService;
+import com.jeeplus.flowable.model.ActRuTaskInfo;
+import com.jeeplus.flowable.model.Flow;
+import com.jeeplus.flowable.service.FlowTaskService;
+import com.jeeplus.flowable.service.MyNoticeService;
+import com.jeeplus.sys.feign.IPostApi;
+import com.jeeplus.sys.feign.IUserApi;
+import com.jeeplus.sys.service.dto.PostDTO;
+import com.jeeplus.sys.service.dto.UserDTO;
+import lombok.SneakyThrows;
+import org.flowable.engine.RuntimeService;
+import org.flowable.engine.delegate.DelegateExecution;
+import org.flowable.engine.delegate.ExecutionListener;
+import org.flowable.engine.runtime.ProcessInstance;
+import org.springframework.stereotype.Component;
+
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.List;
+
+@Component("UseCarListener")
+public class UseCarListener implements ExecutionListener {
+    @SneakyThrows
+    public void notify(DelegateExecution delegateExecution) {
+        String eventName = delegateExecution.getEventName ( );
+        System.out.println("--------- delegateExecution -----------" + delegateExecution);
+
+        if ( "start".equals ( eventName ) ) {
+            System.out.println ( "start=========" );
+        } else if ( "end".equals ( eventName ) ) {
+            //根据这里的 delegateExecution的id去act_ru_task表中查该流程的数据 对应表中的EXECUTION_ID_
+            ActRuTaskInfo task = SpringUtil.getBean(MyNoticeService.class).getTaskInfoByID(delegateExecution.getId());
+
+            if (null != task) {
+                List<Flow> flows = SpringUtil.getBean(FlowTaskService.class).historicTaskList(task.getProcInstId());
+                //根据PROC_DEF_ID_去act_re_deployment中查询流程的名称
+                String substring = task.getProcDefId().substring(0, task.getProcDefId().indexOf(":"));
+                String actName = SpringUtil.getBean(FlowTaskService.class).getActNameByDefId(substring);
+
+                String titleName = "";
+                // 根据流程定义ID查询流程实例
+                ProcessInstance processInstance = SpringUtil.getBean(RuntimeService.class).createProcessInstanceQuery()
+                        .processInstanceId(task.getProcInstId())
+                        .singleResult();
+
+                if (processInstance != null) {
+                    // 获取流程实例标题变量名(假设标题存储在名为"title"的变量中)
+                    String titleVariableName = "title";
+
+                    // 查询流程实例的标题变量
+                    Object title = SpringUtil.getBean(RuntimeService.class).getVariable(processInstance.getId(), titleVariableName);
+
+                    if (title != null) {
+                        titleName = title.toString();
+                    } else {
+                        // 如果标题变量不存在或者没有值,可以返回默认标题
+                        titleName = "";
+                    }
+                }
+                Flow flow = new Flow();
+                for (int i=0;i<flows.size();i++){
+                    if (flows.get(i).getComment().getMessage().equals("发起流程")){
+                        flow = flows.get(i);
+                    }
+                }
+
+                SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+
+                UserDTO userDTO = SpringUtil.getBean(IUserApi.class).getById(flow.getAssigneeId());
+                //获取到岗位为总经理的人员信息
+                ArrayList<UserDTO> userDTOS = new ArrayList<>();
+
+
+                PostDTO postDTOByName1 = SpringUtil.getBean(IPostApi.class).getPostDTOByName("总经理");
+                List<UserDTO> listByPostId1 = SpringUtil.getBean(IUserApi.class).findListByPostId(postDTOByName1.getId());
+                userDTOS.addAll(listByPostId1);
+                String finalTitleName = titleName;
+                userDTOS.stream().forEach(item->{
+                    FlowCopy flowCopy = new FlowCopy();
+                    flowCopy.setProcDefId(task.getProcDefId());
+//                        flowCopy.setProcDefId(task.getProcDefId());
+                    flowCopy.setProcInsName(finalTitleName);
+                    flowCopy.setProcInsId(task.getProcInstId());
+                    flowCopy.setUserId(item.getId());
+                    SpringUtil.getBean(FlowCopyService.class).save(flowCopy);
+
+                });
+
+
+            }
+
+            System.out.println ( "end=========" );
+        } else if ( "take".equals ( eventName ) ) {//连线监听
+            System.out.println ( "take=========" );
+        }
+
+    }
+}