diff --git a/src/main/java/au/com/royalpay/payment/manage/mappers/system/ClientAccountMapper.java b/src/main/java/au/com/royalpay/payment/manage/mappers/system/ClientAccountMapper.java index f8e8db188..60542974a 100644 --- a/src/main/java/au/com/royalpay/payment/manage/mappers/system/ClientAccountMapper.java +++ b/src/main/java/au/com/royalpay/payment/manage/mappers/system/ClientAccountMapper.java @@ -76,4 +76,6 @@ public interface ClientAccountMapper { List listNullUnionIdAccounts(); List query(JSONObject params); + + List partnerAndSubPartnerAccounts(@Param("client_id") int clientId); } diff --git a/src/main/java/au/com/royalpay/payment/manage/mappers/system/ManagerMapper.java b/src/main/java/au/com/royalpay/payment/manage/mappers/system/ManagerMapper.java index 8881b2a62..5f3af081a 100644 --- a/src/main/java/au/com/royalpay/payment/manage/mappers/system/ManagerMapper.java +++ b/src/main/java/au/com/royalpay/payment/manage/mappers/system/ManagerMapper.java @@ -8,6 +8,7 @@ import com.alibaba.fastjson.JSONObject; import com.github.miemiedev.mybatis.paginator.domain.PageBounds; import com.github.miemiedev.mybatis.paginator.domain.PageList; import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; import java.util.List; @@ -63,4 +64,7 @@ public interface ManagerMapper { List listOpenIdByRole(@Param("mask") int mask); List listServants(@Param("mask") int mask); + + @Select("select email from sys_managers where is_valid=1 AND role & 256 > 0 AND email IS NOT NULL") + List listDevManager(); } diff --git a/src/main/java/au/com/royalpay/payment/manage/merchants/core/ClientManager.java b/src/main/java/au/com/royalpay/payment/manage/merchants/core/ClientManager.java index b3ae0f094..368785663 100644 --- a/src/main/java/au/com/royalpay/payment/manage/merchants/core/ClientManager.java +++ b/src/main/java/au/com/royalpay/payment/manage/merchants/core/ClientManager.java @@ -328,4 +328,6 @@ public interface ClientManager { void switchHfLink(JSONObject manager, String clientMoniker,boolean allow); void sendHfEmailNotice(JSONObject order); + + void updateAllPartnerPassword(String clientMoniker, List emails); } diff --git a/src/main/java/au/com/royalpay/payment/manage/merchants/core/impls/ClientManagerImpl.java b/src/main/java/au/com/royalpay/payment/manage/merchants/core/impls/ClientManagerImpl.java index 97a9ed3da..e0b1a47da 100644 --- a/src/main/java/au/com/royalpay/payment/manage/merchants/core/impls/ClientManagerImpl.java +++ b/src/main/java/au/com/royalpay/payment/manage/merchants/core/impls/ClientManagerImpl.java @@ -886,7 +886,7 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid if (StringUtils.isEmpty(client.getString("sub_merchant_id"))) { throw new BadRequestException("Sub Merchant ID Can't be null "); } - String username = clientMoniker + client.getString("sub_merchant_id"); + String username = clientMoniker; boolean duplicated = true; String pwd = RandomStringUtils.random(8, true, true); while (duplicated) { @@ -899,7 +899,7 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid newAccount(clientMoniker, account, manager, 1); duplicated = false; } catch (Exception e) { - username += "1"; + username += "0"; } } sendInitEmail(client, username, pwd); @@ -959,9 +959,12 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid ctx.setVariable("client_moniker", client.getString("client_moniker")); ctx.setVariable("contact_person", client.getString("contact_person")); ctx.setVariable("credential_code", client.getString("credential_code")); + final String content = thymeleaf.process("mail/new_client_notice", ctx); // final String content = VelocityEngineUtils.mergeTemplateIntoString(null, "mail/new_client_notice.vm", // "utf-8", model); + ctx.setVariable("password", "*****"); + final String contentBd = thymeleaf.process("mail/new_client_notice", ctx); final String mailTo = client.getString("contact_email"); if (StringUtils.isEmpty(mailTo)) { throw new EmailException("Client Contact Email is invalid"); @@ -977,8 +980,9 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid @Override public void run() { try { - String emailId = mailService.sendEmail("Your RoyalPay Cross-border Payment has been set up", mailTo, - emails.isEmpty() ? "" : StringUtils.join(emails, ","), content); + String emailId = mailService.sendEmail("Your RoyalPay Cross-border Payment has been set up", mailTo, "", content); + mailService.sendEmail("Your RoyalPay Cross-border Payment has been set up", emails.isEmpty() ? "" : StringUtils.join(emails, ","), + "", contentBd); JSONObject clientUpdate = new JSONObject(); clientUpdate.put("client_id", client.getIntValue("client_id")); clientUpdate.put("approve_email_send", 3); @@ -3775,16 +3779,41 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid ctx.setVariable("amount", order.getString("total_amount")); ctx.setVariable("time", order.getString("create_time")); final String content = thymeleaf.process( "mail/hf_email_notice", ctx); - + final String mailTo = client.getString("contact_email"); + if (StringUtils.isEmpty(mailTo)) { + throw new EmailException("Client Contact Email is invalid"); + } new Thread(() -> { try { - mailService.sendEmail("你刚刚有一笔到账信息", client.getString("contact_email"), "", content); + mailService.sendEmail("你刚刚有一笔到账信息", mailTo, "", content); } catch (Exception ignored) { logger.error("邮件发送失败", ignored); } }).start(); } + @Override + public void updateAllPartnerPassword(String clientMoniker, List emails) { + JSONObject client = getClientInfoByMoniker(clientMoniker); + if (client == null) { + throw new InvalidShortIdException(); + } + List partners = clientAccountMapper.partnerAndSubPartnerAccounts(client.getIntValue("client_id")); + partners.stream().forEach(partner -> { + String pwd = RandomStringUtils.random(8, true, true); + String salt = PasswordUtils.newSalt(); + String pwdHash = PasswordUtils.hashPwd(pwd, salt); + partner.put("salt", salt); + partner.put("password_hash", pwdHash); + partner.put("password_aes", PasswordUtils.encryptAESPwd(pwd)); + deviceManager.deviceOffline(partner.getString("account_id")); + clientAccountMapper.update(partner); + signInAccountService.clearAccountCache(partner.getString("account_id")); + partner.put("password", pwd); + }); + sendTestMerchantPassword(partners, emails); + } + @Override public String getShortLink(String clientMoniker) { String longUrl = PlatformEnvironment.getEnv().concatUrl("/api/v1.0/hf_gateway/partners/" + clientMoniker + "/jump/pc"); @@ -3813,4 +3842,17 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid } + private void sendTestMerchantPassword(List accounts, List emails) { + Context ctx = new Context(); + ctx.setVariable("accounts", accounts); + final String content = thymeleaf.process( "mail/test_merchant_password", ctx); + new Thread(() -> { + try { + mailService.sendEmail("测试商户账户已更新", emails.isEmpty() ? "" : StringUtils.join(emails, ","), "", content); + } catch (Exception ignored) { + logger.error("邮件发送失败", ignored); + } + }).start(); + } + } diff --git a/src/main/java/au/com/royalpay/payment/manage/merchants/web/PartnerManageController.java b/src/main/java/au/com/royalpay/payment/manage/merchants/web/PartnerManageController.java index d676a3328..66a0af5a9 100644 --- a/src/main/java/au/com/royalpay/payment/manage/merchants/web/PartnerManageController.java +++ b/src/main/java/au/com/royalpay/payment/manage/merchants/web/PartnerManageController.java @@ -284,12 +284,12 @@ public class PartnerManageController { return tradeLogService.listOrderRefunds(orderId, null); } - @ManagerMapping(value = "/{clientMoniker}/accounts", method = RequestMethod.GET, role = {ManagerRole.ADMIN, ManagerRole.BD_USER, ManagerRole.OPERATOR, ManagerRole.SERVANT, ManagerRole.DIRECTOR}) + @ManagerMapping(value = "/{clientMoniker}/accounts", method = RequestMethod.GET, role = {ManagerRole.ADMIN, ManagerRole.BD_USER, ManagerRole.OPERATOR, ManagerRole.SERVANT, ManagerRole.DIRECTOR,ManagerRole.DEVELOPER}) public List partnerAccounts(@PathVariable String clientMoniker, @ModelAttribute(CommonConsts.MANAGER_STATUS) JSONObject manager) { return clientManager.listAccounts(manager, clientMoniker); } - @ManagerMapping(value = "/{clientMoniker}/accounts", method = RequestMethod.POST, role = {ManagerRole.ADMIN, ManagerRole.OPERATOR, ManagerRole.BD_USER, ManagerRole.SERVANT}) + @ManagerMapping(value = "/{clientMoniker}/accounts", method = RequestMethod.POST, role = {ManagerRole.ADMIN, ManagerRole.OPERATOR, ManagerRole.DEVELOPER}) public JSONObject addPartnerAccount(@RequestBody @Valid NewAccountBean account, Errors errors, @PathVariable String clientMoniker, @ModelAttribute(CommonConsts.MANAGER_STATUS) JSONObject manager) { HttpUtils.handleValidErrors(errors); diff --git a/src/main/java/au/com/royalpay/payment/manage/task/UpdatePartnerPasswordTask.java b/src/main/java/au/com/royalpay/payment/manage/task/UpdatePartnerPasswordTask.java new file mode 100644 index 000000000..88a81a0d1 --- /dev/null +++ b/src/main/java/au/com/royalpay/payment/manage/task/UpdatePartnerPasswordTask.java @@ -0,0 +1,43 @@ +package au.com.royalpay.payment.manage.task; + +import au.com.royalpay.payment.manage.mappers.system.ManagerMapper; +import au.com.royalpay.payment.manage.merchants.core.ClientManager; +import au.com.royalpay.payment.tools.scheduler.SynchronizedScheduler; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.util.Arrays; +import java.util.List; + +@Component +@ConditionalOnProperty(value = "app.run-tasks", havingValue = "false") +public class UpdatePartnerPasswordTask { + private Logger logger = LoggerFactory.getLogger(getClass()); + @Resource + private ClientManager clientManager; + @Resource + private SynchronizedScheduler synchronizedScheduler; + @Resource + private ManagerMapper managerMapper; + + private final static String EMAIL = "lily.tao@royalpay.com.au,bella.sun@royalpay.com.au," + + "astro.dai@royalpay.com.au,taylor.dang@royalpay.com.au"; + + @Scheduled(cron = "0 0 9 28 * ?") + public void resetPartnerPassword() { + synchronizedScheduler.executeProcess("manage_task:resetPartnerPassword", 120_000, () -> { + final List emails = managerMapper.listDevManager(); + List emailList = Arrays.asList(EMAIL.split(",")); + emailList.stream().forEach(email -> { + if (!emails.contains(email)) { + emails.add(email); + } + }); + clientManager.updateAllPartnerPassword("PINE", emails); + }); + } +} diff --git a/src/main/resources/au/com/royalpay/payment/manage/mappers/system/ClientAccountMapper.xml b/src/main/resources/au/com/royalpay/payment/manage/mappers/system/ClientAccountMapper.xml index 5e5ccbac1..c35be4b34 100644 --- a/src/main/resources/au/com/royalpay/payment/manage/mappers/system/ClientAccountMapper.xml +++ b/src/main/resources/au/com/royalpay/payment/manage/mappers/system/ClientAccountMapper.xml @@ -17,4 +17,10 @@ + \ No newline at end of file diff --git a/src/main/resources/templates/mail/test_merchant_password.html b/src/main/resources/templates/mail/test_merchant_password.html new file mode 100644 index 000000000..361f20a22 --- /dev/null +++ b/src/main/resources/templates/mail/test_merchant_password.html @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + + + + + + + + + +
序号商户角色用户名密码
adminManagerCashier
+ \ No newline at end of file diff --git a/src/main/ui/index.html b/src/main/ui/index.html index 60ad4e993..fe2384d8e 100644 --- a/src/main/ui/index.html +++ b/src/main/ui/index.html @@ -994,7 +994,7 @@ margin-bottom: 10%;"/> Marketing Materials -
  • +
  • Accounts diff --git a/src/main/ui/static/payment/partner/templates/partner_accounts.html b/src/main/ui/static/payment/partner/templates/partner_accounts.html index 0e357f12d..d41819a94 100644 --- a/src/main/ui/static/payment/partner/templates/partner_accounts.html +++ b/src/main/ui/static/payment/partner/templates/partner_accounts.html @@ -1,7 +1,7 @@
    -
    @@ -9,7 +9,7 @@
    -

    There is no accounts for this partner, Create One

    +

    There is no accounts for this partner, Create One