Merge branch 'develop'

master
eason 6 years ago
commit a586964fa5

@ -5,7 +5,7 @@
<parent> <parent>
<groupId>au.com.royalpay.payment</groupId> <groupId>au.com.royalpay.payment</groupId>
<artifactId>payment-parent</artifactId> <artifactId>payment-parent</artifactId>
<version>0.2.0</version> <version>0.2.0-dev</version>
</parent> </parent>
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
@ -156,6 +156,7 @@
<artifactId>gson</artifactId> <artifactId>gson</artifactId>
<version>2.2.4</version> <version>2.2.4</version>
</dependency> </dependency>
<!--jpush end --> <!--jpush end -->
<dependency> <dependency>
<groupId>junit</groupId> <groupId>junit</groupId>
@ -164,7 +165,11 @@
<scope>test</scope> <scope>test</scope>
</dependency> </dependency>
<dependency>
<groupId>com.taobao.api</groupId>
<artifactId>taobao-sdk-java-auto</artifactId>
<version>1502853394064-20180710</version>
</dependency>
</dependencies> </dependencies>
<build> <build>
<plugins> <plugins>

@ -660,3 +660,13 @@ CREATE TABLE `act_charity` (
`active_time` date DEFAULT NULL, `active_time` date DEFAULT NULL,
PRIMARY KEY (`client_moniker`) PRIMARY KEY (`client_moniker`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE `risk_attention_merchants` (
`client_id` int(11) NOT NULL,
`client_moniker` varchar(20) NOT NULL,
`is_valid` tinyint(1) NOT NULL DEFAULT 1,
`create_time` datetime NOT NULL,
`update_time` datetime DEFAULT NULL,
PRIMARY KEY (`client_id`),
KEY `client_moniker` (`client_moniker`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

@ -72,6 +72,6 @@ public class PaymentManageApplication {
@Bean @Bean
public MongoClientOptions mongoOptions() { public MongoClientOptions mongoOptions() {
return MongoClientOptions.builder().maxConnectionIdleTime(6000).build(); return MongoClientOptions.builder().maxConnectionIdleTime(6000).socketTimeout(3000).maxWaitTime(3000).serverSelectionTimeout(3000).build();
} }
} }

@ -149,4 +149,11 @@ public interface RetailAppService {
void applyToCompliance(JSONObject device); void applyToCompliance(JSONObject device);
JSONObject sendVerifyEmail(JSONObject device); JSONObject sendVerifyEmail(JSONObject device);
JSONObject openimCheck(JSONObject device);
void addUnreadMsg(JSONObject device,JSONObject param);
JSONObject getRefunds(JSONObject device, AppQueryBean appQueryBean);
} }

@ -30,6 +30,7 @@ import au.com.royalpay.payment.manage.merchants.entity.impls.SwitchPermissionMod
import au.com.royalpay.payment.manage.notice.beans.NoticeInfo; import au.com.royalpay.payment.manage.notice.beans.NoticeInfo;
import au.com.royalpay.payment.manage.notice.core.NoticeManage; import au.com.royalpay.payment.manage.notice.core.NoticeManage;
import au.com.royalpay.payment.manage.notice.core.NoticePartner; import au.com.royalpay.payment.manage.notice.core.NoticePartner;
import au.com.royalpay.payment.manage.openim.core.CustomerServiceService;
import au.com.royalpay.payment.manage.pushMessage.APNSMessageHelper; import au.com.royalpay.payment.manage.pushMessage.APNSMessageHelper;
import au.com.royalpay.payment.manage.pushMessage.bean.AppManagerMessageBuilder; import au.com.royalpay.payment.manage.pushMessage.bean.AppManagerMessageBuilder;
import au.com.royalpay.payment.manage.signin.beans.ChangePwdBean; import au.com.royalpay.payment.manage.signin.beans.ChangePwdBean;
@ -37,6 +38,7 @@ import au.com.royalpay.payment.manage.signin.core.SignInAccountService;
import au.com.royalpay.payment.manage.signin.core.impls.SignInAccountServiceImpl; import au.com.royalpay.payment.manage.signin.core.impls.SignInAccountServiceImpl;
import au.com.royalpay.payment.manage.tradelog.beans.TradeLogQuery; import au.com.royalpay.payment.manage.tradelog.beans.TradeLogQuery;
import au.com.royalpay.payment.manage.tradelog.core.TradeLogService; import au.com.royalpay.payment.manage.tradelog.core.TradeLogService;
import au.com.royalpay.payment.manage.tradelog.refund.RefundService;
import au.com.royalpay.payment.tools.cms.RoyalPayCMSSupport; import au.com.royalpay.payment.tools.cms.RoyalPayCMSSupport;
import au.com.royalpay.payment.tools.device.DeviceSupport; import au.com.royalpay.payment.tools.device.DeviceSupport;
import au.com.royalpay.payment.tools.device.message.AppMessage; import au.com.royalpay.payment.tools.device.message.AppMessage;
@ -163,9 +165,13 @@ public class RetailAppServiceImp implements RetailAppService {
@Resource @Resource
private ClientMapper clientMapper; private ClientMapper clientMapper;
@Resource @Resource
private RefundService refundService;
@Resource
private ClientModifySupport clientModifySupport; private ClientModifySupport clientModifySupport;
@Resource @Resource
private ClearingLogMapper clearingLogMapper; private ClearingLogMapper clearingLogMapper;
@Resource
private CustomerServiceService customerServiceService;
private Map<String, AppMsgSender> senderMap = new HashMap<>(); private Map<String, AppMsgSender> senderMap = new HashMap<>();
private final String fileName[] = { "client_bank_file", "client_id_file", "client_company_file" }; private final String fileName[] = { "client_bank_file", "client_id_file", "client_company_file" };
@ -410,6 +416,30 @@ public class RetailAppServiceImp implements RetailAppService {
return result; return result;
} }
@Override
public JSONObject openimCheck(JSONObject device) {
JSONObject account = clientAccountMapper.findById(device.getString("account_id"));
return customerServiceService.checkAndSavePartner(account);
}
//暂不使用
@Override
public void addUnreadMsg(JSONObject device, JSONObject param) {
customerServiceService.addUnreadMsg(param);
}
@Override
public JSONObject getRefunds(JSONObject device, AppQueryBean appQueryBean) {
JSONObject appParam = appQueryBean.toParams();
JSONObject param = new JSONObject();
if(appParam.get("client_ids")==null) {
param.put("client_id", device.getIntValue("client_id"));
}
param.put("start_time",appParam.getDate("begin"));
param.put("end_time",appParam.getDate("end"));
return refundService.listUnionAllApply(param, new PageBounds(appQueryBean.getPage(), appQueryBean.getLimit()));
}
@Override @Override
public void updateClient(JSONObject device, AppClientBean appClientBean) { public void updateClient(JSONObject device, AppClientBean appClientBean) {
String clientType = device.getString("client_type"); String clientType = device.getString("client_type");

@ -1,34 +1,5 @@
package au.com.royalpay.payment.manage.appclient.web; package au.com.royalpay.payment.manage.appclient.web;
import static au.com.royalpay.payment.tools.CommonConsts.RETAIL_DEVICE;
import java.math.BigDecimal;
import java.text.ParseException;
import java.util.Date;
import java.util.List;
import java.util.Map;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid;
import org.apache.commons.lang3.time.DateUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.validation.Errors;
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.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.servlet.ModelAndView;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import au.com.royalpay.payment.core.exceptions.ParamInvalidException; import au.com.royalpay.payment.core.exceptions.ParamInvalidException;
import au.com.royalpay.payment.manage.activities.app_index.core.AppActService; import au.com.royalpay.payment.manage.activities.app_index.core.AppActService;
import au.com.royalpay.payment.manage.activities.monsettledelay.core.ActMonDelaySettleService; import au.com.royalpay.payment.manage.activities.monsettledelay.core.ActMonDelaySettleService;
@ -55,6 +26,35 @@ import au.com.royalpay.payment.tools.http.HttpUtils;
import au.com.royalpay.payment.tools.merchants.beans.QRCodeConfig; import au.com.royalpay.payment.tools.merchants.beans.QRCodeConfig;
import au.com.royalpay.payment.tools.merchants.beans.UpdateSurchargeDTO; import au.com.royalpay.payment.tools.merchants.beans.UpdateSurchargeDTO;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import org.apache.commons.lang3.time.DateUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.validation.Errors;
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.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.servlet.ModelAndView;
import java.math.BigDecimal;
import java.text.ParseException;
import java.util.Date;
import java.util.List;
import java.util.Map;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid;
import static au.com.royalpay.payment.tools.CommonConsts.RETAIL_DEVICE;
/** /**
* Created by yishuqian on 28/03/2017. * Created by yishuqian on 28/03/2017.
*/ */
@ -109,6 +109,10 @@ public class RetailAppController {
public JSONObject getTradeCommonData(@ModelAttribute(CommonConsts.RETAIL_DEVICE) JSONObject device, AppQueryBean appQueryBean) { public JSONObject getTradeCommonData(@ModelAttribute(CommonConsts.RETAIL_DEVICE) JSONObject device, AppQueryBean appQueryBean) {
return retailAppService.getTradeCommonDate(device, appQueryBean); return retailAppService.getTradeCommonDate(device, appQueryBean);
} }
@RequestMapping(value = "/trade/refund", method = RequestMethod.GET)
public JSONObject getRefunds(@ModelAttribute(CommonConsts.RETAIL_DEVICE) JSONObject device, AppQueryBean appQueryBean) {
return retailAppService.getRefunds(device, appQueryBean);
}
@RequestMapping(value = "/trade_common_new", method = RequestMethod.GET) @RequestMapping(value = "/trade_common_new", method = RequestMethod.GET)
public JSONObject getTradeCommonDataNew(@ModelAttribute(CommonConsts.RETAIL_DEVICE) JSONObject device, AppQueryBean appQueryBean) { public JSONObject getTradeCommonDataNew(@ModelAttribute(CommonConsts.RETAIL_DEVICE) JSONObject device, AppQueryBean appQueryBean) {
@ -540,4 +544,14 @@ public class RetailAppController {
return attachmentClient.uploadFile(file,false); return attachmentClient.uploadFile(file,false);
} }
@RequestMapping(value = "/openim/check",method = RequestMethod.POST)
public JSONObject openimCheck(@ModelAttribute(RETAIL_DEVICE) JSONObject device) {
return retailAppService.openimCheck(device);
}
@RequestMapping(value = "/openim/chat",method = RequestMethod.POST)
public void openimChat(@ModelAttribute(RETAIL_DEVICE) JSONObject device,@RequestBody JSONObject param) {
retailAppService.addUnreadMsg(device,param);
}
} }

@ -0,0 +1,8 @@
package au.com.royalpay.payment.manage.custom.core;
/**
* @author kira
* @date 2018/7/27
*/
public interface CustomService {
}

@ -0,0 +1,10 @@
package au.com.royalpay.payment.manage.custom.core.impl;
import au.com.royalpay.payment.manage.custom.core.CustomService;
/**
* @author kira
* @date 2018/7/27
*/
public class CustomServiceImpl implements CustomService {
}

@ -0,0 +1,5 @@
/**
* @author kira
* @date 2018/7/27
*/
package au.com.royalpay.payment.manage.custom;

@ -4,6 +4,7 @@ import cn.yixblog.support.mybatis.autosql.annotations.AutoMapper;
import cn.yixblog.support.mybatis.autosql.annotations.AutoSql; import cn.yixblog.support.mybatis.autosql.annotations.AutoSql;
import cn.yixblog.support.mybatis.autosql.annotations.SqlType; import cn.yixblog.support.mybatis.autosql.annotations.SqlType;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import com.github.miemiedev.mybatis.paginator.domain.PageBounds;
import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Param;
import java.util.List; import java.util.List;
@ -15,5 +16,5 @@ public interface LogClientSubMerchantIdMapper {
void save(JSONObject log); void save(JSONObject log);
@AutoSql(type = SqlType.SELECT) @AutoSql(type = SqlType.SELECT)
List<JSONObject> listLogsByClientId(@Param("client_id") int client_id); List<JSONObject> listLogsByClientId(@Param("client_id") int client_id, PageBounds pageBounds);
} }

@ -1,16 +1,19 @@
package au.com.royalpay.payment.manage.mappers.payment; package au.com.royalpay.payment.manage.mappers.payment;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
import org.apache.ibatis.annotations.Param;
import com.alibaba.fastjson.JSONObject;
import com.github.miemiedev.mybatis.paginator.domain.PageBounds;
import com.github.miemiedev.mybatis.paginator.domain.PageList;
import cn.yixblog.support.mybatis.autosql.annotations.AdvanceSelect; import cn.yixblog.support.mybatis.autosql.annotations.AdvanceSelect;
import cn.yixblog.support.mybatis.autosql.annotations.AutoMapper; import cn.yixblog.support.mybatis.autosql.annotations.AutoMapper;
import cn.yixblog.support.mybatis.autosql.annotations.AutoSql; import cn.yixblog.support.mybatis.autosql.annotations.AutoSql;
import cn.yixblog.support.mybatis.autosql.annotations.SqlType; 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.math.BigDecimal;
import java.util.Date;
import java.util.List;
/** /**
* Created by yixian on 2016-06-25. * Created by yixian on 2016-06-25.
@ -55,4 +58,7 @@ public interface RefundMapper {
List<JSONObject> listRefundDate(@Param("begin") Date begin, @Param("end") Date end); List<JSONObject> listRefundDate(@Param("begin") Date begin, @Param("end") Date end);
List<JSONObject> listClientRefund(JSONObject param); List<JSONObject> listClientRefund(JSONObject param);
PageList<JSONObject> listUnionAllApply(JSONObject params, PageBounds pagination);
} }

@ -0,0 +1,31 @@
package au.com.royalpay.payment.manage.mappers.risk;
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_attention_merchants", pkName = "client_id")
public interface RiskAttentionMerchantsAMapper {
@AutoSql(type = SqlType.UPDATE)
void update(JSONObject client);
@AutoSql(type = SqlType.INSERT)
void save(JSONObject client);
@AutoSql(type = SqlType.SELECT)
JSONObject findById(@Param("id") String id);
@AutoSql(type = SqlType.SELECT)
JSONObject findByClientMoniker(@Param("client_moniker") String client_moniker);
@AutoSql(type = SqlType.SELECT)
PageList<JSONObject> query(JSONObject params, PageBounds pagination);
}

@ -75,4 +75,5 @@ public interface ClientAccountMapper {
@AdvanceSelect(addonWhereClause = "is_valid=1 and role=1 and wechat_openid is not null and wx_unionid is null", excludeColumns = {"salt", "password_hash"}) @AdvanceSelect(addonWhereClause = "is_valid=1 and role=1 and wechat_openid is not null and wx_unionid is null", excludeColumns = {"salt", "password_hash"})
List<JSONObject> listNullUnionIdAccounts(); List<JSONObject> listNullUnionIdAccounts();
List<JSONObject> query(JSONObject params);
} }

@ -6,6 +6,7 @@ import cn.yixblog.support.mybatis.autosql.annotations.AutoSql;
import cn.yixblog.support.mybatis.autosql.annotations.SqlType; import cn.yixblog.support.mybatis.autosql.annotations.SqlType;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import com.github.miemiedev.mybatis.paginator.domain.PageBounds; import com.github.miemiedev.mybatis.paginator.domain.PageBounds;
import com.github.miemiedev.mybatis.paginator.domain.PageList;
import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Param;
import java.util.List; import java.util.List;
@ -32,7 +33,7 @@ public interface ManagerMapper {
@AutoSql(type = SqlType.UPDATE) @AutoSql(type = SqlType.UPDATE)
void update(JSONObject account); void update(JSONObject account);
List<JSONObject> listAvailable(JSONObject params, PageBounds pageBounds); PageList<JSONObject> listAvailable(JSONObject params, PageBounds pageBounds);
@AutoSql(type = SqlType.INSERT) @AutoSql(type = SqlType.INSERT)
void save(JSONObject manager); void save(JSONObject manager);
@ -59,4 +60,6 @@ public interface ManagerMapper {
List<JSONObject> findByIds(List<Integer> ids); List<JSONObject> findByIds(List<Integer> ids);
List<JSONObject> listOpenIdByRole(@Param("mask") int mask); List<JSONObject> listOpenIdByRole(@Param("mask") int mask);
List<JSONObject> listServants(@Param("mask") int mask);
} }

@ -0,0 +1,37 @@
package au.com.royalpay.payment.manage.mappers.system;
import java.util.List;
import org.apache.ibatis.annotations.Param;
import com.alibaba.fastjson.JSONObject;
import cn.yixblog.support.mybatis.autosql.annotations.AutoMapper;
import cn.yixblog.support.mybatis.autosql.annotations.AutoSql;
import cn.yixblog.support.mybatis.autosql.annotations.SqlType;
/**
* Created by yixian on 2016-06-29.
*/
@AutoMapper(tablename = "sys_customer_service", pkName = "manager_id")
public interface SysCustomerServiceMapper {
List<JSONObject> findOnline();
@AutoSql(type = SqlType.SELECT)
JSONObject findByManagerId(@Param("manager_id")String manager_id);
@AutoSql(type = SqlType.INSERT)
void save(JSONObject record);
@AutoSql(type = SqlType.UPDATE)
void update(JSONObject record);
void onoff(@Param("managerId") String managerId, @Param("status") int status);
@AutoSql(type = SqlType.SELECT)
List<JSONObject> findAllWithDetail();
@AutoSql(type = SqlType.COUNT)
int countAll();
}

@ -333,7 +333,7 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid
int role = manager != null ? manager.getIntValue("role") : 0; int role = manager != null ? manager.getIntValue("role") : 0;
if (manager != null) { if (manager != null) {
if (ManagerRole.OPERATOR.hasRole(role)) { if (ManagerRole.OPERATOR.hasRole(role)) {
List<JSONObject> log = logClientSubMerchantIdMapper.listLogsByClientId(client.getInteger("client_id")); List<JSONObject> log = logClientSubMerchantIdMapper.listLogsByClientId(client.getInteger("client_id"),new PageBounds(Order.formString("create_time.desc")));
client.put("sub_merchant_id_log", log.size() > 0 ? true : false); client.put("sub_merchant_id_log", log.size() > 0 ? true : false);
} }
if (ManagerRole.BD_USER.hasRole(role)) { if (ManagerRole.BD_USER.hasRole(role)) {
@ -3579,7 +3579,7 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid
throw new InvalidShortIdException(); throw new InvalidShortIdException();
} }
checkOrgPermission(manager, client); checkOrgPermission(manager, client);
return logClientSubMerchantIdMapper.listLogsByClientId(client.getInteger("client_id")); return logClientSubMerchantIdMapper.listLogsByClientId(client.getInteger("client_id"),new PageBounds(Order.formString("create_time.desc")));
} }
@Override @Override

@ -35,7 +35,6 @@ public abstract class ClientConfigModify {
protected abstract JSONObject getModifyResult(); protected abstract JSONObject getModifyResult();
@Transactional
public int doModify(MerchantInfoProvider merchantInfoProvider, ClientConfigMapper clientConfigMapper, ClientMapper clientMapper, MongoTemplate mongoTemplate) { public int doModify(MerchantInfoProvider merchantInfoProvider, ClientConfigMapper clientConfigMapper, ClientMapper clientMapper, MongoTemplate mongoTemplate) {
JSONObject client = merchantInfoProvider.getClientInfoByMoniker(clientMoniker); JSONObject client = merchantInfoProvider.getClientInfoByMoniker(clientMoniker);
JSONObject modifyResult = getModifyResult(); JSONObject modifyResult = getModifyResult();

@ -536,7 +536,7 @@ public class PartnerManageController {
clientManager.removeSub(clientMoniker,manager); clientManager.removeSub(clientMoniker,manager);
} }
@ManagerMapping(value = "/{clientMoniker}/hf", method = RequestMethod.PUT, role = {ManagerRole.SERVANT, ManagerRole.DEVELOPER}) @ManagerMapping(value = "/{clientMoniker}/hf", method = RequestMethod.PUT, role = {ManagerRole.ADMIN, ManagerRole.OPERATOR})
public void switchHfPermission(@PathVariable String clientMoniker, @RequestBody JSONObject pass, @ModelAttribute(CommonConsts.MANAGER_STATUS) JSONObject manager) { public void switchHfPermission(@PathVariable String clientMoniker, @RequestBody JSONObject pass, @ModelAttribute(CommonConsts.MANAGER_STATUS) JSONObject manager) {
clientManager.switchHfLink(manager, clientMoniker, pass.getBooleanValue("allow")); clientManager.switchHfLink(manager, clientMoniker, pass.getBooleanValue("allow"));
} }

@ -0,0 +1,73 @@
package au.com.royalpay.payment.manage.openim;
import au.com.royalpay.payment.manage.openim.core.CustomerServiceService;
import au.com.royalpay.payment.manage.permission.manager.ManagerMapping;
import au.com.royalpay.payment.manage.permission.manager.RequireManager;
import au.com.royalpay.payment.manage.signin.beans.LoginInfo;
import au.com.royalpay.payment.manage.signin.core.SignInStatusManager;
import au.com.royalpay.payment.tools.CommonConsts;
import au.com.royalpay.payment.tools.http.HttpUtils;
import au.com.royalpay.payment.tools.permission.enums.ManagerRole;
import com.alibaba.fastjson.JSONObject;
import org.springframework.validation.Errors;
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.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid;
/**
* @author kira
* @date 2018/7/11
*/
@RestController
@RequestMapping("/sys/openim")
public class OpenimController {
@Resource
private SignInStatusManager signInStatusManager;
@Resource
private CustomerServiceService customerServiceService;
@RequestMapping(value = "/check", method = RequestMethod.PUT)
@RequireManager
public JSONObject sendMsg(@ModelAttribute(CommonConsts.MANAGER_STATUS) JSONObject manager) {
return customerServiceService.checkAndSaveManager(manager);
}
@RequestMapping(value = "/signin", method = RequestMethod.POST)
public void partnerSignIn(@RequestBody @Valid LoginInfo loginInfo, Errors errors, HttpServletResponse response) throws Exception {
HttpUtils.handleValidErrors(errors);
HttpUtils.setCookie(response, CommonConsts.MANAGER_STATUS,signInStatusManager.managerSignIn(loginInfo));
}
@RequestMapping(value = "/list",method = RequestMethod.GET)
public List<JSONObject> query(@RequestParam(required = false) String clientMoniker,@RequestParam(required = false) String userNames){
JSONObject params = new JSONObject();
params.put("clientMoniker",clientMoniker);
params.put("userNames",userNames);
return customerServiceService.query(clientMoniker,userNames);
}
@ManagerMapping(value = "/servant/{manager_id}/onoff", method = RequestMethod.PUT,role = {ManagerRole.ADMIN})
public void onoff(@ModelAttribute(CommonConsts.MANAGER_STATUS) JSONObject loginManager,@PathVariable String manager_id, @RequestBody JSONObject param) {
param.put("manager_id",manager_id);
customerServiceService.onoff(param);
}
@ManagerMapping(value = "/servant/{manager_id}/nick", method = RequestMethod.PUT,role = {ManagerRole.ADMIN})
public void changeNick(@ModelAttribute(CommonConsts.MANAGER_STATUS) JSONObject loginManager,@PathVariable String manager_id, @RequestBody JSONObject param) {
param.put("manager_id",manager_id);
customerServiceService.changeNick(param);
}
}

@ -0,0 +1,170 @@
package au.com.royalpay.payment.manage.openim.beans;
/**
* @author kira
* @date 2018/7/11
*/
public class OpenimUser {
private String nick;
private String icon_url;
private String email;
private String mobile;
private String taobaoid;
private String userid;
private String passowrd;
private String remark;
private String extra;
private String career;
private String vip;
private String address;
private String name;
private Integer age;
private String gender;
private String wechat;
private String qq;
private String weibo;
public String getNick() {
return nick;
}
public void setNick(String nick) {
this.nick = nick;
}
public String getIcon_url() {
return icon_url;
}
public void setIcon_url(String icon_url) {
this.icon_url = icon_url;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getMobile() {
return mobile;
}
public void setMobile(String mobile) {
this.mobile = mobile;
}
public String getTaobaoid() {
return taobaoid;
}
public void setTaobaoid(String taobaoid) {
this.taobaoid = taobaoid;
}
public String getUserid() {
return userid;
}
public void setUserid(String userid) {
this.userid = userid;
}
public String getPassowrd() {
return passowrd;
}
public void setPassowrd(String passowrd) {
this.passowrd = passowrd;
}
public String getRemark() {
return remark;
}
public void setRemark(String remark) {
this.remark = remark;
}
public String getExtra() {
return extra;
}
public void setExtra(String extra) {
this.extra = extra;
}
public String getCareer() {
return career;
}
public void setCareer(String career) {
this.career = career;
}
public String getVip() {
return vip;
}
public void setVip(String vip) {
this.vip = vip;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public String getWechat() {
return wechat;
}
public void setWechat(String wechat) {
this.wechat = wechat;
}
public String getQq() {
return qq;
}
public void setQq(String qq) {
this.qq = qq;
}
public String getWeibo() {
return weibo;
}
public void setWeibo(String weibo) {
this.weibo = weibo;
}
}

@ -0,0 +1,26 @@
package au.com.royalpay.payment.manage.openim.beans;
/**
* @author kira
* @date 2018/7/17
*/
public class OpenimUserVO {
private String nick;
private String userid;
public String getNick() {
return nick;
}
public void setNick(String nick) {
this.nick = nick;
}
public String getUserid() {
return userid;
}
public void setUserid(String userid) {
this.userid = userid;
}
}

@ -0,0 +1,48 @@
package au.com.royalpay.payment.manage.openim.beans;
import java.util.List;
/**
* @author kira
* @date 2018/7/11
*/
public class PushMsgBean {
private String from_user;
private List<String> to_users;
private String summary;
private String data;
public String getFrom_user() {
return from_user;
}
public void setFrom_user(String from_user) {
this.from_user = from_user;
}
public List<String> getTo_users() {
return to_users;
}
public void setTo_users(List<String> to_users) {
this.to_users = to_users;
}
public String getSummary() {
return summary;
}
public void setSummary(String summary) {
this.summary = summary;
}
public String getData() {
return data;
}
public void setData(String data) {
this.data = data;
}
}

@ -0,0 +1,32 @@
package au.com.royalpay.payment.manage.openim.core;
import au.com.royalpay.payment.manage.openim.beans.OpenimUserVO;
import com.alibaba.fastjson.JSONObject;
import java.util.List;
/**
* @author kira
* @date 2018/7/11
*/
public interface CustomerServiceService {
JSONObject checkAndSavePartner(JSONObject account);
JSONObject checkAndSaveManager(JSONObject manager);
OpenimUserVO findOne(int clientId,String userName);
List<JSONObject> query(String clientMoniker,String userNames);
void onoff(JSONObject param);
void changeNick(JSONObject param);
void addUnreadMsg(JSONObject params);
void sendUnreadWxMsg();
}

@ -0,0 +1,20 @@
package au.com.royalpay.payment.manage.openim.core;
import com.alibaba.fastjson.JSONObject;
/**
* @author kira
* @date 2018/7/11
*/
public interface OpenimApi {
void addUser(JSONObject record);
void updateUser(JSONObject record);
void pushMsh();
JSONObject getUserInfo(String userId);
}

@ -0,0 +1,135 @@
package au.com.royalpay.payment.manage.openim.core;
import au.com.royalpay.payment.tools.exceptions.ServerErrorException;
import com.alibaba.fastjson.JSONObject;
import com.taobao.api.ApiException;
import com.taobao.api.DefaultTaobaoClient;
import com.taobao.api.TaobaoClient;
import com.taobao.api.domain.Userinfos;
import com.taobao.api.request.OpenimCustmsgPushRequest;
import com.taobao.api.request.OpenimUsersAddRequest;
import com.taobao.api.request.OpenimUsersGetRequest;
import com.taobao.api.request.OpenimUsersUpdateRequest;
import com.taobao.api.response.OpenimCustmsgPushResponse;
import com.taobao.api.response.OpenimUsersAddResponse;
import com.taobao.api.response.OpenimUsersGetResponse;
import com.taobao.api.response.OpenimUsersUpdateResponse;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* @author kira
* @date 2018/7/11
*/
@Service
public class OpenimClient {
Logger logger = LoggerFactory.getLogger(getClass());
@Value("${im.openim.appkey}")
private String appkey;
@Value("${im.openim.secret}")
private String secret;
private final String url = "https://eco.taobao.com/router/rest";
public JSONObject getUser(String userId) {
TaobaoClient client = new DefaultTaobaoClient(url, appkey, secret);
OpenimUsersGetRequest req = new OpenimUsersGetRequest();
// 批量为userid逗号分隔字符串
req.setUserids(userId);
OpenimUsersGetResponse rsp = null;
try {
rsp = client.execute(req);
} catch (ApiException e) {
logger.info("openim get user fail", e);
}
JSONObject openInfo = JSONObject.parseObject(rsp.getBody());
if (openInfo.getJSONObject("openim_users_get_response").getJSONObject("userinfos").size() < 1) {
return null;
}
return openInfo;
}
public void addUser(List<Userinfos> users) {
TaobaoClient client = new DefaultTaobaoClient(url, appkey, secret);
OpenimUsersAddRequest req = new OpenimUsersAddRequest();
req.setUserinfos(users);
OpenimUsersAddResponse rsp = null;
try {
rsp = client.execute(req);
} catch (ApiException e) {
logger.info("openim add user fail", e);
}
JSONObject result = JSONObject.parseObject(rsp.getBody());
JSONObject failMsg = result.getJSONObject("openim_users_add_response").getJSONObject("fail_msg");
if (failMsg.size() > 0) {
if ("data exist".equals(failMsg.getJSONArray("string").get(0))) {
return;
}
logger.info("openim add user fail reason:" + failMsg.getJSONArray("string").toJSONString());
throw new ServerErrorException("System error");
}
}
public void updateUser(List<Userinfos> users) {
TaobaoClient client = new DefaultTaobaoClient(url, appkey, secret);
OpenimUsersUpdateRequest req = new OpenimUsersUpdateRequest();
req.setUserinfos(users);
OpenimUsersUpdateResponse rsp = null;
try {
rsp = client.execute(req);
} catch (ApiException e) {
logger.info("openim update user fail", e);
}
JSONObject result = JSONObject.parseObject(rsp.getBody());
if (result.getJSONObject("openim_users_update_response").getJSONObject("fail_msg").size() > 0) {
logger.info("openim update user fail reason:"
+ result.getJSONObject("openim_users_update_response").getJSONObject("fail_msg").getJSONArray("string").toJSONString());
throw new ServerErrorException("System error");
}
}
public void pushMsg(OpenimCustmsgPushRequest.CustMsg msg) {
TaobaoClient client = new DefaultTaobaoClient(url, appkey, secret);
OpenimCustmsgPushRequest req = new OpenimCustmsgPushRequest();
req.setCustmsg(msg);
OpenimCustmsgPushResponse rsp = null;
try {
rsp = client.execute(req);
} catch (ApiException e) {
logger.info("openim push msg fail", e);
}
JSONObject result = JSONObject.parseObject(rsp.getBody());
if (result.getJSONObject("openim_custmsg_push_response").getJSONObject("fail_msg").size() > 0) {
logger.info("openim push message fail reason:"
+ result.getJSONObject("openim_custmsg_push_response").getJSONObject("fail_msg").getJSONArray("string").toJSONString());
throw new ServerErrorException("System error");
}
}
public static void main(String[] args) {
String appkey = "24980715";
String secret = "60b1ba680a6f27ffc701f10b6d5be00e";
String url = "https://eco.taobao.com/router/rest";
TaobaoClient client = new DefaultTaobaoClient(url, appkey, secret);
OpenimUsersGetRequest req = new OpenimUsersGetRequest();
// 批量为userid逗号分隔字符串
req.setUserids("kiraservant");
OpenimUsersGetResponse rsp = null;
try {
rsp = client.execute(req);
} catch (ApiException e) {
}
JSONObject openInfo = JSONObject.parseObject(rsp.getBody());
System.out.println(openInfo.toJSONString());
System.out.println(openInfo.toJSONString());
System.out.println(openInfo.toJSONString());
}
}

@ -0,0 +1,240 @@
package au.com.royalpay.payment.manage.openim.core.impl;
import au.com.royalpay.payment.manage.mappers.system.ClientAccountMapper;
import au.com.royalpay.payment.manage.mappers.system.ManagerMapper;
import au.com.royalpay.payment.manage.mappers.system.SysCustomerServiceMapper;
import au.com.royalpay.payment.manage.merchants.core.ClientManager;
import au.com.royalpay.payment.manage.openim.beans.OpenimUserVO;
import au.com.royalpay.payment.manage.openim.core.CustomerServiceService;
import au.com.royalpay.payment.manage.openim.core.OpenimApi;
import au.com.royalpay.payment.tools.connections.mpsupport.MpWechatApi;
import au.com.royalpay.payment.tools.connections.mpsupport.MpWechatApiProvider;
import au.com.royalpay.payment.tools.connections.mpsupport.beans.TemplateMessage;
import au.com.royalpay.payment.tools.exceptions.BadRequestException;
import au.com.royalpay.payment.tools.exceptions.ForbiddenException;
import au.com.royalpay.payment.tools.exceptions.ServerErrorException;
import com.alibaba.fastjson.JSONObject;
import org.apache.commons.codec.digest.DigestUtils;
import org.apache.commons.lang3.RandomStringUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.time.DateFormatUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.data.redis.core.BoundListOperations;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Date;
import java.util.List;
import javax.annotation.Resource;
/**
* @author kira
* @date 2018/7/11
*/
@Service
public class CustomerServiceServiceImpl implements CustomerServiceService {
@Resource
private OpenimApi openimApi;
@Resource
private ClientManager clientManager;
@Resource
private ClientAccountMapper clientAccountMapper;
@Resource
private ManagerMapper managerMapper;
@Resource
private SysCustomerServiceMapper sysCustomerServiceMapper;
@Resource
private MpWechatApiProvider mpWechatApiProvider;
@Resource
private StringRedisTemplate stringRedisTemplate;
private final String REDIS_UNREADMSG_PREFIX = "REDIS_UNREADMSG_PREFIX";
@Value("${im.openim.appkey}")
private String appkey;
@Override
public JSONObject checkAndSavePartner(JSONObject account) {
JSONObject client = clientManager.getClientInfo(account.getIntValue("client_id"));
if (client == null) {
throw new BadRequestException("Merchant Not Found");
}
JSONObject userInfo = clientAccountMapper.findById(account.getString("account_id"));
JSONObject checkRecord = new JSONObject();
checkRecord.put("nick", userInfo.getString("username") + "_" + client.getString("client_moniker"));
checkRecord.put("user_id", userInfo.getString("username") + "_" + client.getString("client_moniker"));
checkRecord.put("password", DigestUtils.md5Hex("uid"));
checkRecord.put("icon_url",client.getString("logo_thumbnail"));
openimApi.addUser(checkRecord);
checkRecord.put("servants", sysCustomerServiceMapper.findOnline());
checkRecord.put("appkey", appkey);
return checkRecord;
}
@Override
public JSONObject checkAndSaveManager(JSONObject manager) {
if (StringUtils.isEmpty(manager.getString("manager_id"))) {
throw new ServerErrorException("manager id is null");
}
JSONObject result = sysCustomerServiceMapper.findByManagerId(manager.getString("manager_id"));
if (result == null) {
JSONObject managerDetail = managerMapper.findDetail(manager.getString("manager_id"));
JSONObject checkRecord = new JSONObject();
checkRecord.put("user_id", managerDetail.getString("username"));
int num = sysCustomerServiceMapper.countAll();
checkRecord.put("nick", "客服" + num);
checkRecord.put("icon_url","https://file.royalpay.com.au/open/2017/10/17/1508233432777_7X9kTmbsHUDv0iFD1zmYrDzNkrsBBk.jpg");
checkRecord.put("password", RandomStringUtils.random(12, true, true).toLowerCase());
openimApi.addUser(checkRecord);
result = checkRecord;
}
result.put("appkey", appkey);
result.remove("manager_id");
result.remove("onoff");
return result;
}
@Override
public OpenimUserVO findOne(int clientId, String userName) {
JSONObject client = clientManager.getClientInfo(clientId);
if (client == null) {
throw new BadRequestException("Merchant Not Found");
}
JSONObject account = clientAccountMapper.findByUsername(userName);
if (account == null) {
throw new BadRequestException("Account Not Found");
}
if (account.getIntValue("client_id") != clientId) {
throw new ForbiddenException("No Rights");
}
OpenimUserVO result = new OpenimUserVO();
result.setNick(account.getString("display_name"));
result.setUserid(account.getString("username") + "_" + client.getString("client_moniker"));
return result;
}
@Override
public List<JSONObject> query(String clientMoniker, String userNames) {
JSONObject queryParams = new JSONObject();
if (StringUtils.isNotEmpty(clientMoniker)) {
JSONObject client = clientManager.getClientInfoByMoniker(clientMoniker);
if (client == null) {
return Collections.EMPTY_LIST;
}
queryParams.put("clientId", client.getIntValue("client_id"));
}
if (StringUtils.isNotEmpty(userNames)) {
List<String> userNams = Arrays.asList(userNames.split(","));
if (CollectionUtils.isEmpty(userNams)) {
return Collections.EMPTY_LIST;
}
queryParams.put("userNames", userNams);
}
if (queryParams.size() < 1) {
return Collections.emptyList();
}
List<JSONObject> accounts = clientAccountMapper.query(queryParams);
List<JSONObject> result = new ArrayList<>(accounts.size());
accounts.forEach(p -> {
JSONObject openimUser = new JSONObject();
openimUser.put("userid", p.getString("username") + "_" + p.getString("client_moniker"));
openimUser.put("nick", p.getString("username") + "_" + p.getString("client_moniker"));
openimUser.put("headimg", p.getString("wechat_headimg"));
result.add(openimUser);
});
return result;
}
@Override
public void onoff(JSONObject manager) {
saveOrUpdate(manager,false);
}
@Override
public void changeNick(JSONObject param) {
saveOrUpdate(param,true);
}
@Override
public void addUnreadMsg(JSONObject params) {
String uid = params.getString("uid");
String tuid = params.getString("tuid");
if (StringUtils.isEmpty(uid) || StringUtils.isEmpty(tuid)) {
return;
}
BoundListOperations<String, String> ops = stringRedisTemplate.boundListOps(REDIS_UNREADMSG_PREFIX + tuid);
for (int i = 0; i < ops.size(); i++) {
String jStr = ops.index(i);
if (jStr.contains(uid)) {
JSONObject record = JSONObject.parseObject(jStr);
record.put("unreadMsg", record.getIntValue("unreadMsg") + 1);
ops.set(i, record.toJSONString());
return;
}
}
params.put("unreadMsg", 1);
ops.rightPush(params.toJSONString());
}
@Override
public void sendUnreadWxMsg() {
List<JSONObject> servants = sysCustomerServiceMapper.findAllWithDetail();
MpWechatApi paymentApi = mpWechatApiProvider.getNewPaymentApi();
servants.parallelStream().forEach(p -> {
p.getString("user_id");
BoundListOperations<String, String> ops = stringRedisTemplate.boundListOps(REDIS_UNREADMSG_PREFIX + p.getString("user_id"));
if (ops.size() < 1) {
return;
}
int clients = 0;
int unreadMsg = 0;
for (int i = 0; i < ops.size(); i++) {
clients++;
unreadMsg += JSONObject.parseObject(ops.index(i)).getIntValue("unreadMsg");
}
TemplateMessage msg = initUnreadMsg(unreadMsg, clients, p.getString("wx_openid"), paymentApi.getTemplateId("commission"));
paymentApi.sendTemplateMessage(msg);
stringRedisTemplate.delete(REDIS_UNREADMSG_PREFIX + p.getString("user_id"));
});
}
private TemplateMessage initUnreadMsg(int unreadMsg, int clients, String openId, String templateId) {
TemplateMessage msg = new TemplateMessage(openId, templateId, null);
msg.put("first", "你好,你有" + unreadMsg + "个未读消息", "#000000");
msg.put("keyword1", "商户", "#000000");
msg.put("keyword2", "问题咨询", "#000000");
msg.put("keyword3", DateFormatUtils.format(new Date(), "yyyy-MM-dd HH:mm:ss"), "#000000");
msg.put("keyword4", "你有" + clients + "个商户咨询待处理", "#0000ff");
msg.put("remark", "", "#000000");
return msg;
}
private void saveOrUpdate(JSONObject servant, boolean updateOpenim) {
if (StringUtils.isEmpty(servant.getString("manager_id"))) {
throw new ServerErrorException("manager id is null");
}
JSONObject existCS = sysCustomerServiceMapper.findByManagerId(servant.getString("manager_id"));
if (existCS == null) {
JSONObject userInfo = checkAndSaveManager(servant);
servant.put("password", userInfo.getString("password"));
servant.put("nick", userInfo.getString("nick"));
servant.put("user_id", userInfo.getString("user_id"));
sysCustomerServiceMapper.save(servant);
} else {
sysCustomerServiceMapper.update(servant);
if (updateOpenim) {
servant.put("user_id", existCS.getString("user_id"));
openimApi.updateUser(servant);
}
}
}
}

@ -0,0 +1,64 @@
package au.com.royalpay.payment.manage.openim.core.impl;
import au.com.royalpay.payment.manage.openim.core.OpenimApi;
import au.com.royalpay.payment.manage.openim.core.OpenimClient;
import com.alibaba.fastjson.JSONObject;
import com.taobao.api.domain.Userinfos;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.List;
import javax.annotation.Resource;
/**
* @author kira
* @date 2018/7/11
*/
@Service
public class OpenimApiImpl implements OpenimApi {
@Resource
private OpenimClient openimClient;
@Override
public void addUser(JSONObject user) {
JSONObject opemInfo = openimClient.getUser(user.getString("user_id"));
if(opemInfo!=null){
return;
}
List<Userinfos> saveList = new ArrayList<>();
Userinfos record = new Userinfos();
record.setUserid(user.getString("user_id"));
record.setNick(user.getString("nick"));
record.setPassword(user.getString("password"));
if(StringUtils.isNotEmpty(user.getString("icon_url"))){
record.setIconUrl(user.getString("icon_url"));
}
saveList.add(record);
openimClient.addUser(saveList);
}
@Override
public void updateUser(JSONObject user) {
List<Userinfos> updateList = new ArrayList<>();
Userinfos record = new Userinfos();
record.setUserid(user.getString("user_id"));
record.setNick(user.getString("nick"));
updateList.add(record);
openimClient.updateUser(updateList);
}
@Override
public void pushMsh() {
}
@Override
public JSONObject getUserInfo(String userId) {
return openimClient.getUser(userId);
}
}

@ -0,0 +1,49 @@
package au.com.royalpay.payment.manage.risk.bean;
import com.alibaba.fastjson.JSONObject;
import org.apache.commons.lang3.StringUtils;
/**
* Created by yuan on 2018/7/13.
*/
public class QueryAttentionMerchants {
private String client_moniker;
private int page = 1;
private int limit = 10;
public JSONObject toParams() {
JSONObject params = new JSONObject();
if(StringUtils.isNotEmpty(client_moniker)){
params.put("client_moniker", this.client_moniker);
}
params.put("is_valid", 1);
return params;
}
public String getClient_moniker() {
return client_moniker;
}
public void setClient_moniker(String client_moniker) {
this.client_moniker = client_moniker;
}
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;
}
}

@ -1,10 +1,6 @@
package au.com.royalpay.payment.manage.risk.core; package au.com.royalpay.payment.manage.risk.core;
import au.com.royalpay.payment.manage.risk.bean.AddRiskDetailLog; import au.com.royalpay.payment.manage.risk.bean.*;
import au.com.royalpay.payment.manage.risk.bean.DealRiskRecord;
import au.com.royalpay.payment.manage.risk.bean.QueryRiskDetail;
import au.com.royalpay.payment.manage.risk.bean.QueryRiskOrder;
import au.com.royalpay.payment.manage.risk.bean.QueryRiskRecord;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
@ -32,6 +28,9 @@ public interface RiskMerchantService {
JSONObject getRiskDetails(QueryRiskDetail queryRiskDetail); JSONObject getRiskDetails(QueryRiskDetail queryRiskDetail);
JSONObject listAttentionMerchants(JSONObject account,QueryAttentionMerchants queryAttention);
void addAttentionMerchants(JSONObject account,String client_moniker);
void updateAttentionMerchants(JSONObject account,String client_moniker);
} }

@ -1,21 +1,15 @@
package au.com.royalpay.payment.manage.risk.core.impl; package au.com.royalpay.payment.manage.risk.core.impl;
import au.com.royalpay.payment.manage.mappers.risk.RiskMerchantDetailLogMapper; import au.com.royalpay.payment.manage.mappers.risk.*;
import au.com.royalpay.payment.manage.mappers.risk.RiskMerchantRecordMapper;
import au.com.royalpay.payment.manage.mappers.risk.RiskTransactionLogMapper;
import au.com.royalpay.payment.manage.mappers.risk.RiskWhiteListMapper;
import au.com.royalpay.payment.manage.merchants.core.ClientManager; import au.com.royalpay.payment.manage.merchants.core.ClientManager;
import au.com.royalpay.payment.manage.risk.bean.AddRiskDetailLog; import au.com.royalpay.payment.manage.risk.bean.*;
import au.com.royalpay.payment.manage.risk.bean.DealRiskRecord;
import au.com.royalpay.payment.manage.risk.bean.QueryRiskDetail;
import au.com.royalpay.payment.manage.risk.bean.QueryRiskOrder;
import au.com.royalpay.payment.manage.risk.bean.QueryRiskRecord;
import au.com.royalpay.payment.manage.risk.core.RiskMerchantService; import au.com.royalpay.payment.manage.risk.core.RiskMerchantService;
import au.com.royalpay.payment.tools.exceptions.BadRequestException; import au.com.royalpay.payment.tools.exceptions.BadRequestException;
import au.com.royalpay.payment.tools.exceptions.NotFoundException; import au.com.royalpay.payment.tools.exceptions.NotFoundException;
import au.com.royalpay.payment.tools.utils.PageListUtils; import au.com.royalpay.payment.tools.utils.PageListUtils;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import com.github.miemiedev.mybatis.paginator.domain.Order;
import com.github.miemiedev.mybatis.paginator.domain.PageBounds; import com.github.miemiedev.mybatis.paginator.domain.PageBounds;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
@ -39,6 +33,8 @@ public class RiskMerchantServiceImpl implements RiskMerchantService {
private RiskWhiteListMapper riskWhiteListMapper; private RiskWhiteListMapper riskWhiteListMapper;
@Resource @Resource
private ClientManager clientManager; private ClientManager clientManager;
@Resource
private RiskAttentionMerchantsAMapper riskAttentionMerchantsAMapper;
@Override @Override
@Transactional @Transactional
@ -213,4 +209,55 @@ public class RiskMerchantServiceImpl implements RiskMerchantService {
riskMerchantDetailLogMapper.query(queryRiskDetail.toParams(), new PageBounds(queryRiskDetail.getPage(), queryRiskDetail.getLimit()))); riskMerchantDetailLogMapper.query(queryRiskDetail.toParams(), new PageBounds(queryRiskDetail.getPage(), queryRiskDetail.getLimit())));
} }
@Override
public JSONObject listAttentionMerchants(JSONObject account, QueryAttentionMerchants queryAttention) {
if (account == null) {
throw new BadRequestException("account not exists");
}
return PageListUtils.buildPageListResult(
riskAttentionMerchantsAMapper.query(queryAttention.toParams(), new PageBounds(queryAttention.getPage(), queryAttention.getLimit(), Order.formString("create_time.desc"))));
}
@Override
public void addAttentionMerchants(JSONObject account, String client_moniker) {
if (account == null) {
throw new BadRequestException("account not exists");
}
JSONObject attentionMerchant = riskAttentionMerchantsAMapper.findByClientMoniker(client_moniker);
if(attentionMerchant != null){
if(attentionMerchant.getBoolean("is_valid")){
throw new BadRequestException("The client has already existed");
}else {
attentionMerchant.put("is_valid",1);
attentionMerchant.put("update_time",new Date());
riskAttentionMerchantsAMapper.update(attentionMerchant);
return;
}
}
JSONObject client = clientManager.getClientInfoByMoniker(client_moniker);
if(client == null){
throw new BadRequestException("The client does not exist");
}
JSONObject attention = new JSONObject();
attention.put("client_id",client.getIntValue("client_id"));
attention.put("client_moniker",client.getString("client_moniker"));
attention.put("is_valid",1);
attention.put("create_time",new Date());
riskAttentionMerchantsAMapper.save(attention);
}
@Override
public void updateAttentionMerchants(JSONObject account, String client_moniker) {
if (account == null) {
throw new BadRequestException("account not exists");
}
JSONObject attentionMerchant = riskAttentionMerchantsAMapper.findByClientMoniker(client_moniker);
if(attentionMerchant == null){
throw new BadRequestException("The client does not exist");
}
attentionMerchant.put("is_valid",0);
attentionMerchant.put("update_time",new Date());
riskAttentionMerchantsAMapper.update(attentionMerchant);
}
} }

@ -1,11 +1,7 @@
package au.com.royalpay.payment.manage.risk.web; package au.com.royalpay.payment.manage.risk.web;
import au.com.royalpay.payment.manage.permission.manager.ManagerMapping; import au.com.royalpay.payment.manage.permission.manager.ManagerMapping;
import au.com.royalpay.payment.manage.risk.bean.AddRiskDetailLog; import au.com.royalpay.payment.manage.risk.bean.*;
import au.com.royalpay.payment.manage.risk.bean.DealRiskRecord;
import au.com.royalpay.payment.manage.risk.bean.QueryRiskDetail;
import au.com.royalpay.payment.manage.risk.bean.QueryRiskOrder;
import au.com.royalpay.payment.manage.risk.bean.QueryRiskRecord;
import au.com.royalpay.payment.manage.risk.core.RiskMerchantService; import au.com.royalpay.payment.manage.risk.core.RiskMerchantService;
import au.com.royalpay.payment.tools.CommonConsts; import au.com.royalpay.payment.tools.CommonConsts;
import au.com.royalpay.payment.tools.permission.enums.ManagerRole; import au.com.royalpay.payment.tools.permission.enums.ManagerRole;
@ -94,4 +90,18 @@ public class RiskController {
riskMerchantService.addDetailLog(addRiskDetailLog,manager); riskMerchantService.addDetailLog(addRiskDetailLog,manager);
} }
@RequestMapping(value = "/attention", method = RequestMethod.GET)
public JSONObject listMerchants(@ModelAttribute(CommonConsts.MANAGER_STATUS) JSONObject manager,QueryAttentionMerchants queryAttention ) {
return riskMerchantService.listAttentionMerchants(manager,queryAttention);
}
@RequestMapping(value = "/attention/{client_moniker}", method = RequestMethod.POST)
public void addMerchants(@ModelAttribute(CommonConsts.MANAGER_STATUS) JSONObject manager,@PathVariable String client_moniker) {
riskMerchantService.addAttentionMerchants(manager,client_moniker);
}
@RequestMapping(value = "/attention/{client_moniker}", method = RequestMethod.PUT)
public void updateMerchants(@ModelAttribute(CommonConsts.MANAGER_STATUS) JSONObject manager,@PathVariable String client_moniker) {
riskMerchantService.updateAttentionMerchants(manager,client_moniker);
}
} }

