开发技巧之协议管理

我爱海鲸 2023-09-05 17:33:50 暂无标签

简介一般我们在做协议内容的时候,一般都是一个静态的页面,每次修改和新增协议内容都很不方便,于是,通过数据库表来维护协议的内容

1、首先创建四张表agreement_type(系统协议类型表)、agreement_relation_detail(系统协议表与协议详情关系表)、agreement_list(系统协议清单表)、agreement_detail(系统协议详情)

agreement_type(系统协议类型表):

DROP TABLE IF EXISTS `agreement_type`;
CREATE TABLE `agreement_type`  (
  `id` bigint(64) NOT NULL COMMENT '主键',
  `tenant_id` varchar(12) CHARACTER SET utf8mb4 COLLATE utf8mb4_german2_ci NULL DEFAULT NULL COMMENT '租户ID',
  `is_deleted` int(2) NOT NULL DEFAULT 0 COMMENT '是否删除',
  `status` int(2) NOT NULL DEFAULT 1 COMMENT '状态',
  `create_user` bigint(64) NOT NULL DEFAULT -1 COMMENT '创建人',
  `create_dept` bigint(64) NOT NULL DEFAULT -1 COMMENT '创建部门',
  `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',
  `update_user` bigint(64) NOT NULL DEFAULT -1 COMMENT '修改人',
  `update_time` datetime NULL DEFAULT NULL COMMENT '修改时间',
  `code` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_german2_ci NOT NULL DEFAULT '' COMMENT '前端编码',
  `name` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_german2_ci NOT NULL DEFAULT '' COMMENT '类型名称',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_german2_ci COMMENT = '系统协议类型表' ROW_FORMAT = Dynamic;

SET FOREIGN_KEY_CHECKS = 1;

agreement_relation_detail(系统协议表与协议详情关系表):

DROP TABLE IF EXISTS `agreement_relation_detail`;
CREATE TABLE `agreement_relation_detail`  (
  `agreement_list_id` bigint(64) NOT NULL COMMENT '系统协议清单id',
  `agreement_detail_id` bigint(64) NOT NULL COMMENT '系统协议详情id',
  PRIMARY KEY (`agreement_list_id`, `agreement_detail_id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_german2_ci COMMENT = '系统协议表与协议详情关系表' ROW_FORMAT = Dynamic;

SET FOREIGN_KEY_CHECKS = 1;

 

agreement_list(系统协议清单表):

DROP TABLE IF EXISTS `agreement_list`;
CREATE TABLE `agreement_list`  (
  `id` bigint(64) NOT NULL COMMENT '主键',
  `tenant_id` varchar(12) CHARACTER SET utf8mb4 COLLATE utf8mb4_german2_ci NULL DEFAULT NULL COMMENT '租户ID',
  `is_deleted` int(2) NOT NULL DEFAULT 0 COMMENT '是否删除',
  `status` int(2) NOT NULL DEFAULT 1 COMMENT '状态',
  `create_user` bigint(64) NOT NULL DEFAULT -1 COMMENT '创建人',
  `create_dept` bigint(64) NOT NULL DEFAULT -1 COMMENT '创建部门',
  `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',
  `update_user` bigint(64) NOT NULL DEFAULT -1 COMMENT '修改人',
  `update_time` datetime NULL DEFAULT NULL COMMENT '修改时间',
  `agreement_type_id` bigint(64) NOT NULL COMMENT '协议类型id',
  `name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_german2_ci NOT NULL COMMENT '协议名称',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_german2_ci COMMENT = '系统协议清单表' ROW_FORMAT = Dynamic;

SET FOREIGN_KEY_CHECKS = 1;

agreement_detail(系统协议详情):

DROP TABLE IF EXISTS `agreement_detail`;
CREATE TABLE `agreement_detail`  (
  `id` bigint(64) NOT NULL COMMENT '主键',
  `tenant_id` varchar(12) CHARACTER SET utf8mb4 COLLATE utf8mb4_german2_ci NULL DEFAULT NULL COMMENT '租户ID',
  `is_deleted` int(2) NOT NULL DEFAULT 0 COMMENT '是否删除',
  `status` int(2) NOT NULL DEFAULT 1 COMMENT '状态 1:生效中(有且只有一个),0:已失效,默认为0',
  `create_user` bigint(64) NOT NULL DEFAULT -1 COMMENT '创建人',
  `create_dept` bigint(64) NOT NULL DEFAULT -1 COMMENT '创建部门',
  `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',
  `update_user` bigint(64) NOT NULL DEFAULT -1 COMMENT '修改人',
  `update_time` datetime NULL DEFAULT NULL COMMENT '修改时间',
  `name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_german2_ci NOT NULL COMMENT '协议标题',
  `agreement_version_number` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_german2_ci NOT NULL COMMENT '协议版本号',
  `content` mediumtext CHARACTER SET utf8mb4 COLLATE utf8mb4_german2_ci NOT NULL COMMENT '富文本内容',
  `effect_time` datetime NULL DEFAULT NULL COMMENT '生效时间',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_german2_ci COMMENT = '系统协议详情' ROW_FORMAT = Dynamic;

SET FOREIGN_KEY_CHECKS = 1;

2、AgreementTypeController(系统协议类型表接口)

package com.sicpay.system.controller;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.sicpay.system.dto.AgreementTypeSaveDTO;
import com.sicpay.system.dto.AgreementTypeUpdateDTO;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
import lombok.AllArgsConstructor;
import javax.validation.Valid;

import org.springblade.core.mp.support.Query;
import org.springblade.core.tool.api.R;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.bind.annotation.RequestParam;
import com.sicpay.system.vo.AgreementTypeVO;
import com.sicpay.system.service.IAgreementTypeService;
import org.springblade.core.boot.ctrl.BladeController;

import java.util.List;

/**
 * 系统协议类型表 控制器
 *
 */
@RestController
@AllArgsConstructor
@RequestMapping("/agreementtype")
@Api(value = "系统协议类型表", tags = "系统协议类型表接口")
public class AgreementTypeController {

	private final IAgreementTypeService agreementTypeService;

	/**
	 * 列表 系统协议类型表
	 */
	@GetMapping("/list")
	@ApiOperationSupport(order = 1)
	@ApiOperation(value = "列表", notes = "")
	public R<List<AgreementTypeVO>> list() {
		return R.data(agreementTypeService.listAgreementType());
	}

	/**
	 * 详情
	 */
	@GetMapping("/detail")
	@ApiOperationSupport(order = 2)
	@ApiOperation(value = "详情", notes = "传入id")
	public R<AgreementTypeVO> detail(@ApiParam(value = "id", required = true) @RequestParam Long id) {
		return R.data(agreementTypeService.detail(id));
	}

	/**
	 * 修改 系统协议类型表
	 */
	@PostMapping("/update")
	@ApiOperationSupport(order = 3)
	@ApiOperation(value = "修改", notes = "传入agreementTypeUpdateDTO")
	public R<Boolean> update(@Valid @RequestBody AgreementTypeUpdateDTO agreementTypeUpdateDTO) {
		return R.status(agreementTypeService.update(agreementTypeUpdateDTO));
	}

	/**
	 * 新增 系统协议类型表
	 */
	@PostMapping("/save")
	@ApiOperationSupport(order = 4)
	@ApiOperation(value = "新增", notes = "传入agreementTypeSaveDTO")
	public R<Boolean> save(@Valid @RequestBody AgreementTypeSaveDTO agreementTypeSaveDTO) {
		return R.status(agreementTypeService.save(agreementTypeSaveDTO));
	}

	/**
	 * 分页 系统协议类型表
	 */
	@GetMapping("/page")
	@ApiOperationSupport(order = 1)
	@ApiOperation(value = "分页", notes = "传入query")
	public R<IPage<AgreementTypeVO>> page(Query query) {
		return R.data(agreementTypeService.page(query));
	}

}

3、AgreementListController(系统协议清单表接口)

package com.sicpay.system.controller;

import com.sicpay.system.dto.AgreementDetailSaveDTO;
import com.sicpay.system.dto.AgreementDetailUpdateDTO;
import com.sicpay.system.dto.AgreementDetailUpdateStatusDTO;
import com.sicpay.system.vo.*;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
import lombok.AllArgsConstructor;
import javax.validation.Valid;

import org.springblade.core.mp.support.Query;
import org.springblade.core.tool.api.R;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.bind.annotation.RequestParam;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.sicpay.system.service.IAgreementListService;
import org.springblade.core.boot.ctrl.BladeController;

import java.util.List;

/**
 * 系统协议清单表 控制器
 *
 */
@RestController
@AllArgsConstructor
@RequestMapping("/agreementlist")
@Api(value = "系统协议清单表", tags = "系统协议清单表接口")
public class AgreementListController {

	private final IAgreementListService agreementListService;

	/**
	 * 分页 系统协议清单表
	 */
	@GetMapping("/page")
	@ApiOperationSupport(order = 1)
	@ApiOperation(value = "分页", notes = "传入query")
	public R<IPage<AgreementListVO>> page(Query query) {
		IPage<AgreementListVO> pages = agreementListService.page(query);
		return R.data(pages);
	}

	/**
	 * 详情
	 */
	@GetMapping("/detail")
	@ApiOperationSupport(order = 2)
	@ApiOperation(value = "详情", notes = "传入id")
	public R<AgreementListDetailVO> detail(@ApiParam(value = "id", required = true) @RequestParam Long id) {
			return R.data(agreementListService.detail(id));
	}

	/**
	 * 分页 历史
	 */
	@GetMapping("/history")
	@ApiOperationSupport(order = 3)
	@ApiOperation(value = "历史", notes = "传入query")
	public R<IPage<AgreementHistoryListVO>> history(Query query, @ApiParam(value = "id", required = true) @RequestParam Long id) {
		IPage<AgreementHistoryListVO> pages = agreementListService.history(query,id);
		return R.data(pages);
	}

	/**
	 * 新增 系统协议清单表
	 */
	@PostMapping("/save")
	@ApiOperationSupport(order = 4)
	@ApiOperation(value = "新增", notes = "传入agreementList")
	public R<Boolean> save(@Valid @RequestBody AgreementDetailSaveDTO agreementDetailSaveDTO) {
		return R.status(agreementListService.save(agreementDetailSaveDTO));
	}

	/**
	 * 修改状态
	 */
	@PostMapping("/updateStatus")
	@ApiOperationSupport(order = 5)
	@ApiOperation(value = "修改状态", notes = "传入caseTypeUpdateStatusDTO")
	public R<Boolean> updateStatus(@Valid @RequestBody AgreementDetailUpdateStatusDTO agreementDetailUpdateStatusDTO) {
		return R.status(agreementListService.updateStatus(agreementDetailUpdateStatusDTO));
	}

	/**
	 * 编辑系统协议
	 */
	@PostMapping("/update")
	@ApiOperationSupport(order = 6)
	@ApiOperation(value = "编辑系统协议", notes = "传入agreementList")
	public R<Boolean> update(@Valid @RequestBody AgreementDetailUpdateDTO agreementDetailUpdateDTO) {
		return R.status(agreementListService.update(agreementDetailUpdateDTO));
	}

	/**
	 * 历史版本详情
	 */
	@GetMapping("/historyDetail")
	@ApiOperationSupport(order = 7)
	@ApiOperation(value = "历史版本详情", notes = "agreementDetailId")
	public R<AgreementHistoryDetailVO> historyDetail(@ApiParam(value = "协议详情id", required = true) @RequestParam Long agreementDetailId) {
		return R.data(agreementListService.historyDetail(agreementDetailId));
	}

	/**
	 * 根据协议类型的前端编码获取协议名称
	 */
	@GetMapping("/agreementNameList")
	@ApiOperationSupport(order = 8)
	@ApiOperation(value = "根据协议类型的前端编码获取协议名称", notes = "根据协议类型的前端编码获取协议名称")
	public R<List<AgreementTypeNameVO>> agreementNameList(@ApiParam(value = "前端编码", required = true) @RequestParam String code,@ApiParam(value = "租户id", required = false) @RequestParam(required = false) String tenantId) {
		return R.data(agreementListService.agreementNameList(code,tenantId));
	}

	/**
	 * 根据协议清单id获取协议内容
	 */
	@GetMapping("/agreementNameDetail")
	@ApiOperationSupport(order = 9)
	@ApiOperation(value = "根据协议清单id获取协议内容", notes = "根据协议清单id获取协议内容")
	public R<String> agreementNameDetail(@ApiParam(value = "协议清单id", required = true) @RequestParam Long agreementListId,@ApiParam(value = "租户id", required = false) @RequestParam(required = false) String tenantId) {
		return R.data(agreementListService.agreementNameDetail(agreementListId,tenantId));
	}
}

4、IAgreementTypeService接口:

package com.sicpay.system.service;

import com.sicpay.system.dto.AgreementTypeSaveDTO;
import com.sicpay.system.dto.AgreementTypeUpdateDTO;
import com.sicpay.system.entity.AgreementType;
import com.sicpay.system.vo.AgreementTypeVO;
import org.springblade.core.mp.base.BaseService;
import com.baomidou.mybatisplus.core.metadata.IPage;
import org.springblade.core.mp.support.Query;

import java.util.List;

/**
 * 系统协议类型表 服务类
 *
 */
public interface IAgreementTypeService extends BaseService<AgreementType> {

	/**
	 * 系统协议类型列表
	 * @return
	 */
	List<AgreementTypeVO> listAgreementType();

	/**
	 * 详情
	 * @param id
	 * @return
	 */
	AgreementTypeVO detail(Long id);

	/**
	 * 修改协议类型
	 * @param agreementTypeUpdateDTO 修改请求对象
	 * @return 是否修改成功
	 */
	boolean update(AgreementTypeUpdateDTO agreementTypeUpdateDTO);

	/**
	 * 新增修改协议类型
	 * @param agreementTypeSaveDTO 新增协议类型
	 * @return 是否新增陈工
	 */
	boolean save(AgreementTypeSaveDTO agreementTypeSaveDTO);

	/**
	 * 分页查询协议内容
	 * @param query 查询条件
	 * @return 分页数据
	 */
	IPage<AgreementTypeVO> page(Query query);

}

5、AgreementTypeServiceImpl实现

package com.sicpay.system.service.impl;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.sicpay.system.dto.AgreementTypeSaveDTO;
import com.sicpay.system.dto.AgreementTypeUpdateDTO;
import com.sicpay.system.entity.AgreementType;
import com.sicpay.system.vo.AgreementTypeVO;
import com.sicpay.system.mapper.AgreementTypeMapper;
import com.sicpay.system.service.IAgreementTypeService;
import com.sicpay.system.wrapper.AgreementTypeWrapper;
import org.springblade.common.exception.ResultCodeEnum;
import org.springblade.core.log.exception.BusinessException;
import org.springblade.core.mp.base.BaseServiceImpl;
import org.springblade.core.mp.support.Condition;
import org.springblade.core.mp.support.Query;
import org.springblade.core.tool.utils.BeanUtil;
import org.springblade.core.tool.utils.CollectionUtil;
import org.springblade.core.tool.utils.ObjectUtil;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.Objects;

/**
 * 系统协议类型表 服务实现类
 *
 */
@Service
public class AgreementTypeServiceImpl extends BaseServiceImpl<AgreementTypeMapper, AgreementType> implements IAgreementTypeService {

	@Override
	public List<AgreementTypeVO> listAgreementType() {
		List<AgreementType> list = this.list(Wrappers.<AgreementType>lambdaQuery()
			.orderByDesc(AgreementType::getId)
		);
		if (CollectionUtil.isNotEmpty(list)) {
			return BeanUtil.copy(list, AgreementTypeVO.class);
		}
		return null;
	}

	@Override
	public AgreementTypeVO detail(Long id) {
		AgreementType detail = this.getById(id);
		if (ObjectUtil.isNotEmpty(detail)) {
			return AgreementTypeWrapper.build().entityVO(detail);
		}
		return null;
	}

	@Override
	public boolean update(AgreementTypeUpdateDTO agreementTypeUpdateDTO) {
		checkAgreementTypeRepeat(agreementTypeUpdateDTO.getCode(),agreementTypeUpdateDTO.getName(),agreementTypeUpdateDTO.getId());
		AgreementType agreementType = Objects.requireNonNull(BeanUtil.copy(agreementTypeUpdateDTO, AgreementType.class));
		this.updateById(agreementType);
		return true;
	}

	@Override
	public boolean save(AgreementTypeSaveDTO agreementTypeSaveDTO) {
		checkAgreementTypeRepeat(agreementTypeSaveDTO.getCode(),agreementTypeSaveDTO.getName(),null);
		AgreementType agreementType = Objects.requireNonNull(BeanUtil.copy(agreementTypeSaveDTO, AgreementType.class));
		this.save(agreementType);
		return true;
	}

	@Override
	public IPage<AgreementTypeVO> page(Query query) {
		IPage<AgreementType> pages = this.page(Condition.getPage(query));
		return AgreementTypeWrapper.build().pageVO(pages);
	}

	/**
	 * 校验是否存在相同协议类型前端编码以及类型名称
	 * @param code 前端编码
	 * @param name 协议类型名称
	 * @param agreementId 协议类型id
	 */
	private void checkAgreementTypeRepeat(String code,String name,Long agreementId) {
		boolean isSave = ObjectUtil.isEmpty(agreementId);
		if (isSave) {
			exitAgreementTypeRepeatCode(code);
			exitAgreementTypeRepeatName(name);
		} else {
			AgreementType agreementType = this.getById(agreementId);
			if (ObjectUtil.isEmpty(agreementType)) {
				throw new BusinessException(ResultCodeEnum.AGREEMENT_TYPE_EXIT);
			}
			// 过滤自己 进行校验
			if(!agreementType.getCode().equals(code)) {
				exitAgreementTypeRepeatCode(code);
			}
			// 过滤自己 进行校验
			if(!agreementType.getName().equals(name)) {
				exitAgreementTypeRepeatName(name);
			}
		}
	}

	/**
	 * 校验是否存在相同协议类型前端编码
	 * @param code 前端编码
	 */
	private void exitAgreementTypeRepeatCode(String code) {
		int count = this.count(Wrappers.<AgreementType>lambdaQuery()
				.eq(AgreementType::getCode, code)
		);
		if (count > 0) {
			throw new BusinessException(ResultCodeEnum.AGREEMENT_TYPE_CODE_REPEAT);
		}
	}

	/**
	 * 校验是否存在相同协议类型名称
	 * @param name 协议类型名称
	 */
	private void exitAgreementTypeRepeatName(String name) {
		int count = this.count(Wrappers.<AgreementType>lambdaQuery()
				.eq(AgreementType::getName, name)
		);
		if (count > 0) {
			throw new BusinessException(ResultCodeEnum.AGREEMENT_TYPE_NAME_REPEAT);
		}
	}

}

6、IAgreementRelationDetailService接口

package com.sicpay.system.service;

import com.sicpay.system.entity.AgreementRelationDetail;
import com.sicpay.system.vo.AgreementRelationDetailVO;
import com.baomidou.mybatisplus.extension.service.IService;
import com.baomidou.mybatisplus.core.metadata.IPage;

import java.util.List;

/**
 * 系统协议表与协议详情关系表 服务类
 *
 */
public interface IAgreementRelationDetailService extends IService<AgreementRelationDetail> {

	/**
	 * 根据清单id查询关系表
	 * @param agreementListId 协议清单id
	 * @return 关系表数据
	 */
	List<AgreementRelationDetail> getAgreementRelationDetailsByAgreementListId(Long agreementListId);
}

7、AgreementRelationDetailServiceImpl实现

package com.sicpay.system.service.impl;

import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.sicpay.system.entity.AgreementRelationDetail;
import com.sicpay.system.vo.AgreementRelationDetailVO;
import com.sicpay.system.mapper.AgreementRelationDetailMapper;
import com.sicpay.system.service.IAgreementRelationDetailService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
import com.baomidou.mybatisplus.core.metadata.IPage;

import java.util.List;

/**
 * 系统协议表与协议详情关系表 服务实现类
 *
 */
@Service
public class AgreementRelationDetailServiceImpl extends ServiceImpl<AgreementRelationDetailMapper, AgreementRelationDetail> implements IAgreementRelationDetailService {


	@Override
	public List<AgreementRelationDetail> getAgreementRelationDetailsByAgreementListId(Long agreementListId) {
		// 根据清单id查询关系表
		return this.list(Wrappers.<AgreementRelationDetail>lambdaQuery()
				.eq(AgreementRelationDetail::getAgreementListId, agreementListId)
		);
	}
}

8、IAgreementListService接口

package com.sicpay.system.service;

import com.sicpay.system.dto.AgreementDetailSaveDTO;
import com.sicpay.system.dto.AgreementDetailUpdateDTO;
import com.sicpay.system.dto.AgreementDetailUpdateStatusDTO;
import com.sicpay.system.dto.AgreementTypeNameDTO;
import com.sicpay.system.entity.AgreementList;
import com.sicpay.system.vo.*;
import org.springblade.core.mp.base.BaseService;
import com.baomidou.mybatisplus.core.metadata.IPage;
import org.springblade.core.mp.support.Query;

import java.util.List;

/**
 * 系统协议清单表 服务类
 *
 */
public interface IAgreementListService extends BaseService<AgreementList> {

	/**
	 * 分页查询
	 * @param query
	 * @return
	 */
	IPage<AgreementListVO> page(Query query);

	/**
	 * 详情
	 * @param id 协议清单id
	 * @return 协议详情
	 */
	AgreementListDetailVO detail(Long id);

	/**
	 * 历史协议分页数据
	 * @param query 查询对象
	 * @param id 协议清单id
	 * @return 历史协议分页数据
	 */
	IPage<AgreementHistoryListVO> history(Query query, Long id);

	/**
	 * 保存协议信息
	 * @param agreementDetailSaveDTO
	 * @return 是否保存成功
	 */
	Boolean save(AgreementDetailSaveDTO agreementDetailSaveDTO);

	/**
	 * 修改协议清单状态
	 * @param agreementDetailUpdateStatusDTO 修改协议状态清单请求对象
	 * @return 是否修改成功
	 */
	Boolean updateStatus(AgreementDetailUpdateStatusDTO agreementDetailUpdateStatusDTO);

	/**
	 * 编辑系统协议
	 * @param agreementDetailUpdateDTO 编辑系统协议请求对象
	 * @return 是否修改成功
	 */
	Boolean update (AgreementDetailUpdateDTO agreementDetailUpdateDTO);


	/**
	 * 历史版本详情
	 * @param agreementDetailId 协议详情id
	 * @return 历史版本详情
	 */
	AgreementHistoryDetailVO historyDetail(Long agreementDetailId);


	/**
	 * 根据协议类型的前端编码获取协议名称
	 * @param code 前端编码
	 * @param tenantId 租户id
	 * @return
	 */
	List<AgreementTypeNameVO> agreementNameList(String code, String tenantId);

	/**
	 * 根据协议id获取协议的内容
	 * @param agreementListId 协议清单id
	 * @param tenantId 租户id
	 * @return
	 */
	String agreementNameDetail(Long agreementListId,String tenantId);

}

9、AgreementListServiceImpl实现

package com.sicpay.system.service.impl;

import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.sicpay.api.constant.SicpayStatusEnum;
import com.sicpay.system.dto.AgreementDetailSaveDTO;
import com.sicpay.system.dto.AgreementDetailUpdateDTO;
import com.sicpay.system.dto.AgreementDetailUpdateStatusDTO;
import com.sicpay.system.entity.AgreementDetail;
import com.sicpay.system.entity.AgreementList;
import com.sicpay.system.entity.AgreementRelationDetail;
import com.sicpay.system.entity.AgreementType;
import com.sicpay.system.service.IAgreementDetailService;
import com.sicpay.system.service.IAgreementRelationDetailService;
import com.sicpay.system.service.IAgreementTypeService;
import com.sicpay.system.vo.*;
import com.sicpay.system.mapper.AgreementListMapper;
import com.sicpay.system.service.IAgreementListService;
import com.sicpay.system.wrapper.AgreementDetailHistoryWrapper;
import com.sicpay.system.wrapper.AgreementListDetailWrapper;
import com.sicpay.system.wrapper.AgreementListWrapper;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springblade.common.constant.TenantConstant;
import org.springblade.common.exception.ResultCodeEnum;
import org.springblade.core.log.exception.BusinessException;
import org.springblade.core.mp.base.BaseServiceImpl;
import org.springblade.core.mp.support.Condition;
import org.springblade.core.mp.support.Query;
import org.springblade.core.tool.utils.*;
import org.springblade.system.entity.Tenant;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import org.springframework.transaction.annotation.Transactional;

import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;

/**
 * 系统协议清单表 服务实现类
 *
 */
@Service
@Slf4j
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
public class AgreementListServiceImpl extends BaseServiceImpl<AgreementListMapper, AgreementList> implements IAgreementListService {

	private final IAgreementTypeService agreementTypeService;

	private final IAgreementDetailService agreementDetailService;

	private final IAgreementRelationDetailService agreementRelationDetailService;

	private final String DEFAULT_TENANT_ID = "000000";

	@Override
	public IPage<AgreementListVO> page(Query query) {
		IPage<AgreementList> pages = this.page(Condition.getPage(query));
		return AgreementListWrapper.build(agreementTypeService,pages.getRecords()).pageVO(pages);
	}

	@Override
	public AgreementListDetailVO detail(Long id) {
		AgreementList agreementList = this.getById(id);
		if (ObjectUtil.isEmpty(agreementList)) {
			throw new BusinessException(ResultCodeEnum.AGREEMENT_EXIT);
		}
		SicpayStatusEnum statusEnum = SicpayStatusEnum.getStatusEnum(agreementList.getStatus());
		if (statusEnum == SicpayStatusEnum.INVALID) {
			throw new BusinessException(ResultCodeEnum.AGREEMENT_DISABLE);
		}
		agreementDetailService.updateStatus(id);
		return AgreementListDetailWrapper.build(agreementTypeService,agreementDetailService,agreementRelationDetailService).entityVO(agreementList);
	}

	@Override
	public IPage<AgreementHistoryListVO> history(Query query, Long id) {
		AgreementList agreementList = this.getById(id);
		if (ObjectUtil.isEmpty(agreementList)) {
			return null;
		}
		SicpayStatusEnum statusEnum = SicpayStatusEnum.getStatusEnum(agreementList.getStatus());
		if (statusEnum == SicpayStatusEnum.INVALID) {
			throw new BusinessException(ResultCodeEnum.AGREEMENT_DISABLE);
		}
		// 根据清单id查询关系表
		List<AgreementRelationDetail> agreementRelationDetails = agreementRelationDetailService.getAgreementRelationDetailsByAgreementListId(agreementList.getId());
		log.info("AgreementListServiceImpl-history-根据清单id【{}】查询关系表【{}】",agreementList.getId(),agreementRelationDetails);
		if (CollectionUtil.isEmpty(agreementRelationDetails)) {
			throw new BusinessException(ResultCodeEnum.AGREEMENT_EXIT);
		}
		List<Long> agreementDetailIds = agreementRelationDetails.stream()
				.map(AgreementRelationDetail::getAgreementDetailId)
				.collect(Collectors.toList());
		IPage<AgreementDetail> page = agreementDetailService.page(Condition.getPage(query), Wrappers.<AgreementDetail>lambdaQuery()
				// 刷选出的协议详情id
				.in(AgreementDetail::getId, agreementDetailIds)
				// 生效时间小于当前时间,即已生效过的
				.le(AgreementDetail::getEffectTime,DateUtil.now())
				// 按照详情id进行倒序
				.orderByDesc(AgreementDetail::getId)
		);
		return AgreementDetailHistoryWrapper.build().pageVO(page);
	}

	@Override
	@Transactional(rollbackFor = Exception.class)
	public Boolean save(AgreementDetailSaveDTO agreementDetailSaveDTO) {
		AgreementType agreementType = agreementTypeService.getById(agreementDetailSaveDTO.getAgreementTypeId());
		if (ObjectUtil.isEmpty(agreementType)) {
			throw new BusinessException(ResultCodeEnum.AGREEMENT_TYPE_EXIT);
		}
		AgreementList agreementList = Objects.requireNonNull(BeanUtil.copy(agreementDetailSaveDTO, AgreementList.class));
		// 将数据保存到协议清单
		this.save(agreementList);
		Long agreementListId = agreementList.getId();
		agreementDetailSaveDTO.setAgreementListId(agreementListId);
		// 将数据保存到协议详情表
		Long agreementDetailId = agreementDetailService.save(agreementDetailSaveDTO);
		// 将数据保存到清单详情关系表
		if (ObjectUtil.isNotEmpty(agreementListId) && ObjectUtil.isNotEmpty(agreementDetailId)) {
			AgreementRelationDetail agreementRelationDetail = new AgreementRelationDetail();
			agreementRelationDetail.setAgreementListId(agreementListId);
			agreementRelationDetail.setAgreementDetailId(agreementDetailId);
			agreementRelationDetailService.save(agreementRelationDetail);
			return true;
		}
		return false;
	}

	@Override
	public Boolean updateStatus(AgreementDetailUpdateStatusDTO agreementDetailUpdateStatusDTO) {
		this.update(Wrappers.<AgreementList>lambdaUpdate()
				.set(AgreementList::getStatus,agreementDetailUpdateStatusDTO.getStatus())
				.eq(AgreementList::getId,agreementDetailUpdateStatusDTO.getId())
		);
		return true;
	}

	@Override
	@Transactional(rollbackFor = Exception.class)
	public Boolean update(AgreementDetailUpdateDTO agreementDetailUpdateDTO) {
		AgreementList agreementList = this.getById(agreementDetailUpdateDTO.getId());
		if (ObjectUtil.isEmpty(agreementList)) {
			throw new BusinessException(ResultCodeEnum.AGREEMENT_EXIT);
		}
		// 修改协议清单表中的数据
		agreementList.setName(agreementDetailUpdateDTO.getName());
		this.updateById(agreementList);
		// 根据查询清单与详情的关系表
		List<AgreementRelationDetail> agreementRelationDetails = agreementRelationDetailService.getAgreementRelationDetailsByAgreementListId(agreementList.getId());
		log.info("AgreementListServiceImpl-history-根据清单id【{}】查询关系表【{}】",agreementList.getId(),agreementRelationDetails);
		if (CollectionUtil.isEmpty(agreementRelationDetails)) {
			throw new BusinessException(ResultCodeEnum.AGREEMENT_EXIT);
		}
		// 根据id的集合查询详情表中的数据,并通过生效时间(尚未到生效时间)、生效状态(已生效)进行刷选 即,刷选草稿状态的协议数据
		List<Long> detailIds = agreementRelationDetails.stream()
				.map(AgreementRelationDetail::getAgreementDetailId)
				.collect(Collectors.toList());
		List<AgreementDetail> agreementDetails = agreementDetailService.getValidAgreementDetailByDetailIds(detailIds);
		if (CollectionUtil.isNotEmpty(agreementDetails)) {
			// 设置协议详情id
			agreementDetailUpdateDTO.setAgreementDetailId(agreementDetails.get(0).getId());
			// 协议详情表中存在数据时,做修改操作
			agreementDetailService.update(agreementDetailUpdateDTO);
		} else {
			// 协议详情表中不存在数据时,做新增操作
			AgreementDetailSaveDTO agreementDetailSaveDTO = Objects.requireNonNull(BeanUtil.copy(agreementDetailUpdateDTO, AgreementDetailSaveDTO.class));
			agreementDetailSaveDTO.setAgreementTypeId(agreementList.getAgreementTypeId());
			agreementDetailSaveDTO.setAgreementListId(agreementList.getId());
			// 将数据保存到协议详情表
			Long agreementDetailId = agreementDetailService.save(agreementDetailSaveDTO);
			AgreementRelationDetail agreementRelationDetail = new AgreementRelationDetail();
			agreementRelationDetail.setAgreementListId(agreementList.getId());
			agreementRelationDetail.setAgreementDetailId(agreementDetailId);
			agreementRelationDetailService.save(agreementRelationDetail);
		}
		return true;
	}

	@Override
	public AgreementHistoryDetailVO historyDetail(Long agreementDetailId) {
		AgreementDetail agreementDetail = agreementDetailService.getById(agreementDetailId);
		if (ObjectUtil.isEmpty(agreementDetail)) {
			throw new BusinessException(ResultCodeEnum.AGREEMENT_EXIT);
		}
		return Objects.requireNonNull(BeanUtil.copy(agreementDetail, AgreementHistoryDetailVO.class));
	}

	@Override
	public List<AgreementTypeNameVO> agreementNameList(String code, String tenantId) {
		if (StringUtil.isBlank(tenantId)) {
			tenantId = DEFAULT_TENANT_ID;
		}
		List<AgreementTypeNameVO> result = new ArrayList<>();
		AgreementType agreementType = agreementTypeService.getOne(Wrappers.<AgreementType>lambdaQuery()
				.eq(AgreementType::getCode, code)
				.eq(AgreementType::getTenantId,tenantId)
		);
		if (ObjectUtil.isEmpty(agreementType)) {
			throw new BusinessException(ResultCodeEnum.AGREEMENT_CODE_ERROR);
		}
		List<AgreementList> list = this.list(Wrappers.<AgreementList>lambdaQuery()
				.eq(AgreementList::getAgreementTypeId, agreementType.getId())
				.eq(AgreementList::getStatus,SicpayStatusEnum.VALID.getCode())
				.orderByAsc(AgreementList::getId)
		);
		if (CollectionUtil.isNotEmpty(list)) {
			list.forEach(agreementList -> {
				agreementDetailService.updateStatus(agreementList.getId());
				// 根据清单id查询关系表
				List<AgreementRelationDetail> agreementRelationDetails = agreementRelationDetailService.getAgreementRelationDetailsByAgreementListId(agreementList.getId());
				log.info("AgreementListServiceImpl-agreementNameList-根据清单id【{}】查询关系表【{}】",agreementList.getId(),agreementRelationDetails);
				if (CollectionUtil.isNotEmpty(agreementRelationDetails)) {
					// 根据id的集合查询详情表中的数据
					List<Long> detailIds = agreementRelationDetails.stream()
							.map(AgreementRelationDetail::getAgreementDetailId)
							.collect(Collectors.toList());
					// 获取状态为生效,且已到生效时间 id倒序
					List<AgreementDetail> agreementDetails = agreementDetailService.getEffectValidAgreementDetailByDetailIds(detailIds);
					AgreementTypeNameVO agreementTypeNameVO = new AgreementTypeNameVO();
					agreementTypeNameVO.setAgreementName(agreementDetails.get(0).getName());
					agreementTypeNameVO.setAgreementListId(agreementList.getId());
					agreementTypeNameVO.setCode(agreementType.getCode());
					result.add(agreementTypeNameVO);
				}
			});
		}
		return result;
	}

	@Override
	public String agreementNameDetail(Long agreementListId,String tenantId) {
		if (StringUtil.isBlank(tenantId)) {
			tenantId = DEFAULT_TENANT_ID;
		}
		AgreementList agreementList = this.getOne(Wrappers.<AgreementList>lambdaQuery()
			.eq(AgreementList::getId,agreementListId)
			.eq(AgreementList::getTenantId,tenantId)
		);
		if (ObjectUtil.isNotEmpty(agreementList)) {
			SicpayStatusEnum statusEnum = SicpayStatusEnum.getStatusEnum(agreementList.getStatus());
			if (statusEnum == SicpayStatusEnum.INVALID) {
				throw new BusinessException(ResultCodeEnum.AGREEMENT_DISABLE);
			}
			// 修改协议详情状态
			agreementDetailService.updateStatus(agreementListId);
			// 根据查询清单与详情的关系表
			List<AgreementRelationDetail> agreementRelationDetails = agreementRelationDetailService.getAgreementRelationDetailsByAgreementListId(agreementList.getId());
			log.info("AgreementListServiceImpl-agreementNameDetail-根据清单id【{}】查询关系表【{}】",agreementList.getId(),agreementRelationDetails);
			if (CollectionUtil.isNotEmpty(agreementRelationDetails)) {
				// 根据id的集合查询详情表中的数据
				List<Long> detailIds = agreementRelationDetails.stream()
						.map(AgreementRelationDetail::getAgreementDetailId)
						.collect(Collectors.toList());
				// 获取状态为生效,且已到生效时间 id倒序
				List<AgreementDetail> effectValidAgreementDetailByDetailIds = agreementDetailService.getEffectValidAgreementDetailByDetailIds(detailIds);
				if (CollectionUtil.isNotEmpty(effectValidAgreementDetailByDetailIds)) {
					return effectValidAgreementDetailByDetailIds.get(0).getContent();
				}
			}
		}
		return null;
	}
}

10、IAgreementDetailService接口

package com.sicpay.system.service;

import com.sicpay.system.dto.AgreementDetailSaveDTO;
import com.sicpay.system.dto.AgreementDetailUpdateDTO;
import com.sicpay.system.entity.AgreementDetail;
import com.sicpay.system.vo.AgreementDetailVO;
import org.springblade.core.mp.base.BaseService;
import com.baomidou.mybatisplus.core.metadata.IPage;

import java.util.List;

/**
 * 系统协议详情 服务类
 *
 */
public interface IAgreementDetailService extends BaseService<AgreementDetail> {

	/**
	 * 保存到协议详情表
	 * @param agreementDetailSaveDTO 协议数据
	 * @return
	 */
	Long save(AgreementDetailSaveDTO agreementDetailSaveDTO);

	/**
	 * 修改协议详情
	 * @param agreementDetailUpdateDTO 修改协议详情
	 * @return
	 */
	Boolean update (AgreementDetailUpdateDTO agreementDetailUpdateDTO);

	/**
	 * 更新协议详情中的状态
	 * @param agreementListId 协议清单id
	 * @return
	 */
	Boolean updateStatus(Long agreementListId);

	/**
	 * 获取状态为生效,但尚未到生效时间的协议详情 id倒序
	 * @param detailIds 详情id集合
	 * @return 协议详情集合
	 */
	List<AgreementDetail> getValidAgreementDetailByDetailIds(List<Long> detailIds);

	/**
	 * 获取状态为生效,且已到生效时间 id倒序
	 * @param detailIds 详情id集合
	 * @return 协议详情集合
	 */
	List<AgreementDetail> getEffectValidAgreementDetailByDetailIds(List<Long> detailIds);

}

11、AgreementDetailServiceImpl实现

package com.sicpay.system.service.impl;

import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.sicpay.api.constant.SicpayStatusEnum;
import com.sicpay.system.dto.AgreementDetailSaveDTO;
import com.sicpay.system.dto.AgreementDetailUpdateDTO;
import com.sicpay.system.entity.AgreementDetail;
import com.sicpay.system.entity.AgreementRelationDetail;
import com.sicpay.system.mapper.AgreementDetailMapper;
import com.sicpay.system.service.IAgreementDetailService;
import com.sicpay.system.service.IAgreementRelationDetailService;
import lombok.RequiredArgsConstructor;
import org.springblade.common.constant.SwitchConstant;
import org.springblade.common.exception.ResultCodeEnum;
import org.springblade.core.log.exception.BusinessException;
import org.springblade.core.mp.base.BaseServiceImpl;
import org.springblade.core.tool.utils.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.*;
import java.util.stream.Collectors;

/**
 * 系统协议详情 服务实现类
 *
 * @author liuhaijin
 * @since 2022-06-09
 */
@Service
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
public class AgreementDetailServiceImpl extends BaseServiceImpl<AgreementDetailMapper, AgreementDetail> implements IAgreementDetailService {


	private final IAgreementRelationDetailService agreementRelationDetailService;

	@Override
	@Transactional(rollbackFor = Exception.class)
	public Long save(AgreementDetailSaveDTO agreementDetailSaveDTO) {
		checkAgreementDetailRepeat(agreementDetailSaveDTO.getAgreementVersionNumber(),null,agreementDetailSaveDTO.getAgreementListId());
		AgreementDetail agreementDetail = Objects.requireNonNull(BeanUtil.copy(agreementDetailSaveDTO, AgreementDetail.class));
		// 是否立即生效
		Integer effectiveImmediately = agreementDetailSaveDTO.getEffectiveImmediately();
		if (SwitchConstant.ON.equals(effectiveImmediately)) {
			agreementDetail.setEffectTime(DateUtil.now());
		} else {
			Date effectTime = agreementDetailSaveDTO.getEffectTime();
			checkEffectDate(effectTime);
		}
		boolean save = this.save(agreementDetail);
		if (save) {
			return agreementDetail.getId();
		}
		return null;
	}

	@Override
	@Transactional(rollbackFor = Exception.class)
	public Boolean update(AgreementDetailUpdateDTO agreementDetailUpdateDTO) {
		checkAgreementDetailRepeat(agreementDetailUpdateDTO.getAgreementVersionNumber(),agreementDetailUpdateDTO.getAgreementDetailId(),agreementDetailUpdateDTO.getId());
		AgreementDetail agreementDetail = Objects.requireNonNull(BeanUtil.copy(agreementDetailUpdateDTO, AgreementDetail.class));
		agreementDetail.setId(agreementDetailUpdateDTO.getAgreementDetailId());
		// 是否立即生效
		Integer effectiveImmediately = agreementDetailUpdateDTO.getEffectiveImmediately();
		if (SwitchConstant.ON.equals(effectiveImmediately)) {
			agreementDetail.setEffectTime(DateUtil.now());
		} else {
			Date effectTime = agreementDetailUpdateDTO.getEffectTime();
			checkEffectDate(effectTime);
		}
		return this.updateById(agreementDetail);
	}

	@Override
	@Transactional(rollbackFor = Exception.class)
	public Boolean updateStatus(Long agreementListId) {
		// 根据清单id查询关系表
		List<AgreementRelationDetail> agreementRelationDetails = agreementRelationDetailService.getAgreementRelationDetailsByAgreementListId(agreementListId);
		if (CollectionUtil.isNotEmpty(agreementRelationDetails)) {
			// 刷选出关系表中的协议详情id
			List<Long> detailIds = agreementRelationDetails.stream()
					.map(AgreementRelationDetail::getAgreementDetailId)
					.collect(Collectors.toList());
			// 将刷选出的元素设置为已失效
			if (CollectionUtil.isNotEmpty(detailIds)) {
				// 刷选出关系表数据中已经生效的协议
				List<AgreementDetail> agreementDetails = this.list(Wrappers.<AgreementDetail>lambdaQuery()
						.in(AgreementDetail::getId, detailIds)
						// 已生效
						.le(AgreementDetail::getEffectTime, DateUtil.now())
				);
				// 将协议详情表中的详情id进行倒序,并跳过第一个元素(第一个元素为当前正在使用的版本)
				List<Long> agreementDetailIds = agreementDetails.stream()
						.sorted(Comparator.comparing(AgreementDetail::getId).reversed())
						.map(AgreementDetail::getId)
						.skip(1)
						.collect(Collectors.toList());
				// 将除第一个元素外的其他的所有元素设置为已失效
				if (CollectionUtil.isNotEmpty(agreementDetailIds)) {
					this.update(Wrappers.<AgreementDetail>lambdaUpdate()
							.set(AgreementDetail::getStatus,SicpayStatusEnum.INVALID.getCode())
							.in(AgreementDetail::getId,agreementDetailIds)
					);
				}
			}
		}
		return true;
	}

	@Override
	public List<AgreementDetail> getValidAgreementDetailByDetailIds(List<Long> detailIds) {
		return this.list(Wrappers.<AgreementDetail>lambdaQuery()
				.in(AgreementDetail::getId, detailIds)
				// 生效时间大于当前时间,即尚未生效
				.ge(AgreementDetail::getEffectTime, DateUtil.now())
				// 状态为已生效
				.eq(AgreementDetail::getStatus, SicpayStatusEnum.VALID.getCode())
				// 通过id进行倒序
				.orderByDesc(AgreementDetail::getId)
		);
	}

	@Override
	public List<AgreementDetail> getEffectValidAgreementDetailByDetailIds(List<Long> detailIds) {
		return this.list(Wrappers.<AgreementDetail>lambdaQuery()
				.in(AgreementDetail::getId, detailIds)
				// 生效时间小于当前时间,即已生效
				.le(AgreementDetail::getEffectTime, DateUtil.now())
				// 状态为已生效
				.eq(AgreementDetail::getStatus, SicpayStatusEnum.VALID.getCode())
				// 通过id进行倒序
				.orderByDesc(AgreementDetail::getId)
		);
	}

	/**
	 * 校验是否存在相同的协议版本号
	 * @param agreementVersionNumber 协议版本号
	 * @param agreementDetailId 协议详情id
	 * @param agreementListId 协议清单id
	 */
	private void checkAgreementDetailRepeat(String agreementVersionNumber,Long agreementDetailId,Long agreementListId) {
		boolean isSave = ObjectUtil.isEmpty(agreementDetailId);
		if (isSave) {
			exitAgreementDetailRepeatVersion(agreementVersionNumber,agreementListId);
		} else {
			AgreementDetail agreementDetail = this.getById(agreementDetailId);
			if (ObjectUtil.isEmpty(agreementDetail)) {
				throw new BusinessException(ResultCodeEnum.AGREEMENT_EXIT);
			}
			// 过滤自己 进行校验
			if(!agreementDetail.getAgreementVersionNumber().equals(agreementVersionNumber)) {
				exitAgreementDetailRepeatVersion(agreementVersionNumber,agreementListId);
			}
		}
	}

	/**
	 * 校验是否存在相同的协议版本号
	 * @param agreementVersionNumber 协议版本号
	 * @param agreementListId 协议清单id
	 */
	private void exitAgreementDetailRepeatVersion(String agreementVersionNumber,Long agreementListId) {
		List<AgreementRelationDetail> list = agreementRelationDetailService.list(Wrappers.<AgreementRelationDetail>lambdaQuery()
				.eq(AgreementRelationDetail::getAgreementListId, agreementListId)
		);
		if (CollectionUtil.isNotEmpty(list)) {
			List<Long> agreementDetailIds = list.stream().map(AgreementRelationDetail::getAgreementDetailId).collect(Collectors.toList());
			int count = this.count(Wrappers.<AgreementDetail>lambdaQuery()
					.eq(AgreementDetail::getAgreementVersionNumber, agreementVersionNumber)
					.in(AgreementDetail::getId,agreementDetailIds)
			);
			if (count > 0) {
				throw new BusinessException(ResultCodeEnum.AGREEMENT_VERSION_REPEAT);
			}
		}
	}


	/**
	 * 校验起始时间是否小于当前时间,起始时间是否大于终止时间
	 * @param effectTime 生效时间
	 */
	public static void checkEffectDate(Date effectTime){
		if (effectTime == null) {
			throw new BusinessException(ResultCodeEnum.EFFECT_TIME_BLANK);
		}
		// 获取当前的时间
		Date today = DateUtil.now();
		// compareTo()方法的返回值,第一个时间小于第二个时间返回-1,第一个时间大于第二个时间返回返回1,相等返回0
		int compare = today.compareTo(effectTime);
		// 生效时间小于当前时间,抛出异常
		if (compare > 0) {
			throw new BusinessException(ResultCodeEnum.EFFECT_TIME_ERROR);
		}
	}

}

 

你好:我的2025