refactor: migrate ID types from Long to String across modules

- Update BaseEntity to use String IDs (snowflake algorithm format)
- Migrate context holders (UserContextHolder, TenantContextHolder) to String
- Update MyBatis-Plus configs: LongValue -> StringValue for tenant ID
- Fix type conversions in 6 modules: common, sys, cust, proj, req, exp (partial)

Changes by module:
- fund-common: Context holders, interceptors, test fixes
- fund-sys: Test files updated for String IDs
- fund-cust: Service, DTO, VO, Controller, Config updates
- fund-proj: Complete service layer and controller migration
- fund-req: Complete service layer and controller migration
- fund-exp: ExpenseType service layer complete (FundExpense in progress)

Note: JavaScript precision issue resolved by using String for large IDs
This commit is contained in:
zhangjf 2026-03-02 19:33:01 +08:00
parent fffeaa48a5
commit 9a55286869
40 changed files with 398 additions and 325 deletions

View File

@ -11,7 +11,19 @@
<localRepository>${user.dir}/.mvn/repository</localRepository> <localRepository>${user.dir}/.mvn/repository</localRepository>
<mirrors> <mirrors>
<!-- 不配置任何私服镜像,避免外部镜像强制接管 central --> <!-- 使用阿里云公共代理 -->
<mirror>
<id>aliyun-central</id>
<mirrorOf>central</mirrorOf>
<name>Aliyun Central</name>
<url>https://maven.aliyun.com/repository/central</url>
</mirror>
<mirror>
<id>aliyun-public</id>
<mirrorOf>*</mirrorOf>
<name>Aliyun Public</name>
<url>https://maven.aliyun.com/repository/public</url>
</mirror>
</mirrors> </mirrors>
<servers> <servers>

View File