@ -0,0 +1,127 @@
package au.com.royalpay.payment.manage.signin.beans;
import au.com.royalpay.payment.tools.permission.enums.ManagerRole;
import com.alibaba.fastjson.JSONObject;
import org.apache.commons.lang3.StringUtils;
/**
* Created by yuan on 2018/7/13.
*/
public class QueryManagerBean {
private String org_id;
private String org_id2;
private String role;
private String username;
private int page = 1;
private int limit = 10;
public JSONObject toJson(){
JSONObject params = new JSONObject();
if (StringUtils.isNotEmpty(org_id)){
params.put("org_id",org_id);
}
if (StringUtils.isNotEmpty(org_id2)){
params.put("org_id2",org_id2);
}
if (StringUtils.isNotEmpty(role)){
int mask = 0;
if(role.equals("1")){
mask = ManagerRole.ADMIN.getMask();
}
if(role.equals("10")){
mask = ManagerRole.OPERATOR.getMask();
}
if(role.equals("100")){
mask = ManagerRole.BD_USER.getMask();
}
if(role.equals("1000")){
mask = ManagerRole.FINANCIAL_STAFF.getMask();
}
if(role.equals("10000")){
mask = ManagerRole.SERVANT.getMask();
}
if(role.equals("100000")){
mask = ManagerRole.ACCOUNT_MANAGER.getMask();
}
if(role.equals("1000000")){
mask = ManagerRole.DIRECTOR.getMask();
}
if(role.equals("10000000")){
mask = ManagerRole.SITE_MANAGER.getMask();
}
if(role.equals("100000000")){
mask = ManagerRole.DEVELOPER.getMask();
}
if(role.equals("1000000000")){
mask = ManagerRole.BD_LEADER.getMask();
}
if(role.equals("10000000000")){
mask = ManagerRole.RISK_MANAGER.getMask();
}
if(role.equals("100000000000")){
mask = ManagerRole.GUEST.getMask();
}
if(role.equals("1000000000000")){
mask = ManagerRole.ORG_MANAGER.getMask();
}
if(mask != 0){
params.put("mask",mask);
}
}
if (StringUtils.isNotEmpty(username)){
params.put("username",username);
}
params.put("page",page);
params.put("limit",10);
return params;
}
public String getOrg_id() {
return org_id;
}
public void setOrg_id(String org_id) {
this.org_id = org_id;
}
public String getOrg_id2() {
return org_id2;
}
public void setOrg_id2(String org_id2) {
this.org_id2 = org_id2;
}
public String getRole() {
return role;
}
public void setRole(String role) {
this.role = role;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
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;
}
}

