diff --git a/src/db/modify.sql b/src/db/modify.sql index 41c6cf7c8..da66cb8c9 100644 --- a/src/db/modify.sql +++ b/src/db/modify.sql @@ -139,11 +139,11 @@ ALTER TABLE sys_clients_customers ADD COLUMN channel varchar(15) not NULL ; ALTER TABLE sys_clients_customers ADD COLUMN last_payment_time datetime DEFAULT NULL COMMENT '最后一次付款时间'; ALTER TABLE sys_org ADD COLUMN parent_org_id int(11) DEFAULT NULL; -ALTER TABLE sys_org ADD COLUMN min_wechat_rate DECIMAL(3,2) DEFAULT NULL COMMENT '旗下商户最低微信费率'; -ALTER TABLE sys_org ADD COLUMN min_alipay_rate DECIMAL(3,2) DEFAULT NULL COMMENT '旗下商户最低支付宝费率'; -ALTER TABLE sys_org ADD COLUMN min_alipayonline_rate DECIMAL(3,2) DEFAULT NULL COMMENT '旗下商户最低支付宝线上费率'; -ALTER TABLE sys_org ADD COLUMN min_bestpay_rate DECIMAL(3,2) DEFAULT NULL COMMENT '旗下商户最低翼支付费率'; -ALTER TABLE sys_org ADD COLUMN min_jd_rate DECIMAL(3,2) DEFAULT NULL COMMENT '旗下商户最低京东费率'; +ALTER TABLE sys_org ADD COLUMN min_wechat_rate DECIMAL(3,2) DEFAULT 'NULL' COMMENT '旗下商户最低微信费率'; +ALTER TABLE sys_org ADD COLUMN min_alipay_rate DECIMAL(3,2) DEFAULT 'NULL' COMMENT '旗下商户最低支付宝费率'; +ALTER TABLE sys_org ADD COLUMN min_alipayonline_rate DECIMAL(3,2) DEFAULT 'NULL' COMMENT '旗下商户最低支付宝线上费率'; +ALTER TABLE sys_org ADD COLUMN min_bestpay_rate DECIMAL(3,2) DEFAULT 'NULL' COMMENT '旗下商户最低翼支付费率'; +ALTER TABLE sys_org ADD COLUMN min_jd_rate DECIMAL(3,2) DEFAULT 'NULL' COMMENT '旗下商户最低京东费率'; ALTER TABLE sys_org ADD COLUMN commission_type SMALLINT(1) DEFAULT '1' COMMENT '提成类型 1:渠道计算法 2:总交易额比例 3:收益比例'; @@ -185,3 +185,25 @@ CREATE TABLE `financial_agent_commission_detail` ( alter table financial_partner_commission add column commission_type smallint(1) DEFAULT 1 COMMENT '提成类型 1:渠道计算法 2:总交易额比例 3:收益比例'; alter table financial_partner_commission_detail add column commission_type smallint(1) DEFAULT 1 COMMENT '提成类型 1:渠道计算法 2:总交易额比例 3:收益比例'; + + +INSERT INTO `royalpay_production`.`sys_configs`(`config_key` , `config_value`) +VALUES + ( + 'android_version_content' , + '近期更新:\n\n1、修复了付款二维码的保存可能会失败的错误\n2、新增多种渠道订单及清算\n3、修复清算记录显示错误' + ); + +INSERT INTO `royalpay_production`.`sys_configs`(`config_key` , `config_value`) +VALUES + ( + 'android_version' , + '2.8.1' + ); + +INSERT INTO `royalpay_production`.`sys_configs`(`config_key` , `config_value`) +VALUES + ( + 'android_update' , + 'true' + ); \ No newline at end of file diff --git a/src/main/java/au/com/royalpay/payment/manage/appclient/core/impls/RetailAppServiceImp.java b/src/main/java/au/com/royalpay/payment/manage/appclient/core/impls/RetailAppServiceImp.java index f01490ced..c600744ea 100644 --- a/src/main/java/au/com/royalpay/payment/manage/appclient/core/impls/RetailAppServiceImp.java +++ b/src/main/java/au/com/royalpay/payment/manage/appclient/core/impls/RetailAppServiceImp.java @@ -953,9 +953,9 @@ public class RetailAppServiceImp implements RetailAppService { String version = device.getString("version"); String clientType = device.getString("client_type"); deviceSupport.findRegister(clientType); - String newAppVersion = PlatformEnvironment.getEnv().getNewVersion(); - Boolean isUpdate = PlatformEnvironment.getEnv().isAppUpdate(); - String updateContent = PlatformEnvironment.getEnv().getAppUpdateContent(); + String newAppVersion = PlatformEnvironment.getEnv().getNewVersion(clientType); + Boolean isUpdate = PlatformEnvironment.getEnv().isAppUpdate(clientType); + String updateContent = PlatformEnvironment.getEnv().getAppUpdateContent(clientType); int update_type = 0;// 0:不更新 1:更新 2:强制更新 if (newAppVersion.compareToIgnoreCase(version) > 0) { update_type = 1; diff --git a/src/main/java/au/com/royalpay/payment/manage/cashback/core/CashbackService.java b/src/main/java/au/com/royalpay/payment/manage/cashback/core/CashbackService.java index 52ba05f10..faa58ad37 100644 --- a/src/main/java/au/com/royalpay/payment/manage/cashback/core/CashbackService.java +++ b/src/main/java/au/com/royalpay/payment/manage/cashback/core/CashbackService.java @@ -6,6 +6,7 @@ import com.github.miemiedev.mybatis.paginator.domain.PageBounds; import com.github.miemiedev.mybatis.paginator.domain.PageList; import java.math.BigDecimal; +import java.util.Date; import java.util.List; /** @@ -32,4 +33,6 @@ public interface CashbackService { JSONObject analysisCashback(JSONObject params); void drawDeposits(BigDecimal drawAmount, int clientId, JSONObject operator); + + void saveSurchargeDiscountCashback(int clientId, String clientMoniker, String transactionOrderId, BigDecimal cashbackAmount, Date date, String remark); } \ No newline at end of file diff --git a/src/main/java/au/com/royalpay/payment/manage/cashback/core/impl/CashbackServiceImp.java b/src/main/java/au/com/royalpay/payment/manage/cashback/core/impl/CashbackServiceImp.java index f93ed8d3a..4cd24c53e 100644 --- a/src/main/java/au/com/royalpay/payment/manage/cashback/core/impl/CashbackServiceImp.java +++ b/src/main/java/au/com/royalpay/payment/manage/cashback/core/impl/CashbackServiceImp.java @@ -1,11 +1,14 @@ package au.com.royalpay.payment.manage.cashback.core.impl; import java.math.BigDecimal; +import java.util.Date; import java.util.List; import javax.annotation.Resource; import au.com.royalpay.payment.core.PmtCashbackService; +import org.apache.commons.lang3.RandomStringUtils; +import org.apache.commons.lang3.time.DateFormatUtils; import org.springframework.stereotype.Service; import com.alibaba.fastjson.JSONObject; @@ -111,7 +114,25 @@ public class CashbackServiceImp implements CashbackService { @Override public void drawDeposits(BigDecimal drawAmount, int clientId, JSONObject operator) { - pmtCashbackService.drawDeposits(drawAmount,clientId,operator); + pmtCashbackService.drawDeposits(drawAmount, clientId, operator); + } + + @Override + public void saveSurchargeDiscountCashback(int clientId, String clientMoniker, String transactionOrderId, BigDecimal cashbackAmount, Date date, String remark) { + if (!cashbackRecordsMapper.findBySurchargeDiscountLog(clientId, date).isEmpty()) { + return; + } + String cashback_id = 'R' + clientMoniker + "-" + DateFormatUtils.format(date, "yyyyMMddHHmmssSSS") + "-" + RandomStringUtils.random(3, true, false).toUpperCase(); + //营销账户 + JSONObject cashback = new JSONObject(); + cashback.put("cashback_id", cashback_id); + cashback.put("client_id", clientId); + cashback.put("cashback_amount", cashbackAmount); + cashback.put("order_id", transactionOrderId); + cashback.put("cashback_type", 2); + cashback.put("remark", remark); + cashback.put("create_time", date); + cashbackRecordsMapper.save(cashback); } } diff --git a/src/main/java/au/com/royalpay/payment/manage/management/clearing/core/SettleDelayConfigurer.java b/src/main/java/au/com/royalpay/payment/manage/management/clearing/core/SettleDelayConfigurer.java index 38be7a244..f5e4e0235 100644 --- a/src/main/java/au/com/royalpay/payment/manage/management/clearing/core/SettleDelayConfigurer.java +++ b/src/main/java/au/com/royalpay/payment/manage/management/clearing/core/SettleDelayConfigurer.java @@ -3,7 +3,9 @@ package au.com.royalpay.payment.manage.management.clearing.core; import au.com.royalpay.payment.manage.management.clearing.beans.SettleDelayConfig; import com.alibaba.fastjson.JSONObject; import com.github.miemiedev.mybatis.paginator.domain.PageList; +import org.springframework.transaction.annotation.Transactional; +import java.util.Date; import java.util.List; /** @@ -20,4 +22,6 @@ public interface SettleDelayConfigurer { PageList getClientRank(JSONObject params); + @Transactional + void addCashback(Date date); } diff --git a/src/main/java/au/com/royalpay/payment/manage/management/clearing/core/impl/SettleDelayConfigurerImpl.java b/src/main/java/au/com/royalpay/payment/manage/management/clearing/core/impl/SettleDelayConfigurerImpl.java index 34926db28..96b5e91c2 100644 --- a/src/main/java/au/com/royalpay/payment/manage/management/clearing/core/impl/SettleDelayConfigurerImpl.java +++ b/src/main/java/au/com/royalpay/payment/manage/management/clearing/core/impl/SettleDelayConfigurerImpl.java @@ -1,39 +1,41 @@ package au.com.royalpay.payment.manage.management.clearing.core.impl; -import java.math.BigDecimal; -import java.text.ParseException; -import java.text.SimpleDateFormat; -import java.util.ArrayList; -import java.util.Calendar; -import java.util.Date; -import java.util.HashMap; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; - -import javax.annotation.Resource; - -import org.apache.commons.lang3.time.DateFormatUtils; -import org.apache.commons.lang3.time.DateUtils; -import org.joda.time.DateTime; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.stereotype.Service; - -import com.alibaba.fastjson.JSONObject; -import com.github.miemiedev.mybatis.paginator.domain.Order; -import com.github.miemiedev.mybatis.paginator.domain.PageBounds; -import com.github.miemiedev.mybatis.paginator.domain.PageList; - import au.com.royalpay.payment.core.exceptions.InvalidShortIdException; +import au.com.royalpay.payment.manage.appclient.core.RetailAppService; import au.com.royalpay.payment.manage.cashback.core.CashbackService; import au.com.royalpay.payment.manage.management.clearing.beans.SettleDelayConfig; import au.com.royalpay.payment.manage.management.clearing.core.SettleDelayConfigurer; +import au.com.royalpay.payment.manage.mappers.log.ClearingDetailMapper; import au.com.royalpay.payment.manage.mappers.log.ClearingLogMapper; import au.com.royalpay.payment.manage.mappers.payment.TransactionMapper; import au.com.royalpay.payment.manage.mappers.system.ClientSettleDelayConfMapper; import au.com.royalpay.payment.manage.merchants.core.ClientManager; +import au.com.royalpay.payment.tools.CommonConsts; +import au.com.royalpay.payment.tools.env.PlatformEnvironment; +import au.com.royalpay.payment.tools.exceptions.BadRequestException; +import au.com.royalpay.payment.tools.lock.Locker; +import au.com.royalpay.payment.tools.utils.CurrencyAmountUtils; import au.com.royalpay.payment.tools.utils.PageListUtils; +import com.alibaba.fastjson.JSONObject; +import com.github.miemiedev.mybatis.paginator.domain.Order; +import com.github.miemiedev.mybatis.paginator.domain.PageBounds; +import com.github.miemiedev.mybatis.paginator.domain.PageList; +import org.apache.commons.lang3.time.DateFormatUtils; +import org.apache.commons.lang3.time.DateUtils; +import org.joda.time.DateTime; +import org.joda.time.DateTimeConstants; +import org.joda.time.LocalDate; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.Assert; + +import javax.annotation.Resource; +import java.math.BigDecimal; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.*; /** * Create by yixian at 2017-09-08 15:06 @@ -50,6 +52,12 @@ public class SettleDelayConfigurerImpl implements SettleDelayConfigurer { private TransactionMapper transactionMapper; @Resource private ClearingLogMapper clearingLogMapper; + @Resource + private ClearingDetailMapper clearingDetailMapper; + @Resource + private Locker locker; + @Resource + private RetailAppService retailAppService; private Logger logger = LoggerFactory.getLogger(getClass()); @Override @@ -147,9 +155,9 @@ public class SettleDelayConfigurerImpl implements SettleDelayConfigurer { DateTime dt = new DateTime(jsonObject.getDate("create_time")); int weekOfYear = dt.getWeekOfWeekyear(); JSONObject cashBackMapElement = cashBackMap.get(weekOfYear); - if(cashBackMapElement!=null){ - cashBackMapElement.put("cashback_amount",cashBackMapElement.getBigDecimal("cashback_amount").add(jsonObject.getBigDecimal("cashback_amount"))); - }else { + if (cashBackMapElement != null) { + cashBackMapElement.put("cashback_amount", cashBackMapElement.getBigDecimal("cashback_amount").add(jsonObject.getBigDecimal("cashback_amount"))); + } else { cashBackMap.put(weekOfYear, jsonObject); } } @@ -159,7 +167,7 @@ public class SettleDelayConfigurerImpl implements SettleDelayConfigurer { JSONObject sunday = weekendAnalysisMap.get(resultEntry.getInteger("weekend") + 1); Date saturday = null; try { - saturday = sf.parse(String.valueOf(resultEntry.getInteger("weekend"))); + saturday = sf.parse(String.valueOf(resultEntry.getInteger("weekend"))); } catch (ParseException e) { logger.info("获取延迟清算金额时 日期转换错误"); } @@ -167,11 +175,11 @@ public class SettleDelayConfigurerImpl implements SettleDelayConfigurer { if (resultEntry.getBigDecimal("settle_amount") == null) { continue; } - resultEntry.put("weekend",resultEntry.getIntValue("weekend")+2); + resultEntry.put("weekend", resultEntry.getIntValue("weekend") + 2); resultEntry.put("settle_amount", resultEntry.getBigDecimal("settle_amount").add(sunday.getBigDecimal("settle_amount"))); resultEntry.put("transaction_amount", resultEntry.getBigDecimal("transaction_amount").add(sunday.getBigDecimal("transaction_amount"))); - if (cashBackMap.containsKey(new DateTime(saturday).getWeekOfWeekyear()+1)) { - resultEntry.put("cashback", cashBackMap.get(new DateTime(saturday).getWeekOfWeekyear()+1).getBigDecimal("cashback_amount")); + if (cashBackMap.containsKey(new DateTime(saturday).getWeekOfWeekyear() + 1)) { + resultEntry.put("cashback", cashBackMap.get(new DateTime(saturday).getWeekOfWeekyear() + 1).getBigDecimal("cashback_amount")); } else { resultEntry.put("cashback", 0); } @@ -190,4 +198,75 @@ public class SettleDelayConfigurerImpl implements SettleDelayConfigurer { public PageList getClientRank(JSONObject params) { return cashbackService.getSettleDelayRank(params, new PageBounds(params.getIntValue("page"), params.getIntValue("limit"))); } + + @Override + @Transactional + public void addCashback(Date date) { + String key = "settle_delay_cashback"; + if (!locker.lock(key, 600_000)) { + return; + } + try { + date = DateUtils.truncate(date, Calendar.DATE); + LocalDate processDate = LocalDate.fromDateFields(date); + if (processDate.getDayOfWeek() != DateTimeConstants.TUESDAY) { + throw new BadRequestException("Not tuesday"); + } + LocalDate sunday = processDate.minusDays(processDate.getDayOfWeek()); + LocalDate saturday = sunday.minusDays(1); + List clientAttends = clientSettleDelayConfMapper.listClients(new JSONObject(), new PageBounds()); + for (JSONObject attend : clientAttends) { + Date monday = DateUtils.addDays(date, -1); + if (attend.getDate("from_date").after(monday) || attend.getDate("to_date").before(monday)) { + continue; + } + int clientId = attend.getIntValue("client_id"); + JSONObject client = clientManager.getClientInfo(clientId); + if (client == null) { + continue; + } + String clientMoniker = client.getString("client_moniker"); + JSONObject clearing = clearingDetailMapper.listReport(date, clientId); + if (clearing == null) { + continue; + } + int detailId = clearing.getIntValue("clear_detail_id"); + List settleTrans = transactionMapper.listSettlementTransactions(detailId); + Assert.notEmpty(settleTrans, "No Settle History"); + String transactionOrderId = settleTrans.get(0).getString("order_id"); + List transactions = transactionMapper.listTransactionsOfClearingOrder(detailId, new PageBounds()); + BigDecimal totalSurcharge = BigDecimal.ZERO; + for (JSONObject transaction : transactions) { + Date day = transaction.getDate("transaction_time"); + LocalDate transactionDate = LocalDate.fromDateFields(day); + if (transactionDate.equals(sunday) || transactionDate.equals(saturday)) { + continue; + } + BigDecimal surcharge = transaction.getBigDecimal("clearing_amount").subtract(transaction.getBigDecimal("settle_amount")); + if ("Debit".equals(transaction.getString("transaction_type"))) { + surcharge = surcharge.multiply(BigDecimal.valueOf(-1)); + } + totalSurcharge = totalSurcharge.add(surcharge); + } + BigDecimal cashbackAmount = CurrencyAmountUtils.scale(totalSurcharge.multiply(attend.getBigDecimal("surcharge_discount")).divide(CommonConsts.HUNDRED, 2, BigDecimal.ROUND_HALF_UP), PlatformEnvironment.getEnv().getForeignCurrency()); + String remark = "Surcharge cashback for " + saturday.toString("dd/MMM/yyyy", Locale.ENGLISH) + " ~ " + sunday.toString("dd/MMM/yyyy", Locale.ENGLISH); + if (cashbackAmount.compareTo(BigDecimal.ZERO) > 0) { + cashbackService.saveSurchargeDiscountCashback(clientId, clientMoniker, transactionOrderId, cashbackAmount, date, remark); + try { + if (!PlatformEnvironment.getEnv().isDebug()) { + JSONObject order = new JSONObject(); + order.put("order_id", transactionOrderId); + order.put("client_id", clientId); + retailAppService.sendCashbackMessage(cashbackAmount.toPlainString(), order);// app message + } + } catch (Exception e) { + logger.error("发送App消息失败", e); + } + } + } + } finally { + locker.unlock(key); + } + + } } diff --git a/src/main/java/au/com/royalpay/payment/manage/management/clearing/handlers/SendWeekendDelayCashbackSaver.java b/src/main/java/au/com/royalpay/payment/manage/management/clearing/handlers/SendWeekendDelayCashbackSaver.java new file mode 100644 index 000000000..881694f43 --- /dev/null +++ b/src/main/java/au/com/royalpay/payment/manage/management/clearing/handlers/SendWeekendDelayCashbackSaver.java @@ -0,0 +1,26 @@ +package au.com.royalpay.payment.manage.management.clearing.handlers; + +import au.com.royalpay.payment.core.events.SettleNotifySendingEvent; +import au.com.royalpay.payment.manage.management.clearing.core.SettleDelayConfigurer; +import org.apache.commons.lang3.time.DateUtils; +import org.springframework.context.ApplicationListener; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.Calendar; +import java.util.Date; + +/** + * Create by yixian at 2017-12-25 13:48 + */ +@Service +public class SendWeekendDelayCashbackSaver implements ApplicationListener { + @Resource + private SettleDelayConfigurer settleDelayConfigurer; + + @Override + public void onApplicationEvent(SettleNotifySendingEvent event) { + Date eventTime = new Date(event.getEventTime()); + settleDelayConfigurer.addCashback(DateUtils.truncate(eventTime, Calendar.DATE)); + } +} diff --git a/src/main/java/au/com/royalpay/payment/manage/management/sysconfig/web/SysConfigController.java b/src/main/java/au/com/royalpay/payment/manage/management/sysconfig/web/SysConfigController.java index cee5b6558..6aaea6373 100644 --- a/src/main/java/au/com/royalpay/payment/manage/management/sysconfig/web/SysConfigController.java +++ b/src/main/java/au/com/royalpay/payment/manage/management/sysconfig/web/SysConfigController.java @@ -4,12 +4,19 @@ import au.com.royalpay.payment.manage.management.sysconfig.core.ClearDateManager import au.com.royalpay.payment.manage.permission.manager.ManagerMapping; import au.com.royalpay.payment.tools.env.SysConfigManager; import au.com.royalpay.payment.tools.permission.enums.ManagerRole; + import com.alibaba.fastjson.JSONObject; -import org.springframework.web.bind.annotation.*; -import javax.annotation.Resource; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RestController; + import java.util.List; +import javax.annotation.Resource; + /** * Created by yixian on 2017-01-06. */ @@ -40,4 +47,9 @@ public class SysConfigController { public void updateMonthClearDays(@PathVariable String monthPattern, @RequestBody List days) { clearDateManager.setMonthClearDays(monthPattern, days); } + + + public static void main(String[] args) { + System.out.println("asd".equals(null)); + } } diff --git a/src/main/resources/templates/mail/new_client_notice.html b/src/main/resources/templates/mail/new_client_notice.html index 63f92795f..92b414be8 100644 --- a/src/main/resources/templates/mail/new_client_notice.html +++ b/src/main/resources/templates/mail/new_client_notice.html @@ -92,7 +92,7 @@ Service WeChat Account:

- Level 2, 50 Bridge Street, Sydney NSW 2000
+ Level 14, 383 Kent Street, Sydney NSW 2000

Level 11, 15 William Street, Melbourne VIC 3000

diff --git a/src/main/resources/templates/mail/settlement_mail.html b/src/main/resources/templates/mail/settlement_mail.html index cdf158df8..2646fe311 100644 --- a/src/main/resources/templates/mail/settlement_mail.html +++ b/src/main/resources/templates/mail/settlement_mail.html @@ -13,7 +13,7 @@

Representative of AFS Licensee 448066

------------------------------

Lv.11,15 William Street, Melbourne 3000

-

Lv.7, 50 Bridge Street, Sydney, NSW 2000

+

Lv.14, 383 Kent Street, Sydney, NSW 2000

P: 1300 1077 50

E: settlement@royalpay.com.au

www.royalpay.com.au

diff --git a/src/main/ui/partner_register.html b/src/main/ui/partner_register.html index 3a5dc375a..92e7be85a 100644 --- a/src/main/ui/partner_register.html +++ b/src/main/ui/partner_register.html @@ -564,8 +564,8 @@