提交 df8685be authored 作者: hzh's avatar hzh

差旅配置部分功能实现

上级 8b4e9cd6
package org.dromara.server.constant.travel;
import lombok.AllArgsConstructor;
import lombok.Getter;
import org.dromara.server.domain.bo.ApplyBo;
import java.util.function.Predicate;
/**
* 申请开关
*
* @author wenhe
*/
@Getter
@AllArgsConstructor
public enum ApplySwitch {
/**
* 申请开关
*/
TRUE(true, "开启", apply -> apply != null),
FALSE(false, "关闭", apply -> true);
private final Boolean code;
private final String desc;
private final Predicate<ApplyBo> predicate;
/**
* 检查给定的 ApplyBo 是否满足当前开关的条件。
*
* @param apply 要检查的 ApplyBo 对象
* @return 如果满足条件则返回 true,否则返回 false
*/
public void isMatched(ApplyBo apply) {
boolean test = predicate.test(apply);
if (!test) {
throw new RuntimeException("申请设置已开启,请选择申请单!");
}
}
}
package org.dromara.server.constant.travel;
import lombok.AllArgsConstructor;
import lombok.Getter;
import org.dromara.common.core.utils.StringUtils;
import org.dromara.server.constant.ApplyStatus;
import org.dromara.server.domain.bo.ApplyBo;
import java.util.function.Predicate;
/**
* 审批开关
*
* @author wenhe
*/
@Getter
@AllArgsConstructor
public enum ApproveSwitch {
/**
* 审批开关枚举
*/
TRUE(true, "开启", apply -> apply != null && StringUtils.equals(ApplyStatus.FINISH.getCode(), apply.getStatus())),
FALSE(false, "关闭", apply -> apply != null);
private final Boolean code;
private final String desc;
private final Predicate<ApplyBo> predicate;
public void isMatched(ApplyBo apply) {
boolean test = predicate.test(apply);
if (!test) {
throw new RuntimeException("审批设置已开启,请选择正确状态的审批单!");
}
}
}
package org.dromara.server.constant.travel;
import lombok.AllArgsConstructor;
import lombok.Getter;
import org.dromara.server.domain.bo.ApplyBo;
import java.math.BigDecimal;
import java.util.function.BiFunction;
/**
* 预算控制
*
* @author wenhe
*/
@Getter
@AllArgsConstructor
public enum BudgetControl {
//不控制 控制
NOT_CONTROL("0", "不控制", (amount, apply) -> true),
CONTROL("1", "控制", (amount, apply) -> false);
private final String code;
private final String desc;
private final BiFunction<BigDecimal, ApplyBo, Boolean> function;
public void isMatched(BigDecimal amount, ApplyBo apply) {
boolean test = function.apply(amount, apply);
if (!test) {
throw new RuntimeException("预算管控功能暂未实现,请先现在还不控制功能!");
}
}
}
package org.dromara.server.constant.travel;
import lombok.AllArgsConstructor;
import lombok.Getter;
import org.dromara.common.core.utils.StreamUtils;
import org.dromara.common.core.utils.StringUtils;
import org.dromara.order.api.enums.OrderType;
import org.dromara.server.domain.bo.ApplyPersonBo;
import org.dromara.server.domain.vo.TravelControlMethodVo;
import java.util.List;
import java.util.function.BiFunction;
/**
* 管控方式
*
* @author wenhe
*/
@Getter
@AllArgsConstructor
public enum ControlMethod {
//申请人和出行人都可以、 申请人可以、出行人可以,不控制
APPLY_AND_TRAVEL("1", "申请人和出行人都可以控制", (cm, personList) -> false),
ONLY_APPLY("2", "申请人可以控制", (cm, personList) -> {
List<String> personInfoList = StreamUtils.toList(personList, ApplyPersonBo::getIdCard);
OrderType orderType = cm.getOrderType();
if (StringUtils.equals(OrderType.AIRPORT.getType(), orderType.getType())) {
return personInfoList.containsAll(cm.getInfoList());
} else if (StringUtils.equals(OrderType.TRAIN.getType(), orderType.getType())) {
return personInfoList.containsAll(cm.getInfoList());
} else if (StringUtils.equals(OrderType.HOTEL.getType(), orderType.getType())) {
return personInfoList.containsAll(cm.getInfoList());
} else {
personInfoList = StreamUtils.toList(personList, ApplyPersonBo::getPhone);
return personInfoList.containsAll(cm.getInfoList());
}
}),
ONLY_TRAVEL("3", "出行人可以控制", (cm, personList) -> false),
NOT_CONTROL("4", "不控制", (cm, personList) -> true);
private final String code;
private final String desc;
private final BiFunction<TravelControlMethodVo, List<ApplyPersonBo>, Boolean> function;
public void isMatched(TravelControlMethodVo cm, List<ApplyPersonBo> personList) {
boolean test = function.apply(cm, personList);
if (!test) {
throw new RuntimeException("管控方式功能以配置,请使用合适的申请单!");
}
}
}
package org.dromara.server.constant.travel;
import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUtil;
import lombok.AllArgsConstructor;
import lombok.Getter;
import org.dromara.server.domain.bo.ApplyBo;
import java.util.Date;
import java.util.function.BiFunction;
/**
* 时间限制
*
* @author wenhe
*/
@Getter
@AllArgsConstructor
public enum TimeLimit {
//不控制 控制
NOT_CONTROL("0", "不控制", (date, apply) -> true),
CONTROL("1", "控制", (date, apply) -> {
if (date == null) {
return false;
}
DateTime startTime = DateUtil.beginOfDay(apply.getStartTime());
DateTime endTime = DateUtil.endOfDay(apply.getEndTime());
return date.after(startTime) && date.before(endTime);
});
private final String code;
private final String desc;
private final BiFunction<Date, ApplyBo, Boolean> function;
public void isMatched(Date date, ApplyBo apply) {
boolean test = function.apply(date, apply);
if (!test) {
throw new RuntimeException("时间限制已配置,请选择合适的申请单!");
}
}
}
package org.dromara.server.constant.travel;
import com.alibaba.fastjson.JSONObject;
import lombok.AllArgsConstructor;
import lombok.Getter;
import org.dromara.server.domain.bo.ApplyBo;
import java.util.function.BiFunction;
/**
* 差旅控制
*
* @author wenhe
*/
@Getter
@AllArgsConstructor
public enum TravelControl {
//不控制 控制
NOT_CONTROL("0", "不控制", (json, apply) -> true),
CONTROL("1", "控制", (json, apply) -> false);
private final String code;
private final String desc;
private final BiFunction<JSONObject, ApplyBo, Boolean> function;
public void isMatched(JSONObject jsonObject, ApplyBo apply) {
boolean test = function.apply(jsonObject, apply);
if (!test) {
throw new RuntimeException("差旅管控功能暂未实现,请先现在关闭功能!");
}
}
}
package org.dromara.server.constant.travel;
import lombok.AllArgsConstructor;
import lombok.Getter;
import org.dromara.common.core.utils.StringUtils;
import org.dromara.order.api.enums.OrderType;
import org.dromara.server.domain.bo.ApplyBo;
import org.dromara.server.domain.vo.TravelControlVo;
import java.util.function.BiFunction;
/**
* 行程限制
* @author wenhe
*/
@Getter
@AllArgsConstructor
public enum TripLimit {
//不控制 控制
NOT_CONTROL("0", "不控制", (travelControl, apply) -> true),
CONTROL("1", "控制", (travelControl, apply) -> {
String startCity = travelControl.getStartCity();
String endCity = travelControl.getEndCity();
OrderType orderType = travelControl.getOrderType();
if (StringUtils.equals(OrderType.AIRPORT.getType(), orderType.getType())) {
return StringUtils.equals(startCity, apply.getDepartAddress()) &&
StringUtils.equals(endCity, apply.getArriveAddress());
} else if (StringUtils.equals(OrderType.TRAIN.getType(), orderType.getType())) {
return StringUtils.equals(startCity, apply.getDepartAddress()) &&
StringUtils.equals(endCity, apply.getArriveAddress());
} else if (StringUtils.equals(OrderType.HOTEL.getType(), orderType.getType())) {
return StringUtils.equals(endCity, apply.getArriveAddress());
} else {
return StringUtils.equals(endCity, apply.getArriveAddress());
}
});
private final String code;
private final String desc;
private final BiFunction<TravelControlVo, ApplyBo, Boolean> function;
public void isMatched(TravelControlVo travelControl, ApplyBo apply) {
boolean test = function.apply(travelControl, apply);
if (!test) {
throw new RuntimeException("行程限制已配置,请选择合适的申请单!");
}
}
}
package org.dromara.server.controller;
import cn.dev33.satoken.annotation.SaCheckPermission;
import lombok.RequiredArgsConstructor;
import org.dromara.common.core.domain.R;
import org.dromara.common.web.core.BaseController;
import org.dromara.server.domain.bo.TravelConfigBo;
import org.dromara.server.domain.vo.TravelConfigVo;
import org.dromara.server.service.ITravelConfigService;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
/**
* 差旅设置
* 前端访问路由地址为:/server/config
*
* @author hzh
* @date 2024-12-16
*/
@Validated
@RequiredArgsConstructor
@RestController
@RequestMapping("/config")
public class TravelConfigController extends BaseController {
private final ITravelConfigService travelConfigService;
/**
* 获取差旅设置详细信息
*/
@SaCheckPermission("server:config:query")
@GetMapping()
public R<TravelConfigVo> getInfo() {
List<TravelConfigVo> list = travelConfigService.queryList(new TravelConfigBo());
return R.ok(list.get(0));
}
}
package org.dromara.server.domain;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableLogic;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import org.dromara.common.tenant.core.TenantEntity;
import java.io.Serial;
/**
* 差旅设置对象 travel_config
*
* @author hzh
* @date 2024-12-16
*/
@Data
@Accessors(chain = true)
@EqualsAndHashCode(callSuper = true)
@TableName("travel_config")
public class TravelConfig extends TenantEntity {
@Serial
private static final long serialVersionUID = 1L;
/**
* id
*/
@TableId(value = "id")
private Long id;
/**
* 管控方式
*/
private String controlMethod;
/**
* 出差时间限制
*/
private String timeLimit;
/**
* 行程限制
*/
private String tripLimit;
/**
* 审批开关
*/
private Boolean approveSwitch;
/**
* 申请开关
*/
private Boolean applySwitch;
/**
* 预算控制
*/
private String budgetControl;
/**
* 差旅控制
*/
private String travelControl;
/**
* 删除标志(0代表存在 2代表删除)
*/
@TableLogic
private String delFlag;
}
package org.dromara.server.domain.bo;
import org.dromara.server.domain.TravelConfig;
import org.dromara.common.mybatis.core.domain.BaseEntity;
import org.dromara.common.core.validate.AddGroup;
import org.dromara.common.core.validate.EditGroup;
import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data;
import lombok.EqualsAndHashCode;
import jakarta.validation.constraints.*;
/**
* 差旅设置业务对象 travel_config
*
* @author hzh
* @date 2024-12-16
*/
@Data
@EqualsAndHashCode(callSuper = true)
@AutoMapper(target = TravelConfig.class, reverseConvertGenerate = false)
public class TravelConfigBo extends BaseEntity {
/**
* id
*/
@NotNull(message = "id不能为空", groups = { EditGroup.class })
private Long id;
/**
* 管控方式
*/
@NotBlank(message = "管控方式不能为空", groups = { AddGroup.class, EditGroup.class })
private String controlMethod;
/**
* 出差时间限制
*/
@NotBlank(message = "出差时间限制不能为空", groups = { AddGroup.class, EditGroup.class })
private String timeLimit;
/**
* 行程限制
*/
@NotBlank(message = "行程限制不能为空", groups = { AddGroup.class, EditGroup.class })
private String tripLimit;
/**
* 审批开关
*/
@NotNull(message = "审批开关不能为空", groups = { AddGroup.class, EditGroup.class })
private Boolean approveSwitch;
/**
* 申请开关
*/
@NotNull(message = "申请开关不能为空", groups = { AddGroup.class, EditGroup.class })
private Boolean applySwitch;
/**
* 预算控制
*/
@NotBlank(message = "预算控制不能为空", groups = { AddGroup.class, EditGroup.class })
private String budgetControl;
/**
* 差旅控制
*/
@NotBlank(message = "差旅控制不能为空", groups = { AddGroup.class, EditGroup.class })
private String travelControl;
}
package org.dromara.server.domain.vo;
import org.dromara.server.domain.TravelConfig;
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import com.alibaba.excel.annotation.ExcelProperty;
import org.dromara.common.excel.annotation.ExcelDictFormat;
import org.dromara.common.excel.convert.ExcelDictConvert;
import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
import java.util.Date;
/**
* 差旅设置视图对象 travel_config
*
* @author hzh
* @date 2024-12-16
*/
@Data
@ExcelIgnoreUnannotated
@AutoMapper(target = TravelConfig.class)
public class TravelConfigVo implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* id
*/
@ExcelProperty(value = "id")
private Long id;
/**
* 管控方式
*/
@ExcelProperty(value = "管控方式")
private String controlMethod;
/**
* 出差时间限制
*/
@ExcelProperty(value = "出差时间限制")
private String timeLimit;
/**
* 行程限制
*/
@ExcelProperty(value = "行程限制")
private String tripLimit;
/**
* 审批开关
*/
@ExcelProperty(value = "审批开关")
private Boolean approveSwitch;
/**
* 申请开关
*/
@ExcelProperty(value = "申请开关")
private Boolean applySwitch;
/**
* 预算控制
*/
@ExcelProperty(value = "预算控制")
private String budgetControl;
/**
* 差旅控制
*/
@ExcelProperty(value = "差旅控制")
private String travelControl;
}
package org.dromara.server.domain.vo;
import lombok.Data;
import lombok.experimental.Accessors;
import java.util.List;
/**
* @author hzh
* @date 2024-12-16
**/
@Data
@Accessors(chain = true)
public class TravelControlMethodVo extends TravelVo {
/**
* 信息列表 身份证信息或者手机号信息
*/
private List<String> infoList;
}
package org.dromara.server.domain.vo;
import lombok.Data;
import lombok.experimental.Accessors;
/**
* @author hzh
* @date 2024-12-16
**/
@Data
@Accessors(chain = true)
public class TravelControlVo extends TravelVo {
/**
* 出发城市
*/
private String startCity;
/**
* 到达城市
*/
private String endCity;
}
package org.dromara.server.domain.vo;
import lombok.Data;
import lombok.experimental.Accessors;
import org.dromara.order.api.enums.OrderType;
/**
* @author hzh
* @date 2024-12-16
**/
@Data
@Accessors(chain = true)
public class TravelVo {
/**
* 订单类型
*/
private OrderType orderType;
}
package org.dromara.server.mapper;
import org.dromara.server.domain.TravelConfig;
import org.dromara.server.domain.vo.TravelConfigVo;
import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
/**
* 差旅设置Mapper接口
*
* @author hzh
* @date 2024-12-16
*/
public interface TravelConfigMapper extends BaseMapperPlus<TravelConfig, TravelConfigVo> {
}
package org.dromara.server.service;
import org.dromara.common.mybatis.service.IBaseService;
import org.dromara.server.domain.TravelConfig;
import org.dromara.server.domain.bo.TravelConfigBo;
import org.dromara.server.domain.vo.TravelConfigVo;
/**
* 差旅设置Service接口
*
* @author hzh
* @date 2024-12-16
*/
public interface ITravelConfigService extends IBaseService<TravelConfigVo, TravelConfigBo, TravelConfig> {
/**
* 创建默认设置
*
* @param tenantId 租户ID
*/
void createDefaultConfig(String tenantId);
}
package org.dromara.server.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import lombok.RequiredArgsConstructor;
import org.dromara.common.core.utils.StringUtils;
import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
import org.dromara.common.mybatis.service.AbstractBaseService;
import org.dromara.common.tenant.helper.TenantHelper;
import org.dromara.server.constant.travel.*;
import org.dromara.server.domain.TravelConfig;
import org.dromara.server.domain.bo.TravelConfigBo;
import org.dromara.server.domain.vo.TravelConfigVo;
import org.dromara.server.mapper.TravelConfigMapper;
import org.dromara.server.service.ITravelConfigService;
import org.springframework.stereotype.Service;
import java.util.Map;
import java.util.Objects;
/**
* 差旅设置Service业务层处理
*
* @author hzh
* @date 2024-12-16
*/
@RequiredArgsConstructor
@Service
public class TravelConfigServiceImpl extends AbstractBaseService<TravelConfigVo, TravelConfigBo, TravelConfig> implements ITravelConfigService {
private final TravelConfigMapper baseMapper;
@Override
public BaseMapperPlus<TravelConfig, TravelConfigVo> mapper() {
return baseMapper;
}
@Override
public LambdaQueryWrapper<TravelConfig> buildQueryWrapper(TravelConfigBo bo) {
Map<String, Object> params = bo.getParams();
LambdaQueryWrapper<TravelConfig> lqw = Wrappers.lambdaQuery();
lqw.eq(StringUtils.isNotBlank(bo.getControlMethod()), TravelConfig::getControlMethod, bo.getControlMethod());
lqw.eq(StringUtils.isNotBlank(bo.getTimeLimit()), TravelConfig::getTimeLimit, bo.getTimeLimit());
lqw.eq(StringUtils.isNotBlank(bo.getTripLimit()), TravelConfig::getTripLimit, bo.getTripLimit());
lqw.eq(bo.getApproveSwitch() != null, TravelConfig::getApproveSwitch, bo.getApproveSwitch());
lqw.eq(bo.getApplySwitch() != null, TravelConfig::getApplySwitch, bo.getApplySwitch());
lqw.eq(StringUtils.isNotBlank(bo.getBudgetControl()), TravelConfig::getBudgetControl, bo.getBudgetControl());
lqw.eq(StringUtils.isNotBlank(bo.getTravelControl()), TravelConfig::getTravelControl, bo.getTravelControl());
return lqw;
}
@Override
public void createDefaultConfig(String tenantId) {
TenantHelper.ignore(() -> {
TravelConfig tc = baseMapper.selectOne(new LambdaQueryWrapper<TravelConfig>()
.eq(TravelConfig::getTenantId, tenantId));
if (Objects.nonNull(tc)) {
return;
}
tc = new TravelConfig()
.setControlMethod(ControlMethod.NOT_CONTROL.getCode())
.setTimeLimit(TimeLimit.NOT_CONTROL.getCode())
.setTripLimit(TripLimit.NOT_CONTROL.getCode())
.setApproveSwitch(ApproveSwitch.FALSE.getCode())
.setApplySwitch(ApplySwitch.FALSE.getCode())
.setBudgetControl(BudgetControl.NOT_CONTROL.getCode())
.setTravelControl(TravelControl.NOT_CONTROL.getCode());
tc.setTenantId(tenantId);
baseMapper.insert(tc);
});
}
}
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.dromara.server.mapper.TravelConfigMapper">
</mapper>
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论