@ -2,6 +2,7 @@ package au.com.royalpay.payment.manage.signin.core;
import au.com.royalpay.payment.manage.signin.beans.ManagerInfo; import au.com.royalpay.payment.manage.signin.beans.ManagerInfo;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import com.github.miemiedev.mybatis.paginator.domain.PageList;
import java.util.List; import java.util.List;
@ -9,7 +10,7 @@ import java.util.List;
* Created by yixian on 2016-07-05. * Created by yixian on 2016-07-05.
*/ */
public interface ManagerAccountsService { public interface ManagerAccountsService {
List<JSONObject> listManagers(JSONObject loginManager,JSONObject params); PageList<JSONObject> listManagers(JSONObject loginManager, JSONObject params);
void saveManager(ManagerInfo manager, JSONObject loginManager); void saveManager(ManagerInfo manager, JSONObject loginManager);
@ -24,4 +25,6 @@ public interface ManagerAccountsService {
List<JSONObject> listGroupBds(JSONObject loginManager); List<JSONObject> listGroupBds(JSONObject loginManager);
JSONObject getBDConfig(String bd_id); JSONObject getBDConfig(String bd_id);
List<JSONObject> listServants(JSONObject loginManager);
} }

@ -4,20 +4,24 @@ import au.com.royalpay.payment.manage.mappers.financial.FinancialBDConfigMapper;
import au.com.royalpay.payment.manage.mappers.system.ManagerMapper; import au.com.royalpay.payment.manage.mappers.system.ManagerMapper;
import au.com.royalpay.payment.manage.mappers.system.OrgMapper; import au.com.royalpay.payment.manage.mappers.system.OrgMapper;
import au.com.royalpay.payment.manage.organizations.core.OrgManager; import au.com.royalpay.payment.manage.organizations.core.OrgManager;
import au.com.royalpay.payment.tools.permission.enums.ManagerRole;
import au.com.royalpay.payment.manage.signin.beans.ManagerInfo; import au.com.royalpay.payment.manage.signin.beans.ManagerInfo;
import au.com.royalpay.payment.manage.signin.core.ManagerAccountsService; import au.com.royalpay.payment.manage.signin.core.ManagerAccountsService;
import au.com.royalpay.payment.tools.exceptions.BadRequestException; import au.com.royalpay.payment.tools.exceptions.BadRequestException;
import au.com.royalpay.payment.tools.exceptions.NotFoundException; import au.com.royalpay.payment.tools.exceptions.NotFoundException;
import au.com.royalpay.payment.tools.permission.enums.ManagerRole;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import com.github.miemiedev.mybatis.paginator.domain.Order; import com.github.miemiedev.mybatis.paginator.domain.Order;
import com.github.miemiedev.mybatis.paginator.domain.PageBounds; import com.github.miemiedev.mybatis.paginator.domain.PageBounds;
import com.github.miemiedev.mybatis.paginator.domain.PageList;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.List; import java.util.List;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import javax.annotation.Resource;
/** /**
* Created by yixian on 2016-07-06. * Created by yixian on 2016-07-06.
*/ */
@ -35,12 +39,12 @@ public class ManagerAccountServiceImpl implements ManagerAccountsService {
private OrgManager orgManager; private OrgManager orgManager;
@Override @Override
public List<JSONObject> listManagers(JSONObject loginManager,JSONObject params) { public PageList<JSONObject> listManagers(JSONObject loginManager,JSONObject params) {
/* if (loginManager.getInteger("org_id") != null) { /* if (loginManager.getInteger("org_id") != null) {
params.put("org_id", loginManager.getIntValue("org_id")); params.put("org_id", loginManager.getIntValue("org_id"));
}*/ }*/
orgManager.checkOrgIds(loginManager,params); orgManager.checkOrgIds(loginManager,params);
List<JSONObject> managers = managerMapper.listAvailable(params, new PageBounds(Order.formString("create_time.desc"))); PageList<JSONObject> managers = managerMapper.listAvailable(params, new PageBounds(params.getIntValue("page"),params.getIntValue("limit"),Order.formString("create_time.desc")));
for (JSONObject manager : managers) { for (JSONObject manager : managers) {
int role = manager.getIntValue("role"); int role = manager.getIntValue("role");
manager.put("admin", ManagerRole.ADMIN.hasRole(role)); manager.put("admin", ManagerRole.ADMIN.hasRole(role));
@ -133,6 +137,11 @@ public class ManagerAccountServiceImpl implements ManagerAccountsService {
return financialBDConfigMapper.getBdConfig(bd_id); return financialBDConfigMapper.getBdConfig(bd_id);
} }
@Override
public List<JSONObject> listServants(JSONObject loginManager) {
return managerMapper.listServants(ManagerRole.SERVANT.getMask());
}
private void checkOrg(JSONObject loginManager,JSONObject manager){ private void checkOrg(JSONObject loginManager,JSONObject manager){
if (loginManager.getInteger("org_id")!=null){ if (loginManager.getInteger("org_id")!=null){
List<JSONObject> orgs = orgMapper.listOrgAndChild(loginManager.getIntValue("org_id")); List<JSONObject> orgs = orgMapper.listOrgAndChild(loginManager.getIntValue("org_id"));

@ -7,6 +7,7 @@ import au.com.royalpay.payment.manage.mappers.system.ClientAccountMapper;
import au.com.royalpay.payment.manage.mappers.system.ClientMapper; import au.com.royalpay.payment.manage.mappers.system.ClientMapper;
import au.com.royalpay.payment.manage.mappers.system.ManagerMapper; import au.com.royalpay.payment.manage.mappers.system.ManagerMapper;
import au.com.royalpay.payment.manage.mappers.system.OrgMapper; import au.com.royalpay.payment.manage.mappers.system.OrgMapper;
import au.com.royalpay.payment.manage.mappers.system.SysCustomerServiceMapper;
import au.com.royalpay.payment.manage.merchants.core.ClientConfigService; import au.com.royalpay.payment.manage.merchants.core.ClientConfigService;
import au.com.royalpay.payment.manage.merchants.core.ClientManager; import au.com.royalpay.payment.manage.merchants.core.ClientManager;
import au.com.royalpay.payment.manage.notice.core.MailService; import au.com.royalpay.payment.manage.notice.core.MailService;
@ -22,6 +23,7 @@ import au.com.royalpay.payment.tools.env.RequestEnvironment;
import au.com.royalpay.payment.tools.exceptions.BadRequestException; import au.com.royalpay.payment.tools.exceptions.BadRequestException;
import au.com.royalpay.payment.tools.exceptions.ForbiddenException; import au.com.royalpay.payment.tools.exceptions.ForbiddenException;
import au.com.royalpay.payment.tools.locale.LocaleSupport; import au.com.royalpay.payment.tools.locale.LocaleSupport;
import au.com.royalpay.payment.tools.permission.enums.ManagerRole;
import au.com.royalpay.payment.tools.utils.PasswordUtils; import au.com.royalpay.payment.tools.utils.PasswordUtils;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
@ -74,6 +76,8 @@ public class SignInAccountServiceImpl implements SignInAccountService, Applicati
@Resource @Resource
private ClientConfigService clientConfigService; private ClientConfigService clientConfigService;
@Resource @Resource
private SysCustomerServiceMapper sysCustomerServiceMapper;
@Resource
private PermissionClientModulesService permissionClientModulesService; private PermissionClientModulesService permissionClientModulesService;
private ApplicationEventPublisher publisher; private ApplicationEventPublisher publisher;
private static final List<String> tags = new ArrayList<>(); private static final List<String> tags = new ArrayList<>();
@ -114,6 +118,10 @@ public class SignInAccountServiceImpl implements SignInAccountService, Applicati
manager.put("available_func_names", funcNames); manager.put("available_func_names", funcNames);
manager.put("modules", modules.values()); manager.put("modules", modules.values());
manager.put("module_names", modules.keySet()); manager.put("module_names", modules.keySet());
if((manager.getIntValue("role")& ManagerRole.SERVANT.getMask())>0){
JSONObject cs = sysCustomerServiceMapper.findByManagerId(accountId);
manager.put("onoff",cs.getBoolean("onoff"));
}
return manager; return manager;
} }
@ -429,5 +437,4 @@ public class SignInAccountServiceImpl implements SignInAccountService, Applicati
account.put("is_password_expired", 0); account.put("is_password_expired", 0);
clientAccountMapper.update(account); clientAccountMapper.update(account);
} }
} }

@ -2,23 +2,33 @@ package au.com.royalpay.payment.manage.signin.web;
import au.com.royalpay.payment.manage.organizations.core.OrgManager; import au.com.royalpay.payment.manage.organizations.core.OrgManager;
import au.com.royalpay.payment.manage.permission.manager.ManagerMapping; import au.com.royalpay.payment.manage.permission.manager.ManagerMapping;
import au.com.royalpay.payment.tools.permission.enums.ManagerRole;
import au.com.royalpay.payment.manage.permission.manager.RequireManager; import au.com.royalpay.payment.manage.permission.manager.RequireManager;
import au.com.royalpay.payment.manage.signin.beans.ManagerInfo; import au.com.royalpay.payment.manage.signin.beans.ManagerInfo;
import au.com.royalpay.payment.manage.signin.beans.QueryManagerBean;
import au.com.royalpay.payment.manage.signin.core.ManagerAccountsService; import au.com.royalpay.payment.manage.signin.core.ManagerAccountsService;
import au.com.royalpay.payment.tools.CommonConsts; import au.com.royalpay.payment.tools.CommonConsts;
import au.com.royalpay.payment.tools.http.HttpUtils; import au.com.royalpay.payment.tools.http.HttpUtils;
import au.com.royalpay.payment.tools.permission.enums.ManagerRole;
import au.com.royalpay.payment.tools.utils.PageListUtils;
import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import org.apache.commons.lang3.StringUtils;
import org.springframework.validation.Errors; import org.springframework.validation.Errors;
import org.springframework.web.bind.annotation.*; 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.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import javax.validation.Valid;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import javax.annotation.Resource;
import javax.validation.Valid;
/** /**
* Created by yixian on 2016-07-05. * Created by yixian on 2016-07-05.
*/ */
@ -38,15 +48,9 @@ public class ManagerAccountsController {
@RequestMapping(method = RequestMethod.GET) @RequestMapping(method = RequestMethod.GET)
@RequireManager(role = {ManagerRole.ADMIN, ManagerRole.ACCOUNT_MANAGER}) @RequireManager(role = {ManagerRole.ADMIN, ManagerRole.ACCOUNT_MANAGER})
public List<JSONObject> listManagerss(@ModelAttribute(CommonConsts.MANAGER_STATUS) JSONObject loginManager, @RequestParam(required = false) String org_id,@RequestParam(required = false) String org_id2) { public JSONObject listManagerss(@ModelAttribute(CommonConsts.MANAGER_STATUS) JSONObject loginManager, QueryManagerBean queryManagerBean) {
JSONObject params = new JSONObject();
if(org_id != null){ return PageListUtils.buildPageListResult(managerAccountsService.listManagers(loginManager,queryManagerBean.toJson()));
params.put("org_id",org_id);
}
if (StringUtils.isNotEmpty(org_id2)) {
params.put("org_id2", org_id2);
}
return managerAccountsService.listManagers(loginManager,params);
} }
@RequestMapping(method = RequestMethod.POST) @RequestMapping(method = RequestMethod.POST)
@ -83,10 +87,15 @@ public class ManagerAccountsController {
return managerAccountsService.listBDLeaders(loginManager); return managerAccountsService.listBDLeaders(loginManager);
} }
@ManagerMapping(value = "/group/group_bds", method = RequestMethod.GET) @ManagerMapping(value = "/group/group_bds", method = RequestMethod.GET)
public List<JSONObject> listGroupBds(@ModelAttribute(CommonConsts.MANAGER_STATUS) JSONObject loginManager) { public List<JSONObject> listGroupBds(@ModelAttribute(CommonConsts.MANAGER_STATUS) JSONObject loginManager) {
return managerAccountsService.listGroupBds(loginManager); return managerAccountsService.listGroupBds(loginManager);
} }
@ManagerMapping(value = "/roles/servant", method = RequestMethod.GET,role = {ManagerRole.ADMIN})
public List<JSONObject> listServants(@ModelAttribute(CommonConsts.MANAGER_STATUS) JSONObject loginManager) {
return managerAccountsService.listServants(loginManager);
}
} }

