diff --git a/src/main/java/au/com/royalpay/payment/manage/appclient/core/RetailAppService.java b/src/main/java/au/com/royalpay/payment/manage/appclient/core/RetailAppService.java index b59deeae7..b0138c63c 100644 --- a/src/main/java/au/com/royalpay/payment/manage/appclient/core/RetailAppService.java +++ b/src/main/java/au/com/royalpay/payment/manage/appclient/core/RetailAppService.java @@ -160,4 +160,7 @@ public interface RetailAppService { JSONObject ctripCouponInfo(JSONObject device,String coupon_id); + JSONObject getCouponCusCouponLog(String client_moniker, AppQueryBean appQueryBean); + + void saveCouponAccuessLog(int client_id, String coupon_id); } 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 90341fb31..8ad7cf913 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 @@ -172,6 +172,10 @@ public class RetailAppServiceImp implements RetailAppService { private ClearingLogMapper clearingLogMapper; @Resource private CustomerServiceService customerServiceService; + @Resource + private CouponAccuessLogMapper couponAccuessLogMapper; + @Resource + private CouponValidateService couponValidateService; private Map senderMap = new HashMap<>(); private final String fileName[] = { "client_bank_file", "client_id_file", "client_company_file" }; @@ -447,10 +451,52 @@ public class RetailAppServiceImp implements RetailAppService { @Override public JSONObject ctripCouponInfo(JSONObject device, String coupon_id) { - return couponVerificationService.ctripCouponInfo(coupon_id,device.getIntValue("client_id")); + return couponVerificationService.ctripCouponInfo(coupon_id,device.getIntValue("client_id"), true); } + @Override + public JSONObject getCouponCusCouponLog(String client_moniker, AppQueryBean appQueryBean) { + JSONObject client = clientMapper.findClientByMoniker(client_moniker); + if (client == null) { + throw new BadRequestException("Partner not exists"); + } + PageList cusCouponLogs = couponAccuessLogMapper.getCouponAccuessLog( + client.getIntValue("client_id"), new PageBounds(appQueryBean.getPage(), appQueryBean.getLimit(), Order.formString("creation_date.desc"))); + HashMap couponMap = new HashMap<>(); + for(JSONObject cusCouponLog : cusCouponLogs) { + cusCouponLog.put("client_moniker", client_moniker); + if (couponMap.containsKey(cusCouponLog.getString("coupon_id"))) { + cusCouponLog.put("coupon", couponMap.get(cusCouponLog.getString("coupon_id"))); + continue; + } + JSONObject coupon = couponValidateService.ctripCouponInfo(cusCouponLog.getString("coupon_id"), cusCouponLog.getIntValue("client_id"), false); + couponMap.put(cusCouponLog.getString("coupon_id"), coupon); + cusCouponLog.put("coupon", coupon); + } + return PageListUtils.buildPageListResult(cusCouponLogs); + } + + @Override + public void saveCouponAccuessLog(int client_id, String coupon_id) { + JSONObject client = clientMapper.findClient(client_id); + if (client == null) { + throw new BadRequestException("Partner not exists"); + } + JSONObject couponAccuessLog = new JSONObject(); + Date date = new Date(); + couponAccuessLog.put("client_id", client_id); + couponAccuessLog.put("order_id", "非平台订单"); + couponAccuessLog.put("coupon_id", coupon_id); + couponAccuessLog.put("customer_openid", "非平台订单"); + couponAccuessLog.put("coupon_deal_amount", 0); + couponAccuessLog.put("currency", "AUD"); + couponAccuessLog.put("creation_date", date); + couponAccuessLog.put("last_update_date", date); + couponAccuessLog.put("is_valid", 1); + couponAccuessLogMapper.save(couponAccuessLog); + } + @Override public void updateClient(JSONObject device, AppClientBean appClientBean) { String clientType = device.getString("client_type"); @@ -729,33 +775,6 @@ public class RetailAppServiceImp implements RetailAppService { TimeZoneUtils.switchTimeZone(orders, query.getTimezone(), "create_time", "transaction_time", "confirm_time"); ArrayList date_contains = new ArrayList<>(); for (JSONObject order : orders) { - String customer_id = order.getString("customer_id"); - if (StringUtils.isEmpty(customer_id)) { - continue; - } - switch (order.getString("channel")) { - case "Alipay": - JSONObject alipayUser = managerCustomerRelationAlipayMapper.findCustomerByUserId(customer_id); - if (alipayUser != null) { - order.put("nickname", alipayUser.getString("nickname")); - order.put("headimg", alipayUser.getString("headimg")); - } - break; - case "Wechat": - JSONObject weUser = new JSONObject(); - if (customer_id.startsWith("olH")) { - weUser = customerMapper.findCustomerGlobalpayByOpenId(customer_id); - } else { - weUser = customerMapper.findCustomerByOpenId(customer_id); - } - if (weUser != null && !weUser.isEmpty()) { - order.put("nickname", weUser.getString("nickname")); - order.put("headimg", weUser.getString("headimg")); - } - break; - default: - break; - } Calendar calendar = (Calendar) order.get("transaction_time"); String trade_date = DateFormatUtils.format(calendar, "yyyy-MM-dd", calendar.getTimeZone()); String trade_time = DateFormatUtils.format(calendar, "HH:mm:ss", calendar.getTimeZone()); @@ -785,6 +804,33 @@ public class RetailAppServiceImp implements RetailAppService { order.put("date_total", analysis); date_contains.add(trade_date); } + String customer_id = order.getString("customer_id"); + if (StringUtils.isEmpty(customer_id)) { + continue; + } + switch (order.getString("channel")) { + case "Alipay": + JSONObject alipayUser = managerCustomerRelationAlipayMapper.findCustomerByUserId(customer_id); + if (alipayUser != null) { + order.put("nickname", alipayUser.getString("nickname")); + order.put("headimg", alipayUser.getString("headimg")); + } + break; + case "Wechat": + JSONObject weUser = new JSONObject(); + if (customer_id.startsWith("olH")) { + weUser = customerMapper.findCustomerGlobalpayByOpenId(customer_id); + } else { + weUser = customerMapper.findCustomerByOpenId(customer_id); + } + if (weUser != null && !weUser.isEmpty()) { + order.put("nickname", weUser.getString("nickname")); + order.put("headimg", weUser.getString("headimg")); + } + break; + default: + break; + } } return PageListUtils.buildPageListResult(orders); } diff --git a/src/main/java/au/com/royalpay/payment/manage/appclient/web/RetailAppController.java b/src/main/java/au/com/royalpay/payment/manage/appclient/web/RetailAppController.java index 56bd28d16..003e7b8ca 100644 --- a/src/main/java/au/com/royalpay/payment/manage/appclient/web/RetailAppController.java +++ b/src/main/java/au/com/royalpay/payment/manage/appclient/web/RetailAppController.java @@ -564,4 +564,14 @@ public class RetailAppController { return retailAppService.ctripCouponInfo(device,couponId); } + @RequestMapping(value = "/cus/coupon_accuess_log/{client_moniker}", method = RequestMethod.GET) + public JSONObject getCouponLogByClientMoniker(@PathVariable String client_moniker, AppQueryBean appQueryBean) { + return retailAppService.getCouponCusCouponLog(client_moniker, appQueryBean); + } + + @RequestMapping(value = "/cus/coupon_accuess_log/{coupon_id}", method = RequestMethod.POST) + public void saveCouponAccuessLog(@PathVariable String coupon_id, @RequestParam int client_id) { + retailAppService.saveCouponAccuessLog(client_id, coupon_id); + } + } diff --git a/src/main/java/au/com/royalpay/payment/manage/apps/events/listeners/AfterPaymentFinishListener.java b/src/main/java/au/com/royalpay/payment/manage/apps/events/listeners/AfterPaymentFinishListener.java index 30f21ef73..5aecb73bf 100644 --- a/src/main/java/au/com/royalpay/payment/manage/apps/events/listeners/AfterPaymentFinishListener.java +++ b/src/main/java/au/com/royalpay/payment/manage/apps/events/listeners/AfterPaymentFinishListener.java @@ -1,12 +1,14 @@ package au.com.royalpay.payment.manage.apps.events.listeners; import au.com.royalpay.payment.core.events.AfterPaymentFinishEvent; +import au.com.royalpay.payment.manage.customers.core.CustomerPaymentInfoService; +import au.com.royalpay.payment.manage.mappers.system.SysCustomerPaymentInfoMapper; +import au.com.royalpay.payment.manage.merchants.core.ClientManager; import com.alibaba.fastjson.JSONObject; +import org.apache.commons.lang3.StringUtils; import org.springframework.context.ApplicationListener; -import org.springframework.data.redis.core.BoundListOperations; -import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.stereotype.Service; import javax.annotation.Resource; @@ -17,12 +19,38 @@ import javax.annotation.Resource; @Service public class AfterPaymentFinishListener implements ApplicationListener { @Resource - private StringRedisTemplate stringRedisTemplate; + private SysCustomerPaymentInfoMapper sysCustomerPaymentInfoMapper; + @Resource + private CustomerPaymentInfoService customerPaymentInfoService; + @Resource + private ClientManager clientManager; @Override public void onApplicationEvent(AfterPaymentFinishEvent event) { JSONObject order = event.getFinishedEvent().getOrder(); - BoundListOperations ops = stringRedisTemplate.boundListOps("customer_impression"); - ops.rightPush(order.toJSONString()); + if(!"hf".equals(order.getString("channel"))){ + return; + } + if(StringUtils.isEmpty(order.getString("ext_params"))){ + return; + } + JSONObject extParam = JSONObject.parseObject(order.getString("ext_params")); + JSONObject orderInfo = sysCustomerPaymentInfoMapper.selectPaymentInfo(order.getString("customer_id")); + if (orderInfo != null) { + orderInfo.put("idcard_name", extParam.getString("payer_name")); + orderInfo.put("idcard_no", extParam.getString("payer_identity_card")); + orderInfo.put("bankcard", extParam.getString("card_number")); + orderInfo.put("bank", extParam.getString("bankId")); + sysCustomerPaymentInfoMapper.update(orderInfo); + }else { + JSONObject lastOrderInfo = new JSONObject(); + lastOrderInfo.put("wechat_openid", order.getString("customer_id")); + lastOrderInfo.put("idcard_name", extParam.getString("payer_name")); + lastOrderInfo.put("idcard_no", extParam.getString("payer_identity_card")); + lastOrderInfo.put("bankcard", extParam.getString("card_number")); + lastOrderInfo.put("bank", extParam.getString("bankId")); + customerPaymentInfoService.save(lastOrderInfo); + } + clientManager.sendHfEmailNotice(order); } } \ No newline at end of file diff --git a/src/main/java/au/com/royalpay/payment/manage/customers/core/CouponValidateService.java b/src/main/java/au/com/royalpay/payment/manage/customers/core/CouponValidateService.java index aa4c83f1f..12daea020 100644 --- a/src/main/java/au/com/royalpay/payment/manage/customers/core/CouponValidateService.java +++ b/src/main/java/au/com/royalpay/payment/manage/customers/core/CouponValidateService.java @@ -18,7 +18,7 @@ public interface CouponValidateService { JSONObject ctripCheck(int client_id); - JSONObject ctripCouponInfo(String coupon_log_id,int client_id); + JSONObject ctripCouponInfo(String coupon_log_id,int client_id,boolean is_expiry); JSONObject ctripCouponLogNotice(String coupon_log_id,String order_id,String open_id,String status); } diff --git a/src/main/java/au/com/royalpay/payment/manage/customers/core/CustomerPaymentInfoService.java b/src/main/java/au/com/royalpay/payment/manage/customers/core/CustomerPaymentInfoService.java new file mode 100644 index 000000000..ed472ea8c --- /dev/null +++ b/src/main/java/au/com/royalpay/payment/manage/customers/core/CustomerPaymentInfoService.java @@ -0,0 +1,12 @@ +package au.com.royalpay.payment.manage.customers.core; + +import com.alibaba.fastjson.JSONObject; + +public interface CustomerPaymentInfoService { + + void save(JSONObject paymentInfo); + + void update(JSONObject paymentInfo); + + JSONObject selectPaymentInfoByOpenId(String open_id); +} diff --git a/src/main/java/au/com/royalpay/payment/manage/customers/core/impls/CouponValidateServiceImpl.java b/src/main/java/au/com/royalpay/payment/manage/customers/core/impls/CouponValidateServiceImpl.java index bca4104db..4de0054a5 100644 --- a/src/main/java/au/com/royalpay/payment/manage/customers/core/impls/CouponValidateServiceImpl.java +++ b/src/main/java/au/com/royalpay/payment/manage/customers/core/impls/CouponValidateServiceImpl.java @@ -177,7 +177,7 @@ public class CouponValidateServiceImpl implements CouponValidateService { } @Override - public JSONObject ctripCouponInfo(String coupon_id, int client_id) { + public JSONObject ctripCouponInfo(String coupon_id, int client_id, boolean is_expiry) { JSONObject client = clientManager.getClientInfo(client_id); if(client==null){ throw new NotFoundException("Merchant Not Found"); @@ -185,6 +185,9 @@ public class CouponValidateServiceImpl implements CouponValidateService { String uri = signUrl(UriComponentsBuilder.fromHttpUrl(CUSTOMER_HOST + "/coupon/"+coupon_id+"/couponLogInfo")); HttpRequestGenerator gen = new HttpRequestGenerator(uri, RequestMethod.GET); gen.addQueryString("client_moniker",client.getString("client_moniker")); + if (!is_expiry) { + gen.addQueryString("is_expiry", "0"); + } try { HttpRequestResult reqResult = gen.execute(); if (reqResult.isSuccess()) { diff --git a/src/main/java/au/com/royalpay/payment/manage/customers/core/impls/CustomerPaymentInfoImpl.java b/src/main/java/au/com/royalpay/payment/manage/customers/core/impls/CustomerPaymentInfoImpl.java new file mode 100644 index 000000000..6e40b71a0 --- /dev/null +++ b/src/main/java/au/com/royalpay/payment/manage/customers/core/impls/CustomerPaymentInfoImpl.java @@ -0,0 +1,39 @@ +package au.com.royalpay.payment.manage.customers.core.impls; + +import au.com.royalpay.payment.manage.customers.core.CustomerPaymentInfoService; +import au.com.royalpay.payment.manage.mappers.system.SysCustomerPaymentInfoMapper; +import au.com.royalpay.payment.tools.exceptions.BadRequestException; +import au.com.royalpay.payment.tools.utils.id.IdUtil; +import com.alibaba.fastjson.JSONObject; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; + +@Service +public class CustomerPaymentInfoImpl implements CustomerPaymentInfoService { + @Resource + private SysCustomerPaymentInfoMapper sysCustomerPaymentInfoMapper; + + @Override + public void save(JSONObject paymentInfo) { + if (sysCustomerPaymentInfoMapper.selectPaymentInfo(paymentInfo.getString("wechat_openid")) != null) { + throw new BadRequestException("openid already exists"); + } + + paymentInfo.put("id", IdUtil.getId()); + sysCustomerPaymentInfoMapper.save(paymentInfo); + } + + @Override + public void update(JSONObject paymentInfo) { + if (paymentInfo.getString("id") == null) { + throw new BadRequestException("ID is empty"); + } + sysCustomerPaymentInfoMapper.update(paymentInfo); + } + + @Override + public JSONObject selectPaymentInfoByOpenId(String open_id) { + return sysCustomerPaymentInfoMapper.selectPaymentInfo(open_id); + } +} diff --git a/src/main/java/au/com/royalpay/payment/manage/customers/web/CustomerPaymentInfoController.java b/src/main/java/au/com/royalpay/payment/manage/customers/web/CustomerPaymentInfoController.java new file mode 100644 index 000000000..a401def85 --- /dev/null +++ b/src/main/java/au/com/royalpay/payment/manage/customers/web/CustomerPaymentInfoController.java @@ -0,0 +1,30 @@ +package au.com.royalpay.payment.manage.customers.web; + +import au.com.royalpay.payment.manage.customers.core.CustomerPaymentInfoService; +import com.alibaba.fastjson.JSONObject; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; + +@RestController +@RequestMapping(value = "/customer/payment") +public class CustomerPaymentInfoController { + + @Resource + private CustomerPaymentInfoService customerPaymentInfoService; + + @RequestMapping(value = "/update", method = RequestMethod.POST) + public void savePaymentInfo(@RequestBody JSONObject paymentInfo) { + customerPaymentInfoService.save(paymentInfo); + } + + @RequestMapping(value = "/update", method = RequestMethod.PUT) + public void updatePaymentInfo(@RequestBody JSONObject paymentInfo) { + customerPaymentInfoService.update(paymentInfo); + } + + @RequestMapping(value = "/{openid}/check", method = RequestMethod.GET) + public JSONObject selectPaymentInfo(@PathVariable String openid) { + return customerPaymentInfoService.selectPaymentInfoByOpenId(openid); + } +} diff --git a/src/main/java/au/com/royalpay/payment/manage/dev/core/HfUpdateService.java b/src/main/java/au/com/royalpay/payment/manage/dev/core/HfUpdateService.java new file mode 100644 index 000000000..bc5cf8b27 --- /dev/null +++ b/src/main/java/au/com/royalpay/payment/manage/dev/core/HfUpdateService.java @@ -0,0 +1,9 @@ +package au.com.royalpay.payment.manage.dev.core; + +import com.alibaba.fastjson.JSONObject; + +public interface HfUpdateService { + + String updateStatus(); + +} diff --git a/src/main/java/au/com/royalpay/payment/manage/dev/core/impl/HfUpdateImpl.java b/src/main/java/au/com/royalpay/payment/manage/dev/core/impl/HfUpdateImpl.java new file mode 100644 index 000000000..4d10674de --- /dev/null +++ b/src/main/java/au/com/royalpay/payment/manage/dev/core/impl/HfUpdateImpl.java @@ -0,0 +1,44 @@ +package au.com.royalpay.payment.manage.dev.core.impl; + +import au.com.royalpay.payment.manage.dev.core.HfUpdateService; +import au.com.royalpay.payment.manage.mappers.system.ClientConfigMapper; +import au.com.royalpay.payment.manage.mappers.system.ClientMapper; +import au.com.royalpay.payment.tools.connections.mpsupport.MpWechatApi; +import au.com.royalpay.payment.tools.connections.mpsupport.MpWechatApiProvider; +import au.com.royalpay.payment.tools.env.PlatformEnvironment; + +import com.alibaba.fastjson.JSONObject; + +import org.springframework.stereotype.Service; + +import java.util.List; + +import javax.annotation.Resource; + +@Service +public class HfUpdateImpl implements HfUpdateService { + @Resource + private ClientMapper clientMapper; + @Resource + private MpWechatApiProvider mpWechatApiProvider; + @Resource + private ClientConfigMapper clientConfigMapper; + + @Override + public String updateStatus() { + List clientIds = clientMapper.findByhfPayUrlNotNull(); + clientIds.forEach(dbResult -> { + String longUrl = PlatformEnvironment.getEnv().concatUrl("/api/v1.0/hf_gateway/partners/" + dbResult.getString("client_moniker") + "/jump/pc"); + MpWechatApi api = mpWechatApiProvider.getNewPaymentApi(); + String url = api.registerShortUrl(longUrl); + dbResult.put("hf_pay_url", url); + JSONObject config = new JSONObject(); + config.put("client_id",dbResult.getString("client_id")); + config.put("hf_pay_url", url); + clientConfigMapper.update(config); + clientMapper.update(dbResult); + + }); + return "ok"; + } +} 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 49f0e0b42..dfbeebe28 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 @@ -13,10 +13,7 @@ import au.com.royalpay.payment.manage.appclient.core.RetailAppService; import au.com.royalpay.payment.manage.dev.bean.AliExcel; import au.com.royalpay.payment.manage.dev.bean.Message; import au.com.royalpay.payment.manage.dev.bean.SendWechatMessage; -import au.com.royalpay.payment.manage.dev.core.AliforexcelService; -import au.com.royalpay.payment.manage.dev.core.HfClearAmountService; -import au.com.royalpay.payment.manage.dev.core.NewpartnerService; -import au.com.royalpay.payment.manage.dev.core.WechatMessageService; +import au.com.royalpay.payment.manage.dev.core.*; import au.com.royalpay.payment.manage.mappers.customers.CustomerEncourageMoneyUseLogMapper; import au.com.royalpay.payment.manage.mappers.log.NotifyErrorLogMapper; import au.com.royalpay.payment.manage.mappers.payment.OrderMapper; @@ -110,6 +107,8 @@ public class TestController implements ApplicationEventPublisherAware { private AliforexcelService aliforexcelService; @Resource private HfClearAmountService hfClearAmountService; + @Resource + private HfUpdateService hfUpdateService; @ManagerMapping(value = "/{clientMoniker}/export/agreepdf", method = RequestMethod.GET, role = {ManagerRole.ADMIN, ManagerRole.DIRECTOR, ManagerRole.OPERATOR}) public void exportAgreeFile(@PathVariable String clientMoniker, @ModelAttribute(CommonConsts.MANAGER_STATUS) JSONObject manager, HttpServletResponse httpResponse) throws Exception { @@ -394,7 +393,12 @@ public class TestController implements ApplicationEventPublisherAware { } @ManagerMapping(value = "/hfClearAmount", method = RequestMethod.GET, role = ManagerRole.DEVELOPER) - public JSONObject hfClearAmount(@RequestParam String datefrom, @RequestParam String dateto) { + public JSONObject hfUpdate(@RequestParam String datefrom, @RequestParam String dateto) { return hfClearAmountService.hfjsonobject(dateto,datefrom); } + + @ManagerMapping(value = "/hfUpdate", method = RequestMethod.GET, role = ManagerRole.DEVELOPER) + public String hfClearAmount() { + return hfUpdateService.updateStatus(); + } } diff --git a/src/main/java/au/com/royalpay/payment/manage/management/clearing/core/CleanService.java b/src/main/java/au/com/royalpay/payment/manage/management/clearing/core/CleanService.java index 09518584a..da0346bf6 100644 --- a/src/main/java/au/com/royalpay/payment/manage/management/clearing/core/CleanService.java +++ b/src/main/java/au/com/royalpay/payment/manage/management/clearing/core/CleanService.java @@ -31,6 +31,8 @@ public interface CleanService { JSONObject getClearDetails(Date dt, String managerId); + JSONObject getClearDetailsLimit20(Date dt, String managerId); + JSONObject getCleanLogTransactions(int detailId, JSONObject manager); Map getDayAndChannelOfAnalysisMap(int detailId, String channel,JSONObject manager); 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 b419e9a95..996bd833a 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 @@ -248,6 +248,69 @@ public class CleanServiceImpl implements CleanService, ManagerTodoNoticeProvider return total; } + @Override + public JSONObject getClearDetailsLimit20(Date settleDate, String managerId) { + List logs = clearingLogMapper.findByDate(settleDate); + if (logs.isEmpty()) { + throw new NotFoundException(); + } + JSONObject total = new JSONObject(); + total.put("settle_date", settleDate); + total.put("total_credit", 0); + total.put("total_debit", 0); + total.put("gross_amount", 0); + total.put("wechat_charge", 0); + total.put("royalpay_charge", 0); + total.put("net_amount", 0); + total.put("total_charge", 0); + total.put("tax_amount", 0); + total.put("charge_cashback", 0); + + List details = new ArrayList<>(); + List totalList = new ArrayList<>(); + int clearingId = 0; + for (JSONObject log : logs) { + addBigDecimal(total, log, "total_credit"); + addBigDecimal(total, log, "total_debit"); + addBigDecimal(total, log, "gross_amount"); + addBigDecimal(total, log, "wechat_charge"); + addBigDecimal(total, log, "royalpay_charge"); + addBigDecimal(total, log, "net_amount"); + addBigDecimal(total, log, "total_charge"); + addBigDecimal(total, log, "charge_cashback"); + addBigDecimal(total, log, "tax_amount"); + clearingId = log.getIntValue("clearing_id"); + List logDetails = clearingDetailMapper.listReportsOfSettlementLimit20(clearingId); + details.addAll(logDetails); + List banks = logDetails.stream().map(detail -> detail.getString("settle_bank")).distinct().collect(Collectors.toList()); + + List bankStatistics = banks.stream().map(bank -> { + JSONObject data = new JSONObject(); + data.put("bank", bank); + data.put("total_settle", logDetails.stream() + .filter(detail -> bank.equals(detail.getString("settle_bank"))) + .map(detail -> detail.getBigDecimal("clearing_amount")) + .reduce(BigDecimal::add) + ); + data.put("clients", logDetails.stream() + .filter(detail -> bank.equals(detail.getString("settle_bank"))) + .count()); + return data; + }).collect(Collectors.toList()); + //bankStatistics.put() + log.put("bank_statistics", bankStatistics); + log.put("editable", DateUtils.isSameDay(log.getDate("settle_date"), new Date()) && log.getBooleanValue("editable")); + log.put("channel_analysis", clearingDetailAnalysisMapper.analysisChannelReport(clearingId)); + } + totalList = clearingDetailMapper.listRepostTotal(clearingId); + total.put("totalList", totalList); + total.put("logs", logs); + total.put("details", details); + List channels = clearingDetailAnalysisMapper.analysisChannelReportDaily(settleDate); + total.put("channel_analysis", channels); + return total; + } + private void addBigDecimal(JSONObject total, JSONObject log, String key) { total.put(key, total.getBigDecimal(key).add(log.getBigDecimal(key))); } diff --git a/src/main/java/au/com/royalpay/payment/manage/management/clearing/web/SettlementDevController.java b/src/main/java/au/com/royalpay/payment/manage/management/clearing/web/SettlementDevController.java index f4dea7830..b010016c2 100644 --- a/src/main/java/au/com/royalpay/payment/manage/management/clearing/web/SettlementDevController.java +++ b/src/main/java/au/com/royalpay/payment/manage/management/clearing/web/SettlementDevController.java @@ -42,6 +42,16 @@ public class SettlementDevController { } @RequestMapping("/reports/{date}") + public JSONObject settleReportLimit20(@PathVariable String date,@ModelAttribute(CommonConsts.MANAGER_STATUS) JSONObject manager) { + try { + Date dt = dateFormat.parse(date); + return cleanService.getClearDetailsLimit20(dt, manager.getString("manager_id")); + } catch (ParseException e) { + throw new BadRequestException("error.payment.valid.invalid_date_format"); + } + } + + @RequestMapping("/reports/{date}/all") public JSONObject settleReport(@PathVariable String date, @ModelAttribute(CommonConsts.MANAGER_STATUS) JSONObject manager) { try { Date dt = dateFormat.parse(date); diff --git a/src/main/java/au/com/royalpay/payment/manage/mappers/log/ClearingDetailMapper.java b/src/main/java/au/com/royalpay/payment/manage/mappers/log/ClearingDetailMapper.java index 62ff594d9..3ddf28559 100644 --- a/src/main/java/au/com/royalpay/payment/manage/mappers/log/ClearingDetailMapper.java +++ b/src/main/java/au/com/royalpay/payment/manage/mappers/log/ClearingDetailMapper.java @@ -29,6 +29,8 @@ public interface ClearingDetailMapper { List listReportsOfSettlement(@Param("clearing_id") int clearingId); + List listReportsOfSettlementLimit20(@Param("clearing_id") int clearingId); + JSONObject listReportsOfSettleCleanDay(@Param("clearing_id") int clearingId, @Param("client_ids") List client_ids); PageList listReportsOfSettlementLogs(JSONObject params, PageBounds pagination); @@ -48,4 +50,7 @@ public interface ClearingDetailMapper { @AutoSql(type = SqlType.DELETE) void deleteSettleLogs(@Param("clearing_id") int clearingId); + + List listRepostTotal(@Param("clearing_id") int clearingId); + } diff --git a/src/main/java/au/com/royalpay/payment/manage/mappers/log/CouponAccuessLogMapper.java b/src/main/java/au/com/royalpay/payment/manage/mappers/log/CouponAccuessLogMapper.java index e4e593ccc..6aa29ddaa 100644 --- a/src/main/java/au/com/royalpay/payment/manage/mappers/log/CouponAccuessLogMapper.java +++ b/src/main/java/au/com/royalpay/payment/manage/mappers/log/CouponAccuessLogMapper.java @@ -2,6 +2,8 @@ package au.com.royalpay.payment.manage.mappers.log; import java.util.List; +import com.github.miemiedev.mybatis.paginator.domain.PageBounds; +import com.github.miemiedev.mybatis.paginator.domain.PageList; import org.apache.ibatis.annotations.Param; import com.alibaba.fastjson.JSONObject; @@ -26,4 +28,7 @@ public interface CouponAccuessLogMapper { @AutoSql(type = SqlType.SELECT) List findCouponByOrderId(@Param("order_id") String order_id); + + @AutoSql(type = SqlType.SELECT) + PageList getCouponAccuessLog(@Param("client_id")int client_id, PageBounds pageBounds); } 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/ClientMapper.java b/src/main/java/au/com/royalpay/payment/manage/mappers/system/ClientMapper.java index a99bd852c..281ef65c3 100644 --- a/src/main/java/au/com/royalpay/payment/manage/mappers/system/ClientMapper.java +++ b/src/main/java/au/com/royalpay/payment/manage/mappers/system/ClientMapper.java @@ -4,6 +4,7 @@ import cn.yixblog.support.mybatis.autosql.annotations.AdvanceSelect; import cn.yixblog.support.mybatis.autosql.annotations.AutoMapper; import cn.yixblog.support.mybatis.autosql.annotations.AutoSql; import cn.yixblog.support.mybatis.autosql.annotations.SqlType; +import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.github.miemiedev.mybatis.paginator.domain.PageBounds; import com.github.miemiedev.mybatis.paginator.domain.PageList; @@ -94,4 +95,6 @@ public interface ClientMapper { @AutoSql(type = SqlType.SELECT) JSONObject findByWechatInstitutionMerchantId(@Param("wechat_institution_merchant_id") String wechat_institution_merchant_id); + List findByhfPayUrlNotNull(); + } 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/mappers/system/SysCustomerPaymentInfoMapper.java b/src/main/java/au/com/royalpay/payment/manage/mappers/system/SysCustomerPaymentInfoMapper.java new file mode 100644 index 000000000..b6ede4f64 --- /dev/null +++ b/src/main/java/au/com/royalpay/payment/manage/mappers/system/SysCustomerPaymentInfoMapper.java @@ -0,0 +1,23 @@ +package au.com.royalpay.payment.manage.mappers.system; + +import cn.yixblog.support.mybatis.autosql.annotations.AutoMapper; +import cn.yixblog.support.mybatis.autosql.annotations.AutoSql; +import cn.yixblog.support.mybatis.autosql.annotations.SqlType; +import com.alibaba.fastjson.JSONObject; +import org.apache.ibatis.annotations.Param; + +@AutoMapper(tablename = "sys_customer_payment_info", pkName = "id") +public interface SysCustomerPaymentInfoMapper { + + @AutoSql(type = SqlType.INSERT) + void save(JSONObject paymentInfo); + + @AutoSql(type = SqlType.UPDATE) + void update(JSONObject paymentInfo); + + @AutoSql(type = SqlType.SELECT) + JSONObject selectPaymentInfo(@Param(value = "wechat_openid") String open_id); + + @AutoSql(type = SqlType.SELECT) + JSONObject selectById(@Param(value = "id") String id); +} 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 79e5d760b..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 @@ -326,4 +326,8 @@ public interface ClientManager { @Transactional 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 d7c68ed6a..9930d0d8f 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 @@ -154,13 +154,8 @@ import java.math.BigDecimal; import java.math.RoundingMode; import java.net.URISyntaxException; import java.net.URL; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Date; -import java.util.HashSet; +import java.util.*; import java.util.List; -import java.util.Objects; -import java.util.Set; import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; import java.util.zip.ZipEntry; @@ -416,6 +411,12 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid if (audit_logs != null && !audit_logs.isEmpty()) { client.put("audit_logs", audit_logs); } + + //HF支付链接二维码 + if (client.getString("hf_pay_url") != null) { + String hfQrcodeUrl = PlatformEnvironment.getEnv().concatUrl("/api/v1.0/hf_gateway/partners/" + client.getString("client_moniker") + "/jump/app"); + client.put("hfQrcodeUrl", QRCodeUtils.qrcodeImageCode(hfQrcodeUrl, 200, false)); + } return client; } @@ -886,7 +887,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 +900,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 +960,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 +981,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); @@ -1175,6 +1180,9 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid if (client == null) { throw new NotFoundException("Client Not Exists"); } + if (channel.equals("hf") && !allow && client.getBoolean("enable_hf_email_notice")) { + clientModifySupport.processClientConfigModify(new SwitchPermissionModify(manager, clientMoniker, "enable_hf_email_notice", allow)); + } clientModifySupport.processClientConfigModify(new SwitchPermissionModify(manager, clientMoniker, "enable_" + channel.toLowerCase(), allow)); logger.info(manager.getString("display_name") + "(" + manager.getString("manager_id") + ") switched client " + clientMoniker + " channel " + channel + " to " + allow); @@ -3751,12 +3759,66 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid } } clientModifySupport.processClientConfigModify(new SwitchPermissionModify(manager, clientMoniker, "enable_link", allow)); + clientModifySupport.processClientConfigModify(new SwitchPermissionModify(manager, clientMoniker, "enable_hf", allow)); } + @Override + public void sendHfEmailNotice(JSONObject order) { + JSONObject client = clientMapper.findClient(order.getIntValue("client_id")); + JSONObject clientConfig = clientConfigMapper.find(order.getIntValue("client_id")); + if (client == null || clientConfig == null) { + return; + } + if (client.getString("contact_email") == null || + !clientConfig.getBoolean("enable_hf_email_notice")) { + return; + } + Context ctx = new Context(); + ctx.setVariable("img_url", PlatformEnvironment.getEnv().concatUrl("/static/images/royalpay_logo.png")); + ctx.setVariable("name", client.getString("contact_person")); + ctx.setVariable("order_id", order.getString("order_id")); + 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("你刚刚有一笔到账信息", 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"); + String longUrl = PlatformEnvironment.getEnv().concatUrl("/api/v1.0/hf_gateway/partners/" + clientMoniker + "/jump/pc"); MpWechatApi api = mpWechatApiProvider.getNewPaymentApi(); return api.registerShortUrl(longUrl); } @@ -3782,4 +3844,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 5958044d2..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); @@ -546,4 +546,9 @@ public class PartnerManageController { clientManager.switchHfLink(manager, clientMoniker, pass.getBooleanValue("allow")); } + @ManagerMapping(value = "/{clientMoniker}/hf/email_notice", method = RequestMethod.PUT, role = {ManagerRole.OPERATOR, ManagerRole.BD_USER}) + public void switchHfEmailNotice(@PathVariable String clientMoniker, @RequestBody JSONObject pass, @ModelAttribute(CommonConsts.MANAGER_STATUS) JSONObject manager) { + clientManager.switchPermission(manager, clientMoniker, "enable_hf_email_notice", pass.getBooleanValue("allow")); + } + } diff --git a/src/main/java/au/com/royalpay/payment/manage/product/beans/ProductBean.java b/src/main/java/au/com/royalpay/payment/manage/product/beans/ProductBean.java index d31a51a51..c8237507a 100644 --- a/src/main/java/au/com/royalpay/payment/manage/product/beans/ProductBean.java +++ b/src/main/java/au/com/royalpay/payment/manage/product/beans/ProductBean.java @@ -11,6 +11,7 @@ public class ProductBean { private String name; private String price; private String industry; + private String hf_industry; private String counts; private String degree; private String client_moniker; @@ -32,6 +33,9 @@ public class ProductBean { if (StringUtils.isNotBlank(industry)) { param.put("industry", industry); } + if (StringUtils.isNotBlank(hf_industry)) { + param.put("hf_industry", hf_industry); + } if (StringUtils.isNotBlank(counts)) { param.put("counts", counts); } @@ -79,6 +83,14 @@ public class ProductBean { this.industry = industry; } + public String getHf_industry() { + return hf_industry; + } + + public void setHf_industry(String hf_industry) { + this.hf_industry = hf_industry; + } + public String getCounts() { return counts; } diff --git a/src/main/java/au/com/royalpay/payment/manage/product/core/impls/ClientProductImpl.java b/src/main/java/au/com/royalpay/payment/manage/product/core/impls/ClientProductImpl.java index e92dc0ca4..484e0849c 100644 --- a/src/main/java/au/com/royalpay/payment/manage/product/core/impls/ClientProductImpl.java +++ b/src/main/java/au/com/royalpay/payment/manage/product/core/impls/ClientProductImpl.java @@ -159,6 +159,7 @@ public class ClientProductImpl implements ClientProduct { object.put("industry", sqlValue[2]); object.put("counts", sqlValue[3]); object.put("degree", sqlValue[4]); + object.put("hf_industry", sqlValue[5]); object.put("client_id", client.getString("client_id")); object.put("create_id",manager.getString("manager_id")); object.put("create_time",new Date()); diff --git a/src/main/java/au/com/royalpay/payment/manage/signin/web/SignInController.java b/src/main/java/au/com/royalpay/payment/manage/signin/web/SignInController.java index 852b376c5..9db9da064 100644 --- a/src/main/java/au/com/royalpay/payment/manage/signin/web/SignInController.java +++ b/src/main/java/au/com/royalpay/payment/manage/signin/web/SignInController.java @@ -1,37 +1,54 @@ package au.com.royalpay.payment.manage.signin.web; +import com.google.code.kaptcha.Producer; + +import au.com.royalpay.payment.manage.customers.core.CustomerPaymentInfoService; import au.com.royalpay.payment.manage.permission.manager.ManagerMapping; -import au.com.royalpay.payment.tools.connections.mpsupport.beans.WxOauthType; -import au.com.royalpay.payment.tools.permission.enums.ManagerRole; import au.com.royalpay.payment.manage.permission.manager.PartnerMapping; import au.com.royalpay.payment.manage.signin.beans.ChangePwdBean; import au.com.royalpay.payment.manage.signin.beans.FindPwdBean; import au.com.royalpay.payment.manage.signin.beans.LoginInfo; import au.com.royalpay.payment.manage.signin.beans.TodoNotice; -import au.com.royalpay.payment.manage.signin.core.*; +import au.com.royalpay.payment.manage.signin.core.ClientLoginLogRepository; +import au.com.royalpay.payment.manage.signin.core.ManagerLoginLogRepository; +import au.com.royalpay.payment.manage.signin.core.ManagerTodoNoticeProvider; +import au.com.royalpay.payment.manage.signin.core.SignInAccountService; +import au.com.royalpay.payment.manage.signin.core.SignInStatusManager; import au.com.royalpay.payment.tools.CommonConsts; import au.com.royalpay.payment.tools.connections.mpsupport.MpWechatApi; import au.com.royalpay.payment.tools.connections.mpsupport.MpWechatApiProvider; +import au.com.royalpay.payment.tools.connections.mpsupport.beans.WxOauthType; import au.com.royalpay.payment.tools.exceptions.BadRequestException; import au.com.royalpay.payment.tools.exceptions.ForbiddenException; import au.com.royalpay.payment.tools.http.HttpUtils; +import au.com.royalpay.payment.tools.permission.enums.ManagerRole; import au.com.royalpay.payment.tools.permission.wechat.WechatMapping; + import com.alibaba.fastjson.JSONObject; -import com.google.code.kaptcha.Producer; + import org.springframework.ui.Model; import org.springframework.validation.Errors; -import org.springframework.web.bind.annotation.*; +import org.springframework.web.bind.annotation.CookieValue; +import org.springframework.web.bind.annotation.ModelAttribute; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestHeader; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; import org.springframework.web.servlet.ModelAndView; +import java.awt.image.BufferedImage; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + import javax.annotation.Resource; import javax.imageio.ImageIO; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletResponse; import javax.validation.Valid; -import java.awt.image.BufferedImage; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; /** * Created by yixian on 2016-06-29. @@ -54,6 +71,8 @@ public class SignInController { @Resource private MpWechatApiProvider mpWechatApiProvider; + @Resource + private CustomerPaymentInfoService customerPaymentInfoService; @RequestMapping(value = "/partner_signin", method = RequestMethod.POST) @@ -340,8 +359,13 @@ public class SignInController { } @RequestMapping(value = "/customer_wechat_qrcode/{codeId}/check", method = RequestMethod.GET) - public void getCustomerID(@PathVariable String codeId, HttpServletResponse response) { + public JSONObject getCustomerID(@PathVariable String codeId, HttpServletResponse response,@RequestParam(value = "pay_info",defaultValue = "false") boolean pay_info) { + JSONObject result = new JSONObject(); String statusKey = signInStatusManager.getWechatCustomerId(codeId); + if(pay_info){ + result = customerPaymentInfoService.selectPaymentInfoByOpenId(statusKey); + } HttpUtils.setCookie(response, "CustomerID", statusKey,false); + return result; } } 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/log/ClearingDetailMapper.xml b/src/main/resources/au/com/royalpay/payment/manage/mappers/log/ClearingDetailMapper.xml index 473d41a81..154ee5abe 100644 --- a/src/main/resources/au/com/royalpay/payment/manage/mappers/log/ClearingDetailMapper.xml +++ b/src/main/resources/au/com/royalpay/payment/manage/mappers/log/ClearingDetailMapper.xml @@ -25,7 +25,37 @@ INNER JOIN sys_clients c ON c.client_id = d.client_id AND c.is_valid=1 WHERE d.clearing_id = #{clearing_id} + + + \ No newline at end of file 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/au/com/royalpay/payment/manage/mappers/system/ClientMapper.xml b/src/main/resources/au/com/royalpay/payment/manage/mappers/system/ClientMapper.xml index 24bfc3a90..64cf17945 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 @@ -6,23 +6,24 @@ WHERE is_valid=1 and (approve_result = 1 or approve_result = 2) + + \ No newline at end of file diff --git a/src/main/resources/au/com/royalpay/payment/manage/mappers/system/CommoditiesMapper.xml b/src/main/resources/au/com/royalpay/payment/manage/mappers/system/CommoditiesMapper.xml index 2096d2cc0..29e128405 100644 --- a/src/main/resources/au/com/royalpay/payment/manage/mappers/system/CommoditiesMapper.xml +++ b/src/main/resources/au/com/royalpay/payment/manage/mappers/system/CommoditiesMapper.xml @@ -12,6 +12,9 @@ and co.industry=#{industry} + + and co.hf_industry=#{hf_industry} + and co.client_id = #{client_id} diff --git a/src/main/resources/templates/mail/hf_email_notice.html b/src/main/resources/templates/mail/hf_email_notice.html new file mode 100644 index 000000000..f0059fbf0 --- /dev/null +++ b/src/main/resources/templates/mail/hf_email_notice.html @@ -0,0 +1,31 @@ + + + + + + +
+
+
+ +
+
+

您好,

+

您有一笔收款信息如下:

+
+

RoyalPay到账提醒:

+
    +
  • 订单编号:
  • +
  • 收款金额:
  • +
  • 到账时间:
  • +
+
+ 此致
+ RoyalPay +
+
+ +
+ + + \ 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/analysis/clearing-log.js b/src/main/ui/static/analysis/clearing-log.js index 41e4ec3d8..fe0c60cda 100644 --- a/src/main/ui/static/analysis/clearing-log.js +++ b/src/main/ui/static/analysis/clearing-log.js @@ -243,6 +243,8 @@ define(['angular', 'decimal', 'uiBootstrap', 'uiRouter', 'angularEcharts'], func }]); app.controller('settlementDetailCtrl', ['$scope', '$stateParams', '$http', '$uibModal', '$filter', '$state', 'detail', 'commonDialog', function ($scope, $stateParams, $http, $uibModal, $filter, $state, detail, commonDialog) { + $scope.allButton = false; + $scope.limitButton = true; $scope.detail = detail.data; $scope.hasSentMail = false; $scope.sendNotice = false; @@ -250,6 +252,9 @@ define(['angular', 'decimal', 'uiBootstrap', 'uiRouter', 'angularEcharts'], func $scope.analysisFilter = {}; $scope.currentAnalysis = $scope.detail; $scope.pageCtrl = {visible:{}}; + var t1Amount =0; + var t2Amount =0; + var t3Amount =0; function getAnalysisTemplate() { return [ @@ -266,7 +271,44 @@ define(['angular', 'decimal', 'uiBootstrap', 'uiRouter', 'angularEcharts'], func }; angular.forEach($scope.detail.logs, function (batch) { $scope.batchAnalysis[batch.clearing_id + ''] = getAnalysisTemplate(); + }); + $scope.allClearing = function() { + $http.get('/sys/settlement/reports/' + $stateParams.date + '/all').then(function (resp) { + angular.forEach($scope.settleAnalysis, function (list) { + list.settles.splice(0, list.settles.length); + list.clients = 0; + list.settleAmount = 0; + }); + + angular.forEach(resp.data.details, function (settleItem) { + var settleDays = settleItem.clear_days; + attachAnalysis($scope.settleAnalysis[Math.min(settleDays - 1, 2)]); + attachAnalysis($scope.batchAnalysis[settleItem.clearing_id + ''][Math.min(settleDays - 1, 2)]); + + function attachAnalysis(analysisItem) { + analysisItem.settles.push(settleItem); + analysisItem.clients++; + analysisItem.settleAmount = Decimal.add(analysisItem.settleAmount, settleItem.clearing_amount).toFixed(2, Decimal.ROUND_FLOOR); + } + }); + $scope.allButton = true; + $scope.limitButton = false; + }); + }; + + $scope.packup = function() { + angular.forEach($scope.settleAnalysis, function (list) { + list.settles.splice(20, list.settles.length); + list.clients = 20; + }); + $scope.settleAnalysis[0].settleAmount = t1Amount; + $scope.settleAnalysis[1].settleAmount = t2Amount; + $scope.settleAnalysis[2].settleAmount = t3Amount; + $scope.allButton = false; + $scope.limitButton = true; + + }; angular.forEach($scope.detail.details, function (settleItem) { var settleDays = settleItem.clear_days; @@ -279,6 +321,10 @@ define(['angular', 'decimal', 'uiBootstrap', 'uiRouter', 'angularEcharts'], func analysisItem.settleAmount = Decimal.add(analysisItem.settleAmount, settleItem.clearing_amount).toFixed(2, Decimal.ROUND_FLOOR); } }); + + t1Amount = $scope.settleAnalysis[0].settleAmount; + t2Amount = $scope.settleAnalysis[1].settleAmount; + t3Amount = $scope.settleAnalysis[2].settleAmount; var nowStr = $filter('date')(new Date(), "yyyy-MM-dd"); $scope.datePattern = $stateParams.date; if ($scope.datePattern == nowStr) { diff --git a/src/main/ui/static/analysis/templates/settlement_detail.html b/src/main/ui/static/analysis/templates/settlement_detail.html index 9992dbbf1..e2e10fc4d 100644 --- a/src/main/ui/static/analysis/templates/settlement_detail.html +++ b/src/main/ui/static/analysis/templates/settlement_detail.html @@ -169,6 +169,14 @@ +
    +
    Total Amount:
    +
    + +   Amounts: + +
    +
    @@ -217,6 +225,14 @@ + + + 全部 + + + 收起 + +
    diff --git a/src/main/ui/static/commons/services/stateMap.js b/src/main/ui/static/commons/services/stateMap.js index 26daae717..78ce7a58b 100644 --- a/src/main/ui/static/commons/services/stateMap.js +++ b/src/main/ui/static/commons/services/stateMap.js @@ -8,7 +8,8 @@ define(['../app'], function (app) { {"label": "SA", "value": "SA"}, {"label": "TAS", "value": "TAS"}, {"label": "VIC","value": "VIC"}, - {"label": "WA", "value": "WA"} + {"label": "WA", "value": "WA"}, + {"label": "其他(Other)", "value": "其他(Other)"} ]; app.factory('stateMap', function () { return { diff --git a/src/main/ui/static/config/devtools/devtools.js b/src/main/ui/static/config/devtools/devtools.js index 2f445e62d..e5dd667ed 100644 --- a/src/main/ui/static/config/devtools/devtools.js +++ b/src/main/ui/static/config/devtools/devtools.js @@ -59,7 +59,11 @@ define(['angular', 'uiRouter', 'uiBootstrap'], function (angular) { url: '/hfClearAmount', templateUrl: '/static/config/devtools/templates/hfClearAmount.html', controller: 'hfClearAmountCtrl' - }) + }).state('devtools.hfupdate', { + url: '/hfupdate', + templateUrl: '/static/config/devtools/templates/hfupdate.html', + controller: 'hfupdateCtrl' + }) }]); app.controller('devManualRefundCtrl', ['$scope', '$http', 'commonDialog', function ($scope, $http, commonDialog) { $scope.sendRefund = function () { @@ -363,6 +367,23 @@ define(['angular', 'uiRouter', 'uiBootstrap'], function (angular) { }]); + app.controller('hfupdateCtrl', ['$scope', '$http','$filter', function ($scope, $http,$filter) { + $scope.selecttotal = true; + $scope.select = function () { + $scope.totalhide = true; + $scope.selecttotal = false; + + $http.get('/dev/hfUpdate').then(function (resp) { + alert(resp.data); + $scope.totalhide = false; + $scope.selecttotal = true; + }, function (resp) { + alert(resp.data.message); + }) + } + + }]); + return app; }); \ No newline at end of file diff --git a/src/main/ui/static/config/devtools/templates/hfupdate.html b/src/main/ui/static/config/devtools/templates/hfupdate.html new file mode 100644 index 000000000..aa428f774 --- /dev/null +++ b/src/main/ui/static/config/devtools/templates/hfupdate.html @@ -0,0 +1,15 @@ +
    +

    更新HF短链接

    + +
    +
    +
    + +
    +
    \ No newline at end of file diff --git a/src/main/ui/static/config/devtools/templates/root.html b/src/main/ui/static/config/devtools/templates/root.html index 8c51fb095..3c004dad3 100644 --- a/src/main/ui/static/config/devtools/templates/root.html +++ b/src/main/ui/static/config/devtools/templates/root.html @@ -79,6 +79,10 @@ HF清算金额统计 + + + 更新HF短连接 + diff --git a/src/main/ui/static/images/royalpay_logo.png b/src/main/ui/static/images/royalpay_logo.png new file mode 100644 index 000000000..aad8a6873 Binary files /dev/null and b/src/main/ui/static/images/royalpay_logo.png differ diff --git a/src/main/ui/static/payment/partner/partner-manage.js b/src/main/ui/static/payment/partner/partner-manage.js index a8bfba833..51dcb649d 100644 --- a/src/main/ui/static/payment/partner/partner-manage.js +++ b/src/main/ui/static/payment/partner/partner-manage.js @@ -113,6 +113,10 @@ define(['angular', 'decimal', 'static/commons/commons', 'uiBootstrap', 'uiRouter url: '/payment', templateUrl: '/static/payment/partner/templates/partner_payment_info.html', controller: 'partnerPaymentInfoCtrl' + }).state('partners.detail.payment_info_invalid', { + url: '/payment_invalid', + templateUrl: '/static/payment/partner/templates/partner_payment_info_invalid.html', + controller: 'partnerPaymentInfoCtrl' }).state('partners.detail.subpartners', { url: '/sub_partners', templateUrl: '/static/payment/partner/templates/sub_partners.html', @@ -1369,7 +1373,7 @@ define(['angular', 'decimal', 'static/commons/commons', 'uiBootstrap', 'uiRouter }) }) }; - $scope.init = {jsapi: false, gateway: false, offline: false, refund: false,common_sub_merchant_id:false, channel: {},gateway_alipay_online:false,hf_Link:false}; + $scope.init = {jsapi: false, gateway: false, offline: false, refund: false,common_sub_merchant_id:false, channel: {},gateway_alipay_online:false,hf_Link:false,enable_hf_email_notice:false}; $scope.switchCommonSubMerchantId = function () { if (!$scope.paymentInfo) { return; @@ -1474,6 +1478,25 @@ define(['angular', 'decimal', 'static/commons/commons', 'uiBootstrap', 'uiRouter }) }; + $scope.toggleHfEmailNotice = function () { + if (!$scope.paymentInfo) { + return; + } + if (!$scope.init.enable_hf_email_notice) { + $scope.init.enable_hf_email_notice = true; + return; + } + $http.put('/sys/partners/' + $scope.partner.client_moniker + '/hf/email_notice', {allow: $scope.paymentInfo.enable_hf_email_notice}).then(function () { + $scope.loadPartnerPaymentInfo(); + }, function (resp) { + commonDialog.alert({ + title: 'Failed to change enable_hf_email_notice permission status', + content: resp.data.message, + type: 'error' + }); + }) + }; + $scope.toggleJsApi = function () { if (!$scope.paymentInfo) { return; @@ -3284,4 +3307,4 @@ define(['angular', 'decimal', 'static/commons/commons', 'uiBootstrap', 'uiRouter }; }); return app; -}); \ No newline at end of file +}); diff --git a/src/main/ui/static/payment/partner/templates/client_payment_info.html b/src/main/ui/static/payment/partner/templates/client_payment_info.html index 962b2c7ad..0925c1372 100644 --- a/src/main/ui/static/payment/partner/templates/client_payment_info.html +++ b/src/main/ui/static/payment/partner/templates/client_payment_info.html @@ -103,7 +103,7 @@

    {{partner.hf_pay_url}} - +

    +
    + + +
    +   仅支持微信客户端扫描 +
    +
    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

    diff --git a/src/main/ui/static/payment/partner/templates/partner_detail.html b/src/main/ui/static/payment/partner/templates/partner_detail.html index a860db53c..61739d5fc 100644 --- a/src/main/ui/static/payment/partner/templates/partner_detail.html +++ b/src/main/ui/static/payment/partner/templates/partner_detail.html @@ -224,6 +224,9 @@
  • Payment Config
  • +
  • + Payment Config +
  • Partner Accounts
  • diff --git a/src/main/ui/static/payment/partner/templates/partner_payment_info.html b/src/main/ui/static/payment/partner/templates/partner_payment_info.html index 2ec731a81..80558c3a0 100644 --- a/src/main/ui/static/payment/partner/templates/partner_payment_info.html +++ b/src/main/ui/static/payment/partner/templates/partner_payment_info.html @@ -331,6 +331,19 @@   {{paymentInfo.hf_pay_url}} +
    + + +
    +   仅支持微信客户端扫描 +
    +
    +
    + +
    + +
    +
    diff --git a/src/main/ui/static/payment/partner/templates/partner_payment_info_invalid.html b/src/main/ui/static/payment/partner/templates/partner_payment_info_invalid.html new file mode 100644 index 000000000..68c66a115 --- /dev/null +++ b/src/main/ui/static/payment/partner/templates/partner_payment_info_invalid.html @@ -0,0 +1,48 @@ + +
    +
    +
    +
    +
    +
    + +
    +

    + {{paymentInfo.sub_merchant_id||'Not Configure'}} + + +   Merchant ID:{{paymentInfo.merchant_id | choose_merchant_id}} +    + + + + history + + + +

    +
    + +
    + +
    +
    + +
    +
    +
    +
    +
    +
    +
    +
    +
    + + diff --git a/src/main/ui/static/payment/product/product_manager.js b/src/main/ui/static/payment/product/product_manager.js index 87bd1421e..861877603 100644 --- a/src/main/ui/static/payment/product/product_manager.js +++ b/src/main/ui/static/payment/product/product_manager.js @@ -92,6 +92,20 @@ define(['angular', 'decimal', 'static/commons/commons', 'uiBootstrap', 'uiRouter $scope.loadProducts(1); }) }; + $scope.loadHfindustry = function () { + $http.get('/static/data/hfindustry.json').then(function (resp) { + $scope.hf_industry = resp.data; + }) + }; + $scope.loadHfindustry(); + $scope.onHfIndustrySelect = function (selectedItem) { + $scope.params.hf_industry = selectedItem.mccCode; + $scope.loadProducts(1); + }; + $scope.clearHFIndustry = function () { + $scope.params.hf_industry = null; + $scope.loadProducts(1); + } $scope.loadProducts(1); }]); app.controller('managerAddProductDialogCtrl', ['$scope', '$http','$uibModal','product','$state','commonDialog','industryMap', function ($scope, $http,$uibModal,product,$state,commonDialog,industryMap) { @@ -102,7 +116,25 @@ define(['angular', 'decimal', 'static/commons/commons', 'uiBootstrap', 'uiRouter }else { $scope.edit_or_add = "Add"; } - $scope.save = function () { + $scope.loadHfindustry = function () { + $http.get('/static/data/hfindustry.json').then(function (resp) { + $scope.hf_industry = resp.data; + }) + }; + $scope.loadHfindustry(); + $scope.onHfIndustrySelect = function (selectedItem) { + $scope.product.hf_label = selectedItem.label; + $scope.product.hf_industry = selectedItem.mccCode; + }; + $scope.save = function (goodForm) { + if (goodForm.$invalid) { + angular.forEach(goodForm, function (item, key) { + if (key.indexOf('$') < 0) { + item.$dirty = true; + } + }); + return; + } if ($scope.product.commodity_id) { $http.put('/sys/product', $scope.product).then(function (resp) { alert("Success"); diff --git a/src/main/ui/static/payment/product/templates/add_product.html b/src/main/ui/static/payment/product/templates/add_product.html index 01c81806d..55aac6437 100644 --- a/src/main/ui/static/payment/product/templates/add_product.html +++ b/src/main/ui/static/payment/product/templates/add_product.html @@ -71,6 +71,18 @@ +
    + +
    + +
    +
    +
    diff --git a/src/main/ui/static/payment/product/templates/product.html b/src/main/ui/static/payment/product/templates/product.html index 08a1a31bf..196f2321e 100644 --- a/src/main/ui/static/payment/product/templates/product.html +++ b/src/main/ui/static/payment/product/templates/product.html @@ -19,27 +19,37 @@
    + + +
    + +
    +
    +
    + +
    -
    - -
    -
    -
    - +
    + -
    @@ -55,6 +65,7 @@ + @@ -65,6 +76,7 @@ +
    Product Name Price IndustryHF Industry Counts Degree Operate diff --git a/src/main/ui/static/templates/alipay/v1/gateway_jsapi.js b/src/main/ui/static/templates/alipay/v1/gateway_jsapi.js index 553318f23..9f876394f 100644 --- a/src/main/ui/static/templates/alipay/v1/gateway_jsapi.js +++ b/src/main/ui/static/templates/alipay/v1/gateway_jsapi.js @@ -88,7 +88,7 @@ $(document).ready(function () { }, closeCurrentApp: false }); - location.href = window.redirect + (window.redirect.indexOf('?') < 0 ? '?' : '&') + 'success=true'; + startCheckOrder(window.client_moniker, window.merchant_orderid); } else { alert(res.memo); if (window.tradeNo) { @@ -103,6 +103,25 @@ $(document).ready(function () { } } + function startCheckOrder(clientMoniker, merchantOrderId) { + function checkOrderStd() { + $.ajax({ + url: '/api/v1.0/payment/clients/' + clientMoniker + '/orders/' + merchantOrderId + '/status', + method: 'GET', + dataType: 'json', + success: function (res) { + if (res.paid) { + location.href = window.redirect + (window.redirect.indexOf('?') < 0 ? '?' : '&') + 'success=true'; + } else { + setTimeout(checkOrderStd, 500); + } + } + }) + } + + checkOrderStd(); + } + function waitForPaymentSuccess(orderId) { var sock = new SockJS('/register'); var client = Stomp.over(sock); diff --git a/src/main/ui/static/templates/alipay/v1/payment.js b/src/main/ui/static/templates/alipay/v1/payment.js index c8a8dc8ef..9c78ea26e 100644 --- a/src/main/ui/static/templates/alipay/v1/payment.js +++ b/src/main/ui/static/templates/alipay/v1/payment.js @@ -290,7 +290,7 @@ $(function () { }, closeCurrentApp: false }); - location.href = '/api/v1.0/alipay/partners/' + window.client_moniker + '/orders/' + pay.order_id + '/result'; + startCheckOrder(pay.order_id, '/api/v1.0/alipay/partners/' + window.client_moniker + '/orders/' + pay.order_id + '/result'); } else if (res.resultCode == '6001') { //do nothing } else { @@ -315,6 +315,25 @@ $(function () { }) }); + function startCheckOrder(orderId, url) { + function checkOrderStd() { + $.ajax({ + url: '/api/v1.0/payment/orders/' + orderId + '/status', + method: 'GET', + dataType: 'json', + success: function (res) { + if (res.paid) { + location.href = url; + } else { + setTimeout(checkOrderStd, 500); + } + } + }) + } + + checkOrderStd(); + } + function weuiAlert(msg) { var config = { template: msg diff --git a/src/main/ui/static/templates/alipay/v1/retail_jsapi.js b/src/main/ui/static/templates/alipay/v1/retail_jsapi.js index 7e7290d52..6b74c75cf 100644 --- a/src/main/ui/static/templates/alipay/v1/retail_jsapi.js +++ b/src/main/ui/static/templates/alipay/v1/retail_jsapi.js @@ -54,7 +54,7 @@ $(document).ready(function () { }, closeCurrentApp: false }); - location.href = window.redirect; + startCheckOrder(window.order_id, window.redirect); } else { alert(res.memo); } @@ -76,4 +76,22 @@ $(document).ready(function () { } + function startCheckOrder(orderId, url) { + function checkOrderStd() { + $.ajax({ + url: '/api/v1.0/payment/orders/' + orderId + '/status', + method: 'GET', + dataType: 'json', + success: function (res) { + if (res.paid) { + location.href = url; + } else { + setTimeout(checkOrderStd, 500); + } + } + }) + } + + checkOrderStd(); + } }); \ No newline at end of file diff --git a/src/main/ui/static/templates/hf/css/gateway_payment.css b/src/main/ui/static/templates/hf/css/gateway_payment.css new file mode 100644 index 000000000..5b68bcd22 --- /dev/null +++ b/src/main/ui/static/templates/hf/css/gateway_payment.css @@ -0,0 +1,205 @@ +body { + color: #333333; + font-family: PingFang-SC-Regular; + font-size: 14px; + letter-spacing: 0px; +} + +ul, li { + padding: 0px; + margin: 0px; + list-style: none; +} + +input::-webkit-input-placeholder { + color: #C0C0C0; +} +input::-moz-placeholder { /* Mozilla Firefox 19+ */ + color: #C0C0C0; +} +input:-moz-placeholder { /* Mozilla Firefox 4 to 18 */ + color: #C0C0C0; +} +input:-ms-input-placeholder { /* Internet Explorer 10-11 */ + color: #C0C0C0; +} + +.my-input { + border-top: 0; + border-right: 0; + border-bottom: 1px solid #EBEBEB; + border-left: 0; + padding: 10px 0; + width: 100%; + outline: none; +} + +.tab-item { + position:relative; + display: inline-block; + font-size: 16px; + width:100px; + background:#fff; + padding: 10px 0px; + text-align: center; + border-bottom: 1px solid #EBEBEB; + margin-right: -4px; + box-sizing: border-box; + cursor: pointer; +} + +.change-color { + color: #FF6600; + border-bottom: 1px solid #FF6600; +} + +.s1{ + position:absolute; + bottom:-1px; + left:45px; + width:0px; + height:0px; + border-top:5px solid transparent; + border-left:5px solid transparent; + border-right:5px solid transparent; + border-bottom:5px solid #EBEBEB; +} + +.s1-change-color { + border-bottom:5px solid #FF6600; +} + +.s2{ + position:absolute; + bottom:-3px; + left:45px; + width:0px; + height:0px; + border-top:5px solid transparent; + border-left:5px solid transparent; + border-right:5px solid transparent; + border-bottom:5px solid #fff; +} + +.bg-pc { + width: 100%; + height: 100%; + background: url("../img/bg_pc.png") no-repeat center transparent; + position: absolute; + top: 0; + left: 0; + display: box; + box-pack: center; + box-orient: vertical; + display: -webkit-box; + -webkit-box-pack: center; + -webkit-box-orient: vertical; +} +.main { + width: 700px; + padding: 40px 0 0 70px; + background-color: #FFFFFF; + margin: 0 auto; +} + +.main-logo { + width: 770px; + height: 47px; + margin: 0 auto; + margin-bottom: 32px; +} + +.main-left { + width: 300px; + display: inline-block; + margin-right: 50px; + vertical-align: top; +} + +.input-item { + margin-bottom: 12px; +} + +.commit-button { + background-color: #FF6600; + color: #FFFFFF; + width: 100%; + text-align: center; + padding: 10px 0; + font-size: 17px; + border: none; + border-radius: 2px; + margin: 20px 0; + box-shadow: 0 2px 11px 0; + cursor: pointer; + outline: none; +} + +select { + appearance:none; + -moz-appearance:none; + -webkit-appearance:none; + background: url("../img/down.png") no-repeat scroll right center transparent; +} + +.select-placeholder { + position: absolute; + top: 10px; + color: #C0C0C0; +} + +.main-middle { + width: 2px; + height: 306px; + border: 1px dashed #EBEBEB; + display: inline-block; + box-sizing: border-box; + vertical-align: top; + margin: 47px 40px 0 0; +} +.main-right { + vertical-align: top; + display: inline-block; + text-align: center; + padding-top: 72px; +} +.main-right-top { + background: #FFFFFF; + border: 1px solid #EBEBEB; + box-shadow: 0px 0px 4px 0px rgba(0,0,0,0.30); + width: 120px; + height: 120px; + border-radius: 120px; + text-align: center; + margin: 0 auto; + line-height: 120px; +} +.main-right-top img { + width: 35px; + height: 40px; + display: inline-block; + vertical-align: middle; +} +.royalpay { + font-size: 16px; + letter-spacing: 0px; + margin-top: 12px; +} +.description { + margin-top: 162px; + letter-spacing: 0px; +} + +.my-modal { + position: absolute; + width: 100%; + height: 100%; + background-color: black; + opacity:0.80; + z-index: 111; +} +.qrcode { + left: 0; + right: 0; + text-align: center; +} \ No newline at end of file diff --git a/src/main/ui/static/templates/hf/gateway_payment.js b/src/main/ui/static/templates/hf/gateway_payment.js new file mode 100644 index 000000000..044c28dfb --- /dev/null +++ b/src/main/ui/static/templates/hf/gateway_payment.js @@ -0,0 +1,102 @@ +$("#bank-li").hide(); +var currentIndex = 0; +$(".main .main-left ul li.tab-item").click(function () { + $("#qrode").hide(); + $("#payment-form").show(); + var selectedIndex = $(this).index(); + $(this).addClass("change-color").siblings().removeClass("change-color"); + $(this).children(".s1").addClass("s1-change-color"); + $(this).siblings().children(".s1").removeClass("s1-change-color"); + if (selectedIndex == 2) { + $("#bank-li").show(); + } else { + $("#bank-li").hide(); + } +}); + +$("#modal-close").click(function () { + $(".my-modal").hide(); + $(".qrcode").hide(); +}); + +var select = $("select#bank-select,#product-category-select"); +if (select.val() != "") + select.prev().hide(); +select.bind("change", function () { + if ($(this).val() != "") { + $(this).prev().hide(); + } +}); +var bankList = [ + {label:'招商银行',value:'CMB'}, + {label:'中国工商银行',value:'ICBC'}, + {label:'中国农业银行',value:'ABC'}, + {label:'中国建设银行',value:'CCB'}, + {label:'中国银行',value:'BOC'}, + {label:'浦发银行',value:'SPDB'}, + {label:'中国交通银行',value:'BCOM'}, + {label:'中国民生银行',value:'CMBC'}, + {label:'广东发展银行',value:'GDB'}, + {label:'中信银行',value:'CITIC'}, + {label:'华夏银行',value:'HXB'}, + {label:'上海农村商业银行',value:'SRCB'}, + {label:'中国邮政储蓄银行',value:'PSBC'}, + {label:'北京银行',value:'BOB'}, + {label:'渤海银行',value:'CBHB'}, + {label:'北京农商银行',value:'BJRCB'}, + {label:'南京银行',value:'NJCB'}, + {label:'中国光大银行',value:'CEB'}, + {label:'浙商银行',value:'CZB'}, + {label:'兴业银行',value:'CIB'}, + {label:'杭州银行',value:'HZB'}, + {label:'平安银行',value:'PAB'}, + {label:'上海银行',value:'SHB'}, +]; +var productList = [ + {label:'护肤品',value:'100003'}, + {label:'洗发护发',value:'100004'}, + {label:'身体护理',value:'100005'}, + {label:'口腔护理',value:'100006'}, + {label:'包包',value:'100007'}, + {label:'女装',value:'100008'}, + {label:'男装',value:'100009'}, + {label:'童装',value:'100010'}, + {label:'内衣',value:'100011'}, + {label:'睡衣',value:'100012'}, + {label:'袜品',value:'100013'}, + {label:'配饰',value:'100014'}, + {label:'香水',value:'100015'}, + {label:'彩妆',value:'100016'}, + {label:'奶粉',value:'100017'}, + {label:'母婴营养保健',value:'100018'}, + {label:'婴儿辅食',value:'100019'}, + {label:'尿裤纸巾',value:'100020'}, + {label:'男鞋',value:'100021'}, + {label:'女鞋',value:'100022'}, + {label:'运动鞋',value:'100023'}, + {label:'户外鞋',value:'100024'}, + {label:'运动服',value:'100025'}, + {label:'休闲服装',value:'100026'}, + {label:'家纺/床品',value:'100027'}, + {label:'生活日用',value:'100028'}, + {label:'厨房电器',value:'100029'}, + {label:'家装软饰',value:'100030'}, + {label:'生活电器',value:'100031'}, + {label:'手机',value:'100032'}, + {label:'手机配件',value:'100033'}, + {label:'数码相机',value:'100034'}, + {label:'单反相机',value:'100035'}, + {label:'摄像机',value:'100036'}, + {label:'镜头',value:'100037'}, + {label:'耳机/耳麦',value:'100038'}, + {label:'音箱/音响',value:'100039'}, + {label:'数码配件',value:'100040'}, + {label:'智能手环',value:'100041'}, + {label:'影音娱乐',value:'100042'}, + {label:'笔记本',value:'100043'}, + {label:'进口食品',value:'100044'}, + {label:'休闲食品',value:'100045'}, + {label:'营养品',value:'100046'}, + {label:'地方特产',value:'100047'} +]; + diff --git a/src/main/ui/static/templates/hf/img/bg_pc.png b/src/main/ui/static/templates/hf/img/bg_pc.png new file mode 100644 index 000000000..aec5a8681 Binary files /dev/null and b/src/main/ui/static/templates/hf/img/bg_pc.png differ diff --git a/src/main/ui/static/templates/hf/img/bg_phone.png b/src/main/ui/static/templates/hf/img/bg_phone.png new file mode 100644 index 000000000..fd793627d Binary files /dev/null and b/src/main/ui/static/templates/hf/img/bg_phone.png differ diff --git a/src/main/ui/static/templates/hf/img/button.png b/src/main/ui/static/templates/hf/img/button.png new file mode 100644 index 000000000..5434925ba Binary files /dev/null and b/src/main/ui/static/templates/hf/img/button.png differ diff --git a/src/main/ui/static/templates/hf/img/button_phone.png b/src/main/ui/static/templates/hf/img/button_phone.png new file mode 100644 index 000000000..bbbfbbb52 Binary files /dev/null and b/src/main/ui/static/templates/hf/img/button_phone.png differ diff --git a/src/main/ui/static/templates/hf/img/choose.png b/src/main/ui/static/templates/hf/img/choose.png new file mode 100644 index 000000000..a9706d83f Binary files /dev/null and b/src/main/ui/static/templates/hf/img/choose.png differ diff --git a/src/main/ui/static/templates/hf/img/down.png b/src/main/ui/static/templates/hf/img/down.png new file mode 100644 index 000000000..6edf0a6b1 Binary files /dev/null and b/src/main/ui/static/templates/hf/img/down.png differ diff --git a/src/main/ui/static/templates/hf/img/logo_new.png b/src/main/ui/static/templates/hf/img/logo_new.png new file mode 100644 index 000000000..a7fb0a2d0 Binary files /dev/null and b/src/main/ui/static/templates/hf/img/logo_new.png differ diff --git a/src/main/ui/static/templates/hf/img/logo_white.png b/src/main/ui/static/templates/hf/img/logo_white.png new file mode 100644 index 000000000..5f30b1ca5 Binary files /dev/null and b/src/main/ui/static/templates/hf/img/logo_white.png differ diff --git a/src/main/ui/static/templates/hf/img/logo_white_phone.png b/src/main/ui/static/templates/hf/img/logo_white_phone.png new file mode 100644 index 000000000..39c27f1d2 Binary files /dev/null and b/src/main/ui/static/templates/hf/img/logo_white_phone.png differ diff --git a/src/main/ui/static/templates/hf/img/modal.png b/src/main/ui/static/templates/hf/img/modal.png new file mode 100644 index 000000000..4d5be2b53 Binary files /dev/null and b/src/main/ui/static/templates/hf/img/modal.png differ diff --git a/src/main/ui/static/templates/hf/img/my_qrcode.png b/src/main/ui/static/templates/hf/img/my_qrcode.png new file mode 100644 index 000000000..0b2506642 Binary files /dev/null and b/src/main/ui/static/templates/hf/img/my_qrcode.png differ diff --git a/src/main/ui/static/templates/payment/v1/gateway_jsapi.js b/src/main/ui/static/templates/payment/v1/gateway_jsapi.js index 119411cd9..df712bdcc 100644 --- a/src/main/ui/static/templates/payment/v1/gateway_jsapi.js +++ b/src/main/ui/static/templates/payment/v1/gateway_jsapi.js @@ -19,9 +19,19 @@ $(document).ready(function () { var dataCache = {paying: false}; $('#key_P').bind('touchstart', startPay); if (window.paydata) { - wx.ready(function () { + var paymentInvoker = function() { invokePay(window.paydata); - }) + }; + if (typeof WeixinJSBridge == "undefined"){ + if( document.addEventListener ){ + document.addEventListener('WeixinJSBridgeReady', paymentInvoker, false); + }else if (document.attachEvent){ + document.attachEvent('WeixinJSBridgeReady', paymentInvoker); + document.attachEvent('onWeixinJSBridgeReady', paymentInvoker); + } + }else{ + paymentInvoker(); + } } function startPay() { diff --git a/src/main/ui/static/templates/payment/v1/payment.js b/src/main/ui/static/templates/payment/v1/payment.js index 3fc6a65d7..781f43f4b 100644 --- a/src/main/ui/static/templates/payment/v1/payment.js +++ b/src/main/ui/static/templates/payment/v1/payment.js @@ -276,7 +276,7 @@ $(function () { }, function (res) { dataCache.paying = false; if (res.err_msg == 'get_brand_wcpay_request:ok') { - startCheckOrder(pay.order_id); + startCheckOrder(pay.order_id, '/api/payment/v1.0/wechat_jsapi_payment/partners/' + window.client_moniker + '/orders/' + pay.order_id); } else { if (res.err_msg != 'get_brand_wcpay_request:cancel' && res.err_msg != 'get_brand_wcpay_request:fail') { @@ -305,7 +305,7 @@ $(function () { }) }); - function startCheckOrder(orderId) { + function startCheckOrder(orderId, url) { function checkOrderStd() { $.ajax({ url: '/api/v1.0/payment/orders/' + orderId + '/status', @@ -313,7 +313,7 @@ $(function () { dataType: 'json', success: function (res) { if (res.paid) { - location.href = '/api/payment/v1.0/wechat_jsapi_payment/partners/' + window.client_moniker + '/orders/' + orderId; + location.href = url; } else { setTimeout(checkOrderStd, 500); } diff --git a/src/main/ui/static/templates/payment/v1/retail_jsapi.js b/src/main/ui/static/templates/payment/v1/retail_jsapi.js index d31f1e94b..ebb0efc91 100644 --- a/src/main/ui/static/templates/payment/v1/retail_jsapi.js +++ b/src/main/ui/static/templates/payment/v1/retail_jsapi.js @@ -73,7 +73,7 @@ $(document).ready(function () { }, function (res) { dataCache.paying = false; if (res.err_msg == 'get_brand_wcpay_request:ok') { - startCheckOrder(window.order_id) + startCheckOrder(window.order_id,window.redirect + (window.redirect.indexOf('?') < 0 ? '?' : '&') + 'success=true') } else { if (res.err_msg != 'get_brand_wcpay_request:cancel' && res.err_msg != 'get_brand_wcpay_request:fail') { alert('WeChat Error:' + res.err_msg); @@ -87,7 +87,8 @@ $(document).ready(function () { }) } - function startCheckOrder(orderId) { + + function startCheckOrder(orderId, url) { function checkOrderStd() { $.ajax({ url: '/api/v1.0/payment/orders/' + orderId + '/status', @@ -95,7 +96,7 @@ $(document).ready(function () { dataType: 'json', success: function (res) { if (res.paid) { - location.href = window.redirect + (window.redirect.indexOf('?') < 0 ? '?' : '&') + 'success=true'; + location.href = url; } else { setTimeout(checkOrderStd, 500); }