package com.template.controller;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
import com.template.api.ApplicationProcedureTemporaryControllerAPI;
import com.template.common.utils.TimeExchange;
import com.template.model.dto.AppletApprovalProcessDto;
import com.template.model.dto.ApplicationProcedureTemporaryDto;
import com.template.model.dto.ApprovalProcessDto;
import com.template.model.pojo.*;
import com.template.model.result.CommonResult;
import com.template.model.result.PageUtils;
import com.template.model.vo.ApplicationProcedureTemporaryVo;
import com.template.services.*;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.RestController;
import java.text.ParseException;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Calendar;
import java.util.List;
import java.util.stream.Collectors;
/**
*
* 前端控制器
*
*
* @author ceshi
* @since 2024-03-05
*/
@RestController
public class ApplicationProcedureTemporaryController implements ApplicationProcedureTemporaryControllerAPI {
@Autowired
ApplicationProcedureTemporaryService applicationProcedureTemporaryService;
@Autowired
ApplicationProcedureSettingService applicationProcedureSettingService;
@Autowired
PermissionSettingService permissionSettingService;
@Autowired
AdminMenuService adminMenuService;
@Autowired
AdminService adminService;
@Autowired
UsersService usersService;
@Autowired
OrganizationService organizationService;
@Override
public CommonResult save(ApplicationProcedureTemporaryDto applicationProcedureDto) {
if (ObjectUtils.isEmpty(applicationProcedureDto)) {
return CommonResult.fail();
}
//一周可定天数可优化为前台配置
int countConfig=2;
Integer usersId = applicationProcedureDto.getUsersId();
// 一个人只能有一个待审批的
List list = applicationProcedureTemporaryService.list(new QueryWrapper()
.eq("users_id", usersId)
.ne("status", "0"));
String startDto=applicationProcedureDto.getStartTime();
String endDto=applicationProcedureDto.getEndTime();
int dtoCount=this.checkWeek(startDto,endDto);
if(dtoCount==-1||dtoCount>countConfig){
return CommonResult.fail("申请日期不能跨周,一周不能超过"+countConfig+"天,请重新申请");
}
//筛选同一周数据
if (!list.isEmpty()){
String[] arr =TimeExchange.getCurrentWeekTimeFrame(startDto);
list=list.stream().filter(a -> a.getStartTime().compareTo(arr[0])>=0&&a.getEndTime().compareTo(arr[1])<=0)
.collect(Collectors.toList());
}
if (!list.isEmpty()) {
int aa =0;
for (ApplicationProcedureTemporary apt : list) {
if (apt.getEndTime().equals(endDto)
|| apt.getStartTime().equals(startDto)) {
return CommonResult.fail("相同日期已有待审批申请,请勿重复申请");
}
aa=this.checkWeek(apt.getStartTime(),apt.getEndTime())+aa;
if(countConfig-dtoCount<=aa){
return CommonResult.fail("总申请天数超过本周限额");
}
try {
boolean a = TimeExchange.CompareDate(apt.getEndTime(), startDto, "yyyy-MM-dd");
boolean b = TimeExchange.CompareDate(endDto, apt.getStartTime(), "yyyy-MM-dd");
if (!(a || b)) {
return CommonResult.fail("日期范围内已有待审批申请");
}
} catch (ParseException e) {
throw new RuntimeException(e);
}
}
}
List admins=adminService.list(new QueryWrapper<>());
String orgId=usersService.getById(usersId).getOrganId();
if(ObjectUtils.isEmpty(organizationService.getById(orgId))){
return CommonResult.fail("身份异常,申请提交失败");
}
boolean flag =true;
for(Admin admin:admins){
if (StringUtils.hasText(admin.getCheckOrg())&&admin.getCheckOrg().indexOf(orgId) > 0) {
flag =false;
break;
}
}
if(flag){
return CommonResult.fail("您暂无审批人,请联系管理员添加");
}
ApplicationProcedureTemporary applicationProcedure = new ApplicationProcedureTemporary();
BeanUtils.copyProperties(applicationProcedureDto, applicationProcedure);
// 待审核
applicationProcedure.setStatus("1");
DateTimeFormatter dateTimeFormatter1 = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
// 提交时间
applicationProcedure.setSubmissionTime(LocalDateTime.now().format(dateTimeFormatter1));
boolean save = applicationProcedureTemporaryService.save(applicationProcedure);
if (save) {
return CommonResult.ok();
}
return CommonResult.fail();
}
@Override
public CommonResult list(int adminMenuId, String submissionStartTime, String submissionEndTime, String examineAndApproveStartTime, String examineAndApproveEndTime, String type, String department,String OrgIds, String key, int page, int size) {
PermissionSetting permissionSetting = permissionSettingService.getById(adminMenuId);
if (ObjectUtils.isEmpty(permissionSetting)) {
return CommonResult.fail("非法进入");
}
// 判断该用户是否拥有权限
String processManagement = permissionSetting.getProcessManagement();
if (!"0".equals(processManagement) && !processManagement.contains("5")) {
return CommonResult.fail("此账号暂无该权限");
}
if (ObjectUtils.isEmpty(page) || page <= 0) {
page = 1;
}
if (ObjectUtils.isEmpty(size) || size <= 0) {
size = 10;
}
PageUtils pageList = new PageUtils(new ArrayList(),0,size,page);
if(!StringUtils.hasText(OrgIds)){
return CommonResult.ok(pageList);
}
String[] arr=OrgIds.replaceAll(" ","").split(",");
List orgList = new ArrayList<>(Arrays.asList(arr));
List list = applicationProcedureSettingService.list(new LambdaQueryWrapper<>());
ApplicationProcedureSetting applicationProcedureSetting = list.get(0);
String approverType = applicationProcedureSetting.getApproverType();
Integer adminMenuId1 = permissionSetting.getAdminMenuId();
AdminMenu byId = adminMenuService.getById(adminMenuId1);
Integer parentId = byId.getParentId();
//审批一次,角色等级不为0
if ("1".equals(approverType)) {
pageList = applicationProcedureTemporaryService.pageList(submissionStartTime, submissionEndTime, examineAndApproveStartTime, examineAndApproveEndTime, type, department, key, page, size,orgList);
return CommonResult.ok(pageList);
}
if (parentId == 0) {
// 全部则是没有待审批的全部
if (ObjectUtils.isEmpty(type)) {
type = "0,2,3";
}
pageList = applicationProcedureTemporaryService.parentPageList(submissionStartTime, submissionEndTime, examineAndApproveStartTime, examineAndApproveEndTime, type, department, key, page, size,orgList);
return CommonResult.ok(pageList);
}
pageList = applicationProcedureTemporaryService.pageList(submissionStartTime, submissionEndTime, examineAndApproveStartTime, examineAndApproveEndTime, type, department, key, page, size,orgList);
return CommonResult.ok(pageList);
}
@Override
public CommonResult update(ApprovalProcessDto approvalProcessDto) {
int adminMenuId = approvalProcessDto.getAdminMenuId();
PermissionSetting permissionSetting = permissionSettingService.getById(adminMenuId);
if (ObjectUtils.isEmpty(permissionSetting)) {
return CommonResult.fail("非法进入");
}
// 判断该用户是否拥有权限
// 判断该用户是否拥有权限
String processManagement = permissionSetting.getProcessManagement();
if (!"0".equals(processManagement) && !processManagement.contains("3") && !processManagement.contains("4")) {
return CommonResult.fail("此账号暂无该权限");
}
int id = approvalProcessDto.getId();
String status = approvalProcessDto.getStatus();
String adminId = approvalProcessDto.getAdminId();
String remark = approvalProcessDto.getRemark();
ApplicationProcedureTemporary applicationProcedure = applicationProcedureTemporaryService.getById(id);
if (ObjectUtils.isEmpty(applicationProcedure)) {
return CommonResult.fail("参数异常");
}
String applicationProcedureStatus = applicationProcedure.getStatus();
if ("0".equals(applicationProcedureStatus) || "3".equals(applicationProcedureStatus)) {
return CommonResult.fail("已审批,无需再次审批");
}
// 判断是什么审核模式
List list = applicationProcedureSettingService.list(new LambdaQueryWrapper<>());
ApplicationProcedureSetting applicationProcedureSetting = list.get(0);
String approverType = applicationProcedureSetting.getApproverType();
// 审核人
Integer adminMenuId1 = permissionSetting.getAdminMenuId();
AdminMenu byId = adminMenuService.getById(adminMenuId1);
// 角色等级
Integer parentId = byId.getParentId();
DateTimeFormatter dateTimeFormatter1 = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
// 当只需要审核一次
if ("1".equals(approverType)) {
// 只有最高级才能审批
// 当为最高审批人
if (parentId == 0) {
if ("1".equals(status)) {
status = "3";
}
applicationProcedure.setStatus(status);
applicationProcedure.setApproverId(adminId);
// 审批时间
applicationProcedure.setExamineAndApproveTime(LocalDateTime.now().format(dateTimeFormatter1));
// 审批备注
applicationProcedure.setExamineAndApproveRemark(remark);
applicationProcedureTemporaryService.updateById(applicationProcedure);
return CommonResult.ok();
}
return CommonResult.fail("权限不足");
}
// 当为最高审批人
if (parentId == 0) {
// 先判断是否已经被审批了
if (!"2".equals(applicationProcedureStatus)) {
// 当不是处理中时则无法审批
return CommonResult.fail("当前无法审批");
}
if ("1".equals(status)) {
status = "3";
}
applicationProcedure.setStatus(status);
applicationProcedure.setApproverId(adminId);
// 审批时间
applicationProcedure.setExamineAndApproveTime(LocalDateTime.now().format(dateTimeFormatter1));
// 审批备注
applicationProcedure.setExamineAndApproveRemark(remark);
applicationProcedureTemporaryService.updateById(applicationProcedure);
return CommonResult.ok();
}
if ("1".equals(status)) {
status = "2";
}
applicationProcedure.setStatus(status);
applicationProcedure.setSecondaryApproverId(adminId);
// 审批时间
applicationProcedure.setSecondaryExamineAndApproveTime(LocalDateTime.now().format(dateTimeFormatter1));
// 审批备注
applicationProcedure.setSecondaryExamineAndApproveRemark(remark);
boolean update = applicationProcedureTemporaryService.updateById(applicationProcedure);
System.out.println("update = " + update);
return CommonResult.ok();
}
@Override
public CommonResult appletUpdate(AppletApprovalProcessDto appletApprovalProcessDto) {
int id = appletApprovalProcessDto.getId();
String status = appletApprovalProcessDto.getStatus();
String adminMenuId = appletApprovalProcessDto.getAdminMenuId();
String remark = appletApprovalProcessDto.getRemark();
String adminId = appletApprovalProcessDto.getAdminId();
// 判断对应的管理端是否有权限
if (ObjectUtils.isEmpty(adminMenuId) && ObjectUtils.isEmpty(adminId)) {
return CommonResult.fail("无审批权限");
}
PermissionSetting permissionSetting = permissionSettingService.getMenuPermissionSetting(adminMenuId);
if (ObjectUtils.isEmpty(permissionSetting)) {
return CommonResult.fail("无审批权限");
}
String processManagement = permissionSetting.getProcessManagement();
if (!"0".equals(processManagement) && !processManagement.contains("3") && !processManagement.contains("4")) {
return CommonResult.fail("此账号暂无该权限");
}
ApplicationProcedureTemporary applicationProcedure = applicationProcedureTemporaryService.getById(id);
if (ObjectUtils.isEmpty(applicationProcedure)) {
return CommonResult.fail("参数异常");
}
String applicationProcedureStatus = applicationProcedure.getStatus();
if ("0".equals(applicationProcedureStatus) || "3".equals(applicationProcedureStatus)) {
return CommonResult.fail("已审批,无需再次审批");
}
// 判断是什么审核模式
List list = applicationProcedureSettingService.list(new LambdaQueryWrapper<>());
ApplicationProcedureSetting applicationProcedureSetting = list.get(0);
String approverType = applicationProcedureSetting.getApproverType();
AdminMenu byId = adminMenuService.getById(adminMenuId);
// 角色等级
Integer parentId = byId.getParentId();
DateTimeFormatter dateTimeFormatter1 = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
// 当只需要审核一次
if ("1".equals(approverType)) {
// 只有最高级才能审批
// 当为最高审批人
if (parentId == 0) {
if ("1".equals(status)) {
status = "3";
}
applicationProcedure.setStatus(status);
applicationProcedure.setApproverId(adminId);
// 审批时间
applicationProcedure.setExamineAndApproveTime(LocalDateTime.now().format(dateTimeFormatter1));
// 审批备注
applicationProcedure.setExamineAndApproveRemark(remark);
applicationProcedureTemporaryService.updateById(applicationProcedure);
return CommonResult.ok();
}
return CommonResult.fail("权限不足");
}
// 当为最高审批人
if (parentId == 0) {
// 先判断是否已经被审批了
if (!"2".equals(applicationProcedureStatus)) {
// 当不是处理中时则无法审批
return CommonResult.fail("当前无法审批");
}
if ("1".equals(status)) {
status = "3";
}
applicationProcedure.setStatus(status);
applicationProcedure.setApproverId(adminId);
// 审批时间
applicationProcedure.setExamineAndApproveTime(LocalDateTime.now().format(dateTimeFormatter1));
// 审批备注
applicationProcedure.setExamineAndApproveRemark(remark);
applicationProcedureTemporaryService.updateById(applicationProcedure);
return CommonResult.ok();
}
if ("1".equals(status)) {
status = "2";
}
applicationProcedure.setStatus(status);
applicationProcedure.setSecondaryApproverId(adminId);
// 审批时间
applicationProcedure.setSecondaryExamineAndApproveTime(LocalDateTime.now().format(dateTimeFormatter1));
// 审批备注
applicationProcedure.setSecondaryExamineAndApproveRemark(remark);
applicationProcedureTemporaryService.updateById(applicationProcedure);
return CommonResult.ok();
}
@Override
public CommonResult appletList(int adminMenuId, String startTime, String endTime, String status, int page, int size) {
if (ObjectUtils.isEmpty(page) || page <= 0) {
page = 1;
}
if (ObjectUtils.isEmpty(size) || size <= 0) {
size = 10;
}
List list = applicationProcedureSettingService.list(new LambdaQueryWrapper<>());
ApplicationProcedureSetting applicationProcedureSetting = list.get(0);
String approverType = applicationProcedureSetting.getApproverType();
AdminMenu byId = adminMenuService.getById(adminMenuId);
Integer parentId = byId.getParentId();
PageUtils pageList = null;
//审批一次,角色等级不为0
if ("1".equals(approverType)) {
if (parentId != 0) {
return CommonResult.fail("暂无查看权限");
} else {
pageList = applicationProcedureTemporaryService.pageAppletList(startTime, endTime, status, page, size);
return CommonResult.ok(pageList);
}
}
if (parentId == 0) {
// 全部则是没有待审批的全部
if (ObjectUtils.isEmpty(status)) {
status = "0,2,3";
}
pageList = applicationProcedureTemporaryService.parentAppletPageList(startTime, endTime, status, page, size);
return CommonResult.ok(pageList);
}
pageList = applicationProcedureTemporaryService.pageAppletList(startTime, endTime, status, page, size);
return CommonResult.ok(pageList);
}
//region 获取是否跨周 且不超过两天
public static int checkWeek(String strDate1,String strDate2) {
Calendar calendar = Calendar.getInstance();
calendar.setTime(TimeExchange.StringToDate(strDate1,"yyyy-MM-dd"));
int year = calendar.get(Calendar.YEAR);
int week = calendar.get(Calendar.WEEK_OF_YEAR);
int day = calendar.get(Calendar.DAY_OF_WEEK)-1;
if (day==0){
day=7;
week=week-1;
}
Calendar calendar1 = Calendar.getInstance();
calendar1.setTime(TimeExchange.StringToDate(strDate2,"yyyy-MM-dd"));
int year1 = calendar1.get(Calendar.YEAR);
int week1 = calendar1.get(Calendar.WEEK_OF_YEAR);
int day1 = calendar1.get(Calendar.DAY_OF_WEEK)-1;
if (day1==0){
day=7;
week1=week1-1;
}
if(year==year1&&week==week1){
return day1-day;
}else{
return -1;
}
}
}