@ -0,0 +1,25 @@
package au.com.royalpay.payment.manage.task;
import au.com.royalpay.payment.manage.openim.core.CustomerServiceService;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
/**
* Created by wangning on 2018/1/2.
*
*/
@Component
@ConditionalOnProperty(value = "app.run-tasks", havingValue = "true")
public class SendUnreadMsgWechatTask {
@Resource
private CustomerServiceService customerServiceService;
// @Scheduled(cron = "0 0/10 * * * ?")
// public void ofeiOrderCheck() {
// customerServiceService.sendUnreadWxMsg();
// }
}

@ -1,7 +1,10 @@
package au.com.royalpay.payment.manage.tradelog.refund; package au.com.royalpay.payment.manage.tradelog.refund;
import au.com.royalpay.payment.manage.analysis.beans.RefundReviewBean; import au.com.royalpay.payment.manage.analysis.beans.RefundReviewBean;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import com.github.miemiedev.mybatis.paginator.domain.PageBounds;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import java.math.BigDecimal; import java.math.BigDecimal;
@ -44,4 +47,6 @@ public interface RefundService {
JSONObject findReviewOrder(String reviewId); JSONObject findReviewOrder(String reviewId);
JSONObject checkRefundAuditFlag(); JSONObject checkRefundAuditFlag();
JSONObject listUnionAllApply(JSONObject params,PageBounds pagination);
} }

