Merge remote-tracking branch 'origin/develop' into develop

master
yixian 6 years ago
commit 6fedebcf2f

@ -40,6 +40,10 @@
<groupId>au.com.royalpay.payment</groupId> <groupId>au.com.royalpay.payment</groupId>
<artifactId>rpay-core</artifactId> <artifactId>rpay-core</artifactId>
</dependency> </dependency>
<dependency>
<groupId>au.com.royalpay.payment</groupId>
<artifactId>yeepay-core</artifactId>
</dependency>
<dependency> <dependency>
<groupId>com.github.stuxuhai</groupId> <groupId>com.github.stuxuhai</groupId>
<artifactId>jpinyin</artifactId> <artifactId>jpinyin</artifactId>

@ -763,8 +763,11 @@
* <b>强烈建议获得支付结果后再调用RoyalPay订单查询API确认完成支付后再进行后续流程避免因超时自动撤单导致资金损失</b><br> * <b>强烈建议获得支付结果后再调用RoyalPay订单查询API确认完成支付后再进行后续流程避免因超时自动撤单导致资金损失</b><br>
* <img src="img/sdk_wechat_api_payment_cn.png"><br> * <img src="img/sdk_wechat_api_payment_cn.png"><br>
* 关于客户端和支付宝整合的更多信息: <a href="https://global.alipay.com/service/app_split_cn/6">支付宝SDK文档</a><br> * 关于客户端和支付宝整合的更多信息: <a href="https://global.alipay.com/service/app_split_cn/6">支付宝SDK文档</a><br>
* <a href="resources/api/alipaySdk-20160825.jar">SDK for Android</a><br> * 关于客户端和微信整合的更多信息: <a href="https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=11_1">微信SDK文档</a><br>
* <a href="resources/api/AlipaySDKForiOS.zip">SDK for iOS</a> * <a href="resources/api/alipaySdk-20160825.jar">Alipay SDK for Android</a><br>
* <a href="resources/api/AlipaySDKForiOS.zip">Alipay SDK for iOS</a><br>
* <a href="https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1419319167&token=&lang=zh_CN">Wechat SDK for Android</a><br>
* <a href="https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1419319164&lang=zh_CN">Wechat SDK for iOS</a>
* *
* @apiVersion 1.0.0 * @apiVersion 1.0.0
* @apiGroup SDKPayment * @apiGroup SDKPayment

@ -778,8 +778,13 @@
* <b>It is strongly advised to request RoyalPay order query Api to confirm that the order has been paid in order to cancelling order by system at the same time.</b><br> * <b>It is strongly advised to request RoyalPay order query Api to confirm that the order has been paid in order to cancelling order by system at the same time.</b><br>
* <img src="img/sdk_wechat_api_payment_en.png"><br> * <img src="img/sdk_wechat_api_payment_en.png"><br>
* More information for integration with Alipay: <a href="https://global.alipay.com/service/app_split/6">Alipay SDK Document</a><br> * More information for integration with Alipay: <a href="https://global.alipay.com/service/app_split/6">Alipay SDK Document</a><br>
* <a href="resources/api/alipaySdk-20160825.jar">SDK for Android</a><br> * More information for integration with Wehcat: <a href="https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=11_1">Wechat SDK Document</a><br>
* <a href="resources/api/AlipaySDKForiOS.zip">SDK for iOS</a>
* <a href="resources/api/alipaySdk-20160825.jar">Alipay SDK for Android</a><br>
* <a href="resources/api/AlipaySDKForiOS.zip">Alipay SDK for iOS</a><br>
* <a href="https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1419319167&token=&lang=zh_CN">Wechat SDK for Android</a><br>
* <a href="https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1419319164&lang=zh_CN">Wechat SDK for iOS</a>
*
* @apiVersion 1.0.0 * @apiVersion 1.0.0
* @apiGroup SDKPayment * @apiGroup SDKPayment
* @apiHeader Accept application/json * @apiHeader Accept application/json

@ -15,6 +15,8 @@ public interface CustomersAnalysisService {
JSONObject getCustomersRanking(JSONObject params, int page, int limit); JSONObject getCustomersRanking(JSONObject params, int page, int limit);
JSONObject getCustomersTotal(JSONObject params);
JSONObject getOrdersByOpenid(JSONObject params, int page, int limit); JSONObject getOrdersByOpenid(JSONObject params, int page, int limit);
void sendPartnerTransactionDaily(Date date); void sendPartnerTransactionDaily(Date date);

@ -30,6 +30,8 @@ public class ChannelsAnalysisServiceImpl implements ChannelsAnalysisService {
listChannel.add(putParam(params,"AlipayOnline")); listChannel.add(putParam(params,"AlipayOnline"));
listChannel.add(putParam(params,"jd")); listChannel.add(putParam(params,"jd"));
listChannel.add(putParam(params,"hf")); listChannel.add(putParam(params,"hf"));
listChannel.add(putParam(params,"Rpay"));
listChannel.add(putParam(params,"Yeepay"));
return listChannel; return listChannel;
} }
@ -40,7 +42,7 @@ public class ChannelsAnalysisServiceImpl implements ChannelsAnalysisService {
} }
List<JSONObject> list = new ArrayList<>(); List<JSONObject> list = new ArrayList<>();
Map<Date,JSONObject> analysisMap = new TreeMap<>(); Map<Date,JSONObject> analysisMap = new TreeMap<>();
String[] channels = {"Wechat","Bestpay","Alipay","jd","AlipayOnline","hf", "Rpay"}; String[] channels = {"Wechat","Bestpay","Alipay","jd","AlipayOnline","hf", "Rpay","Yeepay"};
for (String channel:channels){ for (String channel:channels){
analysisChannelCustomers(params, analysisMap, channel); analysisChannelCustomers(params, analysisMap, channel);
} }

@ -58,8 +58,8 @@ public class ClientRatesAnalysisServiceImpl implements ClientRatesAnalysisServic
if (ManagerRole.BD_LEADER.hasRole(manager.getIntValue("role"))) { if (ManagerRole.BD_LEADER.hasRole(manager.getIntValue("role"))) {
params.put("bd_group", manager.getString("manager_id")); params.put("bd_group", manager.getString("manager_id"));
} }
params.put("begin", beginDate); params.put("begin", DateFormatUtils.format(beginDate,"yyyy-MM-dd"));
params.put("end", endDate); params.put("end", DateFormatUtils.format(endDate,"yyyy-MM-dd"));
orgManager.checkOrgIds(manager,params); orgManager.checkOrgIds(manager,params);
JSONObject result = new JSONObject(); JSONObject result = new JSONObject();
List<JSONObject> bdAnalysis = clientRatesAnalysisMapper.analysisRatesForBDUsers(params); List<JSONObject> bdAnalysis = clientRatesAnalysisMapper.analysisRatesForBDUsers(params);

