Merge remote-tracking branch 'origin/develop'

master
james.zhao 8 years ago
commit 9c5f01958a

@ -40,6 +40,10 @@
<groupId>au.com.royalpay.payment</groupId>
<artifactId>rpay-core</artifactId>
</dependency>
<dependency>
<groupId>au.com.royalpay.payment</groupId>
<artifactId>yeepay-core</artifactId>
</dependency>
<dependency>
<groupId>com.github.stuxuhai</groupId>
<artifactId>jpinyin</artifactId>
@ -204,4 +208,4 @@
</plugin>
</plugins>
</build>
</project>
</project>

@ -30,6 +30,8 @@ public class ChannelsAnalysisServiceImpl implements ChannelsAnalysisService {
listChannel.add(putParam(params,"AlipayOnline"));
listChannel.add(putParam(params,"jd"));
listChannel.add(putParam(params,"hf"));
listChannel.add(putParam(params,"Rpay"));
listChannel.add(putParam(params,"Yeepay"));
return listChannel;
}
@ -40,7 +42,7 @@ public class ChannelsAnalysisServiceImpl implements ChannelsAnalysisService {
}
List<JSONObject> list = new ArrayList<>();
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){
analysisChannelCustomers(params, analysisMap, channel);
}

@ -556,7 +556,7 @@ public class DashboardServiceImpl implements DashboardService,DashboardAnalysisT
}
}
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();
for(String channel:channels) {
params.put("channel", channel);

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

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

@ -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.rpay.runtime.RpayClient;
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.exceptions.InvalidShortIdException;
import au.com.royalpay.payment.core.exceptions.OrderNotExistsException;
@ -102,6 +103,8 @@ public class TestController implements ApplicationEventPublisherAware {
@Resource
private RpayClient rpayClient;
@Resource
private YeePayClient yeepayClient;
@Resource
private TradeLogService tradeLogService;
@Resource
private RetailAppService retailAppService;
@ -306,6 +309,9 @@ public class TestController implements ApplicationEventPublisherAware {
String rpayjson = JSON.toJSONString(orderInfo, SerializerFeature.PrettyFormat);
res.put("xml", rpayjson);
break;
case "Yeepay":
res.put("xml", yeepayClient.queryOrderStd(orderId).toString());
break;
default:
throw new BadRequestException("Not Support channel:" + channel);
}
@ -350,6 +356,9 @@ public class TestController implements ApplicationEventPublisherAware {
xmlStr = XmlFormatUtils.formatXml(elem);
res.put("xml", xmlStr);
break;
case "Yeepay":
res.put("xml", yeepayClient.queryRefundStd(refundOrder.getString("out_refund_id")).toString());
break;
default:
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.payment.TaskManualSettleMapper;
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.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.mappers.system.*;
import au.com.royalpay.payment.manage.merchants.core.ClientConfigService;
import au.com.royalpay.payment.manage.merchants.core.ClientManager;
import au.com.royalpay.payment.manage.notice.core.MailService;
@ -157,6 +154,9 @@ public class CleanServiceImpl implements CleanService, ManagerTodoNoticeProvider
@Resource
private SysConfigManager sysConfigManager;
@Resource
private ClientDeviceMapper clientDeviceMapper;
@Value("${app.settlement.email-to}")
private String settlementEmailTo;
@Value("${app.settlement.email-cc}")
@ -828,13 +828,15 @@ public class CleanServiceImpl implements CleanService, ManagerTodoNoticeProvider
int rowNum = 0;
Row row = sheet.createRow(rowNum);
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"};
for (int i = 0; i < title.length; i++) {
row.createCell(i, Cell.CELL_TYPE_STRING).setCellValue(title[i]);
}
JSONObject channels = clearTransation.getJSONObject("channels");
JSONObject device;
String clientDevId = "";
for (Object o : clearTransation.getJSONArray("report")) {
JSONObject settle = (JSONObject) o;
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 ? ""
: settle.getBigDecimal("settle_amount").setScale(2, BigDecimal.ROUND_DOWN).toPlainString());
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);
for (int i = 0; i < analysis.length; i++) {

@ -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);
}

@ -64,6 +64,9 @@ public interface ClientManager {
@Transactional
void updateClientRpayPaymentConfig(JSONObject manager, String clientMoniker, JSONObject rpaySubMerchantInfo);
@Transactional
void updateClientYeepayPaymentConfig(JSONObject manager, String clientMoniker, JSONObject yeepaySubMerchantInfo);
@Transactional
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 changePaymentSuccessPage(JSONObject manager, String clientMoniker, String paysuccess_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);
@ -304,6 +309,8 @@ public interface ClientManager {
List<JSONObject> listRpaySubMerchantIdApplys(JSONObject manager, String clientMoniker);
List<JSONObject> listYeepaySubMerchantIdApplys(JSONObject manager, String clientMoniker);
String subMerchantApplication(String clientMoniker, SubMerchantIdApply subMerchantApply,JSONObject manager);
List<JSONObject> listMerchantIds(String clientMoniker,JSONObject manager);
@ -332,13 +339,22 @@ public interface ClientManager {
String getShortLink(String client_moniker);
String getGatewayShortLink(String client_moniker,String channel);
@Transactional
void switchHfLink(JSONObject manager, String clientMoniker,boolean allow);
@Transactional
void switchGatewayLink(JSONObject manager, String clientMoniker,String channel,boolean allow);
void sendHfEmailNotice(JSONObject order);
void sendGatewayEmailNotice(JSONObject order);
void subRpayMerchantApplication(String clientMoniker,JSONObject merchantInfo, JSONObject manager);
void subYeepayMerchantApplication(String clientMoniker,JSONObject merchantInfo, JSONObject manager);
void updateAllPartnerPassword(String clientMoniker, List<String> emails);
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.WxPayClient;
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.exceptions.EmailException;
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.PageList;
import com.yeepay.yop.sdk.service.kj.model.SubmerchantRegisterResult;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang3.ArrayUtils;
import org.apache.commons.lang3.RandomStringUtils;
@ -243,6 +246,12 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid
@Resource
private RpayApi rpayApi;
@Resource
private YeePayClient yeePayClient;
@Resource
private YeePayClientConfigMapper yeePayClientConfigMapper;
@Resource
private ManagerMapper managerMapper;
@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");
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;
}
@ -795,6 +808,25 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid
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
public void updateAliSubMerchantId(JSONObject manager, String clientMoniker, JSONObject aliSubMerchantInfo) {
JSONObject client = getClientInfoByMoniker(clientMoniker);
@ -1220,6 +1252,9 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid
if (channel.equals("hf") && !allow && client.getBoolean("enable_hf_email_notice")) {
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));
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, "hf", "hf_rate_value", org, "min_hf_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, "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, "hf", "hf_rate_value", org, "min_hf_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+ 费率信息
rpayApi.modifySurchargeConfig(client);
@ -2995,6 +3032,17 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid
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
public void changePaymentPage(JSONObject account, String paypad_version) {
int clientId = account.getIntValue("client_id");
@ -3572,6 +3620,20 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid
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
@CacheEvict(value = ":all_sub_merchant_id_applices:", key = "#clientMoniker")
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
public List<JSONObject> listMerchantIds(String clientMoniker, JSONObject manager) {
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
public void sendHfEmailNotice(JSONObject order) {
JSONObject client = clientMapper.findClient(order.getIntValue("client_id"));
@ -3917,6 +4036,55 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid
}).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
public void updateAllPartnerPassword(String clientMoniker, List<String> emails) {
JSONObject client = getClientInfoByMoniker(clientMoniker);
@ -3946,6 +4114,13 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid
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) {
JSONObject needCheckParams = new JSONObject();

@ -178,6 +178,11 @@ public class PartnerManageController {
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})
public void updateAliSubMerchantId(@PathVariable String clientMoniker, @RequestBody JSONObject aliSubMerchantInfo, @ModelAttribute(CommonConsts.MANAGER_STATUS) JSONObject manager) {
clientManager.updateAliSubMerchantId(manager, clientMoniker, aliSubMerchantInfo);
@ -293,6 +298,11 @@ public class PartnerManageController {
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})
public JSONObject listPartnerTradeLogs(@PathVariable String clientMoniker, TradeLogQuery query, @ModelAttribute(CommonConsts.MANAGER_STATUS) JSONObject manager) throws Exception {
return tradeLogService.listPartnerTradeLogs(manager, null, clientMoniker, query, null);
@ -546,6 +556,11 @@ public class PartnerManageController {
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})
public String subMerchantApplication(@PathVariable String clientMoniker, @RequestBody SubMerchantIdApply subMerchantIdApply, @ModelAttribute(CommonConsts.MANAGER_STATUS) JSONObject 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"));
}
@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})
public void subRpayMerchantApplication(@PathVariable String clientMoniker,@RequestBody JSONObject merchantInfo,@ModelAttribute(CommonConsts.MANAGER_STATUS) JSONObject 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)
@RequireManager(role = { ManagerRole.OPERATOR})
public JSONObject lisPartnersByCompliance(@ModelAttribute(CommonConsts.MANAGER_STATUS) JSONObject manager, PartnerQuery query) {

@ -29,6 +29,7 @@ public class OrgInfo {
private Double alipayonline_rate_value;
private Double jd_rate_value;
private Double hf_rate_value;
private Double yeepay_rate_value;
private int is_valid;
private String search_text;
private int page = 1;
@ -42,6 +43,7 @@ public class OrgInfo {
private Double min_jd_rate;
private Double min_alipayonline_rate;
private Double min_hf_rate;
private Double min_yeepay_rate;
private String state;
private String senior_parent_org_id;
@ -323,4 +325,20 @@ public class OrgInfo {
public void setSenior_parent_org_id(String 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 rate2 = new JSONArray();
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 ){
if(StringUtils.isEmpty(orgObject.getString(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 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.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.risk.bean.*;
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.PageBounds;
import com.github.miemiedev.mybatis.paginator.domain.PageList;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@ -39,6 +42,12 @@ public class RiskMerchantServiceImpl implements RiskMerchantService {
private RiskAttentionMerchantsMapper riskAttentionMerchantsAMapper;
@Resource
private ClientBankAccountMapper clientBankAccountMapper;
@Resource
private RiskCustomerBlackListMapper riskCustomerBlackListMapper;
@Resource
private CustomerMapper customerMapper;
@Resource
private ManagerCustomerRelationAlipayMapper managerCustomerRelationAlipayMapper;
@Override
@Transactional
@ -243,6 +252,11 @@ public class RiskMerchantServiceImpl implements RiskMerchantService {
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("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_by", manager.getString("manager_id"));
attention.put("remark", params.getString("remark"));
@ -276,4 +290,82 @@ public class RiskMerchantServiceImpl implements RiskMerchantService {
attentionMerchant.put("last_update_by", manager.getString("manager_id"));
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 org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
@ -104,4 +99,24 @@ public class RiskController {
public void disableRiskMerchant(@ModelAttribute(CommonConsts.MANAGER_STATUS) JSONObject manager, @PathVariable String 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"));
}
}

@ -1,9 +1,11 @@
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.RequirePartner;
import au.com.royalpay.payment.tools.connections.attachment.core.AttachmentClient;
import com.alibaba.fastjson.JSONObject;
import com.yeepay.yop.sdk.service.kj.model.FileUploadResult;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
@ -20,6 +22,8 @@ import java.io.IOException;
public class AttachmentController {
@Resource
private AttachmentClient attachmentClient;
@Resource
private YeePayClient yeePayClient;
@RequestMapping(value = "/files", method = RequestMethod.POST)
@RequirePartner
@ -27,6 +31,14 @@ public class AttachmentController {
public JSONObject uploadImage(@RequestParam MultipartFile file) throws IOException {
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)
public JSONObject uploadRiskImage(@RequestParam MultipartFile file) throws IOException {
return attachmentClient.uploadFile(file,false);

@ -48,7 +48,7 @@ public class CustomerImpressionTask {
}
for (List<JSONObject> splitClients : splitList) {
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"));
});
generatePool.execute(task);
@ -56,8 +56,8 @@ public class CustomerImpressionTask {
});
}
@Scheduled(cron = "0/1 * * * * ?")
public void customerImpressionGenerateInfo() {
synchronizedScheduler.executeProcess("manage_task:CustomerImpression", 1_000, () -> customerImpressionService.generateInfo());
}
// @Scheduled(cron = "0/1 * * * * ?")
// public void customerImpressionGenerateInfo() {
// synchronizedScheduler.executeProcess("manage_task:CustomerImpression", 1_000, () -> customerImpressionService.generateInfo());
// }
}

@ -15,7 +15,7 @@ import java.util.Arrays;
import java.util.List;
@Component
@ConditionalOnProperty(value = "app.run-tasks", havingValue = "false")
@ConditionalOnProperty(value = "app.run-tasks", havingValue = "true")
public class UpdatePartnerPasswordTask {
private Logger logger = LoggerFactory.getLogger(getClass());
@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.TransactionMapper;
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.ManagerCustomerRelationAlipayMapper;
import au.com.royalpay.payment.manage.merchants.core.ClientManager;
@ -139,6 +140,9 @@ public class TradeLogServiceImpl implements TradeLogService {
@Resource
private OrgManager orgManager;
@Resource
private ClientDeviceMapper clientDeviceMapper;
// @Value("classpath:/jasper/trans_flow.jasper")
// @Value("classpath:/jasper/trans_flow_new.jasper")
@Value("classpath:/jasper/partner_invoice_gst.jasper")
@ -670,6 +674,24 @@ public class TradeLogServiceImpl implements TradeLogService {
if (transFlow.getJSONArray("data").size() > 0) {
try {
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();
parmerters.put("dateFrom", StringUtils.isNotBlank(query.getDatefrom()) ? query.getDatefrom() : "");
parmerters.put("dateTo", StringUtils.isNotBlank(query.getDateto()) ? query.getDateto() : DateFormatUtils.format(new Date(), "yyyyMMdd"));

@ -3,4 +3,4 @@ spring.datasource.schema-name=royalpay_production
spring.datasource.host=192.168.0.111:3306
spring.datasource.url=jdbc:mysql://${spring.datasource.host}/${spring.datasource.schema-name}?useUnicode=true&characterEncoding=utf8&useSSL=false
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.password=root

@ -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
spring.profiles.active=dev,alipay,bestpay,jd,wechat,rpay
spring.profiles.active=dev,alipay,bestpay,jd,wechat,rpay,yeepay
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/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.au=https://mpay-au.royalpay.com.au/
app.debug=true
@ -88,6 +88,7 @@ app.mail.host=https://mailsupport.royalpay.com.au
mail.send.credentialCode=Fd1aRfdjc9
apple.message.apns.password=F1b5*ChJPp73
apple.message.apns.file=/opt/adn
android.message.secret=2b96d9bc6169c9554218aab1
android.message.appkey=3f33a10d0a7d4ac94d8f2431
@ -131,4 +132,4 @@ settle.abafile.bank.ANZ.bank=ANZ
settle.abafile.bank.ANZ.apca=514624
settle.abafile.bank.ANZ.bsb=013006
settle.abafile.bank.ANZ.account-no=837022519
settle.abafile.bank.ANZ.account-name=Tunnel Show Pty Ltd
settle.abafile.bank.ANZ.account-name=Tunnel Show Pty Ltd

@ -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.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.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
LEFT JOIN sys_clients c ON c.client_id = s.client_id and c.is_valid=1
]]>
@ -564,4 +566,4 @@
</if>
</where>
</select>
</mapper>
</mapper>

@ -35,6 +35,29 @@
</where>
</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">
<![CDATA[
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}
LIMIT 1;
</select>
</mapper>

@ -51,6 +51,8 @@
<select id="listTransFlow" resultType="com.alibaba.fastjson.JSONObject">
SELECT t.*,
o.status,
o.dev_id order_dev_id,
ifnull(o.client_order_id,'--') client_order_id,
if(t.channel='Settlement','clearing',
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,
r.out_refund_id,
r.client_refund_id,
o.order_detail
o.order_detail,
o.dev_id
FROM pmt_transactions t
LEFT JOIN pmt_orders o ON o.order_id = t.order_id
LEFT JOIN pmt_refunds r ON r.refund_id = t.refund_id

@ -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>

@ -0,0 +1,153 @@
<!doctype html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width,initial-scale=1,user-scalable=0">
<link rel="stylesheet" href="/static/lib/weui/index.css">
<link rel="stylesheet" href="/static/lib/weui/wepayui.min.css">
<meta http-equiv="cache-control" content="max-age=0">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="expires" content="Tue, 01 Jan 1980 1:00:00 GMT">
<meta http-equiv="pragma" content="no-cache">
<title data-th-if="${order['status']>=5}">Pay Successful</title>
<title data-th-if="${order['status']==4}">Payment Failed</title>
<title data-th-if="${order['status']==3}">Order Closed</title>
<title data-th-if="${order['status']<=2}">Not Pay</title>
<script type="text/javascript" src="/static/lib/jquery/jquery-2.1.4.min.js"></script>
<script data-th-if="${order['channel']=='Wechat'}" type="text/javascript" src="//res.wx.qq.com/open/js/jweixin-1.2.0.js"></script>
<script data-th-if="${order['channel']=='Wechat'}" type="text/javascript" src="/static/templates/disable_wechat_menu.js?t=201607070231"></script>
<script data-th-if="${#strings.startsWith(order['channel'],'Alipay')}" src="https://a.alipayobjects.com/g/h5-lib/alipayjsapi/3.0.3/alipayjsapi.min.js"></script>
<script>
var _hmt = _hmt || [];
(function() {
var hm = document.createElement("script");
hm.src = "https://hm.baidu.com/hm.js?d7e727bd889ea69d369cba051844dfe5";
var s = document.getElementsByTagName("script")[0];
s.parentNode.insertBefore(hm, s);
})();
</script>
<script type="text/javascript" data-th-inline="javascript">
window.order_id = [[${order['order_id']}]];
window.order_gateway = [[${order['gateway']}]];
window.actChairty = [[${act_charity}]];
document.addEventListener('back', function (e) {
e.preventDefault();
if(AlipayJSBridge) {
AlipayJSBridge.call('popWindow');
}else {
window.close();
}
})
</script>
<link rel="stylesheet" type="text/css" href="/static/templates/payment/success.css?t=20170427">
<script type="text/javascript" src="/static/templates/payment/success.js?t=20180104"></script>
</head>
<body>
<div class="pagehead" style="padding: 10px 0" data-th-classappend="${order['channel']}">
<p>
<img data-th-if="${order['status']>=5}" src="https://act.weixin.qq.com/res/img/wepayui/0.0.1/icon_success_green_186x186.png" alt="">
<span data-th-if="${order['status']>=5}" class="pleft"> 支付成功</span>
<span data-th-if="${order['status']>=5}" class="pright" data-th-text="|${order['currency']} ${#numbers.formatDecimal(order['total_amount'],1,2)}|"></span></p>
<span class="pleft" data-th-if="${order['status']==4}"> 支付失败</span>
<span class="pleft" data-th-if="${order['status']==3}"> 已关闭</span>
<span class="pleft" data-th-if="${order['status']<=2}"> 未支付</span>
</div>
<div class="weui-wepay-details">
<div class="weui-wepay-details__bd">
<div class="weui-wepay-detail">
<div class="weui-wepay-detail__bd">商户:</div>
<div class="weui-wepay-detail__ft" data-th-text="${client['short_name']}">${client.short_name}</div>
</div>
<div class="weui-wepay-detail">
<div class="weui-wepay-detail__bd">支付金额:</div>
<div class="weui-wepay-detail__ft" data-th-text="|${order['currency']} ${#numbers.formatDecimal(order['customer_payment_amount'],1,2)}|"></div>
</div>
<div class="weui-wepay-detail" data-th-unless="${order['channel'] == 'Wechat'}">
<div class="weui-wepay-detail__bd">输入金额:</div>
<div class="weui-wepay-detail__ft" data-th-text="|${order['currency']} ${#numbers.formatDecimal(order['display_amount'],1,2)}|"></div>
</div>
<div class="weui-wepay-detail" data-th-if="${order['surcharge_amount']!=null and order['channel'] != 'Wechat'}">
<div class="weui-wepay-detail__bd">手续费:</div>
<div class="weui-wepay-detail__ft" data-th-text="|${order['currency']} ${#numbers.formatDecimal(order['surcharge_amount'],1,2)}|"></div>
</div>
<div class="weui-wepay-detail" data-th-if="${order['channel'] != 'hf'}">
<div class="weui-wepay-detail__bd">汇率:</div>
<div class="weui-wepay-detail__ft" data-th-text="${order['exchange_rate']}">${order.exchange_rate}</div>
</div>
<div class="weui-wepay-detail">
<div class="weui-wepay-detail__bd">时间:</div>
<div class="weui-wepay-detail__ft" data-th-text="${#dates.format(order['transaction_time'],'yyyy-MM-dd HH:mm:ss')}"></div>
</div>
<div class="weui-wepay-detail">
<div class="weui-wepay-detail__bd">单号:</div>
<div class="weui-wepay-detail__ft" data-th-text="${order['order_id']}"></div>
</div>
<div class="weui-wepay-detail" data-th-if="${order['system_transaction_id']}">
<div class="weui-wepay-detail__bd">流水号:</div>
<div class="weui-wepay-detail__ft" data-th-text="${order['system_transaction_id']}"></div>
</div>
<div class="weui-wepay-detail" data-th-if="${order['order_detail']}">
<div class="weui-wepay-detail__bd">备注:</div>
<div class="weui-wepay-detail__ft" data-th-text="${order['order_detail']}"></div>
</div>
</div>
<div class="ad" style="padding: 0 0" data-th-if="${act_charity}">
<a href="/static/activity/loving_merchants/loving_merchants_intro.html">
<img src="/static/images/act/actChairty.jpeg">
</a>
</div>
<div class="afterhr" style="padding: 5px 0;"></div>
<div class="ad" data-th-if="${ad['content']}" data-th-utext="${ad['content']}">
</div>
<div class="weui-wepay-logos weui-wepay-logos_ft" data-th-if="${order['channel']=='Wechat'}">
<i class="weui-wepay-logo-default weui-wepay-logo_gray" style="font-size: 16px;">
<span class="path1"></span><span class="path2"></span>
</i>
</div>
<div class="encourage-dialog hide">
<div class="mask"></div>
<div class="dialog-content">
<div class="close-btn">
<div class="close-circle"></div>
</div>
<div class="encourage-content">
<div class="encourage-title">恭喜您!获得一笔鼓励金</div>
<div class="encourage-desc">活动期间任意消费满10澳币获取随机鼓励金</div>
<div class="coin">
<div class="money-amount">0.00</div>
<div class="double-text">点击翻倍</div>
</div>
<div class="coin-moving left1"></div>
<div class="coin-moving right1"></div>
<div class="coin-moving right2"></div>
<div class="double-rate">X 1</div>
<a class="link" href="/act/encourage_money/my">查看累积金额</a>
</div>
</div>
</div>
<div class="points-dialog hide">
<div class="mask"></div>
<div class="dialog-content">
<div class="close-btn">
<div class="close-circle"></div>
</div>
<div class="points-content">
<div class="points-title">恭喜您!获得积分奖励</div>
<div class="points-desc">使用RoyalPay任意消费满10澳币获取相应积分</div>
<div class="coin">
</div>
<div class="coin-moving left1"></div>
<div class="coin-moving right1"></div>
<div class="coin-moving right2"></div>
<div class="points-value">+20<span>积分</span></div>
<a class="link" href="https://customer.royalpay.com.au">查看累积积分</a>
</div>
</div>
</div>
</div>
</body>
</html>

@ -414,6 +414,11 @@ margin-bottom: 10%;"/>
<i class="fa fa-exclamation-triangle"></i> <span>黑名单|Risky Merchants</span>
</a>
</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">
<a ui-sref="customerRankingAnalysis" ui-sref-opts="{reload:true}">
<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'
},
legend: {
data: ['Alipay交易金额','AlipayOnline交易金额', 'Bestpay交易金额','Wechat交易金额',"JD Pay交易金额","HF Pay交易金额"],
data: ['Alipay交易金额','AlipayOnline交易金额', 'Bestpay交易金额','Wechat交易金额',"JD Pay交易金额","HF Pay交易金额","Yeepay交易金额"],
bottom: 0,
height: '15%',
width: '80%',
@ -170,7 +170,7 @@ define(['angular', 'static/commons/commons', 'static/commons/angular-ueditor', '
type: 'value'
}
],
color: ['#00a0e9','#00a0e9','#FF2D96','#09bb07','#DC0808',"#FFFF33"]
color: ['#00a0e9','#00a0e9','#FF2D96','#09bb07','#DC0808',"#FFFF33","#66ff00"]
},
xAxis: {
basic: {type: 'category', boundaryGap: false},
@ -242,6 +242,17 @@ define(['angular', 'static/commons/commons', 'static/commons/angular-ueditor', '
yAxisIndex: 0
},
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'
},
legend: {
data: ['Alipay交易订单','AlipayOnline交易订单', 'Bestpay交易订单','Wechat交易订单',"JD Pay交易订单","HF Pay交易订单"],
data: ['Alipay交易订单','AlipayOnline交易订单', 'Bestpay交易订单','Wechat交易订单',"JD Pay交易订单","HF Pay交易订单","Yeepay交易订单"],
bottom: 0,
height: '15%',
width: '80%',
@ -264,7 +275,7 @@ define(['angular', 'static/commons/commons', 'static/commons/angular-ueditor', '
type: 'value'
}
],
color: ['#00a0e9','00a0e9','#FF2D96','#09bb07','#DC0808',"#FFFF33"]
color: ['#00a0e9','00a0e9','#FF2D96','#09bb07','#DC0808',"#FFFF33","#66ff00"]
},
xAxis: {
basic: {type: 'category', boundaryGap: false},
@ -336,7 +347,18 @@ define(['angular', 'static/commons/commons', 'static/commons/angular-ueditor', '
yAxisIndex: 0
},
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 = {
@ -345,7 +367,7 @@ define(['angular', 'static/commons/commons', 'static/commons/angular-ueditor', '
trigger: 'axis'
},
legend: {
data: ['Alipay交易客单价','AlipayOnline交易客单价', 'Bestpay交易客单价','Wechat交易客单价',"JD Pay交易客单价","HF Pay交易客单价"],
data: ['Alipay交易客单价','AlipayOnline交易客单价', 'Bestpay交易客单价','Wechat交易客单价',"JD Pay交易客单价","HF Pay交易客单价","Yeepay交易客单价"],
bottom: 0,
},
yAxis: [
@ -354,7 +376,7 @@ define(['angular', 'static/commons/commons', 'static/commons/angular-ueditor', '
type: 'value'
}
],
color: ['#00a0e9','#00a0e9','#FF2D96','#09bb07','#DC0808',"#FFFF33"]
color: ['#00a0e9','#00a0e9','#FF2D96','#09bb07','#DC0808',"#FFFF33","#66ff00"]
},
xAxis: {
basic: {type: 'category', boundaryGap: false},
@ -426,6 +448,17 @@ define(['angular', 'static/commons/commons', 'static/commons/angular-ueditor', '
yAxisIndex: 0
},
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,8 +545,10 @@ define(['angular', 'decimal', 'uiBootstrap', 'uiRouter', 'angularEcharts'], func
return '/static/images/hf_sign_lg.png';
case 'Rpay':
return '/static/images/rpayplus_sign_lg.png';
case 'Yeepay':
return '/static/images/yeepay_sign_lg.png';
}
}
});
return app;
});
});

@ -203,6 +203,8 @@
uib-tooltip="HF Pay" ng-if="order.channel=='hf'"/>
<img src="/static/images/rpayplus_sign.png"
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}}
</td>
<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'}"
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>
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>
</div>
</div>
@ -148,4 +150,4 @@
</div>
</div>
</div>
</div>
</div>

@ -101,6 +101,10 @@
ng-click="params.channel='jd';doAnalysis(1)">JD Pay</a> |
<a role="button" ng-class="{'bg-primary':params.channel=='HF'}"
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>
</div>
</div>
@ -133,4 +137,4 @@
</div>
</div>
</div>
</div>
</div>

@ -100,7 +100,9 @@
<a role="button" ng-class="{'bg-primary':params.channel=='jd'}"
ng-click="params.channel='jd';doAnalysis(1)">JD Pay</a> |
<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>
</div>
</div>
@ -133,4 +135,4 @@
</div>
</div>
</div>
</div>
</div>

@ -99,7 +99,9 @@
<a role="button" ng-class="{'bg-primary':params.channel=='hf'}"
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>
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>
</div>
</div>
@ -209,6 +211,15 @@
</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>
<!--<table class="table">
@ -299,4 +310,4 @@
</div>
</div>
</div>
</div>
</div>

@ -179,6 +179,15 @@
</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>
<!-- <table class="table">
@ -232,4 +241,4 @@
</div>
</div>
</div>
</div>
</div>

@ -40,9 +40,11 @@
<a role="button" ng-class="{'bg-primary':params.channel=='jd'}"
ng-click="params.channel='jd';loadTradeLogs()">JD Pay</a> |
<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'}"
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>
</div>
</div>
@ -162,4 +164,4 @@
</div>
</div>
</div>
</div>
</div>

@ -34,14 +34,14 @@ define(['angular', 'angularSanitize', 'angularAnimate', 'angularMessages', 'uiRo
// if ($rootScope.currentUser.role ==2 || $rootScope.currentUser.role == 4){
// $scope.loadPartnerApplyNotice();
// }
if ($rootScope.currentUser.wx_openid == null) {
/*if ($rootScope.currentUser.wx_openid == null) {
if ($filter('withRole')('100')) {
$scope.managerBindWechat('static');
} else {
$scope.managerBindWechat(true);
}
}
}*/
}, function (resp) {
if (resp.status == 403) {
location.href = 'm_login.html?f=' + encodeURIComponent(location.href);
@ -49,7 +49,6 @@ define(['angular', 'angularSanitize', 'angularAnimate', 'angularMessages', 'uiRo
})
};
$scope.loadCurrentUser();
$scope.getManagerTodoNotices = function () {
$http.get('/global/userstatus/manager_todo_notices').then(function (resp) {
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');
});
}
$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() {
var rolenum;
switch (sessionStorage.getItem('role')) {

@ -162,14 +162,14 @@ define(['angular', 'angularSanitize', 'angularAnimate', 'angularMessages', 'uiRo
// if ($rootScope.currentUser.role ==2 || $rootScope.currentUser.role == 4){
// $scope.loadPartnerApplyNotice();
// }
if ($rootScope.currentUser.wx_openid == null) {
/*if ($rootScope.currentUser.wx_openid == null) {
if ($filter('withRole')('100')) {
$scope.managerBindWechat('static');
} else {
$scope.managerBindWechat(true);
}
}
}*/
}, function (resp) {
if (resp.status == 403) {
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) {
$scope.formData = {};

@ -9,6 +9,8 @@ define(['./app',
'./services/chartParser',
'./services/orderService',
'./services/businessStructuresMap',
'./services/yeepayBusinessContentMap',
'./services/yeepayIndustryMap',
'./services/stateMap',
'./services/industryMap',
'./services/sectorMap',
@ -31,4 +33,4 @@ define(['./app',
'./filters/commonFilters'
], function (app) {
'use strict';
});
});

@ -0,0 +1,41 @@
define(['../app'], function (app) {
'use strict';
var yeepayBusinessContentMap = [
{
"label": "服务贸易",
"value": "SERVICETRADE"
},
{
"label": "货物贸易",
"value": "GOODSTRADE"
},
{
"label": "留学",
"value": "OVERSEASTUDY"
},
{
"label": "酒店机票",
"value": "HOTELTICKET"
},
{
"label": "国际运输",
"value": "INTTRANSPORT"
},
{
"label": "旅游服务",
"value": "TOURSERVICE"
},
{
"label": "保险",
"value": "INSURANCE"
}
];
app.factory('yeepayBusinessContentMap', function () {
return {
configs: function () {
return yeepayBusinessContentMap;
}
}
});
});

@ -0,0 +1,45 @@
define(['../app'], function (app) {
'use strict';
var yeepayIndustryMap = [
{
"label": "货物贸易",
"value": "ehk100000"
},
{
"label": "旅游",
"value": "ehk200000"
},
{
"label": "文化教育",
"value": "ehk300000"
},
{
"label": "服务贸易",
"value": "ehk400000"
},
{
"label": "物流",
"value": "ehk500000"
},
{
"label": "数字娱乐",
"value": "ehk600000"
},
{
"label": "金融保险",
"value": "ehk700000"
},
{
"label": "其他",
"value": "ehk999999"
}
];
app.factory('yeepayIndustryMap', function () {
return {
configs: function () {
return yeepayIndustryMap;
}
}
});
});

@ -47,6 +47,8 @@
uib-tooltip="HF Pay" ng-if="order.channel=='hf'"/>
<img src="/static/images/rpayplus_sign.png"
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}}
</td>
</p>
@ -211,4 +213,4 @@
</table>
</div>
</div>
</div>
</div>

@ -394,8 +394,10 @@ define(['angular', '../../analysis/bd/analysis-bd'], function (angular) {
return '/static/images/hf_sign_lg.png';
case 'Rpay':
return '/static/images/rpayplus_sign_lg.png';
case 'Yeepay':
return '/static/images/yeepay_sign_lg.png';
}
}
});
return app;
});
});

@ -191,6 +191,18 @@
</div>
</div>
</div>
<div class="form-group"
ng-class="{'has-error':org_form.yeepay_rate_value.$invalid && org_form.yeepay_rate_value.$dirty}">
<label class="control-label col-sm-2" for="yeepay_rate_value_input">Yeepay Rate *</label>
<div class="col-sm-8">
<div class="input-group">
<input class="form-control" type="number" ng-model="org.yeepay_rate_value"
id="yeepay_rate_value_input" name="yeepay_rate_value"
max="100" min="0">
<span class="input-group-addon">%</span>
</div>
</div>
</div>
</div>
<div>
@ -267,6 +279,18 @@
</div>
</div>
</div>
<div class="form-group"
ng-class="{'has-error':org_form.min_yeepay_rate.$invalid && org_form.min_yeepay_rate.$dirty}">
<label class="control-label col-sm-2" for="min_yeepay_rate_input">Min Yeepay Rate *</label>
<div class="col-sm-8">
<div class="input-group">
<input class="form-control" type="number" ng-model="org.min_yeepay_rate"
id="min_yeepay_rate_input" name="min_yeepay_rate" max="100"
min="0" required>
<span class="input-group-addon">%</span>
</div>
</div>
</div>
</div>
</div>
<div class="form-group"
@ -310,4 +334,4 @@
</form>
</div>
</div>
</section>
</section>

@ -159,6 +159,13 @@
<span class="input-group-addon form-control-span">%</span>
</div>
</div>
<div class="form-group" ng-class="{'has-error':org_form.yeepay_rate_value.$invalid && org_form.yeepay_rate_value.$dirty}">
<label class="control-label col-sm-2" for="yeepay_rate_value_input">Yeepay Rate *</label>
<div class="col-sm-8">
<input class="form-control form-control-float" type="number" ng-model="org.yeepay_rate_value" id="yeepay_rate_value_input" name="yeepay_rate_value" max="100" min="0">
<span class="input-group-addon form-control-span">%</span>
</div>
</div>
</div>
@ -220,6 +227,15 @@
<span class="input-group-addon form-control-span">%</span>
</div>
</div>
<div class="form-group"
ng-class="{'has-error':org_form.min_yeepay_rate.$invalid && org_form.min_yeepay_rate.$dirty}">
<label class="control-label col-sm-2" for="min_yeepay_rate_input">Min Yeepay Rate *</label>
<div class="col-sm-8">
<input class="form-control form-control-float" type="number" ng-model="org.min_yeepay_rate"
id="min_yeepay_rate_input" name="min_yeepay_rate" max="100" min="0">
<span class="input-group-addon form-control-span">%</span>
</div>
</div>
</div>
</div>
@ -421,4 +437,4 @@
</div>
</div>
</div>
</section>
</section>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 50 KiB

After

Width:  |  Height:  |  Size: 59 KiB

@ -174,6 +174,19 @@
<div class="description-header text-bold"><img src="/static/images/rpayplus_sign.png"/>Rpay+</div>
</div>
</div>
<div class="col-sm-4 col-xs-6">
<div class="description-block">
<div class="description-text">交易额:
<label class="description-text text-red"
ng-bind="totalChannelAmount.yeepayamount|currency: ' $ '"></label>
</div>
<div class="description-text">订单数:
<label class="description-text text-red"
ng-bind="totalChannelAmount.yeepay_order_count"></label>
</div>
<div class="description-header text-bold"><img src="/static/images/yeepay_sign.png"/>Yeepay</div>
</div>
</div>
</div>
@ -285,4 +298,4 @@
</div>
</div>
</section>
</div>
</div>

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.0 KiB

@ -262,6 +262,16 @@
</div>
</a>
</div>
<div class="col-sm-2 col-xs-6">
<a ui-sref="analysis_monitoring.customer" ui-sref-opts="{reload:true}">
<div class="description-block">
<img src="/static/images/main_menu/risk_blacklist.png"/>
<div class="description-text">
<span class="description-text">消费者黑名单</span>
</div>
</div>
</a>
</div>
<div class="col-sm-2 col-xs-6">
<a ui-sref="customerRankingAnalysis" ui-sref-opts="{reload:true}">
<div class="description-block">

@ -103,6 +103,8 @@
uib-tooltip="HF Pay" ng-if="order.channel=='hf'"/>
<img src="/static/images/rpayplus_sign.png"
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}}
</td>
</p>
@ -161,4 +163,4 @@
</div>
</div>
</div>
</div>
</div>

@ -202,6 +202,8 @@
uib-tooltip="HF Pay" ng-if="trade.channel=='hf'"/>
<img src="/static/images/rpayplus_sign.png"
uib-tooltip="RPay+" ng-if="trade.channel=='Rpay'"/>
<img src="/static/images/yeepay_sign.png"
uib-tooltip="Yeepay" ng-if="trade.channel=='Yeepay'"/>
{{trade.order_id2}}
</td>
<td ng-bind="trade.currency"></td>
@ -259,4 +261,4 @@
</div>
</div>
</div>
</div>
</div>

@ -1308,6 +1308,16 @@ define(['angular', 'decimal', 'static/commons/commons', 'uiBootstrap', 'uiRouter
commonDialog.alert({title: 'Error', content: '您的浏览器不支持!', type: 'error'});
}
};
$scope.copyYeepayLink = function() {
var e=document.getElementById("cpyeepay");
e.select();
var successful = document.execCommand("Copy");
if (successful) {
commonDialog.alert({title: 'Success', content: '已复制到剪切板!', type: 'success'});
}else {
commonDialog.alert({title: 'Error', content: '您的浏览器不支持!', type: 'error'});
}
};
$scope.loadPartnerPaymentInfo = function () {
$http.get('/sys/partners/' + $scope.partner.client_moniker).then(function (resp) {
$scope.paymentInfo = resp.data;
@ -1486,7 +1496,7 @@ define(['angular', 'decimal', 'static/commons/commons', 'uiBootstrap', 'uiRouter
})
})
};
$scope.init = {jsapi: false, gateway: false, offline: false, refund: false,common_sub_merchant_id:false, channel: {},gateway_alipay_online:false,hf_Link:false,enable_hf_email_notice:false};
$scope.init = {jsapi: false, gateway: false, offline: false, refund: false,common_sub_merchant_id:false, channel: {},gateway_alipay_online:false,hf_Link:false,enable_hf_email_notice:false,enable_yeepay_link:false,enable_yeepay_email_notice:false};
$scope.switchCommonSubMerchantId = function () {
if (!$scope.paymentInfo) {
return;
@ -1591,6 +1601,49 @@ define(['angular', 'decimal', 'static/commons/commons', 'uiBootstrap', 'uiRouter
})
};
$scope.toggleGatewayLink = function (channel) {
if (!channel) {
return;
}
if (!$scope.paymentInfo) {
return;
}
var channelLink = 'enable_'+channel+'_link';
if (!$scope.init[channelLink]) {
$scope.init[channelLink] = true;
return;
}
$http.put('/sys/partners/' + $scope.partner.client_moniker + '/'+channel, {allow: $scope.paymentInfo[channelLink]}).then(function () {
$scope.loadPartnerPaymentInfo();
}, function (resp) {
commonDialog.alert({
title: 'Failed to change '+channelLink+' permission status',
content: resp.data.message,
type: 'error'
});
})
};
$scope.toggleGatewayEmailNotice = function (channel) {
if (!$scope.paymentInfo) {
return;
}
var channelNotice = 'enable_'+channel+'_email_notice';
if (!$scope.init[channelNotice]) {
$scope.init[channelNotice] = true;
return;
}
$http.put('/sys/partners/' + $scope.partner.client_moniker + '/'+channel+'/email_notice', {allow: $scope.paymentInfo[channelNotice]}).then(function () {
$scope.loadPartnerPaymentInfo();
}, function (resp) {
commonDialog.alert({
title: 'Failed to change '+channelNotice+' permission status',
content: resp.data.message,
type: 'error'
});
})
};
$scope.toggleHfEmailNotice = function () {
if (!$scope.paymentInfo) {
return;
@ -1752,6 +1805,22 @@ define(['angular', 'decimal', 'static/commons/commons', 'uiBootstrap', 'uiRouter
})
};
// 更改支付成功页
$scope.changePaySuccessPage = function () {
if (!$scope.paymentInfo) {
return;
}
$http.put('/sys/partners/' + $scope.partner.client_moniker + '/paysuccess_version', {paysuccess_version: $scope.paymentInfo.paysuccess_version}).then(function () {
$scope.loadPartnerPaymentInfo();
}, function (resp) {
commonDialog.alert({
title: 'failed to change Payment Success Page Version',
content: resp.data.message,
type: 'error'
})
})
};
$scope.toggleRequireCustInfo = function () {
if (!$scope.paymentInfo) {
return;
@ -3190,6 +3259,10 @@ define(['angular', 'decimal', 'static/commons/commons', 'uiBootstrap', 'uiRouter
$http.get('/sys/partners/' + $scope.partner.client_moniker + '/list_rpay_sub_applices', {params: {}}).then(function (resp) {
$scope.subRpayMerchantInfos = resp.data;
});
$http.get('/sys/partners/' + $scope.partner.client_moniker + '/list_yeepay_sub_applices', {params: {}}).then(function (resp) {
$scope.subYeepayMerchantInfos = resp.data;
});
};
$scope.useSubMerchantId = function (sub_merchant_id) {
$http.put('/sys/partners/' + $scope.partner.client_moniker + '/payment_config', {sub_merchant_id: sub_merchant_id}).then(function (resp) {
@ -3215,6 +3288,18 @@ define(['angular', 'decimal', 'static/commons/commons', 'uiBootstrap', 'uiRouter
commonDialog.alert({title: 'Error', content: resp.data.message, type: 'error'})
});
}
$scope.useYeepaySubMerchantId = function (sub_merchant_id) {
$http.put('/sys/partners/' + $scope.partner.client_moniker + '/yeepay_payment_config', {yeepay_sub_merchant_id: sub_merchant_id}).then(function (resp) {
commonDialog.alert({
title: 'Success',
content: 'Modify Yeepay Sub Merchant ID successfully',
type: 'success'
});
$state.reload();
}, function (resp) {
commonDialog.alert({title: 'Error', content: resp.data.message, type: 'error'})
});
}
$scope.applyWxSubMerchantId = function () {
$uibModal.open({
templateUrl: '/static/payment/partner/templates/apply_wx_sub_merchant_id.html',
@ -3244,6 +3329,19 @@ define(['angular', 'decimal', 'static/commons/commons', 'uiBootstrap', 'uiRouter
$scope.loadSubMerchantInfos();
})
};
$scope.applyYeepaySubMerchantId = function () {
$uibModal.open({
templateUrl: '/static/payment/partner/templates/apply_yeepay_sub_merchant_id.html',
controller: 'applyYeepaySubMerchantIdCtrl',
resolve: {
subMerchantInfo: function () {
return $scope.partner;
}
}
}).result.then(function () {
$scope.loadSubMerchantInfos();
})
};
$scope.loadSubMerchantInfos();
}]);
app.controller('applyWxSubMerchantIdCtrl', ['$scope', '$http', '$uibModal', '$state', 'subMerchantInfo', '$filter', 'merchantIds', 'commonDialog', function ($scope, $http, $uibModal, $state, subMerchantInfo, $filter, merchantIds, commonDialog) {
@ -3341,6 +3439,256 @@ define(['angular', 'decimal', 'static/commons/commons', 'uiBootstrap', 'uiRouter
}
}]);
app.controller('applyYeepaySubMerchantIdCtrl', ['$scope', '$http', '$uibModal', '$state','subMerchantInfo','yeepayIndustryMap','yeepayBusinessContentMap','$filter', 'commonDialog','Upload', function ($scope, $http, $uibModal, $state,subMerchantInfo,yeepayIndustryMap,yeepayBusinessContentMap,$filter, commonDialog,Upload) {
$scope.yeepay_industries = yeepayIndustryMap.configs();
$scope.yeepay_business_contents = yeepayBusinessContentMap.configs();
$scope.subMerchantInfo = angular.copy(subMerchantInfo);
var vouchers={};
var merchantId = '';
$scope.uploadLegalIDcardFront = function (file) {
if (file != null) {
if (file.size > 3 * 1024 * 1024) {
commonDialog.alert({title: 'Error', content: '文件大小不能超过3MB请压缩后重试', type: 'error'})
} else {
$scope.legalIDcardFrontProgress = {value: 0};
Upload.upload({
url: '/attachment/yeepayFiles',
data: {file: file}
}).then(function (resp) {
delete $scope.legalIDcardFrontProgress;
$scope.legalIDcardFront = resp.data.path;
vouchers['legalIDcardFront'] = resp.data.path;
merchantId = resp.data.merchantId;
commonDialog.alert({title: 'Upload Success', content: 'Upload Success', type: 'success'})
}, function (resp) {
delete $scope.legalIDcardFrontProgress;
commonDialog.alert({title: 'Upload Failed', content: resp.data.message, type: 'error'})
}, function (evt) {
$scope.legalIDcardFrontProgress.value = parseInt(100 * evt.loaded / evt.total);
})
}
}
};
$scope.uploadLegalIDcardBack = function (file) {
if (file != null) {
if (file.size > 3 * 1024 * 1024) {
commonDialog.alert({title: 'Error', content: '文件大小不能超过3MB请压缩后重试', type: 'error'})
} else {
$scope.legalIDcardBackProgress = {value: 0};
Upload.upload({
url: '/attachment/yeepayFiles',
data: {file: file}
}).then(function (resp) {
delete $scope.legalIDcardBackProgress;
$scope.legalIDcardBack = resp.data.path;
vouchers['legalIDcardBack'] = resp.data.path;
merchantId = resp.data.merchantId;
commonDialog.alert({title: 'Upload Success', content: 'Upload Success', type: 'success'})
}, function (resp) {
delete $scope.legalIDcardBackProgress;
commonDialog.alert({title: 'Upload Failed', content: resp.data.message, type: 'error'})
}, function (evt) {
$scope.legalIDcardBackProgress.value = parseInt(100 * evt.loaded / evt.total);
})
}
}
};
$scope.uploadBusinessLicence = function (file) {
if (file != null) {
if (file.size > 3 * 1024 * 1024) {
commonDialog.alert({title: 'Error', content: '文件大小不能超过3MB请压缩后重试', type: 'error'})
} else {
$scope.businessLicenceProgress = {value: 0};
Upload.upload({
url: '/attachment/yeepayFiles',
data: {file: file}
}).then(function (resp) {
delete $scope.businessLicenceProgress;
$scope.businessLicence = resp.data.path;
vouchers['businessLicence'] = resp.data.path;
merchantId = resp.data.merchantId;
commonDialog.alert({title: 'Upload Success', content: 'Upload Success', type: 'success'})
}, function (resp) {
delete $scope.businessLicenceProgress;
commonDialog.alert({title: 'Upload Failed', content: resp.data.message, type: 'error'})
}, function (evt) {
$scope.businessLicenceProgress.value = parseInt(100 * evt.loaded / evt.total);
})
}
}
};
$scope.uploadTaxLevel = function (file) {
if (file != null) {
if (file.size > 3 * 1024 * 1024) {
commonDialog.alert({title: 'Error', content: '文件大小不能超过3MB请压缩后重试', type: 'error'})
} else {
$scope.taxLevelProgress = {value: 0};
Upload.upload({
url: '/attachment/yeepayFiles',
data: {file: file}
}).then(function (resp) {
delete $scope.taxLevelProgress;
$scope.taxLevel = resp.data.path;
vouchers['taxLevel'] = resp.data.path;
merchantId = resp.data.merchantId;
commonDialog.alert({title: 'Upload Success', content: 'Upload Success', type: 'success'})
}, function (resp) {
delete $scope.taxLevelProgress;
commonDialog.alert({title: 'Upload Failed', content: resp.data.message, type: 'error'})
}, function (evt) {
$scope.taxLevelProgress.value = parseInt(100 * evt.loaded / evt.total);
})
}
}
};
$scope.uploadBankAccountOpen = function (file) {
if (file != null) {
if (file.size > 3 * 1024 * 1024) {
commonDialog.alert({title: 'Error', content: '文件大小不能超过3MB请压缩后重试', type: 'error'})
} else {
$scope.bankAccountOpenProgress = {value: 0};
Upload.upload({
url: '/attachment/yeepayFiles',
data: {file: file}
}).then(function (resp) {
delete $scope.bankAccountOpenProgress;
$scope.bankAccountOpen = resp.data.path;
vouchers['bankAccountOpen'] = resp.data.path;
merchantId = resp.data.merchantId;
commonDialog.alert({title: 'Upload Success', content: 'Upload Success', type: 'success'})
}, function (resp) {
delete $scope.bankAccountOpenProgress;
commonDialog.alert({title: 'Upload Failed', content: resp.data.message, type: 'error'})
}, function (evt) {
$scope.bankAccountOpenProgress.value = parseInt(100 * evt.loaded / evt.total);
})
}
}
};
$scope.uploadOrgCode = function (file) {
if (file != null) {
if (file.size > 3 * 1024 * 1024) {
commonDialog.alert({title: 'Error', content: '文件大小不能超过3MB请压缩后重试', type: 'error'})
} else {
$scope.orgCodeProgress = {value: 0};
Upload.upload({
url: '/attachment/yeepayFiles',
data: {file: file}
}).then(function (resp) {
delete $scope.orgCodeProgress;
$scope.orgCode = resp.data.path;
vouchers['orgCode'] = resp.data.path;
merchantId = resp.data.merchantId;
commonDialog.alert({title: 'Upload Success', content: 'Upload Success', type: 'success'})
}, function (resp) {
delete $scope.orgCodeProgress;
commonDialog.alert({title: 'Upload Failed', content: resp.data.message, type: 'error'})
}, function (evt) {
$scope.orgCodeProgress.value = parseInt(100 * evt.loaded / evt.total);
})
}
}
};
$scope.uploadNonStanProtocol = function (file) {
if (file != null) {
if (file.size > 3 * 1024 * 1024) {
commonDialog.alert({title: 'Error', content: '文件大小不能超过3MB请压缩后重试', type: 'error'})
} else {
$scope.nonStanProtocolProgress = {value: 0};
Upload.upload({
url: '/attachment/yeepayFiles',
data: {file: file}
}).then(function (resp) {
delete $scope.nonStanProtocolProgress;
$scope.nonStanProtocol = resp.data.path;
vouchers['nonStanProtocol'] = resp.data.path;
merchantId = resp.data.merchantId;
commonDialog.alert({title: 'Upload Success', content: 'Upload Success', type: 'success'})
}, function (resp) {
delete $scope.nonStanProtocolProgress;
commonDialog.alert({title: 'Upload Failed', content: resp.data.message, type: 'error'})
}, function (evt) {
$scope.nonStanProtocolProgress.value = parseInt(100 * evt.loaded / evt.total);
})
}
}
};
$scope.uploadZipPath = function (file) {
if (file != null) {
if (file.size > 3 * 1024 * 1024) {
commonDialog.alert({title: 'Error', content: '文件大小不能超过3MB请压缩后重试', type: 'error'})
} else {
$scope.zipPathProgress = {value: 0};
Upload.upload({
url: '/attachment/yeepayFiles',
data: {file: file}
}).then(function (resp) {
delete $scope.zipPathProgress;
$scope.zipPath = resp.data.path;
vouchers['zipPath'] = resp.data.path;
merchantId = resp.data.merchantId;
commonDialog.alert({title: 'Upload Success', content: 'Upload Success', type: 'success'})
}, function (resp) {
delete $scope.zipPathProgress;
commonDialog.alert({title: 'Upload Failed', content: resp.data.message, type: 'error'})
}, function (evt) {
$scope.zipPathProgress.value = parseInt(100 * evt.loaded / evt.total);
})
}
}
};
$scope.saveYeepayApply = function (form) {
var merchantInfo = {};
$scope.errmsg = null;
if (form.$invalid) {
angular.forEach(form, function (item, key) {
if (key.indexOf('$') < 0) {
item.$dirty = true;
}
});
return;
}
angular.forEach(form, function (item, key) {
if(item !=null) {
if(item.$name !=null) {
merchantInfo[key] = item.$modelValue;
}
}
});
merchantInfo['vouchers'] = vouchers;
merchantInfo['merchantId'] = merchantId;
$http.post('/sys/partners/' + $scope.subMerchantInfo.client_moniker + '/registYeepaySubMerchantId', merchantInfo).then(function (resp) {
$scope.apply_sub_merchant_id = resp.data;
$scope.$close();
if (subMerchantInfo.yeepay_sub_merchant_id != null) {
commonDialog.alert({
title: 'Success',
content: 'Modify Yeepay Sub Merchant ID successfully',
type: 'success'
});
$state.reload();
}
}, function (resp) {
commonDialog.alert({
title: 'Error',
content: resp.data.message,
type: 'error'
});
})
}
}]);
app.controller('permissionClientCtrl', ['$scope', '$http', '$uibModal', '$state', '$filter', 'commonDialog', function ($scope, $http, $uibModal, $state, $filter, commonDialog) {
$scope.clientPermission = {client_moniker:$scope.partner.client_moniker};
$scope.loadPermissionList = function () {
@ -3404,6 +3752,50 @@ define(['angular', 'decimal', 'static/commons/commons', 'uiBootstrap', 'uiRouter
return industry;
}
});
app.filter('yeepayIndustry', function () {
return function (value) {
switch (value + '') {
case 'ehk100000':
return '货物贸易';
case 'ehk200000':
return '旅游';
case 'ehk300000':
return '文化教育';
case 'ehk400000':
return '服务贸易';
case 'ehk500000':
return '物流';
case 'ehk600000':
return '数字娱乐';
case 'ehk700000':
return '金融保险';
case 'ehk999999':
return '其他';
}
}
});
app.filter('yeepayBusinessContent', function () {
return function (value) {
switch (value + '') {
case 'SERVICETRADE':
return '服务贸易';
case 'GOODSTRADE':
return '货物贸易';
case 'OVERSEASTUDY':
return '留学';
case 'HOTELTICKET':
return '酒店机票';
case 'INTTRANSPORT':
return '国际运输';
case 'TOURSERVICE':
return '旅游服务';
case 'INSURANCE':
return '保险';
}
}
});
app.filter('bdOrgSelect', function () {
return function (bdUsers, params) {
var org_id;

@ -576,6 +576,17 @@ define(['angular', 'decimal', 'uiRouter', 'ngBootSwitch', 'ngFileUpload'], funct
}
};
$scope.clientCopyYeepayLink = function() {
var e=document.getElementById("c-cpyeepay");
e.select();
var successful = document.execCommand("Copy");
if (successful) {
commonDialog.alert({title: 'Success', content: '已复制到剪切板!', type: 'success'});
}else {
commonDialog.alert({title: 'Error', content: '您的浏览器不支持!', type: 'error'});
}
};
$scope.reloadQRCode = function () {
$http.get('/client/partner_info/qrcode', {params: $scope.qrConfig}).then(function (resp) {
$scope.qrcode = resp.data;
@ -1051,4 +1062,4 @@ define(['angular', 'decimal', 'uiRouter', 'ngBootSwitch', 'ngFileUpload'], funct
};
}]);
return app;
});
});

@ -0,0 +1,181 @@
<div class="content">
<form novalidate name="subForm">
<div class="row">
<div class="col-sm-12">
<div class="panel panel-default">
<div class="panel-heading">Apply Yeepay Sub Merchant Id</div>
<div class="panel-body">
<div class="form-horizontal">
<div class="form-group"
ng-class="{'has-error':subForm.business_content.$invalid && subForm.business_content.$dirty}">
<label class="control-label col-sm-3" for="business_content">* Business Content</label>
<div class="col-sm-8">
<select class="form-control" name="business_content"
ng-model="subMerchantInfo.business_content"
id="business_content" required
ng-options="business_content.value as business_content.label for business_content in yeepay_business_contents">
<option value="">Please Choose</option>
</select>
<div ng-messages="subForm.business_content.$error" ng-if="subForm.business_content.$dirty">
<p class="small text-danger" ng-message="required">Required Field</p>
</div>
</div>
</div>
<div class="form-group"
ng-class="{'has-error':subForm.industry.$invalid && subForm.industry.$dirty}">
<label class="control-label col-sm-3" for="industry">* Business Category</label>
<div class="col-sm-8">
<select class="form-control" name="industry"
ng-model="subMerchantInfo.industry"
id="industry" required
ng-options="industry.value as industry.label for industry in yeepay_industries">
<option value="">Please Choose</option>
</select>
<div ng-messages="subForm.industry.$error" ng-if="subForm.industry.$dirty">
<p class="small text-danger" ng-message="required">Required Field</p>
</div>
</div>
</div>
<div class="form-group">
<label class="control-label col-sm-3" >* Corporate ID Card Front</label>
<div class="col-sm-8">
<div class="form-control-static">
<button class="btn btn-success" type="button"
ngf-select="uploadLegalIDcardFront($file)"
accept="image/*">
<i class="fa fa-upload"></i> Upload Corporate ID Card Front
</button>
</div>
<uib-progressbar value="legalIDcardFrontProgress.value"
ng-if="legalIDcardFrontProgress"></uib-progressbar>
<div ng-if="legalIDcardFront">Url:{{legalIDcardFront}}</div>
</div>
</div>
<div class="form-group">
<label class="control-label col-sm-3" >* Corporate ID Card Back</label>
<div class="col-sm-8">
<div class="form-control-static">
<button class="btn btn-success" type="button"
ngf-select="uploadLegalIDcardBack($file)"
accept="image/*">
<i class="fa fa-upload"></i> Upload Corporate ID Card Back
</button>
</div>
<uib-progressbar value="legalIDcardBackProgress.value"
ng-if="legalIDcardBackProgress"></uib-progressbar>
<div ng-if="legalIDcardBack">Url:{{legalIDcardBack}}</div>
</div>
</div>
<div class="form-group">
<label class="control-label col-sm-3" >* Business Licence</label>
<div class="col-sm-8">
<div class="form-control-static">
<button class="btn btn-success" type="button"
ngf-select="uploadBusinessLicence($file)"
accept="image/*">
<i class="fa fa-upload"></i> Upload Business Licence
</button>
</div>
<uib-progressbar value="businessLicenceProgress.value"
ng-if="businessLicenceProgress"></uib-progressbar>
<div ng-if="businessLicence">Url:{{businessLicence}}</div>
</div>
</div>
<div class="form-group">
<label class="control-label col-sm-3" >* Tax Level</label>
<div class="col-sm-8">
<div class="form-control-static">
<button class="btn btn-success" type="button"
ngf-select="uploadTaxLevel($file)"
accept="image/*">
<i class="fa fa-upload"></i> Upload Tax Level
</button>
</div>
<uib-progressbar value="taxLevelProgress.value"
ng-if="taxLevelProgress"></uib-progressbar>
<div ng-if="taxLevel">Url:{{taxLevel}}</div>
</div>
</div>
<div class="form-group">
<label class="control-label col-sm-3" >* Bank Account Opening Permit</label>
<div class="col-sm-8">
<div class="form-control-static">
<button class="btn btn-success" type="button"
ngf-select="uploadBankAccountOpen($file)"
accept="image/*">
<i class="fa fa-upload"></i> Upload Bank Account Opening Permit
</button>
</div>
<uib-progressbar value="bankAccountOpenProgress.value"
ng-if="bankAccountOpenProgress"></uib-progressbar>
<div ng-if="bankAccountOpen">Url:{{bankAccountOpen}}</div>
</div>
</div>
<div class="form-group">
<label class="control-label col-sm-3" >* Organization Code Proof</label>
<div class="col-sm-8">
<div class="form-control-static">
<button class="btn btn-success" type="button"
ngf-select="uploadOrgCode($file)"
accept="image/*">
<i class="fa fa-upload"></i> Upload Organization Code Proof
</button>
</div>
<uib-progressbar value="orgCodeProgress.value"
ng-if="orgCodeProgress"></uib-progressbar>
<div ng-if="orgCode">Url:{{orgCode}}</div>
</div>
</div>
<div class="form-group">
<label class="control-label col-sm-3" >Non-standard Protocol File</label>
<div class="col-sm-8">
<div class="form-control-static">
<button class="btn btn-success" type="button"
ngf-select="uploadNonStanProtocol($file)"
accept="image/*">
<i class="fa fa-upload"></i> Upload Non-standard Protocol File
</button>
</div>
<uib-progressbar value="nonStanProtocolProgress.value"
ng-if="nonStanProtocolProgress"></uib-progressbar>
<div ng-if="nonStanProtocol">Url:{{nonStanProtocol}}</div>
</div>
</div>
<div class="form-group">
<label class="control-label col-sm-3" >Other Zip File</label>
<div class="col-sm-8">
<div class="form-control-static">
<button class="btn btn-success" type="button"
ngf-select="uploadZipPath($file)"
accept="image/*">
<i class="fa fa-upload"></i> Upload Other Zip File
</button>
</div>
<uib-progressbar value="zipPathProgress.value"
ng-if="zipPathProgress"></uib-progressbar>
<div ng-if="zipPath">Url:{{zipPath}}</div>
</div>
</div>
</div>
</div>
</div>
<div class="btn-group margin-bottom margin-top">
<button class="btn btn-success" type="button"
ng-click="saveYeepayApply(subForm)">Submit
</button>
</div>
</div>
</div>
</form>
</div>

@ -99,9 +99,15 @@
<li role="presentation" ng-class="{active:bankCtrl.rate_name=='Bestpay'}" ng-if="currentUser.client.enable_bestpay">
<a role="button" ng-click="bankCtrl.rate_name='Bestpay'">Bestpay</a>
</li>
<li role="presentation" ng-class="{active:bankCtrl.rate_name=='Bestpay'}" ng-if="currentUser.client.enable_hf">
<li role="presentation" ng-class="{active:bankCtrl.rate_name=='jd'}" ng-if="currentUser.client.enable_jd">
<a role="button" ng-click="bankCtrl.rate_name='jd'">JD Pay</a>
</li>
<li role="presentation" ng-class="{active:bankCtrl.rate_name=='hf'}" ng-if="currentUser.client.enable_hf">
<a role="button" ng-click="bankCtrl.rate_name='hf'">HF</a>
</li>
<li role="presentation" ng-class="{active:bankCtrl.rate_name=='Yeepay'}" ng-if="currentUser.client.enable_yeepay">
<a role="button" ng-click="bankCtrl.rate_name='Yeepay'">Yeepay</a>
</li>
</ul>
<div class="table-responsive">
<table class="table table-bordered">
@ -128,4 +134,4 @@
</table>
</div>
</div>
</div>
</div>

@ -312,7 +312,7 @@
<div class="form-group">
<div class="embed-responsive" style="height: 300px;">
<iframe id="merchant_detail" name="merchant_detail" class="embed-responsive-item"
src="one_locations.html"></iframe>
src="search_locations.html"></iframe>
</div>
</div>
</div>

@ -188,6 +188,86 @@
</div>
</div>
<div class="panel panel-default" ng-if="partner.enable_yeepay&&partner.yeepay_pay_url">
<div class="panel-heading">Yeepay Link
</div>
<div class="panel-body">
<div class="form-horizontal">
<div class="form-group">
<label class="control-label col-sm-2">Yeepay Link</label>
<div class="col-sm-10">
<a href={{partner.yeepay_pay_url}} target="_Blank">
<span class="form-control-static">{{partner.yeepay_pay_url}}
</span>
</a>
<i class="fa fa-clipboard margin-r-5" style="cursor: pointer" ng-click="clientCopyYeepayLink()"></i>
<input style="opacity: 0" id="c-cpyeepay" value={{partner.yeepay_pay_url}} readonly>
</div>
</div>
<div class="form-group" style="display: flex">
<label class="col-sm-2 control-label">Yeepay QR Code</label>
<div style="text-align: center">
<img ng-src="{{partner.yeepayQrcodeUrl}}" class="img-responsive" />
<span style="font-size:9px;">仅支持微信客户端扫描</span>
</div>
<!--<div style="padding-top: 30px;padding-left: 20%;text-align: center">-->
<!--<img style="width: 220px;height: 150px;cursor: pointer" src="/static/images/hfpaylink_intro/pc_hf_pay_step1.png" class="img-responsive" ng-click="reset();toPcFirst();toPcShow()"/>-->
<!--<span style="font-size:9px;">微信/支付宝电脑端</span>-->
<!--<span >-->
<!--<div class="pos" ng-show="pcshow">-->
<!--<i class="tocancle glyphicon glyphicon-remove" ng-click="toHide()"></i>-->
<!--<uib-carousel active=0 interval="myInterval" no-wrap="false">-->
<!--<uib-slide ng-repeat="slide1 in slidesPc track by slide1.id" index="slide1.id">-->
<!--<img ng-src="{{slide1.image}}" style="margin:auto;height: 400px;background-color: black">-->
<!--<div class="carousel-caption" style="bottom: 10px;text-shadow: 0 0px 0px">-->
<!--<p class="text-primary">{{slide1.text}}</p>-->
<!--</div>-->
<!--</uib-slide>-->
<!--</uib-carousel>-->
<!--</div>-->
<!--</span>-->
<!--</div>-->
<!--<div style="padding-top: 30px;padding-left: 4%;text-align: center">-->
<!--<img style="width: 220px;height: 150px;cursor: pointer" src="/static/images/hfpaylink_intro/pc_hf_pay_step1.png" class="img-responsive" ng-click="reset();toBankFirst();toBankShow()"/>-->
<!--<span style="font-size:9px;">网银电脑端</span>-->
<!--<span id="intro">-->
<!--<div class="pos" ng-show="bankshow">-->
<!--<i class="tocancle glyphicon glyphicon-remove" ng-click="toHide()"></i>-->
<!--<uib-carousel active=0 interval="myInterval" no-wrap="false">-->
<!--<uib-slide ng-repeat="slide2 in slidesBank track by slide2.id" index="slide2.id">-->
<!--<img ng-src="{{slide2.image}}" style="margin:auto;height: 400px;background-color: black">-->
<!--<div class="carousel-caption" style="bottom: 10px;text-shadow: 0 0px 0px">-->
<!--<p class="text-primary">{{slide2.text}}</p>-->
<!--</div>-->
<!--</uib-slide>-->
<!--</uib-carousel>-->
<!--</div>-->
<!--</span>-->
<!--</div>-->
<!--<div style="padding-top: 30px;padding-left: 4%;text-align: center">-->
<!--<img style="width: 220px;height: 150px;cursor: pointer" src="/static/images/hfpaylink_intro/app_bank_hf_pay_step1.png" class="img-responsive" ng-click="reset();toAppFirst();toAppShow()"/>-->
<!--<span style="font-size:9px;">手机端</span>-->
<!--<span >-->
<!--<div class="pos" ng-show="appshow">-->
<!--<i class="tocancle glyphicon glyphicon-remove" ng-click="toHide()"></i>-->
<!--<uib-carousel active=0 interval="myInterval" no-wrap="false">-->
<!--<uib-slide ng-repeat="slide3 in slidesApp track by slide3.id" index="slide3.id">-->
<!--<img ng-src="{{slide3.image}}" style="margin:auto;height: 400px;background-color: black">-->
<!--<div class="carousel-caption" style="bottom: 10px;text-shadow: 0 0px 0px">-->
<!--<p class="text-primary">{{slide3.text}}</p>-->
<!--</div>-->
<!--</uib-slide>-->
<!--</uib-carousel>-->
<!--</div>-->
<!--</span>-->
<!--</div>-->
</div>
</div>
</div>
</div>
<div class="panel panel-default">
<div class="panel-heading">Paying Surcharge
</div>

@ -172,6 +172,7 @@
<li role="presentation" ng-class="{active:bankCtrl.rate_name=='jd'}"><a role="button" ng-click="bankCtrl.rate_name='jd'">JDpay</a></li>
<li role="presentation" ng-class="{active:bankCtrl.rate_name=='hf'}"><a role="button" ng-click="bankCtrl.rate_name='hf'">HFpay</a></li>
<li role="presentation" ng-class="{active:bankCtrl.rate_name=='Rpay'}"><a role="button" ng-click="bankCtrl.rate_name='Rpay'">Rpay+</a></li>
<li role="presentation" ng-class="{active:bankCtrl.rate_name=='Yeepay'}"><a role="button" ng-click="bankCtrl.rate_name='Yeepay'">Yeepay</a></li>
</ul>
<div class="table-responsive">
<table class="table table-bordered">
@ -212,4 +213,4 @@
</div>
</div>
</div>
</div>

@ -160,6 +160,30 @@
</div>
</div>
<div class="form-group"
ng-class="{'has-error':rate_form.yeepay_rate_value.$invalid && rate_form.yeepay_rate_value.$dirty}">
<label class="control-label col-sm-4" for="yeepay_rate_value_input">Yeepay Rate Value</label>
<div class="col-sm-6">
<div class="input-group">
<input type="number" name="yeepay_rate_value" stringToNumber2 class="form-control" ng-model="rate.yeepay_rate_value"
min="0.6" max="2.2" step="0.1" id="yeepay_rate_value_input" required>
<div class="input-group-addon">%</div>
</div>
<div ng-messages="rate_form.yeepay_rate_value.$error" ng-if="rate_form.yeepay_rate_value.$dirty">
<div class="small text-danger" ng-message="max">
<i class="glyphicon glyphicon-alert"></i> No more than 2.2%
</div>
<div class="small text-danger" ng-message="min">
<i class="glyphicon glyphicon-alert"></i> No less than 0.6%
</div>
<div class="small text-danger" ng-message="required">
<i class="glyphicon glyphicon-alert"></i> Required Field
</div>
</div>
</div>
</div>
<!-- 新增transaction_fee -->
<div class="form-group"
ng-class="{'has-error':rate_form.transaction_fee.$invalid && rate_form.transaction_fee.$dirty}">
@ -214,4 +238,4 @@
<div class="modal-footer">
<button class="btn btn-success" type="button" ng-click="saveRate(rate_form)" ng-disabled="ctrl.sending">Submit</button>
<button class="btn btn-danger" type="button" ng-click="$dismiss()">Cancel</button>
</div>
</div>

@ -31,7 +31,7 @@
<a role="button" ng-class="{'bg-primary':params.status=='PARTIAL_REFUNDED'}"
ng-click="params.status='PARTIAL_REFUNDED';loadTradeLogs(1)">Partial Refund</a> |
<a role="button" ng-class="{'bg-primary':params.status=='FULL_REFUNDED'}"
ng-click="params.status='FULL_REFUNDED';loadTradeLogs(1)">Full Refund</a>
ng-click="params.status='FULL_REFUNDED';loadTradeLogs(1)">Full Refund</a> |
</p>
</div>
</div>
@ -87,7 +87,9 @@
<a role="button" ng-class="{'bg-primary':params.channel=='HF'}"
ng-click="params.channel='HF';loadTradeLogs(1)">HFpay</a> |
<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>
</div>
</div>
@ -188,6 +190,7 @@
<img src="/static/images/jd_sign.png" uib-tooltip="JD Pay" ng-if="trade.channel=='jd'"/>
<img src="/static/images/hf_sign.png" uib-tooltip="HF Pay" ng-if="trade.channel=='hf'"/>
<img src="/static/images/rpayplus_sign.png" uib-tooltip="RPay+" ng-if="trade.channel=='Rpay'"/>
<img src="/static/images/yeepay_sign.png" uib-tooltip="Yeepay" ng-if="trade.channel=='Yeepay'"/>
{{trade.order_id}}
</td>
<td>
@ -232,4 +235,4 @@
last-text="&raquo;"></uib-pagination>
<div class="col-xs-12">Total Records:{{pagination.totalCount}};Total Pages:{{pagination.totalPages}}</div>
</div>
</div>
</div>

@ -56,6 +56,14 @@
</p>
</div>
</div>
<div class="form-group" ng-if="'10'|withRole">
<label class="col-sm-3 control-label">Yeepay Sub Merchant Id</label>
<div class="col-sm-9">
<p class="form-control-static">
{{paymentInfo.yeepay_sub_merchant_id||'初始化'}}
</p>
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">Ali Sub Merchant Id</label>
@ -209,6 +217,12 @@
<input type="checkbox" ng-model="paymentInfo.enable_hf" bs-switch switch-change="toggleChannel('hf')">
</div>
</div>
<div class="form-group col-sm-4">
<label class="col-xs-6 control-label">Yeepay|易宝支付</label>
<div class="col-xs-6">
<input type="checkbox" ng-model="paymentInfo.enable_yeepay" bs-switch switch-change="toggleChannel('yeepay')">
</div>
</div>
</div>
</div>
@ -354,6 +368,29 @@
<input type="checkbox" ng-model="paymentInfo.enable_hf_email_notice" bs-switch switch-change="toggleHfEmailNotice()">
</div>
</div>
<hr ng-if="paymentInfo.enable_yeepay">
<div class="form-group" ng-if="paymentInfo.enable_yeepay">
<label class="col-sm-2 control-label">Yeepay Link</label>
<div class="col-sm-10">
<input type="checkbox" ng-model="paymentInfo.enable_yeepay_link" bs-switch switch-change="toggleGatewayLink('yeepay')">
&nbsp;&nbsp;<a href={{paymentInfo.yeepay_pay_url}} target="_Blank"><span ng-if="paymentInfo.enable_yeepay_link">{{paymentInfo.yeepay_pay_url}}</span></a>
<i ng-if="paymentInfo.enable_yeepay_link" class="fa fa-clipboard margin-r-5" style="cursor: pointer" ng-click="copyYeepayLink()"></i>
<input ng-if="paymentInfo.enable_link" style="opacity: 0" id="cpyeepay" value={{paymentInfo.yeepay_pay_url}} readonly>
</div>
</div>
<div class="form-group" ng-if="paymentInfo.enable_yeepay && paymentInfo.enable_yeepay_link">
<label class="col-sm-2 control-label">Yeepay QR Code</label>
<img ng-src="{{paymentInfo.yeepayQrcodeUrl}}" class="img-responsive" />
<div>
&nbsp;&nbsp;<span style="padding-left: 19.2%;font-size:9px;">仅支持微信客户端扫描</span>
</div>
</div>
<div class="form-group" ng-if="paymentInfo.enable_yeepay">
<label class="col-sm-2 control-label">Yeepay Email Notice</label>
<div class="col-sm-10">
<input type="checkbox" ng-model="paymentInfo.enable_yeepay_email_notice" bs-switch switch-change="toggleGatewayEmailNotice('yeepay')">
</div>
</div>
</div>
</div>
</div>
@ -429,18 +466,41 @@
<div class="panel panel-default">
<div class="panel-heading">Payment Page</div>
<div class="panel-body">
<div class="form-horizontal">
<div class="form-group" ng-if="'111'|withRole">
<label class="col-sm-2 control-label">Select Version</label>
<div class="col-sm-4">
<div class="form-horizontal" ng-if="'111'|withRole">
<div class="form-group col-sm-6">
<label class="col-sm-4 control-label">Select Version</label>
<div class="col-sm-6">
<select class="form-control" ng-change="changePaymentPage()" ng-model="paymentInfo.paypad_version" title="Payment Page">
<option value="v1">v1</option>
<option value="v2">v2</option>
</select>
</div>
<div class="col-sm-12">
<label class="col-sm-4 control-label"></label>
<div class="col-sm-8" style="margin-top: 10px;">
<img style="width: 200px" ng-if="paymentInfo.paypad_version=='v1'" src="/static/images/payment_page_v1.jpg">
<img style="width: 200px" ng-if="paymentInfo.paypad_version=='v2'" src="/static/images/payment_page_v2.jpg">
</div>
</div>
</div>
<div class="form-group col-sm-6">
<label class="col-sm-4 control-label">Select Version</label>
<div class="col-sm-6">
<img style="width: 200px" ng-if="paymentInfo.paypad_version=='v1'" src="/static/images/payment_page_v1.jpg">
<img style="width: 200px" ng-if="paymentInfo.paypad_version=='v2'" src="/static/images/payment_page_v2.jpg">
<select class="form-control" ng-change="changePaySuccessPage()" ng-model="paymentInfo.paysuccess_version"
title="Payment Success Page">
<option value="v1">v1</option>
<option value="v2">v2</option>
</select>
</div>
<div class="col-sm-12">
<label class="col-sm-4 control-label"></label>
<div class="col-sm-8" style="margin-top: 10px;">
<img style="width: 200px" ng-if="paymentInfo.paysuccess_version=='v1'"
src="/static/images/paysuccess_v1.png">
<img style="width: 200px" ng-if="paymentInfo.paysuccess_version=='v2'"
src="/static/images/paysuccess_v2.png">
</div>
</div>
</div>
</div>

@ -149,4 +149,64 @@
</div>
</div>
</div>
</div>
<div class="content">
<div class="row">
<div class="col-sm-12">
<div class="box-solid">
<div class="box box-warning">
<div class="box-header">
<h3 class="box-title pull-left">
Yeepay Sub Merchant Id : {{partner.yeepay_sub_merchant_id}}
</h3>
<button role="button" class="btn btn-info pull-right" title="Apply Sub Merchant Id"
ng-click="applyYeepaySubMerchantId()">
<i class="fa fa-plus"></i>
Apply Sub Merchant Id
</button>
</div>
</div>
<div class="box">
<div class="box-header">
<h3 class="box-title">List of Sub Merchant Id</h3>
</div>
<div class="box-body col-sm-6" ng-repeat="id_apply in subYeepayMerchantInfos">
<ul class="list-group ui_desk">
<li class="list-group-item list-group-item-success">
<b>Sub Merchant Id</b>
<b style="float: right"><span
ng-if="partner.yeepay_sub_merchant_id == id_apply.sub_merchant_id"><small
class="text-red">(当前使用)</small></span>{{id_apply.sub_merchant_id}}</b>
</li>
<li class="list-group-item list-group-item-success">
Apply Time
<span style="float: right" ng-bind="id_apply.create_time"></span>
</li>
<li class="list-group-item list-group-item-success">
Business Content
<span style="float:right;">{{id_apply.business_content | yeepayBusinessContent}}</span>
</li>
<li class="list-group-item list-group-item-success">
Business Category
<span style="float: right">{{id_apply.industry | yeepayIndustry}}</span>
</li>
<li class="list-group-item list-group-item-success">
Operator
<span style="float: right" ng-bind="id_apply.operator"></span>
</li>
</ul>
<div class="box_desk">
<div class="content_button">
<button role="button" class="btn btn-info" title="use"
ng-click="useYeepaySubMerchantId(id_apply.sub_merchant_id)">
USE
</button>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>

@ -97,7 +97,9 @@
<a role="button" ng-class="{'bg-primary':params.channel=='HF'}"
ng-click="params.channel='HF';loadTradeLogs(1)">HF Pay</a> |
<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>
</div>
</div>
@ -298,6 +300,8 @@
uib-tooltip="HF Pay" ng-if="trade.channel=='hf'"/>
<img src="/static/images/rpayplus_sign.png"
uib-tooltip="RPay" ng-if="trade.channel=='Rpay'"/>
<img src="/static/images/yeepay_sign.png"
uib-tooltip="Yeepay" ng-if="trade.channel=='Yeepay'"/>
{{trade.order_id2}}
</td>
<td ng-bind="trade.currency"></td>
@ -371,4 +375,4 @@
</div>
</div>
</div>
</div>
</div>

@ -45,6 +45,11 @@
<img src="/static/images/rpayplus_sign_lg.png">
</a>
</li>
<li ng-class="{active:ctrl.channel=='Yeepay'}" ng-if="report.channels.Yeepay">
<a role="button" ng-click="ctrl.channel='Yeepay';channelAndDayOfAnalysis()" title="Yeepay">
<img src="/static/images/yeepay_sign_lg.png">
</a>
</li>
</ul>
</div>
</div>
@ -251,4 +256,4 @@
</div>
</div>
</div>
</div>
</div>

@ -95,9 +95,11 @@
<a role="button" ng-class="{'bg-primary':params.channel=='JD'}"
ng-click="params.channel='JD';loadTradeLogs(1)">JD Pay</a> |
<a role="button" ng-class="{'bg-primary':params.channel=='HF'}"
ng-click="params.channel='HF';loadTradeLogs(1)">HF Pay</a>
ng-click="params.channel='HF';loadTradeLogs(1)">HF Pay</a> |
<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>
</div>
</div>
@ -325,6 +327,7 @@
<img src="/static/images/jd_sign.png" uib-tooltip="JD Pay" ng-if="trade.channel=='jd'"/>
<img src="/static/images/hf_sign.png" uib-tooltip="HF Pay" ng-if="trade.channel=='hf'"/>
<img src="/static/images/rpayplus_sign.png" uib-tooltip="RPay+" ng-if="trade.channel=='Rpay'"/>
<img src="/static/images/yeepay_sign.png" uib-tooltip="Yeepay" ng-if="trade.channel=='Yeepay'"/>
{{trade.order_id}}
</td>
<td>
@ -386,4 +389,4 @@
</div>
</div>
</div>
</div>
</div>

@ -135,7 +135,9 @@
<a role="button" ng-class="{'bg-primary':params.channel=='HF'}"
ng-click="params.channel='HF';loadTradeLogs(1)">HF Pay</a> |
<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>
</div>
</div>
@ -355,6 +357,8 @@
uib-tooltip="HF Pay" ng-if="trade.channel=='hf'"/>
<img src="/static/images/rpayplus_sign.png"
uib-tooltip="Royal Pay" ng-if="trade.channel=='Rpay'"/>
<img src="/static/images/yeepay_sign.png"
uib-tooltip="Yeepay" ng-if="trade.channel=='Yeepay'"/>
{{trade.order_id}}
</td>
<td>
@ -405,4 +409,4 @@
</div>
</div>
</div>
</div>
</div>

@ -49,6 +49,10 @@ define(['angular', 'static/commons/commons', 'uiBootstrap', 'uiRouter', 'ngBootS
url: '/risk/attention',
templateUrl: '/static/risk/templates/attention_merchants.html',
controller: 'AttentionMerchantCtrl'
}).state('analysis_monitoring.customer', {
url: '/risk/customer',
templateUrl: '/static/risk/templates/customer_blacklist.html',
controller: 'RiskCustomerBlackListCtrl'
});
}]);
app.controller('RiskManageCtrl', ['$scope', '$http', function ($scope, $http){
@ -264,8 +268,22 @@ define(['angular', 'static/commons/commons', 'uiBootstrap', 'uiRouter', 'ngBootS
$scope.loadAttentionMerchants(1);
})
};
$scope.editAttention = function (attention) {
$uibModal.open({
templateUrl: '/static/risk/templates/risk_merchant_edit.html',
controller: 'editRiskCtrl',
resolve:{
attention: attention
}
}).result.then(function () {
$scope.loadAttentionMerchants(1);
})
};
}]);
app.controller('newRiskCtrl', ['$scope', '$http','commonDialog', function ($scope, $http,commonDialog) {
$scope.attentions = {"enjoin_wechat": true,"enjoin_alipay": true,"enjoin_bestpay": true,
"enjoin_jd": true,"enjoin_hf": true}
$scope.save = function (attentions) {
var params = angular.copy(attentions);
$http.post('/sys/risk/attention/'+ attentions.client_moniker, params).then(function () {
@ -276,6 +294,61 @@ define(['angular', 'static/commons/commons', 'uiBootstrap', 'uiRouter', 'ngBootS
});
};
}]);
app.controller('editRiskCtrl', ['$scope', '$http','commonDialog', 'attention', function ($scope, $http,commonDialog, attention) {
$scope.attentions = angular.copy(attention);
$scope.update = function (attentions) {
var params = angular.copy(attentions);
$http.put('/sys/risk/attention/'+ attentions.client_moniker + '/detail', params).then(function () {
commonDialog.alert({title: 'Success', content: 'add successfully', type: 'success'});
$scope.$close();
}, function (resp) {
commonDialog.alert({title: 'Error', content: resp.data.message, type: 'error'});
});
};
}]);
app.controller('RiskCustomerBlackListCtrl', ['$scope', '$http','commonDialog', '$uibModal', function ($scope, $http,commonDialog,$uibModal) {
$scope.params = {};
$scope.pagination = {};
$scope.loadCustomerBlackList = function (page) {
var params = angular.copy($scope.params);
params.page = page || $scope.pagination.page || 1;
$http.get('/sys/risk/customer/blacklist', {params : params}).then(function (resp) {
$scope.customerList = resp.data.data;
$scope.pagination = resp.data.pagination;
});
};
$scope.loadCustomerBlackList();
$scope.disableCustomer = function (openid) {
commonDialog.confirm({title: 'Confirm', content: '确定将该用户移除黑名单?'
}).then(function () {
$http.put('/sys/risk/customer/blacklist/' + openid).then(function () {
commonDialog.alert({title: 'Success', content: 'disable successfully', type: 'success'});
$scope.loadCustomerBlackList();
}, function (resp) {
commonDialog.alert({title: 'Error', content: resp.data.message, type: 'error'});
});
})
};
$scope.save = function () {
$uibModal.open({
templateUrl: '/static/risk/templates/new_customer_blacklist.html',
controller: 'newCustomerBlackListCtrl'
}).result.then(function () {
$scope.loadCustomerBlackList()
})
};
}]);
app.controller('newCustomerBlackListCtrl', ['$scope', '$http','commonDialog', function($scope, $http, commonDialog){
$scope.params = {};
$scope.addCustomer = function () {
$http.post('/sys/risk/customer/' + $scope.params.openid + '/blacklist', $scope.params).then(function () {
commonDialog.alert({title: 'Success', content: 'disable successfully', type: 'success'});
$scope.$close();
}, function (resp) {
commonDialog.alert({title: 'Error', content: resp.data.message, type: 'error'});
});
};
}]);
app.filter('risk_type', function () {
return function (riskStr) {
angular.forEach(riskType,function (type) {

@ -56,6 +56,7 @@
<th>Contact Phone</th>
<th>Operation Time</th>
<th>Remark</th>
<th>Disable Channels</th>
<th>Operation</th>
</tr>
</thead>
@ -69,9 +70,18 @@
<td>{{client.contact_phone}}</td>
<td>{{client.creation_date}}</td>
<td>{{client.remark}}</td>
<td>
<span ng-if="client.enjoin_wechat">Wechat</span>
<span ng-if="client.enjoin_alipay">Alipay</span>
<span ng-if="client.enjoin_bestpay">Bestpay</span>
<span ng-if="client.enjoin_jd">JD</span>
<span ng-if="client.enjoin_hf">HF</span>
</td>
<td>
<a role="button" class="text-bold text-danger"
ng-click="disableAttention(client.client_moniker)">Disable</a>
<a role="button" class="text-bold text-bule"
ng-click="editAttention(client)">Edit</a>
</td>
</tr>
</tbody>

@ -0,0 +1,76 @@
<div ui-view>
<section class="content-header">
<h1>Blacklist</h1>
<ol class="breadcrumb">
<li><i class="fa fa-list-alt"></i> Risk Manager</li>
<li class="active">Customer Blacklist</li>
</ol>
</section>
<section class="content">
<div class="box box-warning">
<div class="box-header">
<div class="form-inline">
<div class="form-group">
<label class="control-label" for="partner-code-search">Openid</label>
<input type="text" class="form-control" id="partner-code-search"
ng-enter="loadCustomerBlackList(1)"
ng-model="params.openid">
</div>
<div class="form-group">
<button class="btn btn-primary" type="button" ng-click="loadCustomerBlackList(1)"><i
class="fa fa-search"></i></button>
</div>
<div class="form-group pull-right">
<button class="btn btn-info" type="button" ng-click="save()"><i class="fa fa-plus"></i>Add</button>
</div>
</div>
</div>
</div>
<div class="box box-warning">
<div class="box-header">Customer</div>
<div class="box-body table-responsive">
<table class="table table-hover">
<thead>
<tr>
<th>Openid</th>
<th>Customer</th>
<th>Operation Time</th>
<th>Remark</th>
<th>Operation</th>
</tr>
</thead>
<tbody>
<tr ng-repeat="customer in customerList">
<td>{{customer.openid}}</td>
<td style="white-space: nowrap;overflow: hidden;text-overflow:ellipsis;">
<img ng-src="{{customer.headimg}}" style="height: 30px;width:30px;" class="img-circle" ng-if="customer.headimg"> {{customer.nickname}}
</td>
<td>{{customer.creation_date}}</td>
<td>{{customer.remark}}</td>
<td>
<a role="button" class="text-bold text-danger"
ng-click="disableCustomer(customer.openid)">Disable</a>
</td>
</tr>
</tbody>
</table>
<div class="modal-footer">
<uib-pagination ng-if="customerList.length"
class="pagination"
total-items="pagination.totalCount"
boundary-links="true"
ng-model="pagination.page"
items-per-page="pagination.limit"
max-size="10"
ng-change="loadCustomerBlackList()"
previous-text="&lsaquo;"
next-text="&rsaquo;"
first-text="&laquo;"
last-text="&raquo;"></uib-pagination>
</div>
</div>
</div>
</section>
</div>

@ -0,0 +1,28 @@
<section class="content-header">
<h1>New Customer Blacklist</h1>
</section>
<div class="content">
<div class="row">
<div class="col-sm-12">
<div class="box-solid">
<div class="box box-warning">
<div class="box-header">
<form role="form" style="margin:0px auto;width: 50%">
<div class="form-group">
<label>Open ID</label>
<input ng-model="params.openid" class="form-control" type="text" />
</div>
<div class="form-group">
<label>Remark</label>
<input ng-model="params.remark" class="form-control" type="text" />
</div>
<div class="form-group">
<button class="btn btn-primary btn-block" ng-click="addCustomer()">save</button>
</div>
</form>
</div>
</div>
</div>
</div>
</div>
</div>

@ -27,6 +27,26 @@
is-open="creationCtrl.open" ng-click="creationCtrl.open=true">
</div>
</div>
<div class="form-group">
<label class="control-label col-sm-3">Channels</label>
<p class="checkbox-inline checkbox col-sm-7">
<label>
<input type="checkbox" ng-model="attentions.enjoin_wechat" name="WeChat|微信">WeChat|微信
</label>
<label>
<input type="checkbox" ng-model="attentions.enjoin_alipay" name="Alipay|支付宝">Alipay|支付宝
</label>
<label>
<input type="checkbox" ng-model="attentions.enjoin_bestpay" name="Bestpay|翼支付">Bestpay|翼支付
</label>
<label>
<input type="checkbox" ng-model="attentions.enjoin_jd" name="JD|京东">JD|京东
</label>
<label>
<input type="checkbox" ng-model="attentions.enjoin_hf" name="HF|汇付">HF|汇付
</label>
</p>
</div>
</form>
</div>
</div>

@ -0,0 +1,53 @@
<div class="modal-header">
<h4>Edit Risk Merchants</h4>
</div>
<div class="modal-body">
<div class="row">
<div class="col-sm-12">
<form novalidate name="accountForm" class="form-horizontal">
<div class="form-group">
<label class="control-label col-sm-3" for="client-moniker">Client Moniker</label>
<div class="col-sm-7">
<input class="form-control" type="text" id="client-moniker" name="client_moniker"
ng-model="attentions.client_moniker" disabled>
</div>
</div>
<div class="form-group">
<label class="control-label col-sm-3" for="attentions-remark">Remark</label>
<div class="col-sm-7">
<input class="form-control" type="text" id="attentions-remark" name="remark"
ng-model="attentions.remark">
</div>
</div>
<div class="form-group">
<label class="control-label col-sm-3">Channels</label>
<p class="checkbox-inline checkbox col-sm-7">
<label>
<input type="checkbox" ng-model="attentions.enjoin_wechat" name="WeChat|微信">WeChat|微信
</label>
<label>
<input type="checkbox" ng-model="attentions.enjoin_alipay" name="Alipay|支付宝">Alipay|支付宝
</label>
<label>
<input type="checkbox" ng-model="attentions.enjoin_bestpay" name="Bestpay|翼支付">Bestpay|翼支付
</label>
<label>
<input type="checkbox" ng-model="attentions.enjoin_jd" name="JD|京东">JD|京东
</label>
<label>
<input type="checkbox" ng-model="attentions.enjoin_hf" name="HF|汇付">HF|汇付
</label>
</p>
</div>
</form>
</div>
</div>
</div>
<div class="modal-footer">
<div class="btn-group">
<button class="btn btn-success" type="button" ng-click="update(attentions)">Submit</button>
</div>
<div class="btn-group">
<button class="btn btn-danger" type="button" ng-click="$dismiss()">Cancel</button>
</div>
</div>

@ -9,6 +9,9 @@
.pagehead.AlipayOnline{
background-color: #108ee9;
}
.pagehead.Yeepay{
background-color: #23ac38;
}
.pagehead img {
width: 40px;
height: 40px;
@ -406,4 +409,4 @@
color: #fff;
background: url(/static/images/button@2x.png) no-repeat;
background-size: 100% 100%;
}
}

Loading…
Cancel
Save