diff --git a/src/main/java/cn/lihongjie/coal/thirdAccount/controller/ThirdAccountController.java b/src/main/java/cn/lihongjie/coal/thirdAccount/controller/ThirdAccountController.java new file mode 100644 index 00000000..84400061 --- /dev/null +++ b/src/main/java/cn/lihongjie/coal/thirdAccount/controller/ThirdAccountController.java @@ -0,0 +1,54 @@ +package cn.lihongjie.coal.thirdAccount.controller; + +import cn.lihongjie.coal.annotation.OrgScope; +import cn.lihongjie.coal.annotation.SysLog; +import cn.lihongjie.coal.base.dto.CommonQuery; +import cn.lihongjie.coal.base.dto.IdRequest; +import cn.lihongjie.coal.thirdAccount.dto.CreateThirdAccountDto; +import cn.lihongjie.coal.thirdAccount.dto.ThirdAccountDto; +import cn.lihongjie.coal.thirdAccount.dto.UpdateThirdAccountDto; +import cn.lihongjie.coal.thirdAccount.service.ThirdAccountService; + +import lombok.extern.slf4j.Slf4j; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Page; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/thirdAccount") +@SysLog(module = "第三方账号管理") +@Slf4j +@OrgScope +public class ThirdAccountController { + @Autowired private ThirdAccountService service; + + @PostMapping("/create") + public ThirdAccountDto create(@RequestBody CreateThirdAccountDto request) { + return this.service.create(request); + } + + @PostMapping("/update") + public ThirdAccountDto update(@RequestBody UpdateThirdAccountDto request) { + return this.service.update(request); + } + + @PostMapping("/delete") + public Object delete(@RequestBody IdRequest request) { + this.service.delete(request); + return true; + } + + @PostMapping("/getById") + public ThirdAccountDto getById(@RequestBody IdRequest request) { + return this.service.getById(request.getId()); + } + + @PostMapping("/list") + public Page list(@RequestBody CommonQuery request) { + return this.service.list(request); + } +} diff --git a/src/main/java/cn/lihongjie/coal/thirdAccount/dto/CreateThirdAccountDto.java b/src/main/java/cn/lihongjie/coal/thirdAccount/dto/CreateThirdAccountDto.java new file mode 100644 index 00000000..a88e796a --- /dev/null +++ b/src/main/java/cn/lihongjie/coal/thirdAccount/dto/CreateThirdAccountDto.java @@ -0,0 +1,53 @@ +package cn.lihongjie.coal.thirdAccount.dto; + +import cn.lihongjie.coal.base.dto.OrgCommonDto; + +import lombok.Data; + +import org.hibernate.annotations.Comment; +import org.hibernate.annotations.Formula; + +import java.time.LocalDateTime; + +@Data +public class CreateThirdAccountDto extends OrgCommonDto { + + @Comment("账号类型") + private String accountType; + + @Formula( + "(select i.name\n" + + "from t_dictionary d,\n" + + " t_dictionary_item i\n" + + "where d.id = i.dictionary_id\n" + + " and d.code = 'thirdAccount.type'\n" + + " and i.code = account_type)") + private String accountTypeName; + + @Comment("用户名") + private String username; + + @Comment("密码") + private String password; + + @Comment("token") + private String token; + + @Comment("token过期时间(分钟)") + private Long tokenExpireMinute; + + @Comment("token过期时间") + private LocalDateTime tokenExpireTime; + + @Comment("token下次刷新时间") + private LocalDateTime tokenNextRefreshTime; + + @Comment("token刷新时间") + private LocalDateTime tokenRefreshTime; + + @Comment("token刷新次数") + private Integer tokenRefreshCount; + + @Comment("token刷新错误信息") + private String tokenRefreshError; +} diff --git a/src/main/java/cn/lihongjie/coal/thirdAccount/dto/ThirdAccountDto.java b/src/main/java/cn/lihongjie/coal/thirdAccount/dto/ThirdAccountDto.java new file mode 100644 index 00000000..a971d9f1 --- /dev/null +++ b/src/main/java/cn/lihongjie/coal/thirdAccount/dto/ThirdAccountDto.java @@ -0,0 +1,52 @@ +package cn.lihongjie.coal.thirdAccount.dto; + +import cn.lihongjie.coal.base.dto.OrgCommonDto; + +import lombok.Data; + +import org.hibernate.annotations.Comment; +import org.hibernate.annotations.Formula; + +import java.time.LocalDateTime; + +@Data +public class ThirdAccountDto extends OrgCommonDto { + @Comment("账号类型") + private String accountType; + + @Formula( + "(select i.name\n" + + "from t_dictionary d,\n" + + " t_dictionary_item i\n" + + "where d.id = i.dictionary_id\n" + + " and d.code = 'thirdAccount.type'\n" + + " and i.code = account_type)") + private String accountTypeName; + + @Comment("用户名") + private String username; + + @Comment("密码") + private String password; + + @Comment("token") + private String token; + + @Comment("token过期时间(分钟)") + private Long tokenExpireMinute; + + @Comment("token过期时间") + private LocalDateTime tokenExpireTime; + + @Comment("token下次刷新时间") + private LocalDateTime tokenNextRefreshTime; + + @Comment("token刷新时间") + private LocalDateTime tokenRefreshTime; + + @Comment("token刷新次数") + private Integer tokenRefreshCount; + + @Comment("token刷新错误信息") + private String tokenRefreshError; +} diff --git a/src/main/java/cn/lihongjie/coal/thirdAccount/dto/UpdateThirdAccountDto.java b/src/main/java/cn/lihongjie/coal/thirdAccount/dto/UpdateThirdAccountDto.java new file mode 100644 index 00000000..7a845d1e --- /dev/null +++ b/src/main/java/cn/lihongjie/coal/thirdAccount/dto/UpdateThirdAccountDto.java @@ -0,0 +1,52 @@ +package cn.lihongjie.coal.thirdAccount.dto; + +import cn.lihongjie.coal.base.dto.OrgCommonDto; + +import lombok.Data; + +import org.hibernate.annotations.Comment; +import org.hibernate.annotations.Formula; + +import java.time.LocalDateTime; + +@Data +public class UpdateThirdAccountDto extends OrgCommonDto { + @Comment("账号类型") + private String accountType; + + @Formula( + "(select i.name\n" + + "from t_dictionary d,\n" + + " t_dictionary_item i\n" + + "where d.id = i.dictionary_id\n" + + " and d.code = 'thirdAccount.type'\n" + + " and i.code = account_type)") + private String accountTypeName; + + @Comment("用户名") + private String username; + + @Comment("密码") + private String password; + + @Comment("token") + private String token; + + @Comment("token过期时间(分钟)") + private Long tokenExpireMinute; + + @Comment("token过期时间") + private LocalDateTime tokenExpireTime; + + @Comment("token下次刷新时间") + private LocalDateTime tokenNextRefreshTime; + + @Comment("token刷新时间") + private LocalDateTime tokenRefreshTime; + + @Comment("token刷新次数") + private Integer tokenRefreshCount; + + @Comment("token刷新错误信息") + private String tokenRefreshError; +} diff --git a/src/main/java/cn/lihongjie/coal/thirdAccount/entity/ThirdAccountEntity.java b/src/main/java/cn/lihongjie/coal/thirdAccount/entity/ThirdAccountEntity.java new file mode 100644 index 00000000..f20560a0 --- /dev/null +++ b/src/main/java/cn/lihongjie/coal/thirdAccount/entity/ThirdAccountEntity.java @@ -0,0 +1,56 @@ +package cn.lihongjie.coal.thirdAccount.entity; + +import cn.lihongjie.coal.base.entity.OrgCommonEntity; + +import jakarta.persistence.Entity; + +import lombok.Data; + +import org.hibernate.annotations.Comment; +import org.hibernate.annotations.Formula; + +import java.time.LocalDateTime; + +@Data +@Entity +public class ThirdAccountEntity extends OrgCommonEntity { + + @Comment("账号类型") + private String accountType; + + @Formula( + "(select i.name\n" + + "from t_dictionary d,\n" + + " t_dictionary_item i\n" + + "where d.id = i.dictionary_id\n" + + " and d.code = 'thirdAccount.type'\n" + + " and i.code = account_type)") + private String accountTypeName; + + @Comment("用户名") + private String username; + + @Comment("密码") + private String password; + + @Comment("token") + private String token; + + @Comment("token过期时间(分钟)") + private Long tokenExpireMinute; + + @Comment("token过期时间") + private LocalDateTime tokenExpireTime; + + @Comment("token下次刷新时间") + private LocalDateTime tokenNextRefreshTime; + + @Comment("token刷新时间") + private LocalDateTime tokenRefreshTime; + + @Comment("token刷新次数") + private Integer tokenRefreshCount; + + @Comment("token刷新错误信息") + private String tokenRefreshError; +} diff --git a/src/main/java/cn/lihongjie/coal/thirdAccount/mapper/ThirdAccountMapper.java b/src/main/java/cn/lihongjie/coal/thirdAccount/mapper/ThirdAccountMapper.java new file mode 100644 index 00000000..aa4a0f1f --- /dev/null +++ b/src/main/java/cn/lihongjie/coal/thirdAccount/mapper/ThirdAccountMapper.java @@ -0,0 +1,23 @@ +package cn.lihongjie.coal.thirdAccount.mapper; + +import cn.lihongjie.coal.base.mapper.BaseMapper; +import cn.lihongjie.coal.base.mapper.CommonEntityMapper; +import cn.lihongjie.coal.base.mapper.CommonMapper; +import cn.lihongjie.coal.thirdAccount.dto.CreateThirdAccountDto; +import cn.lihongjie.coal.thirdAccount.dto.ThirdAccountDto; +import cn.lihongjie.coal.thirdAccount.dto.UpdateThirdAccountDto; +import cn.lihongjie.coal.thirdAccount.entity.ThirdAccountEntity; + +import org.mapstruct.Mapper; +import org.mapstruct.control.DeepClone; + +@Mapper( + componentModel = org.mapstruct.MappingConstants.ComponentModel.SPRING, + uses = {CommonMapper.class, CommonEntityMapper.class}, + mappingControl = DeepClone.class) +public interface ThirdAccountMapper + extends BaseMapper< + ThirdAccountEntity, + ThirdAccountDto, + CreateThirdAccountDto, + UpdateThirdAccountDto> {} diff --git a/src/main/java/cn/lihongjie/coal/thirdAccount/repository/ThirdAccountRepository.java b/src/main/java/cn/lihongjie/coal/thirdAccount/repository/ThirdAccountRepository.java new file mode 100644 index 00000000..4f0de7e8 --- /dev/null +++ b/src/main/java/cn/lihongjie/coal/thirdAccount/repository/ThirdAccountRepository.java @@ -0,0 +1,9 @@ +package cn.lihongjie.coal.thirdAccount.repository; + +import cn.lihongjie.coal.base.dao.BaseRepository; +import cn.lihongjie.coal.thirdAccount.entity.ThirdAccountEntity; + +import org.springframework.stereotype.Repository; + +@Repository +public interface ThirdAccountRepository extends BaseRepository {} diff --git a/src/main/java/cn/lihongjie/coal/thirdAccount/service/ThirdAccountService.java b/src/main/java/cn/lihongjie/coal/thirdAccount/service/ThirdAccountService.java new file mode 100644 index 00000000..f28c2dbb --- /dev/null +++ b/src/main/java/cn/lihongjie/coal/thirdAccount/service/ThirdAccountService.java @@ -0,0 +1,145 @@ +package cn.lihongjie.coal.thirdAccount.service; + +import cn.lihongjie.coal.base.dto.CommonQuery; +import cn.lihongjie.coal.base.dto.IdRequest; +import cn.lihongjie.coal.base.service.BaseService; +import cn.lihongjie.coal.dbFunctions.DbFunctionService; +import cn.lihongjie.coal.organization.entity.OrganizationEntity; +import cn.lihongjie.coal.organization.service.OrganizationService; +import cn.lihongjie.coal.thirdAccount.dto.CreateThirdAccountDto; +import cn.lihongjie.coal.thirdAccount.dto.ThirdAccountDto; +import cn.lihongjie.coal.thirdAccount.dto.UpdateThirdAccountDto; +import cn.lihongjie.coal.thirdAccount.entity.ThirdAccountEntity; +import cn.lihongjie.coal.thirdAccount.mapper.ThirdAccountMapper; +import cn.lihongjie.coal.thirdAccount.repository.ThirdAccountRepository; + +import lombok.extern.slf4j.Slf4j; + +import org.apache.commons.lang3.ObjectUtils; +import org.apache.commons.lang3.exception.ExceptionUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.core.convert.ConversionService; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Sort; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; + +@Service +@Slf4j +@Transactional +public class ThirdAccountService extends BaseService { + @Autowired OrganizationService organizationService; + @Autowired private ThirdAccountRepository repository; + @Autowired private ThirdAccountMapper mapper; + @Autowired private ConversionService conversionService; + @Autowired private DbFunctionService dbFunctionService; + + public ThirdAccountDto create(CreateThirdAccountDto request) { + ThirdAccountEntity entity = mapper.toEntity(request); + + this.repository.save(entity); + return getById(entity.getId()); + } + + public ThirdAccountDto update(UpdateThirdAccountDto request) { + ThirdAccountEntity entity = this.repository.get(request.getId()); + this.mapper.updateEntity(entity, request); + + this.repository.save(entity); + + return getById(entity.getId()); + } + + public void delete(IdRequest request) { + this.repository.deleteAllById(request.getIds()); + } + + public ThirdAccountDto getById(String id) { + ThirdAccountEntity entity = repository.get(id); + + return mapper.toDto(entity); + } + + public Page list(CommonQuery query) { + Page page = + repository.findAll( + query.specification(conversionService), + PageRequest.of( + query.getPageNo(), + query.getPageSize(), + Sort.by(query.getOrders()))); + + return page.map(this.mapper::toDto); + } + + public void refresh() { + + List all = organizationService.findAll(); + + all.forEach(this::refresh); + } + + private void refresh(OrganizationEntity organizationEntity) { + + this.repository.findByOrganizationId(organizationEntity.getId()).forEach(this::refresh); + } + + private void refresh(ThirdAccountEntity thirdAccountEntity) { + + if (thirdAccountEntity.getTokenNextRefreshTime() == null + || thirdAccountEntity + .getTokenNextRefreshTime() + .isBefore(java.time.LocalDateTime.now())) { + log.info("refresh token for {}", thirdAccountEntity.getId()); + + try { + + thirdAccountEntity.setToken(genToken(thirdAccountEntity)); + thirdAccountEntity.setTokenRefreshTime(java.time.LocalDateTime.now()); + thirdAccountEntity.setTokenRefreshError(null); + + thirdAccountEntity.setTokenRefreshCount( + ObjectUtils.defaultIfNull(thirdAccountEntity.getTokenRefreshCount(), 0) + + 1); + thirdAccountEntity.setTokenNextRefreshTime( + java.time.LocalDateTime.now() + .plusMinutes( + (long) (thirdAccountEntity.getTokenExpireMinute() * 0.8))); + + thirdAccountEntity.setTokenExpireTime( + java.time.LocalDateTime.now() + .plusMinutes(thirdAccountEntity.getTokenExpireMinute())); + } catch (Exception e) { + + log.warn("refresh token error", e); + thirdAccountEntity.setTokenRefreshTime(java.time.LocalDateTime.now()); + thirdAccountEntity.setTokenRefreshError(ExceptionUtils.getStackTrace(e)); + } + + this.repository.save(thirdAccountEntity); + } + } + + private String genToken(ThirdAccountEntity thirdAccountEntity) { + + switch (thirdAccountEntity.getAccountType()) { + case "1": + return ""; + case "2": + return ""; + case "3": + return ""; + case "4": + return ""; + + case "5": + return ""; + default: + throw new IllegalArgumentException( + "unknown account type " + thirdAccountEntity.getAccountType()); + } + } +} diff --git a/src/main/resources/scripts/dict/enum/thirdAccountDict.groovy b/src/main/resources/scripts/dict/enum/thirdAccountDict.groovy new file mode 100644 index 00000000..157dbe81 --- /dev/null +++ b/src/main/resources/scripts/dict/enum/thirdAccountDict.groovy @@ -0,0 +1,17 @@ + +package scripts.dict + +import cn.lihongjie.coal.base.dto.CommonQuery +import cn.lihongjie.coal.thirdAccount.controller.ThirdAccountController +import org.springframework.context.ApplicationContext + +ApplicationContext ioc = ioc + +def controller = ioc.getBean(ThirdAccountController.class) + + + + +return controller.list(new CommonQuery()) + +