@ -82,6 +82,14 @@ public class CustomersAnalysisServiceImp implements CustomersAnalysisService {
return result; return result;
} }
@Override
public JSONObject getCustomersTotal(JSONObject params) {
JSONObject result = new JSONObject();
result.put("analysis", orderAnalysisMapper.listCustomersDataAnalysis(params));
result.put("openid_type", params.getIntValue("openid_type"));
return result;
}
@Override @Override
public JSONObject getOrdersByOpenid(JSONObject params, int page, int limit) { public JSONObject getOrdersByOpenid(JSONObject params, int page, int limit) {
PageList<JSONObject> logs = orderMapper.listOrderByCustomer(params, new PageBounds(page, limit, Order.formString("create_time.desc"))); PageList<JSONObject> logs = orderMapper.listOrderByCustomer(params, new PageBounds(page, limit, Order.formString("create_time.desc")));

@ -556,7 +556,7 @@ public class DashboardServiceImpl implements DashboardService,DashboardAnalysisT
} }
} }
private JSONObject getTodayChannelCount(JSONObject params){ private JSONObject getTodayChannelCount(JSONObject params){
String[] channels = new String[]{"Bestpay","Wechat","Alipay","jd","AlipayOnline","hf", "Rpay"}; String[] channels = new String[]{"Bestpay","Wechat","Alipay","jd","AlipayOnline","hf", "Rpay","Yeepay"};
JSONObject resp = new JSONObject(); JSONObject resp = new JSONObject();
for(String channel:channels) { for(String channel:channels) {
params.put("channel", channel); params.put("channel", channel);

@ -82,10 +82,20 @@ public class EstimateAnalysisServiceImpl implements EstimateAnalysisService {
//今天 //今天
Calendar calendar = Calendar.getInstance(); Calendar calendar = Calendar.getInstance();
calendar.setTimeZone(TimeZone.getTimeZone("Asia/Shanghai")); calendar.setTimeZone(TimeZone.getTimeZone("Asia/Shanghai"));
//如果是周一,显示周五的数据
Calendar cal=Calendar.getInstance();
cal.setTime(new Date());
int week=cal.get(Calendar.DAY_OF_WEEK);
if (week ==2) {
cal.add(Calendar.DATE, -3);
}
Date todayDate = new Date(); Date todayDate = new Date();
Date todayClearDate = cal.getTime();
String dateStr = DateFormatUtils.format(todayDate, "yyyy/MM/dd"); String dateStr = DateFormatUtils.format(todayDate, "yyyy/MM/dd");
if (estimateAnalysisMapper.checkDayIsCleanDay(dateStr) != null) { if (estimateAnalysisMapper.checkDayIsCleanDay(dateStr) != null) {
JSONObject today = getDaySettleInfo(todayDate); JSONObject todaySettle = getDaySettleInfo(todayDate);
JSONObject today = getDayClearInfo(todayClearDate, todaySettle);
try { try {
JSONObject realToday = todaySettleInfo(todayDate); JSONObject realToday = todaySettleInfo(todayDate);
today.put("t1", realToday.getBigDecimal("t1")); today.put("t1", realToday.getBigDecimal("t1"));
@ -167,6 +177,41 @@ public class EstimateAnalysisServiceImpl implements EstimateAnalysisService {
dayInfo.put("t1", 0); dayInfo.put("t1", 0);
} }
//T2
maxDays = estimateAnalysisMapper.findLastCleanDays(end_date, 1);
end_date = maxDays.getString("date_str");
cleanDays = estimateAnalysisMapper.findLastCleanDays(start_date, 1);
start_date = cleanDays.getString("date_str");
JSONObject totalAmountT2 = estimateAnalysisMapper.findAllTransactionByDate(start_date, end_date, t2client);
if (totalAmountT2 != null) {
dayInfo.put("t2", totalAmountT2.getBigDecimal("total_amount"));
} else {
dayInfo.put("t2", 0);
}
//T3
maxDays = estimateAnalysisMapper.findLastCleanDays(end_date, 1);
end_date = maxDays.getString("date_str");
cleanDays = estimateAnalysisMapper.findLastCleanDays(start_date, 1);
start_date = cleanDays.getString("date_str");
JSONObject totalAmountT3 = estimateAnalysisMapper.findAllTransactionByDate(start_date, end_date, t3client);
if (totalAmountT3 != null) {
dayInfo.put("t3", totalAmountT3.getBigDecimal("total_amount"));
} else {
dayInfo.put("t3", 0);
}
dayInfo.put("estimate_date", endStr);
dayInfo.put("total", dayInfo.getBigDecimal("t1").add(dayInfo.getBigDecimal("t2")).add(dayInfo.getBigDecimal("t3")));
return dayInfo;
}
//把清算预估和到账金额分离
public JSONObject getDayClearInfo(Date date, JSONObject dayInfo) {
dayInfo.put("platformGetSettleFee", BigDecimal.ZERO);
String endStr = DateFormatUtils.format(date, "yyyy/MM/dd");
JSONObject maxDays = estimateAnalysisMapper.findMaxCleanDays(endStr);
String end_date = maxDays.getString("date_str");
JSONObject cleanDays = estimateAnalysisMapper.findLastCleanDays(endStr, 1);
List<JSONObject> tencentSettle = platformSettlementMapper.findBySettleDate(new Date(maxDays.getDate("date_str").getTime() - 86400000L), "Wechat"); List<JSONObject> tencentSettle = platformSettlementMapper.findBySettleDate(new Date(maxDays.getDate("date_str").getTime() - 86400000L), "Wechat");
if (tencentSettle != null && tencentSettle.size()>0) { if (tencentSettle != null && tencentSettle.size()>0) {
for (JSONObject logs : tencentSettle) { for (JSONObject logs : tencentSettle) {
@ -227,31 +272,6 @@ public class EstimateAnalysisServiceImpl implements EstimateAnalysisService {
} }
cleanDays.clear(); cleanDays.clear();
//T2
maxDays = estimateAnalysisMapper.findLastCleanDays(end_date, 1);
end_date = maxDays.getString("date_str");
cleanDays = estimateAnalysisMapper.findLastCleanDays(start_date, 1);
start_date = cleanDays.getString("date_str");
JSONObject totalAmountT2 = estimateAnalysisMapper.findAllTransactionByDate(start_date, end_date, t2client);
if (totalAmountT2 != null) {
dayInfo.put("t2", totalAmountT2.getBigDecimal("total_amount"));
} else {
dayInfo.put("t2", 0);
}
//T3
maxDays = estimateAnalysisMapper.findLastCleanDays(end_date, 1);
end_date = maxDays.getString("date_str");
cleanDays = estimateAnalysisMapper.findLastCleanDays(start_date, 1);
start_date = cleanDays.getString("date_str");
JSONObject totalAmountT3 = estimateAnalysisMapper.findAllTransactionByDate(start_date, end_date, t3client);
if (totalAmountT3 != null) {
dayInfo.put("t3", totalAmountT3.getBigDecimal("total_amount"));
} else {
dayInfo.put("t3", 0);
}
dayInfo.put("estimate_date", endStr);
dayInfo.put("total", dayInfo.getBigDecimal("t1").add(dayInfo.getBigDecimal("t2")).add(dayInfo.getBigDecimal("t3")));
return dayInfo; return dayInfo;
} }

@ -78,4 +78,11 @@ public interface TransactionAnalysisMapper {
List<JSONObject> getAreaMerchantAmountByCycle(JSONObject params); List<JSONObject> getAreaMerchantAmountByCycle(JSONObject params);
JSONObject getOrderClearAmount(@Param("order_id") String order_id); JSONObject getOrderClearAmount(@Param("order_id") String order_id);
/**
* cny_amount
* @param params
* @return
*/
BigDecimal getCnyAmount(JSONObject params);
} }

@ -85,6 +85,17 @@ public class CustomersAnalysisController {
return customersAnalysisService.getCustomersRanking(params,analysis.getPage(),analysis.getLimit()); return customersAnalysisService.getCustomersRanking(params,analysis.getPage(),analysis.getLimit());
} }
@ManagerMapping(value = "/ranking/{openid_type}/total",role = ManagerRole.RISK_MANAGER)
public JSONObject getCustomersTotal(@PathVariable int openid_type, AnalysisBean analysis, @ModelAttribute(CommonConsts.MANAGER_STATUS) JSONObject manager) {
JSONObject params = analysis.toParams(null);
params.put("openid_type",openid_type);
if (manager.getInteger("org_id") != null) {
params.put("org_id", manager.getIntValue("org_id"));
}
return customersAnalysisService.getCustomersTotal(params);
}
@ManagerMapping(value = "/{customer_id}/orders",role = ManagerRole.DEVELOPER) @ManagerMapping(value = "/{customer_id}/orders",role = ManagerRole.DEVELOPER)
public JSONObject getCustomerOrders(@PathVariable String customer_id, TradeLogQuery tradeLogQuery, @ModelAttribute(CommonConsts.MANAGER_STATUS) JSONObject manager) { public JSONObject getCustomerOrders(@PathVariable String customer_id, TradeLogQuery tradeLogQuery, @ModelAttribute(CommonConsts.MANAGER_STATUS) JSONObject manager) {
JSONObject params = tradeLogQuery.toParams(null); JSONObject params = tradeLogQuery.toParams(null);

@ -167,4 +167,6 @@ public interface RetailAppService {
JSONObject getStyle(); JSONObject getStyle();
void cancelCouponAccuessLog(String accuess_id, String remark); void cancelCouponAccuessLog(String accuess_id, String remark);
void submitMaterial(JSONObject material, JSONObject device);
} }

@ -33,6 +33,9 @@ import au.com.royalpay.payment.manage.notice.core.NoticePartner;
import au.com.royalpay.payment.manage.openim.core.CustomerServiceService; import au.com.royalpay.payment.manage.openim.core.CustomerServiceService;
import au.com.royalpay.payment.manage.pushMessage.APNSMessageHelper; import au.com.royalpay.payment.manage.pushMessage.APNSMessageHelper;
import au.com.royalpay.payment.manage.pushMessage.bean.AppManagerMessageBuilder; import au.com.royalpay.payment.manage.pushMessage.bean.AppManagerMessageBuilder;
import au.com.royalpay.payment.manage.riskbusiness.core.RiskProcessLogService;
import au.com.royalpay.payment.manage.riskbusiness.core.RiskUploadService;
import au.com.royalpay.payment.manage.riskbusiness.enums.RiskResultTypeEnum;
import au.com.royalpay.payment.manage.signin.beans.ChangePwdBean; import au.com.royalpay.payment.manage.signin.beans.ChangePwdBean;
import au.com.royalpay.payment.manage.signin.core.SignInAccountService; import au.com.royalpay.payment.manage.signin.core.SignInAccountService;
import au.com.royalpay.payment.manage.signin.core.impls.SignInAccountServiceImpl; import au.com.royalpay.payment.manage.signin.core.impls.SignInAccountServiceImpl;
@ -176,6 +179,10 @@ public class RetailAppServiceImp implements RetailAppService {
private CouponAccuessLogMapper couponAccuessLogMapper; private CouponAccuessLogMapper couponAccuessLogMapper;
@Resource @Resource
private CouponValidateService couponValidateService; private CouponValidateService couponValidateService;
@Resource
private RiskProcessLogService riskProcessLogService;
@Resource
private RiskUploadService riskUploadService;
private Map<String, AppMsgSender> senderMap = new HashMap<>(); private Map<String, AppMsgSender> senderMap = new HashMap<>();
private final String fileName[] = { "client_bank_file", "client_id_file", "client_company_file" }; private final String fileName[] = { "client_bank_file", "client_id_file", "client_company_file" };
@ -1378,6 +1385,10 @@ public class RetailAppServiceImp implements RetailAppService {
if (Hf.containsKey("channel")) { if (Hf.containsKey("channel")) {
channels.add(Hf); channels.add(Hf);
} }
JSONObject Yeepay = getChannel(clientId, now, "Yeepay");
if (Yeepay.containsKey("channel")) {
channels.add(Yeepay);
}
res.put("channels", channels); res.put("channels", channels);
return res; return res;
} }
@ -1857,4 +1868,18 @@ public class RetailAppServiceImp implements RetailAppService {
return sourceStr; return sourceStr;
} }
@Override
public void submitMaterial(JSONObject material, JSONObject device) {
riskUploadService.submitMaterial(material);
JSONObject account = clientAccountMapper.findById(device.getString("account_id"));
if (account == null)
account = new JSONObject();
riskProcessLogService.addRiskProcessLog(material.getString("risk_id"),
account.getString("account_id"),
account.getString("display_name"),
RiskResultTypeEnum.WAIT_FOR_AUDIT.getRemark(),
RiskResultTypeEnum.SEND_EMAIL_TO_BD.getResultType(),
RiskResultTypeEnum.WAIT_FOR_AUDIT.getResultType());
}
} }

@ -13,6 +13,10 @@ import au.com.royalpay.payment.manage.bill.core.BillOrderService;
import au.com.royalpay.payment.manage.bill.core.BillService; import au.com.royalpay.payment.manage.bill.core.BillService;
import au.com.royalpay.payment.manage.merchants.beans.ClientAuthFilesInfo; import au.com.royalpay.payment.manage.merchants.beans.ClientAuthFilesInfo;
import au.com.royalpay.payment.manage.merchants.beans.ClientUpdateInfo; import au.com.royalpay.payment.manage.merchants.beans.ClientUpdateInfo;
import au.com.royalpay.payment.manage.riskbusiness.bean.RiskEventQuery;
import au.com.royalpay.payment.manage.riskbusiness.core.RiskBusinessService;
import au.com.royalpay.payment.manage.riskbusiness.core.RiskUploadService;
import au.com.royalpay.payment.manage.riskbusiness.enums.RiskResultTypeEnum;
import au.com.royalpay.payment.manage.settlement.core.ManualSettleSupport; import au.com.royalpay.payment.manage.settlement.core.ManualSettleSupport;
import au.com.royalpay.payment.manage.signin.beans.ChangePwdBean; import au.com.royalpay.payment.manage.signin.beans.ChangePwdBean;
import au.com.royalpay.payment.manage.signin.core.SignInStatusManager; import au.com.royalpay.payment.manage.signin.core.SignInStatusManager;
@ -29,9 +33,11 @@ import au.com.royalpay.payment.tools.merchants.beans.UpdateSurchargeDTO;
import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.time.DateUtils; import org.apache.commons.lang3.time.DateUtils;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.Errors; import org.springframework.validation.Errors;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartFile;
@ -39,6 +45,7 @@ import org.springframework.web.servlet.ModelAndView;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.text.ParseException; import java.text.ParseException;
import java.util.Arrays;
import java.util.Date; import java.util.Date;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
@ -75,6 +82,11 @@ public class RetailAppController {
@Resource @Resource
private AttachmentClient attachmentClient; private AttachmentClient attachmentClient;
@Autowired
private RiskBusinessService riskBusinessService;
@Autowired
private RiskUploadService riskUploadService;
@RequestMapping(value = "/token", method = RequestMethod.PUT) @RequestMapping(value = "/token", method = RequestMethod.PUT)
public void updateDevToken(@ModelAttribute(CommonConsts.RETAIL_DEVICE) JSONObject device, @RequestBody JSONObject token) { public void updateDevToken(@ModelAttribute(CommonConsts.RETAIL_DEVICE) JSONObject device, @RequestBody JSONObject token) {
@ -565,4 +577,71 @@ public class RetailAppController {
retailAppService.cancelCouponAccuessLog(accuess_id, remark); retailAppService.cancelCouponAccuessLog(accuess_id, remark);
} }
/**
* app
* @param clientId
* @return
*/
@GetMapping(value = "/risk/business/notice")
public JSONObject riskNotice(@RequestParam("client_id") int clientId) {
return riskBusinessService.getNoticeInfo(clientId);
}
/**
* app
* @param riskEventQuery
* @return
*/
@GetMapping(value = "/risk/business/events")
public JSONObject getRiskEvents(RiskEventQuery riskEventQuery) {
JSONObject params = riskEventQuery.toJSON();
params.put("client_moniker", riskEventQuery.getClientMoniker());
params.put("is_send_client", 1);
params.putIfAbsent("page", 1);
List<Integer> resultTypes = Arrays.asList(RiskResultTypeEnum.SEND_EMAIL_TO_BD.getResultType(),
RiskResultTypeEnum.WAIT_FOR_AUDIT.getResultType(),
RiskResultTypeEnum.MATERIAL_AUDIT_PASS.getResultType(),
RiskResultTypeEnum.MATERIAL_NOT_PASS.getResultType(),
RiskResultTypeEnum.ALREADY_HANDLED.getResultType());
params.put("result_types", resultTypes);
return riskBusinessService.getRiskEventsByPage(params, null);
}
/**
* app
* @param riskId
* @return
*/
@GetMapping(value = "/risk/business/events/{risk_id}")
public JSONObject getRiskEventDetail(@PathVariable("risk_id") String riskId) {
JSONObject riskEvent = riskBusinessService.getRiskEventDetail(riskId);
List<JSONObject> tradeLogs = riskBusinessService.getRiskEventOrderList(riskEvent);
riskEvent.put("tradeLogs", tradeLogs);
return riskEvent;
}
/**
* app
* @param riskId
* @return
*/
@GetMapping(value = "/risk/business/events/{risk_id}/materials")
public JSONObject getRiskEventMaterialsRemark(@PathVariable("risk_id") String riskId) {
return riskBusinessService.getRiskEventMaterialsRemark(riskId);
}
/**
* app
* @param material
*/
@PostMapping(value = "/risk/business/events")
public void uploadMaterial(@RequestBody JSONObject material, @ModelAttribute(RETAIL_DEVICE) JSONObject device) {
retailAppService.submitMaterial(material, device);
}
@RequestMapping(value = "/risk/business/upload/files", method = RequestMethod.POST)
public JSONObject uploadImage(@RequestParam MultipartFile file) throws Exception {
return attachmentClient.uploadFile(file,false);
}
} }

@ -28,29 +28,36 @@ public class AfterPaymentFinishListener implements ApplicationListener<AfterPaym
@Override @Override
public void onApplicationEvent(AfterPaymentFinishEvent event) { public void onApplicationEvent(AfterPaymentFinishEvent event) {
JSONObject order = event.getFinishedEvent().getOrder(); JSONObject order = event.getFinishedEvent().getOrder();
if(!"hf".equals(order.getString("channel"))){ if(!"hf".equals(order.getString("channel"))&&!"Yeepay".equals(order.getString("channel"))){
return; return;
} }
if(StringUtils.isEmpty(order.getString("ext_params"))){ switch (order.getString("channel")){
return; case "hf":
} if(StringUtils.isEmpty(order.getString("ext_params"))){
JSONObject extParam = JSONObject.parseObject(order.getString("ext_params")); return;
JSONObject orderInfo = sysCustomerPaymentInfoMapper.selectPaymentInfo(order.getString("customer_id")); }
if (orderInfo != null) { JSONObject extParam = JSONObject.parseObject(order.getString("ext_params"));
orderInfo.put("idcard_name", extParam.getString("payer_name")); JSONObject orderInfo = sysCustomerPaymentInfoMapper.selectPaymentInfo(order.getString("customer_id"));
orderInfo.put("idcard_no", extParam.getString("payer_identity_card")); if (orderInfo != null) {
orderInfo.put("bankcard", extParam.getString("card_number")); orderInfo.put("idcard_name", extParam.getString("payer_name"));
orderInfo.put("bank", extParam.getString("bankId")); orderInfo.put("idcard_no", extParam.getString("payer_identity_card"));
sysCustomerPaymentInfoMapper.update(orderInfo); orderInfo.put("bankcard", extParam.getString("card_number"));
}else { orderInfo.put("bank", extParam.getString("bankId"));
JSONObject lastOrderInfo = new JSONObject(); sysCustomerPaymentInfoMapper.update(orderInfo);
lastOrderInfo.put("wechat_openid", order.getString("customer_id")); }else {
lastOrderInfo.put("idcard_name", extParam.getString("payer_name")); JSONObject lastOrderInfo = new JSONObject();
lastOrderInfo.put("idcard_no", extParam.getString("payer_identity_card")); lastOrderInfo.put("wechat_openid", order.getString("customer_id"));
lastOrderInfo.put("bankcard", extParam.getString("card_number")); lastOrderInfo.put("idcard_name", extParam.getString("payer_name"));
lastOrderInfo.put("bank", extParam.getString("bankId")); lastOrderInfo.put("idcard_no", extParam.getString("payer_identity_card"));
customerPaymentInfoService.save(lastOrderInfo); lastOrderInfo.put("bankcard", extParam.getString("card_number"));
lastOrderInfo.put("bank", extParam.getString("bankId"));
customerPaymentInfoService.save(lastOrderInfo);
}
clientManager.sendHfEmailNotice(order);
return;
case "Yeepay":
clientManager.sendGatewayEmailNotice(order);
return;
} }
clientManager.sendHfEmailNotice(order);
} }
} }

@ -80,7 +80,7 @@ public class BDPrizeServiceImpl implements BDPrizeService {
private static BigDecimal percent = new BigDecimal(100); private static BigDecimal percent = new BigDecimal(100);
private static String[] channels = new String[]{"Wechat", "Alipay", "Bestpay", "jd", "AlipayOnline","hf", "Rpay"}; private static String[] channels = new String[]{"Wechat", "Alipay", "Bestpay", "jd", "AlipayOnline","hf", "Rpay","Yeepay"};
private static Logger logger = LoggerFactory.getLogger(BDPrizeServiceImpl.class); private static Logger logger = LoggerFactory.getLogger(BDPrizeServiceImpl.class);
@Override @Override

@ -23,7 +23,7 @@ import javax.annotation.Resource;
@RestController @RestController
@RequestMapping("/act/encourage_money") @RequestMapping("/act/encourage_money")
public class EncourageMoneyController { public class EncourageMoneyController {
Logger logger = LoggerFactory.getLogger(getClass()); private Logger logger = LoggerFactory.getLogger(getClass());
@Resource @Resource
private EncourageService encourageService; private EncourageService encourageService;
@ -32,7 +32,6 @@ public class EncourageMoneyController {
public JSONObject takeEncourageMoney(@PathVariable String orderId, @ModelAttribute(CommonConsts.WECHATINFO) JSONObject wxUser, public JSONObject takeEncourageMoney(@PathVariable String orderId, @ModelAttribute(CommonConsts.WECHATINFO) JSONObject wxUser,
@ModelAttribute(CommonConsts.ALIUSER) JSONObject aliuser) { @ModelAttribute(CommonConsts.ALIUSER) JSONObject aliuser) {
String user_id = ""; String user_id = "";
logger.info("problem order id:"+orderId+"--wxUser:"+wxUser+"--aliuser:"+aliuser);
if (wxUser == null) { if (wxUser == null) {
user_id = aliuser.getString("user_id"); user_id = aliuser.getString("user_id");
} else { } else {

@ -0,0 +1,35 @@
package au.com.royalpay.payment.manage.dataAnalysis.core;
import com.alibaba.fastjson.JSONObject;
/**
* @Author lvjian
* @Date 2018/6/28 18:40
*/
public interface DataAnalysisService {
/**
* 1
* @param params
* @param response
* @return
*/
JSONObject getDataAnalysis1(JSONObject params, JSONObject response);
/**
* 2
* @param params
* @param response
* @return
*/
JSONObject getDataAnalysis2(JSONObject params, JSONObject response);
/**
*
* cny_amount
* @param params
* @param response
* @return
*/
JSONObject getCnyAmount(JSONObject params, JSONObject response);
}

@ -0,0 +1,65 @@
package au.com.royalpay.payment.manage.dataAnalysis.core;
import au.com.royalpay.payment.manage.analysis.mappers.ClientAnalysisMapper;
import au.com.royalpay.payment.manage.analysis.mappers.TransactionAnalysisMapper;
import com.alibaba.fastjson.JSONObject;
import com.github.miemiedev.mybatis.paginator.domain.Order;
import com.github.miemiedev.mybatis.paginator.domain.PageBounds;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.List;
/**
* @Author lvjian
* @Date 2018/6/28 18:42
*/
@Service
public class DataAnalysisServiceImpl implements DataAnalysisService {
@Resource
private ClientAnalysisMapper clientAnalysisMapper;
@Resource
private TransactionAnalysisMapper transactionAnalysisMapper;
@Override
public JSONObject getDataAnalysis1(JSONObject params, JSONObject response) {
//新加的商户数
response.put("new_partners", clientAnalysisMapper.countNewClients(params));
//总商户数
response.put("total_partners", clientAnalysisMapper.countClients(params));
//产生交易的商户数
response.put("traded_partners", clientAnalysisMapper.countTradedPartners(params));
//交易总额
response.put("trade_amount", transactionAnalysisMapper.analysisTotalAmount(params));
return response;
}
@Override
public JSONObject getDataAnalysis2(JSONObject params, JSONObject response) {
//交易笔数
response.put("trade_count", transactionAnalysisMapper.analysisTotalCount(params));
List<JSONObject> topOrders = transactionAnalysisMapper.getTopOrders(params);
//最大交易额
if (!topOrders.isEmpty()) {
response.put("max_order", topOrders.get(0).get("aud_fee"));
} else {
response.put("max_order", 0);
}
//总消费人数
response.put("total_customers", transactionAnalysisMapper.countCustomers(params));
//老客户人数
response.put("old_customers", transactionAnalysisMapper.countOldCustomers(params));
return response;
}
@Override
public JSONObject getCnyAmount(JSONObject params, JSONObject response) {
response.put("cny_amount", transactionAnalysisMapper.getCnyAmount(params));
return response;
}
}

@ -0,0 +1,27 @@
package au.com.royalpay.payment.manage.dataAnalysis.util;
import java.util.Calendar;
import java.util.Date;
/**
* @Author lvjian
* @Date 2018/6/28 18:34
*/
public class MyUtil {
/**
*
* @param date
* @return
*/
public static Date getYMD(Date date) {
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
calendar.set(Calendar.HOUR_OF_DAY, 0);
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.SECOND, 0);
calendar.set(Calendar.MILLISECOND, 0);
return calendar.getTime();
}
}

@ -0,0 +1,54 @@
package au.com.royalpay.payment.manage.dataAnalysis.web;
import au.com.royalpay.payment.manage.dataAnalysis.core.DataAnalysisService;
import au.com.royalpay.payment.manage.dataAnalysis.util.MyUtil;
import com.alibaba.fastjson.JSONObject;
import org.apache.commons.lang3.time.DateUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
* @Author lvjian
* @Date 2018/6/28 18:32
*/
@RestController
@RequestMapping(value = "/out")
public class DataAnalysisController {
@Autowired
private DataAnalysisService dataAnalysisService;
@RequestMapping(value = "/data_analysis")
public JSONObject dataAnalysis(@RequestParam(value = "begin", required = false) String begin,
@RequestParam(value = "offset", defaultValue = "1") Integer offset) throws ParseException {
JSONObject params = new JSONObject();
if (begin == null) {
Date beginInit = MyUtil.getYMD(new Date());
Date endInit = DateUtils.addDays(beginInit,offset);
params.put("begin",beginInit);
params.put("end",endInit);
} else {
DateFormat format = new SimpleDateFormat("yyyyMMdd");
if (offset < 0) {
params.put("end", format.parse(begin));
params.put("begin", DateUtils.addDays(format.parse(begin),offset));
} else {
params.put("begin", format.parse(begin));
params.put("end", DateUtils.addDays(format.parse(begin),offset));
}
}
JSONObject response = new JSONObject();
response = dataAnalysisService.getDataAnalysis1(params,response);
response = dataAnalysisService.getDataAnalysis2(params,response);
response = dataAnalysisService.getCnyAmount(params, response);
return response;
}
}

@ -6,6 +6,7 @@ import au.com.royalpay.payment.channels.bestpay.runtime.BestPayClient;
import au.com.royalpay.payment.channels.jd.runtime.JDClient; import au.com.royalpay.payment.channels.jd.runtime.JDClient;
import au.com.royalpay.payment.channels.rpay.runtime.RpayClient; import au.com.royalpay.payment.channels.rpay.runtime.RpayClient;
import au.com.royalpay.payment.channels.wechat.runtime.WxPayClient; import au.com.royalpay.payment.channels.wechat.runtime.WxPayClient;
import au.com.royalpay.payment.channels.yeepay.runtime.YeePayClient;
import au.com.royalpay.payment.core.PaymentApi; import au.com.royalpay.payment.core.PaymentApi;
import au.com.royalpay.payment.core.exceptions.InvalidShortIdException; import au.com.royalpay.payment.core.exceptions.InvalidShortIdException;
import au.com.royalpay.payment.core.exceptions.OrderNotExistsException; import au.com.royalpay.payment.core.exceptions.OrderNotExistsException;
@ -102,6 +103,8 @@ public class TestController implements ApplicationEventPublisherAware {
@Resource @Resource
private RpayClient rpayClient; private RpayClient rpayClient;
@Resource @Resource
private YeePayClient yeepayClient;
@Resource
private TradeLogService tradeLogService; private TradeLogService tradeLogService;
@Resource @Resource
private RetailAppService retailAppService; private RetailAppService retailAppService;
@ -306,6 +309,9 @@ public class TestController implements ApplicationEventPublisherAware {
String rpayjson = JSON.toJSONString(orderInfo, SerializerFeature.PrettyFormat); String rpayjson = JSON.toJSONString(orderInfo, SerializerFeature.PrettyFormat);
res.put("xml", rpayjson); res.put("xml", rpayjson);
break; break;
case "Yeepay":
res.put("xml", yeepayClient.queryOrderStd(orderId).toString());
break;
default: default:
throw new BadRequestException("Not Support channel:" + channel); throw new BadRequestException("Not Support channel:" + channel);
} }
@ -350,6 +356,9 @@ public class TestController implements ApplicationEventPublisherAware {
xmlStr = XmlFormatUtils.formatXml(elem); xmlStr = XmlFormatUtils.formatXml(elem);
res.put("xml", xmlStr); res.put("xml", xmlStr);
break; break;
case "Yeepay":
res.put("xml", yeepayClient.queryRefundStd(refundOrder.getString("out_refund_id")).toString());
break;
default: default:
throw new BadRequestException("Not Support channel:" + channel); throw new BadRequestException("Not Support channel:" + channel);
} }

@ -11,10 +11,7 @@ import au.com.royalpay.payment.manage.mappers.log.LogSettleMailMapper;
import au.com.royalpay.payment.manage.mappers.log.ValidationLogMapper; import au.com.royalpay.payment.manage.mappers.log.ValidationLogMapper;
import au.com.royalpay.payment.manage.mappers.payment.TaskManualSettleMapper; import au.com.royalpay.payment.manage.mappers.payment.TaskManualSettleMapper;
import au.com.royalpay.payment.manage.mappers.payment.TransactionMapper; import au.com.royalpay.payment.manage.mappers.payment.TransactionMapper;
import au.com.royalpay.payment.manage.mappers.system.CalendarMapper; import au.com.royalpay.payment.manage.mappers.system.*;
import au.com.royalpay.payment.manage.mappers.system.ClientRateMapper;
import au.com.royalpay.payment.manage.mappers.system.ManagerMapper;
import au.com.royalpay.payment.manage.mappers.system.RateMapper;
import au.com.royalpay.payment.manage.merchants.core.ClientConfigService; import au.com.royalpay.payment.manage.merchants.core.ClientConfigService;
import au.com.royalpay.payment.manage.merchants.core.ClientManager; import au.com.royalpay.payment.manage.merchants.core.ClientManager;
import au.com.royalpay.payment.manage.notice.core.MailService; import au.com.royalpay.payment.manage.notice.core.MailService;
@ -157,6 +154,9 @@ public class CleanServiceImpl implements CleanService, ManagerTodoNoticeProvider
@Resource @Resource
private SysConfigManager sysConfigManager; private SysConfigManager sysConfigManager;
@Resource
private ClientDeviceMapper clientDeviceMapper;
@Value("${app.settlement.email-to}") @Value("${app.settlement.email-to}")
private String settlementEmailTo; private String settlementEmailTo;
@Value("${app.settlement.email-cc}") @Value("${app.settlement.email-cc}")
@ -828,13 +828,15 @@ public class CleanServiceImpl implements CleanService, ManagerTodoNoticeProvider
int rowNum = 0; int rowNum = 0;
Row row = sheet.createRow(rowNum); Row row = sheet.createRow(rowNum);
String[] title = {"order Id", "Client Order Id", "Transaction Time", "Channel", "Gateway", "Exchange Rate", "Transaction Type", "Currency", String[] title = {"order Id", "Client Order Id", "Transaction Time", "Channel", "Gateway", "Exchange Rate", "Transaction Type", "Currency",
"Input Amount", "Total Amount", "Clearing Amount", "Sruchange Rate", "Settle Amount", "Remark"}; "Input Amount", "Total Amount", "Clearing Amount", "Sruchange Rate", "Settle Amount", "Remark", "Dev No"};
String[] analysis = {"Total Credit", "Total Debit", "Gross Amount", "Total Charge", "Net Amount"}; String[] analysis = {"Total Credit", "Total Debit", "Gross Amount", "Total Charge", "Net Amount"};
for (int i = 0; i < title.length; i++) { for (int i = 0; i < title.length; i++) {
row.createCell(i, Cell.CELL_TYPE_STRING).setCellValue(title[i]); row.createCell(i, Cell.CELL_TYPE_STRING).setCellValue(title[i]);
} }
JSONObject channels = clearTransation.getJSONObject("channels"); JSONObject channels = clearTransation.getJSONObject("channels");
JSONObject device;
String clientDevId = "";
for (Object o : clearTransation.getJSONArray("report")) { for (Object o : clearTransation.getJSONArray("report")) {
JSONObject settle = (JSONObject) o; JSONObject settle = (JSONObject) o;
if (settle.getBigDecimal("clearing_amount").compareTo(BigDecimal.ZERO) == 0) { if (settle.getBigDecimal("clearing_amount").compareTo(BigDecimal.ZERO) == 0) {
@ -865,6 +867,10 @@ public class CleanServiceImpl implements CleanService, ManagerTodoNoticeProvider
row.createCell(12, Cell.CELL_TYPE_STRING).setCellValue(settle.getBigDecimal("settle_amount") == null ? "" row.createCell(12, Cell.CELL_TYPE_STRING).setCellValue(settle.getBigDecimal("settle_amount") == null ? ""
: settle.getBigDecimal("settle_amount").setScale(2, BigDecimal.ROUND_DOWN).toPlainString()); : settle.getBigDecimal("settle_amount").setScale(2, BigDecimal.ROUND_DOWN).toPlainString());
row.createCell(13, Cell.CELL_TYPE_STRING).setCellValue(settle.getString("order_detail")); row.createCell(13, Cell.CELL_TYPE_STRING).setCellValue(settle.getString("order_detail"));
device = clientDeviceMapper.find(settle.getString("dev_id"));
if (device != null)
clientDevId = device.getString("client_dev_id");
row.createCell(14, Cell.CELL_TYPE_STRING).setCellValue(clientDevId);
} }
row = sheet.createRow(++rowNum); row = sheet.createRow(++rowNum);
for (int i = 0; i < analysis.length; i++) { for (int i = 0; i < analysis.length; i++) {

@ -25,7 +25,7 @@ public interface RefundAuditionMapper {
List<JSONObject> listAuditingRefundsOfOrder(@Param("order_id") String orderId); List<JSONObject> listAuditingRefundsOfOrder(@Param("order_id") String orderId);
@AutoSql(type = SqlType.SELECT) @AutoSql(type = SqlType.SELECT)
JSONObject find(@Param("id") String applyId); JSONObject find(@Param("id") String refundAuditId);
List<JSONObject> listAuditingRefundsOfClient(@Param("client_id") int clientId); List<JSONObject> listAuditingRefundsOfClient(@Param("client_id") int clientId);

@ -9,6 +9,7 @@ import com.github.miemiedev.mybatis.paginator.domain.PageBounds;
import com.github.miemiedev.mybatis.paginator.domain.PageList; import com.github.miemiedev.mybatis.paginator.domain.PageList;
import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Param;
import org.joda.time.DateTime; import org.joda.time.DateTime;
import org.springframework.beans.factory.annotation.Autowired;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.util.Date; import java.util.Date;
@ -37,6 +38,10 @@ public interface TransactionMapper {
@AdvanceSelect(addonWhereClause = "refund_id is null and system_generate=0 and transaction_type = 'Credit'") @AdvanceSelect(addonWhereClause = "refund_id is null and system_generate=0 and transaction_type = 'Credit'")
JSONObject findIncomeByOrderId(@Param("order_id") String orderId); JSONObject findIncomeByOrderId(@Param("order_id") String orderId);
@AutoSql(type = SqlType.SELECT)
@AdvanceSelect(addonWhereClause = "transaction_type = 'Credit'")
JSONObject findByOrderId(@Param("order_id") String orderId);
@AutoSql(type = SqlType.SELECT) @AutoSql(type = SqlType.SELECT)
@AdvanceSelect(addonWhereClause = "refund_id is null and system_generate=1") @AdvanceSelect(addonWhereClause = "refund_id is null and system_generate=1")
JSONObject findSystemIncomeByOrderId(@Param("order_id") String orderId); JSONObject findSystemIncomeByOrderId(@Param("order_id") String orderId);
@ -145,4 +150,15 @@ public interface TransactionMapper {
List<JSONObject> getHfClearAmount(JSONObject params); List<JSONObject> getHfClearAmount(JSONObject params);
List<JSONObject> analysisForATOReport(@Param("clientId") int clientId, @Param("from") Date startOfMon, @Param("to") Date endOfMon); List<JSONObject> analysisForATOReport(@Param("clientId") int clientId, @Param("from") Date startOfMon, @Param("to") Date endOfMon);
/**
* 退退
* @param clientId
* @param systemTransactionId
* @return
*/
@AutoSql(type = SqlType.SELECT)
PageList<JSONObject> findByClientIdAndSystemTransactionId(@Param("client_id") int clientId,
@Param("system_transaction_id") String systemTransactionId,
PageBounds pageBounds);
} }

@ -0,0 +1,29 @@
package au.com.royalpay.payment.manage.mappers.risk;
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.JSONObject;
import com.github.miemiedev.mybatis.paginator.domain.PageBounds;
import com.github.miemiedev.mybatis.paginator.domain.PageList;
import org.apache.ibatis.annotations.Param;
/**
* Create by yixian at 2017-12-21 11:45
*/
@AutoMapper(tablename = "risk_customer_black_list", pkName = "openid")
public interface RiskCustomerBlackListMapper {
@AutoSql(type = SqlType.SELECT)
JSONObject findByOpenid(@Param("openid") String openid);
@AutoSql(type = SqlType.SELECT)
@AdvanceSelect(addonWhereClause = "is_valid=1")
PageList<JSONObject> query(JSONObject params, PageBounds pagination);
@AutoSql(type = SqlType.UPDATE)
void update(JSONObject customerBlackList);
@AutoSql(type = SqlType.INSERT)
void save(JSONObject customerBlackList);
}

@ -28,7 +28,14 @@ public interface RiskEventMapper {
PageList<JSONObject> listRisksByPage(JSONObject params, PageBounds pageBounds); PageList<JSONObject> listRisksByPage(JSONObject params, PageBounds pageBounds);
List<JSONObject> analysisByIndustry(JSONObject params);
List<JSONObject> analysisByAmount(JSONObject params);
@AutoSql(type = SqlType.SELECT) @AutoSql(type = SqlType.SELECT)
JSONObject findById(@Param("risk_id") String riskId); JSONObject findById(@Param("risk_id") String riskId);
@AutoSql(type = SqlType.DELETE)
void deleteRiskEvent(@Param("risk_id") String risk_id);
} }

@ -15,6 +15,9 @@ public interface RiskMaterialMapper {
@AutoSql(type = SqlType.INSERT) @AutoSql(type = SqlType.INSERT)
void save(JSONObject material); void save(JSONObject material);
@AutoSql(type = SqlType.UPDATE)
void update(JSONObject material);
List<JSONObject> findAllMaterials(@Param("risk_id") String risk_id); List<JSONObject> findAllMaterials(@Param("risk_id") String risk_id);
} }

@ -0,0 +1,16 @@
package au.com.royalpay.payment.manage.mappers.riskbusiness;
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 = "risk_orders", pkName = "risk_order_id")
public interface RiskOrdersMapper {
@AutoSql(type= SqlType.INSERT)
void save(JSONObject params);
@AutoSql(type = SqlType.DELETE)
void clearOrders(@Param("risk_id") String riskId);
}

@ -0,0 +1,24 @@
package au.com.royalpay.payment.manage.mappers.riskbusiness;
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 com.github.miemiedev.mybatis.paginator.domain.PageBounds;
import com.github.miemiedev.mybatis.paginator.domain.PageList;
import org.apache.ibatis.annotations.Param;
/**
* @Description:
* @Author: lujian
* @Date: 2018/11/22 15:32
*/
@AutoMapper(tablename = "risk_process_log", pkName = "risk_process_id")
public interface RiskProcessLogMapper {
@AutoSql(type = SqlType.SELECT)
PageList<JSONObject> getRiskProcessLogs(@Param("risk_id") String riskId, PageBounds pagination);
@AutoSql(type = SqlType.INSERT)
void addRiskProcessLog(JSONObject log);
}

@ -60,7 +60,7 @@ public interface ClientAccountMapper {
List<JSONObject> listPaymentNoticeAccounts(@Param("client_id") int clientId); List<JSONObject> listPaymentNoticeAccounts(@Param("client_id") int clientId);
@AutoSql(type = SqlType.SELECT) @AutoSql(type = SqlType.SELECT)
@AdvanceSelect(addonWhereClause = "is_valid=1 and refund_authorised=1 and wechat_openid is not null", excludeColumns = {"salt", "password_hash"}) @AdvanceSelect(addonWhereClause = "is_valid=1 and (refund_authorised = 1 OR role = 1) and wechat_openid is not null", excludeColumns = {"salt", "password_hash"})
List<JSONObject> listRefundAuditAccounts(@Param("client_id") int clientId); List<JSONObject> listRefundAuditAccounts(@Param("client_id") int clientId);
@AutoSql(type = SqlType.SELECT) @AutoSql(type = SqlType.SELECT)

@ -64,6 +64,9 @@ public interface ClientManager {
@Transactional @Transactional
void updateClientRpayPaymentConfig(JSONObject manager, String clientMoniker, JSONObject rpaySubMerchantInfo); void updateClientRpayPaymentConfig(JSONObject manager, String clientMoniker, JSONObject rpaySubMerchantInfo);
@Transactional
void updateClientYeepayPaymentConfig(JSONObject manager, String clientMoniker, JSONObject yeepaySubMerchantInfo);
@Transactional @Transactional
void updateAliSubMerchantId(JSONObject manager, String clientMoniker, JSONObject aliSubMerchantInfo); void updateAliSubMerchantId(JSONObject manager, String clientMoniker, JSONObject aliSubMerchantInfo);
@ -244,6 +247,8 @@ public interface ClientManager {
void changePaymentPage(JSONObject manager, String clientMoniker, String paypad_version); void changePaymentPage(JSONObject manager, String clientMoniker, String paypad_version);
void changePaymentSuccessPage(JSONObject manager, String clientMoniker, String paysuccess_version);
void changePaymentPage(JSONObject account, String paypad_version); void changePaymentPage(JSONObject account, String paypad_version);
void changeManualSettle(JSONObject account , int client_id, boolean manual_settle,String operator_id,int type,String operation); void changeManualSettle(JSONObject account , int client_id, boolean manual_settle,String operator_id,int type,String operation);
@ -304,6 +309,8 @@ public interface ClientManager {
List<JSONObject> listRpaySubMerchantIdApplys(JSONObject manager, String clientMoniker); List<JSONObject> listRpaySubMerchantIdApplys(JSONObject manager, String clientMoniker);
List<JSONObject> listYeepaySubMerchantIdApplys(JSONObject manager, String clientMoniker);
String subMerchantApplication(String clientMoniker, SubMerchantIdApply subMerchantApply,JSONObject manager); String subMerchantApplication(String clientMoniker, SubMerchantIdApply subMerchantApply,JSONObject manager);
List<JSONObject> listMerchantIds(String clientMoniker,JSONObject manager); List<JSONObject> listMerchantIds(String clientMoniker,JSONObject manager);
@ -332,13 +339,22 @@ public interface ClientManager {
String getShortLink(String client_moniker); String getShortLink(String client_moniker);
String getGatewayShortLink(String client_moniker,String channel);
@Transactional @Transactional
void switchHfLink(JSONObject manager, String clientMoniker,boolean allow); void switchHfLink(JSONObject manager, String clientMoniker,boolean allow);
@Transactional
void switchGatewayLink(JSONObject manager, String clientMoniker,String channel,boolean allow);
void sendHfEmailNotice(JSONObject order); void sendHfEmailNotice(JSONObject order);
void sendGatewayEmailNotice(JSONObject order);
void subRpayMerchantApplication(String clientMoniker,JSONObject merchantInfo, JSONObject manager); void subRpayMerchantApplication(String clientMoniker,JSONObject merchantInfo, JSONObject manager);
void subYeepayMerchantApplication(String clientMoniker,JSONObject merchantInfo, JSONObject manager);
void updateAllPartnerPassword(String clientMoniker, List<String> emails); void updateAllPartnerPassword(String clientMoniker, List<String> emails);
void postponeClientRate(Date now, Date yearTomorrow, String expireDate, JSONObject client); void postponeClientRate(Date now, Date yearTomorrow, String expireDate, JSONObject client);

@ -7,6 +7,8 @@ import au.com.royalpay.payment.channels.wechat.config.WechatPayEnvironment;
import au.com.royalpay.payment.channels.wechat.runtime.MpPaymentApi; import au.com.royalpay.payment.channels.wechat.runtime.MpPaymentApi;
import au.com.royalpay.payment.channels.wechat.runtime.WxPayClient; import au.com.royalpay.payment.channels.wechat.runtime.WxPayClient;
import au.com.royalpay.payment.channels.wechat.runtime.beans.SubMerchantInfo; import au.com.royalpay.payment.channels.wechat.runtime.beans.SubMerchantInfo;
import au.com.royalpay.payment.channels.yeepay.mappers.YeePayClientConfigMapper;
import au.com.royalpay.payment.channels.yeepay.runtime.YeePayClient;
import au.com.royalpay.payment.core.PaymentChannelApi; import au.com.royalpay.payment.core.PaymentChannelApi;
import au.com.royalpay.payment.core.exceptions.EmailException; import au.com.royalpay.payment.core.exceptions.EmailException;
import au.com.royalpay.payment.core.exceptions.InvalidShortIdException; import au.com.royalpay.payment.core.exceptions.InvalidShortIdException;
@ -120,6 +122,7 @@ import com.github.miemiedev.mybatis.paginator.domain.Order;
import com.github.miemiedev.mybatis.paginator.domain.PageBounds; import com.github.miemiedev.mybatis.paginator.domain.PageBounds;
import com.github.miemiedev.mybatis.paginator.domain.PageList; import com.github.miemiedev.mybatis.paginator.domain.PageList;
import com.yeepay.yop.sdk.service.kj.model.SubmerchantRegisterResult;
import org.apache.commons.io.IOUtils; import org.apache.commons.io.IOUtils;
import org.apache.commons.lang3.ArrayUtils; import org.apache.commons.lang3.ArrayUtils;
import org.apache.commons.lang3.RandomStringUtils; import org.apache.commons.lang3.RandomStringUtils;
@ -243,6 +246,12 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid
@Resource @Resource
private RpayApi rpayApi; private RpayApi rpayApi;
@Resource
private YeePayClient yeePayClient;
@Resource
private YeePayClientConfigMapper yeePayClientConfigMapper;
@Resource @Resource
private ManagerMapper managerMapper; private ManagerMapper managerMapper;
@Resource @Resource
@ -432,6 +441,10 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid
String hfQrcodeUrl = PlatformEnvironment.getEnv().concatUrl("/api/v1.0/hf_gateway/partners/" + client.getString("client_moniker") + "/jump/app"); String hfQrcodeUrl = PlatformEnvironment.getEnv().concatUrl("/api/v1.0/hf_gateway/partners/" + client.getString("client_moniker") + "/jump/app");
client.put("hfQrcodeUrl", QRCodeUtils.qrcodeImageCode(hfQrcodeUrl, 250, true)); client.put("hfQrcodeUrl", QRCodeUtils.qrcodeImageCode(hfQrcodeUrl, 250, true));
} }
if (client.getString("yeepay_pay_url") != null) {
String yeepayQrcodeUrl = PlatformEnvironment.getEnv().concatUrl("/api/v1.0/yeepay/partners/" + client.getString("client_moniker") + "/jump/app");
client.put("yeepayQrcodeUrl", QRCodeUtils.qrcodeImageCode(yeepayQrcodeUrl, 250, true));
}
return client; return client;
} }
@ -795,6 +808,25 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid
clientInfoCacheSupport.clearClientCache(clientId); clientInfoCacheSupport.clearClientCache(clientId);
} }
@Transactional
@Override
public void updateClientYeepayPaymentConfig(JSONObject manager, String clientMoniker, JSONObject yeepaySubMerchantInfo) {
JSONObject client = getClientInfoByMoniker(clientMoniker);
if (client == null) {
throw new InvalidShortIdException();
}
checkOrgPermission(manager, client);
if(client.getString("yeepay_sub_merchant_id").equals(yeepaySubMerchantInfo.getString("yeepay_sub_merchant_id"))){
throw new BadRequestException("The sub merchant Id is in use");
}
JSONObject yeepayConfigValid =yeePayClientConfigMapper.findMerchantConfig(client.getIntValue("client_id"));
yeePayClientConfigMapper.updateSubMerchantIdValid(yeepayConfigValid.getString("yeepay_config_id"),0);
JSONObject yeepayConfig = yeePayClientConfigMapper.findMerchantConfigBySub(yeepaySubMerchantInfo.getString("yeepay_sub_merchant_id"));
yeePayClientConfigMapper.updateSubMerchantIdValid(yeepayConfig.getString("yeepay_config_id"),1);
client.put("yeepay_sub_merchant_id",yeepaySubMerchantInfo.getString("yeepay_sub_merchant_id"));
clientMapper.update(client);
}
@Override @Override
public void updateAliSubMerchantId(JSONObject manager, String clientMoniker, JSONObject aliSubMerchantInfo) { public void updateAliSubMerchantId(JSONObject manager, String clientMoniker, JSONObject aliSubMerchantInfo) {
JSONObject client = getClientInfoByMoniker(clientMoniker); JSONObject client = getClientInfoByMoniker(clientMoniker);
@ -940,7 +972,7 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid
username += "0"; username += "0";
} }
} }
sendInitEmail(client, username, pwd); sendInitEmail(client, username.toLowerCase(), pwd);
// sendInitEmail(manager, client, username, pwd); // sendInitEmail(manager, client, username, pwd);
} }
@ -1220,6 +1252,9 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid
if (channel.equals("hf") && !allow && client.getBoolean("enable_hf_email_notice")) { 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_hf_email_notice", allow));
} }
if (channel.equals("yeepay") && !allow && client.getBoolean("enable_yeepay_email_notice")) {
clientModifySupport.processClientConfigModify(new SwitchPermissionModify(manager, clientMoniker, "enable_yeepay_email_notice", allow));
}
clientModifySupport.processClientConfigModify(new SwitchPermissionModify(manager, clientMoniker, "enable_" + channel.toLowerCase(), 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 " logger.info(manager.getString("display_name") + "(" + manager.getString("manager_id") + ") switched client " + clientMoniker + " channel "
@ -1591,6 +1626,7 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid
checkAddRate(config, "jd", "jd_rate_value", org, "min_jd_rate"); checkAddRate(config, "jd", "jd_rate_value", org, "min_jd_rate");
checkAddRate(config, "hf", "hf_rate_value", org, "min_hf_rate"); checkAddRate(config, "hf", "hf_rate_value", org, "min_hf_rate");
checkAddRate(config, "Rpay", "Rpay_rate_value", org, "min_Rpay_rate"); checkAddRate(config, "Rpay", "Rpay_rate_value", org, "min_Rpay_rate");
checkAddRate(config, "Yeepay", "yeepay_rate_value", org, "min_yeepay_rate");
configNewClientRate(config, clientId, "Wechat", "wechat_rate_value", org, "min_wechat_rate"); configNewClientRate(config, clientId, "Wechat", "wechat_rate_value", org, "min_wechat_rate");
configNewClientRate(config, clientId, "Alipay", "alipay_rate_value", org, "min_alipay_rate"); configNewClientRate(config, clientId, "Alipay", "alipay_rate_value", org, "min_alipay_rate");
@ -1599,6 +1635,7 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid
configNewClientRate(config, clientId, "jd", "jd_rate_value", org, "min_jd_rate"); configNewClientRate(config, clientId, "jd", "jd_rate_value", org, "min_jd_rate");
configNewClientRate(config, clientId, "hf", "hf_rate_value", org, "min_hf_rate"); configNewClientRate(config, clientId, "hf", "hf_rate_value", org, "min_hf_rate");
configNewClientRate(config, clientId, "Rpay", "Rpay_rate_value", org, "min_Rpay_rate"); configNewClientRate(config, clientId, "Rpay", "Rpay_rate_value", org, "min_Rpay_rate");
configNewClientRate(config, clientId, "Yeepay", "yeepay_rate_value", org, "min_yeepay_rate");
//todo 暂不更新Rpay+ 费率信息 //todo 暂不更新Rpay+ 费率信息
rpayApi.modifySurchargeConfig(client); rpayApi.modifySurchargeConfig(client);
@ -2995,6 +3032,17 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid
clientModifySupport.processClientConfigModify(new PaypadVersionModify(manager, clientMoniker, paypad_version)); clientModifySupport.processClientConfigModify(new PaypadVersionModify(manager, clientMoniker, paypad_version));
} }
@Override
public void changePaymentSuccessPage(JSONObject manager, String clientMoniker, String paysuccess_version) {
JSONObject client = getClientInfoByMoniker(clientMoniker);
if (client == null) {
throw new InvalidShortIdException();
}
checkOrgPermission(manager, client);
client.put("paysuccess_version", paysuccess_version);
clientMapper.update(client);
}
@Override @Override
public void changePaymentPage(JSONObject account, String paypad_version) { public void changePaymentPage(JSONObject account, String paypad_version) {
int clientId = account.getIntValue("client_id"); int clientId = account.getIntValue("client_id");
@ -3572,6 +3620,20 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid
return null; return null;
} }
@Override
public List<JSONObject> listYeepaySubMerchantIdApplys(JSONObject manager, String clientMoniker) {
JSONObject client = getClientInfoByMoniker(clientMoniker);
if (client == null) {
throw new InvalidShortIdException();
}
checkOrgPermission(manager, client);
List<JSONObject> applices = yeePayClientConfigMapper.findAllMerchantConfig(client.getInteger("client_id"));
if (!applices.isEmpty()) {
return applices;
}
return null;
}
@Override @Override
@CacheEvict(value = ":all_sub_merchant_id_applices:", key = "#clientMoniker") @CacheEvict(value = ":all_sub_merchant_id_applices:", key = "#clientMoniker")
public String subMerchantApplication(String clientMoniker, SubMerchantIdApply subMerchantApply, JSONObject manager) { public String subMerchantApplication(String clientMoniker, SubMerchantIdApply subMerchantApply, JSONObject manager) {
@ -3635,6 +3697,39 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid
} }
} }
@Override
@Transactional
public void subYeepayMerchantApplication(String clientMoniker, JSONObject merchantInfo, JSONObject manager) {
JSONObject client = getClientInfoByMoniker(clientMoniker);
if (client == null) {
throw new InvalidShortIdException();
}
checkOrgPermission(manager, client);
List<JSONObject> yeepayClientConfigs = yeePayClientConfigMapper.findAllMerchantConfig(client.getIntValue("client_id"));
if(yeepayClientConfigs!=null){
for(JSONObject yeepayClientConfig:yeepayClientConfigs){
if(yeepayClientConfig.getIntValue("is_valid")==1){
yeePayClientConfigMapper.updateSubMerchantIdValid(yeepayClientConfig.getString("yeepay_config_id"),0);
}
}
}
merchantInfo.put("create_time",new Date());
merchantInfo.put("operator",manager.getString("display_name"));
merchantInfo.put("client_id",client.getIntValue("client_id"));
merchantInfo.put("vouchers",merchantInfo.getJSONObject("vouchers").toJSONString());
yeePayClientConfigMapper.saveMerchantConfig(merchantInfo);
JSONObject yeepayConfig = yeePayClientConfigMapper.findMerchantConfig(client.getIntValue("client_id"));
SubmerchantRegisterResult result = yeePayClient.registerMerchant(client,yeepayConfig);
if(result.getStatus().equals("FAILED")){
throw new BadRequestException(result.getErrorMsg());
}
yeepayConfig.put("sub_merchant_id",result.getSubMerchantId());
yeePayClientConfigMapper.updateSubMerchantId(yeepayConfig.getString("yeepay_config_id"),result.getMerchantId(),result.getSubMerchantId());
client.put("yeepay_sub_merchant_id",result.getSubMerchantId());
clientMapper.update(client);
}
@Override @Override
public List<JSONObject> listMerchantIds(String clientMoniker, JSONObject manager) { public List<JSONObject> listMerchantIds(String clientMoniker, JSONObject manager) {
JSONObject client = getClientInfoByMoniker(clientMoniker); JSONObject client = getClientInfoByMoniker(clientMoniker);
@ -3878,6 +3973,30 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid
} }
@Override
public void switchGatewayLink(JSONObject manager, String clientMoniker,String channel, boolean allow) {
JSONObject client = getClientInfoByMoniker(clientMoniker);
if (client == null) {
throw new InvalidShortIdException();
}
checkOrgPermission(manager, client);
if (allow) {
if (StringUtils.isEmpty(client.getString(channel+"_pay_url"))) {
String channel_pay_url = getGatewayShortLink(clientMoniker,channel.toLowerCase());
client.put(channel+"_pay_url", channel_pay_url);
JSONObject clientConfig = new JSONObject();
clientConfig.put(channel+"_pay_url", channel_pay_url);
clientConfig.put("client_id", client.getIntValue("client_id"));
clientConfigMapper.update(clientConfig);
clientMapper.update(client);
}
}
clientModifySupport.processClientConfigModify(new SwitchPermissionModify(manager, clientMoniker, "enable_"+channel+"_link", allow));
clientModifySupport.processClientConfigModify(new SwitchPermissionModify(manager, clientMoniker, "enable_"+channel, allow));
}
@Override @Override
public void sendHfEmailNotice(JSONObject order) { public void sendHfEmailNotice(JSONObject order) {
JSONObject client = clientMapper.findClient(order.getIntValue("client_id")); JSONObject client = clientMapper.findClient(order.getIntValue("client_id"));
@ -3917,6 +4036,55 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid
}).start(); }).start();
} }
@Override
public void sendGatewayEmailNotice(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_"+order.getString("channel").toLowerCase()+"_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("currency", order.getString("currency"));
ctx.setVariable("channel", getOrderChannel(order.getString("channel")));
String create_time = "";
if (client.getString("timezone") != null) {
create_time = DateFormatUtils.format(order.getDate("create_time"),
"yyyy-MM-dd HH:mm:ss", TimeZone.getTimeZone(client.getString("timezone")));
} else {
create_time = DateFormatUtils.format(order.getDate("create_time"), "yyyy-MM-dd HH:mm:ss");
}
ctx.setVariable("time", create_time);
final String content = thymeleaf.process( "mail/gateway_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();
}
private String getOrderChannel(String channel){
switch(channel){
case "hf":
return "汇付";
case "Yeepay":
return "易宝支付";
}
return "";
}
@Override @Override
public void updateAllPartnerPassword(String clientMoniker, List<String> emails) { public void updateAllPartnerPassword(String clientMoniker, List<String> emails) {
JSONObject client = getClientInfoByMoniker(clientMoniker); JSONObject client = getClientInfoByMoniker(clientMoniker);
@ -3946,6 +4114,13 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid
return api.registerShortUrl(longUrl); return api.registerShortUrl(longUrl);
} }
@Override
public String getGatewayShortLink(String clientMoniker, String channel) {
String longUrl = PlatformEnvironment.getEnv().concatUrl("/api/v1.0/"+channel+"/partners/" + clientMoniker + "/jump/pc");
MpWechatApi api = mpWechatApiProvider.getNewPaymentApi();
return api.registerShortUrl(longUrl);
}
private void isRiskyMerchant(JSONObject client, JSONObject bankAccount) { private void isRiskyMerchant(JSONObject client, JSONObject bankAccount) {
JSONObject needCheckParams = new JSONObject(); JSONObject needCheckParams = new JSONObject();

@ -178,6 +178,11 @@ public class PartnerManageController {
clientManager.updateClientRpayPaymentConfig(manager, clientMoniker, rpaySubMerchantInfo); clientManager.updateClientRpayPaymentConfig(manager, clientMoniker, rpaySubMerchantInfo);
} }
@ManagerMapping(value = "/{clientMoniker}/yeepay_payment_config", method = RequestMethod.PUT, role = {ManagerRole.OPERATOR, ManagerRole.BD_USER})
public void updatePartnerYeepayPaymentConfig(@PathVariable String clientMoniker, @RequestBody JSONObject yeepaySubMerchantInfo, @ModelAttribute(CommonConsts.MANAGER_STATUS) JSONObject manager) {
clientManager.updateClientYeepayPaymentConfig(manager, clientMoniker, yeepaySubMerchantInfo);
}
@ManagerMapping(value = "/{clientMoniker}/ali_sub_merchant_id", method = RequestMethod.PUT, role = {ManagerRole.OPERATOR}) @ManagerMapping(value = "/{clientMoniker}/ali_sub_merchant_id", method = RequestMethod.PUT, role = {ManagerRole.OPERATOR})
public void updateAliSubMerchantId(@PathVariable String clientMoniker, @RequestBody JSONObject aliSubMerchantInfo, @ModelAttribute(CommonConsts.MANAGER_STATUS) JSONObject manager) { public void updateAliSubMerchantId(@PathVariable String clientMoniker, @RequestBody JSONObject aliSubMerchantInfo, @ModelAttribute(CommonConsts.MANAGER_STATUS) JSONObject manager) {
clientManager.updateAliSubMerchantId(manager, clientMoniker, aliSubMerchantInfo); clientManager.updateAliSubMerchantId(manager, clientMoniker, aliSubMerchantInfo);
@ -293,6 +298,11 @@ public class PartnerManageController {
clientManager.changePaymentPage(manager, clientMoniker, pass.getString("paypad_version")); clientManager.changePaymentPage(manager, clientMoniker, pass.getString("paypad_version"));
} }
@ManagerMapping(value = "/{clientMoniker}/paysuccess_version", method = RequestMethod.PUT, role = {ManagerRole.OPERATOR, ManagerRole.BD_USER})
public void changePaymentSuccessPage(@PathVariable String clientMoniker, @RequestBody JSONObject pass, @ModelAttribute(CommonConsts.MANAGER_STATUS) JSONObject manager) {
clientManager.changePaymentSuccessPage(manager, clientMoniker, pass.getString("paysuccess_version"));
}
@ManagerMapping(value = "/{clientMoniker}/trade_logs", method = RequestMethod.GET, role = {ManagerRole.ADMIN, ManagerRole.BD_USER, ManagerRole.OPERATOR, ManagerRole.SERVANT, ManagerRole.DIRECTOR, ManagerRole.FINANCIAL_STAFF}) @ManagerMapping(value = "/{clientMoniker}/trade_logs", method = RequestMethod.GET, role = {ManagerRole.ADMIN, ManagerRole.BD_USER, ManagerRole.OPERATOR, ManagerRole.SERVANT, ManagerRole.DIRECTOR, ManagerRole.FINANCIAL_STAFF})
public JSONObject listPartnerTradeLogs(@PathVariable String clientMoniker, TradeLogQuery query, @ModelAttribute(CommonConsts.MANAGER_STATUS) JSONObject manager) throws Exception { public JSONObject listPartnerTradeLogs(@PathVariable String clientMoniker, TradeLogQuery query, @ModelAttribute(CommonConsts.MANAGER_STATUS) JSONObject manager) throws Exception {
return tradeLogService.listPartnerTradeLogs(manager, null, clientMoniker, query, null); return tradeLogService.listPartnerTradeLogs(manager, null, clientMoniker, query, null);
@ -546,6 +556,11 @@ public class PartnerManageController {
return clientManager.listRpaySubMerchantIdApplys(manager, clientMoniker); return clientManager.listRpaySubMerchantIdApplys(manager, clientMoniker);
} }
@ManagerMapping(value = "/{clientMoniker}/list_yeepay_sub_applices", method = RequestMethod.GET, role = {ManagerRole.OPERATOR, ManagerRole.ADMIN})
public List<JSONObject> listYeepaySubMerchantIdApplys(@PathVariable String clientMoniker, @ModelAttribute(CommonConsts.MANAGER_STATUS) JSONObject manager) {
return clientManager.listYeepaySubMerchantIdApplys(manager, clientMoniker);
}
@ManagerMapping(value = "/{clientMoniker}/sub_apply", method = RequestMethod.POST, role = {ManagerRole.OPERATOR, ManagerRole.ADMIN}) @ManagerMapping(value = "/{clientMoniker}/sub_apply", method = RequestMethod.POST, role = {ManagerRole.OPERATOR, ManagerRole.ADMIN})
public String subMerchantApplication(@PathVariable String clientMoniker, @RequestBody SubMerchantIdApply subMerchantIdApply, @ModelAttribute(CommonConsts.MANAGER_STATUS) JSONObject manager) { public String subMerchantApplication(@PathVariable String clientMoniker, @RequestBody SubMerchantIdApply subMerchantIdApply, @ModelAttribute(CommonConsts.MANAGER_STATUS) JSONObject manager) {
return clientManager.subMerchantApplication(clientMoniker,subMerchantIdApply,manager); return clientManager.subMerchantApplication(clientMoniker,subMerchantIdApply,manager);
@ -580,11 +595,26 @@ public class PartnerManageController {
clientManager.switchPermission(manager, clientMoniker, "enable_hf_email_notice", pass.getBooleanValue("allow")); clientManager.switchPermission(manager, clientMoniker, "enable_hf_email_notice", pass.getBooleanValue("allow"));
} }
@ManagerMapping(value = "/{clientMoniker}/{channel}", method = RequestMethod.PUT, role = {ManagerRole.ADMIN, ManagerRole.OPERATOR})
public void switchGateWayLinkPermission(@PathVariable String clientMoniker, @PathVariable String channel,@RequestBody JSONObject pass, @ModelAttribute(CommonConsts.MANAGER_STATUS) JSONObject manager) {
clientManager.switchGatewayLink(manager, clientMoniker, channel,pass.getBooleanValue("allow"));
}
@ManagerMapping(value = "/{clientMoniker}/{channel}/email_notice", method = RequestMethod.PUT, role = {ManagerRole.OPERATOR, ManagerRole.BD_USER})
public void switchGatewayEmailNotice(@PathVariable String clientMoniker, @PathVariable String channel,@RequestBody JSONObject pass, @ModelAttribute(CommonConsts.MANAGER_STATUS) JSONObject manager) {
clientManager.switchPermission(manager, clientMoniker,"enable_"+channel+"_email_notice", pass.getBooleanValue("allow"));
}
@ManagerMapping(value = "/{clientMoniker}/registRpaySubMerchantId", method = RequestMethod.POST, role = {ManagerRole.OPERATOR, ManagerRole.ADMIN}) @ManagerMapping(value = "/{clientMoniker}/registRpaySubMerchantId", method = RequestMethod.POST, role = {ManagerRole.OPERATOR, ManagerRole.ADMIN})
public void subRpayMerchantApplication(@PathVariable String clientMoniker,@RequestBody JSONObject merchantInfo,@ModelAttribute(CommonConsts.MANAGER_STATUS) JSONObject manager) { public void subRpayMerchantApplication(@PathVariable String clientMoniker,@RequestBody JSONObject merchantInfo,@ModelAttribute(CommonConsts.MANAGER_STATUS) JSONObject manager) {
clientManager.subRpayMerchantApplication(clientMoniker, merchantInfo,manager); clientManager.subRpayMerchantApplication(clientMoniker, merchantInfo,manager);
} }
@ManagerMapping(value = "/{clientMoniker}/registYeepaySubMerchantId", method = RequestMethod.POST, role = {ManagerRole.OPERATOR, ManagerRole.ADMIN})
public void subYeepayMerchantApplication(@PathVariable String clientMoniker,@RequestBody JSONObject merchantInfo,@ModelAttribute(CommonConsts.MANAGER_STATUS) JSONObject manager) {
clientManager.subYeepayMerchantApplication(clientMoniker, merchantInfo,manager);
}
@RequestMapping(value = "/compliance", method = RequestMethod.GET) @RequestMapping(value = "/compliance", method = RequestMethod.GET)
@RequireManager(role = { ManagerRole.OPERATOR}) @RequireManager(role = { ManagerRole.OPERATOR})
public JSONObject lisPartnersByCompliance(@ModelAttribute(CommonConsts.MANAGER_STATUS) JSONObject manager, PartnerQuery query) { public JSONObject lisPartnersByCompliance(@ModelAttribute(CommonConsts.MANAGER_STATUS) JSONObject manager, PartnerQuery query) {

@ -127,7 +127,7 @@ public class MailServiceImp implements MailService {
noticeBean.setFiles(files.toString()); noticeBean.setFiles(files.toString());
} }
noticeBean.setSenderAddress("info@royalpay.com.au"); noticeBean.setSenderAddress("info@royalpay.com.au");
noticeBean.setPassword("Vaba6439"); noticeBean.setPassword("Rpay2018");
String postUrl = mailHost + "/mail?" + generateMailSignParam(); String postUrl = mailHost + "/mail?" + generateMailSignParam();
@ -162,7 +162,7 @@ public class MailServiceImp implements MailService {
noticeBean.setMailClients(mailClients); noticeBean.setMailClients(mailClients);
noticeBean.setContent(content); noticeBean.setContent(content);
noticeBean.setSenderAddress("info@royalpay.com.au"); noticeBean.setSenderAddress("info@royalpay.com.au");
noticeBean.setPassword("Vaba6439"); noticeBean.setPassword("Rpay2018");
String postUrl = mailHost + "/mail/single?" + generateMailSignParam(); String postUrl = mailHost + "/mail/single?" + generateMailSignParam();
HttpRequestResult result = null; HttpRequestResult result = null;
try { try {

@ -29,6 +29,7 @@ public class OrgInfo {
private Double alipayonline_rate_value; private Double alipayonline_rate_value;
private Double jd_rate_value; private Double jd_rate_value;
private Double hf_rate_value; private Double hf_rate_value;
private Double yeepay_rate_value;
private int is_valid; private int is_valid;
private String search_text; private String search_text;
private int page = 1; private int page = 1;
@ -42,6 +43,7 @@ public class OrgInfo {
private Double min_jd_rate; private Double min_jd_rate;
private Double min_alipayonline_rate; private Double min_alipayonline_rate;
private Double min_hf_rate; private Double min_hf_rate;
private Double min_yeepay_rate;
private String state; private String state;
private String senior_parent_org_id; private String senior_parent_org_id;
@ -323,4 +325,20 @@ public class OrgInfo {
public void setSenior_parent_org_id(String senior_parent_org_id) { public void setSenior_parent_org_id(String senior_parent_org_id) {
this.senior_parent_org_id = senior_parent_org_id; this.senior_parent_org_id = senior_parent_org_id;
} }
public Double getYeepay_rate_value() {
return yeepay_rate_value;
}
public void setYeepay_rate_value(Double yeepay_rate_value) {
this.yeepay_rate_value = yeepay_rate_value;
}
public Double getMin_yeepay_rate() {
return min_yeepay_rate;
}
public void setMin_yeepay_rate(Double min_yeepay_rate) {
this.min_yeepay_rate = min_yeepay_rate;
}
} }

@ -233,7 +233,7 @@ public class OrgManagerImpl implements OrgManager {
JSONArray rate1 = new JSONArray(); JSONArray rate1 = new JSONArray();
JSONArray rate2 = new JSONArray(); JSONArray rate2 = new JSONArray();
if(orgObject.getString("commission_type").equals(json.getString("commission_type"))){ if(orgObject.getString("commission_type").equals(json.getString("commission_type"))){
String[] rates = new String[]{"alipay_rate_value","wechat_rate_value","bestpay_rate_value","alipayonline_rate_value","jd_rate_value"}; String[] rates = new String[]{"alipay_rate_value","wechat_rate_value","bestpay_rate_value","alipayonline_rate_value","jd_rate_value","yeepay_rate_value"};
for (String rateName: rates ){ for (String rateName: rates ){
if(StringUtils.isEmpty(orgObject.getString(rateName))){ if(StringUtils.isEmpty(orgObject.getString(rateName))){
rate1.add(rateName); rate1.add(rateName);

@ -0,0 +1,46 @@
package au.com.royalpay.payment.manage.risk.bean;
import com.alibaba.fastjson.JSONObject;
import org.apache.commons.lang3.StringUtils;
public class QueryBlackListCustomer {
private String openid;
private int page = 1;
private int limit = 10;
public JSONObject toParams() {
JSONObject params = new JSONObject();
if(StringUtils.isNotEmpty(openid)){
params.put("openid", this.openid);
}
params.put("is_valid", 1);
return params;
}
public String getOpenid() {
return openid;
}
public void setOpenid(String openid) {
this.openid = openid;
}
public int getPage() {
return page;
}
public void setPage(int page) {
this.page = page;
}
public int getLimit() {
return limit;
}
public void setLimit(int limit) {
this.limit = limit;
}
}

@ -33,4 +33,12 @@ public interface RiskMerchantService {
void addAttentionMerchant(JSONObject manager, String clientMoniker, JSONObject params); void addAttentionMerchant(JSONObject manager, String clientMoniker, JSONObject params);
void disableAttentionMerchant(JSONObject manager, String clientMoniker); void disableAttentionMerchant(JSONObject manager, String clientMoniker);
JSONObject customerBlackList(JSONObject manager, QueryBlackListCustomer queryBlackListCustomer);
void disableBlackListCustomer(JSONObject manager, String openid);
void updateAttentionMerchant(JSONObject manager, String clientMoniker, JSONObject attention);
void addBlackListCustomer(JSONObject manager, String openid, String remark);
} }

@ -2,6 +2,8 @@ package au.com.royalpay.payment.manage.risk.core.impl;
import au.com.royalpay.payment.manage.mappers.risk.*; import au.com.royalpay.payment.manage.mappers.risk.*;
import au.com.royalpay.payment.manage.mappers.system.ClientBankAccountMapper; import au.com.royalpay.payment.manage.mappers.system.ClientBankAccountMapper;
import au.com.royalpay.payment.manage.mappers.system.CustomerMapper;
import au.com.royalpay.payment.manage.mappers.system.ManagerCustomerRelationAlipayMapper;
import au.com.royalpay.payment.manage.merchants.core.ClientManager; import au.com.royalpay.payment.manage.merchants.core.ClientManager;
import au.com.royalpay.payment.manage.risk.bean.*; import au.com.royalpay.payment.manage.risk.bean.*;
import au.com.royalpay.payment.manage.risk.core.RiskMerchantService; import au.com.royalpay.payment.manage.risk.core.RiskMerchantService;
@ -13,6 +15,7 @@ import com.alibaba.fastjson.JSONObject;
import com.github.miemiedev.mybatis.paginator.domain.Order; import com.github.miemiedev.mybatis.paginator.domain.Order;
import com.github.miemiedev.mybatis.paginator.domain.PageBounds; import com.github.miemiedev.mybatis.paginator.domain.PageBounds;
import com.github.miemiedev.mybatis.paginator.domain.PageList;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
@ -39,6 +42,12 @@ public class RiskMerchantServiceImpl implements RiskMerchantService {
private RiskAttentionMerchantsMapper riskAttentionMerchantsAMapper; private RiskAttentionMerchantsMapper riskAttentionMerchantsAMapper;
@Resource @Resource
private ClientBankAccountMapper clientBankAccountMapper; private ClientBankAccountMapper clientBankAccountMapper;
@Resource
private RiskCustomerBlackListMapper riskCustomerBlackListMapper;
@Resource
private CustomerMapper customerMapper;
@Resource
private ManagerCustomerRelationAlipayMapper managerCustomerRelationAlipayMapper;
@Override @Override
@Transactional @Transactional
@ -243,6 +252,11 @@ public class RiskMerchantServiceImpl implements RiskMerchantService {
attention.put("contact_phone", client.getString("contact_phone")); attention.put("contact_phone", client.getString("contact_phone"));
attention.put("bank_account_no", bankAccount == null || bankAccount.size() <= 0 ? "" : bankAccount.get(0).getString("account_no")); attention.put("bank_account_no", bankAccount == null || bankAccount.size() <= 0 ? "" : bankAccount.get(0).getString("account_no"));
attention.put("is_valid", 1); attention.put("is_valid", 1);
attention.put("enjoin_wechat", params.getBoolean("enjoin_wechat")== null ? true : params.getBoolean("enjoin_wechat"));
attention.put("enjoin_alipay", params.getBoolean("enjoin_alipay")== null ? true : params.getBoolean("enjoin_alipay"));
attention.put("enjoin_bestpay", params.getBoolean("enjoin_bestpay")== null ? true : params.getBoolean("enjoin_bestpay"));
attention.put("enjoin_jd", params.getBoolean("enjoin_jd")== null ? true : params.getBoolean("enjoin_jd"));
attention.put("enjoin_hf", params.getBoolean("enjoin_hf")== null ? true : params.getBoolean("enjoin_hf"));
attention.put("creation_date", params.getDate("creation_date")==null ? new Date() : params.getDate("creation_date")); attention.put("creation_date", params.getDate("creation_date")==null ? new Date() : params.getDate("creation_date"));
attention.put("creation_by", manager.getString("manager_id")); attention.put("creation_by", manager.getString("manager_id"));
attention.put("remark", params.getString("remark")); attention.put("remark", params.getString("remark"));
@ -276,4 +290,82 @@ public class RiskMerchantServiceImpl implements RiskMerchantService {
attentionMerchant.put("last_update_by", manager.getString("manager_id")); attentionMerchant.put("last_update_by", manager.getString("manager_id"));
riskAttentionMerchantsAMapper.update(attentionMerchant); riskAttentionMerchantsAMapper.update(attentionMerchant);
} }
@Override
public JSONObject customerBlackList(JSONObject manager, QueryBlackListCustomer queryBlackListCustomer) {
JSONObject params = queryBlackListCustomer.toParams();
if (manager == null) {
throw new BadRequestException("登录状态已过期,请清新登录再试");
}
PageList<JSONObject> customerList = riskCustomerBlackListMapper.query(params, new PageBounds(queryBlackListCustomer.getPage(), queryBlackListCustomer.getLimit()));
JSONObject customer = new JSONObject();
JSONObject customerAlipay = new JSONObject();
for(JSONObject cus : customerList ){
if (cus.getString("openid").startsWith("olH")) {
customer = customerMapper.findCustomerGlobalpayByOpenId(cus.getString("openid"));
} else {
customer = customerMapper.findCustomerByOpenId(cus.getString("openid"));
}
if (customer != null && !customer.isEmpty()) {
cus.put("headimg", customer.getString("headimg"));
cus.put("nickname", customer.getString("nickname"));
continue;
}
customerAlipay = managerCustomerRelationAlipayMapper.findCustomerByUserId(cus.getString("openid"));
if (customerAlipay != null) {
cus.put("headimg", customerAlipay.getString("headimg"));
cus.put("nickname", customerAlipay.getString("nickname"));
}
}
return PageListUtils.buildPageListResult(customerList);
}
@Override
public void disableBlackListCustomer(JSONObject manager, String openid) {
if (manager == null) {
throw new BadRequestException("登录状态已过期,请清新登录再试");
}
JSONObject customerBlackList = riskCustomerBlackListMapper.findByOpenid(openid);
if (customerBlackList == null) {
throw new BadRequestException("The customer does not exist");
}
customerBlackList.put("is_valid", 0);
customerBlackList.put("last_update_date", new Date());
customerBlackList.put("last_update_by", manager.getString("manager_id"));
riskCustomerBlackListMapper.update(customerBlackList);
}
@Override
public void updateAttentionMerchant(JSONObject manager, String clientMoniker, JSONObject attention) {
if (manager == null) {
throw new BadRequestException("登录状态已过期,请清新登录再试");
}
JSONObject attentionMerchant = riskAttentionMerchantsAMapper.findByClientMoniker(clientMoniker);
if (attentionMerchant == null) {
throw new BadRequestException("The client does not exist");
}
attentionMerchant.put("enjoin_wechat", attention.getBoolean("enjoin_wechat"));
attentionMerchant.put("enjoin_alipay", attention.getBoolean("enjoin_alipay"));
attentionMerchant.put("enjoin_bestpay", attention.getBoolean("enjoin_bestpay"));
attentionMerchant.put("enjoin_jd", attention.getBoolean("enjoin_jd"));
attentionMerchant.put("enjoin_hf", attention.getBoolean("enjoin_hf"));
attentionMerchant.put("last_update_date", new Date());
attentionMerchant.put("last_update_by", manager.getString("manager_id"));
riskAttentionMerchantsAMapper.update(attentionMerchant);
}
@Override
public void addBlackListCustomer(JSONObject manager, String openid, String remark) {
if (manager == null) {
throw new BadRequestException("登录状态已过期,请清新登录再试");
}
JSONObject customer = new JSONObject();
customer.put("openid", openid);
customer.put("remark", remark);
customer.put("creation_date", new Date());
customer.put("creation_by", manager.getString("manager_id"));
customer.put("last_update_date", new Date());
customer.put("last_update_by", manager.getString("manager_id"));
riskCustomerBlackListMapper.save(customer);
}
} }

@ -8,12 +8,7 @@ import au.com.royalpay.payment.tools.permission.enums.ManagerRole;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.*;
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 javax.annotation.Resource; import javax.annotation.Resource;
@ -104,4 +99,24 @@ public class RiskController {
public void disableRiskMerchant(@ModelAttribute(CommonConsts.MANAGER_STATUS) JSONObject manager, @PathVariable String clientMoniker) { public void disableRiskMerchant(@ModelAttribute(CommonConsts.MANAGER_STATUS) JSONObject manager, @PathVariable String clientMoniker) {
riskMerchantService.disableAttentionMerchant(manager, clientMoniker); riskMerchantService.disableAttentionMerchant(manager, clientMoniker);
} }
@ManagerMapping(value = "/customer/blacklist", role = ManagerRole.RISK_MANAGER, method = RequestMethod.GET)
public JSONObject blackListCustomer(@ModelAttribute(CommonConsts.MANAGER_STATUS) JSONObject manager, QueryBlackListCustomer queryBlackListCustomer) {
return riskMerchantService.customerBlackList(manager, queryBlackListCustomer);
}
@ManagerMapping(value = "/customer/blacklist/{openid}", role = ManagerRole.RISK_MANAGER, method = RequestMethod.PUT)
public void disableRiskCustomer(@ModelAttribute(CommonConsts.MANAGER_STATUS) JSONObject manager, @PathVariable String openid) {
riskMerchantService.disableBlackListCustomer(manager, openid);
}
@ManagerMapping(value = "/attention/{clientMoniker}/detail", role = ManagerRole.RISK_MANAGER, method = RequestMethod.PUT)
public void updateRiskMerchant(@ModelAttribute(CommonConsts.MANAGER_STATUS) JSONObject manager, @PathVariable String clientMoniker, @RequestBody JSONObject attention) {
riskMerchantService.updateAttentionMerchant(manager, clientMoniker, attention);
}
@ManagerMapping(value = "/customer/{openid}/blacklist", role = ManagerRole.RISK_MANAGER, method = RequestMethod.POST)
public void saveRiskCustomer(@ModelAttribute(CommonConsts.MANAGER_STATUS) JSONObject manager, @PathVariable String openid, @RequestBody JSONObject remark) {
riskMerchantService.addBlackListCustomer(manager, openid, remark.getString("remark"));
}
} }

@ -38,9 +38,17 @@ public class RiskEventQuery {
// 收到调单邮件日期 // 收到调单邮件日期
private String receiveEmailDate; private String receiveEmailDate;
private String receiveEmailDateBegin;
private String receiveEmailDateEnd;
// 邮件回复截止日期 // 邮件回复截止日期
private String replyEmailDate; private String replyEmailDate;
private String replyEmailDateBegin;
private String replyEmailDateEnd;
private Integer page = 1; private Integer page = 1;
// 金额区间 // 金额区间
@ -135,6 +143,38 @@ public class RiskEventQuery {
this.replyEmailDate = replyEmailDate; this.replyEmailDate = replyEmailDate;
} }
public String getReceiveEmailDateBegin() {
return receiveEmailDateBegin;
}
public void setReceiveEmailDateBegin(String receiveEmailDateBegin) {
this.receiveEmailDateBegin = receiveEmailDateBegin;
}
public String getReceiveEmailDateEnd() {
return receiveEmailDateEnd;
}
public void setReceiveEmailDateEnd(String receiveEmailDateEnd) {
this.receiveEmailDateEnd = receiveEmailDateEnd;
}
public String getReplyEmailDateBegin() {
return replyEmailDateBegin;
}
public void setReplyEmailDateBegin(String replyEmailDateBegin) {
this.replyEmailDateBegin = replyEmailDateBegin;
}
public String getReplyEmailDateEnd() {
return replyEmailDateEnd;
}
public void setReplyEmailDateEnd(String replyEmailDateEnd) {
this.replyEmailDateEnd = replyEmailDateEnd;
}
public Integer getPage() { public Integer getPage() {
return page; return page;
} }
@ -184,6 +224,22 @@ public class RiskEventQuery {
params.put("reply_email_date", replyEmailDate); params.put("reply_email_date", replyEmailDate);
} }
if (receiveEmailDateBegin != null) {
params.put("receive_email_date_begin", receiveEmailDateBegin);
}
if (receiveEmailDateEnd != null) {
params.put("receive_email_date_end", receiveEmailDateEnd);
}
if (replyEmailDateBegin != null) {
params.put("reply_email_date_begin", replyEmailDateBegin);
}
if (replyEmailDateEnd != null) {
params.put("reply_email_date_end", replyEmailDateEnd);
}
if (page != null && page > 0) { if (page != null && page > 0) {
params.put("page", page); params.put("page", page);
} }

@ -27,6 +27,20 @@ public interface RiskBusinessService {
*/ */
JSONObject getRiskEventsByPage(JSONObject params, JSONObject manager); JSONObject getRiskEventsByPage(JSONObject params, JSONObject manager);
/**
*
* @param params
* @return
*/
List<JSONObject> analysisByIndustry(JSONObject params, JSONObject manager);
/**
*
* @param params
* @return
*/
List<JSONObject> analysisByAmount(JSONObject params, JSONObject manager);
/** /**
* *
* @param riskId * @param riskId
@ -68,8 +82,10 @@ public interface RiskBusinessService {
/** /**
* *
* @param riskId * @param riskId
* @param refuseDescription
* @throws IOException
*/ */
void sendRefuseEmail(String riskId) throws IOException; void sendRefuseEmail(String riskId, String refuseDescription) throws IOException;
/** /**
* *
@ -84,4 +100,35 @@ public interface RiskBusinessService {
* @return * @return
*/ */
JSONObject getRiskMaterial(JSONObject param); JSONObject getRiskMaterial(JSONObject param);
/**
* real_order_ids
*/
void completeEventRealOrderIds();
/**
*
* @param riskId
*/
void deleteRiskEvent(String riskId);
/**
*
* @param clientId
* @return
*/
JSONObject getNoticeInfo(int clientId);
/**
*
* @param riskId
* @return
*/
JSONObject getRiskEventMaterialsRemark(String riskId);
JSONObject riskEventMaterialPass(JSONObject params, JSONObject manager);
JSONObject updateIsSendClient(String riskId);
void completeOrderAmount();
} }

@ -0,0 +1,17 @@
package au.com.royalpay.payment.manage.riskbusiness.core;
/**
* @Description:
* @Author: lujian
* @Date: 2018/11/19 19:40
*/
public interface RiskMaterialService {
/**
*
* @param riskId
* @param description
*/
void updateRiskMaterial(String riskId, String description);
}

@ -0,0 +1,28 @@
package au.com.royalpay.payment.manage.riskbusiness.core;
import com.alibaba.fastjson.JSONObject;
import com.github.miemiedev.mybatis.paginator.domain.PageBounds;
import com.github.miemiedev.mybatis.paginator.domain.PageList;
/**
* @Description:
* @Author: lujian
* @Date: 2018/11/22 15:40
*/
public interface RiskProcessLogService {
/**
*
* @param riskId
* @return
*/
PageList<JSONObject> getRiskProcessLogs(String riskId);
/**
*
* @param log
*/
void addRiskProcessLog(JSONObject log);
void addRiskProcessLog(String riskId, String operatorId, String operator, String remark, int resultTypeFrom, int resultTypeTo);
}

@ -6,15 +6,21 @@ import au.com.royalpay.payment.core.exceptions.OrderNotExistsException;
import au.com.royalpay.payment.core.exceptions.OrderNotMatchException; import au.com.royalpay.payment.core.exceptions.OrderNotMatchException;
import au.com.royalpay.payment.manage.mappers.log.AppMessageLogMapper; import au.com.royalpay.payment.manage.mappers.log.AppMessageLogMapper;
import au.com.royalpay.payment.manage.mappers.payment.OrderMapper; import au.com.royalpay.payment.manage.mappers.payment.OrderMapper;
import au.com.royalpay.payment.manage.mappers.payment.TransactionMapper;
import au.com.royalpay.payment.manage.mappers.riskbusiness.RiskEventMapper; import au.com.royalpay.payment.manage.mappers.riskbusiness.RiskEventMapper;
import au.com.royalpay.payment.manage.mappers.riskbusiness.RiskFileMapper; import au.com.royalpay.payment.manage.mappers.riskbusiness.RiskFileMapper;
import au.com.royalpay.payment.manage.mappers.riskbusiness.RiskMaterialMapper; import au.com.royalpay.payment.manage.mappers.riskbusiness.RiskMaterialMapper;
import au.com.royalpay.payment.manage.mappers.riskbusiness.RiskOrdersMapper;
import au.com.royalpay.payment.manage.mappers.system.ClientDeviceTokenMapper; import au.com.royalpay.payment.manage.mappers.system.ClientDeviceTokenMapper;
import au.com.royalpay.payment.manage.mappers.system.ClientMapper; import au.com.royalpay.payment.manage.mappers.system.ClientMapper;
import au.com.royalpay.payment.manage.mappers.system.ClientBDMapper; import au.com.royalpay.payment.manage.mappers.system.ClientBDMapper;
import au.com.royalpay.payment.manage.notice.core.MailService; import au.com.royalpay.payment.manage.notice.core.MailService;
import au.com.royalpay.payment.manage.pushMessage.APNSMessageHelper;
import au.com.royalpay.payment.manage.pushMessage.bean.AppManagerMessageBuilder; import au.com.royalpay.payment.manage.pushMessage.bean.AppManagerMessageBuilder;
import au.com.royalpay.payment.manage.riskbusiness.core.RiskBusinessService; import au.com.royalpay.payment.manage.riskbusiness.core.RiskBusinessService;
import au.com.royalpay.payment.manage.riskbusiness.core.RiskMaterialService;
import au.com.royalpay.payment.manage.riskbusiness.core.RiskProcessLogService;
import au.com.royalpay.payment.manage.riskbusiness.enums.RiskEmailStatusEnum;
import au.com.royalpay.payment.manage.riskbusiness.enums.RiskResultTypeEnum; import au.com.royalpay.payment.manage.riskbusiness.enums.RiskResultTypeEnum;
import au.com.royalpay.payment.manage.signin.beans.TodoNotice; import au.com.royalpay.payment.manage.signin.beans.TodoNotice;
import au.com.royalpay.payment.manage.signin.core.ManagerTodoNoticeProvider; import au.com.royalpay.payment.manage.signin.core.ManagerTodoNoticeProvider;
@ -29,6 +35,7 @@ import au.com.royalpay.payment.tools.permission.enums.ManagerRole;
import au.com.royalpay.payment.tools.exceptions.ServerErrorException; import au.com.royalpay.payment.tools.exceptions.ServerErrorException;
import au.com.royalpay.payment.tools.threadpool.RoyalThreadPoolExecutor; import au.com.royalpay.payment.tools.threadpool.RoyalThreadPoolExecutor;
import au.com.royalpay.payment.tools.utils.PageListUtils; import au.com.royalpay.payment.tools.utils.PageListUtils;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import com.github.miemiedev.mybatis.paginator.domain.Order; import com.github.miemiedev.mybatis.paginator.domain.Order;
import com.github.miemiedev.mybatis.paginator.domain.PageBounds; import com.github.miemiedev.mybatis.paginator.domain.PageBounds;
@ -42,15 +49,16 @@ import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook; import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.thymeleaf.context.Context; import org.thymeleaf.context.Context;
import org.thymeleaf.spring4.SpringTemplateEngine; import org.thymeleaf.spring4.SpringTemplateEngine;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import java.io.*; import java.io.*;
import java.net.URL; import java.net.URL;
import java.text.ParseException;
import java.util.*; import java.util.*;
import javax.annotation.Resource; import javax.annotation.Resource;
import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.LinkedBlockingQueue;
@ -77,6 +85,8 @@ public class RiskBusinessServiceImpl implements RiskBusinessService, ManagerTodo
@Resource @Resource
private OrderMapper orderMapper; private OrderMapper orderMapper;
@Resource @Resource
private TransactionMapper transactionMapper;
@Resource
private StringRedisTemplate stringRedisTemplate; private StringRedisTemplate stringRedisTemplate;
@Resource @Resource
private SpringTemplateEngine thymeleaf; private SpringTemplateEngine thymeleaf;
@ -88,17 +98,32 @@ public class RiskBusinessServiceImpl implements RiskBusinessService, ManagerTodo
private RoyalThreadPoolExecutor royalThreadPoolExecutor; private RoyalThreadPoolExecutor royalThreadPoolExecutor;
private final String UPLOAD_MAIL_PREFIX = "UPLOAD_MAIL"; private final String UPLOAD_MAIL_PREFIX = "UPLOAD_MAIL";
@Resource
private RiskProcessLogService riskProcessLogService;
@Resource @Resource
private RiskMaterialMapper riskMaterialMapper; private RiskMaterialMapper riskMaterialMapper;
@Resource @Resource
private RiskMaterialService riskMaterialService;
@Resource
private RiskFileMapper riskFileMapper; private RiskFileMapper riskFileMapper;
@Resource @Resource
private RiskOrdersMapper riskOrdersMapper;
@Resource
private ClientDeviceTokenMapper clientDeviceTokenMapper; private ClientDeviceTokenMapper clientDeviceTokenMapper;
@Resource @Resource
private AppMessageLogMapper appMessageLogMapper; private AppMessageLogMapper appMessageLogMapper;
private Map<String, AppMsgSender> senderMap = new HashMap<>(); private Map<String, AppMsgSender> senderMap = new HashMap<>();
@Resource
private APNSMessageHelper apnsMessageHelper;
@Resource
public void setAppMsgSenders(AppMsgSender[] senders) {
Arrays.stream(senders).forEach(appMsgSender -> senderMap.put(appMsgSender.devType(), appMsgSender));
}
private ThreadPoolExecutor sendingAppleMsgPool = new ThreadPoolExecutor(10, 30, 5, TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>()); private ThreadPoolExecutor sendingAppleMsgPool = new ThreadPoolExecutor(10, 30, 5, TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>());
@Override @Override
@ -110,7 +135,7 @@ public class RiskBusinessServiceImpl implements RiskBusinessService, ManagerTodo
public JSONObject getRiskEventsByPage(JSONObject params, JSONObject manager) { public JSONObject getRiskEventsByPage(JSONObject params, JSONObject manager) {
// 如果登录的角色是BD添加查询条件result_type为1,2,3,4order_type为1或者2 // 如果登录的角色是BD添加查询条件result_type为1,2,3,4order_type为1或者2
if (ManagerRole.BD_USER.hasRole(manager.getIntValue("role"))) { if (manager != null && ManagerRole.BD_USER.hasRole(manager.getIntValue("role"))) {
params.put("bd_id", manager.getString("manager_id")); params.put("bd_id", manager.getString("manager_id"));
List<Integer> orderTypes = Arrays.asList(RiskOrderTypeEnum.WECHAT_ORDER.getOrderType(), List<Integer> orderTypes = Arrays.asList(RiskOrderTypeEnum.WECHAT_ORDER.getOrderType(),
RiskOrderTypeEnum.ALIPAY_ORDER.getOrderType()); RiskOrderTypeEnum.ALIPAY_ORDER.getOrderType());
@ -124,9 +149,82 @@ public class RiskBusinessServiceImpl implements RiskBusinessService, ManagerTodo
} }
PageList<JSONObject> riskEvents = riskEventMapper.listRisksByPage(params, new PageBounds(params.getInteger("page"), 10, Order.formString("create_time.desc"))); PageList<JSONObject> riskEvents = riskEventMapper.listRisksByPage(params, new PageBounds(params.getInteger("page"), 10, Order.formString("create_time.desc")));
/**
*
* royalpay
*
*/
Date currentDate = new Date(), replyDate;
Integer resultType, orderType;
boolean isPassTimeout = false;
for (JSONObject riskEvent : riskEvents) {
try {
replyDate = DateUtils.parseDate(riskEvent.getString("reply_email_date"), "yyyy-MM-dd");
} catch (ParseException e) {
replyDate = currentDate;
e.printStackTrace();
}
resultType = riskEvent.getInteger("result_type");
orderType = riskEvent.getInteger("order_type");
isPassTimeout = (currentDate.after(replyDate)) &&
(!resultType.equals(RiskResultTypeEnum.MATERIAL_AUDIT_PASS.getResultType())) &&
(!resultType.equals(RiskResultTypeEnum.ALREADY_HANDLED.getResultType())) &&
(!orderType.equals(RiskOrderTypeEnum.WARNING_ORDER.getOrderType())) &&
(!orderType.equals(RiskOrderTypeEnum.GENERAL_ORDER.getOrderType()));
riskEvent.put("pass_timeout", isPassTimeout);
// 材料拒绝说明
List<JSONObject> materialList = riskMaterialMapper.findAllMaterials(riskEvent.getString("risk_id"));
if (!materialList.isEmpty()) {
riskEvent.put("refuse_description", materialList.get(0).getString("refuse_description"));
}
}
return PageListUtils.buildPageListResult(riskEvents); return PageListUtils.buildPageListResult(riskEvents);
} }
@Override
public List<JSONObject> analysisByIndustry(JSONObject params, JSONObject manager) {
List<JSONObject> industryAnalysis = riskEventMapper.analysisByIndustry(params);
for(JSONObject industry:industryAnalysis){
if(StringUtils.isBlank(industry.getString("industry"))){
industry.put("industry","未知行业");
}
}
return industryAnalysis;
}
private List<String> industryArray(){
List<String> industryArray = new ArrayList<>();
industryArray.add("鞋包服饰");
industryArray.add("机票行业");
industryArray.add("软件服务");
industryArray.add("旅游票务");
industryArray.add("国际租车");
industryArray.add("医疗服务(出国)");
industryArray.add("医疗服务(不出国)");
industryArray.add("留学教育(网络教育)");
industryArray.add("留学教育(一年及以下)");
industryArray.add("其它货物贸易行业");
industryArray.add("文具/办公用品");
industryArray.add("综合商城");
industryArray.add("酒店行业");
industryArray.add("教育行业");
industryArray.add("国际物流");
industryArray.add("数码电器");
industryArray.add("母婴");
industryArray.add("化妆品");
industryArray.add("食品");
industryArray.add("留学教育(一年以上)");
industryArray.add("其它服务行业");
industryArray.add("未知行业");
return industryArray;
}
@Override
public List<JSONObject> analysisByAmount(JSONObject params, JSONObject manager) {
return riskEventMapper.analysisByAmount(params);
}
@Override @Override
public JSONObject getRiskEventDetail(String riskId) { public JSONObject getRiskEventDetail(String riskId) {
@ -146,18 +244,18 @@ public class RiskBusinessServiceImpl implements RiskBusinessService, ManagerTodo
@Override @Override
public List<JSONObject> getRiskEventOrderList(JSONObject riskEvent) { public List<JSONObject> getRiskEventOrderList(JSONObject riskEvent) {
String orderIds = riskEvent.getString("order_ids"); //String orderIds = riskEvent.getString("order_ids");
String realOrderIds = riskEvent.getString("real_order_ids");
JSONObject client = clientMapper.findClientByMonikerAll(riskEvent.getString("client_moniker")); JSONObject client = clientMapper.findClientByMonikerAll(riskEvent.getString("client_moniker"));
List<JSONObject> tradeLogs = new ArrayList<>(); List<JSONObject> tradeLogs = new ArrayList<>();
if (StringUtils.isNotBlank(orderIds)) { // 通用号调单会有client为空的情况所以无法查到订单信息
String[] orderIdArray = orderIds.trim().split(","); if (client != null && StringUtils.isNotBlank(realOrderIds)) {
String[] orderIdArray = realOrderIds.trim().split(",");
JSONObject orderInfo = new JSONObject(); JSONObject orderInfo = new JSONObject();
String realOrderId = "";
// 获取订单信息 // 获取订单信息
if (riskEvent.getIntValue("order_type") == 3) { if (riskEvent.getIntValue("order_type") == 3) {
for (int i = 0; i < orderIdArray.length; i++) { for (int i = 0; i < orderIdArray.length; i++) {
realOrderId = orderMapper.findOrderById(orderIdArray[i],client.getIntValue("client_id")).getString("order_id"); orderInfo = tradeLogService.getOrderDetail(new JSONObject(), riskEvent.getString("client_moniker"), orderIdArray[i], null);
orderInfo = tradeLogService.getOrderDetail(new JSONObject(), riskEvent.getString("client_moniker"), realOrderId, null);
tradeLogs.add(orderInfo); tradeLogs.add(orderInfo);
} }
} else { } else {
@ -170,8 +268,7 @@ public class RiskBusinessServiceImpl implements RiskBusinessService, ManagerTodo
return tradeLogs; return tradeLogs;
} }
@Override private JSONObject getEvent(JSONObject params) {
public void addRiskEvent(JSONObject params, JSONObject manager) {
// 通用号调单不需要填写client_moniker // 通用号调单不需要填写client_moniker
JSONObject client = null; JSONObject client = null;
String clientMoniker = params.getString("client_moniker"); String clientMoniker = params.getString("client_moniker");
@ -182,8 +279,6 @@ public class RiskBusinessServiceImpl implements RiskBusinessService, ManagerTodo
} }
} }
params.put("fillin_id", manager.getString("manager_id"));
params.put("fillin_person", manager.getString("display_name"));
String orderIds = params.getString("order_ids"); String orderIds = params.getString("order_ids");
if (StringUtils.isNotBlank(orderIds)) { if (StringUtils.isNotBlank(orderIds)) {
// 去除所有空格与中文逗号'' // 去除所有空格与中文逗号''
@ -192,26 +287,74 @@ public class RiskBusinessServiceImpl implements RiskBusinessService, ManagerTodo
params.put("order_ids", orderIds); params.put("order_ids", orderIds);
String[] orderIdArray = orderIds.split(","); String[] orderIdArray = orderIds.split(",");
List<String> orderAmountList = new ArrayList<>(); List<String> orderAmountList = new ArrayList<>();
for (int i = 0; i < orderIdArray.length; i++) { List<String> realOrderIdList = new ArrayList<>();
JSONObject orderInfo = orderMapper.findOrderById(orderIdArray[i],client.getIntValue("client_id")); /**
// 判断该笔订单是否存在,是否属于该商户 * client_monikerclient_id
if (orderInfo == null) * clientorder_amounts
throw new OrderNotExistsException(); *
else { */
if (!clientMoniker.equals(orderInfo.getString("partner_code"))) { if (client != null) {
for (int i = 0; i < orderIdArray.length; i++) {
PageList<JSONObject> transactionList = transactionMapper.findByClientIdAndSystemTransactionId(client.getIntValue("client_id"), orderIdArray[i], new PageBounds(Order.formString("transaction_time.desc")));
// 判断该笔订单是否存在,是否属于该商户
// 由于查询订单时已经关联商户了,所以只会抛出订单不匹配的异常
if (transactionList == null || transactionList.size() <= 0)
throw new OrderNotMatchException(); throw new OrderNotMatchException();
/*
else {
if (!clientMoniker.equals(orderInfo.getString("client_moniker"))) {
throw new OrderNotMatchException();
}
orderAmountList.add(orderInfo.getString("total_amount"));
} }
orderAmountList.add(orderInfo.getString("total_amount")); */
// 将订单order_id存入数据库方便后面快速查询
JSONObject orderInfo = transactionList.get(0);
realOrderIdList.add(orderInfo.getString("order_id"));
orderAmountList.add(orderInfo.getString("clearing_amount"));
} }
params.put("order_amounts", StringUtils.join(orderAmountList, ","));
params.put("real_order_ids", StringUtils.join(realOrderIdList, ","));
} }
params.put("order_amounts", StringUtils.join(orderAmountList, ","));
} }
return params;
}
@Override
public void addRiskEvent(JSONObject params, JSONObject manager) {
params = getEvent(params);
riskEventMapper.save(params); riskEventMapper.save(params);
setRiskOrders(params);
params = riskEventMapper.findAll(params).get(0);
riskProcessLogService.addRiskProcessLog(params.getString("risk_id"),
params.getString("fillin_id"),
params.getString("fillin_person"),
RiskResultTypeEnum.NOT_HANDLED.getRemark(),
RiskResultTypeEnum.NOT_HANDLED.getResultType(),
RiskResultTypeEnum.NOT_HANDLED.getResultType());
}
private void setRiskOrders(JSONObject params){
if(StringUtils.isNotBlank(params.getString("order_ids"))){
String riskId = params.getString("risk_id");
String orderIds = params.getString("real_order_ids");
for(String orderId : orderIds.split(",")){
JSONObject order = transactionMapper.findByOrderId(orderId);
JSONObject riskOrder = new JSONObject();
riskOrder.put("risk_id",riskId);
riskOrder.put("order_id",orderId);
riskOrder.put("clearing_amount",order.getString("clearing_amount"));
riskOrdersMapper.save(riskOrder);
}
}
} }
@Override @Override
public void updateRiskEvent(JSONObject params) { public void updateRiskEvent(JSONObject params) {
params = getEvent(params);
riskEventMapper.update(params); riskEventMapper.update(params);
riskOrdersMapper.clearOrders(params.getString("risk_id"));
setRiskOrders(params);
} }
@Override @Override
@ -256,51 +399,61 @@ public class RiskBusinessServiceImpl implements RiskBusinessService, ManagerTodo
Context ctx = getMailContext(event); Context ctx = getMailContext(event);
final List<String> emailsTos = (List<String>)ctx.getVariable("emailsTos"); final List<String> emailsTos = (List<String>)ctx.getVariable("emailsTos");
final List<String> emailsCcs = ctx.getVariable("emailsCcs")==null?new ArrayList<>():(List<String>)ctx.getVariable("emailsCcs"); final List<String> emailsCcs = ctx.getVariable("emailsCcs")==null?new ArrayList<>():(List<String>)ctx.getVariable("emailsCcs");
final List<String> emailsBccs = ctx.getVariable("emailsBccs") == null ? new ArrayList<>() : (List<String>) ctx.getVariable("emailsBccs");
final String title = (String)ctx.getVariable("title"); final String title = (String)ctx.getVariable("title");
final String content = thymeleaf.process("mail/risk_upload_mail.html", ctx); final String content = thymeleaf.process("mail/risk_upload_mail.html", ctx);
final String uploadUrl = (String)ctx.getVariable("uploadUrl"); final String uploadUrl = (String)ctx.getVariable("uploadUrl");
royalThreadPoolExecutor.execute(() -> { royalThreadPoolExecutor.execute(() -> {
try { try {
String emailId = mailService.sendRiskEmail(title, emailsTos.isEmpty() ? "" : StringUtils.join(emailsTos, ","), String emailId = mailService.sendRiskEmail(title,
emailsCcs.isEmpty() ? "" : StringUtils.join(emailsCcs, ","), "",content, null,event.getIntValue("order_type")); emailsTos.isEmpty() ? "" : StringUtils.join(emailsTos, ","),
event.put("email_status",1); emailsCcs.isEmpty() ? "" : StringUtils.join(emailsCcs, ","),
emailsBccs.isEmpty() ? "" : StringUtils.join(emailsBccs, ","),
content, null,event.getIntValue("order_type"));
event.put("email_status", RiskEmailStatusEnum.ALREADY_SEND.getEmailStatus());
event.put("result_type", RiskResultTypeEnum.SEND_EMAIL_TO_BD.getResultType()); event.put("result_type", RiskResultTypeEnum.SEND_EMAIL_TO_BD.getResultType());
event.put("submit_url",uploadUrl); event.put("submit_url",uploadUrl);
Integer orderType = event.getInteger("order_type"); Integer orderType = event.getInteger("order_type");
if (orderType == RiskOrderTypeEnum.WARNING_ORDER.getOrderType()) { if (orderType.equals(RiskOrderTypeEnum.WARNING_ORDER.getOrderType())) {
event.put("result_type", RiskResultTypeEnum.ALREADY_HANDLED.getResultType()); event.put("result_type", RiskResultTypeEnum.ALREADY_HANDLED.getResultType());
} }
riskEventMapper.update(event); riskEventMapper.update(event);
riskProcessLogService.addRiskProcessLog(event.getString("risk_id"),
event.getString("fillin_id"),
event.getString("fillin_person"),
RiskResultTypeEnum.SEND_EMAIL_TO_BD.getRemark(),
RiskResultTypeEnum.NOT_HANDLED.getResultType(),
RiskResultTypeEnum.SEND_EMAIL_TO_BD.getResultType());
if(event.getIntValue("is_send_client") == 1){
sendAppRiskMessage(event);
}
} catch (Exception e) { } catch (Exception e) {
throw new EmailException("Email Sending Failed", e); throw new EmailException("Email Sending Failed", e);
} }
}); });
if(event.getIntValue("order_type")==3){
sendAppRiskMessage(event);
}
} }
private void sendAppRiskMessage(JSONObject event){ private void sendAppRiskMessage(JSONObject event){
JSONObject client = clientMapper.findClientByMoniker(event.getString("client_moniker")); JSONObject client = clientMapper.findClientByMoniker(event.getString("client_moniker"));
logger.debug("sendRiskAppMessage-" + client.getString("client_moniker") + "-" + "risk_id:"+event.getString("risk_id")); logger.debug("sendRiskAppMessage-" + client.getString("client_moniker") + "-" + "risk_id:"+event.getString("risk_id"));
List<JSONObject> tokens = clientDeviceTokenMapper.listTokensByClient_id(client.getIntValue("client_id")); List<JSONObject> tokens = clientDeviceTokenMapper.listTokensByClient_id(client.getIntValue("client_id"));
for (final JSONObject devToken : tokens) { for (JSONObject devToken : tokens) {
Runnable task = () -> { Runnable task = () -> {
String token = devToken.getString("token"); String token = devToken.getString("token");
if (token == null) { if (token == null || devToken.getString("client_type") == null) {
return; return;
} }
JSONObject log = saveAppMessageLog(devToken.getString("dev_id"), devToken.getIntValue("client_id"), "risk", token, JSONObject log = saveAppMessageLog(devToken.getString("dev_id"), devToken.getIntValue("client_id"), "risk" + devToken.getString("client_type"), token,
event.getString("risk_id")); event.getString("risk_id"));
try { try {
event.put("send_type", "risk");
JSONObject type = new JSONObject(); JSONObject type = new JSONObject();
type.put("send_type", "risk"); type.put("send_type", "risk");
type.put("id", event.getString("risk_id")); type.put("id", event.getString("risk_id"));
// apnsMessageHelper.sendAppleMessageDetail(
// LocaleSupport.localeMessage("app.message.title.risk"), LocaleSupport.localeMessage("app.message.body.risk"),
// token, event, type);
AppMsgSender sender = senderMap.get(devToken.getString("client_type")); AppMsgSender sender = senderMap.get(devToken.getString("client_type"));
if (token == null || sender == null) { if (StringUtils.isBlank(token) || sender == null) {
return; return;
} }
JSONObject managerMsg = new JSONObject(); JSONObject managerMsg = new JSONObject();
@ -308,7 +461,7 @@ public class RiskBusinessServiceImpl implements RiskBusinessService, ManagerTodo
managerMsg.put("body", managerMsg.put("body",
LocaleSupport.localeMessage("app.message.body.risk")); LocaleSupport.localeMessage("app.message.body.risk"));
managerMsg.put("type", type); managerMsg.put("type", type);
managerMsg.put("data", event); managerMsg.put("data", new JSONObject());
managerMsg.put("msgType", "risk"); managerMsg.put("msgType", "risk");
AppMessage appMessage = new AppManagerMessageBuilder(managerMsg).buildMessage(); AppMessage appMessage = new AppManagerMessageBuilder(managerMsg).buildMessage();
sender.sendMessage(appMessage, devToken); sender.sendMessage(appMessage, devToken);
@ -317,7 +470,7 @@ public class RiskBusinessServiceImpl implements RiskBusinessService, ManagerTodo
} catch (Exception e) { } catch (Exception e) {
logger.error("出错了:" + e.getMessage()); logger.error("出错了:" + e.getMessage());
appMessageLogMapper.updateStatus(log.getString("send_id"), 1, e.getMessage()); appMessageLogMapper.updateStatus(log.getString("send_id"), 1, e.getMessage());
throw new ServerErrorException("Send App " + devToken.getString("client_type") + " Failed", e); throw new ServerErrorException("Send App " + devToken.getString("client_type") + " Failed" + ",token" + token, e);
} }
}; };
sendingAppleMsgPool.execute(task); sendingAppleMsgPool.execute(task);
@ -337,11 +490,17 @@ public class RiskBusinessServiceImpl implements RiskBusinessService, ManagerTodo
} }
@Transactional
@Override @Override
public void sendRefuseEmail(String riskId) throws IOException { public void sendRefuseEmail(String riskId, String refuseDescription) throws IOException {
JSONObject event = getRiskEventDetail(riskId); JSONObject event = getRiskEventDetail(riskId);
if (RiskResultTypeEnum.MATERIAL_NOT_PASS.getResultType().intValue() == event.getIntValue("result_type")) {
throw new BadRequestException("Refused Already!");
}
riskMaterialService.updateRiskMaterial(riskId, refuseDescription);
Context ctx = getMailContext(event); Context ctx = getMailContext(event);
ctx.setVariable("refuse",true); ctx.setVariable("refuse",true);
ctx.setVariable("refuse_description", riskMaterialMapper.findAllMaterials(riskId).get(0).getString("refuse_description"));
final List<String> emailsTos = (List<String>)ctx.getVariable("emailsTos"); final List<String> emailsTos = (List<String>)ctx.getVariable("emailsTos");
final List<String> emailsCcs = ctx.getVariable("emailsCcs")==null?new ArrayList<>():(List<String>)ctx.getVariable("emailsCcs"); final List<String> emailsCcs = ctx.getVariable("emailsCcs")==null?new ArrayList<>():(List<String>)ctx.getVariable("emailsCcs");
final String uploadUrl = (String)ctx.getVariable("uploadUrl"); final String uploadUrl = (String)ctx.getVariable("uploadUrl");
@ -350,10 +509,17 @@ public class RiskBusinessServiceImpl implements RiskBusinessService, ManagerTodo
try { try {
String emailId = mailService.sendRiskEmail("You need to resubmit risk materials", emailsTos.isEmpty() ? "" : StringUtils.join(emailsTos, ","), String emailId = mailService.sendRiskEmail("You need to resubmit risk materials", emailsTos.isEmpty() ? "" : StringUtils.join(emailsTos, ","),
emailsCcs.isEmpty() ? "" : StringUtils.join(emailsCcs, ","), "",content, null,event.getIntValue("order_type")); emailsCcs.isEmpty() ? "" : StringUtils.join(emailsCcs, ","), "",content, null,event.getIntValue("order_type"));
event.put("email_status",2); event.put("email_status",RiskEmailStatusEnum.BACK_AND_SEND.getEmailStatus());
event.put("result_type",RiskResultTypeEnum.MATERIAL_NOT_PASS.getResultType()); event.put("result_type",RiskResultTypeEnum.MATERIAL_NOT_PASS.getResultType());
event.put("submit_url",uploadUrl); event.put("submit_url",uploadUrl);
riskEventMapper.update(event); riskEventMapper.update(event);
// 日志记录
riskProcessLogService.addRiskProcessLog(riskId,
event.getString("fillin_id"),
event.getString("fillin_person"),
RiskResultTypeEnum.MATERIAL_NOT_PASS.getRemark(),
RiskResultTypeEnum.WAIT_FOR_AUDIT.getResultType(),
RiskResultTypeEnum.MATERIAL_NOT_PASS.getResultType());
} catch (Exception e) { } catch (Exception e) {
throw new EmailException("Email Sending Failed", e); throw new EmailException("Email Sending Failed", e);
} }
@ -396,14 +562,13 @@ public class RiskBusinessServiceImpl implements RiskBusinessService, ManagerTodo
expireDay = "3"; expireDay = "3";
} }
)*/ )*/
// 原来设定的过期时间是7天,现在改成一个月 // 原来设定的过期时间是7天
String expireDay = "30"; String expireDay = "3650";
stringRedisTemplate.boundValueOps(getRiskUploadKey(codeKey)).set(codeKeyValue, Long.parseLong(expireDay), TimeUnit.DAYS); stringRedisTemplate.boundValueOps(getRiskUploadKey(codeKey)).set(codeKeyValue, Long.parseLong(expireDay), TimeUnit.DAYS);
String uploadUrl = PlatformEnvironment.getEnv().concatUrl("/risk/upload/") + event.getString("risk_id") + "/" + codeKey; String uploadUrl = PlatformEnvironment.getEnv().concatUrl("/risk/upload/") + event.getString("risk_id") + "/" + codeKey;
int orderType = event.getIntValue("order_type"); int orderType = event.getIntValue("order_type");
if (orderType == 1 || orderType == 2) if (orderType == 1 || orderType == 2)
uploadUrl = PlatformEnvironment.getEnv().concatUrl("/manage.html#/analysis/monitoring/") + event.getString("risk_id") + "/bd/detail?codeKey=" + codeKey; uploadUrl = PlatformEnvironment.getEnv().concatUrl("/manage.html#/analysis/monitoring/") + event.getString("risk_id") + "/bd/detail?codeKey=" + codeKey;
//uploadUrl = "localhost:9009" + "/manage.html#/analysis/monitoring/" + event.getString("risk_id") + "/bd/detail";
List<JSONObject> bds = clientBDMapper.listClientBDInfoAvailable(client.getIntValue("client_id"), new Date()); List<JSONObject> bds = clientBDMapper.listClientBDInfoAvailable(client.getIntValue("client_id"), new Date());
List<String> bdNames = new ArrayList<>(); List<String> bdNames = new ArrayList<>();
List<String> bdEmails = new ArrayList<>(); List<String> bdEmails = new ArrayList<>();
@ -434,27 +599,44 @@ public class RiskBusinessServiceImpl implements RiskBusinessService, ManagerTodo
ctx.setVariable("uploadUrl", uploadUrl); ctx.setVariable("uploadUrl", uploadUrl);
ctx.setVariable("royalpay_order_type", event.getIntValue("royalpay_order_type")); ctx.setVariable("royalpay_order_type", event.getIntValue("royalpay_order_type"));
ctx.setVariable("warning_order_type", event.getIntValue("warning_order_type")); ctx.setVariable("warning_order_type", event.getIntValue("warning_order_type"));
String[] orderIds = event.getString("order_ids").split(","); ctx.setVariable("description", event.getString("description"));
ctx.setVariable("is_send_client",event.getIntValue("is_send_client"));
String realOrderIdsStr = event.getString("real_order_ids");
String[] realOrderIds = {};
if (StringUtils.isNotBlank(realOrderIdsStr)) {
realOrderIds = event.getString("real_order_ids").split(",");
}
List<JSONObject> orders = new ArrayList(); List<JSONObject> orders = new ArrayList();
int isSendClient = event.getIntValue("is_send_client");
ctx.setVariable("emailsTos", bdEmails);
if (isSendClient == 1) {
ctx.setVariable("emailsTos", clientEmails);
ctx.setVariable("emailsCcs", bdEmails);
if (orderType == RiskOrderTypeEnum.ROYALPAY_ORDER.getOrderType().intValue()) {
ctx.setVariable("emailsBccs", Arrays.asList(
// "locky@royalpay.com.au ", "zoe.tao@royalpay.com.au", "leo.huang@royalpay.com.au",
// "mona.zhang@royalpay.com.au", "weixinfengkong@royalpay.com.au", "thomas.li@royalpay.com.au"
"18852852189@139.com", "1370256381@qq.com"
));
}
}
switch (event.getIntValue("order_type")){ switch (event.getIntValue("order_type")){
case 1: case 1:
case 2: case 2:
for(String orderId : orderIds){ for(String orderId : realOrderIds){
JSONObject order = orderMapper.findOrderById(orderId,client.getIntValue("client_id")); JSONObject order = orderMapper.findOrderById(orderId,client.getIntValue("client_id"));
if(order==null){ if(order==null){
throw new BadRequestException("Order: "+orderId+" not exists"); throw new BadRequestException("Order: " + orderId + " not exists");
} }
orders.add(order); orders.add(order);
} }
ctx.setVariable("orders", orders); ctx.setVariable("orders", orders);
ctx.setVariable("title","Your merchants needs to submit risk materials"); ctx.setVariable("title","Your merchants needs to submit risk materials");
ctx.setVariable("emailsTos", bdEmails);
break; break;
case 3: case 3:
String realOrderId = ""; for(String orderId : realOrderIds){
for(String orderId : orderIds){ JSONObject order = tradeLogService.getOrderDetail(new JSONObject(), clientMoniker, orderId, null);
realOrderId = orderMapper.findOrderById(orderId,client.getIntValue("client_id")).getString("order_id");
JSONObject order = tradeLogService.getOrderDetail(new JSONObject(), clientMoniker, realOrderId, null);
if(order==null){ if(order==null){
throw new BadRequestException("Order: "+orderId+" not exists"); throw new BadRequestException("Order: "+orderId+" not exists");
} }
@ -477,8 +659,6 @@ public class RiskBusinessServiceImpl implements RiskBusinessService, ManagerTodo
// ctx.setVariable("files",attachList); // ctx.setVariable("files",attachList);
case 4: case 4:
ctx.setVariable("title","RoyalPay风控调查 — " + client.getString("short_name")); ctx.setVariable("title","RoyalPay风控调查 — " + client.getString("short_name"));
ctx.setVariable("emailsCcs", bdEmails);
ctx.setVariable("emailsTos", clientEmails);
break; break;
} }
return ctx; return ctx;
@ -491,9 +671,8 @@ public class RiskBusinessServiceImpl implements RiskBusinessService, ManagerTodo
public JSONObject getRiskMaterial(JSONObject param) { public JSONObject getRiskMaterial(JSONObject param) {
List<JSONObject> riskMaterialList = riskMaterialMapper.findAllMaterials(param.getString("risk_id")); List<JSONObject> riskMaterialList = riskMaterialMapper.findAllMaterials(param.getString("risk_id"));
if (riskMaterialList != null && riskMaterialList.size() > 0){ if (riskMaterialList != null && riskMaterialList.size() > 0){
List<JSONObject> files = riskFileMapper.findAllFiles(riskMaterialList.get(0).getString("material_id")); JSONObject fileNew = riskMaterialList.get(0);
JSONObject fileNew = new JSONObject(); List<JSONObject> files = riskFileMapper.findAllFiles(fileNew.getString("material_id"));
fileNew.put("description",riskMaterialList.get(0).getString("description"));
for(JSONObject file : files){ for(JSONObject file : files){
int fileType = file.getIntValue("file_type"); int fileType = file.getIntValue("file_type");
if(!fileNew.containsKey("file"+fileType)){ if(!fileNew.containsKey("file"+fileType)){
@ -512,16 +691,43 @@ public class RiskBusinessServiceImpl implements RiskBusinessService, ManagerTodo
return null; return null;
} }
@Override
@Transactional
public void completeEventRealOrderIds() {
List<JSONObject> riskEventList = getRiskEvents(null);
if (riskEventList != null && riskEventList.size() > 0) {
for (JSONObject riskEvent : riskEventList) {
String clientMoniker = riskEvent.getString("client_moniker");
JSONObject client = clientMapper.findClientByMonikerAll(clientMoniker);
String systemTransactionIds = riskEvent.getString("order_ids");
if (StringUtils.isBlank(systemTransactionIds))
continue;
String[] systemTransactionIdArr = riskEvent.getString("order_ids").split(",");
List<String> realOrderIds = new ArrayList<>();
if (client == null)
continue;
for (int i = 0; i < systemTransactionIdArr.length; i++) {
PageList<JSONObject> transactionList = transactionMapper.findByClientIdAndSystemTransactionId(
client.getIntValue("client_id"),
systemTransactionIdArr[i],
new PageBounds(Order.formString("transaction_time.desc")));
if (transactionList != null && transactionList.size() > 0)
realOrderIds.add(transactionList.get(0).getString("order_id"));
}
riskEvent.put("real_order_ids", StringUtils.join(realOrderIds, ","));
//updateRiskEvent(riskEvent);
riskEventMapper.update(riskEvent);
}
}
}
private byte[] generateRiskOrders(JSONObject event) throws IOException { private byte[] generateRiskOrders(JSONObject event) throws IOException {
String[] orderIds = event.getString("order_ids").split(","); String[] orderIds = event.getString("order_ids").split(",");
JSONObject client = clientMapper.findClientByMonikerAll(event.getString("client_moniker")); JSONObject client = clientMapper.findClientByMonikerAll(event.getString("client_moniker"));
Workbook wb = new XSSFWorkbook(); Workbook wb = new XSSFWorkbook();
String realOrderId = "";
for(String orderId : orderIds){ for(String orderId : orderIds){
realOrderId = orderMapper.findOrderById(orderId,client.getIntValue("client_id")).getString("order_id"); JSONObject orderDetail = tradeLogService.getOrderDetail(new JSONObject(), event.getString("client_moniker"), orderId, null);
JSONObject orderDetail = tradeLogService.getOrderDetail(new JSONObject(), event.getString("client_moniker"), realOrderId, null);
Sheet sheet = wb.createSheet(orderId); Sheet sheet = wb.createSheet(orderId);
sheet.setDefaultColumnWidth((short) 40); sheet.setDefaultColumnWidth((short) 40);
Row row0 = sheet.createRow(0); Row row0 = sheet.createRow(0);
@ -638,6 +844,11 @@ public class RiskBusinessServiceImpl implements RiskBusinessService, ManagerTodo
@Override @Override
public void checkTodo(JSONObject manager, List<TodoNotice> notices) { public void checkTodo(JSONObject manager, List<TodoNotice> notices) {
/**
* 1BD
* 2BD
* 3
*/
if (ManagerRole.BD_USER.hasRole(manager.getIntValue("role"))) { if (ManagerRole.BD_USER.hasRole(manager.getIntValue("role"))) {
JSONObject params = new JSONObject(); JSONObject params = new JSONObject();
params.put("bd_id", manager.getString("manager_id")); params.put("bd_id", manager.getString("manager_id"));
@ -667,4 +878,140 @@ public class RiskBusinessServiceImpl implements RiskBusinessService, ManagerTodo
} }
} }
} }
@Override
public void deleteRiskEvent(String riskId) {
riskEventMapper.deleteRiskEvent(riskId);
}
@Override
public JSONObject getNoticeInfo(int clientId) {
JSONObject client = clientMapper.findClient(clientId);
if(client == null){
throw new InvalidShortIdException();
}
JSONObject params = new JSONObject();
params.put("client_moniker", client.getString("client_moniker"));
params.put("is_send_client", 1);
List<Integer> resultTypes = Arrays.asList(RiskResultTypeEnum.SEND_EMAIL_TO_BD.getResultType(),
RiskResultTypeEnum.MATERIAL_NOT_PASS.getResultType());
params.put("result_types", resultTypes);
PageList<JSONObject> riskEventList = riskEventMapper.listRisksByPage(params, new PageBounds(Order.formString("create_time.desc")));
JSONObject result = new JSONObject();
result.put("notice_flag", false);
if (riskEventList != null && riskEventList.size() > 0) {
result.put("notice_flag", true);
}
return result;
}
@Override
public JSONObject getRiskEventMaterialsRemark(String riskId) {
JSONObject riskEvent = riskEventMapper.findById(riskId);
Integer orderType = riskEvent.getInteger("order_type");
List<JSONObject> materialItemList = new ArrayList<>();
List<String> materialsRemark = new ArrayList<>();
if (orderType.equals(RiskOrderTypeEnum.WECHAT_ORDER.getOrderType())) {
materialsRemark = Arrays.asList(
"1、物流公司发货单据照片 要求:每笔交易对应的物流单必须提供,且单据必须清晰可见\n" +
"Photos of logistics companies goods-delivery documents Requirement: The logistics order record corresponding to each transaction must be provided, and details of records should be clearly visible. ",
"2、用户购买虚拟物品需要提供聊天记录、订单信息、发货凭证截图、 虚拟物品最终消费场景(例如何种游戏、软件)、提供消费场景网址/下载链接 要求:每笔交易对应的截图必须清晰可见\n" +
"Users need to provide chat records, order information, screenshots of delivery documents, final consumption scenarios of virtual goods (such as games, software); provide consumer scene URL / download link. Requirement: The screenshot corresponding to each transaction must be clearly visible. ",
"3、购物小票/发票存根照片 照片应清晰,必须显示商户名称、商户地址、购物时间、物品名称 购物金额等\n" +
"Photos of shopping receipts/ invoice stubs Requirement: The photos should be clear and must show Merchant name, Business address, Transaction time, Product information, Quantity purchased, etc. ",
"4、显示商户门牌号码和店头名称的照片 要求:清晰可见,至少一张\n" +
"Photos of Merchant Street number & Merchant name Requirement: At least one visible photo ",
"5、显示商户营业场景所场内部情况如店内商品陈列、收银台等的照片 要求:照片清晰,且能清楚显示商户实际售卖物品或服务,至少三张\n" +
"Photos of internal environment of merchant business (such as in-store merchandise display, checkout counter, etc.) Requirements: The photos (at least three) showing merchant activities including actual selling-goods or services obviously ",
"6、其他图片\n" +
"Other pictures "
);
} else if (orderType.equals(RiskOrderTypeEnum.ALIPAY_ORDER.getOrderType())) {
String alipayMaterials = riskEvent.getString("alipay_materials");
if (StringUtils.isNotBlank(alipayMaterials)) {
List<JSONObject> alipayMaterialRemarkList = JSONObject.parseArray(alipayMaterials, JSONObject.class);
if (alipayMaterialRemarkList != null && alipayMaterialRemarkList.size() > 0) {
for (int i = 0; i < alipayMaterialRemarkList.size(); i++) {
materialsRemark.add(alipayMaterialRemarkList.get(i).getString("question" + (i + 1)));
}
}
}
} else if (orderType.equals(RiskOrderTypeEnum.ROYALPAY_ORDER.getOrderType())) {
materialsRemark = Arrays.asList(
"1.请解释相应的消费场景/业务模式,例如网站商城,扫码支付, 消费者到店支付等;\n" +
"Please explain the relative payment scenario/business activities, for example, online store, QR code payment, payment at the store, etc;",
"2.提供相应购物清单,订单小票(请提供与被查交易订单号相匹配的交易时间及金额的发票);\n" +
"Provide related shopping lists, invoices. (Please provide the invoices, amount of which matches that of the abnormal transaction);",
"3.提供相应的发货证明,报关单(若有消费者在国内购买,请提供物流单据或报关单);\n" +
"Relative proof of delivery, customs declaration (If the consumer purchased from China, please provide shipping receipt or customs declaration);",
"4.提供您的门店照片(门店照及店铺内的照片各一张, 一张可以看到商户名的门头照,一张可以看到相关商品或服务的店内照片);\n" +
"Photos of the store ( one of each front-store and in-store);",
"5.其他可以还原交易背景的资料,如和消费者的聊天记录等,来佐证被查单号交易的真实性;\n" +
"Other materials that can verify the payment scenario, for example, chatting history, to prove the truth of the transactions;",
"6、其他图片\n" +
"Other pictures"
);
}
JSONObject material = getRiskMaterial(riskEvent);
for (int i = 0; i < materialsRemark.size(); i++) {
JSONObject materialItem = new JSONObject();
materialItem.put("question", materialsRemark.get(i));
if (material != null)
materialItem.put("file", material.getJSONArray("file" + (i + 1)));
materialItemList.add(materialItem);
}
JSONObject result = new JSONObject();
result.put("material", materialItemList);
if (material != null && material.containsKey("description")) {
result.put("description", material.getString("description"));
}
if (material != null && material.containsKey("refuse_description")) {
result.put("refuse_description", material.getString("refuse_description"));
}
return result;
}
@Override
public JSONObject riskEventMaterialPass(JSONObject params, JSONObject manager) {
riskEventMapper.update(params);
riskProcessLogService.addRiskProcessLog(params.getString("risk_id"),
manager.getString("manager_id"),
manager.getString("display_name"),
RiskResultTypeEnum.MATERIAL_AUDIT_PASS.getRemark(),
params.getIntValue("result_type"),
RiskResultTypeEnum.MATERIAL_AUDIT_PASS.getResultType());
return params;
}
@Override
public JSONObject updateIsSendClient(String riskId) {
JSONObject event = riskEventMapper.findById(riskId);
event.put("is_send_client", 1);
riskEventMapper.update(event);
event = riskEventMapper.findById(riskId);
return event;
}
@Override
public void completeOrderAmount() {
List<JSONObject> riskEventList = getRiskEvents(null);
for(JSONObject riskEvent:riskEventList){
if(riskEvent.getIntValue("order_type")==4 || StringUtils.isBlank(riskEvent.getString("real_order_ids"))){
continue;
}
String[] order_ids=riskEvent.getString("real_order_ids").split(",");
for(String orderId : order_ids){
JSONObject transaction = transactionMapper.findByOrderId(orderId);
JSONObject riskOrder = new JSONObject();
riskOrder.put("risk_id",riskEvent.getString("risk_id"));
riskOrder.put("order_id",transaction.getString("order_id"));
riskOrder.put("clearing_amount",transaction.getString("clearing_amount"));
riskOrdersMapper.save(riskOrder);
}
}
}
} }

@ -0,0 +1,32 @@
package au.com.royalpay.payment.manage.riskbusiness.core.impl;
import au.com.royalpay.payment.manage.mappers.riskbusiness.RiskMaterialMapper;
import au.com.royalpay.payment.manage.riskbusiness.core.RiskMaterialService;
import com.alibaba.fastjson.JSONObject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.List;
/**
* @Description:
* @Author: lujian
* @Date: 2018/11/19 19:45
*/
@Service
public class RiskMaterialServiceImpl implements RiskMaterialService {
@Resource
private RiskMaterialMapper riskMaterialMapper;
@Override
public void updateRiskMaterial(String riskId, String description) {
List<JSONObject> materialList = riskMaterialMapper.findAllMaterials(riskId);
if (!materialList.isEmpty()){
JSONObject material = materialList.get(0);
material.put("refuse_description", description);
riskMaterialMapper.update(material);
}
}
}

@ -0,0 +1,45 @@
package au.com.royalpay.payment.manage.riskbusiness.core.impl;
import au.com.royalpay.payment.manage.mappers.riskbusiness.RiskProcessLogMapper;
import au.com.royalpay.payment.manage.riskbusiness.core.RiskProcessLogService;
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.springframework.stereotype.Service;
import javax.annotation.Resource;
/**
* @Description:
* @Author: lujian
* @Date: 2018/11/22 15:46
*/
@Service
public class RiskProcessLogServiceImpl implements RiskProcessLogService {
@Resource
private RiskProcessLogMapper riskProcessLogMapper;
@Override
public PageList<JSONObject> getRiskProcessLogs(String riskId) {
return riskProcessLogMapper.getRiskProcessLogs(riskId, new PageBounds(Order.formString("create_time")));
}
@Override
public void addRiskProcessLog(JSONObject log) {
riskProcessLogMapper.addRiskProcessLog(log);
}
@Override
public void addRiskProcessLog(String riskId, String operatorId, String operator, String remark, int resultTypeFrom, int resultTypeTo) {
JSONObject log = new JSONObject();
log.put("risk_id", riskId);
log.put("operator_id", operatorId);
log.put("operator", operator);
log.put("remark", remark);
log.put("result_type_from", resultTypeFrom);
log.put("result_type_to", resultTypeTo);
riskProcessLogMapper.addRiskProcessLog(log);
}
}

@ -7,6 +7,7 @@ import au.com.royalpay.payment.manage.mappers.riskbusiness.RiskMaterialMapper;
import au.com.royalpay.payment.manage.mappers.system.ClientMapper; import au.com.royalpay.payment.manage.mappers.system.ClientMapper;
import au.com.royalpay.payment.manage.notice.core.MailService; import au.com.royalpay.payment.manage.notice.core.MailService;
import au.com.royalpay.payment.manage.riskbusiness.core.RiskBusinessService; import au.com.royalpay.payment.manage.riskbusiness.core.RiskBusinessService;
import au.com.royalpay.payment.manage.riskbusiness.core.RiskProcessLogService;
import au.com.royalpay.payment.manage.riskbusiness.core.RiskUploadService; import au.com.royalpay.payment.manage.riskbusiness.core.RiskUploadService;
import au.com.royalpay.payment.manage.riskbusiness.enums.RiskResultTypeEnum; import au.com.royalpay.payment.manage.riskbusiness.enums.RiskResultTypeEnum;
import au.com.royalpay.payment.tools.exceptions.BadRequestException; import au.com.royalpay.payment.tools.exceptions.BadRequestException;
@ -17,6 +18,7 @@ import org.apache.commons.lang3.time.DateFormatUtils;
import org.apache.commons.lang3.time.DateUtils; import org.apache.commons.lang3.time.DateUtils;
import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.thymeleaf.context.Context; import org.thymeleaf.context.Context;
import org.thymeleaf.spring4.SpringTemplateEngine; import org.thymeleaf.spring4.SpringTemplateEngine;
@ -34,14 +36,22 @@ public class RiskUploadServiceIpml implements RiskUploadService {
@Resource @Resource
private RiskEventMapper riskEventMapper; private RiskEventMapper riskEventMapper;
@Resource @Resource
private RiskProcessLogService riskProcessLogService;
@Resource
private StringRedisTemplate stringRedisTemplate; private StringRedisTemplate stringRedisTemplate;
private final String UPLOAD_MAIL_PREFIX = "UPLOAD_MAIL"; private final String UPLOAD_MAIL_PREFIX = "UPLOAD_MAIL";
@Override @Override
public void submitMaterial(JSONObject material) { public void submitMaterial(JSONObject material) {
JSONObject event = riskEventMapper.findById(material.getString("risk_id")); String riskId = material.getString("risk_id");
JSONObject event = riskEventMapper.findById(riskId);
Integer resultType = event.getInteger("result_type");
if (!resultType.equals(RiskResultTypeEnum.SEND_EMAIL_TO_BD.getResultType()) && !resultType.equals(RiskResultTypeEnum.MATERIAL_NOT_PASS.getResultType())) {
throw new BadRequestException("Committed Already");
}
material.put("update_time", DateFormatUtils.format(new Date(), "yyyy-MM-dd HH:mm:ss"));
riskMaterialMapper.save(material); riskMaterialMapper.save(material);
material.put("material_id",riskMaterialMapper.findAllMaterials(material.getString("risk_id")).get(0).getString("material_id")); material.put("material_id",riskMaterialMapper.findAllMaterials(riskId).get(0).getString("material_id"));
for(int i=1;i<=10;i++){ for(int i=1;i<=10;i++){
if(material.containsKey("file"+i+"_url")){ if(material.containsKey("file"+i+"_url")){
List<String> urls = (List<String>)material.get("file"+i+"_url"); List<String> urls = (List<String>)material.get("file"+i+"_url");
@ -66,16 +76,17 @@ public class RiskUploadServiceIpml implements RiskUploadService {
@Override @Override
public void checkUploadMailKey(String codeKey,String risk_id) { public void checkUploadMailKey(String codeKey,String risk_id) {
JSONObject event = riskEventMapper.findById(risk_id); JSONObject event = riskEventMapper.findById(risk_id);
//到期日前一天的下午6点前url可用 //到期日前一天的下午6点前url可用
try { // try {
String reply = DateFormatUtils.format(DateUtils.addDays(event.getDate("reply_email_date"),-1),"yyyy-MM-dd 18:00:00"); // String reply = DateFormatUtils.format(DateUtils.addDays(event.getDate("reply_email_date"),-1),"yyyy-MM-dd 18:00:00");
if(new Date().after( DateUtils.parseDate(reply,new String[]{"yyyy-MM-dd HH:mm:ss"}))){ // if(new Date().after( DateUtils.parseDate(reply,new String[]{"yyyy-MM-dd HH:mm:ss"}))){
deleteUploadMailKey(codeKey); // deleteUploadMailKey(codeKey);
throw new BadRequestException("Url expired"); // throw new BadRequestException("Url expired");
} // }
} catch (ParseException e) { // } catch (ParseException e) {
e.printStackTrace(); // e.printStackTrace();
} // }
if (StringUtils.isNotEmpty(codeKey)) { if (StringUtils.isNotEmpty(codeKey)) {
String redisUpload = stringRedisTemplate.boundValueOps(getRiskUploadKey(codeKey)).get(); String redisUpload = stringRedisTemplate.boundValueOps(getRiskUploadKey(codeKey)).get();

@ -15,6 +15,15 @@ public enum RiskResultTypeEnum {
private Integer resultType; private Integer resultType;
private static final String[] REMARK_ARR = {
"风控事件已创建",
"已发送邮件,资料完善中",
"资料已提交,等待审核",
"材料审核通过",
"材料打回",
"已处理"
};
RiskResultTypeEnum(Integer resultType) { RiskResultTypeEnum(Integer resultType) {
this.resultType = resultType; this.resultType = resultType;
} }
@ -26,4 +35,8 @@ public enum RiskResultTypeEnum {
public void setResultType(Integer resultType) { public void setResultType(Integer resultType) {
this.resultType = resultType; this.resultType = resultType;
} }
public String getRemark() {
return REMARK_ARR[resultType];
}
} }

@ -5,22 +5,18 @@ import au.com.royalpay.payment.manage.merchants.core.ClientManager;
import au.com.royalpay.payment.manage.permission.manager.ManagerMapping; import au.com.royalpay.payment.manage.permission.manager.ManagerMapping;
import au.com.royalpay.payment.manage.riskbusiness.bean.RiskEventQuery; import au.com.royalpay.payment.manage.riskbusiness.bean.RiskEventQuery;
import au.com.royalpay.payment.manage.riskbusiness.core.RiskBusinessService; import au.com.royalpay.payment.manage.riskbusiness.core.RiskBusinessService;
import au.com.royalpay.payment.manage.riskbusiness.core.RiskMaterialService;
import au.com.royalpay.payment.manage.riskbusiness.core.RiskProcessLogService;
import au.com.royalpay.payment.manage.riskbusiness.enums.RiskResultTypeEnum; import au.com.royalpay.payment.manage.riskbusiness.enums.RiskResultTypeEnum;
import au.com.royalpay.payment.tools.CommonConsts; import au.com.royalpay.payment.tools.CommonConsts;
import au.com.royalpay.payment.tools.permission.enums.ManagerRole; import au.com.royalpay.payment.tools.permission.enums.ManagerRole;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import com.sun.org.apache.xerces.internal.impl.dv.xs.BooleanDV;
import com.sun.org.apache.xpath.internal.operations.Bool;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import java.io.IOException; import java.io.IOException;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List; import java.util.List;
/** /**
@ -35,27 +31,48 @@ public class RiskBusinessController {
@Autowired @Autowired
private RiskBusinessService riskBusinessService; private RiskBusinessService riskBusinessService;
@Autowired
private RiskMaterialService riskMaterialService;
@Autowired @Autowired
private ClientManager clientManager; private ClientManager clientManager;
@Autowired
private RiskProcessLogService riskProcessLogService;
@GetMapping(value = "events") @GetMapping(value = "events")
public JSONObject getRiskEvents(RiskEventQuery riskEventQuery, @ModelAttribute(CommonConsts.MANAGER_STATUS) JSONObject manager) { public JSONObject getRiskEvents(RiskEventQuery riskEventQuery, @ModelAttribute(CommonConsts.MANAGER_STATUS) JSONObject manager) {
JSONObject params = riskEventQuery.toJSON(); JSONObject params = riskEventQuery.toJSON();
return riskBusinessService.getRiskEventsByPage(params, manager); return riskBusinessService.getRiskEventsByPage(params, manager);
} }
@GetMapping(value = "events/analysis/industry")
public List<JSONObject> analysisByIndustry(RiskEventQuery riskEventQuery, @ModelAttribute(CommonConsts.MANAGER_STATUS) JSONObject manager) {
JSONObject params = riskEventQuery.toJSON();
return riskBusinessService.analysisByIndustry(params, manager);
}
@GetMapping(value = "events/analysis/amount")
public List<JSONObject> analysisByAmount(RiskEventQuery riskEventQuery, @ModelAttribute(CommonConsts.MANAGER_STATUS) JSONObject manager) {
JSONObject params = riskEventQuery.toJSON();
return riskBusinessService.analysisByAmount(params, manager);
}
@GetMapping(value = "events/{risk_id}") @GetMapping(value = "events/{risk_id}")
public JSONObject getRiskEventDetail(@PathVariable("risk_id") String riskId, public JSONObject getRiskEventDetail(@PathVariable("risk_id") String riskId,
@ModelAttribute(CommonConsts.MANAGER_STATUS) JSONObject manager) { @ModelAttribute(CommonConsts.MANAGER_STATUS) JSONObject manager) {
JSONObject riskEvent = riskBusinessService.getRiskEventDetail(riskId); JSONObject riskEvent = riskBusinessService.getRiskEventDetail(riskId);
List<JSONObject> tradeLogs = riskBusinessService.getRiskEventOrderList(riskEvent); List<JSONObject> tradeLogs = riskBusinessService.getRiskEventOrderList(riskEvent);
riskEvent.put("tradeLogs", tradeLogs); riskEvent.put("tradeLogs", tradeLogs);
riskEvent.put("process_logs", riskProcessLogService.getRiskProcessLogs(riskId));
return riskEvent; return riskEvent;
} }
@PostMapping(value = "events") @PostMapping(value = "events")
public void RegisterRiskEvent(@RequestBody JSONObject params, public void RegisterRiskEvent(@RequestBody JSONObject params,
@ModelAttribute(CommonConsts.MANAGER_STATUS) JSONObject manager) { @ModelAttribute(CommonConsts.MANAGER_STATUS) JSONObject manager) {
params.put("fillin_id", manager.getString("manager_id"));
params.put("fillin_person", manager.getString("display_name"));
riskBusinessService.addRiskEvent(params, manager); riskBusinessService.addRiskEvent(params, manager);
} }
@ -64,6 +81,12 @@ public class RiskBusinessController {
riskBusinessService.updateRiskEvent(params); riskBusinessService.updateRiskEvent(params);
} }
@PutMapping(value = "events/pass")
public void riskEventMaterialPass(@RequestBody JSONObject params,
@ModelAttribute(CommonConsts.MANAGER_STATUS) JSONObject manager) {
riskBusinessService.riskEventMaterialPass(params, manager);
}
@GetMapping(value = "/{risk_id}/download/materialsAsZIP") @GetMapping(value = "/{risk_id}/download/materialsAsZIP")
public void downloadComplianceZip(@PathVariable("risk_id") String riskId, HttpServletResponse response) throws Exception { public void downloadComplianceZip(@PathVariable("risk_id") String riskId, HttpServletResponse response) throws Exception {
riskBusinessService.downloadAuditMaterialZiP(riskId, response); riskBusinessService.downloadAuditMaterialZiP(riskId, response);
@ -76,8 +99,8 @@ public class RiskBusinessController {
} }
@RequestMapping(value = "/{risk_id}/refuse",method = RequestMethod.PUT) @RequestMapping(value = "/{risk_id}/refuse",method = RequestMethod.PUT)
public void refuseEmail(@PathVariable String risk_id) throws IOException { public void refuseEmail(@PathVariable("risk_id") String riskId, @RequestBody JSONObject otherParams) throws IOException {
riskBusinessService.sendRefuseEmail(risk_id); riskBusinessService.sendRefuseEmail(riskId, otherParams.getString("refuse_description"));
} }
@GetMapping(value = "/{risk_id}/material") @GetMapping(value = "/{risk_id}/material")
@ -87,6 +110,11 @@ public class RiskBusinessController {
return riskBusinessService.getRiskMaterial(param); return riskBusinessService.getRiskMaterial(param);
} }
@GetMapping(value = "/{risk_id}/all_material_info")
public JSONObject getRiskAlMaterialInfo(@PathVariable("risk_id") String riskId) {
return riskBusinessService.getRiskEventMaterialsRemark(riskId);
}
@PutMapping(value = "/channel/{channel}/permission/{channelFlag}") @PutMapping(value = "/channel/{channel}/permission/{channelFlag}")
public void updateMerchantChannel(@RequestBody JSONObject params, public void updateMerchantChannel(@RequestBody JSONObject params,
@PathVariable("channelFlag") Boolean channelFlag, @PathVariable("channelFlag") Boolean channelFlag,
@ -116,8 +144,8 @@ public class RiskBusinessController {
params.put("result_type", RiskResultTypeEnum.ALREADY_HANDLED.getResultType()); params.put("result_type", RiskResultTypeEnum.ALREADY_HANDLED.getResultType());
} }
riskBusinessService.updateRiskEvent(params); riskBusinessService.updateRiskEvent(params);
} }
@RequestMapping(value = "/{risk_id}/urge",method = RequestMethod.PUT) @RequestMapping(value = "/{risk_id}/urge",method = RequestMethod.PUT)
public void urgeEmail(@PathVariable String risk_id) throws IOException { public void urgeEmail(@PathVariable String risk_id) throws IOException {
riskBusinessService.sendUrgeEmail(risk_id); riskBusinessService.sendUrgeEmail(risk_id);
@ -128,5 +156,27 @@ public class RiskBusinessController {
JSONObject param = partnerQuery.toJsonParam(); JSONObject param = partnerQuery.toJsonParam();
return clientManager.getClientBySimpleQuery(param); return clientManager.getClientBySimpleQuery(param);
} }
// 更新库中的orderIds
@GetMapping(value = "/complete/real_order_id")
public void completeEventRealOrderIds() {
riskBusinessService.completeEventRealOrderIds();
}
@GetMapping(value = "/delete/event")
public void deleteRiskEvent(@RequestParam("risk_id") String riskId) {
riskBusinessService.deleteRiskEvent(riskId);
}
@GetMapping(value = "/update/event/is_send_client")
public JSONObject updateRiskEventIsSendClient(@RequestParam("risk_id") String riskId) {
return riskBusinessService.updateIsSendClient(riskId);
}
@GetMapping(value = "/complete/event/order_amount")
public String completeOrderAmount() {
riskBusinessService.completeOrderAmount();
return "SUCCESS";
}
} }

@ -1,7 +1,10 @@
package au.com.royalpay.payment.manage.riskbusiness.web; package au.com.royalpay.payment.manage.riskbusiness.web;
import au.com.royalpay.payment.manage.riskbusiness.core.RiskBusinessService; import au.com.royalpay.payment.manage.riskbusiness.core.RiskBusinessService;
import au.com.royalpay.payment.manage.riskbusiness.core.RiskProcessLogService;
import au.com.royalpay.payment.manage.riskbusiness.core.RiskUploadService; import au.com.royalpay.payment.manage.riskbusiness.core.RiskUploadService;
import au.com.royalpay.payment.manage.riskbusiness.enums.RiskResultTypeEnum;
import au.com.royalpay.payment.tools.CommonConsts;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.ModelAndView;
@ -15,6 +18,8 @@ public class RiskFileUploadController {
private RiskUploadService riskUploadService; private RiskUploadService riskUploadService;
@Resource @Resource
private RiskBusinessService riskBusinessService; private RiskBusinessService riskBusinessService;
@Resource
private RiskProcessLogService riskProcessLogService;
/** /**
* *
@ -25,7 +30,7 @@ public class RiskFileUploadController {
@RequestMapping(value = "/{risk_id}/{codeKey}", method = RequestMethod.GET) @RequestMapping(value = "/{risk_id}/{codeKey}", method = RequestMethod.GET)
public ModelAndView jumpVerifyMail(@PathVariable String codeKey, @PathVariable String risk_id) { public ModelAndView jumpVerifyMail(@PathVariable String codeKey, @PathVariable String risk_id) {
//检查codekey是否有效 //检查codekey是否有效
riskUploadService.checkUploadMailKey(codeKey,risk_id); // riskUploadService.checkUploadMailKey(codeKey,risk_id);
JSONObject event = riskBusinessService.getRiskEventDetail(risk_id); JSONObject event = riskBusinessService.getRiskEventDetail(risk_id);
ModelAndView view = new ModelAndView("mail/risk_upload"); ModelAndView view = new ModelAndView("mail/risk_upload");
view.addObject("codeKey", codeKey); view.addObject("codeKey", codeKey);
@ -41,9 +46,17 @@ public class RiskFileUploadController {
* @param material * @param material
*/ */
@RequestMapping(value = "/{codeKey}", method = RequestMethod.POST) @RequestMapping(value = "/{codeKey}", method = RequestMethod.POST)
public void upload(@PathVariable String codeKey, @RequestBody JSONObject material) { public void upload(@PathVariable String codeKey,
riskUploadService.checkUploadMailKey(codeKey, material.getString("risk_id")); @RequestBody JSONObject material,
@ModelAttribute(CommonConsts.MANAGER_STATUS) JSONObject manager) {
// riskUploadService.checkUploadMailKey(codeKey, material.getString("risk_id"));
riskUploadService.submitMaterial(material); riskUploadService.submitMaterial(material);
riskProcessLogService.addRiskProcessLog(material.getString("risk_id"),
manager.getString("manager_id"),
manager.getString("display_name"),
RiskResultTypeEnum.WAIT_FOR_AUDIT.getRemark(),
RiskResultTypeEnum.SEND_EMAIL_TO_BD.getResultType(),
RiskResultTypeEnum.WAIT_FOR_AUDIT.getResultType());
riskUploadService.deleteUploadMailKey(codeKey); riskUploadService.deleteUploadMailKey(codeKey);
} }

@ -0,0 +1,33 @@
package au.com.royalpay.payment.manage.riskbusiness.web;
import au.com.royalpay.payment.manage.riskbusiness.core.RiskProcessLogService;
import com.alibaba.fastjson.JSONObject;
import com.google.gson.JsonObject;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import javax.xml.bind.util.JAXBSource;
import java.util.List;
/**
* @Description:
* @Author: lujian
* @Date: 2018/11/22 15:52
*/
@RestController
@RequestMapping(value = "/risk/business/process/logs")
public class RiskProcessLogController {
@Resource
private RiskProcessLogService riskProcessLogService;
@GetMapping(value = "/{risk_id}")
public List<JSONObject> getRiskProcessLogs(@PathVariable("risk_id") String riskId) {
return riskProcessLogService.getRiskProcessLogs(riskId);
}
@PostMapping
public void addRiskProcessLog(@RequestBody JSONObject log) {
riskProcessLogService.addRiskProcessLog(log);
}
}

@ -1,9 +1,11 @@
package au.com.royalpay.payment.manage.support.attachment.web; package au.com.royalpay.payment.manage.support.attachment.web;
import au.com.royalpay.payment.channels.yeepay.runtime.YeePayClient;
import au.com.royalpay.payment.manage.permission.manager.RequireManager; import au.com.royalpay.payment.manage.permission.manager.RequireManager;
import au.com.royalpay.payment.manage.permission.manager.RequirePartner; import au.com.royalpay.payment.manage.permission.manager.RequirePartner;
import au.com.royalpay.payment.tools.connections.attachment.core.AttachmentClient; import au.com.royalpay.payment.tools.connections.attachment.core.AttachmentClient;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import com.yeepay.yop.sdk.service.kj.model.FileUploadResult;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartFile;
@ -20,6 +22,8 @@ import java.io.IOException;
public class AttachmentController { public class AttachmentController {
@Resource @Resource
private AttachmentClient attachmentClient; private AttachmentClient attachmentClient;
@Resource
private YeePayClient yeePayClient;
@RequestMapping(value = "/files", method = RequestMethod.POST) @RequestMapping(value = "/files", method = RequestMethod.POST)
@RequirePartner @RequirePartner
@ -27,6 +31,14 @@ public class AttachmentController {
public JSONObject uploadImage(@RequestParam MultipartFile file) throws IOException { public JSONObject uploadImage(@RequestParam MultipartFile file) throws IOException {
return attachmentClient.uploadFile(file,false); return attachmentClient.uploadFile(file,false);
} }
@RequestMapping(value = "/yeepayFiles", method = RequestMethod.POST)
@RequirePartner
@RequireManager
public FileUploadResult uploadYeepayImage(@RequestParam MultipartFile file) throws IOException {
return yeePayClient.uploadFile(file.getOriginalFilename(),"VOUCHER",file.getInputStream());
}
@RequestMapping(value = "/riskFiles", method = RequestMethod.POST) @RequestMapping(value = "/riskFiles", method = RequestMethod.POST)
public JSONObject uploadRiskImage(@RequestParam MultipartFile file) throws IOException { public JSONObject uploadRiskImage(@RequestParam MultipartFile file) throws IOException {
return attachmentClient.uploadFile(file,false); return attachmentClient.uploadFile(file,false);

@ -48,7 +48,7 @@ public class CustomerImpressionTask {
} }
for (List<JSONObject> splitClients : splitList) { for (List<JSONObject> splitClients : splitList) {
Runnable task = () -> splitClients.forEach((p) -> { Runnable task = () -> splitClients.forEach((p) -> {
System.out.println("当前执行到" + p.getIntValue("client_id")); // System.out.println("当前执行到" + p.getIntValue("client_id"));
customerImpressionService.generateTag(p.getIntValue("client_id")); customerImpressionService.generateTag(p.getIntValue("client_id"));
}); });
generatePool.execute(task); generatePool.execute(task);
@ -56,8 +56,8 @@ public class CustomerImpressionTask {
}); });
} }
@Scheduled(cron = "0/1 * * * * ?") // @Scheduled(cron = "0/1 * * * * ?")
public void customerImpressionGenerateInfo() { // public void customerImpressionGenerateInfo() {
synchronizedScheduler.executeProcess("manage_task:CustomerImpression", 1_000, () -> customerImpressionService.generateInfo()); // synchronizedScheduler.executeProcess("manage_task:CustomerImpression", 1_000, () -> customerImpressionService.generateInfo());
} // }
} }

@ -15,7 +15,7 @@ import java.util.Arrays;
import java.util.List; import java.util.List;
@Component @Component
@ConditionalOnProperty(value = "app.run-tasks", havingValue = "false") @ConditionalOnProperty(value = "app.run-tasks", havingValue = "true")
public class UpdatePartnerPasswordTask { public class UpdatePartnerPasswordTask {
private Logger logger = LoggerFactory.getLogger(getClass()); private Logger logger = LoggerFactory.getLogger(getClass());
@Resource @Resource

@ -20,6 +20,7 @@ import au.com.royalpay.payment.manage.mappers.payment.RefundAuditionMapper;
import au.com.royalpay.payment.manage.mappers.payment.RefundMapper; import au.com.royalpay.payment.manage.mappers.payment.RefundMapper;
import au.com.royalpay.payment.manage.mappers.payment.TransactionMapper; import au.com.royalpay.payment.manage.mappers.payment.TransactionMapper;
import au.com.royalpay.payment.manage.mappers.system.ClientAccountMapper; import au.com.royalpay.payment.manage.mappers.system.ClientAccountMapper;
import au.com.royalpay.payment.manage.mappers.system.ClientDeviceMapper;
import au.com.royalpay.payment.manage.mappers.system.CustomerMapper; import au.com.royalpay.payment.manage.mappers.system.CustomerMapper;
import au.com.royalpay.payment.manage.mappers.system.ManagerCustomerRelationAlipayMapper; import au.com.royalpay.payment.manage.mappers.system.ManagerCustomerRelationAlipayMapper;
import au.com.royalpay.payment.manage.merchants.core.ClientManager; import au.com.royalpay.payment.manage.merchants.core.ClientManager;
@ -139,6 +140,9 @@ public class TradeLogServiceImpl implements TradeLogService {
@Resource @Resource
private OrgManager orgManager; private OrgManager orgManager;
@Resource
private ClientDeviceMapper clientDeviceMapper;
// @Value("classpath:/jasper/trans_flow.jasper") // @Value("classpath:/jasper/trans_flow.jasper")
// @Value("classpath:/jasper/trans_flow_new.jasper") // @Value("classpath:/jasper/trans_flow_new.jasper")
@Value("classpath:/jasper/partner_invoice_gst.jasper") @Value("classpath:/jasper/partner_invoice_gst.jasper")
@ -670,6 +674,24 @@ public class TradeLogServiceImpl implements TradeLogService {
if (transFlow.getJSONArray("data").size() > 0) { if (transFlow.getJSONArray("data").size() > 0) {
try { try {
List<JSONObject> dataList = (List<JSONObject>) transFlow.get("data"); List<JSONObject> dataList = (List<JSONObject>) transFlow.get("data");
String transType;
JSONObject device;
int status;
for (JSONObject data : dataList) {
transType = data.getString("trans_type");
if (!"refund".equals(transType))
continue;
status = data.getIntValue("status");
if (status == 6)
transType = "Partly " + transType;
else if (status == 7) {
transType = "Fully " + transType;
}
data.put("trans_type", transType);
device = clientDeviceMapper.find(data.getString("order_dev_id"));
if (device != null)
data.put("dev_id", device.getString("client_dev_id"));
}
JSONObject parmerters = new JSONObject(); JSONObject parmerters = new JSONObject();
parmerters.put("dateFrom", StringUtils.isNotBlank(query.getDatefrom()) ? query.getDatefrom() : ""); parmerters.put("dateFrom", StringUtils.isNotBlank(query.getDatefrom()) ? query.getDatefrom() : "");
parmerters.put("dateTo", StringUtils.isNotBlank(query.getDateto()) ? query.getDateto() : DateFormatUtils.format(new Date(), "yyyyMMdd")); parmerters.put("dateTo", StringUtils.isNotBlank(query.getDateto()) ? query.getDateto() : DateFormatUtils.format(new Date(), "yyyyMMdd"));

@ -9,6 +9,7 @@ import au.com.royalpay.payment.tools.connections.mpsupport.MpWechatApiProvider;
import au.com.royalpay.payment.tools.connections.mpsupport.beans.TemplateMessage; import au.com.royalpay.payment.tools.connections.mpsupport.beans.TemplateMessage;
import au.com.royalpay.payment.tools.env.PlatformEnvironment; import au.com.royalpay.payment.tools.env.PlatformEnvironment;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import org.apache.commons.lang3.StringUtils;
import org.springframework.context.ApplicationListener; import org.springframework.context.ApplicationListener;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
@ -40,7 +41,7 @@ public class NoticeRefundAuditListener implements ApplicationListener<NewRefundA
audition.put("refund_id", newRefundAuditEvent.getRefundOrder().getString("refund_id")); audition.put("refund_id", newRefundAuditEvent.getRefundOrder().getString("refund_id"));
String operatorName = "anonymous"; String operatorName = "anonymous";
if (newRefundAuditEvent.getOperator() != null) { if (newRefundAuditEvent.getOperator() != null) {
audition.put("applyerid", newRefundAuditEvent.getOperator().getIntValue("operator_id")); audition.put("applyerid", newRefundAuditEvent.getOperator().getString("operator_id"));
operatorName = newRefundAuditEvent.getOperator().getString("operator"); operatorName = newRefundAuditEvent.getOperator().getString("operator");
audition.put("applyername", operatorName); audition.put("applyername", operatorName);
} }
@ -54,15 +55,14 @@ public class NoticeRefundAuditListener implements ApplicationListener<NewRefundA
for (JSONObject account : accounts) { for (JSONObject account : accounts) {
String wechatOpenid = account.getString("wechat_openid"); String wechatOpenid = account.getString("wechat_openid");
if (wechatOpenid == null) {
continue;
}
MpWechatApi api = mpWechatApiProvider.getApiFromOpenId(wechatOpenid); MpWechatApi api = mpWechatApiProvider.getApiFromOpenId(wechatOpenid);
if (api != null) { String templateId = api.getTemplateId("refund-audit-notice");
String templateId = api.getTemplateId("refund-audit-notice"); if (api != null && StringUtils.isNotEmpty(templateId)) {
if (templateId != null) { try {
TemplateMessage notice = initMessage(newRefundAuditEvent, operatorName, remark, client, order, templateId, wechatOpenid); TemplateMessage notice = initMessage(newRefundAuditEvent, operatorName, remark, client, order, templateId, wechatOpenid);
api.sendTemplateMessage(notice); api.sendTemplateMessage(notice);
} catch (Exception e) {
e.printStackTrace();
} }
} }

@ -254,7 +254,7 @@ public class RefundServiceImpl implements RefundService, ApplicationEventPublish
@Override @Override
public JSONObject auditionInfo(String auditionId, String openid) { public JSONObject auditionInfo(String auditionId, String openid) {
JSONObject account = clientManager.getAccountByOpenId("o32MzuO4s8c7iFOVxnxejkbhMoEc"); JSONObject account = clientManager.getAccountByOpenId(openid);
if (account == null || account.size() <= 0) { if (account == null || account.size() <= 0) {
throw new BadRequestException("You have no permission to audit an refund order"); throw new BadRequestException("You have no permission to audit an refund order");
} }
@ -389,8 +389,9 @@ public class RefundServiceImpl implements RefundService, ApplicationEventPublish
JSONObject res = new JSONObject(); JSONObject res = new JSONObject();
int clientId = account.getIntValue("client_id"); int clientId = account.getIntValue("client_id");
res.put("client", clientManager.getClientInfo(clientId)); res.put("client", clientManager.getClientInfo(clientId));
res.put("auditions", refundAuditionMapper.listAllAuditingRefundsOfClient(clientId)); List<JSONObject> auditions = refundAuditionMapper.listAuditingRefundsOfClient(clientId);
res.put("counts", refundAuditionMapper.listAuditingRefundsOfClient(clientId).size()); res.put("auditions", auditions);
res.put("counts", auditions.size());
return res; return res;
} }

@ -0,0 +1,15 @@
app.yeepay.merchant-id=
app.yeepay.app-key=cbp_120180219
app.yeepay.aes-secret-key=
app.yeepay.public-key.store-type=string
app.yeepay.public-key.cert-type=RSA2048
app.yeepay.public-key.value=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA6p0XWjscY+gsyqKRhw9MeLsEmhFdBRhT2emOck/F1Omw38ZWhJxh9kDfs5HzFJMrVozgU+SJFDONxs8UB0wMILKRmqfLcfClG9MyCNuJkkfm0HFQv1hRGdOvZPXj3Bckuwa7FrEXBRYUhK7vJ40afumspthmse6bs6mZxNn/mALZ2X07uznOrrc2rk41Y2HftduxZw6T4EmtWuN2x4CZ8gwSyPAW5ZzZJLQ6tZDojBK4GZTAGhnn3bg5bBsBlw2+FLkCQBuDsJVsFPiGh/b6K/+zGTvWyUcu+LUj2MejYQELDO3i2vQXVDk7lVi2/TcUYefvIcssnzsfCfjaorxsuwIDAQAB
app.yeepay.public-key.password=
app.yeepay.private-key.store-type=string
app.yeepay.private-key.cert-type=RSA2048
app.yeepay.private-key.value=MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCdaxJm3b5bvPZHvvXDfJ4NUiG7yISRYgUfiQycVKCJZ2jL+Y29Hmcnc1hPMZjVbJYPkhaIp+f92j7qf5P/qo+Ru4DyY3HhzsJAZMMWVlWeaEG+nZsyN06XC7NiUrFMLUAyqtaYRPDBKHKss54at16rQO7UoqXVqhKZyWdBgRbX0J3X0z82LEh11u8Izi/mUH42NY6ttkDsxBzXeNcT81RHrm9A/R/6AzzykFAPxGVdjjmbYnrk/WUwLDaKdf1RvDF/kWSCmbzQSX/D24UcDekd50TJHaqhjvBVFwLtiFWAO7xudEDhByfj22YOZuhuddyhJygkUI996IKtl+UFIfI1AgMBAAECggEATWTgBj0NIxNTTlDfib4SAuCXfziFnOjBNhDuZ0ngJ830oxxNiGaTNr0p9L2gs4WQfZVIiOVsVM1hU29n9zIHJhI2wnUL/4Xk0T35AFlv/NKrSCk6rUSt2etBxZx8WMSCpKaDnRd/+qeFQc2JdP8khzQEd/yDZfoY7Q0tO/JYpb++XMFYBRpLINYwH8xteTAeRGp1A5+UwvPMJelNeBlPqMqTAPruh/yLUvYg1/rJjkOUi0yOUyKhs+NJDOXdBcrSXswdJyMMITYQ9dhpWFz4/imklHDKk29+Oy5uEGB1OQvTW469Cm2b2suAyvI4oE1pAFb6dGz6uE9fwzJljM1+IQKBgQDshMwyOC3BmXOo54o92cUwYR0TJg0KHQAbJLirQxlX4ILUGxxEFsv2TdVzushYS/1K8zecz9VQnch19mo+qyxfdq/FNXe1DDXolnu2AoYVvqpeCXumjmz4v2dlBW2TTFvmUpy0QK2QImgBW1/sjI88OgiJHdyqaqR0ASMLB1mGWQKBgQCqYl82MSqUqRl2yTiW+h9lymlgXWl5qFx/J3YGMURz3Xq5qzK4swEYfHfmkofNNpTXwIbDjGGq/ipZZLmyLfS68PRnquJEwCyFX3cgXUKg8380nDPdUQxsLpvMupUuKjyNhN4twpy2A/Ti53UC7vx5J+Z/mVjE3QgaURIAEBSHPQKBgQCOI0x3za0p0KdiVSuN+gZ4CZSoglCJyF3c8heMzLk5R3I4N8an4K9YaPQjJZfrAFfLKBk+wuPmG7xxr9Gvsbzr7e657GTxR9JJ4c2c1y1vefL2qmpF8QfqAVUIr9dnExeTdgg4hzoHCbZJQnmGNf6KajHg/TI0s/v6vwgpQ5R4mQKBgDI3Kd574RPNPp7+sPn2H5jNbf8jqLldQF2NUMCEdqs7RDdCWIGM6C7CSEghOXrmsjlgGZe6YPKXU/3irMPxvWX3K+D9wRAIH1bzitV0BvYOrZfgzXxVrbaYifxtpRflBNGkriKIb81JHzxcgOTrcGd4tfs3Q61Jg2DWMdro4lP1AoGBAOJ8JLkbrODRvHp9fCy9cOiF0LD/fZBW49l6xQbx7lLtzbwa/nk672hFhzfy565j4ejywykVIOWmoMS5RqWXB07rbyF0OZrfEcLPArfXZ4iE6T9OZ2UJLK0gdUWz4oYWBRK7NQd5qEMOiUFy8YOGgT+dESVYwN2irwLikuET0S9a
app.yeepay.private-key.password=
app.yeepay.http-client.connect-timeout=30000
app.yeepay.http-client.read-timeout=30000
app.yeepay.http-client.max-conn-total=200
app.yeepay.http-client.max-conn-per-route=0

@ -1,6 +1,6 @@
server.port=5000 server.port=5000
spring.profiles.active=dev,alipay,bestpay,jd,wechat,rpay spring.profiles.active=dev,alipay,bestpay,jd,wechat,rpay,yeepay
env.company=RoyalPay env.company=RoyalPay
@ -56,7 +56,7 @@ app.agreetemplate.classic.path=https://file.royalpay.com.au/open/2017/07/10/1499
#app.agreetemplate.aggregate.path=https://file.royalpay.com.au/open/2017/11/10/1510280089107_D7CMUz4S1iwBI9IPj5P6ItkiGClmPK.pdf #app.agreetemplate.aggregate.path=https://file.royalpay.com.au/open/2017/11/10/1510280089107_D7CMUz4S1iwBI9IPj5P6ItkiGClmPK.pdf
app.agreetemplate.aggregate.path=https://file.royalpay.com.au/open/2017/11/17/1510890355946_hQt6yGc0NJ8TYeK7XCuuSAnTI31M7v.pdf app.agreetemplate.aggregate.path=https://file.royalpay.com.au/open/2017/11/17/1510890355946_hQt6yGc0NJ8TYeK7XCuuSAnTI31M7v.pdf
app.host.main=https://mpay.royalpay.com.au/ app.host.main=http://192.168.0.85:9002/
app.host.regions.cn=https://mpay-cn.royalpay.com.au/ app.host.regions.cn=https://mpay-cn.royalpay.com.au/
app.host.regions.au=https://mpay-au.royalpay.com.au/ app.host.regions.au=https://mpay-au.royalpay.com.au/
app.debug=true app.debug=true
@ -88,6 +88,7 @@ app.mail.host=https://mailsupport.royalpay.com.au
mail.send.credentialCode=Fd1aRfdjc9 mail.send.credentialCode=Fd1aRfdjc9
apple.message.apns.password=F1b5*ChJPp73 apple.message.apns.password=F1b5*ChJPp73
apple.message.apns.file=/opt/adn
android.message.secret=2b96d9bc6169c9554218aab1 android.message.secret=2b96d9bc6169c9554218aab1
android.message.appkey=3f33a10d0a7d4ac94d8f2431 android.message.appkey=3f33a10d0a7d4ac94d8f2431

@ -30,13 +30,12 @@
INNER JOIN ( INNER JOIN (
SELECT SELECT
c.client_id, c.client_id,
count(o.order_id) orders NULLIF (SUM(o.orders),0) orders
FROM sys_clients c FROM sys_clients c
LEFT JOIN pmt_orders o LEFT JOIN statistics_customer_order o
ON o.client_id = c.client_id AND o.status > 4 ON o.client_id = c.client_id AND o.total > 10
AND date(o.create_time) <= date(#{end}) AND date(o.date) <= date(#{end})
AND date(o.create_time) >= date(#{begin}) AND date(o.date) >= date(#{begin})
and o.total_amount>10
WHERE c.approve_result=1 and c.is_valid=1 WHERE c.approve_result=1 and c.is_valid=1
GROUP BY c.client_id GROUP BY c.client_id
) c ON c.client_id = r.client_id ) c ON c.client_id = r.client_id
@ -62,13 +61,13 @@
SELECT SELECT
c.client_id, c.client_id,
c.org_id, c.org_id,
count(o.order_id) orders NULLIF (SUM(o.orders),0) orders
FROM sys_clients c FROM sys_clients c
LEFT JOIN pmt_orders o LEFT JOIN statistics_customer_order o
ON o.client_id = c.client_id AND o.status > 4 ON o.client_id = c.client_id
AND date(o.create_time) <= date(#{end}) AND date(o.date) <= date(#{end})
AND date(o.create_time) >= date(#{begin}) AND date(o.date) >= date(#{begin})
and o.total_amount>10 and o.total>10
]]> ]]>
<if test="client_ids!=null"> <if test="client_ids!=null">
and c.client_id in and c.client_id in

@ -318,7 +318,9 @@
ifnull(sum(CASE WHEN s.channel = 'hf' THEN s.total ELSE 0 END),0) hfamount, ifnull(sum(CASE WHEN s.channel = 'hf' THEN s.total ELSE 0 END),0) hfamount,
ifnull(sum(CASE WHEN s.channel = 'hf' THEN s.orders ELSE 0 END),0) hf_order_count, ifnull(sum(CASE WHEN s.channel = 'hf' THEN s.orders ELSE 0 END),0) hf_order_count,
ifnull(sum(CASE WHEN s.channel = 'Rpay' THEN s.total ELSE 0 END),0) rpayamount, ifnull(sum(CASE WHEN s.channel = 'Rpay' THEN s.total ELSE 0 END),0) rpayamount,
ifnull(sum(CASE WHEN s.channel = 'Rpay' THEN s.orders ELSE 0 END),0) rpay_order_count ifnull(sum(CASE WHEN s.channel = 'Rpay' THEN s.orders ELSE 0 END),0) rpay_order_count,
ifnull(sum(CASE WHEN s.channel = 'Yeepay' THEN s.total ELSE 0 END),0) yeepayamount,
ifnull(sum(CASE WHEN s.channel = 'Yeepay' THEN s.orders ELSE 0 END),0) yeepay_order_count
FROM statistics_customer_order s FROM statistics_customer_order s
LEFT JOIN sys_clients c ON c.client_id = s.client_id and c.is_valid=1 LEFT JOIN sys_clients c ON c.client_id = s.client_id and c.is_valid=1
]]> ]]>

@ -197,10 +197,9 @@
</select> </select>
<select id="listCustomersData" resultType="com.alibaba.fastjson.JSONObject"> <select id="listCustomersData" resultType="com.alibaba.fastjson.JSONObject">
SELECT r.nickname,r.headimg,o.customer_id,sum(if(t.transaction_type='Credit',t.clearing_amount,0)) amount, SELECT r.nickname,r.headimg,o.customer_id,sum(if(o.status='5',o.customer_payment_amount,0)) amount,
COUNT(DISTINCT o.order_id) orders,max(t.clearing_amount) max_order COUNT(DISTINCT o.order_id) orders,max(o.customer_payment_amount) max_order
FROM pmt_orders o FROM pmt_orders o
INNER JOIN pmt_transactions t on t.order_id=o.order_id and t.system_generate=0 and (t.transaction_type='Credit' or t.transaction_type>0)
<if test="openid_type==4"> <if test="openid_type==4">
LEFT JOIN sys_customer_relation r on r.globalpay_openid = o.customer_id LEFT JOIN sys_customer_relation r on r.globalpay_openid = o.customer_id
</if> </if>
@ -236,9 +235,8 @@
</select> </select>
<select id="listCustomersDataAnalysis" resultType="com.alibaba.fastjson.JSONObject"> <select id="listCustomersDataAnalysis" resultType="com.alibaba.fastjson.JSONObject">
SELECT sum(if(t.transaction_type='Credit',t.clearing_amount,0)) total_amount SELECT sum(if(o.status='5',o.customer_payment_amount,0)) total_amount
FROM pmt_orders o FROM pmt_orders o
INNER JOIN pmt_transactions t on t.order_id=o.order_id and t.system_generate=0 and (t.transaction_type='Credit' or t.refund_id is not null)
<where> <where>
<if test="begin!=null">and o.create_time &gt;= #{begin}</if> <if test="begin!=null">and o.create_time &gt;= #{begin}</if>
<if test="end!=null">and o.create_time &lt; #{end}</if> <if test="end!=null">and o.create_time &lt; #{end}</if>

@ -35,6 +35,29 @@
</where> </where>
</select> </select>
<!--统计cny_amount-->
<select id="getCnyAmount" resultType="java.math.BigDecimal">
<![CDATA[
SELECT ifnull(sum(if(l.transaction_type = 'Credit',l.cny_amount,-l.cny_amount)), 0)
FROM pmt_transactions l
INNER JOIN pmt_orders o ON o.order_id = l.order_id AND o.create_time >= #{begin} AND
o.create_time <= #{end}
WHERE (l.transaction_type = 'Credit' or l.refund_id is not null)
]]>
<if test="client_ids!=null">
AND o.client_id IN
<foreach collection="client_ids" open="(" close=")" separator="," item="client_id">
#{client_id}
</foreach>
</if>
<if test="client_ids==null and client_id != null">
and o.client_id=#{client_id}
</if>
<if test="org_id!=null and org_ids==null">and l.org_id=#{org_id}</if>
<if test="org_ids!=null">and l.org_id in
<foreach collection="org_ids" item="org_id" open="(" close=")" separator=",">#{org_id}</foreach></if>
</select>
<select id="analysisTotalAmount" resultType="java.math.BigDecimal"> <select id="analysisTotalAmount" resultType="java.math.BigDecimal">
<![CDATA[ <![CDATA[
SELECT ifnull(sum(if(l.transaction_type = 'Credit',l.clearing_amount,-l.clearing_amount)), 0) SELECT ifnull(sum(if(l.transaction_type = 'Credit',l.clearing_amount,-l.clearing_amount)), 0)
@ -871,4 +894,6 @@
WHERE o.order_id = #{order_id} WHERE o.order_id = #{order_id}
LIMIT 1; LIMIT 1;
</select> </select>
</mapper> </mapper>

@ -2,10 +2,12 @@
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" > <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="au.com.royalpay.payment.manage.mappers.payment.CommonSubMerchantIdMapper"> <mapper namespace="au.com.royalpay.payment.manage.mappers.payment.CommonSubMerchantIdMapper">
<select id="list" resultType="com.alibaba.fastjson.JSONObject"> <select id="list" resultType="com.alibaba.fastjson.JSONObject">
select * from pmt_sub_merchant_id select p.*, count(c.client_id) client_count from pmt_sub_merchant_id p
where is_valid = #{is_valid} left join sys_clients c on p.sub_merchant_id = c.sub_merchant_id
where p.is_valid = #{is_valid}
<if test="sub_merchant_id!=null"> <if test="sub_merchant_id!=null">
and sub_merchant_id = #{sub_merchant_id} and p.sub_merchant_id = #{sub_merchant_id}
</if> </if>
GROUP BY p.sub_merchant_id
</select> </select>
</mapper> </mapper>

@ -739,17 +739,10 @@
</where> </where>
</select> </select>
<!--
由于当时定的是order_id, 所以是根据order_id查的
现在要改成依据system_transaction_id查
直接改成t.system_transaction_id = #{order_id}
否则要改的地方太多了,
所以这里的参数order_id其实是system_transaction_id
特此说明!
-->
<select id="findOrderById" resultType="com.alibaba.fastjson.JSONObject"> <select id="findOrderById" resultType="com.alibaba.fastjson.JSONObject">
SELECT SELECT
o.order_id order_id, o.order_id order_id,
t.system_transaction_id,
o.currency, o.currency,
o.channel, o.channel,
o.create_time, o.create_time,
@ -808,8 +801,9 @@
WHEN 14 WHEN 14
THEN '账单链接' THEN '账单链接'
END AS gateway, END AS gateway,
p.client_moniker partner_code, p.client_moniker client_moniker,
p.short_name partner_name, p.short_name partner_name,
p.company_name,
format(t.clearing_amount,2) clearing_amount format(t.clearing_amount,2) clearing_amount
FROM pmt_orders o FROM pmt_orders o
INNER JOIN sys_clients p INNER JOIN sys_clients p
@ -819,7 +813,7 @@
AND t.refund_id IS NULL AND t.refund_id IS NULL
AND t.transaction_type = 'Credit' AND t.transaction_type = 'Credit'
AND t.channel != 'System' AND t.channel != 'System'
WHERE t.system_transaction_id = #{order_id} AND p.client_id = #{client_id} WHERE t.order_id = #{order_id} AND p.client_id = #{client_id}
</select> </select>
<select id="listHalloweenActOrder" resultType="com.alibaba.fastjson.JSONObject"> <select id="listHalloweenActOrder" resultType="com.alibaba.fastjson.JSONObject">

@ -51,6 +51,8 @@
<select id="listTransFlow" resultType="com.alibaba.fastjson.JSONObject"> <select id="listTransFlow" resultType="com.alibaba.fastjson.JSONObject">
SELECT t.*, SELECT t.*,
o.status,
o.dev_id order_dev_id,
ifnull(o.client_order_id,'--') client_order_id, ifnull(o.client_order_id,'--') client_order_id,
if(t.channel='Settlement','clearing', if(t.channel='Settlement','clearing',
if(t.transaction_type='Credit','payment','refund')) trans_type, if(t.transaction_type='Credit','payment','refund')) trans_type,
@ -844,7 +846,8 @@ select sum(if(temp.transaction_type='Credit',temp.clearing_amount*d.proportion,
o.gateway, o.gateway,
r.out_refund_id, r.out_refund_id,
r.client_refund_id, r.client_refund_id,
o.order_detail o.order_detail,
o.dev_id
FROM pmt_transactions t FROM pmt_transactions t
LEFT JOIN pmt_orders o ON o.order_id = t.order_id LEFT JOIN pmt_orders o ON o.order_id = t.order_id
LEFT JOIN pmt_refunds r ON r.refund_id = t.refund_id LEFT JOIN pmt_refunds r ON r.refund_id = t.refund_id

@ -23,6 +23,9 @@
re.in_user_blacklist, re.in_user_blacklist,
re.processed_remark, re.processed_remark,
re.create_time, re.create_time,
re.alipay_materials,
re.is_send_client,
re.real_order_ids,
sc.industry, sc.industry,
sc.short_name, sc.short_name,
IFNULL(sc.sub_merchant_id, re.sub_merchant_id) sub_merchant_id IFNULL(sc.sub_merchant_id, re.sub_merchant_id) sub_merchant_id
@ -30,26 +33,11 @@
LEFT JOIN sys_clients sc LEFT JOIN sys_clients sc
ON re.client_moniker = sc.client_moniker ON re.client_moniker = sc.client_moniker
<if test="start_amount != null || end_amount != null"> <if test="start_amount != null || end_amount != null">
RIGHT JOIN( RIGHT JOIN
SELECT distinct re.risk_id (SELECT DISTINCT(risk_id) FROM risk_orders
FROM WHERE #{start_amount} &lt;= clearing_amount AND #{end_amount} &gt; clearing_amount) ro
risk_event re, ON re.risk_id = ro.risk_id
risk_event_help reh
<where>
reh.risk_event_help_id &lt; (LENGTH(re.order_amounts) - LENGTH(REPLACE(re.order_amounts, ',' , ''))) + 1
<if test="start_amount != null">
AND cast(SUBSTRING_INDEX(SUBSTRING_INDEX(order_amounts,',',reh.risk_event_help_id + 1),',',-1) as signed) &gt;= #{start_amount}
</if>
<if test="end_amount != null">
AND cast(SUBSTRING_INDEX(SUBSTRING_INDEX(order_amounts,',',reh.risk_event_help_id + 1),',',-1) as signed) &lt;= #{end_amount}
</if>
</where>
) temp
on re.risk_id = temp.risk_id
</if> </if>
<if test="bd_id != null"> <if test="bd_id != null">
INNER JOIN( INNER JOIN(
SELECT DISTINCT client_id SELECT DISTINCT client_id
@ -66,10 +54,15 @@
<if test="risk_id != null"> <if test="risk_id != null">
AND re.risk_id = #{risk_id} AND re.risk_id = #{risk_id}
</if> </if>
<if test="client_moniker != null"> <if test="client_moniker != null">
AND re.client_moniker = #{client_moniker} AND re.client_moniker = #{client_moniker}
</if> </if>
<if test="is_send_client != null">
AND re.is_send_client = #{is_send_client}
</if>
<if test="order_types != null"> <if test="order_types != null">
<foreach collection="order_types" item="order_type_item" open="and re.order_type in (" close=")" separator=","> <foreach collection="order_types" item="order_type_item" open="and re.order_type in (" close=")" separator=",">
#{order_type_item} #{order_type_item}
@ -93,19 +86,244 @@
<if test="order_ids != null"> <if test="order_ids != null">
AND re.order_ids LIKE CONCAT('%', #{order_ids}, '%') AND re.order_ids LIKE CONCAT('%', #{order_ids}, '%')
</if> </if>
<if test="sub_merchant_id != null"> <if test="sub_merchant_id != null">
AND sc.sub_merchant_id = #{sub_merchant_id} AND sc.sub_merchant_id = #{sub_merchant_id}
</if> </if>
<if test="industry != null"> <if test="industry != null">
AND sc.industry = #{industry} AND sc.industry = #{industry}
</if> </if>
<if test="receive_email_date != null">
AND re.receive_email_date = #{receive_email_date} <if test="receive_email_date_begin != null">
AND re.receive_email_date &gt;= #{receive_email_date_begin}
</if>
<if test="receive_email_date_end != null">
AND re.receive_email_date &lt;= #{receive_email_date_end}
</if>
<if test="reply_email_date_begin != null">
AND re.reply_email_date &gt;= #{reply_email_date_begin}
</if>
<if test="reply_email_date_end != null">
AND re.reply_email_date &lt;= #{reply_email_date_begin}
</if>
<if test="real_order_ids != null">
AND re.real_order_ids = #{real_order_ids}
</if>
</where>
</select>
<select id="analysisByIndustry" resultType="com.alibaba.fastjson.JSONObject">
SELECT
count(*) amount,
CASE sc.industry
WHEN 327
THEN '鞋包服饰'
WHEN 339
THEN '机票行业'
WHEN 356
THEN '软件服务'
WHEN 357
THEN '旅游票务'
WHEN 358
THEN '国际租车'
WHEN 359
THEN '医疗服务(出国)'
WHEN 360
THEN '医疗服务(不出国)'
WHEN 361
THEN '留学教育(网络教育)'
WHEN 362
THEN '留学教育(一年及以下)'
WHEN 338
THEN '其它货物贸易行业'
WHEN 337
THEN '文具/办公用品'
WHEN 336
THEN '综合商城'
WHEN 328
THEN '酒店行业'
WHEN 329
THEN '教育行业'
WHEN 330
THEN '国际物流'
WHEN 332
THEN '数码电器'
WHEN 333
THEN '母婴'
WHEN 334
THEN '化妆品'
WHEN 335
THEN '食品'
WHEN 363
THEN '留学教育(一年以上)'
WHEN 331
THEN '其它服务行业'
WHEN null
THEN '未知行业'
END AS `industry`
FROM risk_event re
LEFT JOIN sys_clients sc
ON re.client_moniker = sc.client_moniker
<if test="start_amount != null || end_amount != null">
RIGHT JOIN
(SELECT DISTINCT(risk_id) FROM risk_orders
WHERE #{start_amount} &lt;= clearing_amount AND #{end_amount} &gt; clearing_amount) ro
ON re.risk_id = ro.risk_id
</if>
<where>
<if test="risk_id != null">
AND re.risk_id = #{risk_id}
</if>
<if test="client_moniker != null">
AND re.client_moniker = #{client_moniker}
</if> </if>
<if test="reply_email_date != null">
AND re.reply_email_date = #{reply_email_date} <if test="is_send_client != null">
AND re.is_send_client = #{is_send_client}
</if> </if>
<if test="order_types != null">
<foreach collection="order_types" item="order_type_item" open="and re.order_type in (" close=")" separator=",">
#{order_type_item}
</foreach>
</if>
<if test="order_type != null">
AND re.order_type = #{order_type}
</if>
<if test="result_types != null">
<foreach collection="result_types" item="result_type_item" open="AND re.result_type IN (" close=")" separator=",">
#{result_type_item}
</foreach>
</if>
<if test="result_type != null">
AND re.result_type = #{result_type}
</if>
<if test="order_ids != null">
AND re.order_ids LIKE CONCAT('%', #{order_ids}, '%')
</if>
<if test="sub_merchant_id != null">
AND sc.sub_merchant_id = #{sub_merchant_id}
</if>
<if test="industry != null">
AND sc.industry = #{industry}
</if>
<if test="receive_email_date_begin != null">
AND re.receive_email_date &gt;= #{receive_email_date_begin}
</if>
<if test="receive_email_date_end != null">
AND re.receive_email_date &lt;= #{receive_email_date_end}
</if>
<if test="reply_email_date_begin != null">
AND re.reply_email_date &gt;= #{reply_email_date_begin}
</if>
<if test="reply_email_date_end != null">
AND re.reply_email_date &lt;= #{reply_email_date_begin}
</if>
<if test="real_order_ids != null">
AND re.real_order_ids = #{real_order_ids}
</if>
</where>
GROUP BY sc.industry
</select>
<select id="analysisByAmount" resultType="com.alibaba.fastjson.JSONObject">
SELECT
ELT(INTERVAL(ro.clearing_amount,0, 500, 1000, 1500,2000,2500,3000,3500,4000,4500,5000,5500,6000,6500,7000,7500,8000,8500,9000,999999),
'0-500','500-1000','1000-1500','1500-2000','2000-2500','2500-3000','3000-3500','3500-4000','4000-4500','4500-5000','5000-5500','5500-6000',
'6000-6500','6500-7000','7000-7500','7500-8000','8000-8500','8500-9000','>9000') intervals,COUNT(ro.order_id) amount
FROM risk_event re
LEFT JOIN sys_clients sc
ON re.client_moniker = sc.client_moniker
RIGHT JOIN
(SELECT * FROM risk_orders
<if test="start_amount != null || end_amount != null">
WHERE #{start_amount} &lt;= clearing_amount AND #{end_amount} &gt; clearing_amount
</if>
) ro
ON re.risk_id = ro.risk_id
<where>
<if test="risk_id != null">
AND re.risk_id = #{risk_id}
</if>
<if test="client_moniker != null">
AND re.client_moniker = #{client_moniker}
</if>
<if test="is_send_client != null">
AND re.is_send_client = #{is_send_client}
</if>
<if test="order_types != null">
<foreach collection="order_types" item="order_type_item" open="and re.order_type in (" close=")" separator=",">
#{order_type_item}
</foreach>
</if>
<if test="order_type != null">
AND re.order_type = #{order_type}
</if>
<if test="result_types != null">
<foreach collection="result_types" item="result_type_item" open="AND re.result_type IN (" close=")" separator=",">
#{result_type_item}
</foreach>
</if>
<if test="result_type != null">
AND re.result_type = #{result_type}
</if>
<if test="order_ids != null">
AND re.order_ids LIKE CONCAT('%', #{order_ids}, '%')
</if>
<if test="sub_merchant_id != null">
AND sc.sub_merchant_id = #{sub_merchant_id}
</if>
<if test="industry != null">
AND sc.industry = #{industry}
</if>
<if test="receive_email_date_begin != null">
AND re.receive_email_date &gt;= #{receive_email_date_begin}
</if>
<if test="receive_email_date_end != null">
AND re.receive_email_date &lt;= #{receive_email_date_end}
</if>
<if test="reply_email_date_begin != null">
AND re.reply_email_date &gt;= #{reply_email_date_begin}
</if>
<if test="reply_email_date_end != null">
AND re.reply_email_date &lt;= #{reply_email_date_begin}
</if>
<if test="real_order_ids != null">
AND re.real_order_ids = #{real_order_ids}
</if>
</where> </where>
GROUP BY ELT(INTERVAL(ro.clearing_amount,0, 500, 1000, 1500,2000,2500,3000,3500,4000,4500,5000,5500,6000,6500,7000,7500,8000,8500,9000,999999),
'0-500','500-1000','1000-1500','1500-2000','2000-2500','2500-3000','3000-3500','3500-4000','4000-4500','4500-5000','5000-5500','5500-6000',
'6000-6500','6500-7000','7000-7500','7500-8000','8000-8500','8500-9000','>9000')
ORDER BY intervals
</select> </select>
</mapper> </mapper>

@ -88,7 +88,7 @@ todo.bd.order=The merchant managed by you is transferred. Please submit the mate
app.message.title.payment=Payment Message app.message.title.payment=Payment Message
app.message.body.payment=You have received a payment of app.message.body.payment=You have received a payment of
app.message.title.risk=Risk Control Message app.message.title.risk=Risk Control Message
app.message.body.risk=You have received a risk control reminder. Please check the email for details. app.message.body.risk=You have received a risk control reminder. Please handle as soon as possible.
app.message.title.notice=System Message app.message.title.notice=System Message
app.message.body.refund=Your refund request has been sent,refund count is app.message.body.refund=Your refund request has been sent,refund count is
app.message.body.cashback=You got a cashback of app.message.body.cashback=You got a cashback of

@ -84,7 +84,7 @@ todo.bd.order=有商户被调单,请尽快提交材料
app.message.title.payment=到账通知 app.message.title.payment=到账通知
app.message.body.payment=您有一笔新的到账, app.message.body.payment=您有一笔新的到账,
app.message.title.risk=风控通知 app.message.title.risk=风控通知
app.message.body.risk=您收到了一条风控提醒,详情请查看邮件 app.message.body.risk=您收到了一条风控提醒,请及时处理
app.message.title.notice=系统通知 app.message.title.notice=系统通知
app.message.body.refund=退款申请已提交渠道方处理,退款金额 app.message.body.refund=退款申请已提交渠道方处理,退款金额
app.message.body.cashback=您获得了一笔ROYALPAY返现金额 app.message.body.cashback=您获得了一笔ROYALPAY返现金额

@ -0,0 +1,32 @@
<html xmlns:th="http://www.thymeleaf.org" lang="zh">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width,initial-scale=1.0">
</head>
<body>
<div style="width: 91%;border: 1px #F2F2F2 solid;margin: 0 auto; ">
<div style="height: 3%;background-color: #F2F2F2;"></div>
<div style="text-align: center;margin-top: 2.5%;">
<img th:src="${img_url}"/>
</div>
<div style="width: 80.3%;margin: 0 auto;">
<p>您好,<span th:text="${name}"></span></p>
<p>您有一笔收款信息如下:</p>
<div style="border: 1px #EAEAEA solid;margin-bottom: 5.5%;font-size: 12px;">
<p style="margin-left: 3%;">RoyalPay到账提醒</p>
<ul>
<li style="margin-bottom: 6px;">支付渠道:<span style="color: #EE6723;" th:text="${channel}"></span></li>
<li style="margin-bottom: 6px;">订单编号:<span style="color: #EE6723;" th:text="${order_id}"></span></li>
<li style="margin-bottom: 6px;">收款金额:<span style="color: #EE6723;" th:text="${currency}"></span>&nbsp;<span style="color: #EE6723;" th:text="${amount}"></span></li>
<li style="margin-bottom: 6px;">到账时间:<span style="color: #EE6723;" th:text="${time}"></span></li>
</ul>
</div>
<span>此致</span><br />
<span>RoyalPay</span>
</div>
<div style="height: 3%;background-color: #F2F2F2;margin-top: 6.5%;"></div>
</div>
</body>
</html>

@ -1,14 +1,29 @@
<html xmlns:th="http://www.thymeleaf.org" lang="zh"> <html xmlns:th="http://www.thymeleaf.org" lang="zh">
<div th:if="${order_type==1||order_type==2}"> <div th:if="${order_type==1||order_type==2}">
<b>Dear <span th:text="${bdNamesStr}"></span> :</b> <b>Dear <span th:text="${bdNamesStr}" th:if="${is_send_client==0}"></span><span th:text="${client.contact_person}" th:if="${is_send_client==1}"></span>:</b>
<p> <p>
<span th:text="${hello}"></span><span th:text="${bdNamesStr}"></span> <span th:text="${hello}"></span><span th:text="${bdNamesStr}" th:if="${is_send_client==0}"></span><span th:text="${client.contact_person}" th:if="${is_send_client==1}"></span>
<span th:if="${refuse}">,您提交的风控材料已被拒绝</span>。 请于 <span th:if="${refuse}">,您提交的风控材料已被拒绝</span>
<span th:if="${refuse_description != null}">
拒绝理由:<span th:text="${refuse_description}" style="background-color: yellow"></span>
</span>
请于
<span th:text="${reply_date}" style="background: #FCE824;"></span> <span th:text="${reply_date}" style="background: #FCE824;"></span>
<span style="background: #FCE824;">下午5:00悉尼时间</span>提供腾讯被查商户 <span style="background: #FCE824;">下午5:00悉尼时间</span>提供腾讯被查商户
<span th:text="${client.short_name}"></span> (<span th:text="${client.client_moniker}"></span>)的以下材料: <span th:text="${client.short_name}"></span> (<span th:text="${client.client_moniker}"></span>)的以下材料:
</p> </p>
<p>
<span th:if="${refuse}">Your submission of risk materials has been rejected. </span>
<span th:if="${refuse_description != null}">
Reasons for rejection<span th:text="${refuse_description}" style="background-color: yellow"></span>.
</span>
Please submit the following risk materials of merchant PINE
<span style="background: #FCE824;">before 29/11/2018(Sydney time). </span>
</p>
<p>1、请提供以下被查单号的小票 物流单据(如有邮寄产品的情况), 以及消费者与买家的聊天记录等来佐证被查交易单号。 被查交易单号如下:</p> <p>1、请提供以下被查单号的小票 物流单据(如有邮寄产品的情况), 以及消费者与买家的聊天记录等来佐证被查交易单号。 被查交易单号如下:</p>
<p>1. Please submit the materials including invoices, courier receipts (if have posted products), and chatting records or scene of consumption which can prove the facticity of the following reviewed orders. The reviewed orders as follows:</p>
<table style="border: 1.0px solid;border-collapse: collapse;"> <table style="border: 1.0px solid;border-collapse: collapse;">
<thead> <thead>
<tr> <tr>
@ -35,9 +50,17 @@
</tr> </tr>
</tbody> </tbody>
</table> </table>
<p th:if="${description != null}">2、<span th:text="${description}"></span></p>
<p>如果提交的材料不齐, 则有关停支付的风险。<!--还请按时提供商户材料并直接回复该邮件, -->感谢,辛苦。</p> <p>如果提交的材料不齐, 则有关停支付的风险。<!--还请按时提供商户材料并直接回复该邮件, -->感谢,辛苦。</p>
<!--<p>请点击此链接上传所需材料<a th:href="${uploadUrl}"><span th:text="${uploadUrl}"></span></a></p>--> <!--<p>请点击此链接上传所需材料<a th:href="${uploadUrl}"><span th:text="${uploadUrl}"></span></a></p>-->
<p><a th:href="${uploadUrl}" style="color: rgb(255, 255, 255); text-align: center; padding: 12px 10px; height: 100%; border-top-left-radius: 4px; border-top-right-radius: 4px; border-bottom-right-radius: 4px; border-bottom-left-radius: 4px; text-decoration: none; background-color: #00c0ef; min-width: 150px;"><strong>Submit Risk Materials</strong></a></p> <p th:if="${is_send_client==1}">材料请通过APP在规定时间内进行上传或请联系BD由BD在后台进行上传。</p>
<p>
If you can not provide qualified materials on time, the payment channels would be suspended or restricted with amount limit. Please be sure to assist the investigation. Thanks.
</p>
<p th:if="${is_send_client==1}">
The materials can be uploaded by RoyalPay APP within the required time, or contact with BD.
</p>
<p th:if="${is_send_client==0}"><a th:href="${uploadUrl}" style="color: rgb(255, 255, 255); text-align: center; padding: 12px 10px; height: 100%; border-top-left-radius: 4px; border-top-right-radius: 4px; border-bottom-right-radius: 4px; border-bottom-left-radius: 4px; text-decoration: none; background-color: #00c0ef; min-width: 150px;"><strong>Submit Risk Materials</strong></a></p>
</div> </div>
<div th:if="${order_type==3}"> <div th:if="${order_type==3}">
<b>尊敬的RoyalPay商户 :<br> <b>尊敬的RoyalPay商户 :<br>
@ -45,6 +68,9 @@
<p th:if="${refuse}" style="background-color: #dd0000">您提交的风控材料已被拒绝。<br> <p th:if="${refuse}" style="background-color: #dd0000">您提交的风控材料已被拒绝。<br>
The risk materials you submitted has been rejected The risk materials you submitted has been rejected
</p> </p>
<p th:if="${refuse_description != null}">
拒绝理由:<span th:text="${refuse_description}" style="background-color: yellow"></span>
</p>
<p>近期由于我们的风控系统检测到您的交易异常<span th:if="${royalpay_order_type==1}">已暂时将您的清算周期调整为T+<span th:text="${client.clean_days}"></span></span>,还请您提供以下材料,还原附件中列明的交易的真实背景:<br> <p>近期由于我们的风控系统检测到您的交易异常<span th:if="${royalpay_order_type==1}">已暂时将您的清算周期调整为T+<span th:text="${client.clean_days}"></span></span>,还请您提供以下材料,还原附件中列明的交易的真实背景:<br>
RoyalPay's risk management system recently has identified abnormal transactions from your records<span th:if="${royalpay_order_type==1}">, clean days has been adjusted to T+<span th:text="${client.clean_days}"></span></span>.so please provide us with following materials to assist in verifying the real scenario of the transactions attached:</p> RoyalPay's risk management system recently has identified abnormal transactions from your records<span th:if="${royalpay_order_type==1}">, clean days has been adjusted to T+<span th:text="${client.clean_days}"></span></span>.so please provide us with following materials to assist in verifying the real scenario of the transactions attached:</p>
<p>1.请解释相应的消费场景/业务模式,例如网站商城,扫码支付, 消费者到店支付等;<br> <p>1.请解释相应的消费场景/业务模式,例如网站商城,扫码支付, 消费者到店支付等;<br>
@ -103,7 +129,8 @@
<!--<p>请点击此链接上传所需材料。<a th:href="${uploadUrl}"><span th:text="${uploadUrl}"></span></a><br>--> <!--<p>请点击此链接上传所需材料。<a th:href="${uploadUrl}"><span th:text="${uploadUrl}"></span></a><br>-->
<!--Please click on this link to upload the required materials.<a th:href="${uploadUrl}"><span th:text="${uploadUrl}"></span></a>--> <!--Please click on this link to upload the required materials.<a th:href="${uploadUrl}"><span th:text="${uploadUrl}"></span></a>-->
<!--</p>--> <!--</p>-->
<p><a th:href="${uploadUrl}" style="color: rgb(255, 255, 255); text-align: center; padding: 12px 10px; height: 100%; border-top-left-radius: 4px; border-top-right-radius: 4px; border-bottom-right-radius: 4px; border-bottom-left-radius: 4px; text-decoration: none; background-color: #00c0ef; min-width: 150px;"><strong>Submit Risk Materials</strong></a></p> <p th:if="${is_send_client==0}"><a th:href="${uploadUrl}" style="color: rgb(255, 255, 255); text-align: center; padding: 12px 10px; height: 100%; border-top-left-radius: 4px; border-top-right-radius: 4px; border-bottom-right-radius: 4px; border-bottom-left-radius: 4px; text-decoration: none; background-color: #00c0ef; min-width: 150px;"><strong>Submit Risk Materials</strong></a></p>
<p th:if="${is_send_client==1}">材料请通过APP在规定时间内进行上传或请联系BD由BD在后台进行上传。</p>
</div> </div>
<div th:if="${order_type==4}"> <div th:if="${order_type==4}">
<b>尊敬的RoyalPay商户 :<br> <b>尊敬的RoyalPay商户 :<br>

@ -1,7 +1,7 @@
<html xmlns:th="http://www.thymeleaf.org" lang="zh"> <html xmlns:th="http://www.thymeleaf.org" lang="zh">
<b>Dear RoyalPay Merchant/BD :</b> <b>Dear RoyalPay Merchant/BD :</b>
<p>您好,您的风控材料链接即将过期,请及时提交风控材料。未能按时提交完整证明材料,支付渠道将被关停,请您务必配合调查。感谢。</p> <p>您好,您的风控材料—<span th:text="${client.company_name}"></span><span th:text="${client.client_moniker}"></span>】提交期限即将于<span style="background: #FCE824" th:text="${reply_date}"></span>期,请及时提交风控材料。未能按时提交完整证明材料,支付渠道将被关停,请您务必配合调查。感谢。</p>
<p>Your link to the risk materials is about to expire, please submit the risk materials in time.If you can not provide qualified materials on time, the payment channels would be suspended or restricted with amount limit. Please be sure to assist the investigation. Thanks.</p> <p>Your deadline for submission of risk materials for <span th:text="${client.company_name}"></span><span th:text="${client.client_moniker}"></span>】 is about to expire by <span th:text="${reply_date_english}" style="background: #FCE824"></span>, please submit the risk materials in time.If you can not provide qualified materials on time, the payment channels would be suspended or restricted with amount limit. Please be sure to assist the investigation. Thanks.</p>
<h4>Best Regards</h4> <h4>Best Regards</h4>
<p> <p>
<img style="width: 120px;height: 120px" <img style="width: 120px;height: 120px"

@ -14,7 +14,7 @@
<script type="text/javascript" src="/static/lib/jquery/jquery-2.1.4.min.js"></script> <script type="text/javascript" src="/static/lib/jquery/jquery-2.1.4.min.js"></script>
<script type="text/javascript" src="/static/templates/disable_wechat_menu.js?t=201607070231"></script> <script type="text/javascript" src="/static/templates/disable_wechat_menu.js?t=201607070231"></script>
<style type="text/css"> <style type="text/css">
.result{ .result {
text-align: center; text-align: center;
margin: auto; margin: auto;
margin-top: 20px; margin-top: 20px;
@ -23,15 +23,17 @@
font-weight: bold; font-weight: bold;
color: #000; color: #000;
} }
.result img{
.result img {
margin-top: 30px; margin-top: 30px;
height: 100px; height: 100px;
} }
</style> </style>
</head> </head>
<body style="margin: 0;padding: 0;"> <body style="margin: 0;padding: 0;">
<div class="result"><img src="/static/images/pay_success.png"> <div class="result"><img src="/static/images/completed.png">
<div style="margin-top: 10%;font-size:32px;color: #008d4c;text-align: center;width: 100%;font-weight: bold;">Success <div style="margin-top: 10%;font-size:32px;color: #008d4c;text-align: center;width: 100%;font-weight: bold;">Success
</div>
</div> </div>
</body> </body>
</html> </html>

@ -0,0 +1,107 @@
<!doctype html>
<html>
<head>
<title>Refund Audition</title>
<meta name="viewport" content="width=device-width,initial-scale=1,user-scalable=0">
<link rel="stylesheet" type="text/css" href="/static/lib/weui/weui.min.css">
<script type="text/javascript" src="//res.wx.qq.com/open/js/jweixin-1.0.0.js"></script>
<script type="text/javascript" src="/static/lib/jquery/jquery-2.1.4.min.js"></script>
<script type="text/javascript" src="/static/templates/disable_wechat_menu.js?t=201607070231"></script>
<style type="text/css">
.weui_cell_ft {
max-width: 60%;
white-space: normal
}
</style>
<script type="text/javascript" data-th-inline="javascript">
window.refund_audit_id = /*[[${id}]]*/'';
</script>
<script type="text/javascript" src="/static/templates/refund_audit.js?t=201607241231"></script>
</head>
<body>
<div id="wdiv" class="weui_loading_toast" style="display:none;">
<div class="weui_mask_transparent"></div>
<div class="weui_toast">
<div class="weui_loading">
<div class="weui_loading_leaf weui_loading_leaf_0"></div>
<div class="weui_loading_leaf weui_loading_leaf_1"></div>
<div class="weui_loading_leaf weui_loading_leaf_2"></div>
<div class="weui_loading_leaf weui_loading_leaf_3"></div>
<div class="weui_loading_leaf weui_loading_leaf_4"></div>
<div class="weui_loading_leaf weui_loading_leaf_5"></div>
<div class="weui_loading_leaf weui_loading_leaf_6"></div>
<div class="weui_loading_leaf weui_loading_leaf_7"></div>
<div class="weui_loading_leaf weui_loading_leaf_8"></div>
<div class="weui_loading_leaf weui_loading_leaf_9"></div>
<div class="weui_loading_leaf weui_loading_leaf_10"></div>
<div class="weui_loading_leaf weui_loading_leaf_11"></div>
</div>
<p class="weui_toast_content">Submitting...</p>
</div>
</div>
<div class="weui_panel_bd">
<div class="weui_cells">
<div class="weui_cell">
<div class="weui_cell_bd weui_cell_primary">
<p>Order Fee</p>
</div>
<div class="weui_cell_ft">[[${order['currency']}]] [[${order['customer_payment_amount']}]]</div>
</div>
<div class="weui_cell">
<div class="weui_cell_bd weui_cell_primary">
<p>Refund Fee</p>
</div>
<div class="weui_cell_ft">[[${refund['currency']}]] [[${refund['amount']}]]</div>
</div>
<div class="weui_cell">
<div class="weui_cell_bd weui_cell_primary">
<p>Applyer</p>
</div>
<div class="weui_cell_ft" data-th-text="${applyername}"></div>
</div>
<div class="weui_cell">
<div class="weui_cell_bd weui_cell_primary">
<p>Apply Time</p>
</div>
<div class="weui_cell_ft" data-th-text="${#dates.format(applytime,'yyyy-MM-dd HH:mm:ss')}"></div>
</div>
<div class="weui_cell">
<div class="weui_cell_bd weui_cell_primary">
<p>Order Title</p>
</div>
<div class="weui_cell_ft" data-th-text="${order['order_description']}"></div>
</div>
<div class="weui_cell" data-th-if="${order['order_detail']}">
<div class="weui_cell_bd weui_cell_primary">
<p>>Order Detail<</p>
</div>
<div class="weui_cell_ft" data-th-text="${order['order_detail']}">></div>
</div>
<div class="weui_cell">
<div class="weui_cell_bd weui_cell_primary">
<p>Order ID</p>
</div>
<div class="weui_cell_ft" data-th-text="${order['order_id']}"></div>
</div>
<div class="weui_cell" data-th-if="${order['client_order_id']}">>
<div class="weui_cell_bd weui_cell_primary">
<p>Partner Order ID</p>
</div>
<div class="weui_cell_ft" data-th-text="${order['client_order_id']}"></div>
</div>
<div class="weui_cell">
<div class="weui_cell_bd weui_cell_primary">
<p>Apply Time</p>
</div>
<div class="weui_cell_ft"
data-th-text="${#dates.format(applytime,'yyyy-MM-dd HH:mm:ss')}"></div>
</div>
</div>
<div class="weui_btn_area">
<a class="weui_btn weui_btn_primary" id="agree-btn">Agree</a>
<a class="weui_btn weui_btn_warn" id="disagree-btn">Disagree</a>
</div>
</div>
</body>
</html>

@ -1,25 +1,42 @@
<!doctype html> <!doctype html>
<html> <html>
<head> <head>
<title>Payment Notice</title> <title>Refund Auditions List</title>
<meta name="viewport" content="width=device-width,initial-scale=1,user-scalable=0"> <meta name="viewport" content="width=device-width,initial-scale=1,user-scalable=0">
<link rel="stylesheet" type="text/css" href="/static/lib/weui1/weui.min.css"> <link rel="stylesheet" type="text/css" href="/static/lib/weui1/weui.min.css">
<script type="text/javascript" src="//res.wx.qq.com/open/js/jweixin-1.0.0.js"></script> <script type="text/javascript" src="//res.wx.qq.com/open/js/jweixin-1.0.0.js"></script>
<script type="text/javascript" src="/static/lib/jquery/jquery-2.1.4.min.js"></script> <script type="text/javascript" src="/static/lib/jquery/jquery-2.1.4.min.js"></script>
<script type="text/javascript" src="/static/templates/disable_wechat_menu.js?t=201607070231"></script> <script type="text/javascript" src="/static/templates/disable_wechat_menu.js?t=201607070231"></script>
<style type="text/css"> <style type="text/css">
.weui_cell_ft { .result {
max-width: 60%; text-align: center;
white-space: normal margin: auto;
margin-top: 20px;
font-family: Helvetica;
font-size: 20px;
font-weight: bold;
color: #000;
}
.pay-brands {
text-align: center;
line-height: 20px;
font-size: 24px;
position: fixed;
width: 100%;
padding-top: 5px;
padding-bottom: 10px;
color: #dddddd;
background: #fbf9fe;
bottom: 0px;
} }
</style> </style>
</head> </head>
<body> <body>
<div class="weui_panel"> <div class="weui_panel">
<div class="weui_panel_bd"> <div class="weui_panel_bd">
<div class="weui_media_box weui_media_appmsg"> <div class="weui_media_box weui_media_appmsg" style="text-align: center;">
<div class="weui_media_hd"> <div class="weui_media_hd" st>
<img class="weui_media_appmsg_thumb" data-th-src="${client.logo_url}" alt=""> <img class="weui_media_appmsg_thumb" data-th-src="${client.logo_url}" alt="" style="height: 60px;">
</div> </div>
<div class="weui_media_bd"> <div class="weui_media_bd">
<h4 class="weui_media_title" data-th-text="${client.company_name}"></h4> <h4 class="weui_media_title" data-th-text="${client.company_name}"></h4>
@ -28,24 +45,30 @@
</div> </div>
</div> </div>
<div data-th-if="${auditions.size()==0}"> <div data-th-if="${auditions.size()==0}">
<p> There is no refund applies at the moment! </p> <div class="result"><img src="/static/images/completed.png" style="width: 80%">
<div style="margin-top: 10%;font-size:32px;color: #008d4c;text-align: center;width: 100%;font-weight: bold;">
Refund audit completed!
</div>
</div>
</div> </div>
<div data-th-if="${auditions.size()>0}"> <div data-th-if="${auditions.size()>0}">
asdlkjasd
<div class="weui_panel"> <div class="weui_panel">
<div class="weui_panel_bd"> <div class="weui_panel_bd">
<div class="weui_cells weui_cells_access"> <div class="weui-cells__title" style="margin-top: 10%;">You have <span data-th-text="${auditions.size()}" style="color: red;font-size: 30px;"></span> refunds pending review</div>
<div th-each="apply: ${audition}}"> <div class="weui-cells">
<a class="weui_cell" th-href="/api/payment/v1.0/refund/auditions/ + @{apply.id}"> <a data-th-each="apply:${auditions}" class="weui-cell weui-cell_access"
<div class="weui_cell_bd weui_cell_primary"> data-th-href="@{'/api/payment/v1.0/refund/auditions/'+${apply['id']}}">
<p th-text="${apply.currency}+ ${#numbers.formatDecimal($apply.refund_fee,1,2)}"></p> <div class="weui-cell__bd">
</div> <p data-th-text="${apply['order_id']}"></p>
<div class="weui_cell_ft" th-text="${apply.order_id}}"></div> </div>
</a> <div class="weui-cell__ft"></div>
</div> </a>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
<div class="pay-brands" data-th-if="${auditions.size()>0}">
<img src="/static/images/pmt_logo_royalpay.png">
</div>
</body> </body>
</html> </html>

@ -288,7 +288,7 @@ margin-bottom: 10%;"/>
</a> </a>
</li> </li>
<li class="menu-group" ng-if="roleNow!=null && roleNow!='administrator' && roleNow!='developer' && roleNow!='sitemanager'"> <li class="menu-group" ng-if="roleNow!=null && roleNow!='administrator' && roleNow!='developer'">
<p role="button" ng-class="{'active': Partner,'is-hide':hideSideBar}" ng-click="Partner = !Partner"> <p role="button" ng-class="{'active': Partner,'is-hide':hideSideBar}" ng-click="Partner = !Partner">
<span>商户管理|Merchant</span> <span>商户管理|Merchant</span>
<span class="pull-right-container"> <span class="pull-right-container">
@ -330,7 +330,7 @@ margin-bottom: 10%;"/>
</ul> </ul>
</li> </li>
<li class="menu-group" ng-if="roleNow!=null && roleNow!='administrator' && roleNow!='developer' && roleNow!='sitemanager'"> <li class="menu-group" ng-if="roleNow!=null && roleNow!='administrator' && roleNow!='developer'">
<p role="button" ng-class="{'active': Transaction,'is-hide':hideSideBar}" ng-click="Transaction = !Transaction"> <p role="button" ng-class="{'active': Transaction,'is-hide':hideSideBar}" ng-click="Transaction = !Transaction">
<span>交易管理|Transaction</span> <span>交易管理|Transaction</span>
<span class="pull-right-container"> <span class="pull-right-container">
@ -379,6 +379,11 @@ margin-bottom: 10%;"/>
</span> </span>
</p> </p>
<ul class="sidebar-menu" ng-class="{'active':Risk}"> <ul class="sidebar-menu" ng-class="{'active':Risk}">
<li ui-sref-active="active" ng-if="('merchantIdManage'|withModule)">
<a ui-sref="merchant_id_manage" ui-sref-opts="{reload:true}">
<i class="fa fa-sitemap"></i> <span>商户号管理</span>
</a>
</li>
<li ui-sref-active="active"> <li ui-sref-active="active">
<a ui-sref="analysis_monitoring.monitor" ui-sref-opts="{reload:true}"> <a ui-sref="analysis_monitoring.monitor" ui-sref-opts="{reload:true}">
<i class="fa fa-tv"></i> <span>交易成功率监控</span> <i class="fa fa-tv"></i> <span>交易成功率监控</span>
@ -409,6 +414,11 @@ margin-bottom: 10%;"/>
<i class="fa fa-exclamation-triangle"></i> <span>黑名单|Risky Merchants</span> <i class="fa fa-exclamation-triangle"></i> <span>黑名单|Risky Merchants</span>
</a> </a>
</li> </li>
<li ui-sref-active="active">
<a ui-sref="analysis_monitoring.customer" ui-sref-opts="{reload:true}">
<i class="fa fa-exclamation-triangle"></i> <span>消费者黑名单|Risky Customer</span>
</a>
</li>
<li ui-sref-active="active"> <li ui-sref-active="active">
<a ui-sref="customerRankingAnalysis" ui-sref-opts="{reload:true}"> <a ui-sref="customerRankingAnalysis" ui-sref-opts="{reload:true}">
<i class="fa fa fa-male"></i> <span>消费排名|Risky Merchants</span> <i class="fa fa fa-male"></i> <span>消费排名|Risky Merchants</span>

@ -0,0 +1,163 @@
<!DOCTYPE html>
<html>
<head>
<title>Merchant Locations</title>
<meta name="viewport" content="initial-scale=1.0, user-scalable=no">
<script type="text/javascript" src="/static/lib/jquery/jquery-2.1.4.min.js"></script>
<meta charset="utf-8">
<style>
#map {
height: 100%;
}
html, body {
height: 100%;
margin: 0;
padding: 0;
}
.controls {
margin-top: 10px;
border: 1px solid transparent;
border-radius: 2px 0 0 2px;
box-sizing: border-box;
-moz-box-sizing: border-box;
height: 32px;
outline: none;
box-shadow: 0 2px 6px rgba(0, 0, 0, 0.3);
}
#pac-input {
background-color: #fff;
font-family: Roboto;
font-size: 15px;
font-weight: 300;
margin-left: 12px;
padding: 0 11px 0 13px;
text-overflow: ellipsis;
width: 300px;
}
</style>
</head>
<body>
<input id="pac-input" class="controls" type="text" placeholder="Search Merchant Location">
<div id="map"></div>
<script src="https://maps.googleapis.com/maps/api/js?key=AIzaSyDUu6qXRV-j24rSdbPOMfVdTN1-2OfC2o8&libraries=places"
type="text/javascript"></script>
<!--<script src="http://maps.google.cn/maps/api/js?sensor=true&key=AIzaSyDNx0I5o5U0HWPjpHqB4N-y4_f-GLZq4oQ&region=aus&language=zh-CN"-->
<!--type="text/javascript"></script>-->
<script>
var merchant_location;
function initMap() {
var infoWindow = new google.maps.InfoWindow;
try {
merchant_location = JSON.parse(window.parent.document.getElementById('merchant_location').innerText);
} catch (err) {
merchant_location = null;
}
var map = new google.maps.Map(document.getElementById('map'), {
zoom: 13,
center: {lat: -33.8688, lng: 151.2195},
mapTypeId: 'roadmap'
});
if (merchant_location) {
var point = new google.maps.LatLng(
parseFloat(merchant_location.latitude),
parseFloat(merchant_location.longitude)
);
map.setCenter(point, 3);
var infowincontent = document.createElement('div');
var strong = document.createElement('strong');
strong.textContent = merchant_location.short_name + '(' + merchant_location.client_moniker + ')';
infowincontent.appendChild(strong);
infowincontent.appendChild(document.createElement('br'));
var merchant_address = document.createElement('p');
merchant_address.textContent = 'Address: ' + merchant_location.address;
infowincontent.appendChild(merchant_address);
var contact_bd = document.createElement('text');
contact_bd.setAttribute("style", "color:blue");
contact_bd.textContent = 'BD:' + merchant_location.bd_user_name;
infowincontent.appendChild(contact_bd);
}
// var add_view = window.parent.document.getElementById('add_view').innerText;
var add_view = 'true';
// Create the search box and link it to the UI element.
var input = document.getElementById('pac-input');
var searchBox = new google.maps.places.SearchBox(input);
map.controls[google.maps.ControlPosition.TOP_LEFT].push(input);
if (add_view === 'true') {
$('#pac-input').show();
// Bias the SearchBox results towards current map's viewport.
map.addListener('bounds_changed', function () {
searchBox.setBounds(map.getBounds());
});
searchBox.addListener('places_changed', function () {
var places = searchBox.getPlaces();
if (places.length == 0) {
return;
}
marker.setMap(null);
places.forEach(function (place) {
if (!place.geometry) {
console.log("Returned place contains no geometry");
return;
}
marker = new google.maps.Marker({
map: map,
position: place.geometry.location
});
marker.setMap(map);
map.setCenter(place.geometry.location, 3);
});
});
}
var marker = new google.maps.Marker();
if (merchant_location) {
marker = new google.maps.Marker({
map: map,
position: point
});
}
var geocoder = new google.maps.Geocoder();
map.addListener('click', function (event) {
var editmap = window.parent.document.getElementById('editmap').innerText;
if (editmap === 'true') {
marker.setMap(null);
marker = new google.maps.Marker({
map: map,
position: event.latLng
});
marker.setMap(map);
merchant_location = {};
geocoder.geocode({
'latLng': event.latLng
}, function (results, status) {
if (status == google.maps.GeocoderStatus.OK) {
if (results[0]) {
merchant_location.address = results[0].formatted_address;
merchant_location.latitude = event.latLng.lat();
merchant_location.longitude = event.latLng.lng();
}
}
});
}
});
if (merchant_location) {
marker.addListener('mouseover', function () {
infoWindow.setContent(infowincontent);
infoWindow.open(map, marker);
});
}
}
initMap();
</script>
</body>
</html>

@ -158,7 +158,7 @@ define(['angular', 'static/commons/commons', 'static/commons/angular-ueditor', '
trigger: 'axis' trigger: 'axis'
}, },
legend: { legend: {
data: ['Alipay交易金额','AlipayOnline交易金额', 'Bestpay交易金额','Wechat交易金额',"JD Pay交易金额","HF Pay交易金额"], data: ['Alipay交易金额','AlipayOnline交易金额', 'Bestpay交易金额','Wechat交易金额',"JD Pay交易金额","HF Pay交易金额","Yeepay交易金额"],
bottom: 0, bottom: 0,
height: '15%', height: '15%',
width: '80%', width: '80%',
@ -170,7 +170,7 @@ define(['angular', 'static/commons/commons', 'static/commons/angular-ueditor', '
type: 'value' type: 'value'
} }
], ],
color: ['#00a0e9','#00a0e9','#FF2D96','#09bb07','#DC0808',"#FFFF33"] color: ['#00a0e9','#00a0e9','#FF2D96','#09bb07','#DC0808',"#FFFF33","#66ff00"]
}, },
xAxis: { xAxis: {
basic: {type: 'category', boundaryGap: false}, basic: {type: 'category', boundaryGap: false},
@ -242,6 +242,17 @@ define(['angular', 'static/commons/commons', 'static/commons/angular-ueditor', '
yAxisIndex: 0 yAxisIndex: 0
}, },
column: {key: 'hf.total'} column: {key: 'hf.total'}
},
{
basic: {
name: 'Yeepay交易金额',
type: 'line',
label: {normal: {show: true}},
showAllSymbols: true,
showSymbol: true,
yAxisIndex: 0
},
column: {key: 'Yeepay.total'}
} }
] ]
}; };
@ -252,7 +263,7 @@ define(['angular', 'static/commons/commons', 'static/commons/angular-ueditor', '
trigger: 'axis' trigger: 'axis'
}, },
legend: { legend: {
data: ['Alipay交易订单','AlipayOnline交易订单', 'Bestpay交易订单','Wechat交易订单',"JD Pay交易订单","HF Pay交易订单"], data: ['Alipay交易订单','AlipayOnline交易订单', 'Bestpay交易订单','Wechat交易订单',"JD Pay交易订单","HF Pay交易订单","Yeepay交易订单"],
bottom: 0, bottom: 0,
height: '15%', height: '15%',
width: '80%', width: '80%',
@ -264,7 +275,7 @@ define(['angular', 'static/commons/commons', 'static/commons/angular-ueditor', '
type: 'value' type: 'value'
} }
], ],
color: ['#00a0e9','00a0e9','#FF2D96','#09bb07','#DC0808',"#FFFF33"] color: ['#00a0e9','00a0e9','#FF2D96','#09bb07','#DC0808',"#FFFF33","#66ff00"]
}, },
xAxis: { xAxis: {
basic: {type: 'category', boundaryGap: false}, basic: {type: 'category', boundaryGap: false},
@ -336,7 +347,18 @@ define(['angular', 'static/commons/commons', 'static/commons/angular-ueditor', '
yAxisIndex: 0 yAxisIndex: 0
}, },
column: {key: 'hf.orders'} column: {key: 'hf.orders'}
} },
{
basic: {
name: 'Yeepay交易订单',
type: 'line',
label: {normal: {show: true}},
showAllSymbols: true,
showSymbol: true,
yAxisIndex: 0
},
column: {key: 'Yeepay.orders'}
},
] ]
}; };
var channels_single_amount_chart = { var channels_single_amount_chart = {
@ -345,7 +367,7 @@ define(['angular', 'static/commons/commons', 'static/commons/angular-ueditor', '
trigger: 'axis' trigger: 'axis'
}, },
legend: { legend: {
data: ['Alipay交易客单价','AlipayOnline交易客单价', 'Bestpay交易客单价','Wechat交易客单价',"JD Pay交易客单价","HF Pay交易客单价"], data: ['Alipay交易客单价','AlipayOnline交易客单价', 'Bestpay交易客单价','Wechat交易客单价',"JD Pay交易客单价","HF Pay交易客单价","Yeepay交易客单价"],
bottom: 0, bottom: 0,
}, },
yAxis: [ yAxis: [
@ -354,7 +376,7 @@ define(['angular', 'static/commons/commons', 'static/commons/angular-ueditor', '
type: 'value' type: 'value'
} }
], ],
color: ['#00a0e9','#00a0e9','#FF2D96','#09bb07','#DC0808',"#FFFF33"] color: ['#00a0e9','#00a0e9','#FF2D96','#09bb07','#DC0808',"#FFFF33","#66ff00"]
}, },
xAxis: { xAxis: {
basic: {type: 'category', boundaryGap: false}, basic: {type: 'category', boundaryGap: false},
@ -426,6 +448,17 @@ define(['angular', 'static/commons/commons', 'static/commons/angular-ueditor', '
yAxisIndex: 0 yAxisIndex: 0
}, },
column: {key: 'hf.single_amount'} column: {key: 'hf.single_amount'}
},
{
basic: {
name: 'Yeepay交易客单价',
type: 'line',
label: {normal: {show: true}},
showAllSymbols: true,
showSymbol: true,
yAxisIndex: 0
},
column: {key: 'Yeepay.single_amount'}
} }
] ]
}; };

@ -545,6 +545,8 @@ define(['angular', 'decimal', 'uiBootstrap', 'uiRouter', 'angularEcharts'], func
return '/static/images/hf_sign_lg.png'; return '/static/images/hf_sign_lg.png';
case 'Rpay': case 'Rpay':
return '/static/images/rpayplus_sign_lg.png'; return '/static/images/rpayplus_sign_lg.png';
case 'Yeepay':
return '/static/images/yeepay_sign_lg.png';
} }
} }
}); });

@ -78,7 +78,6 @@ define(['angular', 'static/commons/commons', 'static/commons/angular-ueditor', '
$scope.customer_loading = false; $scope.customer_loading = false;
$scope.customers = resp.data.data; $scope.customers = resp.data.data;
$scope.customers_type = resp.data.openid_type; $scope.customers_type = resp.data.openid_type;
$scope.customers_analysis = resp.data.analysis;
$scope.pagination = resp.data.pagination; $scope.pagination = resp.data.pagination;
if($scope.customers.length>0){ if($scope.customers.length>0){
$scope.order_params.customer_id = $scope.customers[0].customer_id; $scope.order_params.customer_id = $scope.customers[0].customer_id;
@ -89,6 +88,9 @@ define(['angular', 'static/commons/commons', 'static/commons/angular-ueditor', '
} }
}); });
$http.get('/analysis/customers/ranking/'+$scope.params.openid_type+'/total', {params: params}).then(function (resp) {
$scope.customers_analysis = resp.data.analysis;
});
}; };
//$scope.listCustomers(1); //$scope.listCustomers(1);

@ -128,8 +128,8 @@ define(['angular', 'jquery', 'uiRouter', './monitoring/analysis-monitoring'],
}]); }]);
app.controller('riskBusinessCtrl', ['$scope', '$state', '$http', '$uibModal', '$filter', 'commonDialog', 'industryMap', app.controller('riskBusinessCtrl', ['$scope', '$state', '$http', '$uibModal', '$filter', 'commonDialog', 'industryMap','chartParser',
function ($scope, $state, $http, $uibModal, $filter, commonDialog, industryMap) { function ($scope, $state, $http, $uibModal, $filter, commonDialog, industryMap, chartParser) {
$scope.orderTypes = orderTypesMap; $scope.orderTypes = orderTypesMap;
$scope.orderTypesForBD = orderTypesMapForBD; $scope.orderTypesForBD = orderTypesMapForBD;
$scope.resultTypes = resultTypesMap; $scope.resultTypes = resultTypesMap;
@ -139,13 +139,20 @@ define(['angular', 'jquery', 'uiRouter', './monitoring/analysis-monitoring'],
$scope.amountSection = amountSectionMap; $scope.amountSection = amountSectionMap;
$scope.pagination = {}; $scope.pagination = {};
$scope.params = {}; $scope.params = {};
var industries = new Array();
angular.forEach($scope.industries, function (industry) {
industries.push(industry.label);
});
industries.push('未知行业');
console.log(industries);
// 加载风险注册事件 // 加载风险注册事件
$scope.loadRiskEvents = function (page) { $scope.loadRiskEvents = function (page) {
var params = angular.copy($scope.params); var params = angular.copy($scope.params);
params.page = page || $scope.pagination.page || 1; params.page = page || $scope.pagination.page || 1;
params.replyEmailDate = $filter('date')(params.replyEmailDate, 'yyyy-MM-dd'); params.replyEmailDateBegin = $filter('date')(params.replyEmailDateBegin, 'yyyy-MM-dd');
params.receiveEmailDate = $filter('date')(params.receiveEmailDate, 'yyyy-MM-dd'); params.replyEmailDateEnd = $filter('date')(params.replyEmailDateEnd, 'yyyy-MM-dd');
params.receiveEmailDateBegin = $filter('date')(params.receiveEmailDateBegin, 'yyyy-MM-dd');
params.receiveEmailDateEnd = $filter('date')(params.receiveEmailDateEnd, 'yyyy-MM-dd');
if (params.section != null) { if (params.section != null) {
var sectionArray = params.section.split('-'); var sectionArray = params.section.split('-');
params.startAmount = sectionArray[0]; params.startAmount = sectionArray[0];
@ -155,19 +162,126 @@ define(['angular', 'jquery', 'uiRouter', './monitoring/analysis-monitoring'],
$scope.riskEvents = resp.data.data; $scope.riskEvents = resp.data.data;
$scope.pagination = resp.data.pagination; $scope.pagination = resp.data.pagination;
}); });
$http.get('/risk/business/events/analysis/industry', {params: params}).then(function (resp) {
$scope.riskEventsByIndustry = resp.data;
$scope.risk_industry_chart = chartParser.parse(industryAmount(industries),$scope.riskEventsByIndustry);
});
$http.get('/risk/business/events/analysis/amount', {params: params}).then(function (resp) {
$scope.riskEventsByAmount = resp.data;
$scope.risk_amount_chart = chartParser.parse(intervalsAmount(),$scope.riskEventsByAmount);
});
};
var industryAmount = function (industries) {
return {
chart: {
tooltip: {
trigger: 'item',
formatter: "{a} <br/>{b} : {c}"
},
// color: colors,
legend: {
orient: 'vertical',
left: 'right',
data: industries
}
},
series: [{
basic: {
name: '风控事件单量', type: 'pie',
radius: '80%',
center: ['50%', '58%'],
label:{ //饼图图形上的文本标签
normal:{
show:true,
position:'outer', //标签的位置
textStyle : {
fontWeight : 300 ,
fontSize : 16 //文字的字体大小
},
formatter:'{d}%'
}
},
itemStyle: {
emphasis: {
shadowBlur: 10,
shadowOffsetX: 0,
shadowColor: 'rgba(0, 0, 0, 0.5)'
}
}
},
column: {key: 'amount', name: 'industry'}
}]
}
};
var intervalsAmount = function () {
return {
chart: {
tooltip: {
trigger: 'item',
formatter: "{a} <br/>{b} : {c}"
},
// color: colors,
legend: {
orient: 'vertical',
left: 'right',
data: [ '0-500','500-1000','1000-1500','1500-2000','2000-2500','2500-3000','3000-3500','3500-4000','4000-4500','4500-5000','5000-5500','5500-6000',
'6000-6500','6500-7000','7000-7500','7500-8000','8000-8500','8500-9000','>9000']
}
},
series: [{
basic: {
name: '风控事件单量', type: 'pie',
radius: '80%',
center: ['50%', '58%'],
label:{ //饼图图形上的文本标签
normal:{
show:true,
position:'outer', //标签的位置
textStyle : {
fontWeight : 300 ,
fontSize : 16 //文字的字体大小
},
formatter:'{d}%'
}
},
itemStyle: {
emphasis: {
shadowBlur: 10,
shadowOffsetX: 0,
shadowColor: 'rgba(0, 0, 0, 0.5)'
}
}
},
column: {key: 'amount', name: 'intervals'}
}]
}
}; };
$scope.loadRiskEvents(1); $scope.loadRiskEvents(1);
} }
]); ]);
app.controller('riskEventDetailCtrl', ['$scope', '$state', '$http', '$uibModal', '$filter', 'Upload', 'commonDialog', 'riskEvent', app.controller('riskEventDetailCtrl', ['$scope', '$state', '$http', '$uibModal', '$filter', 'Upload', 'commonDialog', 'riskEvent', 'orderService',
function ($scope, $state, $http, $uibModal, $filter, Upload, commonDialog, riskEvent) { function ($scope, $state, $http, $uibModal, $filter, Upload, commonDialog, riskEvent, orderService) {
$scope.orderTypes = orderTypesMap; $scope.orderTypes = orderTypesMap;
$scope.resultTypes = resultTypesMap; $scope.resultTypes = resultTypesMap;
$scope.channelResults = channelResultArray; $scope.channelResults = channelResultArray;
if (riskEvent.data.is_send_client == 1)
riskEvent.data.is_send_client = true;
$scope.riskEvent = riskEvent.data; $scope.riskEvent = riskEvent.data;
$http.get('/risk/business/process/logs/' + $scope.riskEvent.risk_id).then(function (resp) {
$scope.riskEvent.process_logs = resp.data;
});
// 编辑表格的数据保存对象,重新从源数据复制,从而取消保存操作时不会更新视图
$scope.riskEventEdit = angular.copy(riskEvent.data);
//var index = $scope.riskEvent.order_ids.lastIndexOf(",");
//$scope.riskEvent.order_ids = $scope.riskEvent.order_ids.substring(0, index) + "" + $scope.riskEvent.order_ids.substring(index + 1);
// 获取数据库中对应的渠道字段 // 获取数据库中对应的渠道字段
var orderChannel = 'enable_'; var orderChannel = 'enable_';
if ($scope.riskEvent.order_type == 1) { if ($scope.riskEvent.order_type == 1) {
@ -177,8 +291,30 @@ define(['angular', 'jquery', 'uiRouter', './monitoring/analysis-monitoring'],
} else { } else {
orderChannel = null; orderChannel = null;
} }
// 编辑表格的数据保存对象,重新从源数据复制,从而取消保存操作时不会更新视图
$scope.riskEventEdit = angular.copy(riskEvent.data); /**
* order_ids在指定位置换行
* @param str
* @param position
* @returns {*}
*/
$scope.splitStr = function (str, position) {
if (str == null || str == '')
return;
var strArr = str.split(",");
var resultStr = '';
for (var i = 0; i < strArr.length; i++) {
resultStr += strArr[i];
if (i == (strArr.length - 1))
break;
if ((i + 1) % position == 0)
resultStr += ", ";
else
resultStr += ",";
}
return resultStr;
};
$scope.riskEvent.order_ids = $scope.splitStr($scope.riskEvent.order_ids, 3);
// order_type转换为string类型是因为前端select控件这样才会显示初值 // order_type转换为string类型是因为前端select控件这样才会显示初值
$scope.riskEventEdit.order_type += ""; $scope.riskEventEdit.order_type += "";
@ -279,6 +415,7 @@ define(['angular', 'jquery', 'uiRouter', './monitoring/analysis-monitoring'],
}) })
}; };
// 发送email
$scope.resendUploadEmail = function () { $scope.resendUploadEmail = function () {
commonDialog.confirm({ commonDialog.confirm({
title: 'Warning', title: 'Warning',
@ -295,85 +432,18 @@ define(['angular', 'jquery', 'uiRouter', './monitoring/analysis-monitoring'],
}) })
}; };
// 订单详情
$scope.showTradeDetail = function (order) {
orderService.managerOrderDetail(order)
};
// 以下为BD上传材料相关 // 以下为BD上传材料相关
$scope.material={}; $scope.material={};
$scope.material.update_time=$filter('date')(new Date(), 'yyyy-MM-dd HH:mm:ss'); $scope.uploadFile = function(files, index) {
$scope.material.risk_id = $scope.riskEvent.risk_id;
$scope.uploadFile1 = function (files) {
if (files && files.length) {
var urls = new Array();
var value = 0;
$scope.file1Progress = {value: 0};
for (var i = 0; i < files.length; i++) {
var file = files[i];
Upload.upload({
url: '/attachment/riskFiles',
data: {file: file}
}).then(function (resp) {
urls.push(resp.data.url);
}, function (resp) {
delete $scope.file1Progress;
alert('Upload Failed');
}, function (evt) {
value += parseInt(100 * evt.loaded / evt.total );
$scope.file1Progress.value = value/(files.length*2);
})
}
$scope.material.file1_url = urls;
}
};
$scope.uploadFile2 = function (files) {
if (files && files.length) {
var urls = new Array();
var value = 0;
$scope.file2Progress = {value: 0};
for (var i = 0; i < files.length; i++) {
var file = files[i];
Upload.upload({
url: '/attachment/riskFiles',
data: {file: file}
}).then(function (resp) {
urls.push(resp.data.url);
}, function (resp) {
delete $scope.file2Progress;
alert('Upload Failed');
}, function (evt) {
value += parseInt(100 * evt.loaded / evt.total );
$scope.file2Progress.value = value/(files.length*2);
})
}
$scope.material.file2_url = urls;
}
};
$scope.uploadFile3 = function (files) {
if (files && files.length) {
var urls = new Array();
var value = 0;
$scope.file3Progress = {value: 0};
for (var i = 0; i < files.length; i++) {
var file = files[i];
Upload.upload({
url: '/attachment/riskFiles',
data: {file: file}
}).then(function (resp) {
urls.push(resp.data.url);
}, function (resp) {
delete $scope.file3Progress;
alert('Upload Failed');
}, function (evt) {
value += parseInt(100 * evt.loaded / evt.total );
$scope.file3Progress.value = value/(files.length*2);
})
}
$scope.material.file3_url = urls;
}
};
$scope.uploadFile4 = function (files) {
if (files && files.length) { if (files && files.length) {
var urls = new Array(); var urls = new Array();
var value = 0; var value = 0;
$scope.file4Progress = {value: 0}; $scope.allMaterialInfo.material[index].fileProgressValue = 0;
for (var i = 0; i < files.length; i++) { for (var i = 0; i < files.length; i++) {
var file = files[i]; var file = files[i];
Upload.upload({ Upload.upload({
@ -382,64 +452,26 @@ define(['angular', 'jquery', 'uiRouter', './monitoring/analysis-monitoring'],
}).then(function (resp) { }).then(function (resp) {
urls.push(resp.data.url); urls.push(resp.data.url);
}, function (resp) { }, function (resp) {
delete $scope.file4Progress; delete $scope.allMaterialInfo.material[index].fileProgressValue;
alert('Upload Failed'); alert('Upload Failed');
}, function (evt) { }, function (evt) {
value += parseInt(100 * evt.loaded / evt.total ); value += parseInt(100 * evt.loaded / evt.total );
$scope.file4Progress.value = value/(files.length*2); $scope.allMaterialInfo.material[index].fileProgressValue = value/(files.length*2);
}) })
} }
$scope.material.file4_url = urls; $scope.allMaterialInfo.material[index].uploadFile = urls;
}
};
$scope.uploadFile5 = function (files) {
if (files && files.length) {
var urls = new Array();
var value = 0;
$scope.file5Progress = {value: 0};
for (var i = 0; i < files.length; i++) {
var file = files[i];
Upload.upload({
url: '/attachment/riskFiles',
data: {file: file}
}).then(function (resp) {
urls.push(resp.data.url);
}, function (resp) {
delete $scope.file5Progress;
alert('Upload Failed');
}, function (evt) {
value += parseInt(100 * evt.loaded / evt.total );
$scope.file5Progress.value = value/(files.length*2);
})
}
$scope.material.file5_url = urls;
}
};
$scope.uploadFile6 = function (files) {
if (files && files.length) {
var urls = new Array();
var value = 0;
$scope.file6Progress = {value: 0};
for (var i = 0; i < files.length; i++) {
var file = files[i];
Upload.upload({
url: '/attachment/riskFiles',
data: {file: file}
}).then(function (resp) {
urls.push(resp.data.url);
}, function (resp) {
delete $scope.file6Progress;
alert('Upload Failed');
}, function (evt) {
value += parseInt(100 * evt.loaded / evt.total );
$scope.file6Progress.value = value/(files.length*2);
})
}
$scope.material.file6_url = urls;
} }
}; };
$scope.submit = function (form) { $scope.submit = function (form) {
var codeKey = $scope.riskEvent.submit_url.substring($scope.riskEvent.submit_url.lastIndexOf('=') + 1) || $scope.riskEvent.submit_url.substring($scope.riskEvent.submit_url.lastIndexOf('/') + 1); var codeKey = $scope.riskEvent.submit_url.substring($scope.riskEvent.submit_url.lastIndexOf('=') + 1) || $scope.riskEvent.submit_url.substring($scope.riskEvent.submit_url.lastIndexOf('/') + 1);
$scope.material.update_time=$filter('date')(new Date(), 'yyyy-MM-dd HH:mm:ss');
$scope.material.risk_id = $scope.riskEvent.risk_id;
for (var i = 0; i < $scope.allMaterialInfo.material.length; i++) {
var key = 'file' + (i + 1) + "_url";
$scope.material[key] = $scope.allMaterialInfo.material[i].uploadFile;
}
$scope.material.description = $scope.allMaterialInfo.description;
$http.post('/risk/upload/' + codeKey, $scope.material).then(function (resp) { $http.post('/risk/upload/' + codeKey, $scope.material).then(function (resp) {
commonDialog.alert({ commonDialog.alert({
title: 'Success', title: 'Success',
@ -458,15 +490,22 @@ define(['angular', 'jquery', 'uiRouter', './monitoring/analysis-monitoring'],
// 加载提交材料 // 加载提交材料
$scope.loadRiskMaterial = function() { $scope.loadRiskMaterial = function() {
$http.get('/risk/business/' + $scope.riskEvent.risk_id + '/material').then(function(resp) { // $http.get('/risk/business/' + $scope.riskEvent.risk_id + '/material').then(function(resp) {
$scope.material = resp.data; // $scope.material = resp.data;
}) // });
$http.get('/risk/business/' + $scope.riskEvent.risk_id + '/all_material_info').then(function(resp) {
$scope.allMaterialInfo = resp.data;
if ($scope.uploadShowFlag) {
$scope.allMaterialInfo.description = '';
}
});
}; };
// BD是否可上传 // BD是否可上传
$scope.uploadShowFlag = ($scope.riskEvent.result_type == 1 || $scope.riskEvent.result_type == 4) ? true : false; $scope.uploadShowFlag = ($scope.riskEvent.result_type == 1 || $scope.riskEvent.result_type == 4) ? true : false;
if (!$scope.uploadShowFlag) //if (!$scope.uploadShowFlag)
$scope.loadRiskMaterial(); $scope.loadRiskMaterial();
} }
]); ]);
@ -481,50 +520,71 @@ define(['angular', 'jquery', 'uiRouter', './monitoring/analysis-monitoring'],
// 加载提交材料 // 加载提交材料
// $scope.fileObject = {}; // $scope.fileObject = {};
$scope.loadRiskMaterial = function() { $scope.loadRiskMaterial = function() {
$http.get('/risk/business/' + $scope.riskEvent.risk_id + '/material').then(function(resp) { // $http.get('/risk/business/' + $scope.riskEvent.risk_id + '/material').then(function(resp) {
// $scope.riskMaterial = resp.data;
// $scope.file1 = resp.data.file1;
// $scope.file2 = resp.data.file2;
// $scope.file3 = resp.data.file3;
// $scope.file4 = resp.data.file4;
// $scope.file5 = resp.data.file5;
// $scope.file6 = resp.data.file6;
//
// // for (var i = 1; i <= 10; i++) {
// // var key = "file" + i;
// // if (riskMaterial[key + '_url'] != null)
// // $scope.fileObject[key] = riskMaterial[key + '_url'];
// // }
// // $scope.fileLength = Object.keys($scope.fileObject).length;
// })
$http.get('/risk/business/' + $scope.riskEvent.risk_id + '/all_material_info').then(function(resp) {
$scope.riskMaterial = resp.data; $scope.riskMaterial = resp.data;
$scope.file1 = resp.data.file1; });
$scope.file2 = resp.data.file2;
$scope.file3 = resp.data.file3;
$scope.file4 = resp.data.file4;
$scope.file5 = resp.data.file5;
$scope.file6 = resp.data.file6;
// for (var i = 1; i <= 10; i++) {
// var key = "file" + i;
// if (riskMaterial[key + '_url'] != null)
// $scope.fileObject[key] = riskMaterial[key + '_url'];
// }
// $scope.fileLength = Object.keys($scope.fileObject).length;
})
}; };
$scope.loadRiskMaterial(); $scope.loadRiskMaterial();
// 材料审核 // 材料审核
$scope.auditMaterial = function(auditType) { $scope.auditMaterial = function(auditType) {
var url = '/risk/business/events'; var url = '/risk/business/events/pass';
var warningMessageHTML = '是否确定<span style="color: green; font-weight: bolder; font-size: 20px;">通过</span>该材料?'; var warningMessageHTML = '是否确定<span style="color: green; font-weight: bolder; font-size: 20px;">通过</span>该材料?';
if (auditType == 4) { if (auditType == 3) {
url = '/risk/business/' + $scope.riskEvent.risk_id + '/refuse'; commonDialog.confirm({
warningMessageHTML = '是否确定<span style="color: red; font-weight: bolder; font-size: 20px;">拒绝</span>该材料?' title: 'Warning',
} contentHtml: $sce.trustAsHtml(warningMessageHTML)
commonDialog.confirm({ }).then(function () {
title: 'Warning', $scope.riskEvent.result_type = auditType;
contentHtml: $sce.trustAsHtml(warningMessageHTML) $http.put(url, $scope.riskEvent).then(function (resp) {
}).then(function () { commonDialog.alert({title: 'Success', content: "材料已通过!"});
$scope.riskEvent.result_type = auditType; $state.go('^', {}, {reload: true});
$http.put(url, $scope.riskEvent).then(function (resp) { }, function (resp) {
$state.go('^', {}, {reload: true}); commonDialog.alert({
}, function (resp) { title: 'Error',
commonDialog.alert({ content: resp.data.message,
title: 'Error', type: 'error'
content: resp.data.message, });
type: 'error'
}); });
}); });
}); }
} else if (auditType == 4) {
url = '/risk/business/' + $scope.riskEvent.risk_id + '/refuse';
//warningMessageHTML = '是否确定<span style="color: red; font-weight: bolder; font-size: 20px;">拒绝</span>该材料?'
commonDialog.inputText({title: 'Input Refuse Description', size: 'lg'}).then(function (text) {
$scope.riskEvent.refuse_description = text;
$http.put(url, $scope.riskEvent).then(function () {
commonDialog.alert({title: 'Success', content: "材料已拒绝!"});
$state.go('^', {}, {reload: true});
}, function (resp) {
commonDialog.alert({
title: 'Error',
content: resp.data.message,
type: 'error'
});
})
})
}
};
} }
]); ]);
@ -535,7 +595,47 @@ define(['angular', 'jquery', 'uiRouter', './monitoring/analysis-monitoring'],
$scope.orderTypes = orderTypesMap; $scope.orderTypes = orderTypesMap;
$scope.royapayOrderTypes = royalpayOrderTypesMap; $scope.royapayOrderTypes = royalpayOrderTypesMap;
$scope.warningOrderTypes = warningOrderTypesMap; $scope.warningOrderTypes = warningOrderTypesMap;
$scope.materials = [{key: 0, value: ""}];
$scope.canMinus = false;
$scope.increase = function($index) {
$scope.materials.splice($index + 1, 0,
{key: new Date().getTime(), value: ""}); // 用时间戳作为每个item的key
// 增加新的input后允许删除
$scope.canMinus = true;
};
$scope.decrease = function($index) {
// 如果input大于1删除
if ($scope.materials.length > 1) {
$scope.materials.splice($index, 1);
}
// 如果回复数为1不允许删除
if ($scope.materials.length == 1) {
$scope.canMinus = false;
}
};
var array=new Array();
var validIndex = 0;
$scope.combineMaterials = function() {
for (var i = 0; i < $scope.materials.length; i++) {
var value = $scope.materials[i].value;
if (value == '')
continue;
var cr = {};
cr['question' + (validIndex + 1)] = $scope.materials[i].value;
array[validIndex] = cr;
validIndex++;
}
if (array.length == 0)
return null;
return JSON.stringify(array);
};
$scope.is_send_client = false;
$scope.changeIsSendClient = function(flag) {
$scope.is_send_client = flag
};
$scope.save = function(form) { $scope.save = function(form) {
if (form.$invalid) { if (form.$invalid) {
angular.forEach(form, function (item, key) { angular.forEach(form, function (item, key) {
@ -558,7 +658,17 @@ define(['angular', 'jquery', 'uiRouter', './monitoring/analysis-monitoring'],
$scope.riskEvent.receive_email_date = $filter('date')($scope.riskEvent.receive_email_date, 'yyyy-MM-dd'); $scope.riskEvent.receive_email_date = $filter('date')($scope.riskEvent.receive_email_date, 'yyyy-MM-dd');
$scope.riskEvent.alipay_materials = $scope.combineMaterials();
$scope.riskEvent.is_send_client = $scope.is_send_client;
var saveRiskBtn = document.getElementById('save-risk-btn');
var saveRiskBtnInnerHtmlBak = saveRiskBtn.innerHTML;
saveRiskBtn.disabled = true;
saveRiskBtn.innerHTML = "<i class='fa fa-spinner fa-spin '></i> Processing";
$http.post('/risk/business/events', $scope.riskEvent).then(function (resp) { $http.post('/risk/business/events', $scope.riskEvent).then(function (resp) {
saveRiskBtn.innerHTML = saveRiskBtnInnerHtmlBak;
saveRiskBtn.disabled = false;
commonDialog.alert({ commonDialog.alert({
title: 'Success', title: 'Success',
content: 'Register new riskEvent successfully', content: 'Register new riskEvent successfully',
@ -566,6 +676,8 @@ define(['angular', 'jquery', 'uiRouter', './monitoring/analysis-monitoring'],
}); });
$state.go('^',{}, {reload: true}); $state.go('^',{}, {reload: true});
}, function (resp) { }, function (resp) {
saveRiskBtn.innerHTML = saveRiskBtnInnerHtmlBak;
saveRiskBtn.disabled = false;
commonDialog.alert({ commonDialog.alert({
title: 'Error', title: 'Error',
content: resp.data.message, content: resp.data.message,
@ -578,7 +690,23 @@ define(['angular', 'jquery', 'uiRouter', './monitoring/analysis-monitoring'],
$scope.partnerParam.sub_merchant_id = $scope.riskEvent.sub_merchant_id; $scope.partnerParam.sub_merchant_id = $scope.riskEvent.sub_merchant_id;
$http.get('/risk/business/partners', {params: $scope.partnerParam}).then(function (resp) { $http.get('/risk/business/partners', {params: $scope.partnerParam}).then(function (resp) {
$scope.partners = resp.data; $scope.partners = resp.data;
$scope.riskEvent.client_moniker = $scope.partners[0].client_moniker; if ($scope.partners != null && $scope.partners.length > 0) {
// 由于通用号调单可能无法提供商户client_moniker,所以后台无法查询到订单
if ($scope.partners.length == 1 || $scope.riskEvent.order_type != 5)
$scope.riskEvent.client_moniker = $scope.partners[0].client_moniker;
}
else {
commonDialog.confirm({
title: 'Warning',
content: '该微信子商户号下暂时没有商户或者商户被禁用,是否继续?'
}).then(function () {
// 点击确定
$scope.riskEvent.client_moniker = null;
}, function () {
// 点击取消
$scope.riskEvent.sub_merchant_id = '';
});
}
if ($scope.partners != null && $scope.partners.length > 1 && $scope.riskEvent.order_type != 5) if ($scope.partners != null && $scope.partners.length > 1 && $scope.riskEvent.order_type != 5)
commonDialog.confirm({ commonDialog.confirm({
title: 'Warning', title: 'Warning',

@ -25,135 +25,44 @@
</div> </div>
<div class="panel-body"> <div class="panel-body">
<div class="form-vertical"> <div class="form-vertical">
<div class="form-group"> <div class="form-group" ng-if="riskMaterial.refuse_description != null">
<label class="control-label col-sm-2">Description:</label> <label class="control-label col-sm-2">Refuse Reason</label>
<div class="col-sm-8"> <div class="col-sm-10">
<div class="form-control-static"> <div class="form-control-static">
<p ng-bind="riskMaterial.description"></p> <p ng-bind="riskMaterial.refuse_description"></p>
</div>
</div>
</div>
<div class="form-group">
<div class="col-sm-12 text-left">
<p ng-if="riskEvent.order_type==1">1、物流公司发货单据照片
要求:每笔交易对应的物流单必须提供,且单据必须清晰可见<br>
Photos of logistics companies goods-delivery documents
Requirement: The logistics order record corresponding to each transaction must be provided, and details of records should be clearly visible.
</p>
<p ng-if="riskEvent.order_type==3">1.请解释相应的消费场景/业务模式,例如网站商城,扫码支付, 消费者到店支付等;<br>
Please explain the relative payment scenario/business activities, for example, online store, QR code payment, payment at the store, etc;
</p>
</div>
<div class="col-sm-12">
&nbsp;&nbsp;<br>
<div class="col-xs-12">
<a class="col-xs-3 logo-width" ng-repeat="url in file1" target="_blank" ng-href="{{url}}">
<img class="col-xs-12" ng-src="{{url}}">
</a>
</div> </div>
</div> </div>
</div> </div>
<div class="form-group">
<div class="col-sm-12 text-left">
<p ng-if="riskEvent.order_type==1">2、用户购买虚拟物品需要提供聊天记录、订单信息、发货凭证截图、虚拟物品最终消费场景例如何种游戏、软件、提供消费场景网址/下载链接
要求:每笔交易对应的截图必须清晰可见<br>
Users need to provide chat records, order information, screenshots of delivery documents, final consumption scenarios of virtual goods (such as games, software); provide consumer scene URL / download link.
Requirement: The screenshot corresponding to each transaction must be clearly visible.
</p>
<p ng-if="riskEvent.order_type==3">2.提供相应购物清单,订单小票(请提供与被查交易订单号相匹配的交易时间及金额的发票);<br>
Provide related shopping lists, invoices. (Please provide the invoices, amount of which matches that of the abnormal transaction);
</p>
</div>
<div class="col-sm-12">
&nbsp;&nbsp;<br>
<div class="col-xs-12">
<a class="col-xs-3 logo-width" ng-repeat="url in file2" target="_blank" ng-href="{{url}}">
<img class="col-xs-12" ng-src="{{url}}">
</a>
</div>
</div>
</div>
<div class="form-group">
<div class="col-sm-12 text-left">
<p ng-if="riskEvent.order_type==1">3、购物小票/发票存根照片
照片应清晰,必须显示商户名称、商户地址、购物时间、物品名称
购物金额等<br>
Photos of shopping receipts/ invoice stubs
Requirement: The photos should be clear and must show Merchant name, Business address, Transaction time, Product information, Quantity purchased, etc.
</p>
<p ng-if="riskEvent.order_type==3">3.提供相应的发货证明,报关单(若有消费者在国内购买,请提供物流单据或报关单);<br>
Relative proof of delivery, customs declaration (If the consumer purchased from China, please provide shipping receipt or customs declaration);
</p>
</div>
<div class="col-sm-12">
&nbsp;&nbsp;<br>
<div class="col-xs-12">
<a class="col-xs-3 logo-width" ng-repeat="url in file3" target="_blank" ng-href="{{url}}">
<img class="col-xs-12" ng-src="{{url}}">
</a>
</div>
</div>
</div>
<div class="form-group"> <div class="form-group">
<div class="col-sm-12 text-left"> <label class="control-label col-sm-2">Description:</label>
<p ng-if="riskEvent.order_type==1">4、显示商户门牌号码和店头名称的照片 <div class="col-sm-10">
要求:清晰可见,至少一张<br> <div class="form-control-static">
Photos of Merchant Street number & Merchant name <p ng-bind="riskMaterial.description"></p>
Requirement: At least one visible photo
</p>
<p ng-if="riskEvent.order_type==3">4.提供您的门店照片(门店照及店铺内的照片各一张, 一张可以看到商户名的门头照,一张可以看到相关商品或服务的店内照片);<br>
Photos of the store ( one of each front-store and in-store);
</p>
</div>
<div class="col-sm-12">
&nbsp;&nbsp;<br>
<div class="col-xs-12">
<a class="col-xs-3 logo-width" ng-repeat="url in file4" target="_blank" ng-href="{{url}}">
<img class="col-xs-12" ng-src="{{url}}">
</a>
</div> </div>
</div> </div>
</div> </div>
<div class="form-group">
<div class="col-sm-12 text-left">
<p ng-if="riskEvent.order_type==1">5、显示商户营业场景所场内部情况如店内商品陈列、收银台等的照片
要求:照片清晰,且能清楚显示商户实际售卖物品或服务,至少三张<br>
Photos of internal environment of merchant business (such as in-store merchandise display, checkout counter, etc.)
Requirements: The photos (at least three) showing merchant activities including actual selling-goods or services obviously
</p>
<p ng-if="riskEvent.order_type==3">5.其他可以还原交易背景的资料,如和消费者的聊天记录等,来佐证被查单号交易的真实性;<br>
Other materials that can verify the payment scenario, for example, chatting history, to prove the truth of the transactions;
</p>
</div>
<div class="col-sm-12">
&nbsp;&nbsp;<br>
<div class="col-xs-12">
<a class="col-xs-3 logo-width" ng-repeat="url in file5" target="_blank" ng-href="{{url}}">
<img class="col-xs-12" ng-src="{{url}}">
</a>
</div>
</div>
</div> <div class="form-group" ng-repeat="item in riskMaterial.material">
<div class="form-group">
<div class="col-sm-12 text-left"> <div class="col-sm-12 text-left">
<p ng-if="riskEvent.order_type==1||riskEvent.order_type==3">6、其他图片<br> <p ng-bind="item.question"></p>
Other pictures
</p>
</div> </div>
<div class="col-sm-12"> <div class="col-sm-12">
&nbsp;&nbsp;<br> &nbsp;&nbsp;<br>
<div class="col-xs-12"> <div class="col-xs-12">
<a class="col-xs-3 logo-width" ng-repeat="url in file6" target="_blank" ng-href="{{url}}"> <a class="col-xs-3 logo-width" ng-repeat="url in item.file" target="_blank" ng-href="{{url}}">
<img class="col-xs-12" ng-src="{{url}}"> <img class="col-xs-12" ng-src="{{url}}">
</a> </a>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
<div class="panel-footer">
<a role="button"
ui-sref="analysis_monitoring.risk_business"
class="btn btn-info">返回
</a>
</div>
</div> </div>

@ -344,6 +344,12 @@
<input class="form-control" ng-model="paymentconfig['cheat_monitor.no_disturbing']"> <input class="form-control" ng-model="paymentconfig['cheat_monitor.no_disturbing']">
</div> </div>
</div> </div>
<div class="form-group col-sm-6">
<label class="control-label col-sm-5">白名单:</label>
<div class="col-sm-6">
<input class="form-control" ng-model="paymentconfig['cheat_monitor.white_list']">
</div>
</div>
</div> </div>
</div> </div>
<div class="col-sm-offset-4 col-sm-6"> <div class="col-sm-offset-4 col-sm-6">

@ -203,6 +203,8 @@
uib-tooltip="HF Pay" ng-if="order.channel=='hf'"/> uib-tooltip="HF Pay" ng-if="order.channel=='hf'"/>
<img src="/static/images/rpayplus_sign.png" <img src="/static/images/rpayplus_sign.png"
uib-tooltip="RPay+" ng-if="order.channel=='Rpay'"/> uib-tooltip="RPay+" ng-if="order.channel=='Rpay'"/>
<img src="/static/images/yeepay_sign.png"
uib-tooltip="Yeepay" ng-if="order.channel=='Yeepay'"/>
{{order.order_id}} {{order.order_id}}
</td> </td>
<td>{{order.short_name}}(<a class="text-primary" role="button" title="Detail" <td>{{order.short_name}}(<a class="text-primary" role="button" title="Detail"

@ -92,7 +92,9 @@
<a role="button" ng-class="{'bg-primary':params.channel=='hf'}" <a role="button" ng-class="{'bg-primary':params.channel=='hf'}"
ng-click="params.channel='hf';doAnalysis(1)">HF Pay</a> | ng-click="params.channel='hf';doAnalysis(1)">HF Pay</a> |
<a role="button" ng-class="{'bg-primary':params.channel=='RPAY'}" <a role="button" ng-class="{'bg-primary':params.channel=='RPAY'}"
ng-click="params.channel='RPAY';doAnalysis(1)">RPay +</a> ng-click="params.channel='RPAY';doAnalysis(1)">RPay +</a> |
<a role="button" ng-class="{'bg-primary':params.channel=='Yeepay'}"
ng-click="params.channel='Yeepay';doAnalysis(1)">Yeepay</a>
</p> </p>
</div> </div>
</div> </div>

@ -101,7 +101,7 @@
</div> </div>
</div> </div>
<div class="form-group" ng-if="partners != null"> <div class="form-group" ng-if="(partners != null) && (partners.length > 0) && riskEvent.order_type == 1">
<label class="control-label col-sm-2" <label class="control-label col-sm-2"
for="order-type-input">Company Name for="order-type-input">Company Name
</label> </label>
@ -158,15 +158,17 @@
ng-if="riskEvent.order_type != 4" ng-if="riskEvent.order_type != 4"
ng-class="{'has-error':riskEventForm.order_ids.$invalid && riskEventForm.order_ids.$dirty}"> ng-class="{'has-error':riskEventForm.order_ids.$invalid && riskEventForm.order_ids.$dirty}">
<label class="control-label col-sm-2" <label class="control-label col-sm-2"
for="order-ids-input">Order IDs</label> for="order-ids-input">Platform Transaction IDs</label>
<div class="col-sm-8"> <div class="col-sm-8">
<input class="form-control" <textarea class="form-control"
ng-model="riskEvent.order_ids" ng-model="riskEvent.order_ids"
type="text" type="text"
rows="2"
name="order_ids" name="order_ids"
id="order-ids-input" id="order-ids-input"
placeholder="order id1,order id2,order id3..." placeholder="多个id请用半角逗号 ',' 隔开"
required> required>
</textarea>
<div ng-messages="riskEventForm.order_ids.$error" <div ng-messages="riskEventForm.order_ids.$error"
ng-if="riskEventForm.order_ids.$dirty"> ng-if="riskEventForm.order_ids.$dirty">
<p class="small text-danger" <p class="small text-danger"
@ -207,17 +209,54 @@
</textarea> </textarea>
</div> </div>
</div> </div>
<div class="form-group" ng-repeat="material in materials"
ng-if="riskEvent.order_type == 2">
<label class="control-label col-sm-2"
for="material{{$index+1}}">Material{{$index + 1}}
</label>
<div class="col-sm-8">
<input class="form-control"
ng-model="material.value"
type="text"
name="material{{$index+1}}"
id="material{{$index+1}}"
required>
</div>
<div class="col-sm-2">
<a class="text-success" ng-click="increase($index)"><i class="fa fa-plus-circle" style="width: 30px"></i></a>
<a class="text-danger" ng-click="decrease($index)" ng-show="canMinus"><i class="fa fa-minus-circle" style="width: 30px"></i></a>
</div>
</div>
<div class="form-group" ng-if="riskEvent.order_type != 5">
<label class="control-label col-sm-2">是否发送商户</label>
<div class="col-xs-6">
<input type="checkbox"
ng-model="is_send_client"
ng-change="changeIsSendClient(is_send_client)"
bs-switch>
</div>
</div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
<div class="btn-group margin-bottom margin-top"> <div class="margin-bottom margin-top">
<button class="btn btn-success" <button class="btn btn-success"
type="button" type="button"
id="save-risk-btn"
ng-click="save(riskEventForm)">Save ng-click="save(riskEventForm)">Save
</button> </button>
<a role="button"
style="margin-left: 10px;"
ui-sref="analysis_monitoring.risk_business"
class="btn btn-warning">cancel
</a>
</div> </div>
</form> </form>
</div> </div>

@ -101,6 +101,10 @@
ng-click="params.channel='jd';doAnalysis(1)">JD Pay</a> | ng-click="params.channel='jd';doAnalysis(1)">JD Pay</a> |
<a role="button" ng-class="{'bg-primary':params.channel=='HF'}" <a role="button" ng-class="{'bg-primary':params.channel=='HF'}"
ng-click="params.channel='HF';doAnalysis(1)">HF Pay</a> ng-click="params.channel='HF';doAnalysis(1)">HF Pay</a>
<a role="button" ng-class="{'bg-primary':params.channel=='RPAY'}"
ng-click="params.channel='RPAY';doAnalysis(1)">RPay +</a> |
<a role="button" ng-class="{'bg-primary':params.channel=='YEEPAY'}"
ng-click="params.channel='YEEPAY';doAnalysis(1)">Yeepay</a>
</p> </p>
</div> </div>
</div> </div>

@ -100,7 +100,9 @@
<a role="button" ng-class="{'bg-primary':params.channel=='jd'}" <a role="button" ng-class="{'bg-primary':params.channel=='jd'}"
ng-click="params.channel='jd';doAnalysis(1)">JD Pay</a> | ng-click="params.channel='jd';doAnalysis(1)">JD Pay</a> |
<a role="button" ng-class="{'bg-primary':params.channel=='hf'}" <a role="button" ng-class="{'bg-primary':params.channel=='hf'}"
ng-click="params.channel='hf';doAnalysis(1)">HF Pay</a> ng-click="params.channel='hf';doAnalysis(1)">HF Pay</a> |
<a role="button" ng-class="{'bg-primary':params.channel=='YEEPAY'}"
ng-click="params.channel='YEEPAY';doAnalysis(1)">Yeepay</a>
</p> </p>
</div> </div>
</div> </div>

@ -1,4 +1,15 @@
<div class="content"> <div class="content">
<div class="box box-body" ng-if="riskEvent.process_logs != null">
<div class="box-body table-responsive pad">
<small ng-repeat="log in riskEvent.process_logs">
<div class="btn-group-vertical" style="margin-top: 5px">
<button type="button" class="btn btn-xs btn-primary" ng-class="{'btn-danger': log.result_type_to == 4, 'btn-success': log.result_type_to == 3, 'btn-warning': log.result_type_to == 1}">{{log.remark}}</button>
<button type="button" class="btn btn-xs btn-primary" ng-class="{'btn-danger': log.result_type_to == 4, 'btn-success': log.result_type_to == 3, 'btn-warning': log.result_type_to == 1}">{{log.operator}} | {{log.create_time}}</button>
</div>
<i class="fa fa-arrow-right" aria-hidden="true" style="margin-top: 5px" ng-if="riskEvent.process_logs.length > ($index + 1)"></i>
</small>
</div>
</div>
<div class="row"> <div class="row">
<div class="col-sm-12"> <div class="col-sm-12">
<div class="nav-tabs-custom"> <div class="nav-tabs-custom">
@ -43,6 +54,14 @@
</div> </div>
</div> </div>
<div class="form-group" ng-if="clientInfo.company_name != null">
<label class="control-label col-sm-2">Company Name</label>
<div class="col-sm-10">
<p class="form-control-static"
ng-bind="clientInfo.company_name"></p>
</div>
</div>
<div class="form-group" ng-if="riskEvent.order_type == 1 || riskEvent.order_type == 5"> <div class="form-group" ng-if="riskEvent.order_type == 1 || riskEvent.order_type == 5">
<label class="control-label col-sm-2">Sub Merchant ID</label> <label class="control-label col-sm-2">Sub Merchant ID</label>
<div class="col-sm-10"> <div class="col-sm-10">
@ -53,10 +72,10 @@
</div> </div>
<div class="form-group" ng-if="riskEvent.order_ids != null"> <div class="form-group" ng-if="riskEvent.order_ids != null">
<label class="control-label col-sm-2">Order IDs</label> <label class="control-label col-sm-2">Platform Transaction IDs</label>
<div class="col-sm-10"> <div class="col-sm-6">
<p class="form-control-static" <p class="form-control-static">
ng-bind="riskEvent.order_ids"> {{riskEvent.order_ids}}
</p> </p>
</div> </div>
</div> </div>
@ -134,6 +153,16 @@
</div> </div>
</div> </div>
<div class="form-group">
<label class="control-label col-sm-2">是否发送商户</label>
<div class="col-xs-6">
<input type="checkbox"
bs-switch
switch-readonly="true"
ng-model="riskEvent.is_send_client">
</div>
</div>
<div ng-if="clientInfo != null"> <div ng-if="clientInfo != null">
<div class="form-group" ng-if="riskEvent.result_type <= 2"> <div class="form-group" ng-if="riskEvent.result_type <= 2">
<label class="control-label col-sm-2">Operaction</label> <label class="control-label col-sm-2">Operaction</label>
@ -227,8 +256,8 @@
<thead> <thead>
<tr> <tr>
<th>Partner</th> <th>Partner</th>
<th>Order ID</th>
<th>Platform Transaction ID</th> <th>Platform Transaction ID</th>
<th>Order ID</th>
<th>Order Description</th> <th>Order Description</th>
<th>Customer ID</th> <th>Customer ID</th>
<th>IP</th> <th>IP</th>
@ -247,8 +276,8 @@
<tbody> <tbody>
<tr ng-repeat="trade in tradeLogs"> <tr ng-repeat="trade in tradeLogs">
<td>{{trade.client.short_name}}({{trade.client.client_moniker}})</td> <td>{{trade.client.short_name}}({{trade.client.client_moniker}})</td>
<td>{{trade.order_id}}</td>
<td>{{trade.system_transaction_id}}</td> <td>{{trade.system_transaction_id}}</td>
<td>{{trade.order_id}}</td>
<td>{{trade.order_description}}</td> <td>{{trade.order_description}}</td>
<td>{{trade.customer_id}}</td> <td>{{trade.customer_id}}</td>
<td>{{trade.customer_ip}}</td> <td>{{trade.customer_ip}}</td>
@ -267,6 +296,7 @@
<table class="table table-bordered table-hover table-striped" ng-if="riskEvent.order_type != 3"> <table class="table table-bordered table-hover table-striped" ng-if="riskEvent.order_type != 3">
<thead> <thead>
<tr> <tr>
<th>Platform Transaction ID</th>
<th>Order ID</th> <th>Order ID</th>
<th>Amount</th> <th>Amount</th>
<th>Input Amount</th> <th>Input Amount</th>
@ -275,24 +305,31 @@
<th>Status</th> <th>Status</th>
<th>Create Time</th> <th>Create Time</th>
<th>Gateway</th> <th>Gateway</th>
<th>Operation</th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
<tr ng-repeat="trade in tradeLogs" <tr ng-repeat="trade in tradeLogs"
ng-class="{warning:trade.clearing_status==2}"> ng-class="{warning:trade.clearing_status==2}">
<td>{{trade.system_transaction_id}}</td>
<td>{{trade.order_id}}</td> <td>{{trade.order_id}}</td>
<td>{{trade.currency}} {{trade.total_amount}}</td> <td>{{trade.currency}} {{trade.total_amount}}</td>
<td>{{trade.currency}} {{trade.display_amount}}</td> <td>{{trade.currency}} {{trade.display_amount}}</td>
<td>AUD {{trade.clearing_amount}}</td> <td>AUD {{trade.clearing_amount}}</td>
<td> <td>
<span ng-if="(trade.channel != 'hf') && (trade.channel != 'Rpay')" <span ng-if="(trade.channel != 'hf') && (trade.channel != 'Rpay')"
ng-bind="trade.exchange_rate"> ng-bind="trade.exchange_rate">
</span> </span>
<span ng-if="(trade.channel == 'hf') || (trade.channel == 'Rpay')"> - </span> <span ng-if="(trade.channel == 'hf') || (trade.channel == 'Rpay')"> - </span>
</td> </td>
<td ng-bind="trade.status"></td> <td ng-bind="trade.status"></td>
<td ng-bind="trade.create_time"></td> <td ng-bind="trade.create_time"></td>
<td ng-bind="trade.gateway"></td> <td ng-bind="trade.gateway"></td>
<td>
<a role="button" class="text-bold" ng-click="showTradeDetail(trade)" title="Detail">
<i class="fa fa-list-alt"></i>
</a>
</td>
</tr> </tr>
</tbody> </tbody>
</table> </table>
@ -389,15 +426,16 @@
ng-if="riskEventEdit.order_type != 4" ng-if="riskEventEdit.order_type != 4"
ng-class="{'has-error':riskEventForm.order_ids.$invalid && riskEventForm.order_ids.$dirty}"> ng-class="{'has-error':riskEventForm.order_ids.$invalid && riskEventForm.order_ids.$dirty}">
<label class="control-label col-sm-2" <label class="control-label col-sm-2"
for="order-ids-input">Order IDs for="order-ids-input">Platform Transaction IDs
</label> </label>
<div class="col-sm-8"> <div class="col-sm-8">
<input class="form-control" <textarea class="form-control"
ng-model="riskEventEdit.order_ids" ng-model="riskEventEdit.order_ids"
type="text" type="text"
name="order_ids" name="order_ids"
id="order-ids-input" id="order-ids-input"
required> required>
</textarea>
<div ng-messages="riskEventForm.order_ids.$error" <div ng-messages="riskEventForm.order_ids.$error"
ng-if="riskEventForm.order_ids.$dirty"> ng-if="riskEventForm.order_ids.$dirty">
<p class="small text-danger" <p class="small text-danger"
@ -483,6 +521,15 @@
</div> </div>
</div> </div>
<div class="form-group" ng-if="riskEvent.order_type != 5">
<label class="control-label col-sm-2">是否发送商户</label>
<div class="col-xs-6">
<input type="checkbox"
bs-switch
ng-model="riskEventEdit.is_send_client">
</div>
</div>
<div class="form-group"> <div class="form-group">
<label class="control-label col-sm-2" <label class="control-label col-sm-2"
for="channel-result-input">Channel Handle Result for="channel-result-input">Channel Handle Result

@ -57,200 +57,63 @@
<form novalidate name="uploadForm"> <form novalidate name="uploadForm">
<div class="panel-body"> <div class="panel-body">
<div class="form-horizontal"> <div class="form-horizontal">
<div class="form-group"> <div class="form-group" ng-if="allMaterialInfo.refuse_description != null">
<div class="col-sm-12 text-left"> <label class="control-label col-sm-2">Refuse Reason</label>
<p ng-if="riskEvent.order_type==1"> <div class="col-sm-10">
1、物流公司发货单据照片 <div class="form-control-static">
要求:每笔交易对应的物流单必须提供,且单据必须清晰可见<br> <p ng-bind="allMaterialInfo.refuse_description"></p>
Photos of logistics companies goods-delivery documents
Requirement: The logistics order record corresponding to each transaction must be provided,
and details of records should be clearly visible.
</p>
<p ng-if="riskEvent.order_type==3">
1.请解释相应的消费场景/业务模式,例如网站商城,扫码支付, 消费者到店支付等;<br>
Please explain the relative payment scenario/business activities,
for example, online store, QR code payment, payment at the store, etc;
</p>
</div>
<div class="col-sm-12">
<div class="col-xs-12" ng-if="uploadShowFlag">
<button class="btn btn-primary" type="button"
ngf-select="uploadFile1($files)" ngf-multiple="true">
<i class="fa fa-upload"></i> Upload
</button>
</div>
&nbsp;&nbsp;<br>
<div class="col-xs-12">
<uib-progressbar value="file1Progress.value" type="success" animate="true" ng-if="file1Progress.value" max="100"
>{{file1Progress.value}}%</uib-progressbar>
<img class="col-xs-3 logo-width" ng-repeat="url in (material.file1 || material.file1_url)" ng-src="{{url}}">
</div>
</div>
</div>
<div class="form-group">
<div class="col-sm-12 text-left">
<p ng-if="riskEvent.order_type==1">
2、用户购买虚拟物品需要提供聊天记录、订单信息、发货凭证截图、
虚拟物品最终消费场景(例如何种游戏、软件)、提供消费场景网址/下载链接
要求:每笔交易对应的截图必须清晰可见<br>
Users need to provide chat records, order information, screenshots of delivery documents,
final consumption scenarios of virtual goods (such as games, software);
provide consumer scene URL / download link.
Requirement: The screenshot corresponding to each transaction must be clearly visible.
</p>
<p ng-if="riskEvent.order_type==3">
2.提供相应购物清单,订单小票(请提供与被查交易订单号相匹配的交易时间及金额的发票);<br>
Provide related shopping lists, invoices.
(Please provide the invoices, amount of which matches that of the abnormal transaction);
</p>
</div>
<div class="col-sm-12">
<div class="col-xs-12" ng-if="uploadShowFlag">
<button class="btn btn-primary" type="button"
ngf-select="uploadFile2($files)" ngf-multiple="true">
<i class="fa fa-upload"></i> Upload
</button>
</div>
&nbsp;&nbsp;<br>
<div class="col-xs-12">
<uib-progressbar value="file2Progress.value" type="success" animate="true" ng-if="file2Progress.value" max="100"
>{{file2Progress.value}}%</uib-progressbar>
<img class="col-xs-3 logo-width" ng-repeat="url in (material.file2 ||material.file2_url)" ng-src="{{url}}">
</div>
</div>
</div>
<div class="form-group">
<div class="col-sm-12 text-left">
<p ng-if="riskEvent.order_type==1">
3、购物小票/发票存根照片
照片应清晰,必须显示商户名称、商户地址、购物时间、物品名称
购物金额等<br>
Photos of shopping receipts/ invoice stubs
Requirement: The photos should be clear and must show Merchant name,
Business address, Transaction time, Product information, Quantity purchased, etc.
</p>
<p ng-if="riskEvent.order_type==3">
3.提供相应的发货证明,报关单(若有消费者在国内购买,请提供物流单据或报关单);<br>
Relative proof of delivery, customs declaration
(If the consumer purchased from China, please provide shipping receipt or customs declaration);
</p>
</div>
<div class="col-sm-12">
<div class="col-xs-12" ng-if="uploadShowFlag">
<button class="btn btn-primary" type="button"
ngf-select="uploadFile3($files)" ngf-multiple="true">
<i class="fa fa-upload"></i> Upload
</button>
</div>
&nbsp;&nbsp;<br>
<div class="col-xs-12">
<uib-progressbar value="file3Progress.value" type="success" animate="true" ng-if="file3Progress.value" max="100"
>{{file3Progress.value}}%</uib-progressbar>
<img class="col-xs-3 logo-width" ng-repeat="url in (material.file3 || material.file3_url)" ng-src="{{url}}">
</div> </div>
</div> </div>
</div> </div>
<div class="form-group"> <div class="form-group" ng-repeat="item in allMaterialInfo.material">
<div class="col-sm-12 text-left"> <div class="col-sm-12 text-left">
<p ng-if="riskEvent.order_type==1"> <p>{{item.question}}</p>
4、显示商户门牌号码和店头名称的照片
要求:清晰可见,至少一张<br>
Photos of Merchant Street number & Merchant name
Requirement: At least one visible photo
</p>
<p ng-if="riskEvent.order_type==3">
4.提供您的门店照片(门店照及店铺内的照片各一张, 一张可以看到商户名的门头照,一张可以看到相关商品或服务的店内照片);<br>
Photos of the store ( one of each front-store and in-store);
</p>
</div> </div>
<div class="col-sm-12"> <div class="col-sm-12">
<div class="col-xs-12" ng-if="uploadShowFlag"> <div class="col-xs-12" ng-if="uploadShowFlag">
<button class="btn btn-primary" type="button" <button class="btn btn-primary" type="button"
ngf-select="uploadFile4($files)" ngf-multiple="true"> ngf-select="uploadFile($files, $index)" ngf-multiple="true">
<i class="fa fa-upload"></i> Upload <i class="fa fa-upload"></i> Upload
</button> </button>
</div> </div>
&nbsp;&nbsp;<br> &nbsp;&nbsp;<br>
<div class="col-xs-12"> <div class="col-xs-12">
<uib-progressbar value="file4Progress.value" type="success" animate="true" ng-if="file4Progress.value" max="100" <uib-progressbar value="item.fileProgressValue"
>{{file4Progress.value}}%</uib-progressbar> type="success"
<img class="col-xs-3 logo-width" ng-repeat="url in (material.file4 || material.file4_url)" ng-src="{{url}}"> animate="true"
</div> ng-if="item.fileProgressValue"
</div> max="100"
>{{item.fileProgressValue}}%</uib-progressbar>
</div> <img class="col-xs-3 logo-width"
<div class="form-group"> ng-if="uploadShowFlag"
<div class="col-sm-12 text-left"> ng-repeat="url in item.uploadFile"
<p ng-if="riskEvent.order_type==1"> ng-src="{{url}}">
5、显示商户营业场景所场内部情况如店内商品陈列、收银台等的照片 <img class="col-xs-3 logo-width"
要求:照片清晰,且能清楚显示商户实际售卖物品或服务,至少三张<br> ng-if="!uploadShowFlag"
Photos of internal environment of merchant business ng-repeat="url in item.file"
(such as in-store merchandise display, checkout counter, etc.) ng-src="{{url}}">
Requirements: The photos (at least three)
showing merchant activities including actual selling-goods or services obviously
</p>
<p ng-if="riskEvent.order_type==3">
5.其他可以还原交易背景的资料,如和消费者的聊天记录等,来佐证被查单号交易的真实性;<br>
Other materials that can verify the payment scenario, for example,
chatting history, to prove the truth of the transactions;
</p>
</div>
<div class="col-sm-12">
<div class="col-xs-12" ng-if="uploadShowFlag">
<button class="btn btn-primary" type="button"
ngf-select="uploadFile5($files)" ngf-multiple="true">
<i class="fa fa-upload"></i> Upload
</button>
</div>
&nbsp;&nbsp;<br>
<div class="col-xs-12">
<uib-progressbar value="file5Progress.value" type="success" animate="true" ng-if="file5Progress.value" max="100"
>{{file5Progress.value}}%</uib-progressbar>
<img class="col-xs-3 logo-width" ng-repeat="url in (material.file5 || material.file5_url)" ng-src="{{url}}">
</div> </div>
</div> </div>
</div> </div>
<div class="form-group">
<div class="col-sm-12 text-left">
<p>6、其他图片<br>
Other pictures
</p>
</div>
<div class="col-sm-12">
<div class="col-xs-12" ng-if="uploadShowFlag">
<button class="btn btn-primary" type="button"
ngf-select="uploadFile6($files)" ngf-multiple="true">
<i class="fa fa-upload"></i> Upload
</button>
</div>
&nbsp;&nbsp;<br>
<div class="col-xs-12">
<uib-progressbar value="file6Progress.value" type="success" animate="true" ng-if="file6Progress.value" max="100"
>{{file6Progress.value}}%</uib-progressbar>
<img class="col-xs-3 logo-width" ng-repeat="url in (material.file6 || material.file6_url)" ng-src="{{url}}">
</div>
</div>
</div>
<div class="form-group"> <div class="form-group">
<label class="control-label col-sm-2">Description</label> <label class="control-label col-sm-2">Description</label>
<div class="col-sm-10"> <div class="col-sm-10">
<textarea class="form-control" required <textarea class="form-control" required
ng-model="material.description" placeholder="No more than 500" ng-model="allMaterialInfo.description"
placeholder="No more than 500"
name="description" name="description"
ng-disabled="!uploadShowFlag" ng-disabled="!uploadShowFlag"
maxlength="500"></textarea> maxlength="500"></textarea>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</form> </form>
<div style="text-align: center" ng-if="uploadShowFlag"> <div style="text-align: center" ng-if="uploadShowFlag">
<a role="button" style="margin-bottom: 25px;" class="btn btn-success btn-sm ng-scope" ng-disabled="!(material.description)" <a role="button" style="margin-bottom: 25px;" class="btn btn-success btn-sm ng-scope" ng-disabled="!(allMaterialInfo.description)"
ng-click="submit(uploadForm)">Submit</a> ng-click="submit(uploadForm)">Submit</a>
</div> </div>

@ -1,3 +1,8 @@
<style>
.pass_timeout {
color: red;
}
</style>
<section class="content-header"> <section class="content-header">
<h1>Risk Records</h1> <h1>Risk Records</h1>
<ol class="breadcrumb"> <ol class="breadcrumb">
@ -56,10 +61,10 @@
</div> </div>
</div> </div>
<!--Order IDs--> <!--Platform Transaction IDs-->
<div class="form-group col-sm-6"> <div class="form-group col-sm-6">
<label class="control-label col-xs-4 col-sm-4" <label class="control-label col-xs-4 col-sm-4"
for="order-ids-input">Order IDs for="order-ids-input">Platform Transaction IDs
</label> </label>
<div class="col-xs-6"> <div class="col-xs-6">
<input class="form-control" <input class="form-control"
@ -103,39 +108,75 @@
<!--Receive Email Date--> <!--Receive Email Date-->
<div class="form-group col-sm-6"> <div class="form-group col-sm-6">
<label class="control-label col-xs-4 col-sm-4" <label class="control-label col-xs-4 col-sm-4">
for="receive-date-input">Receive Date Receive Date
</label> </label>
<div class="col-xs-6"> <div class="form-control-static form-inline">
<input class="form-control" <div class="col-xs-6">
id="receive-date-input" <div style="display: inline-block">
type="text" <input class="form-control"
ng-model="params.receiveEmailDate" id="receive-date-begin-input"
uib-datepicker-popup type="text"
size="10" ng-model="params.receiveEmailDateBegin"
placeholder="Receive Email Date" uib-datepicker-popup
datepicker-options="{maxDate:today}" size="10"
is-open="ReceiveDate.open" placeholder="From"
ng-click="ReceiveDate.open=true"> datepicker-options="{maxDate:params.receiveEmailDateEnd}"
is-open="receiveEmailDateBegin.open"
ng-click="receiveEmailDateBegin.open=true"></div>
~
<div style="display: inline-block">
<input class="form-control"
id="receive-date-end-input"
type="text"
ng-model="params.receiveEmailDateEnd"
uib-datepicker-popup
size="10"
placeholder="To"
datepicker-options="{minDate:params.receiveEmailDateBegin}"
is-open="receiveEmailDateEnd.open"
ng-click="receiveEmailDateEnd.open=true">
</div>
</div>
</div> </div>
</div> </div>
<!--Reply Email Deadline--> <!--Reply Email Deadline-->
<div class="form-group col-sm-6"> <div class="form-group col-sm-6">
<label class="control-label col-xs-4 col-sm-4" <label class="control-label col-xs-4 col-sm-4">
for="reply-deadline-input">Reply Deadline Reply Deadline
</label> </label>
<div class="col-xs-6"> <div class="form-control-static form-inline">
<input class="form-control" <div class="col-xs-6">
id="reply-deadline-input" <div style="display: inline-block">
type="text" <input class="form-control"
ng-model="params.replyEmailDate" id="reply-deadline-begin-input"
uib-datepicker-popup type="text"
size="10" ng-model="params.replyEmailDateBegin"
placeholder="Reply Email Deadline" uib-datepicker-popup
is-open="ReplyDeadline.open" size="10"
ng-click="ReplyDeadline.open=true"> placeholder="From"
is-open="replyEmailDateBegin.open"
datepicker-options="{maxDate:params.replyEmailDateEnd}"
ng-click="replyEmailDateBegin.open=true">
</div>
~
<div style="display: inline-block">
<input class="form-control"
id="reply-deadline-end-input"
type="text"
ng-model="params.replyEmailDateEnd"
uib-datepicker-popup
size="10"
placeholder="To"
is-open="replyEmailDateEnd.open"
datepicker-options="{minDate:params.replyEmailDateBegin}"
ng-click="replyEmailDateEnd.open=true">
</div>
</div>
</div> </div>
</div> </div>
<div class="form-group col-sm-6"> <div class="form-group col-sm-6">
@ -155,13 +196,13 @@
<button class="btn btn-primary" <button class="btn btn-primary"
type="button" type="button"
ng-click="loadRiskEvents(1)"> ng-click="loadRiskEvents(1)">
<i class="fa fa-search"></i>Search <i class="fa fa-search"></i> Search
</button> </button>
<a role="button" <a role="button"
class="btn btn-info" class="btn btn-info"
ui-sref=".new_riskEvent" ui-sref=".new_riskEvent"
title="New Event"> title="New Event">
<i class="fa fa-plus"></i>New Event <i class="fa fa-plus"></i> New Event
</a> </a>
</div> </div>
</div> </div>
@ -170,7 +211,11 @@
<div class="box"> <div class="box">
<div class="box-header"> <div class="box-header">
<h3 class="box-title">RiskEvent List</h3> <h3 class="box-title" style="display: inline-block; float: left;">RiskEvent List</h3>
<div>
<span class="pass_timeout pull-right">&nbsp;&nbsp;逾期提醒&nbsp;&nbsp;</span>
<span class="bg-red pull-right">&nbsp;&nbsp;等待风控&nbsp;&nbsp;</span>
</div>
</div> </div>
<div class="box-body no-padding table-responsive"> <div class="box-body no-padding table-responsive">
@ -192,16 +237,22 @@
<tbody> <tbody>
<tr ng-repeat="riskEvent in riskEvents"> <tr ng-repeat="riskEvent in riskEvents">
<td> <td>
<a role="button" ui-sref="partners.detail({clientMoniker: riskEvent.client_moniker})"> <a role="button"
ng-if="riskEvent.client_moniker != null"
ui-sref="partners.detail({clientMoniker: riskEvent.client_moniker})">
{{riskEvent.short_name}}({{riskEvent.client_moniker}}) {{riskEvent.short_name}}({{riskEvent.client_moniker}})
</a> </a>
</td> </td>
<td ng-bind="riskEvent.order_type | orderType"></td> <td ng-bind="riskEvent.order_type | orderType"></td>
<td> <td ng-class="{'bg-red': riskEvent.result_type == 2, 'pass_timeout': riskEvent.pass_timeout}">
{{riskEvent.result_type | resultType:resultSearchTypes}} <span ng-if="riskEvent.order_type == 5">-</span>
<span ng-if="riskEvent.order_type != 5">{{riskEvent.result_type | resultType:resultSearchTypes}}</span>
</td> </td>
<td ng-bind="riskEvent.sub_merchant_id"></td> <td ng-bind="riskEvent.sub_merchant_id"></td>
<td ng-bind="riskEvent.email_status | emailStatus"></td> <td>
<span ng-if="riskEvent.order_type != 5">{{riskEvent.email_status | emailStatus}}</span>
<span ng-if="riskEvent.order_type == 5">-</span>
</td>
<td ng-bind="riskEvent.description | limitTo:20"></td> <td ng-bind="riskEvent.description | limitTo:20"></td>
<td ng-bind="riskEvent.channel_result"></td> <td ng-bind="riskEvent.channel_result"></td>
@ -241,6 +292,28 @@
</div> </div>
</div> </div>
</div> </div>
<div class="box">
<div class="box-header">
<h3 class="box-title" style="display: inline-block; float: left;">RiskEvent Analysis</h3>
</div>
<div class="box-body no-padding table-responsive">
<div class="col-sm-6 col-xs-6">
<p class="text-center">行业占比</p>
<div class="chart" style="height: 400px" echarts="risk_industry_chart"
ng-class="{nodata:risk_industry_chart.nodata}"></div>
</div>
<div class="col-sm-6 col-xs-6">
<p class="text-center">金额分布</p>
<div class="chart" style="height: 400px" echarts="risk_amount_chart"
ng-class="{nodata:risk_amount_chart.nodata}"></div>
</div>
</div>
</div>
</div> </div>
</div> </div>
</div> </div>

@ -99,7 +99,9 @@
<a role="button" ng-class="{'bg-primary':params.channel=='hf'}" <a role="button" ng-class="{'bg-primary':params.channel=='hf'}"
ng-click="params.channel='hf';doAnalysis(1)">HF Pay</a> | ng-click="params.channel='hf';doAnalysis(1)">HF Pay</a> |
<a role="button" ng-class="{'bg-primary':params.channel=='RPAY'}" <a role="button" ng-class="{'bg-primary':params.channel=='RPAY'}"
ng-click="params.channel='RPAY';doAnalysis(1)">RPay +</a> ng-click="params.channel='RPAY';doAnalysis(1)">RPay +</a> |
<a role="button" ng-class="{'bg-primary':params.channel=='YEEPAY'}"
ng-click="params.channel='YEEPAY';doAnalysis(1)">Yeepay</a>
</p> </p>
</div> </div>
</div> </div>
@ -209,6 +211,15 @@
</div> </div>
</div> </div>
</div> </div>
<div class="col-sm-2 col-xs-6">
<div class="description-block">
<div class="description-header text-bold"><img src="/static/images/yeepay_sign.png"/>Yeepay</div>
<div class="description-text text-red">
<label class="description-text"
ng-bind="totalChannelAmount.yeepayamount|currency: ' $ '"></label>
</div>
</div>
</div>
</div> </div>
<!--<table class="table"> <!--<table class="table">

@ -179,6 +179,15 @@
</div> </div>
</div> </div>
</div> </div>
<div class="col-sm-2 col-xs-6">
<div class="description-block">
<div class="description-header text-bold"><img src="/static/images/yeepay_sign.png"/>Yeepay</div>
<div class="description-text">
<label class="description-text text-red"
ng-bind="totalChannelAmount.yeepayamount|currency: ' $ '"></label>
</div>
</div>
</div>
</div> </div>
<!-- <table class="table"> <!-- <table class="table">

@ -40,9 +40,11 @@
<a role="button" ng-class="{'bg-primary':params.channel=='jd'}" <a role="button" ng-class="{'bg-primary':params.channel=='jd'}"
ng-click="params.channel='jd';loadTradeLogs()">JD Pay</a> | ng-click="params.channel='jd';loadTradeLogs()">JD Pay</a> |
<a role="button" ng-class="{'bg-primary':params.channel=='hf'}" <a role="button" ng-class="{'bg-primary':params.channel=='hf'}"
ng-click="params.channel='hf';loadTradeLogs()">HF Pay</a> ng-click="params.channel='hf';loadTradeLogs()">HF Pay</a> |
<a role="button" ng-class="{'bg-primary':params.channel=='RPAY'}" <a role="button" ng-class="{'bg-primary':params.channel=='RPAY'}"
ng-click="params.channel='RPAY';loadTradeLogs(1)">RPay +</a> ng-click="params.channel='RPAY';loadTradeLogs(1)">RPay +</a> |
<a role="button" ng-class="{'bg-primary':params.channel=='YEEPAY'}"
ng-click="params.channel='YEEPAY';loadTradeLogs(1)">Yeepay</a>
</p> </p>
</div> </div>
</div> </div>

@ -34,14 +34,14 @@ define(['angular', 'angularSanitize', 'angularAnimate', 'angularMessages', 'uiRo
// if ($rootScope.currentUser.role ==2 || $rootScope.currentUser.role == 4){ // if ($rootScope.currentUser.role ==2 || $rootScope.currentUser.role == 4){
// $scope.loadPartnerApplyNotice(); // $scope.loadPartnerApplyNotice();
// } // }
if ($rootScope.currentUser.wx_openid == null) { /*if ($rootScope.currentUser.wx_openid == null) {
if ($filter('withRole')('100')) { if ($filter('withRole')('100')) {
$scope.managerBindWechat('static'); $scope.managerBindWechat('static');
} else { } else {
$scope.managerBindWechat(true); $scope.managerBindWechat(true);
} }
} }*/
}, function (resp) { }, function (resp) {
if (resp.status == 403) { if (resp.status == 403) {
location.href = 'm_login.html?f=' + encodeURIComponent(location.href); location.href = 'm_login.html?f=' + encodeURIComponent(location.href);
@ -49,7 +49,6 @@ define(['angular', 'angularSanitize', 'angularAnimate', 'angularMessages', 'uiRo
}) })
}; };
$scope.loadCurrentUser(); $scope.loadCurrentUser();
$scope.getManagerTodoNotices = function () { $scope.getManagerTodoNotices = function () {
$http.get('/global/userstatus/manager_todo_notices').then(function (resp) { $http.get('/global/userstatus/manager_todo_notices').then(function (resp) {
if (resp.data.length) { if (resp.data.length) {
@ -201,7 +200,17 @@ define(['angular', 'angularSanitize', 'angularAnimate', 'angularMessages', 'uiRo
window.open('/service_client.html?key='+resp.data.appkey+'&p='+resp.data.password+'&uid='+resp.data.user_id,'_blank'); window.open('/service_client.html?key='+resp.data.appkey+'&p='+resp.data.password+'&uid='+resp.data.user_id,'_blank');
}); });
} }
$scope.loadWechatBind = function () {
if (window.currentUser.wx_openid == null) {
if ((window.currentUser.role & 4) > 0) {
$scope.managerBindWechat('static');
} else {
$scope.managerBindWechat(true);
}
}
};
$scope.loadWechatBind();
function hasRole() { function hasRole() {
var rolenum; var rolenum;
switch (sessionStorage.getItem('role')) { switch (sessionStorage.getItem('role')) {

@ -162,14 +162,14 @@ define(['angular', 'angularSanitize', 'angularAnimate', 'angularMessages', 'uiRo
// if ($rootScope.currentUser.role ==2 || $rootScope.currentUser.role == 4){ // if ($rootScope.currentUser.role ==2 || $rootScope.currentUser.role == 4){
// $scope.loadPartnerApplyNotice(); // $scope.loadPartnerApplyNotice();
// } // }
if ($rootScope.currentUser.wx_openid == null) { /*if ($rootScope.currentUser.wx_openid == null) {
if ($filter('withRole')('100')) { if ($filter('withRole')('100')) {
$scope.managerBindWechat('static'); $scope.managerBindWechat('static');
} else { } else {
$scope.managerBindWechat(true); $scope.managerBindWechat(true);
} }
} }*/
}, function (resp) { }, function (resp) {
if (resp.status == 403) { if (resp.status == 403) {
location.href = 'm_login.html?f=' + encodeURIComponent(location.href); location.href = 'm_login.html?f=' + encodeURIComponent(location.href);
@ -311,6 +311,18 @@ define(['angular', 'angularSanitize', 'angularAnimate', 'angularMessages', 'uiRo
}); });
} }
$scope.loadWechatBind = function () {
if (window.currentUser.wx_openid == null) {
if ((window.currentUser.role & 4) > 0) {
$scope.managerBindWechat('static');
} else {
$scope.managerBindWechat(true);
}
}
};
$scope.loadWechatBind();
}]); }]);
app.controller('changePwdCtrl', ['$scope', '$http', function ($scope, $http) { app.controller('changePwdCtrl', ['$scope', '$http', function ($scope, $http) {
$scope.formData = {}; $scope.formData = {};

@ -9,6 +9,8 @@ define(['./app',
'./services/chartParser', './services/chartParser',
'./services/orderService', './services/orderService',
'./services/businessStructuresMap', './services/businessStructuresMap',
'./services/yeepayBusinessContentMap',
'./services/yeepayIndustryMap',
'./services/stateMap', './services/stateMap',
'./services/industryMap', './services/industryMap',
'./services/sectorMap', './services/sectorMap',

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save