diff --git a/pom.xml b/pom.xml index 8b9c8d116..8644ecb65 100644 --- a/pom.xml +++ b/pom.xml @@ -10,7 +10,7 @@ 4.0.0 manage - 1.0.20 + 1.0.21 UTF-8 diff --git a/src/db/1.0.21/update.sql b/src/db/1.0.21/update.sql new file mode 100644 index 000000000..1d0d616f3 --- /dev/null +++ b/src/db/1.0.21/update.sql @@ -0,0 +1,3 @@ +alter table sys_clients add column settle_remark_tpl varchar(100) null default null after settle_hour; + +insert into sys_configs values ('settle.remark_template','RoyalPay{date(MMdd)}{moniker}','清算文件备注模板'); \ No newline at end of file diff --git a/src/main/java/au/com/royalpay/payment/manage/management/clearing/core/impl/CleanServiceImpl.java b/src/main/java/au/com/royalpay/payment/manage/management/clearing/core/impl/CleanServiceImpl.java index b89d40a3e..5a4786462 100644 --- a/src/main/java/au/com/royalpay/payment/manage/management/clearing/core/impl/CleanServiceImpl.java +++ b/src/main/java/au/com/royalpay/payment/manage/management/clearing/core/impl/CleanServiceImpl.java @@ -16,6 +16,7 @@ import au.com.royalpay.payment.manage.signin.core.ManagerTodoNoticeProvider; import au.com.royalpay.payment.manage.support.abafile.ABAConfig; import au.com.royalpay.payment.manage.support.abafile.ABAFile; import au.com.royalpay.payment.manage.support.abafile.ABATemplate; +import au.com.royalpay.payment.manage.support.abafile.SettleRemarkTemplateDescriber; import au.com.royalpay.payment.manage.tradelog.beans.ClearingLogQuery; import au.com.royalpay.payment.tools.connections.mpsupport.MpWechatApi; import au.com.royalpay.payment.tools.connections.mpsupport.MpWechatApiProvider; @@ -528,8 +529,16 @@ public class CleanServiceImpl implements CleanService, ManagerTodoNoticeProvider if (settle.getBigDecimal("clearing_amount").compareTo(BigDecimal.ZERO) == 0) { continue; } - String clientMoniker = settle.getString("client_moniker"); - String remark = "RoyalPay" + DateFormatUtils.format(dt, "MMdd") + clientMoniker; + JSONObject client = clientManager.getClientInfo(settle.getIntValue("client_id")); + String remarkTpl = client.getString("settle_remark_tpl"); + if (StringUtils.isEmpty(remarkTpl)) { + remarkTpl = sysConfigManager.getSysConfig().getString("settle.remark_template"); + if (StringUtils.isEmpty(remarkTpl)) { + remarkTpl = "RoyalPay{date(MMdd)}{moniker}"; + } + } + + String remark = new SettleRemarkTemplateDescriber(remarkTpl, settle, dt).compile(); aba.addSettleMerchant(settle.getString("bsb_no"), settle.getString("account_no"), settle.getString("account_name"), settle.getBigDecimal("clearing_amount"), remark); } diff --git a/src/main/java/au/com/royalpay/payment/manage/support/abafile/SettleRemarkTemplateDescriber.java b/src/main/java/au/com/royalpay/payment/manage/support/abafile/SettleRemarkTemplateDescriber.java new file mode 100644 index 000000000..dc5554675 --- /dev/null +++ b/src/main/java/au/com/royalpay/payment/manage/support/abafile/SettleRemarkTemplateDescriber.java @@ -0,0 +1,93 @@ +package au.com.royalpay.payment.manage.support.abafile; + +import com.alibaba.fastjson.JSONObject; +import org.apache.commons.lang3.StringUtils; +import org.apache.commons.lang3.time.DateFormatUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + * Create by davep at 2019-07-18 15:20 + */ +public class SettleRemarkTemplateDescriber { + private Logger logger = LoggerFactory.getLogger(getClass()); + private final Pattern pattern = Pattern.compile("\\{[^\\{\\}]+\\}"); + private final JSONObject settle; + private final Date settleDate; + private String template; + private List replacers; + + public SettleRemarkTemplateDescriber(String template, JSONObject settle, Date settleDate) { + this.template = template; + this.settle = settle; + this.settleDate = settleDate; + replacers = new ArrayList<>(); + replacers.add(new ClientMonikerReplacer()); + replacers.add(new SettleDateReplacer()); + } + + public String compile() { + Matcher matcher = pattern.matcher(template); + StringBuilder target = new StringBuilder(); + int startPos = 0; + while (matcher.find()) { + int start = matcher.start(); + int end = matcher.end(); + target.append(template, startPos, start); + String group = StringUtils.substring(matcher.group(), 1, -1); + String replacement = replacers.stream().filter(replacer -> replacer.match(group)) + .limit(1) + .map(replacer -> replacer.replacement(group, SettleRemarkTemplateDescriber.this)) + .findFirst().orElse(""); + target.append(replacement); + startPos = end; + } + target.append(template.substring(startPos)); + return target.toString(); + } + + interface Replacer { + boolean match(String group); + + String replacement(String group, SettleRemarkTemplateDescriber describer); + } + + class ClientMonikerReplacer implements Replacer { + + @Override + public boolean match(String group) { + return "moniker".equals(group); + } + + @Override + public String replacement(String group, SettleRemarkTemplateDescriber describer) { + return describer.settle.getString("client_moniker"); + } + } + + class SettleDateReplacer implements Replacer { + private final String regex = "^date\\((\\w+)\\)$"; + + @Override + public boolean match(String group) { + return group.matches(regex); + } + + @Override + public String replacement(String group, SettleRemarkTemplateDescriber describer) { + Pattern dtPattern = Pattern.compile(regex); + Matcher matcher = dtPattern.matcher(group); + if (matcher.find()) { + String datePattern = matcher.group(1); + return DateFormatUtils.format(describer.settleDate, datePattern); + } + return ""; + } + } +} diff --git a/src/test/java/au/com/royalpay/payment/manage/support/abafile/SettleRemarkTemplateDescriberTest.java b/src/test/java/au/com/royalpay/payment/manage/support/abafile/SettleRemarkTemplateDescriberTest.java new file mode 100644 index 000000000..7ba990ab5 --- /dev/null +++ b/src/test/java/au/com/royalpay/payment/manage/support/abafile/SettleRemarkTemplateDescriberTest.java @@ -0,0 +1,34 @@ +package au.com.royalpay.payment.manage.support.abafile; + +import com.alibaba.fastjson.JSONObject; +import org.joda.time.DateTime; +import org.junit.Assert; +import org.junit.Test; + +import java.util.Date; + +import static org.junit.Assert.*; + +/** + * Create by davep at 2019-07-18 15:27 + */ +public class SettleRemarkTemplateDescriberTest { + + @Test + public void compile() { + JSONObject settle = new JSONObject(); + settle.put("client_moniker", "PINE"); + SettleRemarkTemplateDescriber describer = new SettleRemarkTemplateDescriber("RoyalPay{date(MMdd)}{moniker}", settle, DateTime.parse("2019-07-18").toDate()); + String result = describer.compile(); + Assert.assertEquals("RoyalPay0718PINE", result); + } + + @Test + public void compile2() { + JSONObject settle = new JSONObject(); + settle.put("client_moniker", "AUPO"); + SettleRemarkTemplateDescriber describer = new SettleRemarkTemplateDescriber("Pay By App {date(ddMMyy)}", settle, DateTime.parse("2019-07-18").toDate()); + String res = describer.compile(); + Assert.assertEquals("Pay By App 180719", res); + } +} \ No newline at end of file