@ -87,7 +87,8 @@ public class RefundServiceImpl implements RefundService, ApplicationEventPublish
throw new RefundExistException(); throw new RefundExistException();
} }
if (apply.isEmpty()) { if (apply.isEmpty()) {
order.put("available", BigDecimal.valueOf(order.getDoubleValue("customer_payment_amount")).subtract(BigDecimal.valueOf(order.getDoubleValue("refund_fee"))).doubleValue()); order.put("available", BigDecimal.valueOf(order.getDoubleValue("customer_payment_amount"))
.subtract(BigDecimal.valueOf(order.getDoubleValue("refund_fee"))).doubleValue());
return order; return order;
} else { } else {
if (account != null) { if (account != null) {
@ -118,7 +119,8 @@ public class RefundServiceImpl implements RefundService, ApplicationEventPublish
if (undoRefundOrder != null) { if (undoRefundOrder != null) {
throw new BadRequestException("该笔订单有退款正在处理,请稍后再试!"); throw new BadRequestException("该笔订单有退款正在处理,请稍后再试!");
} }
order.put("available", BigDecimal.valueOf(order.getDoubleValue("customer_payment_amount")).subtract(BigDecimal.valueOf(order.getDoubleValue("refund_fee"))).doubleValue()); order.put("available", BigDecimal.valueOf(order.getDoubleValue("customer_payment_amount"))
.subtract(BigDecimal.valueOf(order.getDoubleValue("refund_fee"))).doubleValue());
return order; return order;
} }
@ -148,7 +150,8 @@ public class RefundServiceImpl implements RefundService, ApplicationEventPublish
Assert.notNull(client, "client not exists"); Assert.notNull(client, "client not exists");
JSONObject clientConfig = clientConfigService.find(clientId); JSONObject clientConfig = clientConfigService.find(clientId);
OperatorType type = account != null ? OperatorType.PARTNER : OperatorType.MANAGER; OperatorType type = account != null ? OperatorType.PARTNER : OperatorType.MANAGER;
boolean requireAudit = type == OperatorType.PARTNER && PartnerRole.getRole(account.getIntValue("role")) == PartnerRole.CASHIER && clientConfig.getBooleanValue("enable_refund_auth"); boolean requireAudit = type == OperatorType.PARTNER && PartnerRole.getRole(account.getIntValue("role")) == PartnerRole.CASHIER
&& clientConfig.getBooleanValue("enable_refund_auth");
logger.debug("applyer type=" + type + "; require audit=" + requireAudit); logger.debug("applyer type=" + type + "; require audit=" + requireAudit);
paymentApi.clientRefundBalanceCheck(clientId, orderId, currency, feeAmount); paymentApi.clientRefundBalanceCheck(clientId, orderId, currency, feeAmount);
@ -204,7 +207,8 @@ public class RefundServiceImpl implements RefundService, ApplicationEventPublish
} }
private JSONObject executeRefund(String orderId, BigDecimal amount, String remark, JSONObject partnerAccount, JSONObject manager, JSONObject order, JSONObject client) { private JSONObject executeRefund(String orderId, BigDecimal amount, String remark, JSONObject partnerAccount, JSONObject manager, JSONObject order,
JSONObject client) {
checkOrderUseCustomerCoupon(order, amount); checkOrderUseCustomerCoupon(order, amount);
JSONObject clientConfig = clientConfigService.find(client.getIntValue("client_id")); JSONObject clientConfig = clientConfigService.find(client.getIntValue("client_id"));
OperatorType type = partnerAccount != null ? OperatorType.PARTNER : OperatorType.MANAGER; OperatorType type = partnerAccount != null ? OperatorType.PARTNER : OperatorType.MANAGER;
@ -220,7 +224,8 @@ public class RefundServiceImpl implements RefundService, ApplicationEventPublish
operator.put("operator_id", manager.getIntValue("manager_id")); operator.put("operator_id", manager.getIntValue("manager_id"));
operator.put("operator", manager.getString("display_name")); operator.put("operator", manager.getString("display_name"));
} }
boolean requireAudit = type == OperatorType.PARTNER && PartnerRole.getRole(partnerAccount.getIntValue("role")) == PartnerRole.CASHIER && clientConfig.getBooleanValue("enable_refund_auth"); boolean requireAudit = type == OperatorType.PARTNER && PartnerRole.getRole(partnerAccount.getIntValue("role")) == PartnerRole.CASHIER
&& clientConfig.getBooleanValue("enable_refund_auth");
logger.debug("applyer type=" + type + "; require audit=" + requireAudit); logger.debug("applyer type=" + type + "; require audit=" + requireAudit);
return paymentApi.refundOrder(orderId, null, amount, remark, operator, type, requireAudit); return paymentApi.refundOrder(orderId, null, amount, remark, operator, type, requireAudit);
} }
@ -338,7 +343,8 @@ public class RefundServiceImpl implements RefundService, ApplicationEventPublish
private void submitRefund(JSONObject account, JSONObject audition) { private void submitRefund(JSONObject account, JSONObject audition) {
JSONObject refundLog = refundMapper.find(audition.getString("refund_id")); JSONObject refundLog = refundMapper.find(audition.getString("refund_id"));
boolean platformAuditFlag = auditRefundAndCommitToPlatform(refundLog.getBigDecimal("amount"), audition.getString("remark"), refundLog.getString("order_id"), account); boolean platformAuditFlag = auditRefundAndCommitToPlatform(refundLog.getBigDecimal("amount"), audition.getString("remark"),
refundLog.getString("order_id"), account);
if (!platformAuditFlag) { if (!platformAuditFlag) {
paymentApi.submitRefund(audition.getString("refund_id")); paymentApi.submitRefund(audition.getString("refund_id"));
} }
@ -347,8 +353,7 @@ public class RefundServiceImpl implements RefundService, ApplicationEventPublish
private boolean auditRefundAndCommitToPlatform(BigDecimal amount, String remark, String orderId, JSONObject account) { private boolean auditRefundAndCommitToPlatform(BigDecimal amount, String remark, String orderId, JSONObject account) {
if (amount.compareTo(BigDecimal.ZERO) > 0) { if (amount.compareTo(BigDecimal.ZERO) > 0) {
JSONObject refundConfig = checkRefundAuditFlag(); JSONObject refundConfig = checkRefundAuditFlag();
if (refundConfig != null && refundConfig.getBoolean("refundAudit") && if (refundConfig != null && refundConfig.getBoolean("refundAudit") && amount.compareTo(refundConfig.getBigDecimal("refundAuditAmount")) >= 0) {
amount.compareTo(refundConfig.getBigDecimal("refundAuditAmount")) >= 0) {
// 订单需要审核 // 订单需要审核
reviewNewRefundOrder(orderId, amount, remark, account, null); reviewNewRefundOrder(orderId, amount, remark, account, null);
return true; return true;
@ -411,7 +416,8 @@ public class RefundServiceImpl implements RefundService, ApplicationEventPublish
} }
review.put("bd_name", bdNameStr.deleteCharAt(bdNameStr.length() - 1).toString()); review.put("bd_name", bdNameStr.deleteCharAt(bdNameStr.length() - 1).toString());
JSONObject order = orderMapper.find(review.getString("order_id")); JSONObject order = orderMapper.find(review.getString("order_id"));
review.put("available", BigDecimal.valueOf(order.getDoubleValue("customer_payment_amount")).subtract(BigDecimal.valueOf(order.getDoubleValue("refund_fee"))).doubleValue()); review.put("available", BigDecimal.valueOf(order.getDoubleValue("customer_payment_amount"))
.subtract(BigDecimal.valueOf(order.getDoubleValue("refund_fee"))).doubleValue());
review.put("create_time", order.getDate("create_time")); review.put("create_time", order.getDate("create_time"));
review.put("channel", order.getString("channel")); review.put("channel", order.getString("channel"));
return review; return review;
@ -427,6 +433,15 @@ public class RefundServiceImpl implements RefundService, ApplicationEventPublish
return refundConfig; return refundConfig;
} }
@Override
public JSONObject listUnionAllApply(JSONObject params, PageBounds pagination) {
if(params.get("client_id")==null && params.get("client_ids")==null){
return null;
}
return PageListUtils.buildPageListResult(refundMapper.listUnionAllApply(params, pagination));
}
@Override @Override
public void setApplicationEventPublisher(ApplicationEventPublisher applicationEventPublisher) { public void setApplicationEventPublisher(ApplicationEventPublisher applicationEventPublisher) {
this.publisher = applicationEventPublisher; this.publisher = applicationEventPublisher;

@ -112,6 +112,9 @@ mail.mailgun.default.merchantlist=merchants@mail.royalpay.com.au
royalpay.sms.appid=1400094878 royalpay.sms.appid=1400094878
royalpay.sms.appkey=43390d81e20c5191c278fbf4cd275be2 royalpay.sms.appkey=43390d81e20c5191c278fbf4cd275be2
im.openim.appkey=24986533
im.openim.secret=96e28e7be21a874177211c31834b5174
#清算银行配置 #清算银行配置
settle.abafile.default-bank=CBA settle.abafile.default-bank=CBA

@ -69,4 +69,64 @@
and DATE_FORMAT(create_time,'%Y-%m-%d') = DATE_FORMAT(#{today},'%Y-%m-%d'); and DATE_FORMAT(create_time,'%Y-%m-%d') = DATE_FORMAT(#{today},'%Y-%m-%d');
</if> </if>
</select> </select>
<select id="listUnionAllApply" resultType="com.alibaba.fastjson.JSONObject">
SELECT
order_id order_id,
client_id client_id,
create_time create_time,
confirm_time confirm_time,
operator_name operator_name,
`status` `status` ,
amount amount,
1 type
FROM
pmt_refunds
<where>
<if test="client_id!=null">
and client_id = #{client_id}
</if>
<if test="start_time!=null">
and create_time &gt;= #{start_time}
</if>
<if test="start_time!=null">
and create_time &lt;= #{end_time}
</if>
<if test="client_ids!=null">
client_id in
<foreach collection="client_ids" open="(" close=")" separator="," item="item">
#{item}
</foreach>
</if>
</where>
UNION ALL
SELECT
ra.order_id order_id,
ra.client_id client_id,
ra.applytime create_time,
ra.audittime confirm_time,
ra.auditorname operator_name,
ra.audit_result `status` ,
r.amount amount,
2 type
FROM
pmt_refund_applies ra left join pmt_refunds r on ra.refund_id = r.refund_id
<where>
<if test="client_id!=null">
and ra.client_id = #{client_id}
</if>
<if test="start_time!=null">
and ra.applytime &gt;= #{start_time}
</if>
<if test="start_time!=null">
and ra.applytime &lt;= #{end_time}
</if>
<if test="client_ids!=null">
ra.client_id in
<foreach collection="client_ids" open="(" close=")" separator="," item="item">
#{item}
</foreach>
</if>
</where>
order by create_time desc
</select>
</mapper> </mapper>

@ -0,0 +1,20 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="au.com.royalpay.payment.manage.mappers.system.ClientAccountMapper">
<select id="query" resultType="com.alibaba.fastjson.JSONObject">
SELECT a.*,c.client_moniker client_moniker FROM sys_accounts a left join sys_clients c on c.client_id = a.client_id
<where>
<if test="clientId!=null">
and a.client_id = #{clientId}
</if>
<if test="userNames!=null">
and a.username in (
<foreach collection="userNames" item="item" separator=",">
#{item}
</foreach>
)
</if>
</where>
</select>
</mapper>

@ -27,8 +27,15 @@
) o ) o
ON m.wx_openid = o.wechat_openid ON m.wx_openid = o.wechat_openid
<where> <where>
<if test="org_id!=null and org_ids==null">m.org_id=#{org_id}</if> <if test="username!=null">
<if test="org_ids!=null">m.org_id in <bind name="username_pattern" value="'%'+username+'%'"/>
and m.username like #{username_pattern}
</if>
<if test="mask!=null">
and <![CDATA[ m.role & #{mask} >0 ]]>
</if>
<if test="org_id!=null and org_ids==null"> AND m.org_id=#{org_id}</if>
<if test="org_ids!=null"> AND m.org_id in
<foreach collection="org_ids" item="org_id" open="(" close=")" separator=",">#{org_id}</foreach></if> <foreach collection="org_ids" item="org_id" open="(" close=")" separator=",">#{org_id}</foreach></if>
and m.is_valid=1 and m.is_valid=1
</where> </where>
@ -87,4 +94,14 @@
WHERE role & #{mask} >0 AND wx_openid IS NOT NULL AND is_valid = 1 WHERE role & #{mask} >0 AND wx_openid IS NOT NULL AND is_valid = 1
]]> ]]>
</select> </select>
<select id="listServants" resultType="com.alibaba.fastjson.JSONObject">
<![CDATA[
SELECT m.display_name display_name,m.manager_id manager_id, cs.nick nick, cs.password password,cs.onoff onoff
FROM sys_managers m left join sys_customer_service cs on m.manager_id = cs.manager_id
WHERE m.role & #{mask} >0 AND (m.org_id IS NULL or m.org_id=1) AND m.is_valid = 1
]]>
</select>
</mapper> </mapper>

@ -0,0 +1,19 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="au.com.royalpay.payment.manage.mappers.system.SysCustomerServiceMapper">
<select id="findOnline" resultType="com.alibaba.fastjson.JSONObject">
select user_id from sys_customer_service
where `onoff` = 1
</select>
<update id="onoff">
udpate sys_customer_servie
set status = #{status}
where manager_id = #{managerId}
</update>
<select id="findAllWithDetail" resultType="com.alibaba.fastjson.JSONObject">
select s.user_id,s.onoff,m.* from
sys_customer_service s left join sys_managers m
on s.manager_id = m.manager_id
</select>
</mapper>

@ -0,0 +1,25 @@
<!DOCTYPE html>
<html>
<head>
<script src="https://g.alicdn.com/aliww/??h5.openim.sdk/1.0.6/scripts/wsdk.js,h5.openim.kit/0.3.3/scripts/kit.js" charset="utf-8"></script>
<script type="text/javascript" data-th-inline="javascript">
window.uid = /*[[*{uid}]]*/null;
window.credential = /*[[*{password}]]*/null;
window.onload = function(){
WKIT.init({
container: document.getElementById('J_demo'),
width: 700,
height: 500,
uid: window.uid,
appkey: 24962653,
credential: window.credential,
touid: 'imuser1234',
logo: 'http://img.alicdn.com/tps/i3/TB12LD9IFXXXXb3XpXXSyFWJXXX-82-82.png',
pluginUrl: 'http://www.taobao.com/market/seller/openim/plugindemo.php'
});
}
</script>
</head>
</html>

@ -120,6 +120,12 @@ margin-bottom: 10%;"/>
<div class="navbar-custom-menu"> <div class="navbar-custom-menu">
<ul class="nav navbar-nav"> <ul class="nav navbar-nav">
<li class="user-menu" ng-if="currentUser.onoff">
<a role="button" ng-click="customerService()">
<i class="fa fa-wechat"></i> contact service
</a>
</li>
<li class="user-menu"> <li class="user-menu">
<a role="button" ng-click="managerBindWechat(true)"> <a role="button" ng-click="managerBindWechat(true)">
<i class="fa fa-wechat"></i> Bind WeChat <i class="fa fa-wechat"></i> Bind WeChat

@ -0,0 +1,155 @@
<html>
<!--[if lt IE 9]>
<meta charset="utf-8"/>
<meta http-equiv=”Content-Type” content=”text/html; charset=utf-8″>
<script src="https://g.alicdn.com/aliww/ww/json/json.js" charset="utf-8"></script>
<![endif]-->
<!-- 自动适配移动端与pc端 -->
<script src="https://cdn.bootcss.com/jquery/1.10.2/jquery.min.js"></script>
<script src="https://g.alicdn.com/aliww/??h5.openim.sdk/1.0.6/scripts/wsdk.js,h5.openim.kit/0.4.0/scripts/kit.js"
charset="utf-8"></script>
<script src="https://g.alicdn.com/aliww/h5.openim.sdk/1.0.6/scripts/wsdk.js"></script>
<script>
window.onload = function () {
window.uid = getQueryString('uid');
window.touid = getQueryString('uid');
window.password = getQueryString('p');
window.appKey = getQueryString('key');
WKIT.init({
container: document.getElementById('J_demo'),
width: 700,
height: 500,
uid: window.uid,
appkey: window.appKey,
credential: window.password,
touid: window.uid,
pluginUrl: '/service_contact_list.html?uid='
+ window.uid,
onLoginSuccess: function (data) {
initLayout();
WKIT.Conn.sdk.Event.on('MSG_RECEIVED', function (data) {
updateContractList(data.data);
});
initUnreadMsgAndContact();
WKIT.Conn.sdk.Base.startListenAllMsg();
window.sdk = document.getElementById("J_wkitPluginFrame").contentWindow;
}
});
}
function switchTouid(touid) {
window.touid = touid;
var low_touid = WKIT.Conn.sdk.Base.getNick(touid).toLowerCase();
WKIT.switchTouid({
touid: low_touid,
logo: 'https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1531805782509&di=98f7fa48980696f8eddf7eb617a834a3&imgtype=0&src=http%3A%2F%2Fi2.hdslb.com%2Fbfs%2Fface%2F98dbd049061292bca8625caf91cff1b41ee999cd.jpg',
Avatar: 'https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1531805782509&di=98f7fa48980696f8eddf7eb617a834a3&imgtype=0&src=http%3A%2F%2Fi2.hdslb.com%2Fbfs%2Fface%2F98dbd049061292bca8625caf91cff1b41ee999cd.jpg',
toAvatar: 'https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1531805782509&di=98f7fa48980696f8eddf7eb617a834a3&imgtype=0&src=http%3A%2F%2Fi2.hdslb.com%2Fbfs%2Fface%2F98dbd049061292bca8625caf91cff1b41ee999cd.jpg'
});
WKIT.Conn.sdk.Chat.setReadState({
touid: low_touid,
timestamp: Math.floor((+new Date()) / 1000),
success: function (data) {
},
error: function (error) {
console.log('set read state fail', error);
}
});
window.sdk.unreadMap[touid].msgCount = 0;
window.sdk.showContactList(window.sdk.unreadMap);
}
function initUnreadMsgAndContact() {
WKIT.Conn.sdk.Base.getRecentContact({
count: 40,
success: function (data) {
var cnts = data.data.cnts;
for (var i = cnts.length - 1; i >= 0; i--) {
var unreadmapEle = {msgCount: 0};
window.sdk.unreadMap[getName(
WKIT.Conn.sdk.Base.getNick(
cnts[i].from))] = unreadmapEle;
}
getUnreadMsgCount();
},
error: function (error) {
console.log('get contact msg count fail',
error);
}
})
}
function getUnreadMsgCount() {
WKIT.Conn.sdk.Base.getUnreadMsgCount({
count: 40,
success: function (data) {
var unreads = data.data;
var uids = "";
for (var i = unreads.length - 1; i >= 0; i--) {
window.sdk.unreadMap[getName(WKIT.Conn.sdk.Base.getNick(unreads[i].contact))].msgCount = unreads[i].msgCount;
var nick = getName(WKIT.Conn.sdk.Base.getNick(unreads[i].contact));
if (nick.substring(nick.length - 5, nick.length - 4) == '_') {
uids += nick + ",";
} else {
uids += nick.substring(0, uid.length - 5) + ",";
}
}
window.sdk.loadContactList(uids);
},
error: function (error) {
console.log('get recent contact fail', error);
}
});
}
function updateContractList(data) {
var msg = data.msgs[0];
var low_msg_uid = WKIT.Conn.sdk.Base.getNick(msg.from);
var msg_uid = getName(low_msg_uid);
if (window.uid == msg_uid) {
WKIT.Conn.sdk.Chat.setReadState({
touid: low_msg_uid,
timestamp: Math.floor((+new Date()) / 1000),
success: function (data) {
},
error: function (error) {
console.log('set read state fail', error);
}
});
}else {
if (window.sdk.unreadMap[msg_uid]) {
window.sdk.unreadMap[msg_uid].msgCount = window.sdk.unreadMap[msg_uid].msgCount + 1;
} else {
var unreadMapEle = {msgCount: 1}
window.sdk.unreadMap[msg_uid] = unreadMapEle;
}
window.sdk.loadContactList(msg_uid.substr(0, msg_uid - 6));
}
}
function initLayout() {
$("#J_wkitUserInfo").hide();
$("#J_wkitPluginFrameWrap").height("100%");
$("#J_wkitPluginFrameWrap").css("margin", "0 0 0 0");
}
function getName(uid) {
if (uid.substring(uid.length - 5, uid.length - 4) == '_') {
var prefix = uid.substring(0, uid.length - 5);
var suffix = uid.substring(uid.length - 5, uid.length).toUpperCase();
return prefix + suffix;
}
return uid;
}
function getQueryString(name) {
var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)", "i");
var r = window.location.search.substr(1).match(reg);
if (r != null) {
return unescape(r[2]);
}
return null;
}
</script>
</html>

@ -0,0 +1,159 @@
<html>
<!--[if lt IE 9]>
<meta charset="utf-8"/>
<meta http-equiv=”Content-Type” content=”text/html; charset=utf-8″>
<script src="https://g.alicdn.com/aliww/ww/json/json.js" charset="utf-8"></script>
<![endif]-->
<!-- 自动适配移动端与pc端 -->
<meta content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0;" name="viewport" />
<meta name="viewport" content="width=device-width, initial-scale=1.0 user-scalable=yes" />
<script src="https://cdn.bootcss.com/jquery/1.10.2/jquery.min.js"></script>
<script src="https://g.alicdn.com/aliww/??h5.openim.sdk/1.0.6/scripts/wsdk.js,h5.openim.kit/0.4.0/scripts/kit.js"
charset="utf-8"></script>
<script src="https://g.alicdn.com/aliww/h5.openim.sdk/1.0.6/scripts/wsdk.js"></script>
<script>
window.onload = function () {
$.ajax({
url: '/sys/openim/check',
method: 'PUT',
contentType: 'application/json',
success: function (resp) {
console.log(resp);
window.uid = resp.user_id;
window.touid = resp.user_id;
window.password = resp.password;
window.appKey = resp.appkey;
loginOpenim();
},
error: function (jqXHR) {
}
});
$("#back").bind('click',function () {
parent.hideContent();
})
};
function loginOpenim() {
WKIT.init({
container: document.getElementById('J_demo'),
width: 700,
height: 500,
uid: window.uid,
appkey: window.appKey,
credential: window.password,
touid: window.touid,
onLoginSuccess: function (data) {
initLayout();
WKIT.Conn.sdk.Event.on('MSG_RECEIVED', function (data) {
updateContractList(data.data);
});
initUnreadMsgAndContact();
WKIT.Conn.sdk.Base.startListenAllMsg();
window.sdk = parent.document.getElementById("subPageList").contentWindow;
}
});
}
function switchTouid(touid) {
window.uid = touid;
WKIT.switchTouid({
touid: touid
});
WKIT.Conn.sdk.Chat.setReadState({
touid: touid,
timestamp: Math.floor((+new Date()) / 1000),
success: function (data) {
},
error: function (error) {
console.log('set read state fail', error);
}
});
window.sdk.unreadMap[touid].msgCount = 0;
window.sdk.showContactList(window.sdk.unreadMap);
}
function initUnreadMsgAndContact() {
WKIT.Conn.sdk.Base.getRecentContact({
count: 40,
success: function (data) {
var cnts = data.data.cnts;
for (var i = cnts.length - 1; i >= 0; i--) {
var unreadmapEle = {msgCount: 0};
window.sdk.unreadMap[WKIT.Conn.sdk.Base.getNick(
cnts[i].from)] = unreadmapEle;
}
getUnreadMsgCount();
},
error: function (error) {
console.log('get contact msg count fail',
error);
}
})
}
function getUnreadMsgCount() {
WKIT.Conn.sdk.Base.getUnreadMsgCount({
count: 40,
success: function (data) {
console.log(data);
var unreads = data.data;
var uids = "";
for (var i = unreads.length - 1; i >= 0; i--) {
if (window.sdk.unreadMap[WKIT.Conn.sdk.Base.getNick(
unreads[i].contact)]) {
}
window.sdk.unreadMap[WKIT.Conn.sdk.Base.getNick(
unreads[i].contact)].msgCount =
unreads[i].msgCount;
var nick = WKIT.Conn.sdk.Base.getNick(
unreads[i].contact)
uids +=
nick.substr(0, nick.length - 6) + ",";
}
window.sdk.loadContactList(uids);
},
error: function (error) {
console.log('get recent contact fail', error);
}
});
}
function updateContractList(data) {
var msg = data.msgs[0];
var msg_uid = WKIT.Conn.sdk.Base.getNick(msg.from).toUpperCase();
if (window.sdk.unreadMap[msg_uid]) {
window.sdk.unreadMap[msg_uid].msgCount = window.sdk.unreadMap[msg_uid].msgCount + 1;
window.sdk.unreadMap[msg_uid].lastMsg =msg.msg ;
} else {
var unreadMapEle = {msgCount: 1,msg:msg.msg}
window.sdk.unreadMap[msg_uid] = unreadMapEle;
}
window.sdk.loadContactList(msg_uid.substr(0, msg_uid - 6));
}
function initLayout() {
$("#J_wkitUserInfo").hide();
$("#J_wkitPluginFrameWrap").height("100%");
$("#J_wkitPluginFrameWrap").css("margin", "0 0 0 0");
}
function getQueryString(name) {
var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)", "i");
var r = window.location.search.substr(1).match(reg);
if (r != null) {
return unescape(r[2]);
}
return null;
}
</script>
<body>
<div style="width: 2rem;height: 2rem;position: absolute;z-index:99999;" id="back">
<img style="width: 2rem" src="/static/images/im/back.png">
</div>
</body>
</html>

@ -0,0 +1,92 @@
<html>
<!--[if lt IE 9]>
<meta charset="utf-8"/>
<meta http-equiv=”Content-Type” content=”text/html; charset=utf-8″>
<script src="https://g.alicdn.com/aliww/ww/json/json.js" charset="utf-8"></script>
<link href="static/lib/bootstrap/css/bootstrap.min.css" rel="stylesheet">
<meta name="viewport" content="width=device-width,user-scalable=no,initial-scale=1.0,maximum-scale=1.0,minimum-scale=1.0">
<![endif]-->
<!-- 自动适配移动端与pc端 -->
<meta content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0;" name="viewport" />
<meta name="viewport" content="width=device-width, initial-scale=1.0 user-scalable=yes" />
<script src="https://cdn.bootcss.com/jquery/1.10.2/jquery.min.js"></script>
<script src="https://g.alicdn.com/aliww/??h5.openim.sdk/1.0.6/scripts/wsdk.js,h5.openim.kit/0.4.0/scripts/kit.js"
charset="utf-8"></script>
<script src="https://g.alicdn.com/aliww/h5.openim.sdk/1.0.6/scripts/wsdk.js"></script>
<style>
.content{
width: 99%;
height: 99%;
}
</style>
<script>
window.onload = function () {
$('#submit').bind("click", function () {
var data = {};
data.loginId = $("#uid").val();
data.password = $("#pwd").val();
data.verifyCode = 'noop';
$.ajax({
url: '/sys/openim/signin',
method: 'POST',
data: JSON.stringify(data),
contentType: 'application/json',
success: function () {
window.subPage = document.getElementById("subPage").contentWindow;
window.subPageList =
document.getElementById("subPageList").contentWindow;
window.subPage.location.href = "/service_client_app.html";
window.subPageList.location.href = "/service_contact_list_app.html";
$("#subPageDiv").show();
hideList();
},
error: function (jqXHR) {
}
});
});
}
function hideList() {
$("#loginInput").hide();
$("#subPageDiv").show();
$("#subPageListDiv").hide();
}
function hideContent() {
$("#loginInput").hide();
$("#subPageDiv").hide();
$("#subPageListDiv").show();
}
</script>
<body>
<div id="loginInput" class="col-xs-12 login-box-body login-box-bg">
<form action="" method="post">
<div class="form-group has-feedback">
<input type="text" id="uid" class="form-control" placeholder="账号">
<span class="glyphicon glyphicon-user form-control-feedback"></span>
</div>
<div class="form-group has-feedback">
<input type="password" id="pwd" class="form-control" placeholder="密码">
<span class="glyphicon glyphicon-lock form-control-feedback"></span>
</div>
<div class="row">
<div class="col-xs-12 margin-bottom">
<button type="button" id="submit" style="background-color: #f06010" class="btn btn-warning btn-block btn-flat">Sign In</button>
</div>
</div>
</form>
</div>
<div id="subPageDiv" style="display: none" class="content">
<iframe id="subPage" class="content">
</iframe>
</div>
<div id="subPageListDiv" style="display: none" class="content">
<iframe id="subPageList" class="content">
</iframe>
</div>
</body>
</html>

@ -0,0 +1,208 @@
<html>
<!--[if lt IE 9]>
<meta charset="utf-8"/>
<script src="https://g.alicdn.com/aliww/ww/json/json.js" charset="utf-8"></script>
<![endif]-->
<!-- 自动适配移动端与pc端 -->
<script src="https://g.alicdn.com/aliww/h5.openim.sdk/1.0.6/scripts/wsdk.js"
charset="UTF-8"></script>
<script src="https://cdn.bootcss.com/jquery/1.10.2/jquery.min.js"></script>
<style>
li {
float: left;
list-style-type: none;
transition: background-color .1s;
margin-bottom: 13px;
width: 100%;
}
ul {
padding: 0;
}
.search-div {
height: 3%;
}
.search-div input {
background: #D8D8D8;
border-radius: 5px;
}
.hover {
color: black;
background-color: rgba(255, 255, 255, 0.03);
}
.active {
color: red;
background-color: rgba(255, 255, 255, 0.1);
}
.avatar {
border-radius: 2px;
}
.headimg {
float: left;
border-radius: 50%;
width: 25px;
height: 25px;
border: 1px solid #000;
border-radius: 50%;
background-position: center;
background-attachment: inherit;
}
.headimg-img {
width: 10px;
}
.avatar {
margin-top: 8px;
padding-left: 27px;
}
.notice {
width: 15px;
height: 15px;
line-height: 15px;
font-size: 10px;
color: #fff;
text-align: center;
background-color: #f00;
border-radius: 50%;
position: relative;
right: -16px;
top: -7px;
}
.frm_search {
width: 133px;
height: 32px;
line-height: 32px;
border: 0;
border-radius: 2px;
-moz-border-radius: 2px;
-webkit-border-radius: 2px;
background-color: #D8D8D8;
color: #fff;
padding-left: 30px;
font-size: 12px;
}
.search_bar {
position: relative;
width: 137px;
margin: 0 auto 6px;
}
.web_wechat_search {
background: url(/static/images/search.png) no-repeat;
display: inline-block;
vertical-align: middle;
width: 25px;
height: 30px;
position: absolute;
line-height: 1.6;
background-size: 16px;
background-position: 5px;
}
</style>
<script>
var unreadMap = {};
function searchContact() {
var uid = $('#searchText').val();
var searchContactList = {};
for (var key in unreadMap) {
if (key.search(uid) > -1) {
searchContactList[key] = unreadMap[key];
}
}
var param = {clientMoniker: uid};
$.ajax({
url: '/sys/openim/list',
method: 'GET',
data: param,
contentType: 'application/json',
dataType: 'json',
success: function (resp) {
for (var i = 0; i <= resp.length - 1; i++) {
resp[i].msgCount = 0;
searchContactList[resp[i].nick] = resp[i];
unreadMap[resp[i].nick] = resp[i];
}
showContactList(searchContactList);
},
error: function () {
showContactList(searchContactList);
}
});
}
function loadContactList(uids) {
var param = {userNames: uids};
$.ajax({
url: '/sys/openim/list',
method: 'GET',
data: param,
contentType: 'application/json',
dataType: 'json',
success: function (resp) {
for (var i = 0; i <= resp.length - 1; i++) {
var ele = unreadMap[resp[i].nick];
if (ele) {
ele.headimg = resp[i].headimg;
}
}
showContactList(unreadMap);
}
})
};
function showContactList(map) {
var contact_list = '';
for (var key in map) {
var ele= map[key];
var css = 'hover';
if (key == parent.window.touid) {
css = 'active';
}
var headImUrl = '';
if (ele.headimg) {
headImUrl = ele.headimg;
} else {
headImUrl = "/static/images/act/encourage_money/default_headimg.png";
}
contact_list +=
"<li " + " class=\"" + css + "\" onclick=switchToUser('" + key
+ "')>"
+ "<div class=\"headimg\" style='background-image:url(" + headImUrl
+ "')>"
if(ele.msgCount>0){
contact_list+="<div class=\"notice\">" + ele.msgCount + "</div>";
}
contact_list += "</div>"
+ "<div class=\"avatar\">" + key + "</div>"
+ "</li>"
}
$("#contact_list").html(contact_list);
}
function switchToUser(touid) {
parent.switchTouid(touid);
}
</script>
<body>
<div class="search_bar">
<i class="web_wechat_search"></i>
<input id="searchText" class="frm_search" type="text" onchange="searchContact()">
</div>
<div class="list">
<ul id="contact_list">
</ul>
</div>
</body>
</html>

@ -0,0 +1,212 @@
<html>
<!--[if lt IE 9]>
<meta charset="utf-8"/>
<script src="https://g.alicdn.com/aliww/ww/json/json.js" charset="utf-8"></script>
<![endif]-->
<!-- 自动适配移动端与pc端 -->
<script src="https://g.alicdn.com/aliww/h5.openim.sdk/1.0.6/scripts/wsdk.js"
charset="UTF-8"></script>
<script src="https://cdn.bootcss.com/jquery/1.10.2/jquery.min.js"></script>
<style>
li {
float: left;
list-style-type: none;
transition: background-color .1s;
margin-bottom: 13px;
width: 100%;
height: 2rem;
}
ul {
padding: 0;
}
body{
width: 98%;
height: 98%;
}
.search-div {
height: 3%;
}
.search-div input {
background: #D8D8D8;
border-radius: 5px;
}
.hover {
color: black;
background-color: rgba(255, 255, 255, 0.03);
}
.active {
color: red;
background-color: rgba(255, 255, 255, 0.1);
}
.avatar {
border-radius: 2px;
}
.headimg {
float: left;
border-radius: 50%;
width: 25px;
height: 25px;
border: 1px solid #000;
border-radius: 50%;
background-position: center;
background-attachment: inherit;
}
.headimg-img {
width: 10px;
}
.avatar {
margin-top: 11px;
padding-left: 42px;
}
.msg {
margin-top: 11px;
padding-left: 42px;
}
.notice {
width: 1.2rem;
height: 1.2rem;
line-height: 1.2rem;
font-size: 10px;
color: #fff;
text-align: center;
background-color: #f00;
border-radius: 50%;
position: relative;
right: -23px;
top: -8px;
}
.frm_search {
width: 98%;
height: 32px;
line-height: 32px;
border: 0;
border-radius: 2px;
-moz-border-radius: 2px;
-webkit-border-radius: 2px;
background-color: #D8D8D8;
color: #fff;
padding-left: 30px;
font-size: 12px;
}
.search_bar {
position: relative;
width: 100%;
margin: 0 auto 6px;
}
.web_wechat_search {
background: url(/static/images/search.png) no-repeat;
display: inline-block;
vertical-align: middle;
width: 25px;
height: 30px;
position: absolute;
line-height: 1.6;
background-size: 16px;
background-position: 5px;
}
</style>
<script>
var unreadMap = {};
function searchContact() {
var uid = $('#searchText').val();
var searchContactList = {};
for (var key in unreadMap) {
if (key.search(uid) > -1) {
searchContactList[key] = unreadMap[key];
}
}
var param = {clientMoniker: uid};
$.ajax({
url: '/sys/openim/list',
method: 'GET',
data: param,
contentType: 'application/json',
dataType: 'json',
success: function (resp) {
for (var i = 0; i <= resp.length - 1; i++) {
resp[i].msgCount = 0;
searchContactList[resp[i].nick] = resp[i];
unreadMap[resp[i].nick] = resp[i];
}
showContactList(searchContactList);
},
error: function () {
showContactList(searchContactList);
}
});
}
function loadContactList(uids) {
var param = {userNames: uids};
$.ajax({
url: '/sys/openim/list',
method: 'GET',
data: param,
contentType: 'application/json',
dataType: 'json',
success: function (resp) {
for (var i = 0; i <= resp.length - 1; i++) {
unreadMap[resp[i].nick].headimg = resp[i].headimg;
}
showContactList(unreadMap);
}
})
};
function showContactList(map) {
var contact_list = '';
for (var key in map) {
var ele= map[key];
var headImUrl = '';
if (ele.headimg) {
headImUrl = ele.headimg;
} else {
headImUrl = "/static/images/act/encourage_money/default_headimg.png";
}
contact_list +=
"<li onclick=switchToUser('" + key
+ "')>"
+ "<div class=\"headimg\" style='background-image:url(" + headImUrl
+ "')>"
+ "<div class=\"notice\">" + ele.msgCount + "</div>"
+ "</div>"
+ "<div class=\"avatar\">" + key + "</div>";
if(ele.lastMsg){
contact_list +="<div class=\"msg\">" + ele.lastMsg + "</div>";
}
contact_list+= "</li>";
}
$("#contact_list").html(contact_list);
}
function switchToUser(touid) {
parent.document.getElementById("subPage").contentWindow.switchTouid(touid);
parent.hideList();
}
</script>
<body>
<div class="search_bar">
<i class="web_wechat_search"></i>
<input id="searchText" class="frm_search" type="text" onchange="searchContact()">
</div>
<div class="list">
<ul id="contact_list">
</ul>
</div>
</body>
</html>

@ -0,0 +1,23 @@
<html>
<!--[if lt IE 9]>
<meta charset="utf-8" />
<script src="https://g.alicdn.com/aliww/ww/json/json.js" charset="utf-8"></script>
<![endif]-->
<!-- 自动适配移动端与pc端 -->
<script src="https://g.alicdn.com/aliww/??h5.openim.sdk/1.0.6/scripts/wsdk.js,h5.openim.kit/0.3.3/scripts/kit.js"
charset="utf-8"></script>
<script>
window.onload = function () {
WKIT.init({
container: document.getElementById('J_demo'),
width: 700,
height: 500,
uid: 'kira3_PINE',
appkey: 24980715,
credential: 'xxxxxx',
touid: 'kiraservanttest1',
logo: 'http://img.alicdn.com/tps/i3/TB12LD9IFXXXXb3XpXXSyFWJXXX-82-82.png',
});
}
</script>
</html>

@ -23,6 +23,7 @@ define(['angular', 'uiBootstrap', 'uiRouter', 'angularEcharts'], function (angul
$http.get('/actchairty/clients', {params: params}).then(function (resp) { $http.get('/actchairty/clients', {params: params}).then(function (resp) {
$scope.clients = resp.data.data; $scope.clients = resp.data.data;
$scope.pagination = resp.data.pagination; $scope.pagination = resp.data.pagination;
}) })
}; };
$scope.loadClients(); $scope.loadClients();

@ -23,7 +23,7 @@
</ul> </ul>
<div class="tab-content" ui-view> <div class="tab-content" ui-view>
<div class="modal-body"> <div class="modal-body">
<div class="alert alert-danger" ng-if="msg" ng-bind="msg"></div> <div class="alert alert-info" ng-if="msg" ng-bind="msg"></div>
<div class="form-inline"> <div class="form-inline">
<div class="form-group"> <div class="form-group">
<input class="form-control" placeholder="Client Moniker" ng-model="new_conf.client_moniker"> <input class="form-control" placeholder="Client Moniker" ng-model="new_conf.client_moniker">
@ -78,7 +78,6 @@
<div class="col-xs-12">Total Records:{{pagination.totalCount}};Total Pages:{{pagination.totalPages}}</div> <div class="col-xs-12">Total Records:{{pagination.totalCount}};Total Pages:{{pagination.totalPages}}</div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>

@ -176,6 +176,11 @@ define(['angular', 'angularSanitize', 'angularAnimate', 'angularMessages', 'uiRo
// $scope.showQrCode(resp.data.url); // $scope.showQrCode(resp.data.url);
}) })
} }
$scope.customerService = function () {
$http.put('/sys/openim/check').then(function (resp) {
window.open('/service_client.html?key='+resp.data.appkey+'&p='+resp.data.password+'&uid='+resp.data.user_id,'_blank');
});
}
}]); }]);
app.controller('changePwdCtrl', ['$scope', '$http', function ($scope, $http) { app.controller('changePwdCtrl', ['$scope', '$http', function ($scope, $http) {

@ -12,12 +12,14 @@ define(['angular', 'uiRouter', 'uiBootstrap'], function (angular) {
}) })
}]); }]);
app.controller('managerListCtrl', ['$scope', '$http', '$filter','$uibModal', 'commonDialog', function ($scope, $http,$filter, $uibModal, commonDialog) { app.controller('managerListCtrl', ['$scope', '$http', '$filter','$uibModal', 'commonDialog', function ($scope, $http,$filter, $uibModal, commonDialog) {
$scope.search = {role:'111111111111'}; $scope.params = {role:"111111111111"};
$scope.params = {}; $scope.pagination = {};
$scope.listManagers = function () { $scope.listManagers = function (page) {
var params = angular.copy($scope.params); var params = angular.copy($scope.params);
params.page = page || $scope.pagination.page || 1;
$http.get('/sys/manager_accounts',{params: params}).then(function (resp) { $http.get('/sys/manager_accounts',{params: params}).then(function (resp) {
$scope.managers = resp.data; $scope.managers = resp.data.data;
$scope.pagination = resp.data.pagination;
}) })
}; };
if($filter('withRole')('1')){ if($filter('withRole')('1')){

@ -11,15 +11,18 @@
<div class="box-solid"> <div class="box-solid">
<div class="box box-warning"> <div class="box box-warning">
<div class="box-header"> <div class="box-header">
<div class="collapse navbar-collapse" id="bs-example-navbar-collapse-2"> <div class="form-horizontal">
<form class="navbar-form navbar-left" role="search"> <div class="form-group col-sm-6">
<div class="form-group"> <label class="control-label col-xs-4 col-sm-4" for="username-search">Username</label>
<label class="control-label" for="username-filter-input">Username</label> <div class="col-xs-6">
<input type="text" class="form-control" ng-model="search.username" placeholder="Username" id="username-filter-input"> <input type="text" class="form-control" ng-model="params.username" placeholder="Username" id="username-search">
</div> </div>
<div class="form-group" ng-if="('1'|withRole)"> </div>
<label class="control-label" for="role-filter-select">Role</label> <div class="form-group col-sm-6">
<select class="form-control" id="role-filter-select" ng-model="search.role"> <label class="control-label col-xs-4 col-sm-4"
for="role-select">Role</label>
<div class="col-xs-6">
<select ng-change="listManagers(1)" class="form-control" id="role-select" ng-model="params.role">
<option value="111111111111">All</option> <option value="111111111111">All</option>
<option value="1">Administrator</option> <option value="1">Administrator</option>
<option value="10">Compliance</option> <option value="10">Compliance</option>
@ -35,41 +38,44 @@
<option value="100000000000">Guest</option> <option value="100000000000">Guest</option>
<option value="1000000000000">Org Manager</option> <option value="1000000000000">Org Manager</option>
</select> </select>
</div>
</div> </div>
<div class="form-group" ng-if="('1'|withRole)"> <div class="form-group col-sm-6">
<label class="control-label col-xs-4 col-sm-4"
for="org-select">All Organizations</label>
<div class="col-xs-6">
<select id="org-select" class="form-control" ng-model="params.org_id" <select id="org-select" class="form-control" ng-model="params.org_id"
ng-options="org.org_id as org.name group by org.org_type for org in orgs" ng-options="org.org_id as org.name group by org.org_type for org in orgs"
ng-change="params.org_id2 = '';listManagers();loadOrgsChild(params.org_id)"> ng-change="params.org_id2 = '';listManagers(1);loadOrgsChild(params.org_id)">
<option value="">All Organizations</option> <option value="">All Organizations</option>
</select> </select>
</div> </div>
</div>
<div ng-if="(orgs_child.length > 1)&&('1'|withRole)&&params.org_id"> <div class="form-group col-sm-6" ng-if="(orgs_child.length > 1)&&('1'|withRole)&&params.org_id">
<label class="control-label col-xs-4 col-sm-4"
for="org-child-select">Sub Organizations</label>
<div class="col-xs-6">
<select id="org-child-select" class="form-control" ng-model="params.org_id2" <select id="org-child-select" class="form-control" ng-model="params.org_id2"
ng-options="org.org_id as org.name group by org.org_type for org in orgs_child" ng-options="org.org_id as org.name group by org.org_type for org in orgs_child"
ng-change="listManagers()"> ng-change="listManagers(1)">
<option value="">Sub Organizations</option> <option value="">Sub Organizations</option>
</select> </select>
</div> </div>
<!--<div class="form-group" ng-if="'1'|withRole"> </div>
<label class="control-label" for="org-select">Organizations</label> <div class="col-xs-12">
<select class="form-control" id="org-select" ng-model="search.org_id" ng-options="o.org_id as o.name for o in orgs"> <button class="btn btn-primary" type="button" ng-click="listManagers(1)">
<option value="">All</option> <i class="fa fa-search"></i> Search
</select> </button>
</div>--> <button class="btn btn-info" type="button " ng-click="newManager()">
</form>
<div class="navbar-form navbar-right">
<button class="btn btn-success" type="button" ng-click="newManager()">
<i class="fa fa-plus"></i> New Manager Account <i class="fa fa-plus"></i> New Manager Account
</button> </button>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
<div class="box"> <div class="box">
<div class="box-body"> <div class="box-body">
<div class="row">
<div class="col-sm-12 table-responsive"> <div class="col-sm-12 table-responsive">
<table class="table table-striped table-hover"> <table class="table table-striped table-hover">
<thead> <thead>
@ -79,19 +85,19 @@
<th>Wechat</th> <th>Wechat</th>
<th>Create Time</th> <th>Create Time</th>
<th>Email</th> <th>Email</th>
<th ng-if="!search.org_id">Organization</th> <th>Organization</th>
<th>Roles</th> <th>Roles</th>
<th>Operation</th> <th>Operation</th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
<tr ng-repeat="manager in managers|managersFilter:search"> <tr ng-repeat="manager in managers">
<td ng-bind="manager.username"></td> <td ng-bind="manager.username"></td>
<td ng-bind="manager.display_name"></td> <td ng-bind="manager.display_name"></td>
<td style="white-space: nowrap;overflow: hidden;text-overflow:ellipsis;"><img ng-src="{{manager.headimg}}" style="height: 30px;width:30px;" class="img-circle" ng-if="manager.headimg"> {{manager.nickname}}</td> <td style="white-space: nowrap;overflow: hidden;text-overflow:ellipsis;"><img ng-src="{{manager.headimg}}" style="height: 30px;width:30px;" class="img-circle" ng-if="manager.headimg"> {{manager.nickname}}</td>
<td ng-bind="manager.create_time|date:'yyyy-MM-dd'"></td> <td ng-bind="manager.create_time|date:'yyyy-MM-dd'"></td>
<td ng-bind="manager.email"></td> <td ng-bind="manager.email"></td>
<td ng-bind="manager.org_name" ng-if="!search.org_id"></td> <td ng-bind="manager.org_name"></td>
<td> <td>
<i class="fa fa-user-secret" title="Administrator" ng-class="{'text-green':manager.admin,'text-gray':!manager.admin}"></i> <i class="fa fa-user-secret" title="Administrator" ng-class="{'text-green':manager.admin,'text-gray':!manager.admin}"></i>
<i class="fa fa-eye" title="Compliance" ng-class="{'text-green':manager.operator,'text-gray':!manager.operator}"></i> <i class="fa fa-eye" title="Compliance" ng-class="{'text-green':manager.operator,'text-gray':!manager.operator}"></i>
@ -116,6 +122,21 @@
</tbody> </tbody>
</table> </table>
</div> </div>
<div class="box-footer" ng-if="managers.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="listManagers()"
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>

@ -141,10 +141,15 @@ define(['angular', 'uiRouter', 'uiBootstrap'], function (angular) {
}) })
}; };
$scope.search = {role:'1111111'}; $scope.params = {role:'1111111',org_id:$scope.org.org_id};
$scope.listManagers = function () { $scope.pagination = {};
$http.get('/sys/manager_accounts',{params:{org_id:$scope.org.org_id}}).then(function (resp) { $scope.listManagers = function (page) {
$scope.managers = resp.data; var params = angular.copy($scope.params);
params.page = page || $scope.pagination.page || 1;
$http.get('/sys/manager_accounts',{params:params}).then(function (resp) {
$scope.managers = resp.data.data;
$scope.pagination = resp.data.pagination;
}) })
}; };

@ -305,11 +305,11 @@
<form class="navbar-form navbar-left" role="search"> <form class="navbar-form navbar-left" role="search">
<div class="form-group"> <div class="form-group">
<label class="control-label" for="username-filter-input">Username</label> <label class="control-label" for="username-filter-input">Username</label>
<input type="text" class="form-control" ng-model="search.username" placeholder="Username" id="username-filter-input"> <input type="text" class="form-control" ng-model="params.username" placeholder="Username" id="username-filter-input">
</div> </div>
<div class="form-group" ng-if="'1'|withRole"> <div class="form-group" ng-if="'1'|withRole">
<label class="control-label" for="role-filter-select">Role</label> <label class="control-label" for="role-filter-select">Role</label>
<select class="form-control" id="role-filter-select" ng-model="search.role"> <select ng-change="listManagers(1)" class="form-control" id="role-filter-select" ng-model="params.role">
<option value="1111111">All</option> <option value="1111111">All</option>
<option value="1">Administrator</option> <option value="1">Administrator</option>
<option value="10">Compliance</option> <option value="10">Compliance</option>
@ -323,6 +323,12 @@
<option value="1000000000000">Org Manager</option> <option value="1000000000000">Org Manager</option>
</select> </select>
</div> </div>
<div class="form-group">
<button class="btn btn-primary" type="button" ng-click="listManagers(1)">
<i class="fa fa-search"></i> Search
</button>
</div>
</form> </form>
<div class="navbar-form navbar-right"> <div class="navbar-form navbar-right">
<button class="btn btn-success" type="button" ng-click="newManager()"> <button class="btn btn-success" type="button" ng-click="newManager()">
@ -350,7 +356,7 @@
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
<tr ng-repeat="manager in managers|managersFilter:search"> <tr ng-repeat="manager in managers">
<td ng-bind="manager.username"></td> <td ng-bind="manager.username"></td>
<td ng-bind="manager.display_name"></td> <td ng-bind="manager.display_name"></td>
<td style="white-space: nowrap;overflow: hidden;text-overflow:ellipsis;"><img ng-src="{{manager.headimg}}" style="height: 30px;width:30px;" class="img-circle" ng-if="manager.headimg"> {{manager.nickname}}</td> <td style="white-space: nowrap;overflow: hidden;text-overflow:ellipsis;"><img ng-src="{{manager.headimg}}" style="height: 30px;width:30px;" class="img-circle" ng-if="manager.headimg"> {{manager.nickname}}</td>
@ -377,6 +383,22 @@
</tbody> </tbody>
</table> </table>
</div> </div>
<div class="box-footer" ng-if="managers.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="listManagers()"
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> </div>

@ -34,6 +34,10 @@ define(['angular', 'uiRouter'], function (angular) {
url: '/mail', url: '/mail',
templateUrl: '/static/config/sysconfigs/templates/mail_subscribe.html', templateUrl: '/static/config/sysconfigs/templates/mail_subscribe.html',
controller: 'mailSubscribeCtrl' controller: 'mailSubscribeCtrl'
}).state('sysconfig.servantsConfig', {
url: '/servantsConfig',
templateUrl: '/static/config/sysconfigs/templates/servants_config.html',
controller: 'servantsConfigCtrl'
})/*.state('sysconfig.payment_config',{ })/*.state('sysconfig.payment_config',{
url: '/payment_config', url: '/payment_config',
templateUrl: '/static/config/sysconfigs/templates/payemnt_config.html', templateUrl: '/static/config/sysconfigs/templates/payemnt_config.html',
@ -61,6 +65,41 @@ define(['angular', 'uiRouter'], function (angular) {
app.controller('sysConfigCtrl', ['$scope', function ($scope) { app.controller('sysConfigCtrl', ['$scope', function ($scope) {
}]); }]);
app.controller('servantsConfigCtrl', ['$scope','$http','commonDialog', function ($scope,$http,commonDialog) {
$scope.ctrl={};
$scope.loadServants = function () {
$http.get('/sys/manager_accounts/roles/servant').then(function (resp) {
$scope.servants = resp.data;
})
};
$scope.loadServants();
$scope.onoff = function (servant) {
var param = {onoff:servant.onoff};
$http.put('/sys/openim/servant/'+servant.manager_id+'/onoff',param).then(function (resp) {
if(!servant.password){
$scope.loadServants();
}
},function (resp) {
commonDialog.alert({title: 'Error', content: resp.data.message, type: 'error'});
});
};
$scope.changeNick = function (servant) {
var param = {nick:servant.nick};
$http.put('/sys/openim/servant/'+servant.manager_id+'/nick',param).then(function (resp) {
$scope.ctrl.nick[servant.display_name] = false;
if(!servant.password){
$scope.loadServants();
}
},function (resp) {
commonDialog.alert({title: 'Error', content: resp.data.message, type: 'error'});
});
};
}]);
app.controller('basicConfigCtrl', ['$scope', '$http', 'commonDialog', function ($scope, $http, commonDialog) { app.controller('basicConfigCtrl', ['$scope', '$http', 'commonDialog', function ($scope, $http, commonDialog) {
$scope.loadSysConfigs = function () { $scope.loadSysConfigs = function () {
$http.get('/sysconfig/base').then(function (resp) { $http.get('/sysconfig/base').then(function (resp) {

@ -0,0 +1,76 @@
<section class="content-header">
<h1>Servants Config</h1>
<ol class="breadcrumb">
<li>
<a ui-sref="^"><i class="fa fa-cog"></i> System Config</a>
</li>
<li>Servants Config</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">-->
<!--<input class="form-control" placeholder="Client Moniker" ng-model="params.client_moniker">-->
<!--</div>-->
<!--<div class="form-group">-->
<!--<input class="form-control" placeholder="Mail Address" ng-model="params.address">-->
<!--</div>-->
<!--<button class="btn btn-success" ng-click="loadUnSubs(1)"><i-->
<!--class="fa fa-search"></i> Search</button>-->
<!--<button class="btn btn-success pull-right" ng-click="addUnSub()" ng-click="addUnSubs()">Add</button>-->
<!--</div>-->
<!--</div>-->
<!--</div>-->
<div class="box">
<div class="box-body no-padding table-responsive">
<table class="table table-striped">
<thead>
<tr>
<th>Display Name</th>
<th>Nick</th>
<th>Password</th>
<th>Operation</th>
</tr>
</thead>
<tbody>
<tr ng-repeat="servant in servants">
<td ng-bind="servant.display_name"></td>
<td>
<p class="form-control-static">
{{servant.nick}}
<a role="button" ng-click="ctrl.nick[servant.display_name]=true" ><i class="fa fa-edit"></i></a>
</p>
<div class="input-group" ng-if="ctrl.nick[servant.display_name] || false">
<input type="text" class="form-control" ng-model="servant.nick"
title="Ali Sub Merchant Id">
<div class="input-group-btn">
<button class="btn btn-success" ng-click="changeNick(servant)">
<i class="fa fa-check"></i>
</button>
</div>
<div class="input-group-btn">
<button class="btn btn-danger" ng-click="ctrl.nick[servant.display_name]=false">
<i class="fa fa-remove"></i>
</button>
</div>
</div>
</td>
<td ng-bind="servant.password"></td>
<td>
<input type="checkbox" ng-click="onoff(servant)" ng-model="servant.onoff">
</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
</div>
</div>
</div>

@ -30,6 +30,11 @@
Partner Permission Config Partner Permission Config
</a> </a>
<a class="btn btn-app" role="button" ui-sref=".servantsConfig" ng-if="('1'|withRole)">
<i class="fa fa-key"></i>
Servants Config
</a>
<!--<a class="btn btn-app" role="button" ui-sref=".payment_config"> <!--<a class="btn btn-app" role="button" ui-sref=".payment_config">
<i class="fa fa-edit"></i> <i class="fa fa-edit"></i>
Payment Config Payment Config

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 431 B

@ -29,6 +29,30 @@
<p class="form-control-static" ng-bind="partner.client_moniker"></p> <p class="form-control-static" ng-bind="partner.client_moniker"></p>
</div> </div>
</div> </div>
<div ng-if="'100'|withRole">
<div ng-if="partner.open_status||partner.open_status==0">
<div class="form-group">
<label class="control-label col-sm-2">Company Name</label>
<div class="col-sm-8">
<p class="form-control-static" ng-bind="partner.company_name"></p>
</div>
</div>
<div class="form-group">
<label class="control-label col-sm-2">Short Name</label>
<div class="col-sm-8">
<p class="form-control-static" ng-bind="partner.short_name"></p>
</div>
</div>
<div class="form-group">
<label class="control-label col-sm-2">Business Name</label>
<div class="col-sm-8">
<p class="form-control-static" ng-bind="partner.business_name"></p>
</div>
</div>
</div>
<div ng-if="!partner.open_status&&partner.open_status!=0">
<div class="form-group" <div class="form-group"
ng-class="{'has-error':partnerForm.company_name.$invalid && partnerForm.company_name.$dirty}"> ng-class="{'has-error':partnerForm.company_name.$invalid && partnerForm.company_name.$dirty}">
<label class="control-label col-sm-2" for="company-name-input">* Company Name</label> <label class="control-label col-sm-2" for="company-name-input">* Company Name</label>
@ -75,6 +99,57 @@
</div> </div>
</div> </div>
</div> </div>
</div>
</div>
<div ng-if="!('100'|withRole)">
<div class="form-group"
ng-class="{'has-error':partnerForm.company_name.$invalid && partnerForm.company_name.$dirty}">
<label class="control-label col-sm-2" for="company-name-input">* Company Name</label>
<div class="col-sm-8">
<input class="form-control" ng-model="partner.company_name" type="text"
id="company-name-input" required name="company_name" maxlength="100">
<p class="small text-info">Full Name shall be same as the name when register to
gov</p>
<div ng-messages="partnerForm.company_name.$error"
ng-if="partnerForm.company_name.$dirty">
<p class="small text-danger" ng-message="required">Required Field</p>
<p class="small text-danger" ng-message="maxlength">Less Than 100
Characters(including symbols and spaces)</p>
</div>
</div>
</div>
<div class="form-group"
ng-class="{'has-error':partnerForm.short_name.$invalid && partnerForm.short_name.$dirty}">
<label class="control-label col-sm-2" for="short-name-input">* Short Name</label>
<div class="col-sm-8">
<input class="form-control" ng-model="partner.short_name" type="text"
name="short_name"
id="short-name-input" required maxlength="50">
<p class="small text-info">short name for WeChat payment display and partner
name</p>
<div ng-messages="partnerForm.short_name.$error"
ng-if="partnerForm.company_name.$dirty">
<p class="small text-danger" ng-message="required">Required Field</p>
<p class="small text-danger" ng-message="maxlength">Less Than 50
Characters(including symbols and spaces)</p>
</div>
</div>
</div>
<div class="form-group"
ng-class="{'has-error':partnerForm.business_name.$invalid && partnerForm.business_name.$dirty}">
<label class="control-label col-sm-2" for="business-name-input">Business Name</label>
<div class="col-sm-8">
<input id="business-name-input" ng-model="partner.business_name" class="form-control"
type="text" name="business_name" maxlength="100">
<div ng-messages="partnerForm.business_name.$error"
ng-if="partnerForm.business_name.$dirty">
<p class="small text-danger" ng-message="maxlength">Less Than 100
Characters(including symbols and spaces)</p>
</div>
</div>
</div>
</div>
<div class="form-group" <div class="form-group"
ng-class="{'has-error':partnerForm.business_structure.$invalid && partnerForm.business_structure.$dirty}"> ng-class="{'has-error':partnerForm.business_structure.$invalid && partnerForm.business_structure.$dirty}">
<label class="control-label col-sm-2" for="business-structure-input">Business Structure</label> <label class="control-label col-sm-2" for="business-structure-input">Business Structure</label>

@ -45,6 +45,10 @@ define(['angular', 'static/commons/commons', 'uiBootstrap', 'uiRouter', 'ngBootS
}); });
}] }]
} }
}).state('analysis_monitoring.attention', {
url: '/risk/attention',
templateUrl: '/static/risk/templates/attention_merchants.html',
controller: 'AttentionMerchantCtrl'
}); });
}]); }]);
app.controller('RiskManageCtrl', ['$scope', '$http', function ($scope, $http){ app.controller('RiskManageCtrl', ['$scope', '$http', function ($scope, $http){
@ -218,6 +222,41 @@ define(['angular', 'static/commons/commons', 'uiBootstrap', 'uiRouter', 'ngBootS
} }
}]); }]);
app.controller('AttentionMerchantCtrl', ['$scope', '$http','commonDialog','$uibModal', function ($scope, $http,commonDialog,$uibModal){
$scope.params = {};
$scope.pagination = {};
$scope.ctrl = {};
$scope.loadAttentionMerchants = function (page) {
var params = angular.copy($scope.params);
params.page = page || $scope.pagination.page || 1;
$http.get('/sys/risk/attention', {params: params}).then(function (resp) {
$scope.attentions = resp.data.data;
$scope.pagination = resp.data.pagination;
$scope.ctrl.addAttention = false;
});
};
$scope.loadAttentionMerchants(1);
$scope.disableAttention = function (client_moniker) {
commonDialog.confirm({title: 'Confirm', content: '确定删除这个商户?'
}).then(function () {
$http.put('/sys/risk/attention/' + client_moniker).then(function () {
commonDialog.alert({title: 'Success', content: 'disable successfully', type: 'success'});
$scope.loadAttentionMerchants(1);
}, function (resp) {
commonDialog.alert({title: 'Error', content: resp.data.message, type: 'error'});
});
})
};
$scope.addAttentionMerchants = function (client_moniker) {
$http.post('/sys/risk/attention/'+ client_moniker).then(function () {
commonDialog.alert({title: 'Success', content: 'add successfully', type: 'success'});
$scope.loadAttentionMerchants(1);
}, function (resp) {
commonDialog.alert({title: 'Error', content: resp.data.message, type: 'error'});
});
}
}]);
app.filter('risk_type', function () { app.filter('risk_type', function () {
return function (riskStr) { return function (riskStr) {
angular.forEach(riskType,function (type) { angular.forEach(riskType,function (type) {

@ -0,0 +1,84 @@
<div ui-view>
<section class="content-header">
<h1>Risky Merchants</h1>
<ol class="breadcrumb">
<li><i class="fa fa-gift"></i> Risk</li>
<li class="active">Risk Merchants</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">Partner Code</label>
<input type="text" class="form-control" id="partner-code-search"
ng-enter="loadAttentionMerchants(1)"
ng-model="params.client_moniker">
</div>
<div class="form-group">
<button class="btn btn-primary" type="button" ng-click="loadAttentionMerchants(1)"><i
class="fa fa-search"></i></button>
</div>
<div class="form-group pull-right">
<button ng-hide="ctrl.addAttention" class="btn btn-info" type="button" ng-click="ctrl.addAttention = true"><i class="fa fa-plus"></i>Add</button>
<div class="input-group" ng-if="ctrl.addAttention">
<input type="text" class="form-control" ng-model="client_moniker"
title="Add Attention" placeholder="client Moniker">
<div class="input-group-btn">
<button class="btn btn-success" ng-click="addAttentionMerchants(client_moniker)">
<i class="fa fa-check"></i>
</button>
</div>
<div class="input-group-btn">
<button class="btn btn-danger" ng-click="ctrl.addAttention=false">
<i class="fa fa-remove"></i>
</button>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="box box-warning">
<div class="box-header">Clients</div>
<div class="box-body table-responsive">
<table class="table table-hover">
<thead>
<tr>
<th>Client Moniker</th>
<th>Create Time</th>
<th>Operation</th>
</tr>
</thead>
<tbody>
<tr ng-repeat="client in attentions">
<td>{{client.client_moniker}}</td>
<td>{{client.create_time}}</td>
<td>
<a role="button" class="text-bold text-danger"
ng-click="disableAttention(client.client_moniker)">Disable</a>
</td>
</tr>
</tbody>
</table>
<div class="modal-footer">
<uib-pagination ng-if="attentions.length"
class="pagination"
total-items="pagination.totalCount"
boundary-links="true"
ng-model="pagination.page"
items-per-page="pagination.limit"
max-size="10"
ng-change="loadAttentionMerchants()"
previous-text="&lsaquo;"
next-text="&rsaquo;"
first-text="&laquo;"
last-text="&raquo;"></uib-pagination>
</div>
</div>
</div>
</section>
</div>

@ -34,6 +34,10 @@
<button class="btn btn-primary" type="button" ng-click="loadRecords(1)"><i <button class="btn btn-primary" type="button" ng-click="loadRecords(1)"><i
class="fa fa-search"></i></button> class="fa fa-search"></i></button>
</div> </div>
<div class="form-group pull-right">
<button class="btn btn-primary" type="button" ui-sref="analysis_monitoring.attention">Risky Merchants</button>
</div>
</div> </div>
</div> </div>
</div> </div>

@ -14,6 +14,7 @@ import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import org.apache.commons.codec.binary.Base64; import org.apache.commons.codec.binary.Base64;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.time.DateUtils; import org.apache.commons.lang3.time.DateUtils;
import org.apache.poi.hssf.usermodel.HSSFCell; import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.Cell;
@ -22,16 +23,14 @@ import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.xssf.usermodel.XSSFSheet; import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook; import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.junit.Test; import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.test.context.ActiveProfiles;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RequestMethod;
import java.io.File; import java.io.File;
import java.io.FileInputStream; import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException; import java.io.IOException;
import java.io.OutputStream;
import java.net.URISyntaxException; import java.net.URISyntaxException;
import java.nio.charset.Charset; import java.nio.charset.Charset;
import java.util.ArrayList; import java.util.ArrayList;
@ -49,9 +48,9 @@ import cn.yixblog.platform.http.HttpRequestResult;
/** /**
* Created by wangning on 05/01/2018. * Created by wangning on 05/01/2018.
*/ */
@SpringBootTest // @SpringBootTest
@ActiveProfiles({ "proxy", "alipay", "wechat", "jd", "bestpay" }) // @ActiveProfiles({ "local", "alipay", "wechat", "jd", "bestpay" })
@RunWith(SpringRunner.class) // @RunWith(SpringRunner.class)
public class CustomerImpressionImplTest { public class CustomerImpressionImplTest {
@Resource @Resource
private OrderMapper orderMapper; private OrderMapper orderMapper;
@ -202,8 +201,8 @@ public class CustomerImpressionImplTest {
JSONObject var = new JSONObject(); JSONObject var = new JSONObject();
var.put("client_moniker", client.getString("client_moniker")); var.put("client_moniker", client.getString("client_moniker"));
var.put("short_name", client.getString("short_name")); var.put("short_name", client.getString("short_name"));
JSONObject result = mailGunClient.addListMember(client.getString("contact_email"), "merchants@mail.royalpay.com.au", client.getString("contact_person"),"", JSONObject result = mailGunClient.addListMember(client.getString("contact_email"), "merchants@mail.royalpay.com.au", client.getString("contact_person"),
var); "", var);
} }
@Test @Test
@ -266,4 +265,115 @@ public class CustomerImpressionImplTest {
public void zxc() { public void zxc() {
weekReporter.generateReport("2018-06-04", false); weekReporter.generateReport("2018-06-04", false);
} }
@Test
public void royalpayIndustryTransform() {
String json = "[\n" + " {\n" + " \"children\": [\n" + " {\n" + " \"children\": [],\n" + " \"label\": \"机票\",\n"
+ " \"mccCode\": \"10001\"\n" + " },\n" + " {\n" + " \"children\": [],\n" + " \"label\": \"旅游行业\",\n"
+ " \"mccCode\": \"10002\"\n" + " },\n" + " {\n" + " \"children\": [],\n" + " \"label\": \"私人定制旅游\",\n"
+ " \"mccCode\": \"10003\"\n" + " },\n" + " {\n" + " \"children\": [],\n" + " \"label\": \"租车\",\n"
+ " \"mccCode\": \"10004\"\n" + " },\n" + " {\n" + " \"children\": [],\n" + " \"label\": \"巴士\",\n"
+ " \"mccCode\": \"10005\"\n" + " }\n" + " ],\n" + " \"label\": \"旅游出行\",\n" + " \"mccCode\": \"1\"\n" + " },\n" + " {\n"
+ " \"children\": [\n" + " {\n" + " \"children\": [],\n" + " \"label\": \"饭店\",\n" + " \"mccCode\": \"20001\"\n"
+ " },\n" + " {\n" + " \"children\": [],\n" + " \"label\": \"奶茶店\",\n" + " \"mccCode\": \"20002\"\n"
+ " },\n" + " {\n" + " \"children\": [],\n" + " \"label\": \"烧烤\",\n" + " \"mccCode\": \"20003\"\n"
+ " },\n" + " {\n" + " \"children\": [],\n" + " \"label\": \"火锅\",\n" + " \"mccCode\": \"20004\"\n"
+ " },\n" + " {\n" + " \"children\": [],\n" + " \"label\": \"Coffee\",\n" + " \"mccCode\": \"20005\"\n"
+ " },\n" + " {\n" + " \"children\": [],\n" + " \"label\": \"酒吧\",\n" + " \"mccCode\": \"20006\"\n" + " }\n"
+ " ],\n" + " \"label\": \"餐饮\",\n" + " \"mccCode\": \"2\"\n" + " },\n" + " {\n" + " \"children\": [\n" + " {\n"
+ " \"children\": [],\n" + " \"label\": \"培训类\",\n" + " \"mccCode\": \"30001\"\n" + " },\n" + " {\n"
+ " \"children\": [],\n" + " \"label\": \"移民留学\",\n" + " \"mccCode\": \"30002\"\n" + " },\n" + " {\n"
+ " \"children\": [],\n" + " \"label\": \"私人幼儿园\",\n" + " \"mccCode\": \"30003\"\n" + " }\n" + " ],\n"
+ " \"label\": \"教育\",\n" + " \"mccCode\": \"3\"\n" + " },\n" + " {\n" + " \"children\": [\n" + " {\n"
+ " \"children\": [],\n" + " \"label\": \"换汇\",\n" + " \"mccCode\": \"40001\"\n" + " },\n" + " {\n"
+ " \"children\": [],\n" + " \"label\": \"房产\",\n" + " \"mccCode\": \"40002\"\n" + " }\n" + " ],\n"
+ " \"label\": \"商务咨询\",\n" + " \"mccCode\": \"4\"\n" + " },\n" + " {\n" + " \"children\": [\n" + " {\n"
+ " \"children\": [],\n" + " \"label\": \"公众号服务商\",\n" + " \"mccCode\": \"50001\"\n" + " },\n" + " {\n"
+ " \"children\": [],\n" + " \"label\": \"各种媒体类宣传\",\n" + " \"mccCode\": \"50002\"\n" + " }\n" + " ],\n"
+ " \"label\": \"传媒\",\n" + " \"mccCode\": \"5\",\n"
+ " \"value\": \"{\\\"category\\\":\\\"SERVICE\\\",\\\"code\\\":\\\"7542\\\",\\\"description\\\":\\\"Car Washes\\\",\\\"parentCode\\\":\\\"S10\\\"}\"\n"
+ " },\n" + " {\n" + " \"children\": [\n" + " {\n" + " \"children\": [],\n" + " \"label\": \"美容院\",\n"
+ " \"mccCode\": \"60001\"\n" + " },\n" + " {\n" + " \"children\": [],\n" + " \"label\": \"医疗美容\",\n"
+ " \"mccCode\": \"60002\"\n" + " }\n" + " ],\n" + " \"label\": \"医美\",\n" + " \"mccCode\": \"6\"\n" + " },\n" + " {\n"
+ " \"children\": [\n" + " {\n" + " \"label\": \"超市\",\n" + " \"mccCode\": \"70001\"\n" + " },\n" + " {\n"
+ " \"children\": [],\n" + " \"label\": \"服装店\",\n" + " \"mccCode\": \"70002\"\n" + " },\n" + " {\n"
+ " \"children\": [],\n" + " \"label\": \"鞋店\",\n" + " \"mccCode\": \"70003\"\n" + " },\n" + " {\n"
+ " \"children\": [],\n" + " \"label\": \"珠宝店\",\n" + " \"mccCode\": \"70004\"\n" + " },{\n"
+ " \"children\": [],\n" + " \"label\": \"箱包\",\n" + " \"mccCode\": \"70005\"\n" + " }\n" + " ],\n"
+ " \"label\": \"零售\",\n" + " \"mccCode\": \"7\"\n" + " },\n" + " {\n" + " \"children\": [\n" + " {\n"
+ " \"children\": [],\n" + " \"label\": \"桌游吧\",\n" + " \"mccCode\": \"80001\"\n" + " },\n" + " {\n"
+ " \"children\": [],\n" + " \"label\": \"演唱会\",\n" + " \"mccCode\": \"80002\"\n" + " },\n" + " {\n"
+ " \"children\": [],\n" + " \"label\": \"马术训练\",\n" + " \"mccCode\": \"80003\"\n" + " },\n" + " {\n"
+ " \"children\": [],\n" + " \"label\": \"瑜伽\",\n" + " \"mccCode\": \"80004\"\n" + " },\n" + " {\n"
+ " \"children\": [],\n" + " \"label\": \"健身\",\n" + " \"mccCode\": \"80005\"\n" + " },\n" + " {\n"
+ " \"children\": [],\n" + " \"label\": \"社团\",\n" + " \"mccCode\": \"80006\"\n" + " },\n" + " {\n"
+ " \"children\": [],\n" + " \"label\": \"网吧\",\n" + " \"mccCode\": \"80007\"\n" + " },\n" + " {\n"
+ " \"children\": [],\n" + " \"label\": \"KTV\",\n" + " \"mccCode\": \"80008\"\n" + " },\n" + " {\n"
+ " \"children\": [],\n" + " \"label\": \"电影\",\n" + " \"mccCode\": \"80009\"\n" + " }\n" + " ],\n"
+ " \"label\": \"休闲娱乐\",\n" + " \"mccCode\": \"8\"\n" + " },\n" + " {\n" + " \"children\": [\n" + " {\n"
+ " \"children\": [],\n" + " \"label\": \"摄影\",\n" + " \"mccCode\": \"90001\"\n" + " },\n" + " {\n"
+ " \"children\": [],\n" + " \"label\": \"massage\",\n" + " \"mccCode\": \"90002\"\n" + " },\n" + " {\n"
+ " \"children\": [],\n" + " \"label\": \"通讯运营商\",\n" + " \"mccCode\": \"90003\"\n" + " },\n" + " {\n"
+ " \"children\": [],\n" + " \"label\": \"车行\",\n" + " \"mccCode\": \"90004\"\n" + " },\n" + " {\n"
+ " \"children:\":[],\n" + " \"label\":\"软件服务\",\n" + " \"mccCode\":\"90005\"\n" + " }\n" + " ],\n"
+ " \"label\": \"其他服务类\",\n" + " \"mccCode\": \"9\"\n" + " },\n" + " {\n" + " \"children\": [\n" + " {\n"
+ " \"children\": [],\n" + " \"label\": \"Hotel\",\n" + " \"mccCode\": \"100001\"\n" + " },\n" + " {\n"
+ " \"children\": [],\n" + " \"label\": \"Motel\",\n" + " \"mccCode\": \"100002\"\n" + " }\n" + " ],\n"
+ " \"label\": \"酒店\",\n" + " \"mccCode\": \"10\"\n" + " },\n" + " {\n" + " \"children\": [\n" + " {\n"
+ " \"children\": [],\n" + " \"label\": \"代购\",\n" + " \"mccCode\": \"110001\"\n" + " },\n" + " {\n"
+ " \"children\": [],\n" + " \"label\": \"物流(大宗出口贸易)\",\n" + " \"mccCode\": \"110002\"\n" + " },\n" + " {\n"
+ " \"children\": [],\n" + " \"label\": \"红酒出口\",\n" + " \"mccCode\": \"110003\"\n" + " },\n" + " {\n"
+ " \"children\": [],\n" + " \"label\": \"综合电商\",\n" + " \"mccCode\": \"110004\"\n" + " }\n" + " ],\n"
+ " \"label\": \"出口贸易\",\n" + " \"mccCode\": \"11\"\n" + " },\n" + " {\n" + " \"children\": [\n" + " {\n"
+ " \"children\": [],\n" + " \"label\": \"建材\",\n" + " \"mccCode\": \"120001\"\n" + " },\n" + " {\n"
+ " \"children\": [],\n" + " \"label\": \"家居\",\n" + " \"mccCode\": \"120002\"\n" + " }\n" + " ],\n"
+ " \"label\": \"家居建材\",\n" + " \"mccCode\": \"12\"\n" + " }\n" + "]";
JSONArray jsonArray = JSONObject.parseArray(json);
try {
XSSFWorkbook workbook = new XSSFWorkbook(new FileInputStream(new File("/Users/wangning/Desktop/asd.xlsx")));
XSSFSheet sheet = workbook.getSheetAt(0);
Iterator<Row> rowIterator = sheet.rowIterator();
Row row = null;
Cell cell = null;
while (rowIterator.hasNext()) {
row = rowIterator.next();
cell = row.getCell(2);
if (cell == null) {
continue;
}
cell.setCellType(HSSFCell.CELL_TYPE_STRING);
String industryChinese = recursionIndustry(jsonArray, cell.getStringCellValue());
cell.setCellValue(industryChinese);
}
OutputStream out = new FileOutputStream("/Users/wangning/Desktop/qwe.xlsx");
workbook.write(out);
workbook.close();
} catch (IOException e) {
e.printStackTrace();
}
}
public String recursionIndustry(JSONArray jsonArray, String mccCode) {
String result = "";
for (Object o : jsonArray) {
if(StringUtils.isNotEmpty(result)){
break;
}
JSONObject tmp = (JSONObject) o;
if (tmp.getString("mccCode").equals(mccCode)) {
result = tmp.getString("label");
}else {
if(tmp.getJSONArray("children")!=null){
result = recursionIndustry(tmp.getJSONArray("children"), mccCode);
}else {
result = "";
}
}
}
return result;
}
} }

@ -1,10 +1,13 @@
package au.com.royalpay.payment.manage.kira; package au.com.royalpay.payment.manage.kira;
import au.com.royalpay.payment.core.PaymentApi; import au.com.royalpay.payment.core.PaymentApi;
import au.com.royalpay.payment.manage.openim.core.CustomerServiceService;
import au.com.royalpay.payment.tools.connections.mpsupport.MpWechatApi; import au.com.royalpay.payment.tools.connections.mpsupport.MpWechatApi;
import au.com.royalpay.payment.tools.connections.mpsupport.MpWechatApiProvider; import au.com.royalpay.payment.tools.connections.mpsupport.MpWechatApiProvider;
import au.com.royalpay.payment.tools.connections.mpsupport.beans.TemplateMessage; import au.com.royalpay.payment.tools.connections.mpsupport.beans.TemplateMessage;
import com.alibaba.fastjson.JSONObject;
import org.junit.Test; import org.junit.Test;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.context.SpringBootTest;
@ -14,7 +17,7 @@ import org.springframework.test.context.junit4.SpringRunner;
import javax.annotation.Resource; import javax.annotation.Resource;
@SpringBootTest @SpringBootTest
@ActiveProfiles({"dev","alipay","wechat","jd","bestpay"}) @ActiveProfiles({"local","alipay","wechat","jd","bestpay"})
@RunWith(SpringRunner.class) @RunWith(SpringRunner.class)
public class WechatMessageTest { public class WechatMessageTest {
@ -22,6 +25,8 @@ public class WechatMessageTest {
private PaymentApi paymentApi; private PaymentApi paymentApi;
@Resource @Resource
private MpWechatApiProvider mpWechatApiProvider; private MpWechatApiProvider mpWechatApiProvider;
@Resource
private CustomerServiceService customerServiceService;
@Test @Test
public void asd(){ public void asd(){
@ -39,4 +44,34 @@ public class WechatMessageTest {
api.sendTemplateMessage(msg); api.sendTemplateMessage(msg);
} }
@Test
public void qwe(){
JSONObject param = new JSONObject();
param.put("uid","asd");
param.put("tuid","kira");
for (int i = 0; i < 10; i++) {
customerServiceService.addUnreadMsg(param);
}
param.put("uid","q1");
for (int i = 0; i < 45; i++) {
customerServiceService.addUnreadMsg(param);
}
JSONObject params = new JSONObject();
params.put("uid","asd");
params.put("tuid","asd");
for (int i = 0; i < 10; i++) {
customerServiceService.addUnreadMsg(params);
}
params.put("uid","q1");
for (int i = 0; i < 45; i++) {
customerServiceService.addUnreadMsg(params);
}
customerServiceService.sendUnreadWxMsg();
}
} }

Loading…
Cancel
Save