diff --git a/src/main/java/au/com/royalpay/payment/manage/dev/web/TestController.java b/src/main/java/au/com/royalpay/payment/manage/dev/web/TestController.java index b1f72c515..6ba570bf7 100644 --- a/src/main/java/au/com/royalpay/payment/manage/dev/web/TestController.java +++ b/src/main/java/au/com/royalpay/payment/manage/dev/web/TestController.java @@ -24,9 +24,12 @@ import au.com.royalpay.payment.manage.mappers.system.ClientBankAccountMapper; import au.com.royalpay.payment.manage.mappers.system.ClientMapper; import au.com.royalpay.payment.manage.merchants.core.ClientManager; import au.com.royalpay.payment.manage.permission.manager.ManagerMapping; +import au.com.royalpay.payment.manage.system.core.TradeSecureService; +import au.com.royalpay.payment.manage.system.core.beans.TradeSecureFile; import au.com.royalpay.payment.manage.tradelog.core.TradeLogService; import au.com.royalpay.payment.tools.CommonConsts; import au.com.royalpay.payment.tools.defines.TradeType; +import au.com.royalpay.payment.tools.env.SysConfigManager; import au.com.royalpay.payment.tools.exceptions.BadRequestException; import au.com.royalpay.payment.tools.http.HttpUtils; import au.com.royalpay.payment.tools.merchants.core.MerchantInfoProvider; @@ -40,6 +43,7 @@ import com.alibaba.fastjson.serializer.SerializerFeature; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.time.DateFormatUtils; import org.dom4j.Element; +import org.joda.time.DateTime; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Value; @@ -121,6 +125,10 @@ public class TestController implements ApplicationEventPublisherAware { private HfUpdateService hfUpdateService; @Resource private ClientManager clientManager; + @Resource + private SysConfigManager sysConfigManager; + @Resource + private TradeSecureService tradeSecureService; 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"; @ManagerMapping(value = "/{clientMoniker}/export/agreepdf", method = RequestMethod.GET, role = {ManagerRole.ADMIN, ManagerRole.DIRECTOR, ManagerRole.OPERATOR}) @@ -434,13 +442,25 @@ public class TestController implements ApplicationEventPublisherAware { @ManagerMapping(value = "/partner/reset_password", method = RequestMethod.GET, role = ManagerRole.DEVELOPER) public void resetPartnerPassword() { - final List emails = new ArrayList<>(); - List emailList = Arrays.asList(EMAIL.split(",")); - emailList.stream().forEach(email -> { - if (!emails.contains(email)) { - emails.add(email); - } - }); - clientManager.updateAllPartnerPassword("PINE", emails); + //抄送人邮箱 + JSONObject sysConfig = sysConfigManager.getSysConfig(); + String ccMail = sysConfig.getString("reset_password.cc_list"); + //账号白名单 + String accountWhiteList = sysConfig.getString("reset_password.account_white_list"); + if (StringUtils.isEmpty(ccMail)) { + throw new BadRequestException("抄送人不能为空"); + } + if (accountWhiteList == null) { + accountWhiteList = ""; + } + List emailList = Arrays.asList(ccMail.split(",")); + clientManager.updateAllPartnerPassword("PINE", emailList, accountWhiteList); + } + + @ManagerMapping(value = "/secure/hanyin_reports/{date}", role = ManagerRole.DEVELOPER, method = RequestMethod.GET) + public void downloadHanyinSecureReports(@PathVariable String date, HttpServletResponse response) { + TradeSecureFile file = tradeSecureService.getSecureReportFile(DateTime.parse(date).toDate()); + file.writeToHttp(response); } + } diff --git a/src/main/java/au/com/royalpay/payment/manage/mappers/payment/TransactionMapper.java b/src/main/java/au/com/royalpay/payment/manage/mappers/payment/TransactionMapper.java index f8579d039..f73031649 100644 --- a/src/main/java/au/com/royalpay/payment/manage/mappers/payment/TransactionMapper.java +++ b/src/main/java/au/com/royalpay/payment/manage/mappers/payment/TransactionMapper.java @@ -8,8 +8,6 @@ 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.joda.time.DateTime; -import org.springframework.beans.factory.annotation.Autowired; import java.math.BigDecimal; import java.util.Date; @@ -102,6 +100,7 @@ public interface TransactionMapper { BigDecimal TotalAmountForBDPrize(@Param("year") int year, @Param("month") int month, @Param("bd_id") String bd_id); BigDecimal TotalAmountForBDLeaderPrize(@Param("year") int year, @Param("month") int month, @Param("bd_group") String bd_group); + BigDecimal TotalAmountForSydneyGMPrize(@Param("year") int year, @Param("month") int month); List listTransactionForCityPartnerCommissionByDate(@Param("year") int year, @Param("month") int month); @@ -120,9 +119,9 @@ public interface TransactionMapper { @AdvanceSelect(addonWhereClause = "transaction_type='Credit'") int countOrders(@Param("client_id") int client_id); - List listDailyTransactions(@Param("from") Date from, @Param("to") Date to, @Param("dev_id") String devId, @Param("client_id") int clientId,@Param("client_ids")String [] client_ids); + List listDailyTransactions(@Param("from") Date from, @Param("to") Date to, @Param("dev_id") String devId, @Param("client_id") int clientId, @Param("client_ids") String[] client_ids); - JSONObject analysisRetailDailyReport(@Param("from") Date from, @Param("to") Date to, @Param("dev_id") String devId, @Param("client_id") int clientId,@Param("client_ids")String [] client_ids); + JSONObject analysisRetailDailyReport(@Param("from") Date from, @Param("to") Date to, @Param("dev_id") String devId, @Param("client_id") int clientId, @Param("client_ids") String[] client_ids); @AutoSql(type = SqlType.SELECT) @AdvanceSelect(addonWhereClause = "system_generate=1") @@ -156,6 +155,7 @@ public interface TransactionMapper { /** * 付款退款都是同一个退款单号 + * * @param clientId * @param systemTransactionId * @return @@ -164,4 +164,14 @@ public interface TransactionMapper { PageList findByClientIdAndSystemTransactionId(@Param("client_id") int clientId, @Param("system_transaction_id") String systemTransactionId, PageBounds pageBounds); + + List listCreditTransactionsForSecure(Date from, Date to); + + List listDebitTransactionsForSecure(Date from, Date to); + + JSONObject getClearDetailTotal(JSONObject params); + + List getSettlementLogDetailList(@Param("clientOrders") List clientOrders, @Param("client_id") int clientId); + + List getClientOrderByTransactionTime(JSONObject params); } 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 c1ca75c61..a6e740d7a 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 @@ -355,7 +355,9 @@ public interface ClientManager { void subYeepayMerchantApplication(String clientMoniker,JSONObject merchantInfo, JSONObject manager); - void updateAllPartnerPassword(String clientMoniker, List emails); + void reSubYeepayMerchantApplication(String clientMoniker,JSONObject merchantInfo, JSONObject manager); + + void updateAllPartnerPassword(String clientMoniker, List emails, String accountWhiteList); void postponeClientRate(Date now, Date yearTomorrow, String expireDate, JSONObject client); 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 571e74f66..e891f3789 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 @@ -3720,9 +3720,20 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid merchantInfo.put("create_time",new Date()); merchantInfo.put("operator",manager.getString("display_name")); merchantInfo.put("client_id",client.getIntValue("client_id")); - merchantInfo.put("vouchers",merchantInfo.getJSONObject("vouchers").toJSONString()); + merchantInfo.put("client_id",merchantInfo.getString("client_id")); +// merchantInfo.put("vouchers",merchantInfo.getJSONObject("vouchers").toJSONString()); + List directorsAll = new ArrayList<>(); + List executivesAll = new ArrayList<>(); + directorsAll.add(merchantInfo.getJSONObject("directors")); + executivesAll.add(merchantInfo.getJSONObject("executives")); + JSONObject extInfo = new JSONObject(); + extInfo.put("directors",directorsAll); + extInfo.put("executives",executivesAll); + merchantInfo.put("extinfo",extInfo.toJSONString()); yeePayClientConfigMapper.saveMerchantConfig(merchantInfo); JSONObject yeepayConfig = yeePayClientConfigMapper.findMerchantConfig(client.getIntValue("client_id")); + yeepayConfig.put("company_website",merchantInfo.getString("company_website")); + yeepayConfig.put("abn",merchantInfo.getString("abn")); SubmerchantRegisterResult result = yeePayClient.registerMerchant(client,yeepayConfig); if(result.getStatus().equals("FAILED")){ throw new BadRequestException(result.getErrorMsg()); @@ -3733,6 +3744,35 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid clientMapper.update(client); } + @Override + public void reSubYeepayMerchantApplication(String clientMoniker, JSONObject merchantInfo, JSONObject manager) { + JSONObject client = getClientInfoByMoniker(clientMoniker); + if (client == null) { + throw new InvalidShortIdException(); + } + checkOrgPermission(manager, client); + JSONObject yeepayConfig = yeePayClientConfigMapper.findMerchantConfigBySub(merchantInfo.getString("subMerchantId")); + List directorsAll = new ArrayList<>(); + List executivesAll = new ArrayList<>(); + directorsAll.add(merchantInfo.getJSONObject("directors")); + executivesAll.add(merchantInfo.getJSONObject("executives")); + JSONObject extInfo = new JSONObject(); + extInfo.put("directors",directorsAll); + extInfo.put("executives",executivesAll); + yeepayConfig.put("extinfo",extInfo.toJSONString()); + yeepayConfig.put("industry",merchantInfo.getString("industry")); + yeepayConfig.put("business_content",merchantInfo.getString("business_content")); + yeepayConfig.put("business_licence",merchantInfo.getString("business_licence")); + yeePayClientConfigMapper.update(yeepayConfig); + yeepayConfig.put("company_website",merchantInfo.getString("company_website")); + yeepayConfig.put("abn",merchantInfo.getString("abn")); + yeepayConfig.put("mode","UPDATE"); + SubmerchantRegisterResult result = yeePayClient.registerMerchant(client,yeepayConfig); + if(result.getStatus().equals("FAILED")){ + throw new BadRequestException(result.getErrorMsg()); + } + } + @Override public List listMerchantIds(String clientMoniker, JSONObject manager) { JSONObject client = getClientInfoByMoniker(clientMoniker); @@ -4089,24 +4129,28 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid return ""; } @Override - public void updateAllPartnerPassword(String clientMoniker, List emails) { + @Transactional + public void updateAllPartnerPassword(String clientMoniker, List emails, String accountWhiteList) { 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); - }); + partners = partners.stream().filter(partner -> !Arrays.asList(accountWhiteList.split(",")).contains(partner.getString("username"))).collect(Collectors.toList()); + partners.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); } @@ -4339,6 +4383,7 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid mailService.sendEmail("测试商户账户已更新", emails.isEmpty() ? "" : StringUtils.join(emails, ","), "", content); } catch (Exception ignored) { logger.error("邮件发送失败", ignored); + throw new BadRequestException("邮件发送失败"); } }).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 3b9dcdb6d..fcf6f6d07 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 @@ -615,6 +615,11 @@ public class PartnerManageController { clientManager.subYeepayMerchantApplication(clientMoniker, merchantInfo,manager); } + @ManagerMapping(value = "/{clientMoniker}/updateYeepaySubMerchantId", method = RequestMethod.POST, role = {ManagerRole.OPERATOR, ManagerRole.ADMIN}) + public void reSubYeepayMerchantApplication(@PathVariable String clientMoniker,@RequestBody JSONObject merchantInfo,@ModelAttribute(CommonConsts.MANAGER_STATUS) JSONObject manager) { + clientManager.reSubYeepayMerchantApplication(clientMoniker, merchantInfo,manager); + } + @RequestMapping(value = "/compliance", method = RequestMethod.GET) @RequireManager(role = { ManagerRole.OPERATOR}) public JSONObject lisPartnersByCompliance(@ModelAttribute(CommonConsts.MANAGER_STATUS) JSONObject manager, PartnerQuery query) { diff --git a/src/main/java/au/com/royalpay/payment/manage/system/core/TradeSecureService.java b/src/main/java/au/com/royalpay/payment/manage/system/core/TradeSecureService.java new file mode 100644 index 000000000..bd2eaa596 --- /dev/null +++ b/src/main/java/au/com/royalpay/payment/manage/system/core/TradeSecureService.java @@ -0,0 +1,17 @@ +package au.com.royalpay.payment.manage.system.core; + +import au.com.royalpay.payment.manage.system.core.beans.TradeSecureFile; + +import java.util.Date; + +/** + * Create by yixian at 2019-01-08 3:17 + */ +public interface TradeSecureService { + void uploadSecureReportYesterday(); + + void uploadSecureReport(Date date); + + TradeSecureFile getSecureReportFile(Date date); + +} diff --git a/src/main/java/au/com/royalpay/payment/manage/system/core/beans/TradeSecureFile.java b/src/main/java/au/com/royalpay/payment/manage/system/core/beans/TradeSecureFile.java new file mode 100644 index 000000000..76b558dc8 --- /dev/null +++ b/src/main/java/au/com/royalpay/payment/manage/system/core/beans/TradeSecureFile.java @@ -0,0 +1,149 @@ +package au.com.royalpay.payment.manage.system.core.beans; + +import au.com.royalpay.payment.tools.defines.TradeType; +import au.com.royalpay.payment.tools.env.PlatformEnvironment; +import au.com.royalpay.payment.tools.exceptions.ServerErrorException; +import au.com.royalpay.payment.tools.utils.CurrencyAmountUtils; +import com.alibaba.fastjson.JSONObject; +import org.joda.time.DateTime; +import org.joda.time.DateTimeZone; + +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.math.BigDecimal; +import java.nio.charset.StandardCharsets; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.TimeZone; +import java.util.stream.Collectors; + +/** + * Create by yixian at 2019-01-08 3:27 + */ +public class TradeSecureFile { + private static final DateTimeZone zone = DateTimeZone.forTimeZone(TimeZone.getTimeZone("Asia/Shanghai")); + private final String pid; + private final DateTime transDate; + private final DateTime createTime; + private List tradeItems; + private byte[] content; + + public TradeSecureFile(String pid, Date transDate) { + this.pid = pid; + this.transDate = new DateTime(transDate).withZoneRetainFields(zone).withMillisOfDay(0); + this.tradeItems = new ArrayList<>(); + this.createTime = DateTime.now(zone); + } + + public DateTime getTransDate() { + return transDate; + } + + public Date getFromTime() { + return transDate.withZone(DateTimeZone.forTimeZone(TimeZone.getDefault())).toDate(); + } + + public Date getToTime() { + return transDate.plusDays(1).withZone(DateTimeZone.forTimeZone(TimeZone.getDefault())).toDate(); + } + + public TradeSecureFile addTransactions(List transactions) { + tradeItems.addAll(transactions.stream().map(TradeItem::new).collect(Collectors.toList())); + return this; + } + + public void writeToHttp(HttpServletResponse response) { + response.setContentType("application/octet-stream"); + response.setHeader("Content-Disposition", "attachment; filename=" + filename()); + try (OutputStream ous = response.getOutputStream()) { + ous.write(content()); + ous.flush(); + } catch (IOException e) { + throw new ServerErrorException(e); + } + } + + public String filename() { + return String.join("_", transDate.toString("yyMMdd"), pid, createTime.toString("yyMMddHHmmss")) + ".txt"; + } + + public byte[] content() { + return content == null ? build() : content; + } + + private byte[] build() { + + try (ByteArrayOutputStream bos = new ByteArrayOutputStream(); + PrintWriter writer = new PrintWriter(new OutputStreamWriter(bos, StandardCharsets.UTF_8))) { + writer.println(headerLine()); + for (TradeItem item : tradeItems) { + writer.println(item.line()); + } + content = bos.toByteArray(); + return content; + } catch (IOException e) { + throw new ServerErrorException(e); + } + } + + private String headerLine() { + int totalCount = tradeItems.size(); + BigDecimal totalCredit = tradeItems.stream().filter(TradeItem::isCredit).map(TradeItem::getClearingAmount) + .reduce(BigDecimal::add).orElse(BigDecimal.ZERO); + BigDecimal totalDebit = tradeItems.stream().filter(TradeItem::isDebit).map(TradeItem::getClearingAmount) + .reduce(BigDecimal::add).orElse(BigDecimal.ZERO); + String date = transDate.toString("yyyy-MM-dd"); + String[] columns = {String.valueOf(totalCount), totalCredit.toPlainString(), totalDebit.toPlainString(), date, pid}; + return String.join("|", columns); + } + + class TradeItem { + + private String clientMoniker; + private String orderId; + private String channel; + private TradeType gateway; + private BigDecimal price; + private BigDecimal clearingAmount; + private String currency; + private BigDecimal exchangeRate; + private String transactionType; + private Date transactionTime; + + public TradeItem(JSONObject item) { + clientMoniker = item.getString("client_moniker"); + transactionType = item.getString("transaction_type"); + orderId = isCredit() ? item.getString("order_id") : item.getString("out_refund_id"); + channel = item.getString("order_channel"); + gateway = TradeType.fromGatewayNumber(item.getIntValue("gateway")); + currency = item.getString("transaction_currency"); + price = CurrencyAmountUtils.scale(item.getBigDecimal("transaction_amount"), currency); + clearingAmount = CurrencyAmountUtils.scale(item.getBigDecimal("clearing_amount"), PlatformEnvironment.getEnv().getForeignCurrency()); + exchangeRate = item.getBigDecimal("exchange_rate"); + transactionTime = item.getDate("transaction_time"); + } + + public String line() { + String[] columns = {clientMoniker, orderId, channel, gateway.toString(), price.toPlainString(), clearingAmount.toPlainString(), currency, + exchangeRate.toPlainString(), filterStatus(), new DateTime(transactionTime).withZone(zone).toString()}; + return String.join("|", columns); + } + + private String filterStatus() { + return isCredit() ? "SUCCESS" : "REFUND"; + } + + public boolean isCredit() { + return "Credit".equals(transactionType); + } + + public boolean isDebit() { + return "Debit".equals(transactionType); + } + + public BigDecimal getClearingAmount() { + return clearingAmount; + } + } +} diff --git a/src/main/java/au/com/royalpay/payment/manage/system/core/impl/TradeSecureServiceHanyinImpl.java b/src/main/java/au/com/royalpay/payment/manage/system/core/impl/TradeSecureServiceHanyinImpl.java new file mode 100644 index 000000000..34ffe6f09 --- /dev/null +++ b/src/main/java/au/com/royalpay/payment/manage/system/core/impl/TradeSecureServiceHanyinImpl.java @@ -0,0 +1,107 @@ +package au.com.royalpay.payment.manage.system.core.impl; + +import au.com.royalpay.payment.core.exceptions.ChannelNetworkException; +import au.com.royalpay.payment.manage.mappers.payment.TransactionMapper; +import au.com.royalpay.payment.manage.system.core.TradeSecureService; +import au.com.royalpay.payment.manage.system.core.beans.TradeSecureFile; +import au.com.royalpay.payment.tools.env.SysConfigManager; +import com.alibaba.fastjson.JSONObject; +import com.jcraft.jsch.*; +import org.apache.commons.vfs2.FileSystemOptions; +import org.apache.commons.vfs2.provider.sftp.SftpClientFactory; +import org.apache.commons.vfs2.provider.sftp.SftpFileSystemConfigBuilder; +import org.joda.time.DateTime; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.util.Date; +import java.util.List; + +/** + * Create by yixian at 2019-01-08 3:26 + */ +@Service +public class TradeSecureServiceHanyinImpl implements TradeSecureService { + private Logger logger = LoggerFactory.getLogger(getClass()); + @Value("${app.hanyin-secure.pid:ROYALPAY}") + private String pid; + @Value("${app.hanyin-secure.sftp-host}") + private String sftpHost; + @Value("${app.hanyin-secure.sftp-port}") + private int sftpPort; + @Value("${app.hanyin-secure.sftp-username}") + private String sftpUsername; + @Value("${app.hanyin-secure.sftp-pwd}") + private String sftpPwd; + @Resource + private TransactionMapper transactionMapper; + @Resource + private SysConfigManager sysConfigManager; + + @Override + public void uploadSecureReportYesterday() { + if (!sysConfigManager.getSysConfig().getBooleanValue("enable_hanyin_uploading")) { + return; + } + logger.debug("start uploading secure report"); + uploadSecureReport(DateTime.now().plusDays(-1).withMillisOfDay(0).toDate()); + } + + @Override + public void uploadSecureReport(Date date) { + TradeSecureFile file = getSecureReportFile(date); + sftpUpload(file); + } + + private void sftpUpload(TradeSecureFile file) { + Session session = null; + ChannelSftp command = null; + try { + session = initSFTPConnection(); + Channel channel = session.openChannel("sftp"); + channel.connect(); + command = (ChannelSftp) channel; + command.ls("/royalpay"); + String dir = "/royalpay/" + file.getTransDate().toString("yyyyMMdd"); + logger.debug("removing dir:{}", dir); + command.rmdir(dir); + logger.debug("rmdir success"); + logger.debug("mk dir:{}", dir); + command.mkdir(dir); + String dest = dir + file.filename(); + logger.debug("rmdir success, start uploading file:{}", dest); + command.put(new ByteArrayInputStream(file.content()), dest); + } catch (IOException | JSchException | SftpException e) { + throw new ChannelNetworkException("Upload Secure file failed", e); + } finally { + if (command != null && command.isConnected()) { + command.exit(); + session.disconnect(); + } + } + } + + private Session initSFTPConnection() throws IOException { + FileSystemOptions fso = new FileSystemOptions(); + SftpFileSystemConfigBuilder.getInstance().setStrictHostKeyChecking(fso, "no"); + return SftpClientFactory.createConnection(sftpHost, sftpPort, + sftpUsername.toCharArray(), sftpPwd.toCharArray(), fso); + } + + @Override + public TradeSecureFile getSecureReportFile(Date date) { + TradeSecureFile file = new TradeSecureFile(pid, date); + Date from = file.getFromTime(); + Date to = file.getToTime(); + List credits = transactionMapper.listCreditTransactionsForSecure(from, to); + file.addTransactions(credits); + List debits = transactionMapper.listDebitTransactionsForSecure(from, to); + file.addTransactions(debits); + return file; + } +} diff --git a/src/main/java/au/com/royalpay/payment/manage/task/SecureTask.java b/src/main/java/au/com/royalpay/payment/manage/task/SecureTask.java new file mode 100644 index 000000000..b54a6c2ed --- /dev/null +++ b/src/main/java/au/com/royalpay/payment/manage/task/SecureTask.java @@ -0,0 +1,26 @@ +package au.com.royalpay.payment.manage.task; + +import au.com.royalpay.payment.manage.system.core.TradeSecureService; +import au.com.royalpay.payment.tools.scheduler.SynchronizedScheduler; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; + +/** + * Create by yixian at 2019-01-08 3:13 + */ +@Component +@ConditionalOnProperty(value = "app.run-tasks", havingValue = "true") +public class SecureTask { + @Resource + private SynchronizedScheduler synchronizedScheduler; + @Resource + private TradeSecureService tradeSecureService; + + @Scheduled(cron = "0 0 3 * * *") + public void pushSecureFile(){ + synchronizedScheduler.executeProcess("task:secure_file_uploading",600_000,()->tradeSecureService.uploadSecureReportYesterday()); + } +} 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 index c063e1e95..e60fcc7f6 100644 --- a/src/main/java/au/com/royalpay/payment/manage/task/UpdatePartnerPasswordTask.java +++ b/src/main/java/au/com/royalpay/payment/manage/task/UpdatePartnerPasswordTask.java @@ -2,7 +2,12 @@ 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.env.SysConfigManager; +import au.com.royalpay.payment.tools.env.mappers.SysConfigMapper; +import au.com.royalpay.payment.tools.exceptions.BadRequestException; import au.com.royalpay.payment.tools.scheduler.SynchronizedScheduler; +import com.alibaba.fastjson.JSONObject; +import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; @@ -23,21 +28,26 @@ public class UpdatePartnerPasswordTask { @Resource private SynchronizedScheduler synchronizedScheduler; @Resource - private ManagerMapper managerMapper; + private SysConfigManager sysConfigManager; - 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"; +// 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", 300_000, () -> { - final List emails = new ArrayList<>(); - List emailList = Arrays.asList(EMAIL.split(",")); - emailList.stream().forEach(email -> { - if (!emails.contains(email)) { - emails.add(email); - } - }); - clientManager.updateAllPartnerPassword("PINE", emails); + //抄送人邮箱 + JSONObject sysConfig = sysConfigManager.getSysConfig(); + String ccMail = sysConfig.getString("reset_password.cc_list"); + //账号白名单 + String accountWhiteList = sysConfig.getString("reset_password.account_white_list"); + if (StringUtils.isEmpty(ccMail)) { + throw new BadRequestException("抄送人不能为空"); + } + if (accountWhiteList == null) { + accountWhiteList = ""; + } + List emailList = Arrays.asList(ccMail.split(",")); + clientManager.updateAllPartnerPassword("PINE", emailList, accountWhiteList); }); } } diff --git a/src/main/java/au/com/royalpay/payment/manage/tradelog/core/TradeLogService.java b/src/main/java/au/com/royalpay/payment/manage/tradelog/core/TradeLogService.java index 48b32e802..1fb0b3185 100644 --- a/src/main/java/au/com/royalpay/payment/manage/tradelog/core/TradeLogService.java +++ b/src/main/java/au/com/royalpay/payment/manage/tradelog/core/TradeLogService.java @@ -50,4 +50,6 @@ public interface TradeLogService { void fullReleasePreAuthorization(JSONObject account, TradeLogQuery query)throws Exception; PageList listPreRefundClients(PreRefundQueryBean params); + + void exportSettlementLog(TradeLogQuery query, JSONObject partner, HttpServletResponse response); } diff --git a/src/main/java/au/com/royalpay/payment/manage/tradelog/core/impls/TradeLogServiceImpl.java b/src/main/java/au/com/royalpay/payment/manage/tradelog/core/impls/TradeLogServiceImpl.java index 64eff18d1..a992efea2 100644 --- a/src/main/java/au/com/royalpay/payment/manage/tradelog/core/impls/TradeLogServiceImpl.java +++ b/src/main/java/au/com/royalpay/payment/manage/tradelog/core/impls/TradeLogServiceImpl.java @@ -28,6 +28,7 @@ import au.com.royalpay.payment.manage.organizations.core.OrgManager; import au.com.royalpay.payment.manage.tradelog.beans.PreRefundQueryBean; import au.com.royalpay.payment.manage.tradelog.beans.TradeLogQuery; import au.com.royalpay.payment.manage.tradelog.core.TradeLogService; +import au.com.royalpay.payment.tools.defines.TradeType; import au.com.royalpay.payment.tools.env.PlatformEnvironment; import au.com.royalpay.payment.tools.exceptions.BadRequestException; import au.com.royalpay.payment.tools.permission.enums.ManagerRole; @@ -68,6 +69,8 @@ import org.apache.poi.hssf.usermodel.HSSFRow; import org.apache.poi.hssf.usermodel.HSSFSheet; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.hssf.util.HSSFColor; +import org.apache.poi.ss.usermodel.*; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Value; @@ -1177,4 +1180,97 @@ public class TradeLogServiceImpl implements TradeLogService { return transactionMapper.listPreRefundClients(new PageBounds(params.getPage(), params.getLimit())); } + @Override + public void exportSettlementLog(TradeLogQuery query, JSONObject partner, HttpServletResponse resp) { + int client_id = partner.getIntValue("client_id"); + String begin = query.getDatefrom() == null ?"":query.getDatefrom(); + String end = query.getDateto() == null ?"":query.getDateto(); + String timezone = partner.getJSONObject("client").getString("timezone"); + JSONObject params = query.toParams(timezone); + params.put("client_id", client_id); + List clientOrderList = transactionMapper.getClientOrderByTransactionTime(params); + List clientOrders = new ArrayList<>(clientOrderList.size()); + clientOrderList.parallelStream().forEach(p->{ + clientOrders.add(p.getInteger("clearing_order")); + }); + List settlementLogDetailList = transactionMapper.getSettlementLogDetailList(clientOrders, client_id); + OutputStream ous = null; + try { + JSONObject clearDetailTotal = transactionMapper.getClearDetailTotal(params); + resp.setContentType("application/octet-stream;"); + resp.addHeader("Content-Disposition", + "attachment; filename=" + "Merchant_Settlement_Info_" + begin + "_" + end + ".xlsx"); + ous = resp.getOutputStream(); + Workbook wb = new XSSFWorkbook(); + Cell cell = null; + Font font = wb.createFont(); + font.setBoldweight(Font.BOLDWEIGHT_BOLD); + font.setFontHeightInPoints((short) 10); + CellStyle analysisStyle = wb.createCellStyle(); + analysisStyle.setFont(font); + Sheet sheet = wb.createSheet("Merchant_Settlement_Info_" + begin + "_" + end); + int rowNum = 0; + Row row = sheet.createRow(rowNum); + String[] title = {"order Id", "Client Order Id", "Transaction Time", "Channel", "Gateway", "Exchange Rate", "Transaction Type", "Currency", + "Input Amount", "Total Amount", "Clearing Amount", "Sruchange Rate", "Settle Amount", "Remark", "Dev No"}; + String[] analysis = {"Total Credit", "Total Debit", "Gross Amount", "Total Charge", "Net Amount"}; + for (int i = 0; i < title.length; i++) { + row.createCell(i, Cell.CELL_TYPE_STRING).setCellValue(title[i]); + } + + JSONObject device; + String clientDevId = ""; + for (JSONObject settle : settlementLogDetailList) { + if (settle.getBigDecimal("clearing_amount").compareTo(BigDecimal.ZERO) == 0) { + continue; + } + row = sheet.createRow(++rowNum); + row.createCell(0, Cell.CELL_TYPE_STRING).setCellValue(settle.getString("order_id")); + row.createCell(1, Cell.CELL_TYPE_STRING).setCellValue(settle.getString("client_order_id")); + row.createCell(2, Cell.CELL_TYPE_STRING).setCellValue(settle.getString("transaction_time")); + row.createCell(3, Cell.CELL_TYPE_STRING).setCellValue(settle.getString("channel")); + if (settle.getInteger("gateway") != null) { + row.createCell(4, Cell.CELL_TYPE_STRING).setCellValue(TradeType.fromGatewayNumber(settle.getIntValue("gateway")).getTradeType()); + } else { + row.createCell(4, Cell.CELL_TYPE_STRING).setCellValue("-"); + } + row.createCell(5, Cell.CELL_TYPE_STRING).setCellValue(settle.getBigDecimal("exchange_rate").setScale(5, BigDecimal.ROUND_DOWN).toPlainString()); + row.createCell(6, Cell.CELL_TYPE_STRING).setCellValue(settle.getString("transaction_type")); + row.createCell(7, Cell.CELL_TYPE_STRING).setCellValue(settle.getString("transaction_currency")); + row.createCell(8, Cell.CELL_TYPE_STRING).setCellValue(settle.getBigDecimal("display_amount") == null ? "" + : settle.getBigDecimal("display_amount").setScale(2, BigDecimal.ROUND_DOWN).toPlainString()); + row.createCell(9, Cell.CELL_TYPE_STRING).setCellValue(settle.getBigDecimal("transaction_amount") == null ? "" + : settle.getBigDecimal("transaction_amount").setScale(2, BigDecimal.ROUND_DOWN).toPlainString()); + row.createCell(10, Cell.CELL_TYPE_STRING).setCellValue(settle.getBigDecimal("clearing_amount") == null ? "" + : settle.getBigDecimal("clearing_amount").setScale(2, BigDecimal.ROUND_DOWN).toPlainString()); + row.createCell(11, Cell.CELL_TYPE_STRING).setCellValue(settle.getBigDecimal("rate") == null? "": settle.getBigDecimal("rate").toPlainString() + "%"); + row.createCell(12, Cell.CELL_TYPE_STRING).setCellValue(settle.getBigDecimal("settle_amount") == null ? "" + : settle.getBigDecimal("settle_amount").setScale(2, BigDecimal.ROUND_DOWN).toPlainString()); + row.createCell(13, Cell.CELL_TYPE_STRING).setCellValue(settle.getString("order_detail")); + device = clientDeviceMapper.find(settle.getString("dev_id")); + if (device != null) + clientDevId = device.getString("client_dev_id"); + row.createCell(14, Cell.CELL_TYPE_STRING).setCellValue(clientDevId); + } + row = sheet.createRow(++rowNum); + for (int i = 0; i < analysis.length; i++) { + cell = row.createCell(i, Cell.CELL_TYPE_STRING); + cell.setCellStyle(analysisStyle); + cell.setCellValue(analysis[i]); + } + row = sheet.createRow(++rowNum); + row.createCell(0, Cell.CELL_TYPE_STRING).setCellValue(clearDetailTotal.getString("total_payment")); + row.createCell(1, Cell.CELL_TYPE_STRING).setCellValue(clearDetailTotal.getString("total_refund")); + row.createCell(2, Cell.CELL_TYPE_STRING).setCellValue(clearDetailTotal.getString("gross_amount")); + row.createCell(3, Cell.CELL_TYPE_STRING).setCellValue(clearDetailTotal.getString("total_charge")); + row.createCell(4, Cell.CELL_TYPE_STRING).setCellValue(clearDetailTotal.getString("clearing_amount")); + + wb.write(ous); + ous.flush(); + } catch (IOException e) { + e.printStackTrace(); + } finally { + IOUtils.closeQuietly(ous); + } + } } diff --git a/src/main/java/au/com/royalpay/payment/manage/tradelog/web/TradeFlowController.java b/src/main/java/au/com/royalpay/payment/manage/tradelog/web/TradeFlowController.java index 8e8761618..27275b973 100644 --- a/src/main/java/au/com/royalpay/payment/manage/tradelog/web/TradeFlowController.java +++ b/src/main/java/au/com/royalpay/payment/manage/tradelog/web/TradeFlowController.java @@ -59,5 +59,10 @@ public class TradeFlowController { return tradeLogService.getClientUnClearedAmount(partner).toString(); } + @PartnerMapping(value = "/settlement/log/excel",method = RequestMethod.GET) + @ResponseBody + public void exportSettlementLog(TradeLogQuery query, @ModelAttribute(CommonConsts.PARTNER_STATUS) JSONObject partner, HttpServletResponse response) { + tradeLogService.exportSettlementLog(query, partner, response); + } } diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 5be79cb73..2fb9b46a9 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -133,3 +133,11 @@ settle.abafile.bank.ANZ.apca=514624 settle.abafile.bank.ANZ.bsb=013006 settle.abafile.bank.ANZ.account-no=837022519 settle.abafile.bank.ANZ.account-name=Tunnel Show Pty Ltd + + +# 瀚银Secure +app.hanyin-secure.pid=ROYALPAY +app.hanyin-secure.sftp-host=180.168.61.86 +app.hanyin-secure.sftp-port=28480 +app.hanyin-secure.sftp-username=royalpay +app.hanyin-secure.sftp-pwd=royalpay \ No newline at end of file diff --git a/src/main/resources/au/com/royalpay/payment/manage/mappers/financial/FinancialBDConfigMapper.xml b/src/main/resources/au/com/royalpay/payment/manage/mappers/financial/FinancialBDConfigMapper.xml index 55dd4eb35..563654312 100644 --- a/src/main/resources/au/com/royalpay/payment/manage/mappers/financial/FinancialBDConfigMapper.xml +++ b/src/main/resources/au/com/royalpay/payment/manage/mappers/financial/FinancialBDConfigMapper.xml @@ -10,10 +10,11 @@ c.city, c.get_prize, c.bd_group, - c.kpi_amount + c.kpi_amount, + m.is_valid FROM sys_managers m LEFT JOIN financial_bd_config c ON c.manager_id = m.manager_id - WHERE m.role & 4 > 0 AND m.is_valid = 1 AND (m.org_id = 1 OR m.org_id IS NULL) + WHERE m.role & 4 > 0 AND (m.org_id = 1 OR m.org_id IS NULL) ]]> diff --git a/src/main/resources/au/com/royalpay/payment/manage/mappers/payment/TransactionMapper.xml b/src/main/resources/au/com/royalpay/payment/manage/mappers/payment/TransactionMapper.xml index 906de6d47..16a367b1b 100644 --- a/src/main/resources/au/com/royalpay/payment/manage/mappers/payment/TransactionMapper.xml +++ b/src/main/resources/au/com/royalpay/payment/manage/mappers/payment/TransactionMapper.xml @@ -4,13 +4,19 @@ UPDATE pmt_transactions AS t INNER JOIN log_clearing_detail d ON d.clear_detail_id = t.clearing_order - SET clearing_status = 0, clearing_order = NULL, clearing_time = NULL + SET clearing_status = 0, + clearing_order = NULL, + clearing_time = NULL WHERE d.clearing_id = #{clearing_id} - DELETE t FROM pmt_transactions t - INNER JOIN log_clearing_detail d ON d.clear_detail_id = t.clearing_order - WHERE d.clearing_id = #{clearing_id} AND t.transaction_type = 'Debit' AND t.refund_id IS NULL and t.channel='Settlement' + DELETE t + FROM pmt_transactions t + INNER JOIN log_clearing_detail d ON d.clear_detail_id = t.clearing_order + WHERE d.clearing_id = #{clearing_id} + AND t.transaction_type = 'Debit' + AND t.refund_id IS NULL + and t.channel = 'Settlement' SELECT * FROM pmt_transactions - WHERE channel = 'Wechat' AND transaction_type = 'Credit' + WHERE channel = 'Wechat' + AND transaction_type = 'Credit' ORDER BY transaction_time DESC LIMIT 1 @@ -281,41 +288,38 @@ @@ -461,77 +465,66 @@ @@ -560,259 +553,267 @@ + + + + + + + diff --git a/src/main/resources/au/com/royalpay/payment/manage/mappers/system/ClientMapper.xml b/src/main/resources/au/com/royalpay/payment/manage/mappers/system/ClientMapper.xml index 72c1f9331..f4e4a3aa8 100644 --- a/src/main/resources/au/com/royalpay/payment/manage/mappers/system/ClientMapper.xml +++ b/src/main/resources/au/com/royalpay/payment/manage/mappers/system/ClientMapper.xml @@ -241,7 +241,7 @@ #{org_id} and c.referrer_id=#{referrer_id} - and c.is_valid=1 + and c.is_valid=0 diff --git a/src/main/resources/templates/mail/risk_upload_mail.html b/src/main/resources/templates/mail/risk_upload_mail.html index 2c068115d..155293c49 100644 --- a/src/main/resources/templates/mail/risk_upload_mail.html +++ b/src/main/resources/templates/mail/risk_upload_mail.html @@ -9,7 +9,8 @@ 请于 - 下午5:00(悉尼时间)前提供腾讯被查商户 + 下午5:00(悉尼时间)前 + 提供腾讯支付宝被查商户 ()的以下材料:

diff --git a/src/main/ui/merchant_application.html b/src/main/ui/merchant_application.html index 7db72db3a..e932ae63a 100644 --- a/src/main/ui/merchant_application.html +++ b/src/main/ui/merchant_application.html @@ -349,7 +349,7 @@
+ placeholder="Merchant Name" required maxlength="15">
diff --git a/src/main/ui/partner_register.html b/src/main/ui/partner_register.html index 92e7be85a..a2573c550 100644 --- a/src/main/ui/partner_register.html +++ b/src/main/ui/partner_register.html @@ -332,7 +332,7 @@
+ placeholder="Store Name /Company Name" required maxlength="15">
diff --git a/src/main/ui/static/analysis/risk_business.js b/src/main/ui/static/analysis/risk_business.js index 9e4c5a1c8..acd5d2223 100644 --- a/src/main/ui/static/analysis/risk_business.js +++ b/src/main/ui/static/analysis/risk_business.js @@ -572,6 +572,7 @@ define(['angular', 'jquery', 'uiRouter', './monitoring/analysis-monitoring'], data: {file: file} }).then(function (resp) { urls.push(resp.data.url); + delete $scope.riskMaterial.material[index].fileProgressValue; }, function (resp) { delete $scope.riskMaterial.material[index].fileProgressValue; alert('Upload Failed'); diff --git a/src/main/ui/static/application/templates/apply_basicinfo.html b/src/main/ui/static/application/templates/apply_basicinfo.html index d7d89784a..ed9a944dc 100644 --- a/src/main/ui/static/application/templates/apply_basicinfo.html +++ b/src/main/ui/static/application/templates/apply_basicinfo.html @@ -46,13 +46,13 @@
+ name="short_name" id="short-name-input" required maxlength="15">

short name for WeChat payment display and partner name

Required Field

-

Less Than 50 +

Less Than 15 Characters(including symbols and spaces)

diff --git a/src/main/ui/static/boot/templates/bind_qrcode_dialog_guide.html b/src/main/ui/static/boot/templates/bind_qrcode_dialog_guide.html index 5e37fb36c..c3a7faa9c 100644 --- a/src/main/ui/static/boot/templates/bind_qrcode_dialog_guide.html +++ b/src/main/ui/static/boot/templates/bind_qrcode_dialog_guide.html @@ -3,7 +3,7 @@
diff --git a/src/main/ui/static/payment/partner/templates/add_sub_partner_dialog.html b/src/main/ui/static/payment/partner/templates/add_sub_partner_dialog.html index 52463ae66..811427ab5 100644 --- a/src/main/ui/static/payment/partner/templates/add_sub_partner_dialog.html +++ b/src/main/ui/static/payment/partner/templates/add_sub_partner_dialog.html @@ -58,13 +58,13 @@
+ name="short_name" id="short-name-input" required maxlength="15">

short name for WeChat payment display and partner name

Required Field

-

Less Than 50 +

Less Than 15 Characters(including symbols and spaces)

diff --git a/src/main/ui/static/payment/partner/templates/apply_rpay_sub_merchant_id.html b/src/main/ui/static/payment/partner/templates/apply_rpay_sub_merchant_id.html index f7d130c75..9a720b6aa 100644 --- a/src/main/ui/static/payment/partner/templates/apply_rpay_sub_merchant_id.html +++ b/src/main/ui/static/payment/partner/templates/apply_rpay_sub_merchant_id.html @@ -37,10 +37,10 @@
+ type="text" name="company_shortname" id="company_shortname_input" required maxlength="15">

Required Field

-

Length is more than 50

+

Length is more than 15

diff --git a/src/main/ui/static/payment/partner/templates/apply_yeepay_sub_merchant_id.html b/src/main/ui/static/payment/partner/templates/apply_yeepay_sub_merchant_id.html index c58fc37e2..6eed12f07 100644 --- a/src/main/ui/static/payment/partner/templates/apply_yeepay_sub_merchant_id.html +++ b/src/main/ui/static/payment/partner/templates/apply_yeepay_sub_merchant_id.html @@ -11,7 +11,7 @@
@@ -39,38 +39,62 @@
-
- +
+
-
- + +
+

Required Field

+
+
+

eg:https://www.royalpay.com.au

- -
Url:{{legalIDcardFront}}
- -
- +
+
-
- + +
+

Required Field

- -
Url:{{legalIDcardBack}}
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
@@ -87,86 +111,215 @@
-
- + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
-
- + +
+

Required Field

+

Length is more than 50

- -
Url:{{taxLevel}}
-
- +
+
-
- + +
+

Required Field

+

Length is more than 50

- -
Url:{{bankAccountOpen}}
- +
- -
Url:{{orgCode}}
+ +
Url:{{directorPassport}}
-
- +
+
-
- + +
+

Required Field

+

Length is more than 50

+
+
+
+ +
+ +
+ +
+

Required Field

+

Length is more than 50

+
+
+
+ +
+ +
+ +
+

Required Field

+

Length is more than 50

+
+
+
+ +
+ +
+ +
+

Required Field

- -
Url:{{nonStanProtocol}}
- +
- -
Url:{{zipPath}}
+ +
Url:{{executivePassport}}
+
+ +
+ +
+

Required Field

+

Length is more than 50

+
+
+
diff --git a/src/main/ui/static/payment/partner/templates/client_partner_detail.html b/src/main/ui/static/payment/partner/templates/client_partner_detail.html index 1d90ce08b..71f79f2f5 100644 --- a/src/main/ui/static/payment/partner/templates/client_partner_detail.html +++ b/src/main/ui/static/payment/partner/templates/client_partner_detail.html @@ -344,9 +344,9 @@
+ id="short-name-input" maxlength="15" required>
-

No more than 50 characters

+

No more than 15 characters

diff --git a/src/main/ui/static/payment/partner/templates/partner_compliance.html b/src/main/ui/static/payment/partner/templates/partner_compliance.html index a02227ee1..747b83900 100644 --- a/src/main/ui/static/payment/partner/templates/partner_compliance.html +++ b/src/main/ui/static/payment/partner/templates/partner_compliance.html @@ -224,6 +224,11 @@ 等待BD上传材料审核 + + + diff --git a/src/main/ui/static/payment/partner/templates/partner_edit.html b/src/main/ui/static/payment/partner/templates/partner_edit.html index 0529ea0c6..3c21c5fe7 100644 --- a/src/main/ui/static/payment/partner/templates/partner_edit.html +++ b/src/main/ui/static/payment/partner/templates/partner_edit.html @@ -62,13 +62,13 @@
+ id="short-name-input" required maxlength="15">

short name for WeChat payment display and partner name

Required Field

-

Less Than 50 +

Less Than 15 Characters(including symbols and spaces)

@@ -111,13 +111,13 @@
+ id="short-name-input" required maxlength="15">

short name for WeChat payment display and partner name

Required Field

-

Less Than 50 +

Less Than 15 Characters(including symbols and spaces)

diff --git a/src/main/ui/static/payment/partner/templates/sub_merchant_id_apply.html b/src/main/ui/static/payment/partner/templates/sub_merchant_id_apply.html index 835b5b5dc..c9dcc545f 100644 --- a/src/main/ui/static/payment/partner/templates/sub_merchant_id_apply.html +++ b/src/main/ui/static/payment/partner/templates/sub_merchant_id_apply.html @@ -201,6 +201,10 @@ ng-click="useYeepaySubMerchantId(id_apply.sub_merchant_id)"> USE +
diff --git a/src/main/ui/static/payment/partner/templates/update_yeepay_sub_merchant_id.html b/src/main/ui/static/payment/partner/templates/update_yeepay_sub_merchant_id.html new file mode 100644 index 000000000..30769c0bf --- /dev/null +++ b/src/main/ui/static/payment/partner/templates/update_yeepay_sub_merchant_id.html @@ -0,0 +1,334 @@ +
+
+
+
+
+
Update Yeepay Sub Merchant Id
+
+
+
+ +
+ +
+

Required Field

+
+
+
+ + +
+ +
+ +
+

Required Field

+
+
+
+ +
+ +
+ +
+

Required Field

+
+
+

eg:https://www.royalpay.com.au

+
+
+
+
+ +
+ +
+

Required Field

+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+ +
+ +
Url:{{businessLicence}}
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+

Required Field

+

Length is more than 50

+
+
+
+ +
+ +
+ +
+

Required Field

+

Length is more than 50

+
+
+
+ +
+ +
+
+ +
+ +
Url:{{directorPassport}}
+
+
+ +
+ +
+ +
+

Required Field

+

Length is more than 50

+
+
+
+ +
+ +
+ +
+

Required Field

+

Length is more than 50

+
+
+
+ +
+ +
+ +
+

Required Field

+

Length is more than 50

+
+
+
+ +
+ +
+ +
+

Required Field

+
+
+
+ +
+ +
+
+ +
+ +
Url:{{executivePassport}}
+
+
+ +
+ +
+ +
+

Required Field

+

Length is more than 50

+
+
+
+
+
+
+
+ +
+
+
+
+
diff --git a/src/main/ui/static/payment/tradelog/partner-settlement-log.js b/src/main/ui/static/payment/tradelog/partner-settlement-log.js index d7fa5454e..113cf4a85 100644 --- a/src/main/ui/static/payment/tradelog/partner-settlement-log.js +++ b/src/main/ui/static/payment/tradelog/partner-settlement-log.js @@ -92,6 +92,22 @@ define(['angular', 'uiBootstrap', 'uiRouter'], function (angular) { }; $scope.loadSettlementLogs(1); + $scope.exportSettlementLogs = function() { + var params = angular.copy($scope.params); + var url = '/client/trans_flow/settlement/log/excel'; + var connectSymbol = '?'; + if (params.datefrom) { + params.datefrom = $filter('date')(params.datefrom, 'yyyyMMdd'); + url += connectSymbol + 'datefrom=' + params.datefrom; + connectSymbol = '&'; + } + if (params.dateto) { + params.dateto = $filter('date')(params.dateto, 'yyyyMMdd'); + url += connectSymbol + 'dateto=' + params.dateto; + } + + return url; + }; var getClientUnClearedAmount = function () { $http.get('/client/trans_flow/settlement/unclear').then(function (resp) { $scope.unclear = resp.data; diff --git a/src/main/ui/static/payment/tradelog/templates/partner_settlement_logs.html b/src/main/ui/static/payment/tradelog/templates/partner_settlement_logs.html index aeeaf8dbf..f9b7990a3 100644 --- a/src/main/ui/static/payment/tradelog/templates/partner_settlement_logs.html +++ b/src/main/ui/static/payment/tradelog/templates/partner_settlement_logs.html @@ -88,6 +88,9 @@ + + export +
diff --git a/src/main/ui/static/payment/tradelog/templates/partner_trade_logs.html b/src/main/ui/static/payment/tradelog/templates/partner_trade_logs.html index c27eedccf..1353495e3 100644 --- a/src/main/ui/static/payment/tradelog/templates/partner_trade_logs.html +++ b/src/main/ui/static/payment/tradelog/templates/partner_trade_logs.html @@ -33,7 +33,7 @@
-

{{order.customer_payment_amount|currency:order.currency+' '}} Paid +

{{order.display_amount|currency:order.currency+' '}} Paid Success!

Pay Time:{{order.pay_time_local}}