@ -66,6 +66,6 @@ INSERT INTO customer (id, tenant_id, customer_code, customer_name, contact, phon
VALUES ('1', '1', 'CUST001', '测试客户A', '张三', '13800138001', 1, '1', NOW()) VALUES ('1', '1', 'CUST001', '测试客户A', '张三', '13800138001', 1, '1', NOW())
ON DUPLICATE KEY UPDATE customer_code=customer_code; ON DUPLICATE KEY UPDATE customer_code=customer_code;
INSERT INTO customer_contact (tenant_id, customer_id, contact_name, phone, position, is_primary, status, created_by, created_time) INSERT INTO customer_contact (id, tenant_id, customer_id, contact_name, phone, position, is_primary, created_by, created_time)
VALUES ('1', '1', '张三', '13800138001', '总经理', 1, 1, '1', NOW()) VALUES ('1', '1', '1', '张三', '13800138001', '总经理', 1, '1', NOW())
ON DUPLICATE KEY UPDATE contact_name=contact_name; ON DUPLICATE KEY UPDATE contact_name=contact_name;

View File

@ -8,16 +8,16 @@ package com.fundplatform.common.context;
*/ */
public final class TenantContextHolder { public final class TenantContextHolder {
private static final ThreadLocal<Long> TENANT_ID_HOLDER = new ThreadLocal<>(); private static final ThreadLocal<String> TENANT_ID_HOLDER = new ThreadLocal<>();
private TenantContextHolder() { private TenantContextHolder() {
} }
public static void setTenantId(Long tenantId) { public static void setTenantId(String tenantId) {
TENANT_ID_HOLDER.set(tenantId); TENANT_ID_HOLDER.set(tenantId);
} }
public static Long getTenantId() { public static String getTenantId() {
return TENANT_ID_HOLDER.get(); return TENANT_ID_HOLDER.get();
} }

View File

@ -46,15 +46,15 @@ public class FeignChainInterceptor implements RequestInterceptor {
template.header(HEADER_REQUEST_TIME, String.valueOf(System.currentTimeMillis())); template.header(HEADER_REQUEST_TIME, String.valueOf(System.currentTimeMillis()));
// 3. 多租户透传 // 3. 多租户透传
Long tenantId = TenantContextHolder.getTenantId(); String tenantId = TenantContextHolder.getTenantId();
if (tenantId != null) { if (tenantId != null) {
template.header(HEADER_TENANT_ID, String.valueOf(tenantId)); template.header(HEADER_TENANT_ID, tenantId);
} }
// 4. 用户信息透传 // 4. 用户信息透传
Long uid = UserContextHolder.getUserId(); String uid = UserContextHolder.getUserId();
if (uid != null) { if (uid != null) {
template.header(HEADER_UID, String.valueOf(uid)); template.header(HEADER_UID, uid);
} }
String uname = UserContextHolder.getUserName(); String uname = UserContextHolder.getUserName();
if (uname != null && !uname.isEmpty()) { if (uname != null && !uname.isEmpty()) {

View File

@ -62,23 +62,13 @@ public class ContextInterceptor implements HandlerInterceptor {
// 提取租户ID // 提取租户ID
String tenantIdStr = request.getHeader(HEADER_TENANT_ID); String tenantIdStr = request.getHeader(HEADER_TENANT_ID);
if (tenantIdStr != null && !tenantIdStr.isEmpty()) { if (tenantIdStr != null && !tenantIdStr.isEmpty()) {
try { TenantContextHolder.setTenantId(tenantIdStr);
Long tenantId = Long.parseLong(tenantIdStr);
TenantContextHolder.setTenantId(tenantId);
} catch (NumberFormatException e) {
// 忽略无效的租户ID
}
} }
// 提取用户 ID // 提取用户 ID
String userIdStr = request.getHeader(HEADER_USER_ID); String userIdStr = request.getHeader(HEADER_USER_ID);
if (userIdStr != null && !userIdStr.isEmpty()) { if (userIdStr != null && !userIdStr.isEmpty()) {
try { UserContextHolder.setUserId(userIdStr);
Long userId = Long.parseLong(userIdStr);
UserContextHolder.setUserId(userId);
} catch (NumberFormatException e) {
// 忽略无效的用户 ID
}
} }
// 提取或生成 TraceId全链路唯一标识 // 提取或生成 TraceId全链路唯一标识

View File

@ -19,9 +19,9 @@ class TenantContextHolderTest {
@Test @Test
@DisplayName("设置租户ID后可以正确获取") @DisplayName("设置租户ID后可以正确获取")
void setAndGetTenantId() { void setAndGetTenantId() {
TenantContextHolder.setTenantId(100L); TenantContextHolder.setTenantId("100");
assertEquals(100L, TenantContextHolder.getTenantId()); assertEquals("100", TenantContextHolder.getTenantId());
} }
@Test @Test
@ -33,7 +33,7 @@ class TenantContextHolderTest {
@Test @Test
@DisplayName("clear 后 getTenantId 返回 null") @DisplayName("clear 后 getTenantId 返回 null")
void clear_removesValue() { void clear_removesValue() {
TenantContextHolder.setTenantId(200L); TenantContextHolder.setTenantId("200");
TenantContextHolder.clear(); TenantContextHolder.clear();
assertNull(TenantContextHolder.getTenantId()); assertNull(TenantContextHolder.getTenantId());
@ -42,17 +42,17 @@ class TenantContextHolderTest {
@Test @Test
@DisplayName("多次设置取最后一次的值") @DisplayName("多次设置取最后一次的值")
void setMultipleTimes_lastValueWins() { void setMultipleTimes_lastValueWins() {
TenantContextHolder.setTenantId(10L); TenantContextHolder.setTenantId("10");
TenantContextHolder.setTenantId(20L); TenantContextHolder.setTenantId("20");
TenantContextHolder.setTenantId(30L); TenantContextHolder.setTenantId("30");
assertEquals(30L, TenantContextHolder.getTenantId()); assertEquals("30", TenantContextHolder.getTenantId());
} }
@Test @Test
@DisplayName("设置 null 值后 getTenantId 返回 null") @DisplayName("设置 null 值后 getTenantId 返回 null")
void setNullTenantId() { void setNullTenantId() {
TenantContextHolder.setTenantId(100L); TenantContextHolder.setTenantId("100");
TenantContextHolder.setTenantId(null); TenantContextHolder.setTenantId(null);
assertNull(TenantContextHolder.getTenantId()); assertNull(TenantContextHolder.getTenantId());
@ -61,16 +61,16 @@ class TenantContextHolderTest {
@Test @Test
@DisplayName("线程隔离 - 子线程设置的值不影响主线程") @DisplayName("线程隔离 - 子线程设置的值不影响主线程")
void threadIsolation() throws InterruptedException { void threadIsolation() throws InterruptedException {
TenantContextHolder.setTenantId(1L); TenantContextHolder.setTenantId("1");
Thread subThread = new Thread(() -> { Thread subThread = new Thread(() -> {
TenantContextHolder.setTenantId(999L); TenantContextHolder.setTenantId("999");
assertEquals(999L, TenantContextHolder.getTenantId()); assertEquals("999", TenantContextHolder.getTenantId());
}); });
subThread.start(); subThread.start();
subThread.join(); subThread.join();
// 主线程的值不受子线程影响 // 主线程的值不受子线程影响
assertEquals(1L, TenantContextHolder.getTenantId()); assertEquals("1", TenantContextHolder.getTenantId());
} }
} }

View File

@ -19,9 +19,9 @@ class UserContextHolderTest {
@Test @Test
@DisplayName("设置用户ID后可以正确获取") @DisplayName("设置用户ID后可以正确获取")
void setAndGetUserId() { void setAndGetUserId() {
UserContextHolder.setUserId(1L); UserContextHolder.setUserId("1");
assertEquals(1L, UserContextHolder.getUserId()); assertEquals("1", UserContextHolder.getUserId());
} }
@Test @Test
@ -35,10 +35,10 @@ class UserContextHolderTest {
@Test @Test
@DisplayName("同时设置 userId 和 userName") @DisplayName("同时设置 userId 和 userName")
void setBoth_userId_and_userName() { void setBoth_userId_and_userName() {
UserContextHolder.setUserId(42L); UserContextHolder.setUserId("42");
UserContextHolder.setUserName("testuser"); UserContextHolder.setUserName("testuser");
assertEquals(42L, UserContextHolder.getUserId()); assertEquals("42", UserContextHolder.getUserId());
assertEquals("testuser", UserContextHolder.getUserName()); assertEquals("testuser", UserContextHolder.getUserName());
} }
@ -57,7 +57,7 @@ class UserContextHolderTest {
@Test @Test
@DisplayName("clear 后 userId 和 userName 均为 null") @DisplayName("clear 后 userId 和 userName 均为 null")
void clear_removesAllValues() { void clear_removesAllValues() {
UserContextHolder.setUserId(1L); UserContextHolder.setUserId("1");
UserContextHolder.setUserName("admin"); UserContextHolder.setUserName("admin");
UserContextHolder.clear(); UserContextHolder.clear();
@ -68,26 +68,26 @@ class UserContextHolderTest {
@Test @Test
@DisplayName("多次设置 userId 取最后一次的值") @DisplayName("多次设置 userId 取最后一次的值")
void setUserId_multiple_lastWins() { void setUserId_multiple_lastWins() {
UserContextHolder.setUserId(1L); UserContextHolder.setUserId("1");
UserContextHolder.setUserId(2L); UserContextHolder.setUserId("2");
UserContextHolder.setUserId(3L); UserContextHolder.setUserId("3");
assertEquals(3L, UserContextHolder.getUserId()); assertEquals("3", UserContextHolder.getUserId());
} }
@Test @Test
@DisplayName("线程隔离 - 子线程设置的 userId 不影响主线程") @DisplayName("线程隔离 - 子线程设置的 userId 不影响主线程")
void threadIsolation_userId() throws InterruptedException { void threadIsolation_userId() throws InterruptedException {
UserContextHolder.setUserId(1L); UserContextHolder.setUserId("1");
Thread subThread = new Thread(() -> { Thread subThread = new Thread(() -> {
UserContextHolder.setUserId(999L); UserContextHolder.setUserId("999");
assertEquals(999L, UserContextHolder.getUserId()); assertEquals("999", UserContextHolder.getUserId());
}); });
subThread.start(); subThread.start();
subThread.join(); subThread.join();
assertEquals(1L, UserContextHolder.getUserId()); assertEquals("1", UserContextHolder.getUserId());
} }
@Test @Test

View File

@ -7,7 +7,7 @@ import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerIntercept
import com.baomidou.mybatisplus.extension.plugins.inner.TenantLineInnerInterceptor; import com.baomidou.mybatisplus.extension.plugins.inner.TenantLineInnerInterceptor;
import com.fundplatform.common.context.TenantContextHolder; import com.fundplatform.common.context.TenantContextHolder;
import net.sf.jsqlparser.expression.Expression; import net.sf.jsqlparser.expression.Expression;
import net.sf.jsqlparser.expression.LongValue; import net.sf.jsqlparser.expression.StringValue;
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;
@ -26,11 +26,11 @@ public class MybatisPlusConfig {
tenantInterceptor.setTenantLineHandler(new com.baomidou.mybatisplus.extension.plugins.handler.TenantLineHandler() { tenantInterceptor.setTenantLineHandler(new com.baomidou.mybatisplus.extension.plugins.handler.TenantLineHandler() {
@Override @Override
public Expression getTenantId() { public Expression getTenantId() {
Long tenantId = TenantContextHolder.getTenantId(); String tenantId = TenantContextHolder.getTenantId();
if (tenantId == null) { if (tenantId == null) {
return new LongValue(1); return new StringValue("1");
} }
return new LongValue(tenantId); return new StringValue(tenantId);
} }
@Override @Override

View File

@ -30,8 +30,8 @@ public class ContactController {
*/ */
@Operation(summary = "创建联系人") @Operation(summary = "创建联系人")
@PostMapping @PostMapping
public Result<Long> create(@Valid @RequestBody ContactDTO dto) { public Result<String> create(@Valid @RequestBody ContactDTO dto) {
Long id = contactService.createContact(dto); String id = contactService.createContact(dto);
return Result.success(id); return Result.success(id);
} }
@ -40,7 +40,7 @@ public class ContactController {
*/ */
@Operation(summary = "更新联系人信息") @Operation(summary = "更新联系人信息")
@PutMapping("/{id}") @PutMapping("/{id}")
public Result<Boolean> update(@Parameter(description = "联系人ID") @PathVariable Long id, @Valid @RequestBody ContactDTO dto) { public Result<Boolean> update(@Parameter(description = "联系人ID") @PathVariable String id, @Valid @RequestBody ContactDTO dto) {
boolean result = contactService.updateContact(id, dto); boolean result = contactService.updateContact(id, dto);
return Result.success(result); return Result.success(result);
} }
@ -50,7 +50,7 @@ public class ContactController {
*/ */
@Operation(summary = "根据ID查询联系人") @Operation(summary = "根据ID查询联系人")
@GetMapping("/{id}") @GetMapping("/{id}")
public Result<ContactVO> getById(@Parameter(description = "联系人ID") @PathVariable Long id) { public Result<ContactVO> getById(@Parameter(description = "联系人ID") @PathVariable String id) {
ContactVO vo = contactService.getContactById(id); ContactVO vo = contactService.getContactById(id);
return Result.success(vo); return Result.success(vo);
} }
@ -63,7 +63,7 @@ public class ContactController {
public Result<Page<ContactVO>> page( public Result<Page<ContactVO>> page(
@Parameter(description = "页码") @RequestParam(defaultValue = "1") int pageNum, @Parameter(description = "页码") @RequestParam(defaultValue = "1") int pageNum,
@Parameter(description = "每页条数") @RequestParam(defaultValue = "10") int pageSize, @Parameter(description = "每页条数") @RequestParam(defaultValue = "10") int pageSize,
@Parameter(description = "客户ID") @RequestParam(required = false) Long customerId) { @Parameter(description = "客户ID") @RequestParam(required = false) String customerId) {
Page<ContactVO> page = contactService.pageContacts(pageNum, pageSize, customerId); Page<ContactVO> page = contactService.pageContacts(pageNum, pageSize, customerId);
return Result.success(page); return Result.success(page);
} }
@ -73,7 +73,7 @@ public class ContactController {
*/ */
@Operation(summary = "删除联系人") @Operation(summary = "删除联系人")
@DeleteMapping("/{id}") @DeleteMapping("/{id}")
public Result<Boolean> delete(@Parameter(description = "联系人ID") @PathVariable Long id) { public Result<Boolean> delete(@Parameter(description = "联系人ID") @PathVariable String id) {
boolean result = contactService.deleteContact(id); boolean result = contactService.deleteContact(id);
return Result.success(result); return Result.success(result);
} }
@ -84,8 +84,8 @@ public class ContactController {
@Operation(summary = "设置主要联系人", description = "将指定联系人设为客户的主要联系人") @Operation(summary = "设置主要联系人", description = "将指定联系人设为客户的主要联系人")
@PutMapping("/{customerId}/contact/{contactId}/primary") @PutMapping("/{customerId}/contact/{contactId}/primary")
public Result<Boolean> setPrimary( public Result<Boolean> setPrimary(
@Parameter(description = "客户ID") @PathVariable Long customerId, @Parameter(description = "客户ID") @PathVariable String customerId,
@Parameter(description = "联系人ID") @PathVariable Long contactId) { @Parameter(description = "联系人ID") @PathVariable String contactId) {
boolean result = contactService.setPrimaryContact(customerId, contactId); boolean result = contactService.setPrimaryContact(customerId, contactId);
return Result.success(result); return Result.success(result);
} }

View File

@ -32,8 +32,8 @@ public class CustomerController {
*/ */
@Operation(summary = "创建客户") @Operation(summary = "创建客户")
@PostMapping @PostMapping
public Result<Long> createCustomer(@Valid @RequestBody CustomerCreateDTO dto) { public Result<String> createCustomer(@Valid @RequestBody CustomerCreateDTO dto) {
Long id = customerService.createCustomer(dto); String id = customerService.createCustomer(dto);
return Result.success(id); return Result.success(id);
} }
@ -42,7 +42,7 @@ public class CustomerController {
*/ */
@Operation(summary = "更新客户信息") @Operation(summary = "更新客户信息")
@PutMapping("/{id}") @PutMapping("/{id}")
public Result<Void> updateCustomer(@Parameter(description = "客户ID") @PathVariable Long id, @Valid @RequestBody CustomerUpdateDTO dto) { public Result<Void> updateCustomer(@Parameter(description = "客户ID") @PathVariable String id, @Valid @RequestBody CustomerUpdateDTO dto) {
customerService.updateCustomer(id, dto); customerService.updateCustomer(id, dto);
return Result.success(); return Result.success();
} }
@ -52,7 +52,7 @@ public class CustomerController {
*/ */
@Operation(summary = "查询客户详情") @Operation(summary = "查询客户详情")
@GetMapping("/{id}") @GetMapping("/{id}")
public Result<CustomerVO> getCustomer(@Parameter(description = "客户ID") @PathVariable Long id) { public Result<CustomerVO> getCustomer(@Parameter(description = "客户ID") @PathVariable String id) {
CustomerVO vo = customerService.getCustomerById(id); CustomerVO vo = customerService.getCustomerById(id);
return Result.success(vo); return Result.success(vo);
} }
@ -82,7 +82,7 @@ public class CustomerController {
*/ */
@Operation(summary = "删除客户(逻辑删除)") @Operation(summary = "删除客户(逻辑删除)")
@DeleteMapping("/{id}") @DeleteMapping("/{id}")
public Result<Void> deleteCustomer(@Parameter(description = "客户ID") @PathVariable Long id) { public Result<Void> deleteCustomer(@Parameter(description = "客户ID") @PathVariable String id) {
customerService.deleteCustomer(id); customerService.deleteCustomer(id);
return Result.success(); return Result.success();
} }

View File

@ -8,13 +8,13 @@ import jakarta.validation.constraints.NotNull;
*/ */
public class ContactDTO { public class ContactDTO {
private Long id; private String id;
/** /**
* 客户ID * 客户ID
*/ */
@NotNull(message = "客户ID不能为空") @NotNull(message = "客户ID不能为空")
private Long customerId; private String customerId;
/** /**
* 联系人姓名 * 联系人姓名
@ -52,19 +52,19 @@ public class ContactDTO {
*/ */
private String remark; private String remark;
public Long getId() { public String getId() {
return id; return id;
} }
public void setId(Long id) { public void setId(String id) {
this.id = id; this.id = id;
} }
public Long getCustomerId() { public String getCustomerId() {
return customerId; return customerId;
} }
public void setCustomerId(Long customerId) { public void setCustomerId(String customerId) {
this.customerId = customerId; this.customerId = customerId;
} }

View File

@ -12,30 +12,30 @@ public interface ContactService {
/** /**
* 创建联系人 * 创建联系人
*/ */
Long createContact(ContactDTO dto); String createContact(ContactDTO dto);
/** /**
* 更新联系人 * 更新联系人
*/ */
boolean updateContact(Long id, ContactDTO dto); boolean updateContact(String id, ContactDTO dto);
/** /**
* 根据ID查询联系人 * 根据ID查询联系人
*/ */
ContactVO getContactById(Long id); ContactVO getContactById(String id);
/** /**
* 分页查询联系人 * 分页查询联系人
*/ */
Page<ContactVO> pageContacts(int pageNum, int pageSize, Long customerId); Page<ContactVO> pageContacts(int pageNum, int pageSize, String customerId);
/** /**
* 删除联系人 * 删除联系人
*/ */
boolean deleteContact(Long id); boolean deleteContact(String id);
/** /**
* 设置主要联系人 * 设置主要联系人
*/ */
boolean setPrimaryContact(Long customerId, Long contactId); boolean setPrimaryContact(String customerId, String contactId);
} }

View File

@ -13,17 +13,17 @@ public interface CustomerService {
/** /**
* 创建客户 * 创建客户
*/ */
Long createCustomer(CustomerCreateDTO dto); String createCustomer(CustomerCreateDTO dto);
/** /**
* 更新客户 * 更新客户
*/ */
void updateCustomer(Long id, CustomerUpdateDTO dto); void updateCustomer(String id, CustomerUpdateDTO dto);
/** /**
* 查询客户详情 * 查询客户详情
*/ */
CustomerVO getCustomerById(Long id); CustomerVO getCustomerById(String id);
/** /**
* 分页查询客户 * 分页查询客户
@ -33,5 +33,5 @@ public interface CustomerService {
/** /**
* 删除客户 * 删除客户
*/ */
void deleteCustomer(Long id); void deleteCustomer(String id);
} }

View File

@ -32,7 +32,7 @@ public class ContactServiceImpl implements ContactService {
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public Long createContact(ContactDTO dto) { public String createContact(ContactDTO dto) {
CustomerContact contact = new CustomerContact(); CustomerContact contact = new CustomerContact();
contact.setCustomerId(dto.getCustomerId()); contact.setCustomerId(dto.getCustomerId());
contact.setContactName(dto.getContactName()); contact.setContactName(dto.getContactName());
@ -52,7 +52,7 @@ public class ContactServiceImpl implements ContactService {
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public boolean updateContact(Long id, ContactDTO dto) { public boolean updateContact(String id, ContactDTO dto) {
CustomerContact contact = contactDataService.getById(id); CustomerContact contact = contactDataService.getById(id);
if (contact == null || contact.getDeleted() == 1) { if (contact == null || contact.getDeleted() == 1) {
throw new RuntimeException("联系人不存在"); throw new RuntimeException("联系人不存在");
@ -73,7 +73,7 @@ public class ContactServiceImpl implements ContactService {
} }
@Override @Override
public ContactVO getContactById(Long id) { public ContactVO getContactById(String id) {
CustomerContact contact = contactDataService.getById(id); CustomerContact contact = contactDataService.getById(id);
if (contact == null || contact.getDeleted() == 1) { if (contact == null || contact.getDeleted() == 1) {
throw new RuntimeException("联系人不存在"); throw new RuntimeException("联系人不存在");
@ -82,7 +82,7 @@ public class ContactServiceImpl implements ContactService {
} }
@Override @Override
public Page<ContactVO> pageContacts(int pageNum, int pageSize, Long customerId) { public Page<ContactVO> pageContacts(int pageNum, int pageSize, String customerId) {
Page<CustomerContact> page = new Page<>(pageNum, pageSize); Page<CustomerContact> page = new Page<>(pageNum, pageSize);
LambdaQueryWrapper<CustomerContact> wrapper = new LambdaQueryWrapper<>(); LambdaQueryWrapper<CustomerContact> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(CustomerContact::getDeleted, 0); wrapper.eq(CustomerContact::getDeleted, 0);
@ -100,7 +100,7 @@ public class ContactServiceImpl implements ContactService {
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public boolean deleteContact(Long id) { public boolean deleteContact(String id) {
LambdaUpdateWrapper<CustomerContact> wrapper = new LambdaUpdateWrapper<>(); LambdaUpdateWrapper<CustomerContact> wrapper = new LambdaUpdateWrapper<>();
wrapper.eq(CustomerContact::getId, id); wrapper.eq(CustomerContact::getId, id);
wrapper.set(CustomerContact::getDeleted, 1); wrapper.set(CustomerContact::getDeleted, 1);
@ -112,7 +112,7 @@ public class ContactServiceImpl implements ContactService {
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public boolean setPrimaryContact(Long customerId, Long contactId) { public boolean setPrimaryContact(String customerId, String contactId) {
// 先清除该客户的所有主要联系人标记 // 先清除该客户的所有主要联系人标记
LambdaUpdateWrapper<CustomerContact> clearWrapper = new LambdaUpdateWrapper<>(); LambdaUpdateWrapper<CustomerContact> clearWrapper = new LambdaUpdateWrapper<>();
clearWrapper.eq(CustomerContact::getCustomerId, customerId); clearWrapper.eq(CustomerContact::getCustomerId, customerId);

View File

@ -26,7 +26,7 @@ public class CustomerServiceImpl implements CustomerService {
} }
@Override @Override
public Long createCustomer(CustomerCreateDTO dto) { public String createCustomer(CustomerCreateDTO dto) {
// 检查编码是否重复 // 检查编码是否重复
LambdaQueryWrapper<Customer> checkWrapper = new LambdaQueryWrapper<>(); LambdaQueryWrapper<Customer> checkWrapper = new LambdaQueryWrapper<>();
checkWrapper.eq(Customer::getCustomerCode, dto.getCustomerCode()); checkWrapper.eq(Customer::getCustomerCode, dto.getCustomerCode());
@ -52,7 +52,7 @@ public class CustomerServiceImpl implements CustomerService {
} }
@Override @Override
public void updateCustomer(Long id, CustomerUpdateDTO dto) { public void updateCustomer(String id, CustomerUpdateDTO dto) {
Customer customer = customerDataService.getById(id); Customer customer = customerDataService.getById(id);
if (customer == null) { if (customer == null) {
throw new RuntimeException("客户不存在"); throw new RuntimeException("客户不存在");
@ -84,7 +84,7 @@ public class CustomerServiceImpl implements CustomerService {
} }
@Override @Override
public CustomerVO getCustomerById(Long id) { public CustomerVO getCustomerById(String id) {
Customer customer = customerDataService.getById(id); Customer customer = customerDataService.getById(id);
if (customer == null) { if (customer == null) {
throw new RuntimeException("客户不存在"); throw new RuntimeException("客户不存在");
@ -116,7 +116,7 @@ public class CustomerServiceImpl implements CustomerService {
} }
@Override @Override
public void deleteCustomer(Long id) { public void deleteCustomer(String id) {
customerDataService.removeById(id); customerDataService.removeById(id);
} }

View File

@ -7,12 +7,12 @@ import java.time.LocalDateTime;
*/ */
public class ContactVO { public class ContactVO {
private Long id; private String id;
/** /**
* 客户ID * 客户ID
*/ */
private Long customerId; private String customerId;
/** /**
* 客户名称 * 客户名称
@ -64,19 +64,19 @@ public class ContactVO {
*/ */
private LocalDateTime updatedTime; private LocalDateTime updatedTime;
public Long getId() { public String getId() {
return id; return id;
} }
public void setId(Long id) { public void setId(String id) {
this.id = id; this.id = id;
} }
public Long getCustomerId() { public String getCustomerId() {
return customerId; return customerId;
} }
public void setCustomerId(Long customerId) { public void setCustomerId(String customerId) {
this.customerId = customerId; this.customerId = customerId;
} }

View File

@ -5,7 +5,7 @@ package com.fundplatform.cust.vo;
*/ */
public class CustomerVO { public class CustomerVO {
private Long customerId; private String customerId;
private String customerCode; private String customerCode;
private String customerName; private String customerName;
private String contact; private String contact;
@ -15,11 +15,11 @@ public class CustomerVO {
private Integer status; private Integer status;
private String remark; private String remark;
public Long getCustomerId() { public String getCustomerId() {
return customerId; return customerId;
} }
public void setCustomerId(Long customerId) { public void setCustomerId(String customerId) {
this.customerId = customerId; this.customerId = customerId;
} }

View File

@ -6,7 +6,7 @@ import jakarta.validation.constraints.Size;
public class ExpenseTypeDTO { public class ExpenseTypeDTO {
private Long id; private String id;
@Size(max = 50, message = "类型编码不能超过50个字符") @Size(max = 50, message = "类型编码不能超过50个字符")
private String typeCode; private String typeCode;
@ -15,7 +15,7 @@ public class ExpenseTypeDTO {
@Size(max = 100, message = "类型名称不能超过100个字符") @Size(max = 100, message = "类型名称不能超过100个字符")
private String typeName; private String typeName;
private Long parentId = 0L; private String parentId = "0";
private Integer typeLevel = 1; private Integer typeLevel = 1;
@ -28,11 +28,11 @@ public class ExpenseTypeDTO {
private String remark; private String remark;
public Long getId() { public String getId() {
return id; return id;
} }
public void setId(Long id) { public void setId(String id) {
this.id = id; this.id = id;
} }
@ -52,11 +52,11 @@ public class ExpenseTypeDTO {
this.typeName = typeName; this.typeName = typeName;
} }
public Long getParentId() { public String getParentId() {
return parentId; return parentId;
} }
public void setParentId(Long parentId) { public void setParentId(String parentId) {
this.parentId = parentId; this.parentId = parentId;
} }

View File

@ -16,7 +16,7 @@ public interface ExpenseTypeService {
/** /**
* 创建支出类型 * 创建支出类型
*/ */
Long createType(ExpenseTypeDTO dto); String createType(ExpenseTypeDTO dto);
/** /**
* 更新支出类型 * 更新支出类型
@ -26,7 +26,7 @@ public interface ExpenseTypeService {
/** /**
* 根据ID查询支出类型 * 根据ID查询支出类型
*/ */
ExpenseTypeVO getTypeById(Long id); ExpenseTypeVO getTypeById(String id);
/** /**
* 查询支出类型树形结构 * 查询支出类型树形结构
@ -36,15 +36,15 @@ public interface ExpenseTypeService {
/** /**
* 查询指定父级的子类型列表 * 查询指定父级的子类型列表
*/ */
List<ExpenseTypeVO> getChildrenByParentId(Long parentId); List<ExpenseTypeVO> getChildrenByParentId(String parentId);
/** /**
* 删除支出类型 * 删除支出类型
*/ */
boolean deleteType(Long id); boolean deleteType(String id);
/** /**
* 更新状态 * 更新状态
*/ */
boolean updateStatus(Long id, Integer status); boolean updateStatus(String id, Integer status);
} }

View File

@ -52,11 +52,11 @@ public class ExpenseTypeServiceImpl implements ExpenseTypeService {
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public Long createType(ExpenseTypeDTO dto) { public String createType(ExpenseTypeDTO dto) {
ExpenseType type = new ExpenseType(); ExpenseType type = new ExpenseType();
type.setTypeCode(dto.getTypeCode()); type.setTypeCode(dto.getTypeCode());
type.setTypeName(dto.getTypeName()); type.setTypeName(dto.getTypeName());
type.setParentId(dto.getParentId() != null ? dto.getParentId() : 0L); type.setParentId(dto.getParentId() != null ? dto.getParentId() : "0");
type.setTypeLevel(dto.getTypeLevel() != null ? dto.getTypeLevel() : 1); type.setTypeLevel(dto.getTypeLevel() != null ? dto.getTypeLevel() : 1);
type.setSortOrder(dto.getSortOrder() != null ? dto.getSortOrder() : 0); type.setSortOrder(dto.getSortOrder() != null ? dto.getSortOrder() : 0);
type.setDescription(dto.getDescription()); type.setDescription(dto.getDescription());
@ -86,7 +86,7 @@ public class ExpenseTypeServiceImpl implements ExpenseTypeService {
type.setId(dto.getId()); type.setId(dto.getId());
type.setTypeCode(dto.getTypeCode()); type.setTypeCode(dto.getTypeCode());
type.setTypeName(dto.getTypeName()); type.setTypeName(dto.getTypeName());
type.setParentId(dto.getParentId() != null ? dto.getParentId() : 0L); type.setParentId(dto.getParentId() != null ? dto.getParentId() : "0");
type.setSortOrder(dto.getSortOrder()); type.setSortOrder(dto.getSortOrder());
type.setDescription(dto.getDescription()); type.setDescription(dto.getDescription());
type.setStatus(dto.getStatus()); type.setStatus(dto.getStatus());
@ -97,7 +97,7 @@ public class ExpenseTypeServiceImpl implements ExpenseTypeService {
} }
@Override @Override
public ExpenseTypeVO getTypeById(Long id) { public ExpenseTypeVO getTypeById(String id) {
ExpenseType type = typeDataService.getById(id); ExpenseType type = typeDataService.getById(id);
if (type == null || type.getDeleted() == 1) { if (type == null || type.getDeleted() == 1) {
throw new RuntimeException("支出类型不存在"); throw new RuntimeException("支出类型不存在");
@ -114,14 +114,14 @@ public class ExpenseTypeServiceImpl implements ExpenseTypeService {
.orderByAsc(ExpenseType::getSortOrder); .orderByAsc(ExpenseType::getSortOrder);
List<ExpenseType> types = typeDataService.list(wrapper); List<ExpenseType> types = typeDataService.list(wrapper);
return buildTree(types, 0L); return buildTree(types, "0");
} }
@Override @Override
public List<ExpenseTypeVO> getChildrenByParentId(Long parentId) { public List<ExpenseTypeVO> getChildrenByParentId(String parentId) {
LambdaQueryWrapper<ExpenseType> wrapper = new LambdaQueryWrapper<>(); LambdaQueryWrapper<ExpenseType> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(ExpenseType::getDeleted, 0) wrapper.eq(ExpenseType::getDeleted, 0)
.eq(ExpenseType::getParentId, parentId != null ? parentId : 0L) .eq(ExpenseType::getParentId, parentId != null ? parentId : "0")
.orderByAsc(ExpenseType::getSortOrder); .orderByAsc(ExpenseType::getSortOrder);
List<ExpenseType> types = typeDataService.list(wrapper); List<ExpenseType> types = typeDataService.list(wrapper);
@ -130,7 +130,7 @@ public class ExpenseTypeServiceImpl implements ExpenseTypeService {
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public boolean deleteType(Long id) { public boolean deleteType(String id) {
// 检查是否有子类型 // 检查是否有子类型
LambdaQueryWrapper<ExpenseType> wrapper = new LambdaQueryWrapper<>(); LambdaQueryWrapper<ExpenseType> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(ExpenseType::getParentId, id).eq(ExpenseType::getDeleted, 0); wrapper.eq(ExpenseType::getParentId, id).eq(ExpenseType::getDeleted, 0);
@ -148,7 +148,7 @@ public class ExpenseTypeServiceImpl implements ExpenseTypeService {
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public boolean updateStatus(Long id, Integer status) { public boolean updateStatus(String id, Integer status) {
LambdaUpdateWrapper<ExpenseType> wrapper = new LambdaUpdateWrapper<>(); LambdaUpdateWrapper<ExpenseType> wrapper = new LambdaUpdateWrapper<>();
wrapper.eq(ExpenseType::getId, id) wrapper.eq(ExpenseType::getId, id)
.set(ExpenseType::getStatus, status) .set(ExpenseType::getStatus, status)
@ -159,9 +159,9 @@ public class ExpenseTypeServiceImpl implements ExpenseTypeService {
/** /**
* 构建树形结构 * 构建树形结构
*/ */
private List<ExpenseTypeVO> buildTree(List<ExpenseType> types, Long parentId) { private List<ExpenseTypeVO> buildTree(List<ExpenseType> types, String parentId) {
List<ExpenseTypeVO> tree = new ArrayList<>(); List<ExpenseTypeVO> tree = new ArrayList<>();
Map<Long, List<ExpenseType>> groupedByParent = types.stream() Map<String, List<ExpenseType>> groupedByParent = types.stream()
.collect(Collectors.groupingBy(ExpenseType::getParentId)); .collect(Collectors.groupingBy(ExpenseType::getParentId));
List<ExpenseType> rootTypes = groupedByParent.getOrDefault(parentId, new ArrayList<>()); List<ExpenseType> rootTypes = groupedByParent.getOrDefault(parentId, new ArrayList<>());
@ -173,7 +173,7 @@ public class ExpenseTypeServiceImpl implements ExpenseTypeService {
return tree; return tree;
} }
private List<ExpenseTypeVO> buildChildren(Map<Long, List<ExpenseType>> groupedByParent, Long parentId) { private List<ExpenseTypeVO> buildChildren(Map<String, List<ExpenseType>> groupedByParent, String parentId) {
List<ExpenseType> children = groupedByParent.getOrDefault(parentId, new ArrayList<>()); List<ExpenseType> children = groupedByParent.getOrDefault(parentId, new ArrayList<>());
return children.stream().map(type -> { return children.stream().map(type -> {
ExpenseTypeVO vo = convertToVO(type); ExpenseTypeVO vo = convertToVO(type);
@ -199,7 +199,7 @@ public class ExpenseTypeServiceImpl implements ExpenseTypeService {
vo.setRemark(type.getRemark()); vo.setRemark(type.getRemark());
// 查询父类型名称 // 查询父类型名称
if (type.getParentId() != null && type.getParentId() > 0) { if (type.getParentId() != null && !"0".equals(type.getParentId())) {
ExpenseType parentType = typeDataService.getById(type.getParentId()); ExpenseType parentType = typeDataService.getById(type.getParentId());
if (parentType != null) { if (parentType != null) {
vo.setParentName(parentType.getTypeName()); vo.setParentName(parentType.getTypeName());

View File

@ -8,21 +8,17 @@ import java.util.List;
public class ExpenseTypeVO { public class ExpenseTypeVO {
@JsonSerialize(using = ToStringSerializer.class) private String id;
private Long id;
private String typeCode; private String typeCode;
private String typeName; private String typeName;
@JsonSerialize(using = ToStringSerializer.class) private String parentId;
private Long parentId;
private String parentName; private String parentName;
private Integer typeLevel; private Integer typeLevel;
private Integer sortOrder; private Integer sortOrder;
private String description; private String description;
private Integer status; private Integer status;
@JsonSerialize(using = ToStringSerializer.class) private String tenantId;
private Long tenantId; private String createdBy;
@JsonSerialize(using = ToStringSerializer.class)
private Long createdBy;
private LocalDateTime createdTime; private LocalDateTime createdTime;
private LocalDateTime updatedTime; private LocalDateTime updatedTime;
private String remark; private String remark;
@ -30,11 +26,11 @@ public class ExpenseTypeVO {
/** 子节点列表(用于树形结构) */ /** 子节点列表(用于树形结构) */
private List<ExpenseTypeVO> children; private List<ExpenseTypeVO> children;
public Long getId() { public String getId() {
return id; return id;
} }
public void setId(Long id) { public void setId(String id) {
this.id = id; this.id = id;
} }
@ -54,11 +50,11 @@ public class ExpenseTypeVO {
this.typeName = typeName; this.typeName = typeName;
} }
public Long getParentId() { public String getParentId() {
return parentId; return parentId;
} }
public void setParentId(Long parentId) { public void setParentId(String parentId) {
this.parentId = parentId; this.parentId = parentId;
} }
@ -102,19 +98,19 @@ public class ExpenseTypeVO {
this.status = status; this.status = status;
} }
public Long getTenantId() { public String getTenantId() {
return tenantId; return tenantId;
} }
public void setTenantId(Long tenantId) { public void setTenantId(String tenantId) {
this.tenantId = tenantId; this.tenantId = tenantId;
} }
public Long getCreatedBy() { public String getCreatedBy() {
return createdBy; return createdBy;
} }
public void setCreatedBy(Long createdBy) { public void setCreatedBy(String createdBy) {
this.createdBy = createdBy; this.createdBy = createdBy;
} }

View File

@ -7,7 +7,7 @@ import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerIntercept
import com.baomidou.mybatisplus.extension.plugins.inner.TenantLineInnerInterceptor; import com.baomidou.mybatisplus.extension.plugins.inner.TenantLineInnerInterceptor;
import com.fundplatform.common.context.TenantContextHolder; import com.fundplatform.common.context.TenantContextHolder;
import net.sf.jsqlparser.expression.Expression; import net.sf.jsqlparser.expression.Expression;
import net.sf.jsqlparser.expression.LongValue; import net.sf.jsqlparser.expression.StringValue;
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;
@ -26,11 +26,11 @@ public class MybatisPlusConfig {
tenantInterceptor.setTenantLineHandler(new com.baomidou.mybatisplus.extension.plugins.handler.TenantLineHandler() { tenantInterceptor.setTenantLineHandler(new com.baomidou.mybatisplus.extension.plugins.handler.TenantLineHandler() {
@Override @Override
public Expression getTenantId() { public Expression getTenantId() {
Long tenantId = TenantContextHolder.getTenantId(); String tenantId = TenantContextHolder.getTenantId();
if (tenantId == null) { if (tenantId == null) {
return new LongValue(1); return new StringValue("1");
} }
return new LongValue(tenantId); return new StringValue(tenantId);
} }
@Override @Override

View File

@ -30,8 +30,8 @@ public class ProjectController {
* 创建项目 * 创建项目
*/ */
@PostMapping @PostMapping
public Result<Long> createProject(@Valid @RequestBody ProjectCreateDTO dto) { public Result<String> createProject(@Valid @RequestBody ProjectCreateDTO dto) {
Long id = projectService.createProject(dto); String id = projectService.createProject(dto);
return Result.success(id); return Result.success(id);
} }
@ -39,7 +39,7 @@ public class ProjectController {
* 更新项目 * 更新项目
*/ */
@PutMapping("/{id}") @PutMapping("/{id}")
public Result<Void> updateProject(@PathVariable Long id, @Valid @RequestBody ProjectUpdateDTO dto) { public Result<Void> updateProject(@PathVariable String id, @Valid @RequestBody ProjectUpdateDTO dto) {
projectService.updateProject(id, dto); projectService.updateProject(id, dto);
return Result.success(); return Result.success();
} }
@ -67,7 +67,7 @@ public class ProjectController {
* 查询项目详情 * 查询项目详情
*/ */
@GetMapping("/{id}") @GetMapping("/{id}")
public Result<ProjectVO> getProject(@PathVariable Long id) { public Result<ProjectVO> getProject(@PathVariable String id) {
ProjectVO vo = projectService.getProjectById(id); ProjectVO vo = projectService.getProjectById(id);
return Result.success(vo); return Result.success(vo);
} }
@ -76,7 +76,7 @@ public class ProjectController {
* 删除项目 * 删除项目
*/ */
@DeleteMapping("/{id}") @DeleteMapping("/{id}")
public Result<Void> deleteProject(@PathVariable Long id) { public Result<Void> deleteProject(@PathVariable String id) {
projectService.deleteProject(id); projectService.deleteProject(id);
return Result.success(); return Result.success();
} }

View File

@ -49,8 +49,8 @@ public class RequirementController {
*/ */
@PostMapping @PostMapping
public Result<RequirementVO> create( public Result<RequirementVO> create(
@RequestHeader("X-Tenant-Id") Long tenantId, @RequestHeader("X-Tenant-Id") String tenantId,
@RequestHeader("X-User-Id") Long userId, @RequestHeader("X-User-Id") String userId,
@Valid @RequestBody RequirementDTO dto) { @Valid @RequestBody RequirementDTO dto) {
return requirementService.create(tenantId, userId, dto); return requirementService.create(tenantId, userId, dto);
} }
@ -60,9 +60,9 @@ public class RequirementController {
*/ */
@PutMapping("/{requirementId}") @PutMapping("/{requirementId}")
public Result<RequirementVO> update( public Result<RequirementVO> update(
@RequestHeader("X-Tenant-Id") Long tenantId, @RequestHeader("X-Tenant-Id") String tenantId,
@RequestHeader("X-User-Id") Long userId, @RequestHeader("X-User-Id") String userId,
@PathVariable Long requirementId, @PathVariable String requirementId,
@Valid @RequestBody RequirementDTO dto) { @Valid @RequestBody RequirementDTO dto) {
return requirementService.update(tenantId, userId, requirementId, dto); return requirementService.update(tenantId, userId, requirementId, dto);
} }
@ -72,9 +72,9 @@ public class RequirementController {
*/ */
@DeleteMapping("/{requirementId}") @DeleteMapping("/{requirementId}")
public Result<Void> delete( public Result<Void> delete(
@RequestHeader("X-Tenant-Id") Long tenantId, @RequestHeader("X-Tenant-Id") String tenantId,
@RequestHeader("X-User-Id") Long userId, @RequestHeader("X-User-Id") String userId,
@PathVariable Long requirementId) { @PathVariable String requirementId) {
return requirementService.delete(tenantId, userId, requirementId); return requirementService.delete(tenantId, userId, requirementId);
} }
@ -83,9 +83,9 @@ public class RequirementController {
*/ */
@PutMapping("/{requirementId}/status") @PutMapping("/{requirementId}/status")
public Result<RequirementVO> updateStatus( public Result<RequirementVO> updateStatus(
@RequestHeader("X-Tenant-Id") Long tenantId, @RequestHeader("X-Tenant-Id") String tenantId,
@RequestHeader("X-User-Id") Long userId, @RequestHeader("X-User-Id") String userId,
@PathVariable Long requirementId, @PathVariable String requirementId,
@RequestParam String status) { @RequestParam String status) {
return requirementService.updateStatus(tenantId, userId, requirementId, status); return requirementService.updateStatus(tenantId, userId, requirementId, status);
} }
@ -95,9 +95,9 @@ public class RequirementController {
*/ */
@PutMapping("/{requirementId}/progress") @PutMapping("/{requirementId}/progress")
public Result<RequirementVO> updateProgress( public Result<RequirementVO> updateProgress(
@RequestHeader("X-Tenant-Id") Long tenantId, @RequestHeader("X-Tenant-Id") String tenantId,
@RequestHeader("X-User-Id") Long userId, @RequestHeader("X-User-Id") String userId,
@PathVariable Long requirementId, @PathVariable String requirementId,
@RequestParam Integer progress) { @RequestParam Integer progress) {
return requirementService.updateProgress(tenantId, userId, requirementId, progress); return requirementService.updateProgress(tenantId, userId, requirementId, progress);
} }

View File

@ -18,7 +18,7 @@ public class ProjectCreateDTO {
private String projectName; private String projectName;
@NotNull(message = "客户ID不能为空") @NotNull(message = "客户ID不能为空")
private Long customerId; private String customerId;
private String customerName; private String customerName;
@ -47,11 +47,11 @@ public class ProjectCreateDTO {
this.projectName = projectName; this.projectName = projectName;
} }
public Long getCustomerId() { public String getCustomerId() {
return customerId; return customerId;
} }
public void setCustomerId(Long customerId) { public void setCustomerId(String customerId) {
this.customerId = customerId; this.customerId = customerId;
} }

View File

@ -18,7 +18,7 @@ public class ProjectUpdateDTO {
private String projectName; private String projectName;
@NotNull(message = "客户ID不能为空") @NotNull(message = "客户ID不能为空")
private Long customerId; private String customerId;
@NotBlank(message = "项目类型不能为空") @NotBlank(message = "项目类型不能为空")
private String projectType; private String projectType;
@ -46,11 +46,11 @@ public class ProjectUpdateDTO {
this.projectName = projectName; this.projectName = projectName;
} }
public Long getCustomerId() { public String getCustomerId() {
return customerId; return customerId;
} }
public void setCustomerId(Long customerId) { public void setCustomerId(String customerId) {
this.customerId = customerId; this.customerId = customerId;
} }

View File

@ -16,17 +16,17 @@ public interface ProjectService {
/** /**
* 创建项目 * 创建项目
*/ */
Long createProject(ProjectCreateDTO dto); String createProject(ProjectCreateDTO dto);
/** /**
* 更新项目 * 更新项目
*/ */
void updateProject(Long id, ProjectUpdateDTO dto); void updateProject(String id, ProjectUpdateDTO dto);
/** /**
* 查询项目详情 * 查询项目详情
*/ */
ProjectVO getProjectById(Long id); ProjectVO getProjectById(String id);
/** /**
* 分页查询项目 * 分页查询项目
@ -36,7 +36,7 @@ public interface ProjectService {
/** /**
* 删除项目 * 删除项目
*/ */
void deleteProject(Long id); void deleteProject(String id);
/** /**
* 获取项目状态分布 * 获取项目状态分布

View File

@ -99,7 +99,7 @@ public class RequirementService {
* 创建需求工单 * 创建需求工单
*/ */
@Transactional @Transactional
public Result<RequirementVO> create(Long tenantId, Long userId, RequirementDTO dto) { public Result<RequirementVO> create(String tenantId, String userId, RequirementDTO dto) {
// 检查编号唯一性 // 检查编号唯一性
long count = requirementDataService.count( long count = requirementDataService.count(
new LambdaQueryWrapper<Requirement>() new LambdaQueryWrapper<Requirement>()
@ -141,7 +141,7 @@ public class RequirementService {
* 更新需求工单 * 更新需求工单
*/ */
@Transactional @Transactional
public Result<RequirementVO> update(Long tenantId, Long userId, Long requirementId, RequirementDTO dto) { public Result<RequirementVO> update(String tenantId, String userId, String requirementId, RequirementDTO dto) {
Requirement requirement = requirementDataService.getOne( Requirement requirement = requirementDataService.getOne(
new LambdaQueryWrapper<Requirement>() new LambdaQueryWrapper<Requirement>()
.eq(Requirement::getId, requirementId) .eq(Requirement::getId, requirementId)
@ -182,7 +182,7 @@ public class RequirementService {
* 删除需求工单 * 删除需求工单
*/ */
@Transactional @Transactional
public Result<Void> delete(Long tenantId, Long userId, Long requirementId) { public Result<Void> delete(String tenantId, String userId, String requirementId) {
Requirement requirement = requirementDataService.getOne( Requirement requirement = requirementDataService.getOne(
new LambdaQueryWrapper<Requirement>() new LambdaQueryWrapper<Requirement>()
.eq(Requirement::getId, requirementId) .eq(Requirement::getId, requirementId)
@ -208,7 +208,7 @@ public class RequirementService {
* 更新需求状态 * 更新需求状态
*/ */
@Transactional @Transactional
public Result<RequirementVO> updateStatus(Long tenantId, Long userId, Long requirementId, String status) { public Result<RequirementVO> updateStatus(String tenantId, String userId, String requirementId, String status) {
Requirement requirement = requirementDataService.getOne( Requirement requirement = requirementDataService.getOne(
new LambdaQueryWrapper<Requirement>() new LambdaQueryWrapper<Requirement>()
.eq(Requirement::getId, requirementId) .eq(Requirement::getId, requirementId)
@ -235,7 +235,7 @@ public class RequirementService {
* 更新开发进度 * 更新开发进度
*/ */
@Transactional @Transactional
public Result<RequirementVO> updateProgress(Long tenantId, Long userId, Long requirementId, Integer progress) { public Result<RequirementVO> updateProgress(String tenantId, String userId, String requirementId, Integer progress) {
Requirement requirement = requirementDataService.getOne( Requirement requirement = requirementDataService.getOne(
new LambdaQueryWrapper<Requirement>() new LambdaQueryWrapper<Requirement>()
.eq(Requirement::getId, requirementId) .eq(Requirement::getId, requirementId)

View File

@ -31,7 +31,7 @@ public class ProjectServiceImpl implements ProjectService {
} }
@Override @Override
public Long createProject(ProjectCreateDTO dto) { public String createProject(ProjectCreateDTO dto) {
// 检查编码是否重复 // 检查编码是否重复
LambdaQueryWrapper<Project> checkWrapper = new LambdaQueryWrapper<>(); LambdaQueryWrapper<Project> checkWrapper = new LambdaQueryWrapper<>();
checkWrapper.eq(Project::getProjectCode, dto.getProjectCode()); checkWrapper.eq(Project::getProjectCode, dto.getProjectCode());
@ -60,7 +60,7 @@ public class ProjectServiceImpl implements ProjectService {
} }
@Override @Override
public void updateProject(Long id, ProjectUpdateDTO dto) { public void updateProject(String id, ProjectUpdateDTO dto) {
Project project = projectDataService.getById(id); Project project = projectDataService.getById(id);
if (project == null) { if (project == null) {
throw new RuntimeException("项目不存在"); throw new RuntimeException("项目不存在");
@ -94,7 +94,7 @@ public class ProjectServiceImpl implements ProjectService {
} }
@Override @Override
public ProjectVO getProjectById(Long id) { public ProjectVO getProjectById(String id) {
Project project = projectDataService.getById(id); Project project = projectDataService.getById(id);
if (project == null) { if (project == null) {
throw new RuntimeException("项目不存在"); throw new RuntimeException("项目不存在");
@ -126,7 +126,7 @@ public class ProjectServiceImpl implements ProjectService {
} }
@Override @Override
public void deleteProject(Long id) { public void deleteProject(String id) {
projectDataService.removeById(id); projectDataService.removeById(id);
} }

View File

@ -8,10 +8,10 @@ import java.time.LocalDate;
*/ */
public class ProjectVO { public class ProjectVO {
private Long projectId; private String projectId;
private String projectCode; private String projectCode;
private String projectName; private String projectName;
private Long customerId; private String customerId;
private String customerName; private String customerName;
private String projectType; private String projectType;
private BigDecimal budgetAmount; private BigDecimal budgetAmount;
@ -21,11 +21,11 @@ public class ProjectVO {
private Integer status; private Integer status;
private String remark; private String remark;
public Long getProjectId() { public String getProjectId() {
return projectId; return projectId;
} }
public void setProjectId(Long projectId) { public void setProjectId(String projectId) {
this.projectId = projectId; this.projectId = projectId;
} }
@ -45,11 +45,11 @@ public class ProjectVO {
this.projectName = projectName; this.projectName = projectName;
} }
public Long getCustomerId() { public String getCustomerId() {
return customerId; return customerId;
} }
public void setCustomerId(Long customerId) { public void setCustomerId(String customerId) {
this.customerId = customerId; this.customerId = customerId;
} }

View File

@ -9,13 +9,13 @@ import java.time.LocalDateTime;
*/ */
public class RequirementVO { public class RequirementVO {
private Long requirementId; private String requirementId;
private String requirementCode; private String requirementCode;
private String requirementName; private String requirementName;
private String description; private String description;
private Long projectId; private String projectId;
private String projectName; private String projectName;
private Long customerId; private String customerId;
private String customerName; private String customerName;
private String priority; private String priority;
private String priorityName; private String priorityName;
@ -32,15 +32,15 @@ public class RequirementVO {
private String statusName; private String statusName;
private Integer progress; private Integer progress;
private String attachmentUrl; private String attachmentUrl;
private Long tenantId; private String tenantId;
private LocalDateTime createdTime; private LocalDateTime createdTime;
private LocalDateTime updatedTime; private LocalDateTime updatedTime;
public Long getRequirementId() { public String getRequirementId() {
return requirementId; return requirementId;
} }
public void setRequirementId(Long requirementId) { public void setRequirementId(String requirementId) {
this.requirementId = requirementId; this.requirementId = requirementId;
} }
@ -68,11 +68,11 @@ public class RequirementVO {
this.description = description; this.description = description;
} }
public Long getProjectId() { public String getProjectId() {
return projectId; return projectId;
} }
public void setProjectId(Long projectId) { public void setProjectId(String projectId) {
this.projectId = projectId; this.projectId = projectId;
} }
@ -84,11 +84,11 @@ public class RequirementVO {
this.projectName = projectName; this.projectName = projectName;
} }
public Long getCustomerId() { public String getCustomerId() {
return customerId; return customerId;
} }
public void setCustomerId(Long customerId) { public void setCustomerId(String customerId) {
this.customerId = customerId; this.customerId = customerId;
} }
@ -220,11 +220,11 @@ public class RequirementVO {
this.attachmentUrl = attachmentUrl; this.attachmentUrl = attachmentUrl;
} }
public Long getTenantId() { public String getTenantId() {
return tenantId; return tenantId;
} }
public void setTenantId(Long tenantId) { public void setTenantId(String tenantId) {
this.tenantId = tenantId; this.tenantId = tenantId;
} }

View File

@ -25,8 +25,8 @@ public class FundRequestController {
* 创建用款申请 * 创建用款申请
*/ */
@PostMapping @PostMapping
public Result<Long> create(@Valid @RequestBody FundRequestDTO dto) { public Result<String> create(@Valid @RequestBody FundRequestDTO dto) {
Long id = fundRequestService.createRequest(dto); String id = fundRequestService.createRequest(dto);
return Result.success(id); return Result.success(id);
} }
@ -43,7 +43,7 @@ public class FundRequestController {
* 根据ID查询用款申请 * 根据ID查询用款申请
*/ */
@GetMapping("/{id}") @GetMapping("/{id}")
public Result<FundRequestVO> getById(@PathVariable Long id) { public Result<FundRequestVO> getById(@PathVariable String id) {
FundRequestVO vo = fundRequestService.getRequestById(id); FundRequestVO vo = fundRequestService.getRequestById(id);
return Result.success(vo); return Result.success(vo);
} }
@ -66,7 +66,7 @@ public class FundRequestController {
* 删除用款申请 * 删除用款申请
*/ */
@DeleteMapping("/{id}") @DeleteMapping("/{id}")
public Result<Boolean> delete(@PathVariable Long id) { public Result<Boolean> delete(@PathVariable String id) {
boolean result = fundRequestService.deleteRequest(id); boolean result = fundRequestService.deleteRequest(id);
return Result.success(result); return Result.success(result);
} }
@ -75,7 +75,7 @@ public class FundRequestController {
* 提交审批 * 提交审批
*/ */
@PostMapping("/{id}/submit") @PostMapping("/{id}/submit")
public Result<Boolean> submit(@PathVariable Long id) { public Result<Boolean> submit(@PathVariable String id) {
boolean result = fundRequestService.submitApproval(id); boolean result = fundRequestService.submitApproval(id);
return Result.success(result); return Result.success(result);
} }
@ -84,7 +84,7 @@ public class FundRequestController {
* 审批通过 * 审批通过
*/ */
@PutMapping("/{id}/approve") @PutMapping("/{id}/approve")
public Result<Boolean> approve(@PathVariable Long id, @RequestParam(required = false) String comment) { public Result<Boolean> approve(@PathVariable String id, @RequestParam(required = false) String comment) {
boolean result = fundRequestService.approve(id, comment); boolean result = fundRequestService.approve(id, comment);
return Result.success(result); return Result.success(result);
} }
@ -93,7 +93,7 @@ public class FundRequestController {
* 审批拒绝 * 审批拒绝
*/ */
@PutMapping("/{id}/reject") @PutMapping("/{id}/reject")
public Result<Boolean> reject(@PathVariable Long id, @RequestParam(required = false) String comment) { public Result<Boolean> reject(@PathVariable String id, @RequestParam(required = false) String comment) {
boolean result = fundRequestService.reject(id, comment); boolean result = fundRequestService.reject(id, comment);
return Result.success(result); return Result.success(result);
} }
@ -102,7 +102,7 @@ public class FundRequestController {
* 撤回申请 * 撤回申请
*/ */
@PutMapping("/{id}/withdraw") @PutMapping("/{id}/withdraw")
public Result<Boolean> withdraw(@PathVariable Long id) { public Result<Boolean> withdraw(@PathVariable String id) {
boolean result = fundRequestService.withdraw(id); boolean result = fundRequestService.withdraw(id);
return Result.success(result); return Result.success(result);
} }

View File

@ -13,7 +13,7 @@ import java.time.LocalDateTime;
*/ */
public class FundRequestDTO { public class FundRequestDTO {
private Long id; private String id;
@NotBlank(message = "申请标题不能为空") @NotBlank(message = "申请标题不能为空")
@Size(max = 200, message = "申请标题不能超过200个字符") @Size(max = 200, message = "申请标题不能超过200个字符")
@ -41,9 +41,9 @@ public class FundRequestDTO {
@Size(max = 500, message = "用途说明不能超过500个字符") @Size(max = 500, message = "用途说明不能超过500个字符")
private String purpose; private String purpose;
private Long projectId; private String projectId;
private Long customerId; private String customerId;
private LocalDateTime expectedPayDate; private LocalDateTime expectedPayDate;
@ -51,11 +51,11 @@ public class FundRequestDTO {
private String remark; private String remark;
public Long getId() { public String getId() {
return id; return id;
} }
public void setId(Long id) { public void setId(String id) {
this.id = id; this.id = id;
} }
@ -123,19 +123,19 @@ public class FundRequestDTO {
this.purpose = purpose; this.purpose = purpose;
} }
public Long getProjectId() { public String getProjectId() {
return projectId; return projectId;
} }
public void setProjectId(Long projectId) { public void setProjectId(String projectId) {
this.projectId = projectId; this.projectId = projectId;
} }
public Long getCustomerId() { public String getCustomerId() {
return customerId; return customerId;
} }
public void setCustomerId(Long customerId) { public void setCustomerId(String customerId) {
this.customerId = customerId; this.customerId = customerId;
} }

View File

@ -15,7 +15,7 @@ public interface FundRequestService {
* @param dto 用款申请DTO * @param dto 用款申请DTO
* @return 申请ID * @return 申请ID
*/ */
Long createRequest(FundRequestDTO dto); String createRequest(FundRequestDTO dto);
/** /**
* 更新用款申请 * 更新用款申请
@ -31,7 +31,7 @@ public interface FundRequestService {
* @param id 申请ID * @param id 申请ID
* @return 用款申请VO * @return 用款申请VO
*/ */
FundRequestVO getRequestById(Long id); FundRequestVO getRequestById(String id);
/** /**
* 分页查询用款申请 * 分页查询用款申请
@ -51,7 +51,7 @@ public interface FundRequestService {
* @param id 申请ID * @param id 申请ID
* @return 是否成功 * @return 是否成功
*/ */
boolean deleteRequest(Long id); boolean deleteRequest(String id);
/** /**
* 提交审批 * 提交审批
@ -59,7 +59,7 @@ public interface FundRequestService {
* @param id 申请ID * @param id 申请ID
* @return 是否成功 * @return 是否成功
*/ */
boolean submitApproval(Long id); boolean submitApproval(String id);
/** /**
* 审批通过 * 审批通过
@ -68,7 +68,7 @@ public interface FundRequestService {
* @param comment 审批意见 * @param comment 审批意见
* @return 是否成功 * @return 是否成功
*/ */
boolean approve(Long id, String comment); boolean approve(String id, String comment);
/** /**
* 审批拒绝 * 审批拒绝
@ -77,7 +77,7 @@ public interface FundRequestService {
* @param comment 审批意见 * @param comment 审批意见
* @return 是否成功 * @return 是否成功
*/ */
boolean reject(Long id, String comment); boolean reject(String id, String comment);
/** /**
* 撤回申请 * 撤回申请
@ -85,5 +85,5 @@ public interface FundRequestService {
* @param id 申请ID * @param id 申请ID
* @return 是否成功 * @return 是否成功
*/ */
boolean withdraw(Long id); boolean withdraw(String id);
} }

View File

@ -36,7 +36,7 @@ public class FundRequestServiceImpl implements FundRequestService {
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public Long createRequest(FundRequestDTO dto) { public String createRequest(FundRequestDTO dto) {
FundRequest request = new FundRequest(); FundRequest request = new FundRequest();
request.setRequestNo(generateRequestNo()); request.setRequestNo(generateRequestNo());
request.setTitle(dto.getTitle()); request.setTitle(dto.getTitle());
@ -101,7 +101,7 @@ public class FundRequestServiceImpl implements FundRequestService {
} }
@Override @Override
public FundRequestVO getRequestById(Long id) { public FundRequestVO getRequestById(String id) {
FundRequest request = requestDataService.getById(id); FundRequest request = requestDataService.getById(id);
if (request == null || request.getDeleted() == 1) { if (request == null || request.getDeleted() == 1) {
throw new RuntimeException("用款申请不存在"); throw new RuntimeException("用款申请不存在");
@ -135,7 +135,7 @@ public class FundRequestServiceImpl implements FundRequestService {
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public boolean deleteRequest(Long id) { public boolean deleteRequest(String id) {
LambdaUpdateWrapper<FundRequest> wrapper = new LambdaUpdateWrapper<>(); LambdaUpdateWrapper<FundRequest> wrapper = new LambdaUpdateWrapper<>();
wrapper.eq(FundRequest::getId, id); wrapper.eq(FundRequest::getId, id);
wrapper.set(FundRequest::getDeleted, 1); wrapper.set(FundRequest::getDeleted, 1);
@ -147,7 +147,7 @@ public class FundRequestServiceImpl implements FundRequestService {
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public boolean submitApproval(Long id) { public boolean submitApproval(String id) {
FundRequest request = requestDataService.getById(id); FundRequest request = requestDataService.getById(id);
if (request == null || request.getDeleted() == 1) { if (request == null || request.getDeleted() == 1) {
throw new RuntimeException("用款申请不存在"); throw new RuntimeException("用款申请不存在");
@ -168,7 +168,7 @@ public class FundRequestServiceImpl implements FundRequestService {
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public boolean approve(Long id, String comment) { public boolean approve(String id, String comment) {
FundRequest request = requestDataService.getById(id); FundRequest request = requestDataService.getById(id);
if (request == null || request.getDeleted() == 1) { if (request == null || request.getDeleted() == 1) {
throw new RuntimeException("用款申请不存在"); throw new RuntimeException("用款申请不存在");
@ -191,7 +191,7 @@ public class FundRequestServiceImpl implements FundRequestService {
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public boolean reject(Long id, String comment) { public boolean reject(String id, String comment) {
FundRequest request = requestDataService.getById(id); FundRequest request = requestDataService.getById(id);
if (request == null || request.getDeleted() == 1) { if (request == null || request.getDeleted() == 1) {
throw new RuntimeException("用款申请不存在"); throw new RuntimeException("用款申请不存在");
@ -214,7 +214,7 @@ public class FundRequestServiceImpl implements FundRequestService {
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public boolean withdraw(Long id) { public boolean withdraw(String id) {
FundRequest request = requestDataService.getById(id); FundRequest request = requestDataService.getById(id);
if (request == null || request.getDeleted() == 1) { if (request == null || request.getDeleted() == 1) {
throw new RuntimeException("用款申请不存在"); throw new RuntimeException("用款申请不存在");

View File

@ -8,7 +8,7 @@ import java.time.LocalDateTime;
*/ */
public class FundRequestVO { public class FundRequestVO {
private Long id; private String id;
private String requestNo; private String requestNo;
private String title; private String title;
private BigDecimal amount; private BigDecimal amount;
@ -19,31 +19,31 @@ public class FundRequestVO {
private String payeeBank; private String payeeBank;
private String payeeAccount; private String payeeAccount;
private String purpose; private String purpose;
private Long projectId; private String projectId;
private String projectName; private String projectName;
private Long customerId; private String customerId;
private String customerName; private String customerName;
private LocalDateTime requestDate; private LocalDateTime requestDate;
private LocalDateTime expectedPayDate; private LocalDateTime expectedPayDate;
private Integer approvalStatus; private Integer approvalStatus;
private String approvalStatusName; private String approvalStatusName;
private Integer currentNode; private Integer currentNode;
private Long approverId; private String approverId;
private String approverName; private String approverName;
private LocalDateTime approvalTime; private LocalDateTime approvalTime;
private String approvalComment; private String approvalComment;
private String attachments; private String attachments;
private Long tenantId; private String tenantId;
private Long createdBy; private String createdBy;
private String createdByName; private String createdByName;
private LocalDateTime createdTime; private LocalDateTime createdTime;
private LocalDateTime updatedTime; private LocalDateTime updatedTime;
public Long getId() { public String getId() {
return id; return id;
} }
public void setId(Long id) { public void setId(String id) {
this.id = id; this.id = id;
} }
@ -127,11 +127,11 @@ public class FundRequestVO {
this.purpose = purpose; this.purpose = purpose;
} }
public Long getProjectId() { public String getProjectId() {
return projectId; return projectId;
} }
public void setProjectId(Long projectId) { public void setProjectId(String projectId) {
this.projectId = projectId; this.projectId = projectId;
} }
@ -143,11 +143,11 @@ public class FundRequestVO {
this.projectName = projectName; this.projectName = projectName;
} }
public Long getCustomerId() { public String getCustomerId() {
return customerId; return customerId;
} }
public void setCustomerId(Long customerId) { public void setCustomerId(String customerId) {
this.customerId = customerId; this.customerId = customerId;
} }
@ -199,11 +199,11 @@ public class FundRequestVO {
this.currentNode = currentNode; this.currentNode = currentNode;
} }
public Long getApproverId() { public String getApproverId() {
return approverId; return approverId;
} }
public void setApproverId(Long approverId) { public void setApproverId(String approverId) {
this.approverId = approverId; this.approverId = approverId;
} }
@ -239,19 +239,19 @@ public class FundRequestVO {
this.attachments = attachments; this.attachments = attachments;
} }
public Long getTenantId() { public String getTenantId() {
return tenantId; return tenantId;
} }
public void setTenantId(Long tenantId) { public void setTenantId(String tenantId) {
this.tenantId = tenantId; this.tenantId = tenantId;
} }
public Long getCreatedBy() { public String getCreatedBy() {
return createdBy; return createdBy;
} }
public void setCreatedBy(Long createdBy) { public void setCreatedBy(String createdBy) {
this.createdBy = createdBy; this.createdBy = createdBy;
} }

View File

@ -39,12 +39,12 @@ class AuthServiceImplTest {
@BeforeEach @BeforeEach
void setUp() { void setUp() {
mockUser = new SysUser(); mockUser = new SysUser();
mockUser.setId(1L); mockUser.setId("1");
mockUser.setUsername("testuser"); mockUser.setUsername("testuser");
// MD5("password123") 的值直接使用固定的 MD5 字符串避免调用加密工具 // MD5("password123") 的值直接使用固定的 MD5 字符串避免调用加密工具
mockUser.setPassword("482c811da5d5b4bc6d497ffa98491e38"); mockUser.setPassword("482c811da5d5b4bc6d497ffa98491e38");
mockUser.setStatus(1); mockUser.setStatus(1);
mockUser.setTenantId(100L); mockUser.setTenantId("100");
mockUser.setDeleted(0); mockUser.setDeleted(0);
} }
@ -58,17 +58,17 @@ class AuthServiceImplTest {
when(userDataService.getOne(ArgumentMatchers.<LambdaQueryWrapper<SysUser>>any())) when(userDataService.getOne(ArgumentMatchers.<LambdaQueryWrapper<SysUser>>any()))
.thenReturn(mockUser); .thenReturn(mockUser);
when(tokenService.generateToken(1L, "testuser", 100L)) when(tokenService.generateToken("1", "testuser", "100"))
.thenReturn("mock-token-uuid"); .thenReturn("mock-token-uuid");
LoginVO result = authService.login(request); LoginVO result = authService.login(request);
assertNotNull(result); assertNotNull(result);
assertEquals(1L, result.getUserId()); assertEquals("1", result.getUserId());
assertEquals("testuser", result.getUsername()); assertEquals("testuser", result.getUsername());
assertEquals("mock-token-uuid", result.getToken()); assertEquals("mock-token-uuid", result.getToken());
assertEquals(100L, result.getTenantId()); assertEquals("100", result.getTenantId());
verify(tokenService).generateToken(1L, "testuser", 100L); verify(tokenService).generateToken("1", "testuser", "100");
} }
@Test @Test
@ -83,7 +83,7 @@ class AuthServiceImplTest {
RuntimeException ex = assertThrows(RuntimeException.class, () -> authService.login(request)); RuntimeException ex = assertThrows(RuntimeException.class, () -> authService.login(request));
assertEquals("用户名或密码错误", ex.getMessage()); assertEquals("用户名或密码错误", ex.getMessage());
verify(tokenService, never()).generateToken(anyLong(), anyString(), anyLong()); verify(tokenService, never()).generateToken(anyString(), anyString(), anyString());
} }
@Test @Test
@ -98,7 +98,7 @@ class AuthServiceImplTest {
RuntimeException ex = assertThrows(RuntimeException.class, () -> authService.login(request)); RuntimeException ex = assertThrows(RuntimeException.class, () -> authService.login(request));
assertEquals("用户名或密码错误", ex.getMessage()); assertEquals("用户名或密码错误", ex.getMessage());
verify(tokenService, never()).generateToken(anyLong(), anyString(), anyLong()); verify(tokenService, never()).generateToken(anyString(), anyString(), anyString());
} }
@Test @Test
@ -120,20 +120,20 @@ class AuthServiceImplTest {
@Test @Test
@DisplayName("登出成功 - 清除所有 Token") @DisplayName("登出成功 - 清除所有 Token")
void logout_success() { void logout_success() {
doNothing().when(tokenService).deleteAllUserTokens(1L); doNothing().when(tokenService).deleteAllUserTokens("1");
authService.logout(1L); authService.logout("1");
verify(tokenService).deleteAllUserTokens(1L); verify(tokenService).deleteAllUserTokens("1");
} }
@Test @Test
@DisplayName("刷新 Token 成功") @DisplayName("刷新 Token 成功")
void refreshToken_success() { void refreshToken_success() {
when(userDataService.getById(1L)).thenReturn(mockUser); when(userDataService.getById("1")).thenReturn(mockUser);
when(tokenService.generateToken(1L, "testuser", 100L)).thenReturn("new-token"); when(tokenService.generateToken("1", "testuser", "100")).thenReturn("new-token");
LoginVO result = authService.refreshToken(1L); LoginVO result = authService.refreshToken("1");
assertNotNull(result); assertNotNull(result);
assertEquals("new-token", result.getToken()); assertEquals("new-token", result.getToken());
@ -142,9 +142,9 @@ class AuthServiceImplTest {
@Test @Test
@DisplayName("刷新 Token 失败 - 用户不存在") @DisplayName("刷新 Token 失败 - 用户不存在")
void refreshToken_fail_userNotFound() { void refreshToken_fail_userNotFound() {
when(userDataService.getById(99L)).thenReturn(null); when(userDataService.getById("99")).thenReturn(null);
RuntimeException ex = assertThrows(RuntimeException.class, () -> authService.refreshToken(99L)); RuntimeException ex = assertThrows(RuntimeException.class, () -> authService.refreshToken("99"));
assertEquals("用户不存在", ex.getMessage()); assertEquals("用户不存在", ex.getMessage());
} }
@ -152,9 +152,9 @@ class AuthServiceImplTest {
@DisplayName("刷新 Token 失败 - 用户已被禁用") @DisplayName("刷新 Token 失败 - 用户已被禁用")
void refreshToken_fail_userDisabled() { void refreshToken_fail_userDisabled() {
mockUser.setStatus(0); mockUser.setStatus(0);
when(userDataService.getById(1L)).thenReturn(mockUser); when(userDataService.getById("1")).thenReturn(mockUser);
RuntimeException ex = assertThrows(RuntimeException.class, () -> authService.refreshToken(1L)); RuntimeException ex = assertThrows(RuntimeException.class, () -> authService.refreshToken("1"));
assertEquals("用户已被禁用", ex.getMessage()); assertEquals("用户已被禁用", ex.getMessage());
} }
@ -164,12 +164,12 @@ class AuthServiceImplTest {
mockUser.setRealName("测试用户"); mockUser.setRealName("测试用户");
mockUser.setPhone("13800138000"); mockUser.setPhone("13800138000");
mockUser.setEmail("test@example.com"); mockUser.setEmail("test@example.com");
when(userDataService.getById(1L)).thenReturn(mockUser); when(userDataService.getById("1")).thenReturn(mockUser);
UserVO result = authService.getUserInfo(1L); UserVO result = authService.getUserInfo("1");
assertNotNull(result); assertNotNull(result);
assertEquals(1L, result.getId()); assertEquals("1", result.getId());
assertEquals("testuser", result.getUsername()); assertEquals("testuser", result.getUsername());
assertEquals("测试用户", result.getRealName()); assertEquals("测试用户", result.getRealName());
} }
@ -177,9 +177,9 @@ class AuthServiceImplTest {
@Test @Test
@DisplayName("获取用户信息失败 - 用户不存在") @DisplayName("获取用户信息失败 - 用户不存在")
void getUserInfo_fail_userNotFound() { void getUserInfo_fail_userNotFound() {
when(userDataService.getById(99L)).thenReturn(null); when(userDataService.getById("99")).thenReturn(null);
RuntimeException ex = assertThrows(RuntimeException.class, () -> authService.getUserInfo(99L)); RuntimeException ex = assertThrows(RuntimeException.class, () -> authService.getUserInfo("99"));
assertEquals("用户不存在", ex.getMessage()); assertEquals("用户不存在", ex.getMessage());
} }
} }

View File

@ -49,14 +49,14 @@ class RoleServiceImplTest {
@BeforeEach @BeforeEach
void setUp() { void setUp() {
mockRole = new SysRole(); mockRole = new SysRole();
mockRole.setId(1L); mockRole.setId("1");
mockRole.setRoleCode("ADMIN"); mockRole.setRoleCode("ADMIN");
mockRole.setRoleName("管理员"); mockRole.setRoleName("管理员");
mockRole.setDataScope(1); mockRole.setDataScope(1);
mockRole.setStatus(1); mockRole.setStatus(1);
mockRole.setSortOrder(1); mockRole.setSortOrder(1);
mockRole.setDeleted(0); mockRole.setDeleted(0);
mockRole.setTenantId(100L); mockRole.setTenantId("100");
} }
// ==================== createRole ==================== // ==================== createRole ====================
@ -111,12 +111,12 @@ class RoleServiceImplTest {
@DisplayName("更新角色成功") @DisplayName("更新角色成功")
void updateRole_success() { void updateRole_success() {
RoleDTO dto = new RoleDTO(); RoleDTO dto = new RoleDTO();
dto.setId(1L); dto.setId("1");
dto.setRoleName("超级管理员"); dto.setRoleName("超级管理员");
dto.setDataScope(1); dto.setDataScope(1);
dto.setStatus(1); dto.setStatus(1);
when(roleDataService.getById(1L)).thenReturn(mockRole); when(roleDataService.getById("1")).thenReturn(mockRole);
when(roleDataService.updateById(any(SysRole.class))).thenReturn(true); when(roleDataService.updateById(any(SysRole.class))).thenReturn(true);
boolean result = roleService.updateRole(dto); boolean result = roleService.updateRole(dto);
@ -139,10 +139,10 @@ class RoleServiceImplTest {
@DisplayName("更新角色失败 - 角色不存在") @DisplayName("更新角色失败 - 角色不存在")
void updateRole_fail_notFound() { void updateRole_fail_notFound() {
RoleDTO dto = new RoleDTO(); RoleDTO dto = new RoleDTO();
dto.setId(99L); dto.setId("1");
dto.setRoleName("不存在的角色"); dto.setRoleName("不存在的角色");
when(roleDataService.getById(99L)).thenReturn(null); when(roleDataService.getById("1")).thenReturn(null);
RuntimeException ex = assertThrows(RuntimeException.class, () -> roleService.updateRole(dto)); RuntimeException ex = assertThrows(RuntimeException.class, () -> roleService.updateRole(dto));
assertEquals("角色不存在", ex.getMessage()); assertEquals("角色不存在", ex.getMessage());
@ -153,10 +153,10 @@ class RoleServiceImplTest {
void updateRole_fail_deleted() { void updateRole_fail_deleted() {
mockRole.setDeleted(1); mockRole.setDeleted(1);
RoleDTO dto = new RoleDTO(); RoleDTO dto = new RoleDTO();
dto.setId(1L); dto.setId("1");
dto.setRoleName("已删除角色"); dto.setRoleName("已删除角色");
when(roleDataService.getById(1L)).thenReturn(mockRole); when(roleDataService.getById("1")).thenReturn(mockRole);
RuntimeException ex = assertThrows(RuntimeException.class, () -> roleService.updateRole(dto)); RuntimeException ex = assertThrows(RuntimeException.class, () -> roleService.updateRole(dto));
assertEquals("角色不存在", ex.getMessage()); assertEquals("角色不存在", ex.getMessage());
@ -167,12 +167,12 @@ class RoleServiceImplTest {
@Test @Test
@DisplayName("根据ID查询角色成功") @DisplayName("根据ID查询角色成功")
void getRoleById_success() { void getRoleById_success() {
when(roleDataService.getById(1L)).thenReturn(mockRole); when(roleDataService.getById("1")).thenReturn(mockRole);
RoleVO vo = roleService.getRoleById(1L); RoleVO vo = roleService.getRoleById("1");
assertNotNull(vo); assertNotNull(vo);
assertEquals(1L, vo.getId()); assertEquals("1", vo.getId());
assertEquals("ADMIN", vo.getRoleCode()); assertEquals("ADMIN", vo.getRoleCode());
assertEquals("管理员", vo.getRoleName()); assertEquals("管理员", vo.getRoleName());
assertEquals("全部数据", vo.getDataScopeName()); assertEquals("全部数据", vo.getDataScopeName());
@ -181,9 +181,9 @@ class RoleServiceImplTest {
@Test @Test
@DisplayName("根据ID查询角色失败 - 不存在") @DisplayName("根据ID查询角色失败 - 不存在")
void getRoleById_fail_notFound() { void getRoleById_fail_notFound() {
when(roleDataService.getById(99L)).thenReturn(null); when(roleDataService.getById("1")).thenReturn(null);
RuntimeException ex = assertThrows(RuntimeException.class, () -> roleService.getRoleById(99L)); RuntimeException ex = assertThrows(RuntimeException.class, () -> roleService.getRoleById("1"));
assertEquals("角色不存在", ex.getMessage()); assertEquals("角色不存在", ex.getMessage());
} }
@ -191,9 +191,9 @@ class RoleServiceImplTest {
@DisplayName("根据ID查询角色失败 - 已删除") @DisplayName("根据ID查询角色失败 - 已删除")
void getRoleById_fail_deleted() { void getRoleById_fail_deleted() {
mockRole.setDeleted(1); mockRole.setDeleted(1);
when(roleDataService.getById(1L)).thenReturn(mockRole); when(roleDataService.getById("1")).thenReturn(mockRole);
RuntimeException ex = assertThrows(RuntimeException.class, () -> roleService.getRoleById(1L)); RuntimeException ex = assertThrows(RuntimeException.class, () -> roleService.getRoleById("1"));
assertEquals("角色不存在", ex.getMessage()); assertEquals("角色不存在", ex.getMessage());
} }
@ -265,7 +265,7 @@ class RoleServiceImplTest {
void deleteRole_success() { void deleteRole_success() {
when(roleDataService.update(ArgumentMatchers.<LambdaUpdateWrapper<SysRole>>any())).thenReturn(true); when(roleDataService.update(ArgumentMatchers.<LambdaUpdateWrapper<SysRole>>any())).thenReturn(true);
boolean result = roleService.deleteRole(1L); boolean result = roleService.deleteRole("1");
assertTrue(result); assertTrue(result);
} }
@ -277,7 +277,7 @@ class RoleServiceImplTest {
void updateStatus_success() { void updateStatus_success() {
when(roleDataService.update(ArgumentMatchers.<LambdaUpdateWrapper<SysRole>>any())).thenReturn(true); when(roleDataService.update(ArgumentMatchers.<LambdaUpdateWrapper<SysRole>>any())).thenReturn(true);
boolean result = roleService.updateStatus(1L, 0); boolean result = roleService.updateStatus("1", 0);
assertTrue(result); assertTrue(result);
} }
@ -293,9 +293,9 @@ class RoleServiceImplTest {
for (int i = 0; i < scopes.length; i++) { for (int i = 0; i < scopes.length; i++) {
mockRole.setDataScope(scopes[i]); mockRole.setDataScope(scopes[i]);
mockRole.setDeleted(0); mockRole.setDeleted(0);
when(roleDataService.getById((long) (i + 10))).thenReturn(mockRole); when(roleDataService.getById(String.valueOf(i + 10))).thenReturn(mockRole);
RoleVO vo = roleService.getRoleById((long) (i + 10)); RoleVO vo = roleService.getRoleById(String.valueOf(i + 10));
assertEquals(names[i], vo.getDataScopeName(), "dataScope=" + scopes[i] + " 的名称应为 " + names[i]); assertEquals(names[i], vo.getDataScopeName(), "dataScope=" + scopes[i] + " 的名称应为 " + names[i]);
} }
} }
@ -304,9 +304,9 @@ class RoleServiceImplTest {
@DisplayName("数据范围名称转换 - 未知值返回空字符串") @DisplayName("数据范围名称转换 - 未知值返回空字符串")
void getRoleById_unknownDataScope() { void getRoleById_unknownDataScope() {
mockRole.setDataScope(99); mockRole.setDataScope(99);
when(roleDataService.getById(1L)).thenReturn(mockRole); when(roleDataService.getById("1")).thenReturn(mockRole);
RoleVO vo = roleService.getRoleById(1L); RoleVO vo = roleService.getRoleById("1");
assertEquals("", vo.getDataScopeName()); assertEquals("", vo.getDataScopeName());
} }
} }

View File

@ -52,10 +52,10 @@ class TenantServiceImplTest {
@BeforeEach @BeforeEach
void setUp() { void setUp() {
// 设置 UserContextHolderTenantServiceImpl 调用 UserContextHolder.getUserId() // 设置 UserContextHolderTenantServiceImpl 调用 UserContextHolder.getUserId()
UserContextHolder.setUserId(1L); UserContextHolder.setUserId("1");
mockTenant = new SysTenant(); mockTenant = new SysTenant();
mockTenant.setId(1L); mockTenant.setId("1");
mockTenant.setTenantCode("TENANT001"); mockTenant.setTenantCode("TENANT001");
mockTenant.setTenantName("测试租户"); mockTenant.setTenantName("测试租户");
mockTenant.setContact("张三"); mockTenant.setContact("张三");
@ -125,13 +125,13 @@ class TenantServiceImplTest {
@DisplayName("更新租户成功") @DisplayName("更新租户成功")
void updateTenant_success() { void updateTenant_success() {
TenantDTO dto = new TenantDTO(); TenantDTO dto = new TenantDTO();
dto.setId(1L); dto.setId("1");
dto.setTenantCode("TENANT001"); // 编码不变 dto.setTenantCode("TENANT001"); // 编码不变
dto.setTenantName("更新的租户名"); dto.setTenantName("更新的租户名");
dto.setContact("李四"); dto.setContact("李四");
dto.setStatus(1); dto.setStatus(1);
when(tenantDataService.getById(1L)).thenReturn(mockTenant); when(tenantDataService.getById("1")).thenReturn(mockTenant);
when(tenantDataService.updateById(any(SysTenant.class))).thenReturn(true); when(tenantDataService.updateById(any(SysTenant.class))).thenReturn(true);
boolean result = tenantService.updateTenant(dto); boolean result = tenantService.updateTenant(dto);
@ -153,11 +153,11 @@ class TenantServiceImplTest {
@DisplayName("更新租户失败 - 租户不存在") @DisplayName("更新租户失败 - 租户不存在")
void updateTenant_fail_notFound() { void updateTenant_fail_notFound() {
TenantDTO dto = new TenantDTO(); TenantDTO dto = new TenantDTO();
dto.setId(99L); dto.setId("99");
dto.setTenantCode("XXXX"); dto.setTenantCode("XXXX");
dto.setTenantName("不存在"); dto.setTenantName("不存在");
when(tenantDataService.getById(99L)).thenReturn(null); when(tenantDataService.getById("99")).thenReturn(null);
RuntimeException ex = assertThrows(RuntimeException.class, () -> tenantService.updateTenant(dto)); RuntimeException ex = assertThrows(RuntimeException.class, () -> tenantService.updateTenant(dto));
assertEquals("租户不存在", ex.getMessage()); assertEquals("租户不存在", ex.getMessage());
@ -168,11 +168,11 @@ class TenantServiceImplTest {
void updateTenant_fail_deleted() { void updateTenant_fail_deleted() {
mockTenant.setDeleted(1); mockTenant.setDeleted(1);
TenantDTO dto = new TenantDTO(); TenantDTO dto = new TenantDTO();
dto.setId(1L); dto.setId("1");
dto.setTenantCode("TENANT001"); dto.setTenantCode("TENANT001");
dto.setTenantName("已删除租户"); dto.setTenantName("已删除租户");
when(tenantDataService.getById(1L)).thenReturn(mockTenant); when(tenantDataService.getById("1")).thenReturn(mockTenant);
RuntimeException ex = assertThrows(RuntimeException.class, () -> tenantService.updateTenant(dto)); RuntimeException ex = assertThrows(RuntimeException.class, () -> tenantService.updateTenant(dto));
assertEquals("租户不存在", ex.getMessage()); assertEquals("租户不存在", ex.getMessage());
@ -182,11 +182,11 @@ class TenantServiceImplTest {
@DisplayName("更新租户失败 - 更换编码时新编码已被占用") @DisplayName("更新租户失败 - 更换编码时新编码已被占用")
void updateTenant_fail_newCodeExists() { void updateTenant_fail_newCodeExists() {
TenantDTO dto = new TenantDTO(); TenantDTO dto = new TenantDTO();
dto.setId(1L); dto.setId("1");
dto.setTenantCode("EXISTING_CODE"); dto.setTenantCode("EXISTING_CODE");
dto.setTenantName("修改编码的租户"); dto.setTenantName("修改编码的租户");
when(tenantDataService.getById(1L)).thenReturn(mockTenant); when(tenantDataService.getById("1")).thenReturn(mockTenant);
when(tenantDataService.count(ArgumentMatchers.<LambdaQueryWrapper<SysTenant>>any())).thenReturn(1L); when(tenantDataService.count(ArgumentMatchers.<LambdaQueryWrapper<SysTenant>>any())).thenReturn(1L);
RuntimeException ex = assertThrows(RuntimeException.class, () -> tenantService.updateTenant(dto)); RuntimeException ex = assertThrows(RuntimeException.class, () -> tenantService.updateTenant(dto));
@ -198,12 +198,12 @@ class TenantServiceImplTest {
@Test @Test
@DisplayName("根据ID查询租户成功") @DisplayName("根据ID查询租户成功")
void getTenantById_success() { void getTenantById_success() {
when(tenantDataService.getById(1L)).thenReturn(mockTenant); when(tenantDataService.getById("1")).thenReturn(mockTenant);
TenantVO vo = tenantService.getTenantById(1L); TenantVO vo = tenantService.getTenantById("1");
assertNotNull(vo); assertNotNull(vo);
assertEquals(1L, vo.getId()); assertEquals("1", vo.getId());
assertEquals("TENANT001", vo.getTenantCode()); assertEquals("TENANT001", vo.getTenantCode());
assertEquals("测试租户", vo.getTenantName()); assertEquals("测试租户", vo.getTenantName());
assertEquals("启用", vo.getStatusName()); assertEquals("启用", vo.getStatusName());
@ -213,9 +213,9 @@ class TenantServiceImplTest {
@DisplayName("根据ID查询租户 - 禁用状态名称为\"禁用\"") @DisplayName("根据ID查询租户 - 禁用状态名称为\"禁用\"")
void getTenantById_disabled_statusName() { void getTenantById_disabled_statusName() {
mockTenant.setStatus(0); mockTenant.setStatus(0);
when(tenantDataService.getById(1L)).thenReturn(mockTenant); when(tenantDataService.getById("1")).thenReturn(mockTenant);
TenantVO vo = tenantService.getTenantById(1L); TenantVO vo = tenantService.getTenantById("1");
assertEquals("禁用", vo.getStatusName()); assertEquals("禁用", vo.getStatusName());
} }
@ -223,9 +223,9 @@ class TenantServiceImplTest {
@Test @Test
@DisplayName("根据ID查询租户失败 - 不存在") @DisplayName("根据ID查询租户失败 - 不存在")
void getTenantById_fail_notFound() { void getTenantById_fail_notFound() {
when(tenantDataService.getById(99L)).thenReturn(null); when(tenantDataService.getById("99")).thenReturn(null);
RuntimeException ex = assertThrows(RuntimeException.class, () -> tenantService.getTenantById(99L)); RuntimeException ex = assertThrows(RuntimeException.class, () -> tenantService.getTenantById("99"));
assertEquals("租户不存在", ex.getMessage()); assertEquals("租户不存在", ex.getMessage());
} }
@ -233,9 +233,9 @@ class TenantServiceImplTest {
@DisplayName("根据ID查询租户失败 - 已删除") @DisplayName("根据ID查询租户失败 - 已删除")
void getTenantById_fail_deleted() { void getTenantById_fail_deleted() {
mockTenant.setDeleted(1); mockTenant.setDeleted(1);
when(tenantDataService.getById(1L)).thenReturn(mockTenant); when(tenantDataService.getById("1")).thenReturn(mockTenant);
RuntimeException ex = assertThrows(RuntimeException.class, () -> tenantService.getTenantById(1L)); RuntimeException ex = assertThrows(RuntimeException.class, () -> tenantService.getTenantById("1"));
assertEquals("租户不存在", ex.getMessage()); assertEquals("租户不存在", ex.getMessage());
} }
@ -277,10 +277,10 @@ class TenantServiceImplTest {
@Test @Test
@DisplayName("删除租户成功") @DisplayName("删除租户成功")
void deleteTenant_success() { void deleteTenant_success() {
when(tenantDataService.getById(1L)).thenReturn(mockTenant); when(tenantDataService.getById("1")).thenReturn(mockTenant);
when(tenantDataService.update(ArgumentMatchers.<LambdaUpdateWrapper<SysTenant>>any())).thenReturn(true); when(tenantDataService.update(ArgumentMatchers.<LambdaUpdateWrapper<SysTenant>>any())).thenReturn(true);
boolean result = tenantService.deleteTenant(1L); boolean result = tenantService.deleteTenant("1");
assertTrue(result); assertTrue(result);
} }
@ -288,9 +288,9 @@ class TenantServiceImplTest {
@Test @Test
@DisplayName("删除租户失败 - 租户不存在") @DisplayName("删除租户失败 - 租户不存在")
void deleteTenant_fail_notFound() { void deleteTenant_fail_notFound() {
when(tenantDataService.getById(99L)).thenReturn(null); when(tenantDataService.getById("99")).thenReturn(null);
RuntimeException ex = assertThrows(RuntimeException.class, () -> tenantService.deleteTenant(99L)); RuntimeException ex = assertThrows(RuntimeException.class, () -> tenantService.deleteTenant("99"));
assertEquals("租户不存在", ex.getMessage()); assertEquals("租户不存在", ex.getMessage());
} }
@ -298,9 +298,9 @@ class TenantServiceImplTest {
@DisplayName("删除租户失败 - 不允许删除默认租户") @DisplayName("删除租户失败 - 不允许删除默认租户")
void deleteTenant_fail_defaultTenant() { void deleteTenant_fail_defaultTenant() {
mockTenant.setTenantCode("DEFAULT"); mockTenant.setTenantCode("DEFAULT");
when(tenantDataService.getById(1L)).thenReturn(mockTenant); when(tenantDataService.getById("1")).thenReturn(mockTenant);
RuntimeException ex = assertThrows(RuntimeException.class, () -> tenantService.deleteTenant(1L)); RuntimeException ex = assertThrows(RuntimeException.class, () -> tenantService.deleteTenant("1"));
assertEquals("默认租户不能删除", ex.getMessage()); assertEquals("默认租户不能删除", ex.getMessage());
} }
@ -308,9 +308,9 @@ class TenantServiceImplTest {
@DisplayName("删除租户失败 - 已删除的租户") @DisplayName("删除租户失败 - 已删除的租户")
void deleteTenant_fail_alreadyDeleted() { void deleteTenant_fail_alreadyDeleted() {
mockTenant.setDeleted(1); mockTenant.setDeleted(1);
when(tenantDataService.getById(1L)).thenReturn(mockTenant); when(tenantDataService.getById("1")).thenReturn(mockTenant);
RuntimeException ex = assertThrows(RuntimeException.class, () -> tenantService.deleteTenant(1L)); RuntimeException ex = assertThrows(RuntimeException.class, () -> tenantService.deleteTenant("1"));
assertEquals("租户不存在", ex.getMessage()); assertEquals("租户不存在", ex.getMessage());
} }
@ -319,10 +319,10 @@ class TenantServiceImplTest {
@Test @Test
@DisplayName("更新租户状态成功") @DisplayName("更新租户状态成功")
void updateStatus_success() { void updateStatus_success() {
when(tenantDataService.getById(1L)).thenReturn(mockTenant); when(tenantDataService.getById("1")).thenReturn(mockTenant);
when(tenantDataService.update(ArgumentMatchers.<LambdaUpdateWrapper<SysTenant>>any())).thenReturn(true); when(tenantDataService.update(ArgumentMatchers.<LambdaUpdateWrapper<SysTenant>>any())).thenReturn(true);
boolean result = tenantService.updateStatus(1L, 0); boolean result = tenantService.updateStatus("1", 0);
assertTrue(result); assertTrue(result);
} }
@ -330,9 +330,9 @@ class TenantServiceImplTest {
@Test @Test
@DisplayName("更新租户状态失败 - 租户不存在") @DisplayName("更新租户状态失败 - 租户不存在")
void updateStatus_fail_notFound() { void updateStatus_fail_notFound() {
when(tenantDataService.getById(99L)).thenReturn(null); when(tenantDataService.getById("99")).thenReturn(null);
RuntimeException ex = assertThrows(RuntimeException.class, () -> tenantService.updateStatus(99L, 0)); RuntimeException ex = assertThrows(RuntimeException.class, () -> tenantService.updateStatus("99", 0));
assertEquals("租户不存在", ex.getMessage()); assertEquals("租户不存在", ex.getMessage());
} }
@ -340,9 +340,9 @@ class TenantServiceImplTest {
@DisplayName("更新租户状态失败 - 已删除的租户") @DisplayName("更新租户状态失败 - 已删除的租户")
void updateStatus_fail_deleted() { void updateStatus_fail_deleted() {
mockTenant.setDeleted(1); mockTenant.setDeleted(1);
when(tenantDataService.getById(1L)).thenReturn(mockTenant); when(tenantDataService.getById("1")).thenReturn(mockTenant);
RuntimeException ex = assertThrows(RuntimeException.class, () -> tenantService.updateStatus(1L, 0)); RuntimeException ex = assertThrows(RuntimeException.class, () -> tenantService.updateStatus("1", 0));
assertEquals("租户不存在", ex.getMessage()); assertEquals("租户不存在", ex.getMessage());
} }
} }

75
start-services.sh Executable file
View File

@ -0,0 +1,75 @@
#!/bin/bash
# 资金服务平台 - 服务启动脚本
# 使用 Maven spring-boot:run 启动各个微服务
# 设置环境变量
export MAVEN_HOME=/home/along/MyApp/apache-maven-3.9.9
export PATH=$MAVEN_HOME/bin:$PATH
export JAVA_HOME=/home/along/MyApp/jdk-21.0.7
export PATH=$JAVA_HOME/bin:$PATH
# 项目根目录
PROJECT_DIR="/home/along/MyCode/wjbl/fundplatform"
LOG_DIR="/tmp/fundplatform-logs"
# 创建日志目录
mkdir -p $LOG_DIR
echo "========================================="
echo "资金服务平台 - 启动所有服务"
echo "========================================="
cd $PROJECT_DIR
# 服务列表(按启动顺序)
SERVICES=(
"fund-sys:8100"
"fund-gateway:9000"
"fund-cust:8200"
"fund-proj:8300"
"fund-req:8400"
"fund-exp:8500"
"fund-receipt:8600"
"fund-report:8700"
"fund-file:8800"
)
# 启动服务函数
start_service() {
local service_module=$1
local service_port=$2
echo "启动服务: $service_module (端口: $service_port)"
nohup mvn spring-boot:run -pl $service_module -am \
> $LOG_DIR/$service_module.log 2>&1 &
echo " PID: $!"
echo " 日志: $LOG_DIR/$service_module.log"
# 等待一小段时间让服务开始启动
sleep 3
}
# 启动所有服务
for service in "${SERVICES[@]}"; do
IFS=':' read -r module port <<< "$service"
start_service "$module" "$port"
done
echo ""
echo "========================================="
echo "所有服务已开始启动"
echo "========================================="
echo "日志目录: $LOG_DIR"
echo ""
echo "检查服务状态:"
echo " ps aux | grep 'spring-boot:run'"
echo ""
echo "查看服务日志:"
echo " tail -f $LOG_DIR/fund-sys.log"
echo ""
echo "访问 Nacos 控制台查看服务注册状态:"
echo " http://localhost:8048"
echo "========================================="