master
wangning 7 years ago
commit 215949e30a

@ -371,3 +371,26 @@ CREATE TABLE `log_client_sub_merchant_id` (
`client_id` int(11) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE `pmt_sub_merchant_id` (
`sub_merchant_id` varchar(30) NOT NULL,
`merchant_id` varchar(30) NOT NULL,
`is_valid` tinyint(1) DEFAULT 1,
`operator` varchar(30) DEFAULT '',
`create_time` datetime DEFAULT NULL,
`update_time` datetime DEFAULT NULL,
PRIMARY KEY (`sub_merchant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
alter table sys_clients add column common_sub_merchant_id tinyint(1) default 0 comment '是否使用通用子商户号';
CREATE TABLE `cli_sub_merchant_id` (
`sub_merchant_id` varchar(30) NOT NULL,
`merchant_id` varchar(30) DEFAULT NULL,
`client_count` int(8) DEFAULT NULL,
`temp_sub_merchant` tinyint(1) DEFAULT 0,
`create_time` datetime DEFAULT NULL,
PRIMARY KEY (`sub_merchant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

@ -6,6 +6,7 @@ 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 org.apache.ibatis.annotations.Param;
import java.util.List;
@ -32,4 +33,6 @@ public interface ClientAnalysisMapper {
List<JSONObject> listPartnersTradeAmount(JSONObject params, PageBounds pageBounds);
List<JSONObject> countClientsTypes(JSONObject params);
List<JSONObject> notTradeSubMerchantId();
}

@ -26,6 +26,7 @@ public class AppQueryBean {
private OrderStatus status = OrderStatus.ALL;
private PayChannel channel = PayChannel.ALL;
private int[] gateway;
private int clearing_status=-1;
private String gateway_app;
private int page = 1;
private int limit = 20;
@ -86,6 +87,9 @@ public class AppQueryBean {
if (app_client_ids != null && !app_client_ids.isEmpty()) {
params.put("client_ids", app_client_ids.split(","));
}
if (clearing_status != -1) {
params.put("clearing_status", clearing_status);
}
return params;
}
@ -169,4 +173,12 @@ public class AppQueryBean {
public void setChannel(PayChannel channel) {
this.channel = channel;
}
public int getClearing_status() {
return clearing_status;
}
public void setClearing_status(int clearing_status) {
this.clearing_status = clearing_status;
}
}

@ -284,7 +284,8 @@ public class RetailAppServiceImp implements RetailAppService {
String clientType = device.getString("client_type");
deviceSupport.findRegister(clientType);
int client_id = device.getIntValue("client_id") ;
//JSONObject client = clientManager.getClientInfo(client_id);
JSONObject client = clientManager.getClientInfo(client_id);
device.put("client_moniker",client.getString("client_moniker"));
TradeLogQuery tradeLogQuery = new TradeLogQuery();
tradeLogQuery.setDatefrom(appQueryBean.getBegin());
tradeLogQuery.setDateto(appQueryBean.getEnd());

@ -1,13 +0,0 @@
package au.com.royalpay.payment.manage.dev.core;
import com.alibaba.fastjson.JSONObject;
/**
* Created by yuan on 2017/9/18.
*/
public interface CommonSubMerchantIdService {
void save(JSONObject record);
void disable(String sub_merchant_id);
}

@ -1,45 +0,0 @@
package au.com.royalpay.payment.manage.dev.core.impl;
import au.com.royalpay.payment.channels.wechat.config.WeChatPayConfig;
import au.com.royalpay.payment.channels.wechat.runtime.MpPaymentApi;
import au.com.royalpay.payment.manage.dev.core.CommonSubMerchantIdService;
import au.com.royalpay.payment.manage.mappers.payment.CommonSubMerchantIdMapper;
import au.com.royalpay.payment.tools.exceptions.BadRequestException;
import com.alibaba.fastjson.JSONObject;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
@Service
public class CommonSubMerchantIdServiceImpl implements CommonSubMerchantIdService {
@Resource
private CommonSubMerchantIdMapper commonSubMerchantIdMapper;
@Resource
private MpPaymentApi mpPaymentApi;
@Override
public void save(JSONObject record) {
JSONObject sub_merchant_id = commonSubMerchantIdMapper.find(record.getString("sub_merchant_id"));
if(sub_merchant_id!=null){
throw new BadRequestException("当前商户号已经添加,请重新输入");
}
WeChatPayConfig.Merchant availableMerchant = mpPaymentApi.determineMerchant(record.getString("sub_merchant_id"));
if(availableMerchant == null){
throw new BadRequestException("未检索到对应的商户号,请验证子商户号是否正确");
}
record.put("merchant_id",availableMerchant.getMerchantId());
commonSubMerchantIdMapper.save(record);
}
@Override
public void disable(String sub_merchant_id) {
JSONObject record = new JSONObject();
record.put("sub_merchant_id",sub_merchant_id);
record.put("is_valid",false);
commonSubMerchantIdMapper.update(record);
}
}

@ -0,0 +1,24 @@
package au.com.royalpay.payment.manage.dev.web;
import com.alibaba.fastjson.JSONObject;
import com.maxmind.geoip.LookupService;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
@RestController
@RequestMapping(value = "/dev/ip")
public class IPController {
@Resource
private LookupService lookupService;
@RequestMapping(value = "/{ipAddr}", method = RequestMethod.GET)
public String getIpInfo(@PathVariable String ipAddr) {
String city = lookupService.getLocation(ipAddr).city;
return city;
}
}

@ -11,11 +11,9 @@ import au.com.royalpay.payment.manage.analysis.core.PlatformClearService;
import au.com.royalpay.payment.manage.appclient.core.RetailAppService;
import au.com.royalpay.payment.manage.dev.bean.Message;
import au.com.royalpay.payment.manage.dev.bean.SendWechatMessage;
import au.com.royalpay.payment.manage.dev.core.CommonSubMerchantIdService;
import au.com.royalpay.payment.manage.dev.core.WechatMessageService;
import au.com.royalpay.payment.manage.mappers.customers.CustomerEncourageMoneyUseLogMapper;
import au.com.royalpay.payment.manage.mappers.log.NotifyErrorLogMapper;
import au.com.royalpay.payment.manage.mappers.payment.CommonSubMerchantIdMapper;
import au.com.royalpay.payment.manage.mappers.payment.OrderMapper;
import au.com.royalpay.payment.manage.mappers.payment.RefundMapper;
import au.com.royalpay.payment.manage.mappers.system.ClientBankAccountMapper;
@ -28,7 +26,6 @@ import au.com.royalpay.payment.tools.exceptions.BadRequestException;
import au.com.royalpay.payment.tools.http.HttpUtils;
import au.com.royalpay.payment.tools.merchants.core.MerchantInfoProvider;
import au.com.royalpay.payment.tools.permission.enums.ManagerRole;
import au.com.royalpay.payment.tools.utils.PageListUtils;
import au.com.royalpay.payment.tools.utils.PdfUtils;
import au.com.royalpay.payment.tools.utils.TimeZoneUtils;
import au.com.royalpay.payment.tools.utils.XmlFormatUtils;
@ -36,7 +33,6 @@ import au.com.royalpay.payment.tools.utils.XmlFormatUtils;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.serializer.SerializerFeature;
import com.github.miemiedev.mybatis.paginator.domain.PageBounds;
import org.apache.commons.lang3.time.DateFormatUtils;
import org.dom4j.Element;
@ -112,10 +108,7 @@ public class TestController implements ApplicationEventPublisherAware {
private ApplicationEventPublisher publisher;
@Resource
private WechatMessageService wechatMessageService;
@Resource
private CommonSubMerchantIdMapper commonSubMerchantIdMapper;
@Resource
private CommonSubMerchantIdService commonSubMerchantIdService;
@ManagerMapping(value = "/{clientMoniker}/export/agreepdf", method = RequestMethod.GET, role = {ManagerRole.ADMIN, ManagerRole.DIRECTOR, ManagerRole.OPERATOR})
public void exportAgreeFile(@PathVariable String clientMoniker, @ModelAttribute(CommonConsts.MANAGER_STATUS) JSONObject manager, HttpServletResponse httpResponse) throws Exception {
httpResponse.setContentType("application/pdf");
@ -386,22 +379,4 @@ public class TestController implements ApplicationEventPublisherAware {
wechatMessageService.sendMessageByOpenId(sendWechatMessage);
}
@RequestMapping(value = "/common_sub_merchant_id", method = RequestMethod.GET)
public JSONObject listCommonSubMerchantId(@RequestParam(required = false) String sub_merchant_id,@RequestParam(defaultValue = "true") boolean is_valid, @RequestParam(defaultValue = "1") int page,
@RequestParam(defaultValue = "10") int limit) {
return PageListUtils.buildPageListResult(commonSubMerchantIdMapper.list(is_valid,sub_merchant_id,new PageBounds(page,limit)));
}
@RequestMapping(value = "/common_sub_merchant_id/{sub_merchant_id}", method = RequestMethod.POST)
public void addCommonSubMerchantId(@PathVariable String sub_merchant_id) {
JSONObject record = new JSONObject();
record.put("sub_merchant_id",sub_merchant_id);
commonSubMerchantIdService.save(record);
}
@RequestMapping(value = "/common_sub_merchant_id/{sub_merchant_id}", method = RequestMethod.PUT)
public void disableCommonSubMerchantId(@PathVariable String sub_merchant_id) {
commonSubMerchantIdService.disable(sub_merchant_id);
}
}

@ -0,0 +1,25 @@
package au.com.royalpay.payment.manage.mappers.client;
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 org.apache.ibatis.annotations.Param;
import java.util.List;
@AutoMapper(tablename = "cli_sub_merchant_id", pkName = "sub_merchant_id")
public interface ClientSubMerchantIdMapper {
@AutoSql(type = SqlType.SELECT)
List<JSONObject> listSubMerchantId(PageBounds pageBounds);
@AutoSql(type = SqlType.INSERT)
void save(JSONObject subMerchantId);
@AutoSql(type = SqlType.UPDATE)
void update(JSONObject subMerchantId);
@AutoSql(type = SqlType.DELETE)
void delete(@Param("sub_merchant_id") String sub_merchant_id);
}

@ -10,13 +10,15 @@ 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 java.util.List;
/**
* Create by yixian at 2017-12-05 23:13
*/
@AutoMapper(tablename = "pmt_sub_merchant_id", pkName = "sub_merchant_id")
public interface CommonSubMerchantIdMapper {
@AutoSql(type = SqlType.SELECT)
PageList<JSONObject> list(@Param("is_valid") boolean is_valid, @Param("sub_merchant_id") String sub_merchant_id, PageBounds pagination);
List<JSONObject> list(@Param("is_valid") boolean is_valid, @Param("sub_merchant_id") String sub_merchant_id,PageBounds pageBounds);
@AutoSql(type = SqlType.INSERT)
void save(JSONObject record);

@ -72,4 +72,8 @@ public interface ClientMapper {
List<String> listCityClientIds(@Param("city") String city, @Param("date") Date date);
List<String> listClientByCleanDays(@Param("clean_days") int clean_days);
List<JSONObject> listSubMerchantId();
List<JSONObject> listBySubMerchantId(@Param("sub_merchant_id") String sub_merchant_id);
}

@ -0,0 +1,23 @@
package au.com.royalpay.payment.manage.merchantid.core;
import com.alibaba.fastjson.JSONObject;
import java.util.List;
import java.util.Map;
/**
* Created by yuan on 2018/4/24.
*/
public interface MerchantIdManageService {
Map<String,List<JSONObject>> listSubMerchantId(JSONObject manager);
void generateClientsSunMerchantId();
JSONObject listNotTradeSubMerchantId(JSONObject manager);
List<JSONObject> showClientMoniker(JSONObject manager,String sub_merchant_id);
void save(JSONObject record);
void disable(String sub_merchant_id);
}

@ -0,0 +1,133 @@
package au.com.royalpay.payment.manage.merchantid.core.impl;
import au.com.royalpay.payment.channels.wechat.config.WeChatPayConfig;
import au.com.royalpay.payment.channels.wechat.runtime.MpPaymentApi;
import au.com.royalpay.payment.manage.analysis.mappers.ClientAnalysisMapper;
import au.com.royalpay.payment.manage.mappers.client.ClientSubMerchantIdMapper;
import au.com.royalpay.payment.manage.mappers.payment.CommonSubMerchantIdMapper;
import au.com.royalpay.payment.manage.mappers.system.ClientMapper;
import au.com.royalpay.payment.manage.merchantid.core.MerchantIdManageService;
import au.com.royalpay.payment.tools.env.PlatformEnvironment;
import au.com.royalpay.payment.tools.env.SysConfigManager;
import au.com.royalpay.payment.tools.exceptions.BadRequestException;
import com.alibaba.fastjson.JSONObject;
import com.github.miemiedev.mybatis.paginator.domain.Order;
import com.github.miemiedev.mybatis.paginator.domain.PageBounds;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
* Created by yuan on 2018/4/24.
*/
@Service
public class MerchantIdManageServiceImpl implements MerchantIdManageService {
@Autowired
private ClientMapper clientMapper;
@Autowired
private SysConfigManager sysConfigManager;
@Autowired
private ClientAnalysisMapper clientAnalysisMapper;
@Autowired
private ClientSubMerchantIdMapper clientSubMerchantIdMapper;
@Resource
private CommonSubMerchantIdMapper commonSubMerchantIdMapper;
@Resource
private MpPaymentApi mpPaymentApi;
@Override
public Map<String, List<JSONObject>> listSubMerchantId(JSONObject manager) {
List<JSONObject> clients = clientMapper.listSubMerchantId();
return getClientMap(clients);
}
@Override
public JSONObject listNotTradeSubMerchantId(JSONObject manager) {
List<JSONObject> clients = clientSubMerchantIdMapper.listSubMerchantId(new PageBounds(Order.formString("create_time.desc")));
Map<String, List<JSONObject>> merchantIdMap = clients.stream().filter(t->t.containsKey("merchant_id")).filter(t->t.containsKey("sub_merchant_id")).collect(Collectors.groupingBy(t->t.getString("merchant_id")));
JSONObject returnJason = new JSONObject();
returnJason.put("merchant_id_map",merchantIdMap);
returnJason.put("refresh_time",clients.size()>0?clients.get(0).getDate("create_time"):"");
return returnJason;
}
@Override
public void generateClientsSunMerchantId() {
String tempSubMerchantIds = sysConfigManager.getSysConfig().getString("temp_sub_mch_id");
List<JSONObject> clients = clientAnalysisMapper.notTradeSubMerchantId();
List<JSONObject> clientSubMerchantId = clientSubMerchantIdMapper.listSubMerchantId(new PageBounds(Order.formString("create_time.desc")));
Map<String, JSONObject> subMerchantIdMapFromDB = new HashMap<>();
for (JSONObject id : clientSubMerchantId) {
subMerchantIdMapFromDB.put(id.getString("sub_merchant_id"), id);
}
for (JSONObject client: clients) {
String subMerchantId = client.getString("sub_merchant_id");
if (subMerchantId != null && tempSubMerchantIds != null && tempSubMerchantIds.contains(subMerchantId)) {
client.put("temp_sub_merchant", true);
}
String id = client.getString("sub_merchant_id");
client.put("create_time",new Date());
if (subMerchantIdMapFromDB.containsKey(id)) {
subMerchantIdMapFromDB.remove(id);
clientSubMerchantIdMapper.update(client);
} else {
clientSubMerchantIdMapper.save(client);
}
}
for (String id : subMerchantIdMapFromDB.keySet()) {
clientSubMerchantIdMapper.delete(id);
}
}
@Override
public List<JSONObject> showClientMoniker(JSONObject manager,String sub_merchant_id) {
return clientMapper.listBySubMerchantId(sub_merchant_id);
}
@Override
public void save(JSONObject record) {
JSONObject sub_merchant_id = commonSubMerchantIdMapper.find(record.getString("sub_merchant_id"));
if(sub_merchant_id!=null){
throw new BadRequestException("当前商户号已经添加,请重新输入");
}
WeChatPayConfig.Merchant availableMerchant = mpPaymentApi.determineMerchant(record.getString("sub_merchant_id"));
if(availableMerchant == null){
throw new BadRequestException("未检索到对应的商户号,请验证子商户号是否正确");
}
record.put("merchant_id",availableMerchant.getMerchantId());
commonSubMerchantIdMapper.save(record);
}
@Override
public void disable(String sub_merchant_id) {
JSONObject record = new JSONObject();
record.put("sub_merchant_id",sub_merchant_id);
record.put("is_valid",false);
record.put("update_time",new Date());
commonSubMerchantIdMapper.update(record);
}
private Map<String, List<JSONObject>> getClientMap(List<JSONObject> clients){
String tempSubMerchantIds = sysConfigManager.getSysConfig().getString("temp_sub_mch_id");
for (JSONObject client: clients) {
String subMerchantId = client.getString("sub_merchant_id");
if (subMerchantId != null && tempSubMerchantIds != null && tempSubMerchantIds.contains(subMerchantId)) {
client.put("temp_sub_merchant", true);
}
}
Map<String, List<JSONObject>> clientsMap = clients.stream().filter(t->t.containsKey("merchant_id")).filter(t->t.containsKey("sub_merchant_id")).collect(Collectors.groupingBy(t->t.getString("merchant_id")));
return clientsMap;
}
}

@ -0,0 +1,75 @@
package au.com.royalpay.payment.manage.merchantid.web;
import au.com.royalpay.payment.manage.mappers.payment.CommonSubMerchantIdMapper;
import au.com.royalpay.payment.manage.merchantid.core.MerchantIdManageService;
import au.com.royalpay.payment.manage.permission.manager.RequireManager;
import au.com.royalpay.payment.tools.CommonConsts;
import au.com.royalpay.payment.tools.permission.enums.ManagerRole;
import com.alibaba.fastjson.JSONObject;
import com.github.miemiedev.mybatis.paginator.domain.Order;
import com.github.miemiedev.mybatis.paginator.domain.PageBounds;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import java.util.Date;
import java.util.List;
import java.util.Map;
@RestController
@RequestMapping("/sys/merchant_id")
public class MerchantIdManageController {
@Resource
private MerchantIdManageService merchantIdManageService;
@Resource
private CommonSubMerchantIdMapper commonSubMerchantIdMapper;
@RequestMapping(method = RequestMethod.GET)
@RequireManager(role = {ManagerRole.OPERATOR})
public Map<String,List<JSONObject>> listSubMerchantId(@ModelAttribute(CommonConsts.MANAGER_STATUS) JSONObject manager) {
return merchantIdManageService.listSubMerchantId(manager);
}
@RequestMapping(method = RequestMethod.GET,value = "/trade")
@RequireManager(role = {ManagerRole.OPERATOR})
public JSONObject listNotTradeSubMerchantId(@ModelAttribute(CommonConsts.MANAGER_STATUS) JSONObject manager) {
return merchantIdManageService.listNotTradeSubMerchantId(manager);
}
@RequestMapping(method = RequestMethod.POST,value = "/refresh")
@RequireManager(role = {ManagerRole.OPERATOR})
public void refreshClientsByTraded(@ModelAttribute(CommonConsts.MANAGER_STATUS) JSONObject manager) {
merchantIdManageService.generateClientsSunMerchantId();
}
@RequestMapping(method = RequestMethod.GET,value = "/{sub_merchant_id}")
@RequireManager(role = {ManagerRole.OPERATOR})
public List<JSONObject> showClientMoniker(@PathVariable() String sub_merchant_id,@ModelAttribute(CommonConsts.MANAGER_STATUS) JSONObject manager) {
return merchantIdManageService.showClientMoniker(manager,sub_merchant_id);
}
@RequestMapping(value = "/common_sub_merchant_id", method = RequestMethod.GET)
@RequireManager(role = {ManagerRole.OPERATOR})
public List<JSONObject> listCommonSubMerchantId(@RequestParam(required = false) String sub_merchant_id, @RequestParam(defaultValue = "true") boolean is_valid) {
return commonSubMerchantIdMapper.list(is_valid,sub_merchant_id,new PageBounds(Order.formString("create_time.desc")));
}
@RequestMapping(value = "/common_sub_merchant_id/{sub_merchant_id}", method = RequestMethod.POST)
@RequireManager(role = {ManagerRole.OPERATOR})
public void addCommonSubMerchantId(@PathVariable String sub_merchant_id,@ModelAttribute(CommonConsts.MANAGER_STATUS) JSONObject manager) {
JSONObject record = new JSONObject();
record.put("sub_merchant_id",sub_merchant_id);
record.put("operator",manager.getString("display_name"));
record.put("create_time",new Date());
merchantIdManageService.save(record);
}
@RequestMapping(value = "/common_sub_merchant_id/{sub_merchant_id}", method = RequestMethod.PUT)
@RequireManager(role = {ManagerRole.OPERATOR})
public void disableCommonSubMerchantId(@PathVariable String sub_merchant_id) {
merchantIdManageService.disable(sub_merchant_id);
}
}

@ -0,0 +1,19 @@
package au.com.royalpay.payment.manage.task;
import au.com.royalpay.payment.manage.merchantid.core.MerchantIdManageService;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
@Component
@ConditionalOnProperty(value = "app.run-tasks", havingValue = "true")
public class SubMerchantIdTaskManager {
@Resource
private MerchantIdManageService merchantIdManageService;
@Scheduled(cron = "0 0 4 * * ?")
public void analysisDashboard(){
merchantIdManageService.generateClientsSunMerchantId();
}
}

@ -134,4 +134,18 @@
GROUP BY c.royalpayindustry order by partner_counts desc
</select>
<select id="notTradeSubMerchantId" resultType="com.alibaba.fastjson.JSONObject">
<![CDATA[
SELECT COUNT(DISTINCT c.client_id) client_count,
c.sub_merchant_id,
c.merchant_id
FROM sys_clients c
WHERE c.sub_merchant_id not in
(SELECT p.sub_merchant_id FROM sys_clients p INNER JOIN pmt_orders o ON o.client_id = p.client_id AND o.status >4 AND o.confirm_time IS NOT NULL
WHERE datediff(now(), o.create_time) <= 25 AND p.sub_merchant_id is not null GROUP BY p.sub_merchant_id) AND c.sub_merchant_id IS not null AND c.merchant_id IS NOT NULL
AND (c.approve_result = 1 OR c.approve_result= 2) AND c.is_valid = 1
]]>
GROUP by c.sub_merchant_id
</select>
</mapper>

@ -658,7 +658,8 @@
t.transaction_id,
t.exchange_rate,
t.clearing_status,
t.settle_amount
t.settle_amount,
t.clearing_status = 2 pre_auth
from pmt_orders o
left join pmt_transactions t on t.order_id=o.order_id and t.channel!='Settlement' and t.system_generate=0
<where>
@ -687,6 +688,7 @@
<foreach collection="channel" item="chan" open="(" close=")" separator=" or ">o.channel=#{chan}
</foreach>
</if>
<if test="clearing_status!=null">and t.clearing_status=#{clearing_status}</if>
</where>
</select>

@ -286,4 +286,25 @@
<select id="listClientByCleanDays" resultType="java.lang.String">
SELECT client_id FROM sys_clients WHERE is_valid = 1 and clean_days = #{clean_days}
</select>
<select id="listSubMerchantId" resultType="com.alibaba.fastjson.JSONObject">
SELECT
COUNT(DISTINCT c.client_id) client_count,
c.sub_merchant_id,
c.merchant_id
FROM sys_clients c
WHERE (c.approve_result = 1 OR c.approve_result= 2) AND c.is_valid = 1 AND c.sub_merchant_id IS NOT NULL
AND c.merchant_id IS NOT NULL
GROUP BY c.sub_merchant_id
</select>
<select id="listBySubMerchantId" resultType="com.alibaba.fastjson.JSONObject">
SELECT
c.client_moniker,
c.sub_merchant_id,
c.merchant_id
FROM sys_clients c
WHERE (c.approve_result = 1 OR c.approve_result= 2) AND c.is_valid = 1 AND c.sub_merchant_id IS NOT NULL
AND c.merchant_id IS NOT NULL AND c.sub_merchant_id = #{sub_merchant_id}
</select>
</mapper>

@ -234,6 +234,7 @@ margin-bottom: 10%;"/>
<i class="fa fa-sitemap"></i> <span>商户管理|Partner Manage</span>
</a>
</li>
<li ui-sref-active="active"
ng-if="('partnerapply'|withModule) && (currentUser.org_id==null||currentUser.org_id==1)">
<a ui-sref="partner_application" ui-sref-opts="{reload:true}">
@ -393,6 +394,11 @@ margin-bottom: 10%;"/>
<li class="header nav-header" ng-if="'0100001'|withRole">基础设置|Basic Settings</li>
<li ui-sref-active="active" ng-if="('10'|withRole)&&('merchantIdManage'|withModule)">
<a ui-sref="merchant_id_manage" ui-sref-opts="{reload:true}">
<i class="fa fa-sitemap"></i> <span>商户号管理</span>
</a>
</li>
<li ui-sref-active="active" ng-if="'org'|withModule">
<a ui-sref="organizations" ui-sref-opts="{reload:true}">
<i class="fa fa-users"></i> <span>组织管理|Organizations</span>

@ -36,8 +36,13 @@ define(['../app'], function (app) {
}
}
}]);
app.controller('orderDetailDialogCtrl', ['$scope', 'order', function ($scope, order) {
app.controller('orderDetailDialogCtrl', ['$scope', 'order','$http', function ($scope, order,$http) {
$scope.order = order.data;
$scope.getPayLocation=function (ip) {
$http.get('/dev/ip/'+ip).then(function (res) {
$scope.pay_location = res.data;
})
}
}]);
app.controller('orderDetailEditCtrl', ['$scope', '$http', 'commonDialog', 'order', function ($scope, $http, commonDialog,order) {
$scope.order = order.data;

@ -75,7 +75,9 @@
<div class="form-group" ng-if="order.customer_ip">
<label class="control-label col-xs-3">IP</label>
<div class="col-xs-9">
<p class="form-control-static" ng-bind="order.customer_ip"></p>
<p class="form-control-static">
{{order.customer_ip}}&nbsp;&nbsp;<a role="button" ng-click="getPayLocation(order.customer_ip)">查询地区</a><span ng-if="pay_location"> : {{pay_location}}</span>
</p>
</div>
</div>
@ -128,6 +130,12 @@
<p class="form-control-static" ng-bind="order.clearing_amount|currency:'AUD '"></p>
</div>
</div>
<div class="form-group" ng-if="order.status>=5">
<label class="control-label col-xs-3">Gateway</label>
<div class="col-xs-9">
<p class="form-control-static" ng-bind="order.gateway|tradeGateway"></p>
</div>
</div>
<div class="form-group">
<label class="control-label col-xs-3">Create Time</label>
<div class="col-xs-9">

@ -51,11 +51,7 @@ define(['angular', 'uiRouter', 'uiBootstrap'], function (angular) {
url: '/phone_top_up',
templateUrl: '/static/config/devtools/templates/phone_top_up.html',
controller: 'phonetopupCtrl'
}).state('devtools.common_sub_merchant_id', {
url: '/common_sub_merchant_id',
templateUrl: '/static/config/devtools/templates/common_sub_merchant_id.html',
controller: 'commonSubMerchantIdCtrl'
});
})
}]);
app.controller('devManualRefundCtrl', ['$scope', '$http', 'commonDialog', function ($scope, $http, commonDialog) {
$scope.sendRefund = function () {
@ -307,52 +303,5 @@ define(['angular', 'uiRouter', 'uiBootstrap'], function (angular) {
}
}]);
app.controller('commonSubMerchantIdCtrl', ['$scope', '$http', '$uibModal', function ($scope, $http, $uibModal) {
$scope.pagination = {};
$scope.params = {};
$scope.loadSubMerchantId = function (page) {
var params = angular.copy($scope.params);
params.page = page || $scope.pagination.page || 1;
if(!params.sub_merchant_id){
delete params.sub_merchant_id;
}
$http.get('/dev/common_sub_merchant_id',{params: params}).then(function (resp) {
$scope.subMerchantIdList= resp.data.data;
$scope.pagination = resp.data.pagination;
});
};
$scope.loadSubMerchantId(1);
$scope.save = function () {
$uibModal.open({
templateUrl: '/static/config/devtools/templates/new_common_sub_merchant_id.html',
controller: 'newCommonSubMerchantIdCtrl'
}).result.then(function () {
})
}
$scope.disable = function (sub_merchant_id) {
$http.put('/dev/common_sub_merchant_id/'+sub_merchant_id).then(function (resp) {
alert("success");
$scope.loadSubMerchantId(1);
},function (resp) {
alert(resp.data.message);
});
}
}]);
app.controller('newCommonSubMerchantIdCtrl', ['$scope', '$http', function ($scope, $http) {
$scope.params = {};
$scope.saveSubMerchantId = function () {
var params = angular.copy($scope.params);
$http.post('/dev/common_sub_merchant_id/'+params.sub_merchant_id).then(function (resp) {
alert("保存成功");
},function (resp) {
alert(resp.data.message);
});
};
}]);
return app;
});

@ -1,88 +0,0 @@
<section class="content-header">
<h1>Sub Merchant ID</h1>
<ol class="breadcrumb">
<li>
<i class="fa fa-cog"></i> Basic Config
</li>
<li><a ui-sref="^">Dev Tools</a></li>
<li class="active">Sub Merchant ID</li>
</ol>
</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">
<div class="form-inline">
<div class="form-group">
<label class="control-label" for="sub_merchant_id-search">Sub Merchant Id</label>
<input class="form-control" id="sub_merchant_id-search" ng-model="params.sub_merchant_id">
</div>
<div class="form-group">
<button class="btn btn-primary" type="button" ng-click="loadSubMerchantId(1)"><i
class="fa fa-search"></i></button>
</div>
<div class="form-group">
<a role="button" class="btn btn-info pull-right" ng-click="save()"
title="New Activity">
<i class="fa fa-plus"></i>
New
</a>
</div>
</div>
</div>
</div>
<div class="box">
<div class="box-header">
<h3 class="box-title">Common Sub Merchant ID List</h3>
</div>
<div class="box-body no-padding table-responsive">
<table class="table table-striped">
<thead>
<tr>
<th>Sub Merchat ID</th>
<th>Merchat ID</th>
<th>Operation</th>
</tr>
</thead>
<tbody>
<tr ng-repeat="merchantId in subMerchantIdList">
<td ng-bind="merchantId.sub_merchant_id"></td>
<td ng-bind="merchantId.merchant_id"></td>
<td ng-click="disable(merchantId.sub_merchant_id)">
<i class="text-danger fa fa-close ng-scope" ng-if="!act.is_valid"></i>
</td>
</tbody>
</table>
</div>
<div class="box-footer" ng-if="subMerchantIdList.length">
<uib-pagination class="pagination"
total-items="pagination.totalCount"
boundary-links="true"
ng-model="pagination.page"
items-per-page="pagination.limit"
max-size="10"
ng-change="loadSubMerchantId()"
previous-text="&lsaquo;"
next-text="&rsaquo;"
first-text="&laquo;"
last-text="&raquo;"></uib-pagination>
<div class="row">
<div class="col-xs-12">Total Records:{{pagination.totalCount}};Total Pages:{{pagination.totalPages}}</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>

@ -67,10 +67,6 @@
<i class="fa fa-envelope"></i>
Phone Top Up
</a>
<a class="btn btn-app" role="button" ui-sref=".common_sub_merchant_id">
<i class="fa fa-envelope"></i>
Common Sub Merchant ID
</a>
</div>
</div>
</section>

@ -0,0 +1,115 @@
define(['angular', 'static/commons/commons', 'uiBootstrap', 'uiRouter', 'ngBootSwitch', 'ngFileUpload', 'uiSelect'], function (angular) {
'use strict';
var app = angular.module('merchantIdManage', ['ui.bootstrap', 'ui.router', 'frapontillo.bootstrap-switch', 'ngFileUpload', 'ui.select']);
app.config(['$stateProvider', function ($stateProvider) {
$stateProvider.state('merchant_id_manage', {
url: '/merchant_id/manage',
templateUrl: '/static/payment/merchantid/templates/merchant_id_manage.html',
controller: 'merchantIdManageCtrl',
data: {label: '商户号列表'}
})
}]);
app.controller('merchantIdManageCtrl', ['$scope', '$state', '$http', '$uibModal', 'commonDialog', function ($scope, $state, $http,$uibModal,commonDialog) {
$scope.pagination = {};
$scope.params = {};
$scope.isCollapsed = true;
$scope.loadClient = function () {
$scope.client_loading = true;
$http.get('/sys/merchant_id').then(function (resp) {
$scope.clientsMap = resp.data;
$scope.client_loading = false;
});
};
$scope.loadClient();
$scope.loadNotTradeClient = function () {
$http.get('/sys/merchant_id/trade').then(function (resp) {
$scope.notTradeClientsMap = resp.data.merchant_id_map;
$scope.refresh_time = resp.data.refresh_time;
$scope.disable_button = false;
});
};
$scope.loadNotTradeClient();
$scope.loadTempSubMerchantId = function () {
var params = angular.copy($scope.params);
if(!params.sub_merchant_id){
delete params.sub_merchant_id;
}
$http.get('/sys/merchant_id/common_sub_merchant_id',{params: params}).then(function (resp) {
$scope.subMerchantIdList= resp.data;
});
};
$scope.loadTempSubMerchantId();
$scope.showClient = function (sub_merchant_id) {
$uibModal.open({
templateUrl: '/static/payment/merchantid/templates/client_sub_merchant_id.html',
controller: 'showClientsCtrl',
resolve: {
clients: ['$http', function ($http) {
return $http.get('/sys/merchant_id/'+sub_merchant_id);
}]
},
size: 'sm'
})
};
$scope.refresh = function () {
$scope.disable_button = true;
$http.post('/sys/merchant_id/refresh').then(function (resp) {
$scope.loadNotTradeClient();
});
};
$scope.save = function () {
$uibModal.open({
templateUrl: '/static/payment/merchantid/templates/new_common_sub_merchant_id.html',
controller: 'newCommonSubMerchantIdCtrl'
}).result.then(function () {
$scope.loadTempSubMerchantId()
})
}
$scope.disable = function (sub_merchant_id) {
$http.put('/sys/merchant_id/common_sub_merchant_id/'+sub_merchant_id).then(function (resp) {
commonDialog.alert({title: 'Success', content: 'Success', type: 'success'});
$scope.loadTempSubMerchantId();
},function (resp) {
commonDialog.alert({title: 'Error', content: resp.data.message, type: 'error'});
});
}
}]);
app.controller('showClientsCtrl', ['$scope', '$http','clients', function ($scope, $http,clients) {
$scope.clients = clients.data;
}]);
app.controller('newCommonSubMerchantIdCtrl', ['$scope', '$http','commonDialog','$state', function ($scope, $http,commonDialog,$state) {
$scope.params = {};
$scope.saveSubMerchantId = function () {
var params = angular.copy($scope.params);
$http.post('/sys/merchant_id/common_sub_merchant_id/'+params.sub_merchant_id).then(function () {
$scope.$close();
commonDialog.alert({title: 'Success', content: '保存成功', type: 'success'});
},function (resp) {
commonDialog.alert({title: 'Error', content: resp.data.message, type: 'error'});
});
};
}]);
app.filter('choose_merchant_id', function () {
return function (value) {
switch (value + '') {
case '1307485301':
return '1307485301(Tunnel Show1)';
case '1431999902':
return '1431999902(Tunnel Show2)';
case '1487387142':
return '1487387142(NAP)';
case '':
return ''
}
}
});
return app;
});

@ -0,0 +1,11 @@
<div class="modal-header">
<h4>Clients</h4>
</div>
<div class="modal-body">
<div>
<a ng-repeat="client in clients"
ui-sref="partners.detail({clientMoniker:client.client_moniker})">
{{client.client_moniker}},
</a>
</div>
</div>

@ -0,0 +1,156 @@
<style>
.cursor {
cursor: pointer;
}
.div-display{
display: none;
}
.i-rotate_90{
animation:rotate_90 1s forwards;
-webkit-animation:rotate_90 1s forwards; /* Safari and Chrome */
}
@keyframes rotate_90
{
from {transform:rotate(0deg);}
to {transform:rotate(90deg);}
}
@-webkit-keyframes rotate_90 /* Safari and Chrome */
{
from {-webkit-transform:rotate(0deg);}
to {-webkit-transform:rotate(90deg);}
}
</style>
<div ui-view>
<section class="content-header">
<h1>Merchant Id Manage</h1>
<ol class="breadcrumb">
<li>
<i class="fa fa-sitemap"></i> Payment
</li>
<li class="active">Merchant Id Manage</li>
</ol>
</section>
<div class="content">
<div class="box box-warning">
<div class="box-body">
<uib-tabset>
<uib-tab heading="商户号列表">
<loadingbar ng-if="client_loading"></loadingbar>
<div class="col-sm-12 col-xs-12">
<div style="margin-top: 5px">
<div class="list-group col-sm-12 col-xs-12" ng-repeat="(key,clients) in clientsMap">
<a class="list-group-item active col-sm-12 col-xs-12">
{{key|choose_merchant_id}}
<span ng-show="clients.length>59" class="small-box-footer cursor pull-right" ng-click="isCollapsed = !isCollapsed"><span ng-if="clients.length>59">更多 <i class="fa fa-arrow-circle-right" ng-class="{'i-rotate_90':!isCollapsed}"></i></span></span>
</a>
<a class="list-group-item col-sm-2 col-xs-6 cursor"
ng-repeat="client in clients | orderBy:'client_count':true"
ng--click="showClient(client.sub_merchant_id);" ng-if="$index<60">
<span>
{{client.sub_merchant_id}}&nbsp;<i class="fa fa-clock-o text-danger"
title="Using temp Sub Merchant ID"
ng-if="client.temp_sub_merchant"></i></span>
<span class="badge" aria-hidden="true" title="show detail">{{client.client_count}}</span>
</a>
<a class="list-group-item col-sm-2 col-xs-6 cursor" ng-hide="isCollapsed"
ng-repeat="client in clients | orderBy:'client_count':true"
ng--click="showClient(client.sub_merchant_id);" ng-if="$index>59">
<span>
{{client.sub_merchant_id}}&nbsp;<i class="fa fa-clock-o text-danger"
title="Using temp Sub Merchant ID"
ng-if="client.temp_sub_merchant"></i></span>
<span class="badge" aria-hidden="true" title="show detail">{{client.client_count}}</span>
</a>
</div>
</div>
</div>
</uib-tab>
<uib-tab heading="近25天未交易商户号">
<div class="box-body">
<div class="col-sm-12 col-xs-12" style="padding-right: 30px;margin-bottom: 5px">
<div class="pull-right">
<span ng-if="refresh_time">
<span>上次刷新时间:</span><span><em><b>{{refresh_time}}</b></em></span>
</span>&nbsp;&nbsp;
<a role="button" class="btn btn-primary" title="refresh" ng-click="refresh()" ng-class="{disabled:disable_button}">
<i class="glyphicon glyphicon-refresh"
title="refresh"></i>
</a>
</div>
</div>
<div class="col-sm-12 col-xs-12">
<loadingbar ng-if="disable_button"></loadingbar>
<div>
<div class="list-group col-sm-12 col-xs-12"
ng-repeat="(key,clients) in notTradeClientsMap">
<a class="list-group-item active col-sm-12 col-xs-12">
{{key|choose_merchant_id}}
<span ng-show="clients.length>59" class="small-box-footer cursor pull-right" ng-click="isCollapsed = !isCollapsed">更多 <i class="fa fa-arrow-circle-right" ng-class="{'i-rotate_90':!isCollapsed}"></i></span>
</a>
<a class="list-group-item col-sm-2 col-xs-6 cursor"
ng-repeat="client in clients | orderBy:'client_count':true"
ng--click="showClient(client.sub_merchant_id)" ng-if="$index<60">
<span>{{client.sub_merchant_id}}&nbsp;<i class="fa fa-clock-o text-danger"
title="Temp Sub Merchant ID"
ng-if="client.temp_sub_merchant"></i></span>
<span class="badge" aria-hidden="true" title="show detail">{{client.client_count}}</span>
</a>
<a class="list-group-item col-sm-2 col-xs-6 cursor" ng-hide="isCollapsed"
ng-repeat="client in clients | orderBy:'client_count':true"
ng--click="showClient(client.sub_merchant_id)" ng-if="$index>59">
<span>{{client.sub_merchant_id}}&nbsp;<i class="fa fa-clock-o text-danger"
title="Temp Sub Merchant ID"
ng-if="client.temp_sub_merchant"></i></span>
<span class="badge" aria-hidden="true" title="show detail">{{client.client_count}}</span>
</a>
</div>
</div>
</div>
</div>
</uib-tab>
<uib-tab heading="通用子商户号">
<div class="box-body table-responsive">
<div class="col-sm-12 col-xs-6">
<a role="button" class="btn btn-primary pull-right" title="Add Sub Merchant Id" ng-click="save()">
<i class="fa fa-plus"></i>
Add
</a>
</div>
<table class="table table-striped">
<thead>
<tr>
<th>Merchant Id</th>
<th>Sub Merchant Id</th>
<th>Operator</th>
<th>Create Time</th>
<th>Operation</th>
</tr>
</thead>
<tbody>
<tr ng-repeat="client in subMerchantIdList">
<td ng-bind="client.merchant_id"></td>
<td>
{{client.sub_merchant_id}}
<i class="fa fa-clock-o text-danger"
title="Temp Sub Merchant ID"></i>
</td>
<td ng-bind="client.operator"></td>
<td ng-bind="client.create_time"></td>
<td>
<a class="text-bold text-danger" role="button" ng-click="disable(client.sub_merchant_id)">Disable</a>
</td>
</tr>
</tbody>
</table>
</div>
</uib-tab>
</uib-tabset>
</div>
</div>
</div>
</div>

@ -277,7 +277,7 @@
</tr>
</thead>
<tbody>
<tr ng-repeat="trade in tradeLogs" ng-class="{'tr_refund':trade.trans_type=='refund','tr_clearing':trade.trans_type=='clearing'}">
<tr ng-repeat="trade in tradeLogs" ng-class="{'tr_refund':trade.trans_type=='refund','tr_clearing':trade.trans_type=='clearing',warning:trade.clearing_status==2}">
<td ng-bind="trade.transaction_time||'NOT PROVIDED'"></td>
<td>
<img src="/static/images/wechatpay_sign.png"

Loading…
Cancel
Save