From 0b909d47ba251f194839c9503ed97acc9e244b51 Mon Sep 17 00:00:00 2001 From: lujian Date: Tue, 19 Feb 2019 17:12:04 +0800 Subject: [PATCH] [fix] --- .../core/impl/RiskBusinessServiceImpl.java | 169 +++++++++++++++--- 1 file changed, 141 insertions(+), 28 deletions(-) diff --git a/src/main/java/au/com/royalpay/payment/manage/riskbusiness/core/impl/RiskBusinessServiceImpl.java b/src/main/java/au/com/royalpay/payment/manage/riskbusiness/core/impl/RiskBusinessServiceImpl.java index 703440f63..8a0ee29de 100644 --- a/src/main/java/au/com/royalpay/payment/manage/riskbusiness/core/impl/RiskBusinessServiceImpl.java +++ b/src/main/java/au/com/royalpay/payment/manage/riskbusiness/core/impl/RiskBusinessServiceImpl.java @@ -2,6 +2,7 @@ package au.com.royalpay.payment.manage.riskbusiness.core.impl; import au.com.royalpay.payment.core.exceptions.EmailException; import au.com.royalpay.payment.core.exceptions.InvalidShortIdException; +import au.com.royalpay.payment.core.exceptions.OrderNotExistsException; import au.com.royalpay.payment.core.exceptions.OrderNotMatchException; import au.com.royalpay.payment.manage.mappers.log.AppMessageLogMapper; import au.com.royalpay.payment.manage.mappers.payment.OrderMapper; @@ -10,9 +11,9 @@ 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.RiskMaterialMapper; import au.com.royalpay.payment.manage.mappers.riskbusiness.RiskOrdersMapper; -import au.com.royalpay.payment.manage.mappers.system.ClientBDMapper; 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.ClientBDMapper; 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; @@ -20,32 +21,31 @@ 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.RiskOrderTypeEnum; 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.core.ManagerTodoNoticeProvider; import au.com.royalpay.payment.manage.tradelog.core.TradeLogService; +import au.com.royalpay.payment.manage.riskbusiness.enums.RiskOrderTypeEnum; import au.com.royalpay.payment.tools.device.message.AppMessage; import au.com.royalpay.payment.tools.device.message.AppMsgSender; import au.com.royalpay.payment.tools.env.PlatformEnvironment; import au.com.royalpay.payment.tools.exceptions.BadRequestException; -import au.com.royalpay.payment.tools.exceptions.ServerErrorException; import au.com.royalpay.payment.tools.locale.LocaleSupport; import au.com.royalpay.payment.tools.permission.enums.ManagerRole; +import au.com.royalpay.payment.tools.exceptions.ServerErrorException; import au.com.royalpay.payment.tools.threadpool.RoyalThreadPoolExecutor; import au.com.royalpay.payment.tools.utils.PageListUtils; +import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.github.miemiedev.mybatis.paginator.domain.Order; import com.github.miemiedev.mybatis.paginator.domain.PageBounds; import com.github.miemiedev.mybatis.paginator.domain.PageList; +import org.apache.commons.codec.binary.Base64; import org.apache.commons.lang3.RandomStringUtils; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.time.DateFormatUtils; import org.apache.commons.lang3.time.DateUtils; -import org.apache.poi.ss.usermodel.Cell; -import org.apache.poi.ss.usermodel.Row; -import org.apache.poi.ss.usermodel.Sheet; -import org.apache.poi.ss.usermodel.Workbook; +import org.apache.poi.ss.usermodel.*; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -55,19 +55,17 @@ import org.springframework.transaction.annotation.Transactional; import org.thymeleaf.context.Context; import org.thymeleaf.spring4.SpringTemplateEngine; -import javax.annotation.Resource; import javax.servlet.http.HttpServletResponse; -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.io.InputStream; +import java.io.*; import java.net.URL; import java.text.ParseException; import java.util.*; +import javax.annotation.Resource; import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.ThreadPoolExecutor; -import java.util.concurrent.TimeUnit; import java.util.zip.ZipEntry; import java.util.zip.ZipOutputStream; +import java.util.concurrent.TimeUnit; /** * @Author lvjian @@ -254,7 +252,10 @@ public class RiskBusinessServiceImpl implements RiskBusinessService, ManagerTodo if (client != null && StringUtils.isNotBlank(realOrderIds)) { String[] orderIdArray = realOrderIds.trim().split(","); JSONObject orderInfo = new JSONObject(); - // 获取订单信息 + /** + * 获取订单信息 + * 通用号调单与其他类型的调单,订单格式不一样,所以区分 + */ if (riskEvent.getIntValue("order_type") == 3) { for (int i = 0; i < orderIdArray.length; i++) { orderInfo = tradeLogService.getOrderDetail(new JSONObject(), riskEvent.getString("client_moniker"), orderIdArray[i], null); @@ -322,6 +323,14 @@ public class RiskBusinessServiceImpl implements RiskBusinessService, ManagerTodo } return params; } + + /** + * 添加风控事件 + * 更新risk_orders表 + * 记录风控日志 + * @param params + * @param manager + */ @Override public void addRiskEvent(JSONObject params, JSONObject manager) { params = getEvent(params); @@ -359,6 +368,11 @@ public class RiskBusinessServiceImpl implements RiskBusinessService, ManagerTodo setRiskOrders(params); } + /** + * 下载审核材料 + * @param riskId + * @param response + */ @Override public void downloadAuditMaterialZiP(String riskId, HttpServletResponse response) { @@ -369,13 +383,13 @@ public class RiskBusinessServiceImpl implements RiskBusinessService, ManagerTodo param.put("orderby_type", "update_time"); JSONObject riskMaterial = getRiskMaterial(param); try { - String downloadFilename = clientMoniker + "_audit_materials_" + DateFormatUtils.format(new Date(), "dd/MM/yyyy HH:mm:ss") + ".zip"; + String downloadFilename = clientMoniker + "_audit_materials_" + DateFormatUtils.format(new Date(), "dd/MM/yyyy HH:mm:ss").toString() + ".zip"; response.setContentType("application/octet-stream"); response.setHeader("Content-Disposition", "attachment;filename=" + downloadFilename); ZipOutputStream zos = new ZipOutputStream(response.getOutputStream()); - for(int i=1;i<=6;i++){ - if(riskMaterial.containsKey("file"+i)){ - List fileList= (List)riskMaterial.get("file"+i); + for(int i = 1; i <= 6; i++){ + if(riskMaterial.containsKey("file" + i)){ + List fileList= (List) riskMaterial.get("file"+i); for(String fileUrl : fileList){ zos.putNextEntry(new ZipEntry("file" + i+fileUrl.substring(fileUrl.lastIndexOf("/")))); InputStream inputStream = new URL(fileUrl).openConnection().getInputStream(); @@ -395,6 +409,14 @@ public class RiskBusinessServiceImpl implements RiskBusinessService, ManagerTodo } } + /** + * 发送邮件 + * 更新事件信息 + * 记录风控日志 + * App推送消息 + * @param riskId + * @throws IOException + */ @Override public void sendUploadEmail(String riskId) throws IOException { JSONObject event = getRiskEventDetail(riskId); @@ -435,6 +457,11 @@ public class RiskBusinessServiceImpl implements RiskBusinessService, ManagerTodo }); } + /** + * App推送消息 + * 推送类型risk + * @param event + */ private void sendAppRiskMessage(JSONObject event){ JSONObject client = clientMapper.findClientByMoniker(event.getString("client_moniker")); logger.debug("sendRiskAppMessage-" + client.getString("client_moniker") + "-" + "risk_id:"+event.getString("risk_id")); @@ -479,6 +506,15 @@ public class RiskBusinessServiceImpl implements RiskBusinessService, ManagerTodo } } + /** + * 记录消息推送日志 + * @param dev_id + * @param client_id + * @param messageType + * @param dev_token + * @param remark + * @return + */ private JSONObject saveAppMessageLog(String dev_id, int client_id, String messageType, String dev_token, String remark) { JSONObject log = new JSONObject(); log.put("dev_id", dev_id); @@ -492,6 +528,15 @@ public class RiskBusinessServiceImpl implements RiskBusinessService, ManagerTodo } + /** + * 发送拒绝邮件 + * 判断当前事件处理状态是否合理 + * 更新事件 + * 记录风控日志 + * @param riskId + * @param refuseDescription 拒绝说明 + * @throws IOException + */ @Transactional @Override public void sendRefuseEmail(String riskId, String refuseDescription) throws IOException { @@ -520,7 +565,6 @@ public class RiskBusinessServiceImpl implements RiskBusinessService, ManagerTodo event.put("result_type",RiskResultTypeEnum.MATERIAL_NOT_PASS.getResultType()); event.put("submit_url",uploadUrl); riskEventMapper.update(event); - // 日志记录 riskProcessLogService.addRiskProcessLog(riskId, event.getString("fillin_id"), event.getString("fillin_person"), @@ -533,6 +577,11 @@ public class RiskBusinessServiceImpl implements RiskBusinessService, ManagerTodo }); } + /** + * 发送催促邮件 + * @param riskId + * @throws IOException + */ @Override public void sendUrgeEmail(String riskId) throws IOException { JSONObject event = getRiskEventDetail(riskId); @@ -616,14 +665,47 @@ public class RiskBusinessServiceImpl implements RiskBusinessService, ManagerTodo List orders = new ArrayList(); int isSendClient = event.getIntValue("is_send_client"); ctx.setVariable("emailsTos", bdEmails); + + // 内部调单需要密送的人 + List emailsBccs = new ArrayList<>(Arrays.asList( + "locky@royalpay.com.au ", "leo.huang@royalpay.com.au", + "mona.zhang@royalpay.com.au", "weixinfengkong@royalpay.com.au", "thomas.li@royalpay.com.au" + )); + + /** + * 如果发送给商户,则商户为收件人 + * 如果不是内部调单,抄送bd; + * 如果是内部调单,密送bd与上面定义的‘emailsBccs’ + * 如果没有勾选发送商户 + * 如果不是内部调单,直接发送商户; + * 如果是内部调单,则自定义“"18852852189@163.com"为收件人,密送同上 + * + * Arrays.asList("18852852189@139.com", "1370256381@qq.com")为本地debug模式的测试邮箱 + */ 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" + ctx.setVariable("emailsCcs", null); + if (PlatformEnvironment.getEnv().isDebug()) { + emailsBccs = new ArrayList<>(Arrays.asList( + "18852852189@139.com", "1370256381@qq.com" + )); + } + emailsBccs.addAll(bdEmails); + ctx.setVariable("emailsBccs", emailsBccs); + } + } else { + if (orderType == RiskOrderTypeEnum.ROYALPAY_ORDER.getOrderType().intValue()) { + if (PlatformEnvironment.getEnv().isDebug()) { + emailsBccs = new ArrayList<>(Arrays.asList( + "18852852189@139.com", "1370256381@qq.com" + )); + } + emailsBccs.addAll(bdEmails); + ctx.setVariable("emailsBccs", emailsBccs); + ctx.setVariable("emailsTos", Arrays.asList( + "18852852189@163.com" )); } } @@ -674,6 +756,11 @@ public class RiskBusinessServiceImpl implements RiskBusinessService, ManagerTodo return UPLOAD_MAIL_PREFIX + codeKey; } + /** + * 获取风控事件上传的材料 + * @param param + * @return + */ @Override public JSONObject getRiskMaterial(JSONObject param) { List riskMaterialList = riskMaterialMapper.findAllMaterials(param.getString("risk_id")); @@ -682,14 +769,14 @@ public class RiskBusinessServiceImpl implements RiskBusinessService, ManagerTodo List files = riskFileMapper.findAllFiles(fileNew.getString("material_id")); for(JSONObject file : files){ int fileType = file.getIntValue("file_type"); - if(!fileNew.containsKey("file"+fileType)){ + if(!fileNew.containsKey("file" + fileType)){ List fileList = new ArrayList<>(); fileList.add(file.getString("file_url")); - fileNew.put("file"+fileType,fileList); + fileNew.put("file" + fileType, fileList); }else{ - List fileList = (List)fileNew.get("file"+fileType); + List fileList = (List) fileNew.get("file"+fileType); fileList.add(file.getString("file_url")); - fileNew.put("file"+fileType,fileList); + fileNew.put("file" + fileType, fileList); } } return fileNew; @@ -698,6 +785,12 @@ public class RiskBusinessServiceImpl implements RiskBusinessService, ManagerTodo return null; } + /** + * 由于之前误把system_transaction_id当做order_id, + * 所以新增real_order_id作为order_id, + * 对已经建立的风控事件,补全real_order_id字段 + * 后面查找订单时会根据client_id与real_order_id查找 + */ @Override @Transactional public void completeEventRealOrderIds() { @@ -849,12 +942,17 @@ public class RiskBusinessServiceImpl implements RiskBusinessService, ManagerTodo return ""; } + /** + * 检查是否有需要的调单事件待处理,由前端弹框提醒 + * @param manager + * @param notices + */ @Override public void checkTodo(JSONObject manager, List notices) { /** * 1、判断登录的角色是不是BD * 2、列出BD管理的商户 - * 3、 + * 3、遍历商户,如果有调单事件退出循环,noticeFlag设为true */ if (ManagerRole.BD_USER.hasRole(manager.getIntValue("role"))) { JSONObject params = new JSONObject(); @@ -891,6 +989,11 @@ public class RiskBusinessServiceImpl implements RiskBusinessService, ManagerTodo riskEventMapper.deleteRiskEvent(riskId); } + /** + * 某个商户是否存在调单事件 + * @param clientId + * @return + */ @Override public JSONObject getNoticeInfo(int clientId) { @@ -914,6 +1017,13 @@ public class RiskBusinessServiceImpl implements RiskBusinessService, ManagerTodo return result; } + /** + * 调单事件需要上传的材料说明 + * 微信调单与内部调单是固定的 + * 支付宝调单由风控人员录入 + * @param riskId + * @return + */ @Override public JSONObject getRiskEventMaterialsRemark(String riskId) { JSONObject riskEvent = riskEventMapper.findById(riskId); @@ -1017,11 +1127,14 @@ public class RiskBusinessServiceImpl implements RiskBusinessService, ManagerTodo return event; } + /** + * risk_orders表补全数据 + */ @Override public void completeOrderAmount() { List riskEventList = getRiskEvents(null); for(JSONObject riskEvent:riskEventList){ - if(riskEvent.getIntValue("order_type")==4 || StringUtils.isBlank(riskEvent.getString("real_order_ids"))){ + if(riskEvent.getIntValue("order_type") == 4 || StringUtils.isBlank(riskEvent.getString("real_order_ids"))){ continue; } String[] order_ids=riskEvent.getString("real_order_ids").split(",");