|
@@ -120,16 +120,16 @@ public class MerchantSubaccountApplicationService {
|
|
|
throw error("merchant.subaccount.request.required");
|
|
throw error("merchant.subaccount.request.required");
|
|
|
}
|
|
}
|
|
|
String phone = normalizePhone(request.getPhone());
|
|
String phone = normalizePhone(request.getPhone());
|
|
|
- String name = normalizeRequired(request.getName(), "merchant.subaccount.name.required");
|
|
|
|
|
|
|
+ String userName = normalizeRequired(request.getUserName(), "merchant.subaccount.username.required");
|
|
|
|
|
+ String name = firstNonBlank(request.getName(), userName).strip();
|
|
|
String password = normalizeRequired(request.getPassword(), "merchant.subaccount.password.required");
|
|
String password = normalizeRequired(request.getPassword(), "merchant.subaccount.password.required");
|
|
|
List<Long> storeIds = validateStores(ownerUserId, request.getStoreIds());
|
|
List<Long> storeIds = validateStores(ownerUserId, request.getStoreIds());
|
|
|
- if (infoUserService.getinfouserName(phone) != null) {
|
|
|
|
|
- throw error("merchant.subaccount.phone.exists");
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ requireUniqueUserName(userName, null);
|
|
|
businessPhoneService.ensureUnique(phone, null);
|
|
businessPhoneService.ensureUnique(phone, null);
|
|
|
|
|
|
|
|
InfoUser user = new InfoUser();
|
|
InfoUser user = new InfoUser();
|
|
|
- user.setUserName(phone);
|
|
|
|
|
|
|
+ // 用户名用于登录,手机号仅用于联系,不能再把手机号覆盖到登录名。
|
|
|
|
|
+ user.setUserName(userName);
|
|
|
user.setTelPhone(phone);
|
|
user.setTelPhone(phone);
|
|
|
user.setNickName(name);
|
|
user.setNickName(name);
|
|
|
user.setPassword(password);
|
|
user.setPassword(password);
|
|
@@ -154,17 +154,27 @@ public class MerchantSubaccountApplicationService {
|
|
|
if (request == null) {
|
|
if (request == null) {
|
|
|
throw error("merchant.subaccount.request.required");
|
|
throw error("merchant.subaccount.request.required");
|
|
|
}
|
|
}
|
|
|
- String name = normalizeRequired(request.getName(), "merchant.subaccount.name.required");
|
|
|
|
|
|
|
+ // 未传用户名时保留原值,兼容仅调整授权门店;存量账号可由主账号明确改名。
|
|
|
|
|
+ String userName = request.getUserName() == null ? target.getUserName()
|
|
|
|
|
+ : normalizeRequired(request.getUserName(), "merchant.subaccount.username.required");
|
|
|
|
|
+ if (request.getUserName() != null) requireUniqueUserName(userName, target.getUserId());
|
|
|
|
|
+ boolean renamed = !Objects.equals(userName, target.getUserName());
|
|
|
|
|
+ String name = request.getName() == null ? target.getNickName()
|
|
|
|
|
+ : normalizeRequired(request.getName(), "merchant.subaccount.name.required");
|
|
|
List<Long> storeIds = validateStores(ownerUserId, request.getStoreIds());
|
|
List<Long> storeIds = validateStores(ownerUserId, request.getStoreIds());
|
|
|
|
|
|
|
|
InfoUser update = new InfoUser();
|
|
InfoUser update = new InfoUser();
|
|
|
update.setUserId(target.getUserId());
|
|
update.setUserId(target.getUserId());
|
|
|
|
|
+ update.setUserName(userName);
|
|
|
update.setNickName(name);
|
|
update.setNickName(name);
|
|
|
if (infoUserService.updateInfoUser(update) != 1) {
|
|
if (infoUserService.updateInfoUser(update) != 1) {
|
|
|
throw error("merchant.subaccount.update.failed");
|
|
throw error("merchant.subaccount.update.failed");
|
|
|
}
|
|
}
|
|
|
relationService.replaceRelations(target.getUserId(), storeIds);
|
|
relationService.replaceRelations(target.getUserId(), storeIds);
|
|
|
|
|
+ target.setUserName(userName);
|
|
|
target.setNickName(name);
|
|
target.setNickName(name);
|
|
|
|
|
+ // 改名后撤销旧会话,下一次登录必须使用新用户名和原密码。
|
|
|
|
|
+ if (renamed) tokenSessionService.revokeAll(target.getUserId());
|
|
|
return toView(target, ownerUserId);
|
|
return toView(target, ownerUserId);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -228,6 +238,7 @@ public class MerchantSubaccountApplicationService {
|
|
|
private MerchantSubaccountView toView(InfoUser user, Long ownerUserId) {
|
|
private MerchantSubaccountView toView(InfoUser user, Long ownerUserId) {
|
|
|
MerchantSubaccountView view = new MerchantSubaccountView();
|
|
MerchantSubaccountView view = new MerchantSubaccountView();
|
|
|
view.setUserId(user.getUserId());
|
|
view.setUserId(user.getUserId());
|
|
|
|
|
+ view.setUserName(user.getUserName());
|
|
|
view.setName(firstNonBlank(user.getNickName(), user.getFullName(), user.getUserName()));
|
|
view.setName(firstNonBlank(user.getNickName(), user.getFullName(), user.getUserName()));
|
|
|
view.setPhone(user.getTelPhone());
|
|
view.setPhone(user.getTelPhone());
|
|
|
view.setMerchantOwnerId(ownerUserId);
|
|
view.setMerchantOwnerId(ownerUserId);
|
|
@@ -291,6 +302,14 @@ public class MerchantSubaccountApplicationService {
|
|
|
return request.getEnabled();
|
|
return request.getEnabled();
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ /** 与主账号共用用户名空间,编辑时允许保留本人的用户名。 */
|
|
|
|
|
+ private void requireUniqueUserName(String userName, Long excludeUserId) {
|
|
|
|
|
+ InfoUser existing = infoUserService.getinfouserName(userName);
|
|
|
|
|
+ if (existing != null && !Objects.equals(existing.getUserId(), excludeUserId)) {
|
|
|
|
|
+ throw error("merchant.subaccount.username.exists");
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
private String normalizePhone(String value) {
|
|
private String normalizePhone(String value) {
|
|
|
String phone = normalizeRequired(value, "merchant.subaccount.phone.required")
|
|
String phone = normalizeRequired(value, "merchant.subaccount.phone.required")
|
|
|
.replaceAll("\\s+", "");
|
|
.replaceAll("\\s+", "");
|