Merge remote-tracking branch 'origin/master'

master
yixian 8 years ago
commit 36ec9d4b6b

@ -611,4 +611,52 @@ CREATE TABLE `pre_apply_handle_log` (
ALTER TABLE `sys_client_pre_apply`
ADD COLUMN `status` tinyint(2) NULL DEFAULT 0 COMMENT '0:未处理1处理中2处理完成';
alter table sys_clients add column hfindustry varchar(10) DEFAULT NULL COMMENT 'HF行业';
alter table sys_clients add column hfindustry varchar(10) DEFAULT NULL COMMENT 'HF行业';
alter table financial_bd_prize_rate_config add column `kpi_range` smallint(6) NOT NULL;
alter table financial_bd_config add column `kpi_amount` decimal(15,2) DEFAULT NULL;
alter table financial_bd_prize_log add column `kpi_amount` decimal(15,2) DEFAULT NULL;
CREATE TABLE sys_permission_partner_modules (
id int(11) NOT NULL AUTO_INCREMENT,
module_name varchar(50) NOT NULL COMMENT '模块名称',
js_module varchar(50) DEFAULT NULL COMMENT 'js module name',
js_path varchar(255) DEFAULT NULL COMMENT 'js module path',
remark varchar(50) DEFAULT NULL,
PRIMARY KEY (id)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8mb4;
CREATE TABLE sys_permission_partner_modules_clients (
id bigint(20) NOT NULL,
client_id int(11) NOT NULL COMMENT '客户编号',
client_moniker varchar(20) NOT NULL COMMENT '客户简写识别码',
module_id int(11) NOT NULL COMMENT '模块id',
is_valid tinyint(1) DEFAULT '1' COMMENT '1:启用,0:不启用',
PRIMARY KEY (id),
UNIQUE KEY unique_client_id_module_id (client_id,module_id),
KEY index_client_id (client_id),
KEY index_client_moniker (client_moniker)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE sys_permission_partner_functions (
func_id varchar(80) NOT NULL,
module_id int(11) DEFAULT NULL COMMENT '模块id',
role int(11) NOT NULL DEFAULT '0' COMMENT '有权限角色(mask)',
class_name varchar(30) NOT NULL COMMENT '类名',
method_name varchar(50) NOT NULL COMMENT '方法名',
uri varchar(200) NOT NULL COMMENT '请求地址',
req_methods varchar(50) NOT NULL,
module varchar(30) DEFAULT NULL COMMENT '所属模块',
name varchar(50) DEFAULT NULL COMMENT '别名(用于前端按钮指定权限)',
remark varchar(50) DEFAULT NULL COMMENT '备注',
is_valid tinyint(1) DEFAULT '1' COMMENT '是否有效',
PRIMARY KEY (func_id),
UNIQUE KEY uk_func_name (name)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE `act_charity` (
`client_id` int(11) DEFAULT NULL,
`client_moniker` varchar(20) NOT NULL COMMENT '客户简写识别码',
`active_time` date DEFAULT NULL,
PRIMARY KEY (`client_moniker`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

@ -687,7 +687,7 @@
* @apiDescription
* 接入微信小程序需完成海外主体认证并且认证主体需要与在RoyalPay开通的商户主体一致具体如何认证请查看微信公众平台相关文档
* 用于小程序中发起支付创建订单后返回小程序支付所需参数该接口现仅支持微信小程序
* <a href="https://www.royalpay.com.au/downloads/ProductIdList.xlsx"> 接入参考文档</a>
* <a href="https://www.royalpay.com.au/downloads/MiniProgram_WechatPay.pdf"> 接入参考文档</a>
* <br>
* <img src="img/microapp_cn.png">
* @apiVersion 1.0.0

@ -0,0 +1,33 @@
package au.com.royalpay.payment.manage.actchairty.beans;
import au.com.royalpay.payment.tools.exceptions.BadRequestException;
import com.alibaba.fastjson.annotation.JSONField;
import org.apache.commons.lang3.time.DateUtils;
import java.math.BigDecimal;
import java.text.ParseException;
import java.util.Date;
/**
* Created by yangluo on 2018/7/9.
*/
public class ActChairtyBean {
@JSONField(name = "date")
private String date;
public String getDate() {
return date;
}
public void setDate(String date) {
this.date = date;
}
public java.util.Date toDate() {
try {
return DateUtils.parseDate(date, new String[]{"yyyy-MM-dd"});
} catch (ParseException e) {
throw new BadRequestException("Invalid To Date");
}
}
}

@ -0,0 +1,75 @@
package au.com.royalpay.payment.manage.actchairty.beans;
import au.com.royalpay.payment.core.exceptions.ParamInvalidException;
import com.alibaba.fastjson.JSONObject;
import org.apache.commons.lang3.time.DateUtils;
import java.text.ParseException;
import java.util.Date;
/**
* redpack query
* Created by davep on 2016-08-03.
*/
public class ActChairtyQuery {
private static final String[] DATE_PATTERNS = {"yyyyMMdd", "yyyy-MM-dd"};
private String begin;
private String end;
private int page = 1;
private int limit = 20;
public JSONObject params() {
JSONObject param = new JSONObject();
if (begin != null) {
try {
Date fromDate = DateUtils.parseDate(begin, DATE_PATTERNS);
param.put("begin", fromDate);
} catch (ParseException e) {
throw new ParamInvalidException("begin", "error.payment.valid.invalid_date_format");
}
}
if (end != null) {
try {
Date fromDate = DateUtils.addDays(DateUtils.parseDate(end, DATE_PATTERNS), 1);
param.put("end", fromDate);
} catch (ParseException e) {
throw new ParamInvalidException("end", "error.payment.valid.invalid_date_format");
}
}
param.put("page",page);
param.put("limit",limit);
return param;
}
public String getBegin() {
return begin;
}
public void setBegin(String begin) {
this.begin = begin;
}
public String getEnd() {
return end;
}
public void setEnd(String end) {
this.end = end;
}
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;
}
}

@ -0,0 +1,29 @@
package au.com.royalpay.payment.manage.actchairty.core;
import au.com.royalpay.payment.manage.actchairty.beans.ActChairtyBean;
import com.alibaba.fastjson.JSONObject;
import com.github.miemiedev.mybatis.paginator.domain.PageList;
import java.util.List;
/**
* Created by yangluo on 2018/7/9.
*/
public interface ActChairtyService {
void configClient(String clientMoniker, ActChairtyBean config, JSONObject manager);
JSONObject listChairClients(int page, int limit);
List<JSONObject> getWeekendAnalysis(JSONObject params);
PageList<JSONObject> getClientRank(JSONObject params);
JSONObject gettotal();
}

@ -0,0 +1,145 @@
package au.com.royalpay.payment.manage.actchairty.core.impls;
import au.com.royalpay.payment.core.exceptions.InvalidShortIdException;
import au.com.royalpay.payment.manage.actchairty.beans.ActChairtyBean;
import au.com.royalpay.payment.manage.actchairty.core.ActChairtyService;
import au.com.royalpay.payment.manage.mappers.act.ActChairtyMapper;
import au.com.royalpay.payment.manage.merchants.core.ClientManager;
import au.com.royalpay.payment.tools.utils.PageListUtils;
import com.alibaba.fastjson.JSONObject;
import com.github.miemiedev.mybatis.paginator.domain.PageBounds;
import com.github.miemiedev.mybatis.paginator.domain.PageList;
import org.apache.commons.lang3.time.DateFormatUtils;
import org.apache.commons.lang3.time.DateUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.math.BigDecimal;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
/**
* Created by yangluo on 2018/7/9.
*/
@Service
public class ActChairtyServiceImp implements ActChairtyService {
Logger logger = LoggerFactory.getLogger(getClass());
@Resource
private ClientManager clientManager;
@Resource
private ActChairtyMapper actChairtyMapper;
@Override
public void configClient(String clientMoniker, ActChairtyBean config, JSONObject manager) {
JSONObject client = clientManager.getClientInfoByMoniker(clientMoniker);
if (client == null) {
throw new InvalidShortIdException();
}
JSONObject findChairty = actChairtyMapper.findChairtyClient(clientMoniker);
if (findChairty == null) {
JSONObject chairtyClient = new JSONObject();
chairtyClient.put("client_id", client.get("client_id"));
chairtyClient.put("client_moniker", clientMoniker);
chairtyClient.put("active_time", config.toDate());
actChairtyMapper.save(chairtyClient);
}
}
@Override
public JSONObject listChairClients(int page, int limit) {
PageList<JSONObject> clients = actChairtyMapper.chairtyClientNum(new PageBounds(page, limit));
for (JSONObject client : clients){
client.put("client_moniker", client.getString("client_moniker"));
client.put("active_time", DateFormatUtils.format(client.getDate("active_time"), "yyyy/MM/dd"));
BigDecimal bg = new BigDecimal(client.getIntValue("count_ordernum") * 0.01);
double f1 = bg.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
client.put("chairty_num", f1);
}
return PageListUtils.buildPageListResult(clients);
}
@Override
public List<JSONObject> getWeekendAnalysis(JSONObject params) {
List<JSONObject> result = new ArrayList<>();
List<JSONObject> getAnalysis = actChairtyMapper.getChairtyWeekAnalysis(params.getDate("begin"), params.getDate("end"));
DateFormatUtils df = new DateFormatUtils();
Calendar cal = Calendar.getInstance();
cal.setTime(params.getDate("begin"));
cal.add(cal.DAY_OF_MONTH, -1);
long beginTime = params.getDate("begin").getTime();
long endTime = params.getDate("end").getTime();
long betweenDays = (long)((endTime - beginTime) / (1000 * 60 * 60 *24));
List<String> weekStart = new ArrayList<>();
for(int i=0;i<=betweenDays;i++){
cal.add(cal.DAY_OF_MONTH, 1);//DATE=日
if ((cal.get(Calendar.DAY_OF_WEEK)) == 2) {
weekStart.add(df.format(cal.getTime(),"yyyy-MM-dd"));
}
}
for(int i=0;i<weekStart.size();i++){
JSONObject weekDay = new JSONObject();
BigDecimal count_ordernum = new BigDecimal(0);
BigDecimal sum_ordernum = new BigDecimal(0);
String weekS = weekStart.get(i);
try {
Date dateStar = DateUtils.parseDate(weekS,"yyyy-MM-dd");
Date dateEnd = DateUtils.addDays(dateStar, 7);
for (int b = 0; b < getAnalysis.size(); b++) {
long orderDate = getAnalysis.get(b).getDate("orderdate").getTime();
if (orderDate >= dateStar.getTime() && orderDate < dateEnd.getTime()) {
count_ordernum = count_ordernum.add(getAnalysis.get(b).getBigDecimal("count_ordernum"));
sum_ordernum = sum_ordernum.add(getAnalysis.get(b).getBigDecimal("sum_ordernum"));
}
}
BigDecimal chairty = new BigDecimal(0.01);
BigDecimal chairty_amount = count_ordernum.multiply(chairty);
BigDecimal f1 = sum_ordernum.setScale(2, BigDecimal.ROUND_HALF_UP);
BigDecimal f2 = chairty_amount.setScale(2, BigDecimal.ROUND_HALF_UP);
weekDay.put("weekstart", weekStart.get(i));
weekDay.put("count_ordernum", count_ordernum);
weekDay.put("sum_ordernum", f1);
weekDay.put("chairty_amount",f2 );
result.add(weekDay);
} catch (Exception e) {
logger.info("Act_Chairty Error:",e);
}
}
return result;
}
@Override
public PageList<JSONObject> getClientRank(JSONObject params) {
PageList<JSONObject> getChairtyWeekRaking = actChairtyMapper.getChairtyWeekRaking(params.getDate("begin"), params.getDate("end"),new PageBounds(params.getIntValue("page"), params.getIntValue("limit")));
return getChairtyWeekRaking;
}
@Override
public JSONObject gettotal() {
List<JSONObject> gettotalnum = actChairtyMapper.chairtyClientNum();
BigDecimal amount= new BigDecimal(0) ;
double chairty=0.00;
for (JSONObject gettotals : gettotalnum) {
amount = amount.add(gettotals.getBigDecimal("sum_ordernum"));
chairty += gettotals.getIntValue("count_ordernum") * 0.01;
}
BigDecimal bg = new BigDecimal(chairty);
double f1 = amount.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
double f2 = bg.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
JSONObject gettotal = new JSONObject();
gettotal.put("amount", f1);
gettotal.put("chairty", f2);
return gettotal;
}
}

@ -0,0 +1,62 @@
package au.com.royalpay.payment.manage.actchairty.web;
import au.com.royalpay.payment.manage.actchairty.beans.ActChairtyBean;
import au.com.royalpay.payment.manage.actchairty.beans.ActChairtyQuery;
import au.com.royalpay.payment.manage.actchairty.core.ActChairtyService;
import au.com.royalpay.payment.manage.cashback.core.CashbackService;
import au.com.royalpay.payment.manage.management.clearing.core.SettleDelayConfigurer;
import au.com.royalpay.payment.manage.permission.manager.ManagerMapping;
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 au.com.royalpay.payment.tools.utils.PageListUtils;
import com.alibaba.fastjson.JSONObject;
import com.github.miemiedev.mybatis.paginator.domain.PageList;
import org.springframework.validation.Errors;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import javax.validation.Valid;
import java.util.List;
/**
* Created by yangluo on 2018/7/9.
*/
@RequestMapping(value = "/actchairty")
@RestController
public class ActChairtyController {
@Resource
private ActChairtyService actChairtyService;
@ManagerMapping(value = "/clients", method = RequestMethod.GET, role = { ManagerRole.ADMIN,ManagerRole.OPERATOR,ManagerRole.SITE_MANAGER })
public JSONObject listAttendingClients(@RequestParam(defaultValue = "1") int page, @RequestParam(defaultValue = "10") int limit) {
// todo params
return actChairtyService.listChairClients(page, limit);
}
@ManagerMapping(value = "/clients/{clientMoniker}", method = RequestMethod.PUT, role = { ManagerRole.ADMIN,ManagerRole.OPERATOR,ManagerRole.SITE_MANAGER })
public void configClient(@PathVariable String clientMoniker, @RequestBody @Valid ActChairtyBean config, Errors errors,
@ModelAttribute(CommonConsts.MANAGER_STATUS) JSONObject manager) {
HttpUtils.handleValidErrors(errors);
actChairtyService.configClient(clientMoniker, config, manager);
}
@ManagerMapping(value = "/traAnalysis", method = RequestMethod.GET, role = { ManagerRole.ADMIN,ManagerRole.OPERATOR,ManagerRole.SITE_MANAGER })
public List<JSONObject> traAnalysis(ActChairtyQuery params) {
return actChairtyService.getWeekendAnalysis(params.params());
}
@ManagerMapping(value = "/ranking", method = RequestMethod.GET, role = { ManagerRole.ADMIN,ManagerRole.OPERATOR,ManagerRole.SITE_MANAGER })
public JSONObject getRanking(ActChairtyQuery params) {
PageList<JSONObject> clientRank = actChairtyService.getClientRank(params.params());
if(clientRank==null){
return null;
}
return PageListUtils.buildPageListResult(clientRank);
}
@ManagerMapping(value = "/total", method = RequestMethod.GET, role = { ManagerRole.ADMIN,ManagerRole.OPERATOR,ManagerRole.SITE_MANAGER })
public JSONObject getTotal() {
return actChairtyService.gettotal();
}
}

@ -1160,6 +1160,7 @@ public class RetailAppServiceImp implements RetailAppService {
JSONObject unReadParams = new JSONObject();
unReadParams.put("client_id", client_id);
unReadParams.put("status", 0);
unReadParams.put("is_to_app",1);
int counts = noticePartnerMapper.countNoticePartner(unReadParams);
notice.put("unReadCounts", counts);
notice.put("type", "notice");
@ -1268,6 +1269,10 @@ public class RetailAppServiceImp implements RetailAppService {
if (AlipayOnline.containsKey("channel")) {
channels.add(AlipayOnline);
}
JSONObject Hf = getChannel(clientId,now,"hf");
if (Hf.containsKey("channel")){
channels.add(Hf);
}
res.put("channels", channels);
return res;
}

@ -12,7 +12,7 @@ import com.alibaba.fastjson.JSONObject;
* Created by yixian on 2017-02-07.
*/
public interface BDPrizeService {
void generateRecord();
void generateRecord(String month);
@Transactional
void recordGenerateProcess(Calendar now);
@ -38,4 +38,6 @@ public interface BDPrizeService {
void insertOrUpdateCommissionConfig(String month, List<JSONObject> config, JSONObject manager) throws ParseException;
void deleteCommConfig(String config_id);
void updateBdKpiConfig(List<JSONObject> configs, JSONObject manager)throws ParseException;
}

@ -78,10 +78,10 @@ public class BDPrizeServiceImpl implements BDPrizeService {
private static BigDecimal percent = new BigDecimal(100);
private static String[] channels = new String[]{"Wechat", "Alipay", "Bestpay", "jd", "AlipayOnline"};
private static String[] channels = new String[]{"Wechat", "Alipay", "Bestpay", "jd", "AlipayOnline","hf"};
@Override
public void generateRecord() {
public void generateRecord(String month) {
if (backupSystem) {
throw new ServerErrorException("Updating System,wait for a moment");
}
@ -89,9 +89,15 @@ public class BDPrizeServiceImpl implements BDPrizeService {
throw new ServerErrorException("Processing task, wait for a moment");
}
try {
final Calendar now = Calendar.getInstance();
DateUtils.truncate(now, Calendar.MONTH);
now.add(Calendar.MONTH, -1);
SimpleDateFormat sdf= new SimpleDateFormat("yyyy-MM");
Date date = null;
try {
date = sdf.parse(month);
} catch (ParseException e) {
e.printStackTrace();
}
Calendar now = Calendar.getInstance();
now.setTime(date);
recordGenerateProcess(now);
} finally {
@ -133,10 +139,14 @@ public class BDPrizeServiceImpl implements BDPrizeService {
}
}
//BD Leader Prize
//bd_type:1 销售总监 2 大客户经理 3悉尼分公司经理 4 COO 5 NGDepartment
//todo 10月开始悉尼分公司经理不享受悉尼销售组提成
List<JSONObject> bdLeaders = managerMapper.listByRole(1, ManagerRole.BD_LEADER.getMask());
for (JSONObject leader : bdLeaders) {
BigDecimal groupAmount = transactionMapper.TotalAmountForBDLeaderPrize(now.get(Calendar.YEAR), now.get(Calendar.MONTH) + 1,leader.getString("manager_id"));
JSONObject rateJson = financialBDCommissionConfigMapper.findCurrentCommissionRate(month, groupAmount.toString(), 1);
JSONObject bdConfig = financialBDConfigMapper.getBdConfig(leader.getString("manager_id"));
int bd_type = bdConfig ==null?2:("Sydney").equals(bdConfig.getString("city"))?2:1;//sydney leader 即悉尼大客户经理
JSONObject rateJson = financialBDCommissionConfigMapper.findCurrentCommissionRate(month, groupAmount.toString(), bd_type);
BigDecimal groupPrize = new BigDecimal(0);
if (rateJson != null) {
groupPrize = groupAmount.multiply(new BigDecimal(rateJson.getString("commission_rate")).divide(percent)).setScale(2, BigDecimal.ROUND_DOWN);
@ -212,28 +222,44 @@ public class BDPrizeServiceImpl implements BDPrizeService {
DateTime monthDate = new DateTime(month);
//bd manager commission
JSONObject cityPrizeLog = new JSONObject();
cityPrizeLog.put("total_amount", cplTotalprize);
JSONObject cplRate = financialBDCommissionConfigMapper.findCurrentCommissionRate(month, cplTotalprize.toString(), 2);
if (cplRate == null) {
cityPrizeLog.put("total_prize", 0.00);
// JSONObject cityPrizeLog = new JSONObject();
// cityPrizeLog.put("total_amount", cplTotalprize);
// JSONObject cplRate = financialBDCommissionConfigMapper.findCurrentCommissionRate(month, cplTotalprize.toString(), 2);
// if (cplRate == null) {
// cityPrizeLog.put("total_prize", 0.00);
// } else {
// BigDecimal _commission_rate = new BigDecimal(cplRate.getString("commission_rate"));
// BigDecimal _total_amount = new BigDecimal(cityPrizeLog.getString("total_amount"));
// BigDecimal total_prize = _total_amount.multiply(_commission_rate.divide(percent)).setScale(2, BigDecimal.ROUND_DOWN);
// cityPrizeLog.put("total_prize", total_prize);
// }
// report.put("cityPrizeLogs", cityPrizeLog);
//bd_type=3 悉尼分公司经理 悉尼销售组和大客户组流水提成
JSONObject sydneyPrizeLog = new JSONObject();
BigDecimal sydneyAmount = transactionMapper.TotalAmountForSydneyGMPrize(monthDate.getYear(), monthDate.getMonthOfYear());
sydneyPrizeLog.put("total_amount",sydneyAmount);
JSONObject sydneyGMRate = financialBDCommissionConfigMapper.findCurrentCommissionRate(month, sydneyAmount.toString(), 3);
if (sydneyGMRate == null) {
sydneyPrizeLog.put("total_prize", 0.00);
} else {
BigDecimal _commission_rate = new BigDecimal(cplRate.getString("commission_rate"));
BigDecimal _total_amount = new BigDecimal(cityPrizeLog.getString("total_amount"));
BigDecimal total_prize = _total_amount.multiply(_commission_rate.divide(percent)).setScale(2, BigDecimal.ROUND_DOWN);
cityPrizeLog.put("total_prize", total_prize);
BigDecimal sydney_commission_rate = new BigDecimal(sydneyGMRate.getString("commission_rate"));
BigDecimal total_prize = sydneyAmount.multiply(sydney_commission_rate.divide(percent)).setScale(2, BigDecimal.ROUND_DOWN);
sydneyPrizeLog.put("total_prize", total_prize);
}
report.put("cityPrizeLogs", cityPrizeLog);
report.put("sydneyPrizeLog", sydneyPrizeLog);
//Director commission
JSONObject directPrizeLogs = new JSONObject();
//COO & NJ commission
JSONObject params = new JSONObject();
params.put("begin", TimeZoneUtils.beginDate(TimeZoneUtils.getFirstDay(monthDate.toString())));
params.put("end", TimeZoneUtils.getPerFirstDayOfMonth(TimeZoneUtils.getLastDay(monthDate.toString())));
BigDecimal totalprize = transactionAnalysisMapper.analysisTotalAmount(params);
JSONObject directPrizeLogs = new JSONObject();
directPrizeLogs.put("total_amount", totalprize);
JSONObject rate = financialBDCommissionConfigMapper.findCurrentCommissionRate(month, totalprize.toString(), 3);
JSONObject rate = financialBDCommissionConfigMapper.findCurrentCommissionRate(month, totalprize.toString(), 4);
if (rate == null) {
directPrizeLogs.put("total_prize", 0.00);
} else {
@ -243,6 +269,18 @@ public class BDPrizeServiceImpl implements BDPrizeService {
directPrizeLogs.put("total_prize", total_prize);
}
report.put("directPrizeLogs", directPrizeLogs);
JSONObject ngDepartmentPrizeLog = new JSONObject();
ngDepartmentPrizeLog.put("total_amount", totalprize);
JSONObject ngRate = financialBDCommissionConfigMapper.findCurrentCommissionRate(month, totalprize.toString(), 5);
if (ngRate == null) {
ngDepartmentPrizeLog.put("total_prize", 0.00);
} else {
BigDecimal ng_commission_rate = new BigDecimal(ngRate.getString("commission_rate"));
BigDecimal ng_total_prize = totalprize.multiply(ng_commission_rate.divide(percent)).setScale(2, BigDecimal.ROUND_DOWN);
ngDepartmentPrizeLog.put("total_prize", ng_total_prize);
}
report.put("ngDepartmentPrizeLog", ngDepartmentPrizeLog);
return report;
}
@ -418,5 +456,12 @@ public class BDPrizeServiceImpl implements BDPrizeService {
return firLasDay;
}
@Override
public void updateBdKpiConfig(List<JSONObject> configs, JSONObject manager) throws ParseException {
for (JSONObject config : configs){
config.put("LAST_UPDATE_DATE", new Date());
config.put("LAST_UPDATE_BY", manager.getString("display_name"));
financialBDConfigMapper.updateBDConfig(config);
}
}
}

@ -46,16 +46,16 @@ public class BDPrizeCalculatorDefaultImpl implements BDPrizeCalculator {
public BDPrizeCalculatorDefaultImpl rateConfig(List<JSONObject> rateConfig) {
for (JSONObject rateCfgItem : rateConfig) {
int level = rateCfgItem.getIntValue("bd_level");
int monthLevel = rateCfgItem.getIntValue("time_range");
int kpiRange = rateCfgItem.getIntValue("kpi_range");
Map<Integer, List<JSONObject>> rates = rateConfigMap.get(level);
if (rates == null) {
rates = new HashMap<>();
rateConfigMap.put(level, rates);
}
List<JSONObject> rate = rates.get(monthLevel);
List<JSONObject> rate = rates.get(kpiRange);
if (rate == null) {
rate = new ArrayList<>();
rates.put(monthLevel, rate);
rates.put(kpiRange, rate);
}
rate.add(rateCfgItem);
}
@ -81,18 +81,28 @@ public class BDPrizeCalculatorDefaultImpl implements BDPrizeCalculator {
JSONObject bd = bdMap.get(resultItem.getKey());
int bdLevel = bd.getIntValue("bd_level");
log.put("bd_level", bdLevel);
log.put("kpi_amount", bd.getBigDecimal("kpi_amount"));
log.put("bd_name", bd.getString("bd_name"));
log.put("total_amount", 0);
log.put("total_prize", 0);
log.put("total_donation", 0);
BigDecimal totalAmount = log.getBigDecimal("total_amount");
List<JSONObject> details = new ArrayList<>();
for (Map.Entry<String, JSONObject> detail : resultItem.getValue().entrySet()) {
JSONObject detailItem = detail.getValue();
BigDecimal totalTransaction = detailItem.getBigDecimal("total_transaction");
BigDecimal coefficient = detailItem.getBigDecimal("coefficient");
BigDecimal realTransaction = totalTransaction.multiply(coefficient).setScale(2,BigDecimal.ROUND_DOWN);
totalAmount = totalAmount.add(realTransaction);
}
for (Map.Entry<String, JSONObject> detail : resultItem.getValue().entrySet()) {
JSONObject detailItem = detail.getValue();
int clientId = detailItem.getIntValue("client_id");
int months = detailItem.getIntValue("client_create_months");
BigDecimal bdRate = getRate(bdLevel, months, detailItem.getIntValue("client_source"), detailItem.getBigDecimal("rate_value"));
// int months = detailItem.getIntValue("client_create_months");
BigDecimal totalTransaction = detailItem.getBigDecimal("total_transaction");
BigDecimal coefficient = detailItem.getBigDecimal("coefficient");
int prizeLevel = getKpiPrizeLevel(totalAmount,log.getBigDecimal("kpi_amount"));
BigDecimal bdRate = getNewRate(bdLevel, prizeLevel, detailItem.getIntValue("client_source"), detailItem.getBigDecimal("rate_value"));
BigDecimal prizeValue = totalTransaction.multiply(coefficient).multiply(bdRate).divide(BigDecimal.valueOf(100), 2, BigDecimal.ROUND_DOWN);
BigDecimal donation = BigDecimal.ZERO;
if (clientsWithBDAwayDeterminor.clientWithBDAway(clientId, month)) {
@ -208,4 +218,42 @@ public class BDPrizeCalculatorDefaultImpl implements BDPrizeCalculator {
}
throw new ServerErrorException("Prize Rate Config has no equalize:bdLevel=" + bdLevel + ",months=" + months + ",clientRate=" + clientRate.doubleValue());
}
private BigDecimal getNewRate(int bdLevel, int kpiRange, int clientSource, BigDecimal clientRate) {
BigDecimal prizeRate = BigDecimal.ZERO;
Map<Integer, List<JSONObject>> rates = rateConfigMap.get(bdLevel);
List<JSONObject> rate = rates.get(kpiRange);
for (JSONObject rateCfg : rate) {
if (rateCfg.getBigDecimal("rate_from").compareTo(clientRate) <= 0 && rateCfg.getBigDecimal("rate_to").compareTo(clientRate) >= 0) {
prizeRate= rateCfg.getBigDecimal("prize_rate");
continue;
}
}
if (clientSource == 1) {
return prizeRate;
} else {
return prizeRate.divide(BigDecimal.valueOf(2),3,BigDecimal.ROUND_HALF_DOWN);
}
}
private int getKpiPrizeLevel(BigDecimal transactionAmount,BigDecimal kpiAmount){
if (kpiAmount.compareTo(BigDecimal.ZERO)==0){//未设置kpi金额的按照最小完成度来计算
return 1;
}
BigDecimal rate = transactionAmount.divide(kpiAmount,2,BigDecimal.ROUND_HALF_DOWN);
if (rate.compareTo(BigDecimal.valueOf(0.5))<0){
return 1;
}
if (rate.compareTo(BigDecimal.valueOf(0.8))<0){
return 2;
}
if (rate.compareTo(BigDecimal.valueOf(1))<0){
return 3;
}
if (rate.compareTo(BigDecimal.valueOf(1.2))<0){
return 4;
}
return 5;
}
}

@ -29,9 +29,9 @@ public class BDPrizeController {
@Resource
private BDPrizeService bdPrizeService;
@ManagerMapping(value = "/generate_record", method = RequestMethod.POST, role = {ManagerRole.FINANCIAL_STAFF, ManagerRole.ADMIN})
public void generateRecord() {
bdPrizeService.generateRecord();
@ManagerMapping(value = "/generate_record/{month}", method = RequestMethod.POST, role = {ManagerRole.FINANCIAL_STAFF, ManagerRole.ADMIN})
public void generateRecord(@PathVariable String month) {
bdPrizeService.generateRecord(month);
}
@ManagerMapping(value = "/records", method = RequestMethod.GET, role = {ManagerRole.FINANCIAL_STAFF, ManagerRole.BD_USER})
@ -92,4 +92,9 @@ public class BDPrizeController {
public List<JSONObject> newCommissionConfig(@ModelAttribute(CommonConsts.MANAGER_STATUS) JSONObject manager) throws ParseException {
return bdPrizeService.listNeedConfigCommission();
}
@ManagerMapping(value = "/commission/kpi/update/{month}",method = RequestMethod.POST, role = {ManagerRole.FINANCIAL_STAFF, ManagerRole.ADMIN})
public void updatKpiConfig(@PathVariable String month , @RequestBody List<JSONObject> info , @ModelAttribute(CommonConsts.MANAGER_STATUS) JSONObject manager) throws ParseException {
bdPrizeService.updateBdKpiConfig(info,manager);
}
}

@ -76,7 +76,7 @@ public class CashierManageController {
@PartnerMapping(value = "/orders/{cashier_id}", method = RequestMethod.GET)
@ResponseBody
public JSONObject getPartnerCashierOrders(@PathVariable String cashier_id, @ModelAttribute(CommonConsts.PARTNER_STATUS) JSONObject partner,
public JSONObject getPartnerCashierOrdersById(@PathVariable String cashier_id, @ModelAttribute(CommonConsts.PARTNER_STATUS) JSONObject partner,
CashierQueryBean query) {
return cashierOrderService.listCashierOrders(cashier_id, partner, query);
}

@ -30,4 +30,6 @@ public interface EncourageService {
JSONObject listReceiveLogs(String eventId, ReceiveLogQueryBean query);
JSONObject listUseLogs(String eventId, int page, int limit);
void prepareUserInfo(JSONObject user, String user_id);
}

@ -1,27 +1,7 @@
package au.com.royalpay.payment.manage.customers.core.impls;
import java.math.BigDecimal;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import javax.annotation.Resource;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.RandomUtils;
import org.apache.commons.lang3.time.DateFormatUtils;
import org.apache.commons.lang3.time.DateUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.core.Ordered;
import org.springframework.stereotype.Service;
import com.alibaba.fastjson.JSONObject;
import com.github.miemiedev.mybatis.paginator.domain.Order;
import com.github.miemiedev.mybatis.paginator.domain.PageBounds;
import com.github.miemiedev.mybatis.paginator.domain.PageList;
import au.com.royalpay.payment.channels.wechat.config.WeChatPayConfig;
import au.com.royalpay.payment.channels.wechat.config.WechatPayEnvironment;
import au.com.royalpay.payment.core.TransactionService;
import au.com.royalpay.payment.manage.customers.beans.EncourageEventParameters;
import au.com.royalpay.payment.manage.customers.beans.ReceiveLogQueryBean;
@ -32,13 +12,38 @@ import au.com.royalpay.payment.manage.mappers.customers.CustomerEncourageMoneyUs
import au.com.royalpay.payment.manage.mappers.customers.CustomerMembershipMapper;
import au.com.royalpay.payment.manage.mappers.payment.OrderMapper;
import au.com.royalpay.payment.manage.mappers.system.CustomerMapper;
import au.com.royalpay.payment.manage.mappers.system.ManagerCustomerRelationAlipayMapper;
import au.com.royalpay.payment.manage.mappers.system.ManagerMapper;
import au.com.royalpay.payment.tools.CommonConsts;
import au.com.royalpay.payment.tools.connections.mpsupport.MpWechatApi;
import au.com.royalpay.payment.tools.connections.mpsupport.MpWechatApiProvider;
import au.com.royalpay.payment.tools.exceptions.BadRequestException;
import au.com.royalpay.payment.tools.exceptions.NotFoundException;
import au.com.royalpay.payment.tools.permission.enums.ManagerRole;
import au.com.royalpay.payment.tools.utils.PageListUtils;
import com.alibaba.fastjson.JSONObject;
import com.github.miemiedev.mybatis.paginator.domain.Order;
import com.github.miemiedev.mybatis.paginator.domain.PageBounds;
import com.github.miemiedev.mybatis.paginator.domain.PageList;
import org.apache.commons.lang3.RandomUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.time.DateFormatUtils;
import org.apache.commons.lang3.time.DateUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.core.Ordered;
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import javax.annotation.Resource;
/**
* Created by yixian on 2017-04-24.
*/
@ -57,11 +62,15 @@ public class EncourageUseProcessor implements Ordered, EncourageService {
@Resource
private TransactionService transactionService;
@Resource
private MpWechatApiProvider mpWechatApiProvider;
@Resource
private CustomerMapper customerMapper;
@Resource
private ManagerMapper managerMapper;
@Resource
private OrderMapper orderMapper;
@Resource
private ManagerCustomerRelationAlipayMapper managerCustomerRelationAlipayMapper;
@Override
public int getOrder() {
@ -76,6 +85,7 @@ public class EncourageUseProcessor implements Ordered, EncourageService {
@Override
public JSONObject takeEncourageMoney(String orderId, String visitorOpenId) {
logger.info("=====takeEncourageMoney+" + orderId);
JSONObject config = currentEncourageConfig();
if (config != null) {
if (customerEncourageMoneyAccessLogMapper.findByOrderId(orderId) != null) {
@ -94,29 +104,64 @@ public class EncourageUseProcessor implements Ordered, EncourageService {
logger.debug("不在有效期");
return new JSONObject();
}
if (!StringUtils.equals(openId, visitorOpenId)) {
logger.debug("不是同一人");
return new JSONObject();
String channel = order.getString("channel");
if ("Wechat".equals(channel)) {
JSONObject relation = customerMapper.findCustomerByOpenId(visitorOpenId);
if (relation == null) {
logger.debug("用户关系不存在");
return new JSONObject();
}
JSONObject wxUser = customerMapper.findCustomerByOpenId(visitorOpenId);
String merchantId = order.getString("merchant_id");
WeChatPayConfig.Merchant mch = WechatPayEnvironment.getEnv().getMerchantConfig(merchantId);
MpWechatApi api = mpWechatApiProvider.getApi(mch.getMpId());
if (!StringUtils.equals(wxUser.getString(api.getOpenIdKey()), openId)) {
logger.debug("不是同一人");
return new JSONObject();
}
}
if ("Alipay".equals(channel)) {
if (!StringUtils.equals(visitorOpenId, openId)) {
logger.debug("不是同一人");
return new JSONObject();
}
}
if (config.getBooleanValue("debug_mode") && !checkIsDeveloper(openId)) {
if (config.getBooleanValue("debug_mode") && !checkIsDeveloper(visitorOpenId)) {
logger.debug("测试模式,不是管理员");
return new JSONObject();
}
JSONObject member = customerMembershipMapper.findByPaymentOpenId(openId);
JSONObject member = customerMembershipMapper.findByPaymentOpenId(visitorOpenId);
if (member == null) {
member = new JSONObject();
JSONObject relation = customerMapper.findCustomerByOpenId(openId);
if (relation == null) {
logger.debug("用户关系不存在");
return new JSONObject();
if ("Wechat".equals(channel)) {
JSONObject relation = customerMapper.findCustomerByOpenId(visitorOpenId);
if (relation == null) {
logger.debug("用户关系不存在");
return new JSONObject();
}
member.put("payment_openid", visitorOpenId);
member.put("kanga_openid", relation.getString("kanga_openid"));
member.put("redpack_openid", relation.getString("redpack_openid"));
member.put("attend_time", new Date());
member.put("member_point", -1);
member.put("encourage_balance", 0);
customerMembershipMapper.saveMember(member);
}
member.put("payment_openid", openId);
member.put("kanga_openid", relation.getString("kanga_openid"));
member.put("redpack_openid", relation.getString("redpack_openid"));
member.put("attend_time", new Date());
member.put("member_point", -1);
member.put("encourage_balance", 0);
customerMembershipMapper.saveMember(member);
if ("Alipay".equals(channel)) {
JSONObject relation = managerCustomerRelationAlipayMapper.findCustomerByUserId(openId);
if (relation == null) {
logger.debug("用户关系不存在");
return new JSONObject();
}
member.put("payment_openid", openId);
member.put("kanga_openid", openId.concat("-kanga_openid"));
member.put("redpack_openid", openId.concat("-redpack_openid"));
member.put("attend_time", new Date());
member.put("member_point", -1);
member.put("encourage_balance", 0);
customerMembershipMapper.saveMember(member);
}
}
String memberId = member.getString("member_id");
int usedOrders = customerEncourageMoneyAccessLogMapper.countOrders(memberId, new Date());
@ -124,8 +169,8 @@ public class EncourageUseProcessor implements Ordered, EncourageService {
logger.debug("超出领取次数");
return new JSONObject();
}
int rand = RandomUtils
.nextInt(0,config.getBigDecimal("max_amount").subtract(config.getBigDecimal("min_amount")).multiply(CommonConsts.HUNDRED).intValue());
int rand = RandomUtils.nextInt(0,
config.getBigDecimal("max_amount").subtract(config.getBigDecimal("min_amount")).multiply(CommonConsts.HUNDRED).intValue());
BigDecimal amount = config.getBigDecimal("min_amount").add(BigDecimal.valueOf(rand).divide(CommonConsts.HUNDRED, 2, BigDecimal.ROUND_DOWN));
customerMembershipMapper.addEncourage(memberId, amount);
JSONObject customer = customerMembershipMapper.findByMemberId(memberId);
@ -165,8 +210,8 @@ public class EncourageUseProcessor implements Ordered, EncourageService {
}
if (log.getBigDecimal("factor").compareTo(BigDecimal.ONE) == 0) {
int critRate = config.getIntValue("crit_rate");
if (RandomUtils.nextInt(0,100) < critRate) {
int factorInt = RandomUtils.nextInt(0,config.getBigDecimal("max_crit").multiply(CommonConsts.HUNDRED).intValue() - 100);
if (RandomUtils.nextInt(0, 100) < critRate) {
int factorInt = RandomUtils.nextInt(0, config.getBigDecimal("max_crit").multiply(CommonConsts.HUNDRED).intValue() - 100);
BigDecimal factor = BigDecimal.valueOf(factorInt + 100).divide(CommonConsts.HUNDRED, 2, BigDecimal.ROUND_DOWN);
BigDecimal actural = log.getBigDecimal("access_amount").multiply(factor).setScale(2, BigDecimal.ROUND_DOWN);
BigDecimal sub = actural.subtract(log.getBigDecimal("actural_amount"));
@ -195,16 +240,22 @@ public class EncourageUseProcessor implements Ordered, EncourageService {
Date toDate = config.getDate("to_date");
status.put("to", DateFormatUtils.format(toDate, "MM-dd"));
JSONObject member = customerMembershipMapper.findByPaymentOpenId(openid);
JSONObject use = customerEncourageMoneyAccessLogMapper.sumMoney(member.getString("memeber_id"),config.getString("event_id"));
BigDecimal balance = BigDecimal.ZERO;
if(use!=null){
balance = use.getBigDecimal("use_amount");
}
member.put("used_amount",balance.setScale(2, BigDecimal.ROUND_DOWN).toPlainString());
if (member != null) {
status.put("member_info", member);
List<JSONObject> balanceLogs = customerMembershipMapper.listEncourageBalanceHistory(fromDate, toDate, member.getString("member_id"));
status.put("logs", balanceLogs);
BigDecimal usedAmount = customerEncourageMoneyUseLogMapper.sumUsed(member.getString("member_id"), fromDate, toDate);
member.put("used_amount", usedAmount);
// BigDecimal usedAmount = customerEncourageMoneyUseLogMapper.sumUsed(member.getString("member_id"), fromDate, toDate);
// member.put("used_amount", usedAmount);
} else {
member = new JSONObject();
member.put("encourage_balance", 0);
member.put("used_amount", 0);
// member.put("used_amount", 0);
}
status.put("member", member);
return status;
@ -285,4 +336,14 @@ public class EncourageUseProcessor implements Ordered, EncourageService {
PageList<JSONObject> receiveLogs = customerEncourageMoneyUseLogMapper.list(params, new PageBounds(page, limit, Order.formString("use_time.desc")));
return PageListUtils.buildPageListResult(receiveLogs);
}
@Override
public void prepareUserInfo(JSONObject user, String user_id) {
if ("wechat".equals(user.getString("channel"))) {
user.put("headimg", customerMapper.findCustomerByOpenId(user_id).getString("headimg"));
}
if ("alipay".equals(user.getString("channel"))) {
user.put("headimg", managerCustomerRelationAlipayMapper.findCustomerByUserId(user_id).getString("headimg"));
}
}
}

@ -23,7 +23,7 @@ public class CouponValidateController {
@PartnerMapping(value = "/get_used_coupon",method = RequestMethod.GET,roles = {PartnerRole.ADMIN,PartnerRole.MANAGER})
@ResponseBody
public JSONObject getCoupon(@ModelAttribute(CommonConsts.PARTNER_STATUS) JSONObject partner, @RequestParam("page") int page){
public JSONObject getUsedCoupon(@ModelAttribute(CommonConsts.PARTNER_STATUS) JSONObject partner, @RequestParam("page") int page){
return couponVerificationService.getCoupon(partner,page,10);
}

@ -2,10 +2,17 @@ package au.com.royalpay.payment.manage.customers.web;
import au.com.royalpay.payment.manage.customers.core.EncourageService;
import au.com.royalpay.payment.tools.CommonConsts;
import au.com.royalpay.payment.tools.connections.mpsupport.beans.WxOauthType;
import au.com.royalpay.payment.tools.permission.wechat.WechatMapping;
import com.alibaba.fastjson.JSONObject;
import org.springframework.web.bind.annotation.*;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.servlet.ModelAndView;
import javax.annotation.Resource;
@ -16,15 +23,25 @@ import javax.annotation.Resource;
@RestController
@RequestMapping("/act/encourage_money")
public class EncourageMoneyController {
Logger logger = LoggerFactory.getLogger(getClass());
@Resource
private EncourageService encourageService;
@RequestMapping(value = "/orders/{orderId}", method = RequestMethod.PUT)
public JSONObject takeEncourageMoney(@PathVariable String orderId, @ModelAttribute(CommonConsts.WECHATINFO) JSONObject wxUser) {
@RequestMapping(value = "/orders/{orderId}", method = RequestMethod.GET)
public JSONObject takeEncourageMoney(@PathVariable String orderId, @ModelAttribute(CommonConsts.WECHATINFO) JSONObject wxUser,
@ModelAttribute(CommonConsts.ALIUSER) JSONObject aliuser) {
String user_id = "";
if (wxUser == null) {
user_id = aliuser.getString("user_id");
} else {
logger.info("====wxUser==" + wxUser.toJSONString());
user_id = wxUser.getString("openid");
}
if (StringUtils.isEmpty(user_id)) {
return new JSONObject();
}
return encourageService.takeEncourageMoney(orderId, wxUser.getString("openid"));
return encourageService.takeEncourageMoney(orderId, user_id);
}
@RequestMapping(value = "/orders/{orderId}/crit", method = RequestMethod.PUT)
@ -32,22 +49,36 @@ public class EncourageMoneyController {
return encourageService.doubleEncourageMoney(orderId);
}
@WechatMapping(value = "/my", method = RequestMethod.GET, oauthType = WxOauthType.USERINFO)
public ModelAndView encourageLogs(@ModelAttribute(CommonConsts.WECHATINFO) JSONObject wxUser) {
@RequestMapping(value = "/my", method = RequestMethod.GET)
public ModelAndView encourageLogs(@ModelAttribute(CommonConsts.WECHATINFO) JSONObject wxUser, @ModelAttribute(CommonConsts.ALIUSER) JSONObject aliuser) {
ModelAndView mav = new ModelAndView("activity/encourage_money/my");
mav.addObject("wxUser", wxUser);
JSONObject balanceStatus = encourageService.getBalanceStatus(wxUser.getString("openid"));
JSONObject user = new JSONObject();
String user_id = "";
if (wxUser == null) {
user.put("headimg", aliuser.getString("avatar"));
user.put("channel","alipay");
user_id = aliuser.getString("user_id");
} else {
user.put("headimg", wxUser.getString("headimgurl"));
user.put("channel","wechat");
user_id = wxUser.getString("openid");
}
if(StringUtils.isEmpty(user.getString("headimg"))) {
encourageService.prepareUserInfo(user, user_id);
}
JSONObject balanceStatus = encourageService.getBalanceStatus(user_id);
mav.addObject("user", user);
mav.addObject("balance_status", balanceStatus);
return mav;
}
@WechatMapping(value = "/desc",method = RequestMethod.GET)
public ModelAndView descPage(){
@RequestMapping(value = "/desc", method = RequestMethod.GET)
public ModelAndView descPage() {
return new ModelAndView("activity/encourage_money/desc");
}
@WechatMapping(value = "/merchants",method = RequestMethod.GET)
public ModelAndView merchantsPage(){
@RequestMapping(value = "/merchants", method = RequestMethod.GET)
public ModelAndView merchantsPage() {
return new ModelAndView("activity/encourage_money/merchants");
}
}

@ -0,0 +1,476 @@
package au.com.royalpay.payment.manage.dev.bean;
import au.com.royalpay.payment.core.exceptions.ParamInvalidException;
import com.alibaba.fastjson.JSONObject;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.time.DateUtils;
import org.hibernate.validator.constraints.NotEmpty;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
/**
* Created by yixian on 2016-07-01.
*/
public class AliExcel {
private final DateFormat format = new SimpleDateFormat("yyyy-MM-dd");
private String textType;
private String searchText;
private String client_moniker;
private String state;
private String suburb;
private String short_name;
private String sub_merchant_id;
private String org_id;
private String org_ids;
private String bd;
private String business_structure;
private String industry;
private Integer clean_day;
private String bd_city;
private String surcharge_start_rate;
private String surcharge_end_rate;
private String create_start_time;
private String datefrom;
private String create_end_time;
private String dateto;
private String transaction_start_time;
private String transaction_end_time;
private boolean approving = false;
private int page = 1;
private int limit = 10;
private boolean onlyMe = false;
private boolean tempMchId = false;
private boolean quickPass = false;
private boolean greenChannel = false;
private boolean greenChannelBdTodo = false;
private boolean pass = false;
private boolean completed_contract = false;
private boolean apply_to_back = false;
private boolean bd_upload_material = false;
private boolean is_valid = false;
private String merchant_id;
public String getClient_moniker() {
return StringUtils.isEmpty(client_moniker) ? null : client_moniker;
}
public void setClient_moniker(String client_moniker) {
this.client_moniker = client_moniker;
}
public String getShort_name() {
return short_name;
}
public void setShort_name(String short_name) {
this.short_name = short_name;
}
public String getSub_merchant_id() {
return sub_merchant_id;
}
public void setSub_merchant_id(String sub_merchant_id) {
this.sub_merchant_id = sub_merchant_id;
}
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;
}
public JSONObject toJsonParam() {
JSONObject param = new JSONObject();
if (StringUtils.isNotBlank(client_moniker)) {
param.put("client_moniker", getClient_moniker());
}
if (StringUtils.isNotBlank(short_name)) {
param.put("short_name", short_name);
}
if (StringUtils.isNotBlank(sub_merchant_id)) {
param.put("sub_merchant_id", sub_merchant_id);
}
if (StringUtils.isNotBlank(state)) {
param.put("state", state);
}
if (StringUtils.isNotBlank(suburb)) {
param.put("suburb", suburb);
}
if (StringUtils.isNotBlank(searchText)) {
param.put("search_text", searchText);
if (StringUtils.isNotBlank(textType)) {
param.put("text_type", textType);
} else {
param.put("text_type", "all");
}
}
if (approving) {
param.put("approving", true);
}
if (org_id != null) {
param.put("org_id", org_id);
}
if (org_ids != null) {
param.put("org_ids", org_ids);
}
if (StringUtils.isNotBlank(bd)) {
param.put("bd_user", bd);
}
if (quickPass){
param.put("quickPass",true);
}
if (greenChannel){
param.put("greenChannel",true);
}
if (business_structure!=null && !business_structure.equals("")){
param.put("business_structure",business_structure);
}
if (industry!=null && !industry.equals("")){
param.put("industry",industry);
}
if (bd_city!=null && !bd_city.equals("")){
param.put("bd_city",bd_city);
}
if (clean_day!=null){
param.put("clean_day",clean_day);
}
if (surcharge_start_rate!=null) {
param.put("surcharge_start_rate",surcharge_start_rate);
}
if (surcharge_end_rate!=null){
param.put("surcharge_end_rate",surcharge_end_rate);
}
if (transaction_start_time != null) {
try {
param.put("transaction_start_time", format.parse(transaction_start_time));
} catch (ParseException e) {
throw new ParamInvalidException("transaction_start_time", "error.payment.valid.invalid_date_format");
}
}
if (transaction_end_time != null) {
try {
param.put("transaction_end_time", DateUtils.addDays(format.parse(transaction_end_time), 1));
} catch (ParseException e) {
throw new ParamInvalidException("transaction_end_time", "error.payment.valid.invalid_date_format");
}
}
if (create_start_time != null) {
try {
param.put("create_start_time", format.parse(create_start_time));
} catch (ParseException e) {
throw new ParamInvalidException("create_start_time", "error.payment.valid.invalid_date_format");
}
}
if (create_end_time != null) {
try {
param.put("create_end_time", DateUtils.addDays(format.parse(create_end_time), 1));
} catch (ParseException e) {
throw new ParamInvalidException("create_end_time", "error.payment.valid.invalid_date_format");
}
}
if (datefrom != null) {
try {
param.put("datefrom", format.parse(datefrom));
} catch (ParseException e) {
throw new ParamInvalidException("approve_start_time", "error.payment.valid.invalid_date_format");
}
}
if (dateto != null) {
try {
param.put("dateto", DateUtils.addDays(format.parse(dateto), 1));
} catch (ParseException e) {
throw new ParamInvalidException("approve_end_time", "error.payment.valid.invalid_date_format");
}
}
if (greenChannelBdTodo){
param.put("greenChannelBdTodo",true);
}
if (is_valid){
param.put("is_valid",true);
}
if (pass){
param.put("pass",true);
}
if (completed_contract){
param.put("completed_contract",true);
}
if (apply_to_back){
param.put("apply_to_back",true);
}
if (bd_upload_material){
param.put("bd_upload_material",true);
}
if (merchant_id != null){
param.put("merchant_id",merchant_id);
}
return param;
}
public String getState() {
return state;
}
public void setState(String state) {
this.state = state;
}
public String getTextType() {
return textType;
}
public void setTextType(String textType) {
this.textType = textType;
}
public String getSearchText() {
return searchText;
}
public void setSearchText(String searchText) {
this.searchText = searchText;
}
public String getOrg_id() {
return org_id;
}
public void setOrg_id(String org_id) {
this.org_id = org_id;
}
public void setOnlyMe(boolean onlyMe) {
this.onlyMe = onlyMe;
}
public boolean getOnlyMe() {
return onlyMe;
}
public boolean isTempMchId() {
return tempMchId;
}
public void setTempMchId(boolean tempMchId) {
this.tempMchId = tempMchId;
}
public String getBusiness_structure() {
return business_structure;
}
public void setBusiness_structure(String business_structure) {
this.business_structure = business_structure;
}
public String getIndustry() {
return industry;
}
public void setIndustry(String industry) {
this.industry = industry;
}
public Integer getClean_day() {
return clean_day;
}
public void setClean_day(Integer clean_day) {
this.clean_day = clean_day;
}
public String getBd_city() {
return bd_city;
}
public void setBd_city(String bd_city) {
this.bd_city = bd_city;
}
public String getCreate_start_time() {
return create_start_time;
}
public void setCreate_start_time(String create_start_time) {
this.create_start_time = create_start_time;
}
public String getDatefrom() {
return datefrom;
}
public void setDatefrom(String datefrom) {
this.datefrom = datefrom;
}
public String getCreate_end_time() {
return create_end_time;
}
public void setCreate_end_time(String create_end_time) {
this.create_end_time = create_end_time;
}
public String getDateto() {
return dateto;
}
public void setDateto(String dateto) {
this.dateto = dateto;
}
public String getSurcharge_start_rate() {
return surcharge_start_rate;
}
public void setSurcharge_start_rate(String surcharge_start_rate) {
this.surcharge_start_rate = surcharge_start_rate;
}
public String getTransaction_start_time() {
return transaction_start_time;
}
public void setTransaction_start_time(String transaction_start_time) {
this.transaction_start_time = transaction_start_time;
}
public String getTransaction_end_time() {
return transaction_end_time;
}
public void setTransaction_end_time(String transaction_end_time) {
this.transaction_end_time = transaction_end_time;
}
public String getSurcharge_end_rate() {
return surcharge_end_rate;
}
public void setSurcharge_end_rate(String surcharge_end_rate) {
this.surcharge_end_rate = surcharge_end_rate;
}
public boolean isOnlyMe() {
return onlyMe;
}
public boolean isApproving() {
return approving;
}
public void setApproving(boolean approving) {
this.approving = approving;
}
public boolean isQuickPass() {
return quickPass;
}
public void setQuickPass(boolean quickPass) {
this.quickPass = quickPass;
}
public boolean isGreenChannel() {
return greenChannel;
}
public void setGreenChannel(boolean greenChannel) {
this.greenChannel = greenChannel;
}
public void setGreenChannelAndBDtodo(boolean bDTodo){
this.greenChannelBdTodo = bDTodo;
}
public void setIs_valid(boolean is_valid){
this.is_valid=is_valid;
}
public DateFormat getFormat() {
return format;
}
public boolean isGreenChannelBdTodo() {
return greenChannelBdTodo;
}
public void setGreenChannelBdTodo(boolean greenChannelBdTodo) {
this.greenChannelBdTodo = greenChannelBdTodo;
}
public boolean isPass() {
return pass;
}
public void setPass(boolean pass) {
this.pass = pass;
}
public boolean isCompleted_contract() {
return completed_contract;
}
public void setCompleted_contract(boolean completed_contract) {
this.completed_contract = completed_contract;
}
public boolean isApply_to_back() {
return apply_to_back;
}
public void setApply_to_back(boolean apply_to_back) {
this.apply_to_back = apply_to_back;
}
public boolean isBd_upload_material() {
return bd_upload_material;
}
public void setBd_upload_material(boolean bd_upload_material) {
this.bd_upload_material = bd_upload_material;
}
public boolean isIs_valid() {
return is_valid;
}
public String getOrg_ids() {
return org_ids;
}
public void setOrg_ids(String org_ids) {
this.org_ids = org_ids;
}
public void setBd(String bd) {
this.bd = bd;
}
public String getMerchant_id() {
return merchant_id;
}
public void setMerchant_id(String merchant_id) {
this.merchant_id = merchant_id;
}
public String getSuburb() {
return suburb;
}
public void setSuburb(String suburb) {
this.suburb = suburb;
}
}

@ -0,0 +1,355 @@
package au.com.royalpay.payment.manage.dev.bean;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.annotation.JSONField;
import org.hibernate.validator.constraints.NotEmpty;
import javax.validation.constraints.Pattern;
/**
* Created by yangluo on 2018/06/28.
*/
public class ClientTestRegisterInfo {
@JSONField(name = "client_moniker")
@NotEmpty(message = "error.payment.valid.param_missing")
@Pattern(regexp = "^[a-zA-Z0-9]{4}$", message = "Parameter error(partner code):Only letters or numbers are allowed")
private String clientMoniker;
private String companyName;
private String shortName;
private String businessName;
private String businessStructure;
// @NotEmpty(message = "error.payment.valid.param_missing")
private String abn;
private String acn;
// @NotEmpty(message = "error.payment.valid.param_missing")
private String industry;
/* @NotEmpty(message = "error.payment.valid.param_missing")*/
private String alipayIndustry;
private String companyPhoto;
private String storePhoto;
private String companyWebsite;
private String companyPhone;
private String description;
private String remark;
private String sector;
@JSONField(name = "logo_id")
private String logoId;
@JSONField(name = "contact_person")
private String contactPerson;
@JSONField(name = "contact_phone")
private String contactPhone;
@JSONField(name = "contact_email")
private String contactEmail;
private String address;
private String suburb;
private String postcode;
private String state;
private String country;
private String timezone;
private String jdindustry;
private String royalpayindustry;
private String referrer_id;
private String referrer_name;
private String client_apply_id;
private String business_hours;
private String merchant_introduction;
private String merchant_tag;
private String merchant_video_url;
public JSONObject insertObject() {
JSONObject res = (JSONObject) JSON.toJSON(this);
if (client_apply_id==null){
res.remove("client_apply_id");
}
return res;
}
public JSONObject updateObject() {
JSONObject obj = insertObject();
obj.remove("client_moniker");
return obj;
}
public String getClientMoniker() {
return clientMoniker.toUpperCase();
}
public void setClientMoniker(String clientMoniker) {
this.clientMoniker = clientMoniker;
}
public String getCompanyName() {
return companyName;
}
public void setCompanyName(String companyName) {
this.companyName = companyName;
}
public String getShortName() {
return shortName;
}
public void setShortName(String shortName) {
this.shortName = shortName;
}
public String getBusinessName() {
return businessName;
}
public void setBusinessName(String businessName) {
this.businessName = businessName;
}
public String getAbn() {
return abn;
}
public void setAbn(String abn) {
this.abn = abn;
}
public String getAcn() {
return acn;
}
public void setAcn(String acn) {
this.acn = acn;
}
public String getIndustry() {
return industry;
}
public void setIndustry(String industry) {
this.industry = industry;
}
public String getCompanyPhoto() {
return companyPhoto;
}
public void setCompanyPhoto(String companyPhoto) {
this.companyPhoto = companyPhoto;
}
public String getStorePhoto() {
return storePhoto;
}
public void setStorePhoto(String storePhoto) {
this.storePhoto = storePhoto;
}
public String getCompanyWebsite() {
return companyWebsite;
}
public void setCompanyWebsite(String companyWebsite) {
this.companyWebsite = companyWebsite;
}
public String getCompanyPhone() {
return companyPhone;
}
public void setCompanyPhone(String companyPhone) {
this.companyPhone = companyPhone;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public String getSector() {
return sector;
}
public void setSector(String sector) {
this.sector = sector;
}
public String getLogoId() {
return logoId;
}
public void setLogoId(String logoId) {
this.logoId = logoId;
}
public String getContactPerson() {
return contactPerson;
}
public void setContactPerson(String contactPerson) {
this.contactPerson = contactPerson;
}
public String getContactPhone() {
return contactPhone;
}
public void setContactPhone(String contactPhone) {
this.contactPhone = contactPhone;
}
public String getContactEmail() {
return contactEmail;
}
public void setContactEmail(String contactEmail) {
this.contactEmail = contactEmail;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public String getSuburb() {
return suburb;
}
public void setSuburb(String suburb) {
this.suburb = suburb;
}
public String getPostcode() {
return postcode;
}
public void setPostcode(String postcode) {
this.postcode = postcode;
}
public String getState() {
return state;
}
public void setState(String state) {
this.state = state;
}
public String getCountry() {
return country;
}
public void setCountry(String country) {
this.country = country;
}
public String getRemark() {
return remark;
}
public void setRemark(String remark) {
this.remark = remark;
}
public String getTimezone() {
return timezone;
}
public void setTimezone(String timezone) {
this.timezone = timezone;
}
public String getClient_apply_id() {
return client_apply_id;
}
public void setClient_apply_id(String client_apply_id) {
this.client_apply_id = client_apply_id;
}
public String getBusinessStructure() {
return businessStructure;
}
public void setBusinessStructure(String businessStructure) {
this.businessStructure = businessStructure;
}
public String getReferrer_id() {
return referrer_id;
}
public void setReferrer_id(String referrer_id) {
this.referrer_id = referrer_id;
}
public String getReferrer_name() {
return referrer_name;
}
public void setReferrer_name(String referrer_name) {
this.referrer_name = referrer_name;
}
public String getAlipayIndustry() {
return alipayIndustry;
}
public void setAlipayIndustry(String alipayIndustry) {
this.alipayIndustry = alipayIndustry;
}
public String getJdindustry() {
return jdindustry;
}
public void setJdindustry(String jdindustry) {
this.jdindustry = jdindustry;
}
public String getRoyalpayindustry() {
return royalpayindustry;
}
public void setRoyalpayindustry(String royalpayindustry) {
this.royalpayindustry = royalpayindustry;
}
public String getBusiness_hours() {
return business_hours;
}
public void setBusiness_hours(String business_hours) {
this.business_hours = business_hours;
}
public String getMerchant_introduction() {
return merchant_introduction;
}
public void setMerchant_introduction(String merchant_introduction) {
this.merchant_introduction = merchant_introduction;
}
public String getMerchant_tag() {
return merchant_tag;
}
public void setMerchant_tag(String merchant_tag) {
this.merchant_tag = merchant_tag;
}
public String getMerchant_video_url() {
return merchant_video_url;
}
public void setMerchant_video_url(String merchant_video_url) {
this.merchant_video_url = merchant_video_url;
}
}

@ -0,0 +1,15 @@
package au.com.royalpay.payment.manage.dev.core;
import au.com.royalpay.payment.manage.analysis.beans.AnalysisBean;
import au.com.royalpay.payment.manage.dev.bean.AliExcel;
import au.com.royalpay.payment.manage.merchants.beans.PartnerQuery;
import com.alibaba.fastjson.JSONObject;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public interface AliforexcelService {
JSONObject listClients(HttpServletResponse httpResponse,JSONObject manager, AliExcel query);
}

@ -0,0 +1,18 @@
package au.com.royalpay.payment.manage.dev.core;
import au.com.royalpay.payment.manage.dev.bean.ClientTestRegisterInfo;
import com.alibaba.fastjson.JSONObject;
import org.springframework.transaction.annotation.Transactional;
/**
* Created by yangluo on 2018-6-28.
*/
public interface NewpartnerService {
@Transactional
JSONObject registerClient(String clientMoniker, ClientTestRegisterInfo registery, JSONObject manager);
}

@ -0,0 +1,72 @@
package au.com.royalpay.payment.manage.dev.core.impl;
import au.com.royalpay.payment.manage.dev.bean.AliExcel;
import au.com.royalpay.payment.manage.dev.core.AliforexcelService;
import au.com.royalpay.payment.manage.mappers.system.ClientMapper;
import com.alibaba.fastjson.JSONObject;
import org.apache.commons.io.IOUtils;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.OutputStream;
import java.util.List;
@Service
public class AliforexcelServiceImpl implements AliforexcelService {
@Resource
private ClientMapper clientMapper;
@Override
public JSONObject listClients(HttpServletResponse httpResponse,JSONObject manager, AliExcel query) {
OutputStream ous = null;
try{
JSONObject params = query.toJsonParam();
List<JSONObject> partners = clientMapper.passPartners(params);
httpResponse.setContentType("application/octet-stream;");
httpResponse.setCharacterEncoding("utf-8");
String fileName = "支付宝进件专用--";
String codedFileName = java.net.URLEncoder.encode(fileName, "UTF-8");
httpResponse.addHeader("Content-Disposition", "attachment; filename=" + codedFileName +query.getDatefrom() + "~" +query.getDateto() + ".xls");
ous = httpResponse.getOutputStream();
HSSFWorkbook wb = new HSSFWorkbook();
Sheet sheet = wb.createSheet("支付宝进件专用" );
sheet.createFreezePane(1, 2);
sheet.setDefaultColumnWidth((short) 25);
int rowNum = 0;
Row row = sheet.createRow(rowNum);
String[] title = {"Company name", "Store name", "Partner Code","Industry","Store address","Business hours","Contact information","Video link (optional)","Store description","Tags"};
for (int i = 0; i < title.length; i++) {
row.createCell(i, Cell.CELL_TYPE_STRING).setCellValue(title[i]);
}
for(JSONObject partner : partners){
row = sheet.createRow(++rowNum);
row.createCell(0, Cell.CELL_TYPE_STRING).setCellValue(partner.getString("company_name"));
row.createCell(1, Cell.CELL_TYPE_STRING).setCellValue(partner.getString("short_name"));
row.createCell(2, Cell.CELL_TYPE_STRING).setCellValue(partner.getString("client_moniker"));
row.createCell(3, Cell.CELL_TYPE_STRING).setCellValue(partner.getString("alipayindustry"));
row.createCell(4, Cell.CELL_TYPE_STRING).setCellValue(partner.getString("address")+","+partner.getString("suburb") + "," + partner.getString("state") + "," + partner.getString("postcode"));
row.createCell(5, Cell.CELL_TYPE_STRING).setCellValue(partner.getString("business_hours"));
row.createCell(6, Cell.CELL_TYPE_STRING).setCellValue(partner.getString("company_phone"));
row.createCell(7, Cell.CELL_TYPE_STRING).setCellValue(partner.getString(""));
row.createCell(8, Cell.CELL_TYPE_STRING).setCellValue(partner.getString("merchant_introduction"));
row.createCell(9, Cell.CELL_TYPE_STRING).setCellValue(partner.getString(""));
}
wb.write(ous);
ous.flush();
}catch (IOException e){
} finally {
IOUtils.closeQuietly(ous);
}
return null;
}
}

@ -0,0 +1,110 @@
package au.com.royalpay.payment.manage.dev.core.impl;
import au.com.royalpay.payment.core.exceptions.InvalidShortIdException;
import au.com.royalpay.payment.manage.dev.bean.ClientTestRegisterInfo;
import au.com.royalpay.payment.manage.dev.core.NewpartnerService;
import au.com.royalpay.payment.manage.mappers.system.ClientMapper;
import au.com.royalpay.payment.manage.merchants.core.ClientConfigService;
import au.com.royalpay.payment.tools.connections.attachment.core.AttachmentClient;
import au.com.royalpay.payment.tools.exceptions.BadRequestException;
import au.com.royalpay.payment.tools.permission.enums.ManagerRole;
import com.alibaba.fastjson.JSONObject;
import org.apache.commons.lang3.RandomStringUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.util.Date;
import static au.com.royalpay.payment.manage.permission.utils.OrgCheckUtils.checkOrgPermission;
/**
* Created by yangluo on 2018-6-28.
*/
@Service
public class NewpartnerServiceImpl implements NewpartnerService {
@Resource
private ClientMapper clientMapper;
@Resource
private ClientConfigService clientConfigService;
@Resource
private AttachmentClient attachmentClient;
@Cacheable(value = ":app_client_info_moniker:", key = "#clientMoniker")
public JSONObject getClientInfoByMoniker(String clientMoniker) {
return clientMapper.findClientByMoniker(clientMoniker);
}
@Override
@Transactional
public JSONObject registerClient(String clientMoniker, ClientTestRegisterInfo registery, JSONObject manager) {
JSONObject partner = registery.insertObject();
if (clientMoniker != null && !clientMoniker.equals("")) {
JSONObject superClient = getClientInfoByMoniker(clientMoniker);
if (superClient == null) {
throw new InvalidShortIdException();
} else {
checkOrgPermission(manager, superClient);
partner.put("parent_client_id", superClient.getIntValue("client_id"));
}
}
partner.put("create_time", new Date());
partner.put("ali_sub_merchant_id", registery.getClientMoniker());
partner.put("credential_code", RandomStringUtils.random(32, true, true));
partner.put("creator", manager.getString("manager_id"));
partner.put("contact_phone", "+611111111111111");
partner.put("industry", "327");
partner.put("contact_email", "a@qq.com");
partner.put("contact_person", "aa");
partner.put("company_name", "AA");
partner.put("short_name", "a");
partner.put("company_phone", "+611111111111111");
// if (manager.getIntValue("org_id") == 0) {
// throw new ForbiddenException("You were not belong to any organizations so that you cannot create new
// client");
// }
partner.put("org_id", 1);
partner.put("approve_result", 1);
partner.put("approve_time", new Date());
partner.put("open_status", 5);
if (StringUtils.isNotEmpty(registery.getLogoId())) {
partner.put("logo_url", attachmentClient.getFileUrl(registery.getLogoId()));
partner.put("logo_thumbnail", attachmentClient.getThumbnail(registery.getLogoId(), 600).getString("url"));
}
if (ManagerRole.OPERATOR.hasRole(manager.getIntValue("role"))) {
partner.put("approve_result", 1);
partner.put("approver", manager.getString("manager_id"));
partner.put("approve_time", new Date());
}
if (ManagerRole.BD_USER.hasRole(manager.getIntValue("role"))) {
partner.put("bd_user", manager.getString("manager_id"));
partner.put("bd_user_name", manager.getString("display_name"));
}
if (clientMapper.findClientByMoniker(registery.getClientMoniker()) != null) {
throw new BadRequestException("error.partner.valid.dumplicate_client_moniker");
}
try {
clientMapper.save(partner);
JSONObject clientConfig = new JSONObject();
clientConfig.put("client_id", partner.getIntValue("client_id"));
clientConfig.put("client_moniker", partner.getString("client_moniker"));
clientConfigService.save(clientConfig);
} catch (Exception e) {
throw new BadRequestException("error.partner.valid.dumplicate_client_moniker");
}
return partner;
}
}

@ -10,8 +10,11 @@ import au.com.royalpay.payment.core.exceptions.InvalidShortIdException;
import au.com.royalpay.payment.core.exceptions.OrderNotExistsException;
import au.com.royalpay.payment.manage.analysis.core.PlatformClearService;
import au.com.royalpay.payment.manage.appclient.core.RetailAppService;
import au.com.royalpay.payment.manage.dev.bean.AliExcel;
import au.com.royalpay.payment.manage.dev.bean.Message;
import au.com.royalpay.payment.manage.dev.bean.SendWechatMessage;
import au.com.royalpay.payment.manage.dev.core.AliforexcelService;
import au.com.royalpay.payment.manage.dev.core.NewpartnerService;
import au.com.royalpay.payment.manage.dev.core.WechatMessageService;
import au.com.royalpay.payment.manage.mappers.customers.CustomerEncourageMoneyUseLogMapper;
import au.com.royalpay.payment.manage.mappers.log.NotifyErrorLogMapper;
@ -30,11 +33,9 @@ import au.com.royalpay.payment.tools.permission.enums.ManagerRole;
import au.com.royalpay.payment.tools.utils.PdfUtils;
import au.com.royalpay.payment.tools.utils.TimeZoneUtils;
import au.com.royalpay.payment.tools.utils.XmlFormatUtils;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.serializer.SerializerFeature;
import org.apache.commons.lang3.time.DateFormatUtils;
import org.dom4j.Element;
import org.slf4j.Logger;
@ -44,14 +45,12 @@ import org.springframework.context.ApplicationEventPublisher;
import org.springframework.context.ApplicationEventPublisherAware;
import org.springframework.util.Assert;
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 org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
@ -60,11 +59,6 @@ import java.net.URISyntaxException;
import java.util.Date;
import java.util.List;
import javax.annotation.Resource;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid;
/**
* Created by yixian on 2016-07-06.
*/
@ -109,6 +103,10 @@ public class TestController implements ApplicationEventPublisherAware {
private ApplicationEventPublisher publisher;
@Resource
private WechatMessageService wechatMessageService;
@Resource
private NewpartnerService newpartnerService;
@Resource
private AliforexcelService aliforexcelService;
@ManagerMapping(value = "/{clientMoniker}/export/agreepdf", method = RequestMethod.GET, role = {ManagerRole.ADMIN, ManagerRole.DIRECTOR, ManagerRole.OPERATOR})
public void exportAgreeFile(@PathVariable String clientMoniker, @ModelAttribute(CommonConsts.MANAGER_STATUS) JSONObject manager, HttpServletResponse httpResponse) throws Exception {
@ -380,4 +378,15 @@ public class TestController implements ApplicationEventPublisherAware {
wechatMessageService.sendMessageByOpenId(sendWechatMessage);
}
/* @ManagerMapping(value = "/orgusertest", method = RequestMethod.POST, role = {ManagerRole.ADMIN,ManagerRole.DEVELOPER})
public JSONObject orgusertest(@ModelAttribute(CommonConsts.MANAGER_STATUS) JSONObject manager, @RequestBody @Valid ClientTestRegisterInfo registery,
Errors errors) {
HttpUtils.handleValidErrors(errors);
return newpartnerService.registerClient(null, registery, manager);
}*/
@ManagerMapping(value = "/aliforexcel", method = RequestMethod.GET, role = ManagerRole.DEVELOPER)
public void aliforexcel(@ModelAttribute(CommonConsts.MANAGER_STATUS) JSONObject manager, HttpServletResponse httpResponse, AliExcel query) throws Exception {
aliforexcelService.listClients(httpResponse,manager,query);
}
}

@ -0,0 +1,58 @@
package au.com.royalpay.payment.manage.management.sysconfig.beans;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.annotation.JSONField;
import org.hibernate.validator.constraints.NotEmpty;
/**
* Created by yangluo on 2018/07/05.
*/
public class PartnerModuleInfo {
@JSONField(name = "js_module")
private String jsModule;
@JSONField(name = "js_path")
private String jsPath;
private String remark;
@JSONField(name = "initialize")
private Boolean initialize;
public String getJsModule() {
return jsModule;
}
public void setJsModule(String jsModule) {
this.jsModule = jsModule;
}
public String getJsPath() {
return jsPath;
}
public void setJsPath(String jsPath) {
this.jsPath = jsPath;
}
public String getRemark() {
return remark;
}
public void setRemark(String remark) {
this.remark = remark;
}
public Boolean getInitialize() {
return initialize;
}
public void setInitialize(Boolean initialize) {
this.initialize = initialize;
}
public void initObject(JSONObject mod) {
mod.put("id", mod.getLong("id"));
mod.put("js_module", getJsModule());
mod.put("js_path", getJsPath());
mod.put("remark", getRemark());
}
}

@ -0,0 +1,44 @@
package au.com.royalpay.payment.manage.management.sysconfig.beans;
/**
* @author kira
* @date 2018/7/4
*/
public class PermissionClientVO {
private Long id;
private String clientMoniker;
private int clientId;
private boolean isValid;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getClientMoniker() {
return clientMoniker;
}
public void setClientMoniker(String clientMoniker) {
this.clientMoniker = clientMoniker;
}
public int getClientId() {
return clientId;
}
public void setClientId(int clientId) {
this.clientId = clientId;
}
public boolean getIsValid() {
return isValid;
}
public void setValid(boolean valid) {
isValid = valid;
}
}

@ -30,4 +30,5 @@ public interface PermissionManager {
void authorizeRole(ManagerRole role, List<String> functions);
List<JSONObject> listUserFunctions(int role);
}

@ -0,0 +1,37 @@
package au.com.royalpay.payment.manage.management.sysconfig.core;
import au.com.royalpay.payment.manage.management.sysconfig.beans.FuncInfo;
import au.com.royalpay.payment.manage.management.sysconfig.beans.PartnerModuleInfo;
import au.com.royalpay.payment.tools.permission.enums.ManagerRole;
import com.alibaba.fastjson.JSONObject;
import java.util.List;
/**
* Created by yangluo on 2018/07/05.
*/
public interface PermissionPartnerManager {
void synchronizeFunctions();
JSONObject listFunctions();
List<JSONObject> listModules();
void saveOrUpdateModule(String moduleName, PartnerModuleInfo module);
void checkAndDeleteModule(String moduleName);
void updateFuncInfo(String funcId, FuncInfo funcInfo);
void setFunctionModule(String funcId, String moduleName);
List<String> listRoleFunctions(ManagerRole role);
void authorizeRole(ManagerRole role, List<String> functions);
List<JSONObject> listUserFunctions(int role);
JSONObject getPartnerFuncById(String funcId);
void permissionClientModuleSave(int clientId,String clientMoniker);
}

@ -5,17 +5,24 @@ import au.com.royalpay.payment.manage.management.sysconfig.beans.ModuleInfo;
import au.com.royalpay.payment.manage.management.sysconfig.core.PermissionManager;
import au.com.royalpay.payment.manage.mappers.system.PermissionFunctionMapper;
import au.com.royalpay.payment.manage.mappers.system.PermissionModuleMapper;
import au.com.royalpay.payment.tools.permission.enums.ManagerRole;
import au.com.royalpay.payment.manage.permission.manager.scanner.PermissionNode;
import au.com.royalpay.payment.manage.permission.manager.scanner.PermissionReader;
import au.com.royalpay.payment.tools.exceptions.BadRequestException;
import au.com.royalpay.payment.tools.permission.enums.ManagerRole;
import com.alibaba.fastjson.JSONObject;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;
import javax.annotation.Resource;
import java.util.*;
/**
* Created by yixian on 2017-02-28.
@ -28,7 +35,6 @@ public class PermissionManagerImpl implements PermissionManager {
private PermissionModuleMapper permissionModuleMapper;
@Resource
private PermissionReader permissionReader;
@Override
public void synchronizeFunctions() {
List<JSONObject> functions = permissionFunctionMapper.listAll();
@ -166,4 +172,6 @@ public class PermissionManagerImpl implements PermissionManager {
return permissionFunctionMapper.listByRoleMask(role);
}
}

@ -0,0 +1,223 @@
package au.com.royalpay.payment.manage.management.sysconfig.core.impls;
import au.com.royalpay.payment.manage.management.sysconfig.beans.FuncInfo;
import au.com.royalpay.payment.manage.management.sysconfig.beans.PartnerModuleInfo;
import au.com.royalpay.payment.manage.management.sysconfig.core.PermissionPartnerManager;
import au.com.royalpay.payment.manage.mappers.system.ClientMapper;
import au.com.royalpay.payment.manage.mappers.system.PermissionClientModuleMapper;
import au.com.royalpay.payment.manage.mappers.system.PermissionPartnerFunctionMapper;
import au.com.royalpay.payment.manage.mappers.system.PermissionPartnerModuleMapper;
import au.com.royalpay.payment.manage.permission.manager.scanner.PermissionNode;
import au.com.royalpay.payment.manage.permission.manager.scanner.PermissionPartnerReader;
import au.com.royalpay.payment.manage.system.core.PermissionClientModulesService;
import au.com.royalpay.payment.tools.exceptions.BadRequestException;
import au.com.royalpay.payment.tools.permission.enums.ManagerRole;
import au.com.royalpay.payment.tools.utils.id.IdUtil;
import com.alibaba.fastjson.JSONObject;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;
import javax.annotation.Resource;
/**
* Created by yangluo on 2018/07/05.
*/
@Service
public class PermissionPartnerManagerImpl implements PermissionPartnerManager {
@Resource
private PermissionPartnerFunctionMapper permissionPartnerFunctionMapper;
@Resource
private PermissionPartnerModuleMapper permissionPartnerModuleMapper;
@Resource
private PermissionPartnerReader permissionPartnerReader;
@Resource
private PermissionClientModuleMapper permissionClientModuleMapper;
@Resource
private PermissionClientModulesService permissionClientModulesService;
@Resource
private ClientMapper clientMapper;
@Override
public void synchronizeFunctions() {
List<JSONObject> functions = permissionPartnerFunctionMapper.listAll();
Map<String, JSONObject> funcMapFromDB = new HashMap<>();
for (JSONObject func : functions) {
funcMapFromDB.put(func.getString("func_id"), func);
}
List<PermissionNode> nodes = permissionPartnerReader.listFunctions();
for (PermissionNode node : nodes) {
String funcId = node.getFuncId();
if (funcMapFromDB.containsKey(funcId)) {
funcMapFromDB.remove(funcId);
JSONObject func = node.initFuncObject();
func.remove("role");
permissionPartnerFunctionMapper.update(func);
} else {
JSONObject func = node.initFuncObject();
permissionPartnerFunctionMapper.save(func);
}
}
for (String funcId : funcMapFromDB.keySet()) {
permissionPartnerFunctionMapper.delete(funcId);
}
}
@Override
public JSONObject listFunctions() {
List<JSONObject> funcs = permissionPartnerFunctionMapper.listAll();
Map<String, List<JSONObject>> moduleMap = new TreeMap<>();
List<JSONObject> noModule = new ArrayList<>();
for (JSONObject func : funcs) {
String module = func.getString("module");
if (module == null) {
noModule.add(func);
continue;
}
List<JSONObject> funcsInModule = moduleMap.get(module);
if (funcsInModule == null) {
funcsInModule = new ArrayList<>();
moduleMap.put(module, funcsInModule);
}
funcsInModule.add(func);
}
JSONObject report = new JSONObject();
report.put("no_module", noModule);
List<JSONObject> modules = new ArrayList<>();
for (String module : moduleMap.keySet()) {
JSONObject mod = new JSONObject();
mod.put("module_name", module);
List<JSONObject> funcList = moduleMap.get(module);
mod.put("remark", funcList.get(0).getString("mod_remark"));
mod.put("module_id", funcList.get(0).getString("module_id"));
mod.put("js_module", funcList.get(0).getString("js_module"));
mod.put("js_path", funcList.get(0).getString("js_path"));
mod.put("funcs", funcList);
modules.add(mod);
}
report.put("modules", modules);
return report;
}
@Override
public void permissionClientModuleSave(int clientId, String clientMoniker) {
List<JSONObject> moduleId = permissionPartnerModuleMapper.list();
for (JSONObject moduleClientAdd : moduleId) {
moduleClientAdd.put("client_id", clientId);
moduleClientAdd.put("client_moniker", clientMoniker);
moduleClientAdd.put("module_id", moduleClientAdd.getString("id"));
moduleClientAdd.put("is_valid", 1);
permissionClientModulesService.save(moduleClientAdd);
}
}
@Override
public List<JSONObject> listModules() {
return permissionPartnerModuleMapper.list();
}
@Override
public void saveOrUpdateModule(String moduleName, PartnerModuleInfo module) {
JSONObject mod = permissionPartnerModuleMapper.find(moduleName);
if (mod == null) {
mod = new JSONObject();
mod.put("module_name", moduleName);
module.initObject(mod);
permissionPartnerModuleMapper.save(mod);
List<JSONObject> IdandMoniker = clientMapper.listClientsIdAndMoniker();
JSONObject nModuleId = permissionPartnerModuleMapper.listModuleId(moduleName);
for (JSONObject clientMod : IdandMoniker) {
clientMod.put("client_id", clientMod.getString("client_id"));
clientMod.put("client_moniker", clientMod.getString("client_moniker"));
clientMod.put("module_id", nModuleId.getString("id"));
clientMod.put("is_valid", module.getInitialize());
clientMod.put("id", IdUtil.getId());
permissionClientModulesService.save(clientMod);
}
}
module.initObject(mod);
permissionPartnerModuleMapper.update(mod);
}
@Override
public void checkAndDeleteModule(String moduleName) {
List<JSONObject> funcs = permissionPartnerFunctionMapper.listByModule(moduleName);
if (funcs.isEmpty()) {
permissionClientModuleMapper.delete(moduleName);
permissionPartnerModuleMapper.delete(moduleName);
} else {
throw new BadRequestException("Module have functions. Move them first.");
}
}
@Override
public void updateFuncInfo(String funcId, FuncInfo funcInfo) {
JSONObject update = new JSONObject();
update.put("func_id", funcId);
update.put("name", funcInfo.getName());
update.put("remark", funcInfo.getRemark());
permissionPartnerFunctionMapper.update(update);
}
@Override
@CacheEvict(value = ":login:managers:", allEntries = true)
public void setFunctionModule(String funcId, String moduleName) {
if (moduleName == null) {
throw new BadRequestException("module name not provided");
}
JSONObject mod = permissionPartnerModuleMapper.find(moduleName);
if (mod == null) {
throw new BadRequestException("Module:" + moduleName + " not exists!");
}
JSONObject nModuleId = permissionPartnerModuleMapper.listModuleId(moduleName);
JSONObject update = new JSONObject();
update.put("func_id", funcId);
update.put("module", moduleName);
update.put("module_id", nModuleId.getString("id"));
permissionPartnerFunctionMapper.update(update);
}
@Override
public List<String> listRoleFunctions(ManagerRole role) {
List<JSONObject> funcs = permissionPartnerFunctionMapper.listByRoleMask(role.getMask());
List<String> funcIds = new ArrayList<>();
for (JSONObject func : funcs) {
funcIds.add(func.getString("func_id"));
}
return funcIds;
}
@Override
@Transactional
@CacheEvict(value = ":login:managers:", allEntries = true)
public void authorizeRole(ManagerRole role, List<String> functions) {
permissionPartnerFunctionMapper.clearRolePermission(role.getInverseMask());
permissionPartnerFunctionMapper.authorizeRole(role.getMask(), functions);
}
@Override
public List<JSONObject> listUserFunctions(int role) {
return permissionPartnerFunctionMapper.listByRoleMask(role);
}
@Override
public JSONObject getPartnerFuncById(String funcId) {
return permissionPartnerFunctionMapper.find(funcId);
}
}

@ -0,0 +1,41 @@
package au.com.royalpay.payment.manage.management.sysconfig.web;
import au.com.royalpay.payment.manage.management.sysconfig.beans.PermissionClientVO;
import au.com.royalpay.payment.manage.system.core.PermissionClientModulesService;
import au.com.royalpay.payment.tools.CommonConsts;
import com.alibaba.fastjson.JSONObject;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
import javax.annotation.Resource;
/**
* Created by yixian on 2017-02-28.
*/
@RestController
@RequestMapping( value = "/sys/permission")
public class SysPermissionClientController {
@Resource
private PermissionClientModulesService permissionClientModulesService;
@RequestMapping(value = "/list", method = RequestMethod.GET)
public List<JSONObject> list(@RequestParam String client_moniker) {
return permissionClientModulesService.listByClientMoniker(client_moniker);
}
@RequestMapping(value = "/{id}", method = RequestMethod.POST)
public void modify(@ModelAttribute(CommonConsts.MANAGER_STATUS) JSONObject loginManager, @PathVariable Long id, @RequestBody PermissionClientVO permissionClientVO) {
permissionClientModulesService.switchValid(id,permissionClientVO.getIsValid(),loginManager);
}
}

@ -4,14 +4,21 @@ import au.com.royalpay.payment.manage.management.sysconfig.beans.FuncInfo;
import au.com.royalpay.payment.manage.management.sysconfig.beans.ModuleInfo;
import au.com.royalpay.payment.manage.management.sysconfig.core.PermissionManager;
import au.com.royalpay.payment.manage.permission.manager.ManagerMapping;
import au.com.royalpay.payment.tools.permission.enums.ManagerRole;
import au.com.royalpay.payment.tools.exceptions.BadRequestException;
import au.com.royalpay.payment.tools.permission.enums.ManagerRole;
import com.alibaba.fastjson.JSONObject;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
import javax.annotation.Resource;
/**
* Created by yixian on 2017-02-28.
*/

@ -0,0 +1,96 @@
package au.com.royalpay.payment.manage.management.sysconfig.web;
import au.com.royalpay.payment.manage.management.sysconfig.beans.FuncInfo;
import au.com.royalpay.payment.manage.management.sysconfig.beans.PartnerModuleInfo;
import au.com.royalpay.payment.manage.management.sysconfig.core.PermissionPartnerManager;
import au.com.royalpay.payment.tools.exceptions.BadRequestException;
import au.com.royalpay.payment.tools.permission.enums.ManagerRole;
import com.alibaba.fastjson.JSONObject;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
import javax.annotation.Resource;
/**
* Created by yangluo on 2018/07/05.
*/
@RestController
@RequestMapping( value = "/sys/permissionPartner")
public class SysPermissionPartnerConfigController {
@Resource
private PermissionPartnerManager permissionPartnerManager;
@RequestMapping(value = "/synchronize", method = RequestMethod.POST)
public void synchronizeFunctions() {
permissionPartnerManager.synchronizeFunctions();
}
@RequestMapping(value = "/functions", method = RequestMethod.GET)
public JSONObject listFunctions() {
return permissionPartnerManager.listFunctions();
}
@RequestMapping(value = "/functions/{funcId}.end", method = RequestMethod.PUT)
public void updateFunctionInfo(@PathVariable String funcId, @RequestBody FuncInfo funcInfo) {
permissionPartnerManager.updateFuncInfo(funcId, funcInfo);
}
@RequestMapping(value = "/functions/{funcId}/modules", method = RequestMethod.PUT)
public void setFuncModule(@PathVariable String funcId, @RequestBody JSONObject module) {
permissionPartnerManager.setFunctionModule(funcId, module.getString("module_name"));
}
@RequestMapping(value = "/modules", method = RequestMethod.GET)
public List<JSONObject> listModuless() {
return permissionPartnerManager.listModules();
}
@RequestMapping(value = "/modules/{moduleName}.end", method = RequestMethod.PUT)
public void updateModulee(@PathVariable String moduleName, @RequestBody PartnerModuleInfo module) {
permissionPartnerManager.saveOrUpdateModule(moduleName, module);
}
@RequestMapping(value = "/modules/{moduleName}.end", method = RequestMethod.DELETE)
public void deleteModulee(@PathVariable String moduleName) {
permissionPartnerManager.checkAndDeleteModule(moduleName);
}
@RequestMapping(value = "/roles/{roleMask}/functions", method = RequestMethod.GET)
public List<String> listRoleAuthorizedFunctions(@PathVariable String roleMask) {
try {
int mask = Integer.parseInt(roleMask, 2);
for (ManagerRole role : ManagerRole.values()) {
if (mask == role.getMask()) {
return permissionPartnerManager.listRoleFunctions(role);
}
}
} catch (NumberFormatException ignored) {
}
throw new BadRequestException("Invalid role mask:" + roleMask);
}
@RequestMapping(value = "/roles/{roleMask}/functions",method = RequestMethod.PUT)
public void authorizeRole(@PathVariable String roleMask, @RequestBody List<String> functions){
try {
int mask = Integer.parseInt(roleMask, 2);
for (ManagerRole role : ManagerRole.values()) {
if (mask == role.getMask()) {
permissionPartnerManager.authorizeRole(role,functions);
return;
}
}
} catch (NumberFormatException ignored) {
}
throw new BadRequestException("Invalid role mask:" + roleMask);
}
}

@ -0,0 +1,35 @@
package au.com.royalpay.payment.manage.mappers.act;
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;
import java.util.Date;
import java.util.List;
/**
* Created by yangluo on 2018/7/9.
*/
@AutoMapper(tablename = "act_charity", pkName = "client_moniker")
public interface ActChairtyMapper {
@AutoSql(type = SqlType.SELECT)
JSONObject findChairtyClient(@Param("client_moniker") String clientMoniker);
@AutoSql(type = SqlType.INSERT)
void save(JSONObject chairtyClient);
PageList<JSONObject> chairtyClientNum(PageBounds pageBounds);
List<JSONObject> getChairtyWeekAnalysis(@Param("begin") Date begin, @Param("end") Date end);
PageList<JSONObject> getChairtyWeekRaking(@Param("begin") Date begin, @Param("end") Date end,PageBounds pageBounds);
List<JSONObject> chairtyClientNum();
}

@ -31,4 +31,7 @@ public interface CustomerEncourageMoneyAccessLogMapper {
PageList<JSONObject> list(JSONObject params, PageBounds pageBounds);
List<JSONObject> analysisByDate(@Param("event_id") String eventId);
JSONObject sumMoney(@Param("memberId") String memberId,@Param("eventId")String eventId);
}

@ -34,4 +34,7 @@ public interface CustomerEncourageMoneyUseLogMapper {
List<JSONObject> analysisByDate(@Param("event_id") String eventId);
List<String> listUnsettled();
JSONObject sumMoney(@Param("memberId") String memberId,@Param("eventId")String eventId);
}

@ -19,7 +19,7 @@ public interface FinancialBDPrizeLogMapper {
@AutoSql(type = SqlType.INSERT)
void save(JSONObject log);
@Select("SELECT fbpl.prize_log_id,fbpl.record_id,fbpl.manager_id,fbpl.bd_name,fbpl.bd_level,SUM(fbpl.total_amount) total_amount, " +
@Select("SELECT fbpl.prize_log_id,fbpl.record_id,fbpl.manager_id,fbpl.bd_name,fbpl.kpi_amount,fbpl.bd_level,SUM(fbpl.total_amount) total_amount, " +
"SUM(fbpl.total_prize) total_prize,SUM(fbpl.total_donation) total_donation, SUM(fbpl.send_prize) send_prize, " +
"SUM(fbpl.hold_prize) hold_prize,fbpl.last_punish,fbpl.prize_type,sysm.is_valid FROM financial_bd_prize_log fbpl, " +
"sys_managers sysm " +

@ -94,6 +94,8 @@ public interface TransactionMapper {
List<JSONObject> listTransactionsForBDPrize(@Param("year") int year, @Param("month") int month, @Param("channel") String channel);
BigDecimal TotalAmountForBDLeaderPrize(@Param("year") int year, @Param("month") int month, @Param("bd_group") String bd_group);
BigDecimal TotalAmountForSydneyGMPrize(@Param("year") int year, @Param("month") int month);
List<JSONObject> listTransactionsForCityPartnerCommission(@Param("year") int year, @Param("month") int month);

@ -34,6 +34,11 @@ public interface ClientMapper {
PageList<JSONObject> listPartners(JSONObject params, PageBounds pagination);
List<JSONObject> listClientsIdAndMoniker();
List<JSONObject> passPartners(JSONObject params);
List<JSONObject> listClients();
List<JSONObject> listPartnerSelection(JSONObject params, PageBounds pagination);

@ -0,0 +1,26 @@
package au.com.royalpay.payment.manage.mappers.system;
import cn.yixblog.support.mybatis.autosql.annotations.AdvanceSelect;
import cn.yixblog.support.mybatis.autosql.annotations.AutoMapper;
import cn.yixblog.support.mybatis.autosql.annotations.AutoSql;
import cn.yixblog.support.mybatis.autosql.annotations.SqlType;
import com.alibaba.fastjson.JSONObject;
import com.fasterxml.jackson.databind.jsonFormatVisitors.JsonAnyFormatVisitor;
import org.apache.ibatis.annotations.Param;
import org.springframework.beans.factory.annotation.Autowired;
import java.util.List;
/**
* Created by yixian on 2017-02-28.
*/
@AutoMapper(tablename = "sys_permission_partner_modules_clients", pkName = "id")
public interface PermissionClientModuleMapper {
@AutoSql(type = SqlType.INSERT)
void save(JSONObject clientmodules);
void delete(@Param("module_name") String moduleName);
}

@ -0,0 +1,41 @@
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 2017-02-28.
*/
@AutoMapper(tablename = "sys_permission_partner_functions", pkName = "func_id")
public interface PermissionPartnerFunctionMapper {
@AutoSql(type = SqlType.INSERT)
void save(JSONObject func);
@AutoSql(type = SqlType.UPDATE)
void update(JSONObject func);
List<JSONObject> listByRoleMask(@Param("mask") int mask);
List<JSONObject> listAll();
@AutoSql(type = SqlType.SELECT)
List<JSONObject> listByModule(@Param("module") String moduleName);
@AutoSql(type = SqlType.DELETE)
void delete(@Param("func_id") String funcId);
void clearRolePermission(@Param("mask") int mask);
void authorizeRole(@Param("mask") int mask, @Param("func_ids") List<String> functions);
@AutoSql(type = SqlType.SELECT)
JSONObject find(@Param("func_id") String funcId);
}

@ -0,0 +1,36 @@
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 2017-02-28.
*/
@AutoMapper(tablename = "sys_permission_partner_modules", pkName = "id",pkAutoIncrement = true)
public interface PermissionPartnerModuleMapper {
@AutoSql(type = SqlType.INSERT)
void save(JSONObject module);
@AutoSql(type = SqlType.UPDATE)
void update(JSONObject module);
@AutoSql(type = SqlType.DELETE)
void delete(@Param("module_name") String moduleName);
@AutoSql(type = SqlType.SELECT)
List<JSONObject> list();
@AutoSql(type = SqlType.SELECT)
JSONObject find(@Param("module_name") String moduleName);
@AutoSql(type = SqlType.SELECT)
JSONObject listModuleId(@Param("module_name") String moduleName);
}

@ -0,0 +1,42 @@
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.AdvanceSelect;
import cn.yixblog.support.mybatis.autosql.annotations.AutoMapper;
import cn.yixblog.support.mybatis.autosql.annotations.AutoSql;
import cn.yixblog.support.mybatis.autosql.annotations.SqlType;
/**
* Created by yixian on 2017-02-28.
*/
@AutoMapper(tablename = "sys_permission_partner_modules_clients", pkName = "id")
public interface SysPermissionClientModulesMapper {
@AutoSql(type = SqlType.INSERT)
void save(JSONObject module);
@AutoSql(type = SqlType.UPDATE)
void update(JSONObject module);
@AutoSql(type = SqlType.DELETE)
void delete(@Param("id") Long id);
@AutoSql(type = SqlType.SELECT)
List<JSONObject> listByClientId(@Param("client_id") int client_id);
@AutoSql(type = SqlType.SELECT)
JSONObject find(@Param("id") Long id);
@AutoSql(type = SqlType.SELECT)
List<JSONObject> listByClientMoniker(@Param("client_moniker")String client_moniker);
@AutoSql(type = SqlType.SELECT)
@AdvanceSelect(addonWhereClause = "is_valid = 1")
List<JSONObject> listValidByClientId(@Param("client_id") int client_id);
}

@ -1,6 +1,7 @@
package au.com.royalpay.payment.manage.merchants.core.impls;
import au.com.royalpay.payment.manage.management.sysconfig.core.impls.PermissionPartnerManagerImpl;
import au.com.royalpay.payment.manage.mappers.system.ClientAccountMapper;
import au.com.royalpay.payment.manage.mappers.system.ClientApplyMapper;
import au.com.royalpay.payment.manage.mappers.system.ClientBDMapper;
@ -65,6 +66,8 @@ public class ClientApplyImpl implements ClientApply, ApplicationEventPublisherAw
private ApplicationEventPublisher publisher;
@Resource
private ClientConfigService clientConfigService;
@Resource
private PermissionPartnerManagerImpl permissionPartnerManagerImpl;
@Override
@Transactional
@ -220,6 +223,8 @@ public class ClientApplyImpl implements ClientApply, ApplicationEventPublisherAw
clientConfig.put("client_id",partner.getIntValue("client_id"));
clientConfig.put("client_moniker",info.getClientMoniker());
clientConfigService.save(clientConfig);
permissionPartnerManagerImpl.permissionClientModuleSave(partner.getIntValue("client_id"),info.getClientMoniker());
JSONObject client_bd = new JSONObject();
client_bd.put("client_id", partner.getIntValue("client_id"));

@ -13,6 +13,7 @@ import au.com.royalpay.payment.manage.analysis.mappers.TransactionAnalysisMapper
import au.com.royalpay.payment.manage.appclient.beans.AppClientBean;
import au.com.royalpay.payment.manage.application.core.SimpleClientApplyService;
import au.com.royalpay.payment.manage.device.core.DeviceManager;
import au.com.royalpay.payment.manage.management.sysconfig.core.impls.PermissionPartnerManagerImpl;
import au.com.royalpay.payment.manage.mappers.financial.FinancialBDConfigMapper;
import au.com.royalpay.payment.manage.mappers.log.*;
import au.com.royalpay.payment.manage.mappers.payment.TransactionMapper;
@ -264,6 +265,12 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid
private ClearingLogMapper clearingLogMapper;
@Resource
private ClientConfigMapper clientConfigMapper;
@Resource
private PermissionPartnerModuleMapper permissionPartnerModuleMapper;
@Resource
private PermissionClientModuleMapper permissionClientModuleMapper;
@Resource
private PermissionPartnerManagerImpl permissionPartnerManagerImpl;
@ -557,11 +564,13 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid
throw new BadRequestException("error.partner.valid.dumplicate_client_moniker");
}
try {
clientMapper.save(partner);
JSONObject clientConfig = new JSONObject();
clientConfig.put("client_id", partner.getIntValue("client_id"));
clientConfig.put("client_moniker", partner.getString("client_moniker"));
clientConfigService.save(clientConfig);
permissionPartnerManagerImpl.permissionClientModuleSave(partner.getIntValue("client_id"),partner.getString("client_moniker"));
} catch (Exception e) {
throw new BadRequestException("error.partner.valid.dumplicate_client_moniker");
}

@ -260,7 +260,7 @@ public class PartnerViewController {
@PartnerMapping(value = "/trade_logs/{orderId}", method = RequestMethod.PUT)
@ResponseBody
public void getOrderDetail(@ModelAttribute(CommonConsts.PARTNER_STATUS) JSONObject account, @PathVariable String orderId, @RequestBody JSONObject order) throws Exception {
public void updateOrderDetail(@ModelAttribute(CommonConsts.PARTNER_STATUS) JSONObject account, @PathVariable String orderId, @RequestBody JSONObject order) throws Exception {
order.put("order_id", orderId);
tradeLogService.updateOrderDetail(account.getIntValue("client_id"), order);
}
@ -366,7 +366,7 @@ public class PartnerViewController {
@PartnerMapping(value = "/sign_events/{signId}", method = RequestMethod.PUT, roles = {PartnerRole.ADMIN, PartnerRole.MANAGER})
@ResponseBody
public void listUnhandledSignEvents(@ModelAttribute(CommonConsts.PARTNER_STATUS) JSONObject account, @PathVariable String signId) {
public void listUnhandledSignEventsBySignId(@ModelAttribute(CommonConsts.PARTNER_STATUS) JSONObject account, @PathVariable String signId) {
clientSignEventSupport.sign(account, signId);
}

@ -1,21 +1,21 @@
package au.com.royalpay.payment.manage.notice.core.impls;
import java.util.Collections;
import java.util.Date;
import java.util.List;
import javax.annotation.Resource;
import org.springframework.stereotype.Service;
import au.com.royalpay.payment.manage.mappers.notice.NoticePartnerMapper;
import au.com.royalpay.payment.manage.notice.core.NoticePartner;
import au.com.royalpay.payment.tools.utils.PageListUtils;
import com.alibaba.fastjson.JSONObject;
import com.github.miemiedev.mybatis.paginator.domain.Order;
import com.github.miemiedev.mybatis.paginator.domain.PageBounds;
import com.github.miemiedev.mybatis.paginator.domain.PageList;
import au.com.royalpay.payment.manage.mappers.notice.NoticePartnerMapper;
import au.com.royalpay.payment.manage.notice.core.NoticePartner;
import au.com.royalpay.payment.tools.utils.PageListUtils;
import org.springframework.stereotype.Service;
import java.util.Collections;
import java.util.Date;
import java.util.List;
import javax.annotation.Resource;
/**
* Created by yishuqian on 29/09/2016.
@ -36,6 +36,7 @@ public class NoticePartnerImpl implements NoticePartner {
JSONObject unReadParams = new JSONObject();
unReadParams.put("client_id",partner.getIntValue("client_id"));
unReadParams.put("status",0);
unReadParams.put("is_to_app",1);
int counts = noticePartnerMapper.countNoticePartner(unReadParams);
PageList<JSONObject> partnerNotices =noticePartnerMapper.listNoticesByClientId(params,
new PageBounds(params.getIntValue("page"), params.getIntValue("limit"), Order.formString("status.asc,send_time.desc")));

@ -1,12 +1,13 @@
package au.com.royalpay.payment.manage.permission.manager;
import au.com.royalpay.payment.manage.management.sysconfig.core.PermissionPartnerManager;
import au.com.royalpay.payment.manage.management.sysconfig.core.PermissionManager;
import au.com.royalpay.payment.manage.signin.core.SignInStatusManager;
import au.com.royalpay.payment.tools.CommonConsts;
import au.com.royalpay.payment.tools.exceptions.ForbiddenException;
import au.com.royalpay.payment.tools.http.HttpUtils;
import au.com.royalpay.payment.tools.permission.enums.PartnerRole;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
@ -33,6 +34,8 @@ public class ManagerUserInterceptor extends HandlerInterceptorAdapter implements
private SignInStatusManager signInStatusManager;
@Resource
private PermissionManager permissionManager;
@Resource
private PermissionPartnerManager permissionPartnerManager;
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
@ -68,7 +71,8 @@ public class ManagerUserInterceptor extends HandlerInterceptorAdapter implements
ex = e;
}
if (ex != null) {
checkPartnerPermission(request, partner, partnerStatusKey, managerStatusKey);
String funcId = clazz.getSimpleName() + "." + method.getName();
checkPartnerPermission(request, partner, partnerStatusKey, managerStatusKey,funcId);
}
return true;
}
@ -77,11 +81,12 @@ public class ManagerUserInterceptor extends HandlerInterceptorAdapter implements
checkManagerPermisson(request, funcId, managerStatusKey);
return true;
}
checkPartnerPermission(request, partner, partnerStatusKey, managerStatusKey);
String funcId = clazz.getSimpleName() + "." + method.getName();
checkPartnerPermission(request, partner, partnerStatusKey, managerStatusKey,funcId);
return true;
}
private void checkPartnerPermission(HttpServletRequest request, RequirePartner partner, String partnerStatusKey, String managerStatusKey) {
private void checkPartnerPermission(HttpServletRequest request, RequirePartner partner, String partnerStatusKey, String managerStatusKey,String funcId) {
if (StringUtils.isEmpty(partnerStatusKey) && StringUtils.isEmpty(managerStatusKey)) {
throw new ForbiddenException("error.permission.not_login");
}
@ -98,6 +103,14 @@ public class ManagerUserInterceptor extends HandlerInterceptorAdapter implements
throw new ForbiddenException("error.permission.nopermission");
}
}
// JSONObject func = permissionPartnerManager.getPartnerFuncById(funcId);
// if(func!=null && StringUtils.isNotEmpty(func.getString("module_id"))){
// JSONArray arr = loginUser.getJSONArray("available_module_ids");
// if (arr == null || !arr.contains(func.getString("module_id"))) {
// throw new ForbiddenException("error.permission.nopermission");
// }
// }
request.setAttribute(CommonConsts.PARTNER_STATUS, loginUser);
}

@ -0,0 +1,104 @@
package au.com.royalpay.payment.manage.permission.manager.scanner;
import au.com.royalpay.payment.manage.permission.manager.RequirePartner;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
import org.springframework.core.annotation.AnnotatedElementUtils;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* Created by yixian on 2017-02-28.
*/
@Component
public class PartnerPermissionScanner implements BeanPostProcessor, PermissionPartnerReader {
private Logger logger = LoggerFactory.getLogger(getClass());
private Map<String, PermissionNode> permissionNodes = new HashMap<>();
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
Class<?> clazz = bean.getClass();
if (AnnotatedElementUtils.isAnnotated(clazz, Controller.class)) {
Method[] methods = clazz.getDeclaredMethods();
RequestMapping clazzRequestMapping = AnnotatedElementUtils.findMergedAnnotation(clazz, RequestMapping.class);
RequirePartner clazzPermission = AnnotatedElementUtils.findMergedAnnotation(clazz, RequirePartner.class);
for (Method method : methods) {
if (AnnotatedElementUtils.isAnnotated(method, RequestMapping.class)) {
RequestMapping methodMapping = AnnotatedElementUtils.findMergedAnnotation(method, RequestMapping.class);
RequirePartner methodPermission = AnnotatedElementUtils.findMergedAnnotation(method, RequirePartner.class);
if (clazzPermission != null || methodPermission != null) {
registerPermissionMapping(clazz, method, clazzRequestMapping, clazzPermission, methodMapping, methodPermission);
}
}
}
}
return bean;
}
private void registerPermissionMapping(Class<?> controller, Method method, RequestMapping clazzRequestMapping, RequirePartner clazzPermission, RequestMapping methodMapping, RequirePartner methodPermission) {
//get request uri and methods
PermissionNode node = new PermissionNode(controller.getSimpleName(), method.getName());
getRequestInfo(node, clazzRequestMapping, methodMapping);
node.setPartnerPermissions(clazzPermission, methodPermission);
logger.debug("register permission:" + node.getFuncName() + ":" + node.getRequestId());
if (permissionNodes.containsKey(node.getFuncId())) {
throw new RuntimeException("Duplicated permission function ID:" + controller.getName() + "." + method.getName());
}
permissionNodes.put(node.getFuncId(), node);
}
private void getRequestInfo(PermissionNode node, RequestMapping clazzRequestMapping, RequestMapping methodMapping) {
String uri = "";
RequestMethod[] methods = {};
if (clazzRequestMapping != null) {
if (clazzRequestMapping.value().length > 0) {
uri += clazzRequestMapping.value()[0];
}
methods = clazzRequestMapping.method();
}
if (!uri.startsWith("/")) {
uri = "/" + uri;
}
if (uri.endsWith("/")) {
uri = uri.substring(0, uri.length() - 1);
}
if (methodMapping.value().length > 0) {
String val = methodMapping.value()[0];
if (val.startsWith("/")) {
val = val.substring(1);
}
uri += "/" + val;
}
if (methodMapping.method().length > 0) {
methods = methodMapping.method();
}
node.setUri(uri);
node.setMethods(methods);
}
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
return bean;
}
@Override
public List<PermissionNode> listFunctions() {
return new ArrayList<>(permissionNodes.values());
}
}

@ -1,7 +1,10 @@
package au.com.royalpay.payment.manage.permission.manager.scanner;
import au.com.royalpay.payment.manage.permission.manager.RequirePartner;
import au.com.royalpay.payment.tools.permission.enums.ManagerRole;
import au.com.royalpay.payment.manage.permission.manager.RequireManager;
import au.com.royalpay.payment.tools.permission.enums.PartnerRole;
import com.alibaba.fastjson.JSONObject;
import org.apache.commons.lang3.StringUtils;
import org.springframework.web.bind.annotation.RequestMethod;
@ -92,4 +95,25 @@ public class PermissionNode {
this.roleMask = mask;
}
public void setPartnerPermissions(RequirePartner clazzPermission, RequirePartner methodPermission) {
PartnerRole[] roles;
if (methodPermission != null) {
roles = methodPermission.roles();
} else {
if (clazzPermission == null) {
throw new RuntimeException("Permission not set:" + getRequestId());
}
roles = clazzPermission.roles();
}
if (roles.length == 0) {
roles = PartnerRole.values();
}
int mask = 0;
for (PartnerRole role : roles) {
mask |= role.getCode();
}
this.roleMask = mask;
}
}

@ -0,0 +1,10 @@
package au.com.royalpay.payment.manage.permission.manager.scanner;
import java.util.List;
/**
* Created by yixian on 2017-02-28.
*/
public interface PermissionPartnerReader {
List<PermissionNode> listFunctions();
}

@ -16,6 +16,7 @@ import au.com.royalpay.payment.manage.signin.core.SignInAccountService;
import au.com.royalpay.payment.manage.signin.core.SignInStatusManager;
import au.com.royalpay.payment.manage.signin.events.ClientLoginEvent;
import au.com.royalpay.payment.manage.signin.events.ManagerLoginEvent;
import au.com.royalpay.payment.manage.system.core.PermissionClientModulesService;
import au.com.royalpay.payment.tools.env.PlatformEnvironment;
import au.com.royalpay.payment.tools.env.RequestEnvironment;
import au.com.royalpay.payment.tools.exceptions.BadRequestException;
@ -72,6 +73,8 @@ public class SignInAccountServiceImpl implements SignInAccountService, Applicati
private DeviceManager deviceManager;
@Resource
private ClientConfigService clientConfigService;
@Resource
private PermissionClientModulesService permissionClientModulesService;
private ApplicationEventPublisher publisher;
private static final List<String> tags = new ArrayList<>();
@ -142,6 +145,12 @@ public class SignInAccountServiceImpl implements SignInAccountService, Applicati
}
}
List<JSONObject> funcs = permissionClientModulesService.listValidByClientId(account.getIntValue("client_id"));
List<String> funcIds = new ArrayList<>();
for (JSONObject func : funcs) {
funcIds.add(func.getString("module_id"));
}
account.put("available_module_ids", funcIds);
return account;
}

@ -0,0 +1,22 @@
package au.com.royalpay.payment.manage.system.core;
import com.alibaba.fastjson.JSONObject;
import java.util.List;
/**
* @author kira
* @date 2018/7/4
*/
public interface PermissionClientModulesService {
void save(JSONObject record);
List<JSONObject> listValidByClientId(int clientId);
List<JSONObject> listByClientMoniker(String clientMoniker);
void switchValid(Long id,boolean isValid,JSONObject account);
}

@ -0,0 +1,21 @@
package au.com.royalpay.payment.manage.system.core;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.stereotype.Service;
/**
* @author kira
* @date 2018/7/5
*/
@Service
public class SystemPackageCacheSupport {
@CacheEvict(value = ":system:client_permission:", key = "#client_moniker")
public void clearClientPermission(String client_moniker){
}
@CacheEvict(value = ":system:client_permission:", key = "#client_id+''")
public void clearClientPermission(int client_id){
}
}

@ -0,0 +1,98 @@
package au.com.royalpay.payment.manage.system.core.beans;
import com.fasterxml.jackson.annotation.JsonFormat;
import org.springframework.data.mongodb.core.mapping.Document;
import java.util.Date;
/**
* @author kira
* @date 2018/7/4
*/
@Document(collection = "permission_client_module_log")
public class PermissionClientModuleLog {
private long id;
private int clientId;
private String clientMoniker;
private String business;
private String userId;
private String userName;
private String originData;
private String newData;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone="GMT+10")
private Date createTime;
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public int getClientId() {
return clientId;
}
public void setClientId(int clientId) {
this.clientId = clientId;
}
public String getClientMoniker() {
return clientMoniker;
}
public void setClientMoniker(String clientMoniker) {
this.clientMoniker = clientMoniker;
}
public String getBusiness() {
return business;
}
public void setBusiness(String business) {
this.business = business;
}
public String getUserId() {
return userId;
}
public void setUserId(String userId) {
this.userId = userId;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getOriginData() {
return originData;
}
public void setOriginData(String originData) {
this.originData = originData;
}
public String getNewData() {
return newData;
}
public void setNewData(String newData) {
this.newData = newData;
}
public Date getCreateTime() {
return createTime;
}
public void setCreateTime(Date createTime) {
this.createTime = createTime;
}
}

@ -0,0 +1,90 @@
package au.com.royalpay.payment.manage.system.core.impl;
import au.com.royalpay.payment.manage.mappers.system.SysPermissionClientModulesMapper;
import au.com.royalpay.payment.manage.system.core.PermissionClientModulesService;
import au.com.royalpay.payment.manage.system.core.SystemPackageCacheSupport;
import au.com.royalpay.payment.manage.system.core.beans.PermissionClientModuleLog;
import au.com.royalpay.payment.tools.exceptions.NotFoundException;
import au.com.royalpay.payment.tools.utils.id.IdUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.stereotype.Service;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import javax.annotation.Resource;
/**
* @author kira
* @date 2018/7/4
*/
@Service
public class PermissionClientModulesServiceImpl implements PermissionClientModulesService {
@Resource
private SysPermissionClientModulesMapper permissionClientModulesMapper;
@Resource
private MongoTemplate mongoTemplate;
@Resource
private SystemPackageCacheSupport systemPackageCacheSupport;
@Override
public void save(JSONObject record) {
record.put("id",IdUtil.getId());
permissionClientModulesMapper.save(record);
}
@Override
@Cacheable(value = ":system:client_permission:", key = "#clientId+''")
public List<JSONObject> listValidByClientId(int clientId) {
return permissionClientModulesMapper.listValidByClientId(clientId);
}
@Override
@Cacheable(value = ":system:client_permission:", key = "#clientMoniker")
public List<JSONObject> listByClientMoniker(String clientMoniker) {
return permissionClientModulesMapper.listByClientMoniker(clientMoniker);
}
@Override
public void switchValid(Long id, boolean isValid, JSONObject account) {
JSONObject record = permissionClientModulesMapper.find(id);
if (record == null) {
throw new NotFoundException("Permission Client Module Not Found id:" + id);
}
JSONObject updateRecord = new JSONObject();
updateRecord.put("is_valid", isValid);
saveMongoLog(account,record,updateRecord,(isValid?"打开":"关闭")+"模块 id:"+record.getString("module_id"));
updateRecord.put("id", record.getLong("id"));
permissionClientModulesMapper.update(updateRecord);
systemPackageCacheSupport.clearClientPermission(record.getString("client_moniker"));
systemPackageCacheSupport.clearClientPermission(record.getIntValue("client_id"));
}
private void saveMongoLog(JSONObject account, JSONObject oldRecord, JSONObject modifyData, String business) {
modifyData.remove("id");
PermissionClientModuleLog mongoRecord = new PermissionClientModuleLog();
mongoRecord.setBusiness(business);
mongoRecord.setClientId(oldRecord.getIntValue("client_id"));
mongoRecord.setClientMoniker(oldRecord.getString("client_moniker"));
mongoRecord.setCreateTime(new Date());
mongoRecord.setId(IdUtil.getId());
mongoRecord.setUserId(account.getString("manager_id"));
mongoRecord.setUserName(account.getString("display_name"));
mongoRecord.setNewData(modifyData.toJSONString());
Map<String, Object> beforeModify = modifyData.keySet().stream().collect(Collectors.toMap(key -> key, oldRecord::get));
mongoRecord.setOriginData(JSON.toJSONString(beforeModify));
mongoTemplate.insert(mongoRecord);
}
}

@ -0,0 +1,28 @@
<?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.act.ActChairtyMapper">
<select id="chairtyClientNum" resultType="com.alibaba.fastjson.JSONObject">
select count(DISTINCT order_id) as count_ordernum ,client_moniker,active_time,ifnull(sum(pmt_transactions.clearing_amount),0) as sum_ordernum
from act_charity
left JOIN pmt_transactions on act_charity.client_id = pmt_transactions.client_id
and pmt_transactions.transaction_type='Credit' and pmt_transactions.transaction_time>=act_charity.active_time
and pmt_transactions.transaction_time&lt;'2018-09-01' and pmt_transactions.transaction_time>='2018-07-09'
and pmt_transactions.channel != 'Settlement'
GROUP BY act_charity.client_id order by count_ordernum desc
</select>
<select id="getChairtyWeekAnalysis" resultType="com.alibaba.fastjson.JSONObject">
select count(DISTINCT order_id) as count_ordernum,date_format(pmt_transactions.transaction_time,'%Y-%m-%d') as orderdate,client_moniker,ifnull(sum(pmt_transactions.clearing_amount),0) as sum_ordernum from act_charity inner JOIN pmt_transactions ON act_charity.client_id = pmt_transactions.client_id
and pmt_transactions.transaction_type='Credit' and pmt_transactions.transaction_time>=#{begin} and pmt_transactions.transaction_time&lt;=#{end} and pmt_transactions.transaction_time>=act_charity.active_time
and pmt_transactions.channel != 'Settlement'
and pmt_transactions.transaction_time&lt;'2018-09-01' and pmt_transactions.transaction_time>='2018-07-09'
group by date_format(pmt_transactions.transaction_time,'%Y-%m-%d')
</select>
<select id="getChairtyWeekRaking" resultType="com.alibaba.fastjson.JSONObject">
select count(DISTINCT pmt_transactions.order_id) *0.01 as chair_ordernum,act_charity.client_moniker,ifnull(sum(pmt_transactions.clearing_amount),0) as sum_ordernum from act_charity left JOIN pmt_transactions ON act_charity.client_id = pmt_transactions.client_id
and pmt_transactions.transaction_type='Credit' and pmt_transactions.transaction_time&gt;=#{begin} and pmt_transactions.transaction_time&lt;=#{end} and pmt_transactions.transaction_time>=act_charity.active_time
and pmt_transactions.transaction_time&lt;'2018-09-01' and pmt_transactions.transaction_time>='2018-07-09'
GROUP BY act_charity.client_moniker order by chair_ordernum desc
</select>
</mapper>

@ -42,4 +42,7 @@
GROUP BY access_date
ORDER BY access_date DESC
</select>
<select id="sumMoney" resultType="com.alibaba.fastjson.JSONObject">
select sum(actural_amount) actural_amount from cus_encourage_money_access_log where member_id = #{memberId} and event_id = #{eventId};
</select>
</mapper>

@ -43,4 +43,7 @@
INNER JOIN pmt_orders o ON o.order_id=u.order_id AND o.status>4
WHERE u.transaction_id is null
</select>
<select id="sumMoney" resultType="com.alibaba.fastjson.JSONObject">
select sum(use_amount) use_amount from cus_encourage_money_use_log where member_id = #{memberId} and event_id = #{eventId} and transaction_id is not null
</select>
</mapper>

@ -9,7 +9,8 @@
c.bd_level,
c.city,
c.get_prize,
c.bd_group
c.bd_group,
c.kpi_amount
FROM sys_managers m
LEFT JOIN financial_bd_config c ON c.manager_id = m.manager_id
WHERE m.role & 4 > 0 AND m.is_valid = 1 AND (m.org_id = 1 OR m.org_id IS NULL)

@ -8,7 +8,7 @@
</select>
<select id="getReport" resultType="com.alibaba.fastjson.JSONObject">
SELECT
r.*,
r.*,l.kpi_amount,
sum(total_prize) total_prize,
sum(send_prize) total_send_prize,
sum(total_donation) total_donation

@ -28,4 +28,12 @@
LEFT JOIN sys_accounts a ON a.account_id = nc.read_id
WHERE nc.status = '1' AND nc.notice_id = #{notice_id}
</select>
<select id="countNoticePartner" resultType="int">
select count(*) from sys_notice_client c left join sys_notice n on n.notice_id = c.notice_id
where c.`status` = #{status} and c.client_id = #{client_id}
<if test="is_to_app!=null">
and n.is_to_app=#{is_to_app}
</if>
</select>
</mapper>

@ -100,14 +100,14 @@
<select id="analysisTransFlow" resultType="com.alibaba.fastjson.JSONObject">
SELECT
count(t.transaction_id) order_count,
ifnull(sum(if(t.transaction_type='Credit' and t.refund_id is null and o.currency!='CNY',o.display_amount,0)),0)
count(DISTINCT o.order_id) order_count,
ifnull(sum(if(t.transaction_type='Credit' and t.refund_id is null and t.system_generate=0 and o.currency!='CNY',o.display_amount,0)),0)
display_amount,
ifnull(sum(if(t.transaction_type='Credit' and t.refund_id is null and o.currency!='CNY' and
ifnull(sum(if(t.transaction_type='Credit' and t.refund_id is null and t.system_generate=0 and o.currency!='CNY' and
o.pre_authorization=1,o.display_amount,0)),0) pre_display_amount,
ifnull(sum(if(t.transaction_type='Credit' and t.refund_id is null and o.currency='CNY',o.display_amount,0)),0)
ifnull(sum(if(t.transaction_type='Credit' and t.refund_id is null and t.system_generate=0 and o.currency='CNY',o.display_amount,0)),0)
cny_display_amount,
ifnull(sum(if(t.transaction_type='Credit' and t.refund_id is null and o.currency='CNY' and
ifnull(sum(if(t.transaction_type='Credit' and t.refund_id is null and t.system_generate=0 and o.currency='CNY' and
o.pre_authorization=1,o.display_amount,0)),0) pre_cny_display_amount,
ifnull(sum(if(t.transaction_type='Credit',t.clearing_amount,0)),0) paid_fee,
sum(if(t.transaction_type='Debit' AND t.refund_id is NOT NULL,t.clearing_amount,0))*-1
@ -495,10 +495,7 @@
INNER JOIN pmt_orders o ON o.order_id = t.order_id
INNER JOIN sys_clients c ON c.client_id = o.client_id AND c.org_id = 1
WHERE year(o.create_time) = #{year} AND month(o.create_time) = #{month} AND t.channel != 'Settlement'
<if test="channel=='Wechat'">
and t.channel not in ('Alipay','Bestpay')
</if>
<if test="channel!='Wechat'">
<if test="channel!=null">
and t.channel = #{channel}
</if>
GROUP BY o.client_id, trade_date
@ -507,7 +504,7 @@
<select id="TotalAmountForBDLeaderPrize" resultType="java.math.BigDecimal">
SELECT
sum(if(t.transaction_type = 'Credit', t.clearing_amount, -t.clearing_amount))
ifnull(sum(if(t.transaction_type = 'Credit', t.clearing_amount, -t.clearing_amount)),0)
total
FROM pmt_transactions t
INNER JOIN pmt_orders o ON o.order_id = t.order_id
@ -528,6 +525,30 @@
where b.is_valid=1 and b.start_date&lt;=now() and (b.end_date is null or b.end_date &gt;= now())
AND c.bd_group=#{bd_group} or c.manager_id=#{bd_group})
</select>
<select id="TotalAmountForSydneyGMPrize" resultType="java.math.BigDecimal">
SELECT
sum(if(t.transaction_type = 'Credit', t.clearing_amount, -t.clearing_amount))
total
FROM pmt_transactions t
INNER JOIN pmt_orders o ON o.order_id = t.order_id
INNER JOIN sys_clients c ON c.client_id = o.client_id AND c.org_id = 1
WHERE year(o.create_time) = #{year} AND month(o.create_time) = #{month}
AND(
t.transaction_type = 'Credit'
OR t.refund_id IS NOT NULL
)
AND(
o. STATUS =5
OR o. STATUS =6
OR o. STATUS =7
)
and t.client_id in
(SELECT b.client_id FROM sys_client_bd b
INNER JOIN financial_bd_config c ON c.manager_id=b.bd_id
where b.is_valid=1 and b.start_date&lt;=now() and (b.end_date is null or b.end_date &gt;= now())
AND c.city='Sydney')
</select>
<select id="listTransactionsForCityPartnerCommission" resultType="com.alibaba.fastjson.JSONObject">
<![CDATA[
SELECT

@ -20,7 +20,8 @@
SELECT
b.*,
c.bd_level,
c.get_prize
c.get_prize,
c.kpi_amount
FROM sys_client_bd b
LEFT JOIN financial_bd_config c ON c.manager_id = b.bd_id
WHERE client_id = #{client_id} AND start_date <= #{date} AND (end_date > #{date} OR end_date IS NULL) AND

@ -166,6 +166,25 @@
<if test="is_valid">and c.is_valid=1</if>
</where>
</select>
<select id="passPartners" resultType="com.alibaba.fastjson.JSONObject">
SELECT
company_name,short_name,client_moniker,alipayindustry,address,suburb,state,postcode,business_hours,company_phone,merchant_introduction
from sys_clients
<where>
(approve_result=1 or (approve_result=2 and (source=1 or source=2)))
<if test="datefrom!=null">
AND approve_time >= #{datefrom}
</if>
<if test="dateto!=null">
AND approve_time &lt;= #{dateto}
</if>
</where>
</select>
<select id="listClientsIdAndMoniker" resultType="com.alibaba.fastjson.JSONObject">
SELECT
client_id,client_moniker
from sys_clients
</select>
<select id="listPartnerSelection" resultType="com.alibaba.fastjson.JSONObject">
SELECT c.*,o.name org_name FROM sys_clients c
inner join sys_org o on o.org_id=c.org_id

@ -0,0 +1,8 @@
<?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.PermissionClientModuleMapper">
<delete id="delete">
delete from sys_permission_partner_modules_clients
where module_id = (SELECT id from sys_permission_partner_modules where module_name=#{module_name})
</delete>
</mapper>

@ -0,0 +1,39 @@
<?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.PermissionPartnerFunctionMapper">
<sql id="joinModule">
SELECT
f.*,
m.js_module,
m.js_path,
m.remark mod_remark
FROM sys_permission_partner_functions f
LEFT JOIN sys_permission_partner_modules m ON m.module_name = f.module
</sql>
<update id="clearRolePermission">
<![CDATA[
UPDATE sys_permission_partner_functions
SET role = role & #{mask}
]]>
</update>
<update id="authorizeRole">
<![CDATA[
UPDATE sys_permission_partner_functions
SET role = role | #{mask}
WHERE func_id in
]]>
<foreach collection="func_ids" item="id" open="(" close=")" separator=",">
#{id}
</foreach>
</update>
<select id="listByRoleMask" resultType="com.alibaba.fastjson.JSONObject">
<include refid="joinModule"/>
<![CDATA[
WHERE f.role & #{mask} >0
]]>
</select>
<select id="listAll" resultType="com.alibaba.fastjson.JSONObject">
<include refid="joinModule"/>
ORDER BY f.module ASC,f.func_id ASC
</select>
</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.SysPermissionClientModulesMapper">
<sql id="joinModule">
SELECT
f.*,
m.js_module,
m.js_path,
m.remark mod_remark
FROM sys_permission_functions f
LEFT JOIN sys_permission_modules m ON m.module_name = f.module
</sql>
<select id="listByClientMoniker" resultType="com.alibaba.fastjson.JSONObject">
select pmc.*,pm.module_name from sys_permission_partner_modules_clients pmc left join sys_permission_partner_modules pm
on pmc.module_id = pm.id and pmc.client_moniker = #{client_moniker}
</select>
</mapper>

@ -21,7 +21,7 @@
<div class="main-container">
<img src="/static/templates/activity/encourage_money/desc_banner.png" class="banner-img">
<div class="title-box">
<div class="welcome">欢迎使用微信支付</div>
<div class="welcome">欢迎使用RoyalPay支付</div>
<div class="title">奖励再翻倍</div>
<img class="bubble" src="/static/templates/activity/encourage_money/bubble.png">
</div>
@ -32,7 +32,7 @@
<img src="/static/templates/activity/encourage_money/title-icon.png" class="title-icon title-icon-right">
</div>
<div class="content">
用户在支持微信支付的商户进行消费,金额<span class="notice">≥10澳币</span>时,
用户在支持RoyalPay的商户使用微信、支付宝进行消费,金额<span class="notice">≥10澳币</span>时,
立即获得随机鼓励金。最高可达888元每人每天可领取<span class="notice">三次</span>
</div>
</div>
@ -68,9 +68,9 @@
鼓励金仅在活动期间有效,活动结束鼓励金自动清零。
</div>
</div>
<a class="merchants-link" href="/act/encourage_money/merchants">
<span class="text">查看活动商家</span>
</a>
<!--<a class="merchants-link" href="/act/encourage_money/merchants">-->
<!--<span class="text">查看活动商家</span>-->
<!--</a>-->
<div class="remark">本活动的最终解释权归RoyalPay所有</div>
</div>
</body>

@ -1,5 +1,5 @@
<!doctype html>
<html>
<html xmlns:th="http://www.w3.org/1999/xhtml">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width,initial-scale=1,user-scalable=0">
@ -16,11 +16,14 @@
<script type="text/javascript" src="//res.wx.qq.com/open/js/jweixin-1.0.0.js"></script>
<script type="text/javascript" src="/static/lib/jquery/jquery-2.1.4.min.js"></script>
<script type="text/javascript" src="/static/templates/disable_wechat_menu.js?t=201607281849"></script>
<script type="text/javascript" data-th-inline="javascript">
</script>
</head>
<body>
<div class="main-container">
<div class="banner">
<img class="head-box" data-th-src="@{${wxUser['headimgurl']}">
<img class="head-box" data-th-src="@{${user['headimg']}?${user['headimg']}:'/static/images/act/encourage_money/default_headimg.png' }">
</div>
<div class="desc">活动期间任意消费满10澳币获随机鼓励金</div>
<div class="detail-box">
@ -29,26 +32,26 @@
</div>
<div class="balance-log-container" data-th-if="${balance_status['logs']}">
<div class="item" data-th-each="item : ${balance_status['logs']}" data-th-classappend="${item['is_today']?'today':''}" >
<div class="date-box" data-th-text="${item['date_str']}">
</div>
<div class="count" data-th-classappend="${item['type'] eq 'Debit']?'debit':''}" data-th-text="${#numbers.formatDecimal(item['amount'],1,2)}"></div>
<div class="factor" data-th-if="${item['factor']}>1" data-th-text="|已翻${item['factor']}倍|">
<div class="item" data-th-each="item : ${balance_status['logs']}" data-th-classappend="${item['is_today']}?'today':''" >
<div class="date-box data-box-amount" style="width: 30%; text-align: center;" data-th-text="${item['date_str']}">
</div>
<div class="date-box data-box-amount" style="width: 30%; text-align: center" data-th-classappend="${item['type']} eq 'Debit'?'used':''" data-th-text="${'$'+#numbers.formatDecimal(item['amount'],1,2)}"></div>
</div>
<div class="date-box data-box-amount" style="width: 40%; text-align: center;font-size: 14px" data-th-if="${item['factor']}>1" data-th-text="|已翻${item['factor']}倍|">
</div>
</div>
</div>
<div class="balance-footer">
<div class="row">
<div class="label">已用鼓励金:</div>
<div class="count" data-th-text="${#numbers.formatDecimal(balance_status['member']['used_amount'],1,2)}"></div>
<div class="count" data-th-text="${'$'+#numbers.formatDecimal(balance_status['member']['used_amount'],1,2)}"></div>
</div>
<div class="row">
<div class="label">当前鼓励金余额:</div>
<div class="count available" data-th-text="${#numbers.formatDecimal(balance_status['member']['encourage_balance'],1,2)}"></div>
<div class="count available" data-th-text="${'$'+#numbers.formatDecimal(balance_status['member']['encourage_balance'],1,2)}"></div>
</div>
</div>
</div>

@ -307,13 +307,13 @@ margin-bottom: 10%;"/>
<!--</a>-->
<!--</li>-->
<!-- <li ui-sref-active="active" ng-if="('encourage'|withModule)">
<li ui-sref-active="active" ng-if="('encourage'|withModule)">
<a ui-sref="encourageAct">
<i class="fa fa-gift"></i> <span>鼓励金</span>
</a>
</li>
<li ui-sref-active="active" ng-if="('act_customer_redpack'|withModule)">
<!--<li ui-sref-active="active" ng-if="('act_customer_redpack'|withModule)">
<a ui-sref="customer_redpack">
<i class="fa fa-gift"></i> <span>红包返现</span>
</a>
@ -347,6 +347,11 @@ margin-bottom: 10%;"/>
<i class="fa fa-money"></i> <span>合同签约情况</span>
</a>
</li>
<li ui-sref-active="active" ng-if="'actChairty'|withModule">
<a ui-sref="act_chairty" ui-sref-opts="{reload:true}">
<i class="fa fa-users"></i> <span>半边天公益活动</span>
</a>
</li>
<li class="header nav-header" ng-if="('1000000000000'|withRole)">机构|Agent</li>
<li ui-sref-active="active" ng-if="('1000000000000'|withRole)">

@ -798,6 +798,11 @@
</div>
</form>
</div>
<div style="margin-top: 25px;" ng-show="chooseArray[0]">
<a class="text-primary" style="font-size: 14px;text-shadow: #000" target="_blank" href="https://www.globalfreepay.com/">
Application Entrance for Non-Australian Merchants>>
</a>
</div>
</div>
<div class="modal fade">

@ -0,0 +1,206 @@
define(['angular', 'uiBootstrap', 'uiRouter', 'angularEcharts'], function (angular) {
'use strict';
var colors = ['#00c0ef', '#00a65a', '#ff851b'];
var app = angular.module('actChairty', ['ui.bootstrap', 'ui.router', 'ngEcharts']);
var total;
app.config(['$stateProvider', function ($stateProvider) {
$stateProvider.state('act_chairty', {
url: '/act_chairty',
templateUrl: '/static/actchairty/templates/act_chairty_merchants.html',
controller: 'actChairtyConfDialogCtrl'
}).state('act_chairty.analysis',{
url:'/act_chairty/analysis',
templateUrl: '/static/actchairty/templates/act_chairty_analysis.html',
controller: 'actChairtyAnalysisConfDialogCtrl'
})
}]);
app.controller('actChairtyConfDialogCtrl', ['$scope', '$http', '$filter', function ($scope, $http, $filter) {
$scope.pagination = {};
$scope.today = new Date();
$scope.loadClients = function (page) {
var params = {page: page || $scope.pagination.page || 1};
$http.get('/actchairty/clients', {params: params}).then(function (resp) {
$scope.clients = resp.data.data;
$scope.pagination = resp.data.pagination;
})
};
$scope.loadClients();
$scope.new_conf = {};
$scope.ctrl = {dateInput: false};
$scope.submitClient = function () {
var client_moniker = $scope.new_conf.client_moniker;
$scope.msg = null;
var conf = {
date: $filter('date')($scope.new_conf.date, 'yyyy-MM-dd'),
};
$http.put('/actchairty/clients/' + $scope.new_conf.client_moniker, conf).then(function () {
$scope.new_conf = {};
$scope.loadClients();
$scope.msg = "商户创建成功商户ID"+ client_moniker + " 参加时间:" + conf.date;
}, function (resp) {
$scope.msg = resp.data.message;
});
};
}]);
app.controller('actChairtyAnalysisConfDialogCtrl', ['$scope', '$http', '$filter', function ($scope, $http, $filter) {
$scope.params = {};
$scope.today = new Date();
$scope.params.end = new Date();
var date = new Date();
date.setDate(date.getDate()-30);
$scope.params.begin = date;
$scope.thisMonth = function () {
$scope.params.end = new Date();
var monthBegin = new Date();
monthBegin.setDate(1);
$scope.params.begin = monthBegin;
$scope.doAnalysis(1);
};
$scope.lastMonth = function () {
var monthFinish = new Date();
monthFinish.setDate(0);
$scope.params.end = monthFinish;
var monthBegin = new Date();
monthBegin.setDate(0);
monthBegin.setDate(1);
$scope.params.begin = monthBegin;
$scope.doAnalysis(1);
};
$scope.doPartnerTotalRanking = function (page) {
var params = {};
params.page = page||$scope.total_ranking_pagination.page || 1;
params.limit = 10;
$http.get('/actchairty/clients', {params: params}).then(function (resp) {
$scope.chairtyPartnersRanking = resp.data.data;
$scope.total_ranking_pagination = resp.data.pagination;
});
$scope.getTotalAmount = function () {
$http.get('/actchairty/total').then(function (resp) {
$scope.totalAmount = resp.data.amount;
$scope.totalChairty = resp.data.chairty;
})
};
};
$scope.getClientsCashbackRankingByDate = function (date,page) {
var dateend = angular.copy($scope.params);
$scope.event_date = date;
var params = {};
params.begin = date;
var event_date_format=date.replace(/^(\d{4})(\d{2})(\d{2})$/, "$1-$2-$3")
var endDate = new Date(event_date_format);
endDate.setDate(endDate.getDate()+6);
var end1 = $filter('date')(endDate, 'yyyyMMdd');
var end2 = $filter('date')(dateend.end, 'yyyyMMdd');
if (end1 > end2) {
params.end =$filter('date')(dateend.end,'yyyyMMdd');
}
else {
params.end =$filter('date')(endDate,'yyyyMMdd');
}
params.page = page||$scope.day_ranking_pagination.page || 1;
params.limit = 10;
if ($scope.params.cashback_type){
params.cashback_type = angular.copy($scope.params.cashback_type);
}
$http.get('/actchairty/ranking', {params: params}).then(function (resp) {
$scope.cashbackPartnersRankingByDate = resp.data.data;
$scope.day_ranking_pagination = resp.data.pagination;
});
};
$scope.doAnalysis = function () {
var params = angular.copy($scope.params);
if (params.begin) {
params.begin = $filter('date')(params.begin, 'yyyyMMdd');
} else {
params.begin = $filter('date')(new Date(), 'yyyyMMdd');
}
if (params.end) {
params.end = $filter('date')(params.end, 'yyyyMMdd');
} else {
params.end = $filter('date')(new Date(), 'yyyyMMdd');
}
$http.get('/actchairty/traAnalysis', {params: params}).then(function (resp) {
$scope.cashbackDaily = angular.copy(resp.data);
var dates = [];
var count_ordernum = [];
var sum_ordernum = [];
var chairty_amount = [];
resp.data.forEach(function (e) {
dates.push(e.weekstart);
chairty_amount.push(e.chairty_amount);
count_ordernum.push(e.count_ordernum);
sum_ordernum.push(e.sum_ordernum);
});
var cashbackHistoryConfig = function (dates,sum_ordernum, count_ordernum, chairty_amount) {
return {
color: colors,
tooltip: {
trigger: 'axis',
axisPointer: { // 坐标轴指示器,坐标轴触发有效
type: 'shadow' // 默认为直线,可选为:'line' | 'shadow'
}
},
legend: {
data: ['周一交易额', '交易量','公益额']
},
grid: {
left: '3%',
right: '4%',
bottom: '3%',
containLabel: true
},
xAxis: [
{
type: 'category',
data: dates
}
],
yAxis: [
{
type: 'value',
name: 'Amount(AUD)'
}
],
series: [{
name: '周一交易额',
type: 'bar',
data: sum_ordernum
}, {
name: '交易量',
type: 'bar',
data: count_ordernum
}, {
name: '公益额',
type: 'bar',
data: chairty_amount
}
]
};
};
$scope.settleDelayHistory = cashbackHistoryConfig(dates,sum_ordernum, count_ordernum, chairty_amount);
});
$scope.doPartnerTotalRanking(1);
};
$scope.doAnalysis(1);
$scope.getTotalAmount(1);
$scope.settleDelayEchart = function (chart) {
chart.on('click', function (params) {
$scope.cashBack_total_daily = $scope.cashbackDaily[params.dataIndex].chairty_amount;
var event_date = $scope.cashbackDaily[params.dataIndex].weekstart;
if (event_date) {
event_date+="";
var event_date_format=event_date.replace(/^(\d{4})(\d{2})(\d{2})$/, "$1-$2-$3")
var date = new Date(event_date_format);
$scope.getClientsCashbackRankingByDate($filter('date')(date,'yyyyMMdd'),1);
}
})
};
}]);
return app;
});

@ -0,0 +1,138 @@
<div class="box box-warning">
<div class="box-header">
<div class="row">
<div class="col-sm-12">
<div class="form-horizontal">
<div class="form-group col-xs-12 col-sm-12">
<label class="control-label col-xs-4 col-sm-2">Date Range</label>
<div class="col-sm-10">
<div class="form-control-static form-inline">
<div style="display: inline-block">
<input class="form-control" id="date-from-input"
ng-model="params.begin"
uib-datepicker-popup size="10" placeholder="From"
is-open="dateBegin.open" ng-click="dateBegin.open=true"
datepicker-options="{maxDate:params.end||today}">
</div>
~
<div style="display: inline-block">
<input class="form-control" id="date-to-input" ng-model="params.end"
uib-datepicker-popup size="10" placeholder="To"
is-open="dateTo.open" ng-click="dateTo.open=true"
datepicker-options="{minDate:params.begin,maxDate:today}">
</div>
<div class="btn-group">
<a role="button" class="btn btn-default btn-sm"
ng-click="thisMonth()">This Month</a>
</div>
<div class="btn-group">
<a role="button" class="btn btn-default btn-sm" ng-click="lastMonth()">Last Month</a>
</div>
<button class="btn btn-success" type="button"
ng-click="doAnalysis()">
<i class="fa fa-search"></i>
</button>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="box">
<!--<div class="box-header with-border">Trading customer quantity trends</div>-->
<div class="box-body">
<div class="chart col-md-12" echarts="settleDelayHistory" style="height: 300px"
chart-setter="settleDelayEchart($chart)"
ng-class="{nodata:redPackSendLogsHistory.nodata}"></div>
</div>
</div>
<div class="box">
<div class="box-header">
<h3 class="box-title">Chairty Ranking</h3>
</div>
<div class="box-body">
<div class="row cen col-sm-12">
<div class="col-md-6">
<p class="text-center">到目前为止交易总金额排名<span ng-if="totalAmount!=null">(总额:{{totalAmount}})</span>
<span ng-if="totalChairty!=null">(总公益额:{{totalChairty}})</span>
</p>
<div class="table-responsive">
<table class="table table-bordered table-hover table-striped">
<thead>
<tr>
<th>Partner Name</th>
<th>Amount</th>
<th>订单量</th>
<th>捐款额</th>
</tr>
</thead>
<tbody>
<tr ng-repeat="client in chairtyPartnersRanking">
<!--<td style="text-align: center;font-style: italic;font-size: larger"-->
<!--ng-bind="$index+1+'.'"></td>-->
<td ng-bind="client.client_moniker"></td>
<td ng-bind="client.sum_ordernum"></td>
<td ng-bind="client.count_ordernum"></td>
<td ng-bind="client.chairty_num"></td>
</tr>
</tbody>
</table>
</div>
<uib-pagination ng-if="chairtyPartnersRanking.length"
class="pagination"
total-items="total_ranking_pagination.totalCount"
boundary-links="true"
ng-model="total_ranking_pagination.page"
items-per-page="total_ranking_pagination.limit"
max-size="10"
ng-change="doPartnerTotalRanking()"
previous-text="&lsaquo;"
next-text="&rsaquo;"
first-text="&laquo;"
last-text="&raquo;"></uib-pagination>
<div class="row">
<div class="col-xs-12">Total Records:{{total_ranking_pagination.totalCount}};Total Pages:{{total_ranking_pagination.totalPages}}</div>
</div>
</div>
<div class="col-md-6">
<p class="text-center"><span style="color: red">{{event_date}}</span> 商户半边天公益活动总排名 <span
style="font-size: smaller;color: grey">(选择上图相应的日期获取当日排名)</span><span ng-if="cashBack_total_daily!=null">当日总额:{{cashBack_total_daily}}</span></p>
<div class="table-responsive">
<table class="table table-bordered table-hover table-striped">
<thead>
<tr>
<th>Partner Name</th>
<th>Amount</th>
<th>捐款额</th>
</tr>
</thead>
<tbody>
<tr ng-repeat="client in cashbackPartnersRankingByDate">
<td ng-bind="client.client_moniker"></td>
<td ng-bind="client.sum_ordernum"></td>
<td ng-bind="client.chair_ordernum"></td>
</tr>
</tbody>
</table>
</div>
<uib-pagination ng-if="chairtyPartnersRanking.length"
class="pagination"
total-items="day_ranking_pagination.totalCount"
boundary-links="true"
ng-model="day_ranking_pagination.page"
items-per-page="day_ranking_pagination.limit"
max-size="10"
ng-change="getClientsCashbackRankingByDate(event_date)"
previous-text="&lsaquo;"
next-text="&rsaquo;"
first-text="&laquo;"
last-text="&raquo;"></uib-pagination>
<div class="row">
<div class="col-xs-12">Total Records:{{day_ranking_pagination.totalCount}};Total Pages:{{day_ranking_pagination.totalPages}}</div>
</div>
</div>
</div>
</div>
</div>

@ -0,0 +1,93 @@
<section class="content-header">
<h4>半边天公益活动</h4>
<ol class="breadcrumb">
<li>
<i class="fa fa-users"></i> Activity
</li>
<li class="active">
Act Chairty
</li>
</ol>
</section>
<div class="content">
<div class="row">
<div class="col-sm-12">
<div class="nav-tabs-custom">
<ul class="nav nav-tabs">
<li ui-sref-active-eq="active">
<a ui-sref="act_chairty">Config</a>
</li>
<li ui-sref-active="active">
<a ui-sref="act_chairty.analysis">Analysis</a>
</li>
</ul>
<div class="tab-content" ui-view>
<div class="modal-body">
<div class="alert alert-danger" ng-if="msg" ng-bind="msg"></div>
<div class="form-inline">
<div class="form-group">
<input class="form-control" placeholder="Client Moniker" ng-model="new_conf.client_moniker">
</div>
<div class="form-group">
<input class="form-control" placeholder="Date" ng-model="new_conf.date"
uib-datepicker-popup size="10" is-open="ctrl.dateInput" ng-click="ctrl.dateInput=true"
>
</div>
<button class="btn btn-success" ng-click="submitClient()">Submit</button>
</div>
<div class="row" ng-if="clients.length">
<div class="col-xs-12 table-responsive">
<table class="table table-hover table-striped">
<thead>
<tr>
<th>Client Moniker</th>
<th>Active Time</th>
<th>订单量</th>
<th>订单金额</th>
<th>捐款额</th>
</tr>
</thead>
<tbody>
<tr ng-repeat="client in clients">
<td ng-bind="client.client_moniker"></td>
<td ng-bind="client.active_time"></td>
<td ng-bind="client.count_ordernum"></td>
<td ng-bind="client.sum_ordernum"></td>
<td ng-bind="client.chairty_num"></td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<div class="modal-footer">
<uib-pagination ng-if="clients.length"
class="pagination"
total-items="pagination.totalCount"
boundary-links="true"
ng-model="pagination.page"
items-per-page="pagination.limit"
max-size="10"
ng-change="loadClients()"
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>

@ -28,7 +28,7 @@
</header>
<div class="content">
<div class="banner_img">
<img height="112" width="344" src="/static/images/loving_merchants/banner.png">
<img height="112" width="344" src="/static/images/loving_merchants/banner.jpg">
</div>
<div class="circular_img">
<img src="/static/images/loving_merchants/circular.png">

@ -555,6 +555,19 @@ define(['angular', 'angularSanitize', 'angularAnimate', 'angularMessages', 'uiRo
return roles.indexOf($rootScope.currentUser.role) >= 0;
}
}]);
app.filter('withPartnerModule', ['$rootScope', function ($rootScope) {
return function (module) {
var result = false;
angular.forEach($rootScope.currentUser.available_module_ids, function (item) {
if((item+'') == (module+'')){
result = true;
return ;
}
});
return result;
}
}]);
app.filter("trustUrl", ['$sce', function ($sce) {
return function (recordingUrl) {
return $sce.trustAsResourceUrl(recordingUrl);

@ -10,7 +10,7 @@ require.config({
uiBootstrap: 'static/lib/angular-plugins/ui-bootstrap-tpls-1.2.4.min',
uiRouter: 'static/lib/angular-plugins/angular-ui-router.min',
angularChecklist: 'static/lib/angular-plugins/checklist-model',
angular: 'static/lib/angularjs/angular.min',
angular: 'static/lib/angularjs/angular',
angularAnimate: 'static/lib/angularjs/angular-animate.min',
angularMessages: 'static/lib/angularjs/angular-messages.min',
angularSanitize: 'static/lib/angularjs/angular-sanitize.min',

@ -39,9 +39,12 @@ define(['angular', '../../analysis/bd/analysis-bd'], function (angular) {
})
}]);
app.controller('bdPrizeRootCtrl', ['$scope', '$http', '$uibModal', 'commonDialog', function ($scope, $http, $uibModal, commonDialog) {
app.controller('bdPrizeRootCtrl', ['$scope', '$http', '$uibModal', 'commonDialog','$filter', function ($scope, $http, $uibModal, commonDialog,$filter) {
$scope.params = {year: new Date().getFullYear()};
$scope.generate = {};
$scope.availableYears = [new Date().getFullYear() - 1, new Date().getFullYear()];
$scope.kpiRanges = [{value: 1, label: '0-50%'}, {value: 2, label: '50%~80%'}, {value: 3, label: '80%~100%'},
{value: 4, label: '100%-120%'}, {value: 5, label: '>=120%'}];
$scope.initMonth = function (year) {
$scope.params.year = year;
$scope.months = [];
@ -72,27 +75,37 @@ define(['angular', '../../analysis/bd/analysis-bd'], function (angular) {
};
$scope.getYearReports(new Date().getFullYear());
$scope.generateReport = function () {
if (!$scope.generate.month) {
commonDialog.alert({
type: 'error', title: 'Error', content: 'Select a month first!'
});
return;
}
commonDialog.confirm({
title: 'Warning',
content: 'This operation will clear the result of last month generated before. Are you sure?'
}).then(function () {
$http.post('/sys/bd_prize/generate_record', null, {timeout: 60000}).then(function () {
$scope.generate.status = {};
var params = {month: $filter('date')($scope.generate.month, 'yyyy-MM')};
$http.post('/sys/bd_prize/generate_record/'+params.month, null, {timeout: 60000}).then(function (resp) {
$scope.generate.status = null;
commonDialog.alert({title: 'Success', content: 'Generate Finished', type: 'success'});
$scope.getYearReports($scope.params.year);
}, function (resp) {
commonDialog.alert({title: 'Error', content: resp.data.message, type: 'error'})
commonDialog.alert({title: 'Error', content: resp.data.message, type: 'error'});
$scope.generate.status = null;
})
})
};
$scope.loadRateConfigs = function () {
$http.get('/sys/bd_prize/config/rates').then(function (resp) {
$scope.bd_rate_configs = resp.data;
$scope.bd_rate_ranges = [];
var rangeStart = [];
$scope.kpi_ranges = [];
var kpiStart = [];
angular.forEach($scope.bd_rate_configs, function (cfg) {
if (rangeStart.indexOf(cfg.rate_from) < 0) {
rangeStart.push(cfg.rate_from);
$scope.bd_rate_ranges.push(cfg);
if (kpiStart.indexOf(cfg.kpi_range) < 0) {
kpiStart.push(cfg.kpi_range);
$scope.kpi_ranges.push(cfg);
}
})
})
@ -136,7 +149,10 @@ define(['angular', '../../analysis/bd/analysis-bd'], function (angular) {
value: 3,
label: '>=7 Months'
}];
$scope.filter = {bd_level: 1, months: 1};
$scope.kpiRanges = [{value: 1, label: '0-50%'}, {value: 2, label: '50%~80%'}, {value: 3, label: '80%~100%'},
{value: 4, label: '100%-120%'}, {value: 5, label: '>=120%'}];
$scope.clientRate = [{value: 0.6, label: '0.6-0.79'}, {value: 0.8, label: '0.8-2.0'}];
$scope.filter = {bd_level: 1,rate_from:0.6};
$scope.rates = rates;
$scope.submitRates = function () {
var validation = null;
@ -191,7 +207,7 @@ define(['angular', '../../analysis/bd/analysis-bd'], function (angular) {
app.controller('bdCommissionConfigCtrl', ['$scope', '$state', '$http', '$filter', 'monModal', function ($scope, $state, $http, $filter, monModal) {
$scope.monModal = monModal;
$scope.params = {year: new Date().getFullYear()};
$scope.bdtypes = [{id: 1, label: 'Leader'}, {id: 2, label: 'Manager'}, {id: 3, label: 'Director'}];
$scope.bdtypes = [{id: 1, label: 'BD Manager'}, {id: 2, label: 'KA Manager'}, {id: 3, label: 'Sydney GM'},{id: 4, label: 'COO'},{id: 5, label: 'NJ Department'}];
// $scope.bdmon;
// $scope.newSwitch;
$scope.initMonth = function (year) {
@ -209,6 +225,34 @@ define(['angular', '../../analysis/bd/analysis-bd'], function (angular) {
var end = $filter('date')(new Date(), 'yyyy-MM');
return start <= mon && end >= mon
};
$scope.getBDLevels = function () {
$http.get('/sys/bd_prize/config/bd_levels').then(function (resp) {
$scope.bds = resp.data;
})
};
$scope.getBDLevels();
$scope.chooseLastConfig = function (mon) {
var index = $scope.months.indexOf(mon);
if(index == 0){
var year = new Date().getFullYear();
year--;
mon = year + '-12';
}else {
mon = $scope.months[index-1];
}
$http.get('/sys/bd_prize/commission/le_ma/' + mon).then(function (resp) {
$scope.bdlm = [];
angular.forEach(resp.data,function (e) {
var bdC = {};
bdC.commission_start_amount = e.commission_start_amount;
bdC.commission_end_amount = e.commission_end_amount;
bdC.bd_commission_rate = e.bd_commission_rate;
bdC.bd_type = e.bd_type;
$scope.bdlm.push(bdC);
});
$scope.listConfig = true;
})
};
$scope.listCurrentMonBDCommission = function (mon) {
$http.get('/sys/bd_prize/commission/le_ma/' + mon).then(function (resp) {
$scope.bdlm = resp.data;
@ -266,6 +310,24 @@ define(['angular', '../../analysis/bd/analysis-bd'], function (angular) {
})
}
}
$scope.submitBdCommmissionConfig = function (mon, bds) {
$scope.check = true;
$scope.errmsg = null;
angular.forEach(bds, function (data, index) {
if(data.get_prize){
if (!data.kpi_amount) {
$scope.errmsg = "BD kpi Amount not be null";
$scope.check = false;
return;
}
}
});
if ($scope.check) {
$http.post('/sys/bd_prize/commission/kpi/update/' + mon, bds).then(function (resp) {
$scope.$close();
})
}
}
}]);
app.controller('bdPrizeMonthReportCtrl', ['$scope', '$http', 'report', function ($scope, $http, report) {
$scope.report = report.data;

@ -1,54 +1,144 @@
<style>
.intro_color{
color:#7a869d ;
}
</style>
<div class="modal-header">
<h4>Leader Commission Config</h4>
<h4>Commission Config</h4>
</div>
<div class="modal-body">
<!--<div class="alert alert-danger" ng-bind="errmsg" ng-if="errmsg"></div>-->
<div class="table-responsive">
<button class="btn btn-primary" ng-bind="bdmon"></button>
<table class="table table-hover">
<thead>
<tr>
<th>Commission Amount</th>
<th>Commission Rate</th>
<th>BD Type</th>
<th>
<span class="fa fa-plus" style="color: #0bb20c" ng-click="bdlm.push({})"></span>
</th>
</tr>
</thead>
<tbody>
<tr ng-repeat="bd in bdlm">
<td class="col-sm-5">
<div class="input-group">
<input class="form-control" id="re-from-input" type="number"
ng-model="bd.commission_start_amount"
placeholder="Start Amount">
<span class="input-group-addon">~</span>
<input class="form-control" id="re-to-input" type="number"
ng-model="bd.commission_end_amount"
placeholder="End Amount">
</div>
</td>
<td class="col-sm-3">
<div class="input-group">
<input placeholder="rate" class="form-control" type="number" step="0.01"
ng-model="bd.bd_commission_rate">
<span class="input-group-addon">%</span>
</div>
</td>
<td>
<select class="form-control" ng-model="bd.bd_type" ng-options="bdtype.id as bdtype.label for bdtype in bdtypes"></select>
</td>
<td>
<span class="fa fa-close" style="color: #b92c28" ng-click="deleteCommission(bd.bc_config_id)"></span>
</td>
</tr>
</tbody>
</table>
<div class="alert alert-danger" ng-if="errmsg" ng-bind="errmsg"></div>
<div class="modal-footer" ng-if="listConfig">
<button class="btn btn-success" type="button" ng-click="submitCommmissionConfig(bdmon,bdlm)">Submit</button>
<button class="btn btn-danger" ng-click="$dismiss()">Cancel</button>
</div>
</div>
<button class="btn btn-primary" ng-bind="bdmon" style="margin-bottom: 10px"></button>
<uib-tabset>
<uib-tab heading="Leader">
<div class="box margin-top" >
<div class="box-body no-padding table-responsive">
<div class="table-responsive margin-top">
<table class="table table-hover">
<thead>
<tr>
<th>Commission Amount</th>
<th>Commission Rate</th>
<th>BD Type</th>
<th>
<button class="btn btn-primary" ng-click="chooseLastConfig(bdmon)" ng-if="bdlm.length<=0">启用上月设置</button>
<span class="fa fa-plus" style="color: #0bb20c" ng-click="bdlm.push({})"></span>
</th>
</tr>
</thead>
<tbody>
<tr ng-repeat="bd in bdlm">
<td class="col-sm-5">
<div class="input-group">
<input class="form-control" id="re-from-input" type="number"
ng-model="bd.commission_start_amount"
placeholder="Start Amount">
<span class="input-group-addon">~</span>
<input class="form-control" id="re-to-input" type="number"
ng-model="bd.commission_end_amount"
placeholder="End Amount">
</div>
</td>
<td class="col-sm-3">
<div class="input-group">
<input placeholder="rate" class="form-control" type="number" step="0.01"
ng-model="bd.bd_commission_rate">
<span class="input-group-addon">%</span>
</div>
</td>
<td>
<select class="form-control" ng-model="bd.bd_type" ng-options="bdtype.id as bdtype.label for bdtype in bdtypes"></select>
</td>
<td>
<span class="fa fa-close" style="color: #b92c28" ng-click="deleteCommission(bd.bc_config_id)"></span>
</td>
</tr>
</tbody>
</table>
<div class="alert alert-danger" ng-if="errmsg" ng-bind="errmsg"></div>
<div class="modal-footer" ng-if="listConfig">
<button class="btn btn-success" type="button" ng-click="submitCommmissionConfig(bdmon,bdlm)">Submit</button>
<button class="btn btn-danger" ng-click="$dismiss()">Cancel</button>
</div>
</div>
</div>
<div class="box intro_color">
<div class="box-header with-border">
<h6 class="intro_color" >跨境事业部总监提成制度</h6>
</div>
<div class="box-body">
<ul class="small">
<li>完成当月指标低于 51%,提成按照 0.005%提取</li>
<li>完成当月指标高于 80%,提成按照 0.008%提取</li>
<li>完成当月指标 100%,提成按照 0.01%</li>
</ul>
</div>
<div class="box-header with-border">
<h6 class="intro_color">大客户部门 Manager 提成考核指标</h6>
</div>
<div class="box-body">
<ul class="small">
<li>完成月度指标,当月部门提成为该部门总流水的 0.01%</li>
<li>未完成月度指标,当月部门提成为该部门总流水的 0.005%</li>
</ul>
</div>
<div class="box-header with-border">
<h6 class="intro_color">悉尼分公司总经理</h6>
</div>
<div class="box-body">
<ul class="small">
<li>完成月度指标,当月提成为该分公司总流水的 0.005%</li>
<li>未完成月度指标,当月提成为该分公司总流水的 0.0025%</li>
</ul>
</div>
<div class="box-header with-border">
<h6 class="intro_color">南京分公司技术部提成</h6>
</div>
<div class="box-body">
<ul class="small">
<li>完成月度指标,当月提成为公司总流水的 0.01%</li>
<li>未完成月度指标,当月提成为公司总流水的 0.005%</li>
</ul>
</div>
<div class="box-header with-border">
<h6 class="intro_color">COO考核及提成政策</h6>
</div>
<div class="box-body">
<ul class="small">
<li>完成 KPI 按照 0.03%提取;未完成 KPI 按照 0.02%提取</li>
</ul>
</div>
</div>
</div>
</uib-tab>
<uib-tab heading="BD">
<div class="box margin-top">
<div class="box-body no-padding table-responsive">
<table class="table table-hover" style="text-align: center">
<thead>
<tr>
<th style="text-align: center;">BD Name</th>
<th style="text-align: center;">KPI Amount</th>
</tr>
</thead>
<tbody>
<tr ng-repeat="bd in bds|filter:{get_prize:true}">
<td ng-bind="bd.display_name"></td>
<td>
<input type="number" ng-model="bd.kpi_amount" min="0">
</td>
</tr>
</tbody>
</table>
<div class="alert alert-danger" ng-if="errmsg" ng-bind="errmsg"></div>
<div class="modal-footer">
<button class="btn btn-success" type="button" ng-click="submitBdCommmissionConfig(bdmon,bds)">Submit</button>
<button class="btn btn-danger" ng-click="$dismiss()">Cancel</button>
</div>
</div>
</div>
</uib-tab>
</uib-tabset>
</div>

@ -41,9 +41,9 @@
<img uib-tooltip="Wechat" src="/static/images/wechatpay_sign_lg.png">
</div>
<div class="info-box-content">
<h5>BD Taotal Commission: ${{report.WechatReport.total_prize}}</h5>
<h5>BD Taotal Send: ${{report.WechatReport.total_send_prize}}</h5>
<h5>BD Taotal Fund: ${{report.WechatReport.total_donation}}</h5>
<h5>BD Total Commission: ${{report.WechatReport.total_prize}}</h5>
<h5>BD Total Send: ${{report.WechatReport.total_send_prize}}</h5>
<h5>BD Total Fund: ${{report.WechatReport.total_donation}}</h5>
</div>
</div>
</div>
@ -54,7 +54,7 @@
</div>
<div class="info-box-content">
<h5>BD Total Commission: ${{report.AlipayReport.total_prize}}</h5>
<h5>BD Taotal Send: ${{report.AlipayReport.total_send_prize}}</h5>
<h5>BD Total Send: ${{report.AlipayReport.total_send_prize}}</h5>
<h5>BD Total Fund: ${{report.AlipayReport.total_donation}}</h5>
</div>
</div>
@ -65,9 +65,9 @@
<img uib-tooltip="Bestpay" src="/static/images/bestpay_sign_lg.png">
</div>
<div class="info-box-content">
<h5>BD Taotal Commission: ${{report.BestpayReport.total_prize}}</h5>
<h5>BD Taotal Send: ${{report.BestpayReport.total_send_prize}}</h5>
<h5>BD Taotal Fund: ${{report.BestpayReport.total_donation}}</h5>
<h5>BD Total Commission: ${{report.BestpayReport.total_prize}}</h5>
<h5>BD Total Send: ${{report.BestpayReport.total_send_prize}}</h5>
<h5>BD Total Fund: ${{report.BestpayReport.total_donation}}</h5>
</div>
</div>
</div>
@ -79,6 +79,7 @@
<thead>
<tr>
<th>BD Name</th>
<th>KPI</th>
<th>BD Level</th>
<th>Transaction Amount</th>
<th>Total Commission</th>
@ -91,8 +92,12 @@
<tr ng-repeat="log in report.logs|prizeLogsFilter:0">
<td ng-if="log.is_valid==1">{{log.bd_name}}</td>
<td ng-if="log.is_valid==0"><s>{{log.bd_name}}</s><span style="color: red"> (Left Company)</span></td>
<td>
<span ng-if="log.kpi_amount">{{log.kpi_amount}}</span>
<span ng-if="!log.kpi_amount">0.00</span>
</td>
<td ng-bind="log.bd_level|financialBdLevel"></td>
<td ng-bind="log.total_amount|currency:'AUD '"></td>
<td>{{log.total_amount|currency:'AUD '}}</td>
<td ng-bind="log.total_prize|currency:'AUD '"></td>
<td ng-bind="log.send_prize|currency:'AUD '"></td>
<td>
@ -110,7 +115,7 @@
</div>
</div>
<div class="box box-default">
<div class="box-header">BD Manager Commission</div>
<div class="box-header">Manager Commission</div>
<div class="box-body table-responsive">
<table class="table table-bordered table-hover table-striped">
<thead>
@ -152,18 +157,44 @@
</div>
</div>-->
<div class="box box-success">
<div class="box-header">Director Commission</div>
<div class="box-body">
<div class="row">
<div class="col-xs-6 col-sm-6">
Transaction Amount: <span ng-bind="report.directPrizeLogs.total_amount|currency:'AUD '"></span>
</div>
<div class="col-xs-6 col-sm-6">
Total Commission: <span ng-bind="report.directPrizeLogs.total_prize|currency:'AUD '"></span>
</div>
<div class="box-header">Sydney GM Commission</div>
<div class="box-body">
<div class="row">
<div class="col-xs-6 col-sm-6">
Transaction Amount: <span ng-bind="report.sydneyPrizeLog.total_amount|currency:'AUD '"></span>
</div>
<div class="col-xs-6 col-sm-6">
Total Commission: <span ng-bind="report.sydneyPrizeLog.total_prize|currency:'AUD '"></span>
</div>
</div>
</div>
</div>
<div class="box box-success">
<div class="box-header">NJ Department Commission</div>
<div class="box-body">
<div class="row">
<div class="col-xs-6 col-sm-6">
Transaction Amount: <span ng-bind="report.ngDepartmentPrizeLog.total_amount|currency:'AUD '"></span>
</div>
<div class="col-xs-6 col-sm-6">
Total Commission: <span ng-bind="report.ngDepartmentPrizeLog.total_prize|currency:'AUD '"></span>
</div>
</div>
</div>
</div>
<div class="box box-success">
<div class="box-header">COO Commission</div>
<div class="box-body">
<div class="row">
<div class="col-xs-6 col-sm-6">
Transaction Amount: <span ng-bind="report.directPrizeLogs.total_amount|currency:'AUD '"></span>
</div>
<div class="col-xs-6 col-sm-6">
Total Commission: <span ng-bind="report.directPrizeLogs.total_prize|currency:'AUD '"></span>
</div>
</div>
</div>
</div>
<!--<div class="box-header">Manager Commission</div>-->
<!--<div class="box-body table-responsive">-->
<!--<table class="table table-bordered table-hover table-striped">-->

@ -9,9 +9,25 @@
<section class="content">
<div class="box box-danger" ng-if="'1000'|withRole">
<div class="box-body">
<button class="btn btn-danger" ng-click="generateReport()">Generate Report</button>
<button class="btn btn-primary" ng-click="editRateConfig()"><i class="fa fa-cog"></i> Edit Rate Config</button>
<button class="btn btn-primary" ng-click="editBDLevels()"><i class="fa fa-user"></i> Edit BD Level</button>
<div class="box box-default">
<div class="box-body">
<div class="form-inline">
<div class="form-group">
<input type="text" class="form-control" uib-datepicker-popup="yyyy-MM" ng-model="generate.month"
is-open="ctrl.genmonth" datepicker-options="{minMode: 'month'}"
ng-click="ctrl.genmonth=true" placeholder="Select Month"/>
</div>
<button class="btn btn-primary" ng-click="generateReport()" ng-disabled="!generate.month">
Generate Report
</button>
<button class="btn btn-primary" ng-click="editRateConfig()"><i class="fa fa-cog"></i> Edit Rate Config</button>
<button class="btn btn-primary" ng-click="editBDLevels()"><i class="fa fa-user"></i> Edit BD Level</button>
<loadingbar ng-if="generate.status"></loadingbar>
</div>
</div>
</div>
<!--<button class="btn btn-danger" ng-click="generateReport()">Generate Report</button>-->
<!--<button class="btn btn-primary" ng-click="editCommissionConfig()"><i class="fa fa-user"></i> Edit Commission Config</button>-->
</div>
</div>
@ -36,15 +52,15 @@
<div class="col-xs-2" ng-repeat="mon in months">
<a ng-if="hasReport(mon) && ('1000'|withRole)">
<h2 ROLE="button" class="text-success" ui-sref=".month_report({month:mon})" ng-bind="mon.substring(5,7)"></h2>
<span class="fa fa-edit btn" ng-click="editCommissionConfig(mon)">Leader Commission</span>
<span class="fa fa-edit btn" ng-click="editCommissionConfig(mon)">Commission</span>
</a>
<a ng-if="hasReport(mon) && ('100'|withRole) && (!('1000'|withRole))">
<h2 ROLE="button" class="text-success" ui-sref=".bd_detail({month:mon})" ng-bind="mon.substring(5,7)"></h2>
<span class="fa fa-edit btn" ng-click="editCommissionConfig(mon)">Leader Commission</span>
<span class="fa fa-edit btn" ng-click="editCommissionConfig(mon)">Commission</span>
</a>
<a ng-if="!hasReport(mon)">
<h2 ROLE="button" class="text-gray" ng-bind="mon.substring(5,7)"></h2>
<span class="fa fa-edit btn" ng-click="editCommissionConfig(mon)">Leader Commission</span>
<span class="fa fa-edit btn" ng-click="editCommissionConfig(mon)">Commission</span>
</a>
</div>
</div>
@ -59,49 +75,48 @@
<thead>
<tr>
<th>BD Level</th>
<th rowspan="2">费率</th>
<th rowspan="2">费率</th>
<th colspan="3">Junior BD</th>
<th colspan="3">Intermediate BD</th>
<th colspan="3">Senior BD</th>
<th rowspan="2">KPI完成度</th>
<th colspan="2">Junior BD</th>
<th colspan="2">Intermediate BD</th>
<th colspan="2">Senior BD</th>
</tr>
<tr>
<th>商户开通时长</th>
<th>1-3个月</th>
<th>4-6个月</th>
<th>&gt;=7个月</th>
<th>1-3个月</th>
<th>4-6个月</th>
<th>&gt;=7个月</th>
<th>1-3个月</th>
<th>4-6个月</th>
<th>&gt;=7个月</th>
<th>费率</th>
<th>0.6-0.79</th>
<th>0.8-2.0</th>
<th>0.6-0.79</th>
<th>0.8-2.0</th>
<th>0.6-0.79</th>
<th>0.8-2.0</th>
</tr>
</thead>
<tbody>
<tr ng-repeat="range in bd_rate_ranges">
<tr ng-repeat="range in kpi_ranges">
<td ng-bind="'#'+($index+1)"></td>
<td ng-bind="range.rate_from"></td>
<td ng-bind="range.rate_to"></td>
<td ng-bind="(kpiRanges|filter:{value:range.kpi_range})[0].label"></td>
<td ng-repeat-start="level in [1,2,3] track by $index"
ng-bind="(bd_rate_configs|filter:{rate_from:range.rate_from,bd_level:level,time_range:1})[0].prize_rate+'%'"></td>
<td ng-bind="(bd_rate_configs|filter:{rate_from:range.rate_from,bd_level:level,time_range:2})[0].prize_rate+'%'"></td>
ng-bind="(bd_rate_configs|filter:{kpi_range:range.kpi_range,bd_level:level,rate_from:0.6})[0].prize_rate+'%'"></td>
<td ng-repeat-end
ng-bind="(bd_rate_configs|filter:{rate_from:range.rate_from,bd_level:level,time_range:3})[0].prize_rate+'%'"></td>
ng-bind="(bd_rate_configs|filter:{kpi_range:range.kpi_range,bd_level:level,rate_from:0.8})[0].prize_rate+'%'"></td>
</tr>
</tbody>
</table>
</div>
<h4>补充说明</h4>
<ul>
<li>商户费率变更,提成比随之变更</li>
<li>商户开通时长从商户开通时间起算</li>
<li>后台系统自主申请商户提成按照前三个月0.05%后期0.01%发放自主申请商户在详情列表中的Client Source标注为Apply</li>
<li>调岗人员移交的商户移交后6个月内移交人员和接收人员平分提成应在商户BD配置里进行设置分配比例请关注详情列表中的Coefficient正常情况下应当为1</li>
<li>离职人员移交的商户接收人员享受一半提成另一半作为BD福利基金离职转交商户在详情列表中用红色标注</li>
<li>BD提成按月发放</li>
<li>每月发放总额的80%剩余20%于每年年底即12月25日圣诞节前发放</li>
<li>按月度发放</li>
<li>每月发放总提成额度的 80%,剩余 20%按照“年度考评分数比例”于每年年底即 12 月 25 日圣诞前发放</li>
<li>提前离职者20%提成不予发放</li>
<li>年度考评(根据销管中心每月考评表打分制进行统计)按照考评分数对应比例发放 20%的占比部分,扣下部分如果第二年考评超出一定评分 110%可以补发;同样,如果年度考评分数超过 100 分按照同比例发放</li>
<li>商户开通后连续 1 个月未产生流水的,上交主管,由主管重新分配</li>
<li>连续 2 个月不产生流水的商户,由销管部统一收回,重新分配</li>
<li>分配后的商户流水客户专员只能占一半</li>
<li>离职及调岗人员商户统一上交销管中心,由销管中心 leader 及跨境事业部总监相互协商及相互监督,按照公平公正的原则, 做出分配方案,并由总监确认后统一分配。调岗人员移交的商户,在移交后 1 个月内移交人员和接收人员平分该商家产生的提成,移交人员需配合接收人员做好商户对接和短期内的商户维护;
离职人员交接的商户提成,接收人员享受一半的提成,另一半作为跨境客服专员福利会基金</li>
<li>被客户投诉情况严重者,此商户由销管中心无条件收回重新分配</li>
<li>活动执行未传达到位且出现舞弊、徇私、懒惰等行为的,商户上交由销管中心统一分配</li>
<li>后期维护不及时,连续一个月不跟踪者,此商户上交销管中心,统一重新分配</li>
<li>以上分配,销管中心 leader 和跨境支付事业部商量好之后需做好方案后经 COO 审批方可执行</li>
</ul>
</div>
</div>

@ -9,23 +9,29 @@
<select ng-model="filter.bd_level" class="form-control" ng-options="lv.value as lv.label for lv in bdLevels"
id="levelFilter"></select>
</div>
<div class="form-group">
<!-- <div class="form-group">
<label class="control-label" for="monthFilter">Months</label>
<select ng-model="filter.months" class="form-control" ng-options="mon.value as mon.label for mon in months"
id="monthFilter"></select>
</div>-->
<div class="form-group">
<label class="control-label" for="rateFilter">Client Rate</label>
<select ng-model="filter.rate_from" class="form-control" ng-options="rate.value as rate.label for rate in clientRate"
id="rateFilter"></select>
</div>
</div>
<div class="table-responsive">
<table class="table table-hover">
<thead>
<tr>
<th>Client Rate</th>
<th>KPI完成度</th>
<th>BD Rate</th>
</tr>
</thead>
<tbody>
<tr ng-repeat="rate in rates|filter:{bd_level:filter.bd_level,time_range:filter.months}">
<td>{{rate.rate_from}}-{{rate.rate_to}}</td>
<tr ng-repeat="rate in rates|filter:{bd_level:filter.bd_level,rate_from:filter.rate_from}">
<td ng-bind="(kpiRanges|filter:{value:rate.kpi_range})[0].label"></td>
<td>
<div class="input-group">
<input placeholder="bd rate" class="form-control" type="number" step="0.01" ng-model="rate.prize_rate">

@ -51,6 +51,10 @@ define(['angular', 'uiRouter', 'uiBootstrap'], function (angular) {
url: '/phone_top_up',
templateUrl: '/static/config/devtools/templates/phone_top_up.html',
controller: 'phonetopupCtrl'
}).state('devtools.aliforexcel', {
url: '/aliforexcel',
templateUrl: '/static/config/devtools/templates/aliforexcel.html',
controller: 'aliforexcelCtrl'
})
}]);
app.controller('devManualRefundCtrl', ['$scope', '$http', 'commonDialog', function ($scope, $http, commonDialog) {
@ -302,6 +306,38 @@ define(['angular', 'uiRouter', 'uiBootstrap'], function (angular) {
})
}
}]);
/* app.controller('orgusertestCtrl', ['$scope', '$http', '$filter','commonDialog', function ($scope, $http, $filter,commonDialog) {
$scope.regist = function () {
$http.post('/dev/orgusertest',{client_moniker: $scope.company}).then(function (resp) {
commonDialog.alert({title: 'SUCCESS', content:"注册成功", type: 'success'})
}, function (resp) {
commonDialog.alert({title: 'Error', content: "商品编号已存在", type: 'Error'})
})
}
}]);*/
app.controller('aliforexcelCtrl', ['$scope', '$filter', function ($scope, $filter) {
$scope.params = {};
var str = $filter('date')(new Date(), 'yyyyMMdd');
var oDate = new Date(str.slice(0, 4), str.slice(4, 6) - 1, str.slice(-2));
var oDay = oDate.getDay();
var oNum = oDate.getDate();
var bWeek1 =new Date(str.slice(0, 4), str.slice(4, 6) - 1, oNum-oDay-6);
var bWeek2 =new Date(str.slice(0, 4), str.slice(4, 6) - 1, oNum-oDay);
$scope.params.datefrom = bWeek1;
$scope.params.dateto = bWeek2;
$scope.Export = function () {
var params = angular.copy($scope.params);
params.datefrom = $filter('date')(params.datefrom, 'yyyy-MM-dd');
params.dateto = $filter('date')(params.dateto, 'yyyy-MM-dd');
var url = '/dev/aliforexcel';
var connectSymbol = '?';
url += connectSymbol + 'datefrom=' + params.datefrom + '&' + 'dateto=' + params.dateto;
return url;
}
}]);
return app;
});

@ -0,0 +1,36 @@
<section class="content-header">
<h1>支付宝进件表格导出</h1>
<ol class="breadcrumb">
<li>
<i class="fa fa-cog"></i> Basic Config
</li>
<li><a ui-sref="^">Dev Tools</a></li>
<li class="active">aliforexcel</li>
</ol>
</section>
<section class="content">
<div class="box">
<div class="box-body">
<div style="display: inline-block">
<input class="form-control" id="date-from-input"
ng-model="params.datefrom"
uib-datepicker-popup size="10" placeholder="From"
is-open="dateBegin.open" ng-click="dateBegin.open=true"
datepicker-options="{maxDate:params.dateto||today}">
</div>
~
<div style="display: inline-block">
<input class="form-control" id="date-to-input"
ng-model="params.dateto"
uib-datepicker-popup size="10" placeholder="To"
is-open="dateTo.open" ng-click="dateTo.open=true"
datepicker-options="{minDate:params.datefrom,maxDate:today}">
</div>&nbsp&nbsp&nbsp
<a class="fa fa-download"
ng-href="{{Export()}}"
type="button">
Export
</a>
</div>
</div>
</section>

@ -0,0 +1,32 @@
<section class="content-header">
<h1>Company test user </h1>
<ol class="breadcrumb">
<li>
<i class="fa fa-cog"></i> Basic Config
</li>
<li><a ui-sref="^">Dev Tools</a></li>
<li class="active">Test Partner</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">
<form role="form" style="margin:0px auto;width: 50%">
<div class="form-group">
<label>Partner Code</label>
<input ng-model="company" name="code" class="form-control" type="text"/>
</div>
<div class="form-group">
<button class="btn btn-primary btn-block" ng-click="regist()">commit</button>
</div>
</form>
</div>
</div>
</div>
</div>
</div>
</div>

@ -67,7 +67,16 @@
<i class="fa fa-envelope"></i>
Phone Top Up
</a>
<!-- <a class="btn btn-app" role="button" ui-sref=".orgusertest">
<i class="fa fa-envelope"></i>
Partner test
</a>-->
<a class="btn btn-app" role="button" ui-sref=".aliforexcel">
<i class="fa fa-envelope"></i>
支付宝进件导出
</a>
</div>
</div>
</section>
</div>

@ -39,6 +39,24 @@ define(['angular', 'uiRouter'], function (angular) {
templateUrl: '/static/config/sysconfigs/templates/payemnt_config.html',
controller: 'paymentConfigCtrl'
})*/
.state('sysconfig.permissionPartner', {
url: '/permissionPartner',
templateUrl: '/static/config/sysconfigs/templates/permissionPartner_config.html',
controller: 'permissionPartnerConfigRootCtrl'
}).state('sysconfig.permissionPartner.functions', {
url: '/partnerFunctions',
templateUrl: '/static/config/sysconfigs/templates/permissionPartner_functions.html',
controller: 'permissionPartnerFuncCtrl'
}).state('sysconfig.permissionPartner.modules', {
url: '/partnerModules',
templateUrl: '/static/config/sysconfigs/templates/permissionPartner_modules.html',
controller: 'permissionPartnerModuleCtrl',
resolve: {
modules: ['$http', function ($http) {
return $http.get('/sys/permissionPartner/modules')
}]
}
})
}]);
app.controller('sysConfigCtrl', ['$scope', function ($scope) {
@ -118,6 +136,7 @@ define(['angular', 'uiRouter'], function (angular) {
$scope.modules = modules.data;
})
};
$scope.loadModules();
@ -181,7 +200,7 @@ define(['angular', 'uiRouter'], function (angular) {
$scope.newModule = function () {
$uibModal.open({
templateUrl: '/static/config/sysconfigs/templates/permission_module_dialog.html',
controller: 'moduleEditCtrl',
controller: 'moduleNewCtrl',
resolve: {
module: function () {
return {};
@ -203,6 +222,7 @@ define(['angular', 'uiRouter'], function (angular) {
}).result.then(function () {
$state.reload();
})
};
$scope.deleteModule = function (mod) {
commonDialog.confirm({
@ -230,7 +250,18 @@ define(['angular', 'uiRouter'], function (angular) {
})
};
}]);
app.controller('moduleNewCtrl', ['$scope', '$http', 'module', function ($scope, $http, module) {
$scope.module = angular.copy(module);
$scope.nameEditable = !module.module_name;
$scope.save = function () {
$scope.errmsg = null;
$http.put('/sys/permission/modules/' + $scope.module.module_name + '.end', $scope.module).then(function () {
$scope.$close();
}, function (resp) {
$scope.errmsg = resp.data.message;
})
};
}]);
app.controller('mailSubscribeCtrl', ['$scope', '$http','commonDialog','$uibModal',function ($scope, $http,commonDialog,$uibModal) {
$scope.params = {};
$scope.pagination = {};
@ -295,5 +326,205 @@ define(['angular', 'uiRouter'], function (angular) {
})
}
}]);*/
app.controller('permissionPartnerConfigRootCtrl', ['$scope', '$http', '$uibModal', function ($scope, $http, $uibModal) {
$scope.authorizeRole = function (roleMask) {
$uibModal.open({
templateUrl: '/static/config/sysconfigs/templates/permissionPartner_authorize_dialog.html',
controller: 'permissionPartnerAuthorizeDialogCtrl',
size: 'lg',
resolve: {
authorized: ['$http', function ($http) {
return $http.get('/sys/permissionPartner/roles/' + roleMask + '/functions');
}],
modules: ['$http', function ($http) {
return $http.get('/sys/permissionPartner/functions');
}],
role: function () {
return roleMask
}
}
});
}
}]);
app.controller('permissionPartnerAuthorizeDialogCtrl', ['$scope', '$http', 'authorized', 'modules', 'role',
function ($scope, $http, authorized, modules, role) {
$scope.authorized = authorized.data;
$scope.modules = modules.data;
$scope.submitAuthorize = function () {
$scope.errmsg = null;
$http.put('/sys/permissionPartner/roles/' + role + '/functions', $scope.authorized).then(function () {
$scope.$close();
}, function (resp) {
$scope.errmsg = resp.data.message;
})
};
$scope.toggleAuthorize = function (func) {
var idx = $scope.authorized.indexOf(func.func_id);
if (idx >= 0) {
$scope.authorized.splice(idx, 1);
} else {
$scope.authorized.push(func.func_id);
}
}
}]
);
app.controller('permissionPartnerFuncCtrl', ['$scope', '$http', '$state', '$uibModal', 'commonDialog',
function ($scope, $http, $state, $uibModal, commonDialog) {
$scope.loadFunctions = function () {
$http.get('/sys/permissionPartner/functions').then(function (functions) {
$scope.modFunctions = functions.data;
})
};
$scope.loadFunctions();
$scope.loadModules = function () {
$http.get('/sys/permissionPartner/modules').then(function (modules) {
$scope.modules = modules.data;
})
};
$scope.loadModules();
$scope.syncFunctions = function () {
$http.post('/sys/permissionPartner/synchronize').then(function () {
$scope.loadFunctions();
})
};
$scope.moveFunction = function (func) {
$uibModal.open({
templateUrl: '/static/config/sysconfigs/templates/permissionPartner_choose_module.html',
controller: 'permissionPartnerChooseModuleDialogCtrl',
resolve: {
modules: function () {
return $scope.modules;
}
}
}).result.then(function (modName) {
$http.put('/sys/permissionPartner/functions/' + func.func_id + '/modules', {module_name: modName}).then(function () {
$scope.loadFunctions();
}, function (resp) {
commonDialog.alert({title: 'Error', content: resp.data.message, type: 'error'})
})
})
};
$scope.editFunctionInfo = function (func) {
$uibModal.open({
templateUrl: '/static/config/sysconfigs/templates/PartnerFunc_info_edit.html',
controller: 'permissionPartnerFuncEditDialogCtrl',
resolve: {
func: function () {
return angular.copy(func);
}
}
}).result.then(function () {
$scope.loadFunctions();
})
}
}]
);
app.controller('permissionPartnerChooseModuleDialogCtrl', ['$scope', '$http', 'modules', function ($scope, $http, modules) {
$scope.modules = modules;
$scope.chooseModule = function (mod) {
$scope.$close(mod.module_name);
}
}]);
app.controller('permissionPartnerFuncEditDialogCtrl', ['$scope', '$http', 'func', function ($scope, $http, func) {
$scope.func = func;
$scope.modifyFunction = function () {
$scope.errmsg = null;
$http.put('/sys/permissionPartner/functions/' + func.func_id + '.end', $scope.func).then(function () {
$scope.$close();
}, function (resp) {
$scope.errmsg = resp.data.message;
})
};
}]);
app.controller('permissionPartnerModuleCtrl', ['$scope', '$http', '$state', '$uibModal', 'commonDialog', 'modules',
function ($scope, $http, $state, $uibModal, commonDialog, modules) {
$scope.modules = modules.data;
$scope.newPartnerModule = function () {
$uibModal.open({
templateUrl: '/static/config/sysconfigs/templates/permissionPartner_module_dialog.html',
controller: 'partnerModuleNewCtrl',
resolve: {
moduleall: function () {
return $scope.modules;
},
module: function () {
return {};
}
}
}).result.then(function () {
$state.reload();
})
};
$scope.editPartnerModule = function (mod) {
$uibModal.open({
templateUrl: '/static/config/sysconfigs/templates/permissionPartner_module_dialog.html',
controller: 'partnerModuleEditCtrl',
resolve: {
module: function () {
return mod;
}
}
}).result.then(function () {
$state.reload();
})
};
$scope.deletePartnerModule = function (mod) {
commonDialog.confirm({
title: 'Warning',
content: 'You are deleting an exists module. Confirm?'
}).then(function () {
$http.delete('/sys/permissionPartner/modules/' + mod.module_name + '.end').then(function () {
$state.reload();
}, function (resp) {
commonDialog.alert({title: 'Error', content: resp.data.message, type: 'error'})
})
});
}
}]
);
app.controller('partnerModuleEditCtrl', ['$scope', '$http', 'module', function ($scope, $http, module) {
$scope.module = angular.copy(module);
$scope.nameEditable = !module.module_name;
$scope.save = function () {
$scope.errmsg = null;
$http.put('/sys/permissionPartner/modules/' + $scope.module.module_name + '.end', $scope.module).then(function () {
$scope.$close();
}, function (resp) {
$scope.errmsg = resp.data.message;
})
};
}]);
app.controller('partnerModuleNewCtrl', ['$scope', '$http', 'module','moduleall','commonDialog', function ($scope, $http, module,moduleall,commonDialog) {
$scope.module = angular.copy(module);
$scope.nameEditable = !module.module_name;
$scope.module.initialize = true;
$scope.save = function () {
var hasOne =0;
$scope.errmsg = null;
angular.forEach(moduleall,function (data) {
if ($scope.module.module_name == data.module_name) {
commonDialog.alert({title: 'Error', content: "Module Has Exists", type: 'error'})
hasOne=1
return hasOne;
}
})
if (hasOne != 1) {
$http.put('/sys/permissionPartner/modules/' + $scope.module.module_name + '.end', $scope.module).then(function () {
$scope.$close();
}, function (resp) {
$scope.errmsg = resp.data.message;
})
}
};
}]);
return app;
});

@ -0,0 +1,20 @@
<div class="modal-header">
<h4>Edit Function Detail</h4>
</div>
<div class="modal-body">
<div class="form-group">
<p class="form-control-static text-bold" ng-bind="func.func_id"></p>
</div>
<div class="form-group">
<label class="control-label" for="name-input">Name</label>
<input class="form-control" id="name-input" ng-model="func.name">
</div>
<div class="form-group">
<label class="control-label" for="remark-input">Remark</label>
<input class="form-control" id="remark-input" ng-model="func.remark">
</div>
</div>
<div class="modal-footer">
<button class="btn btn-success" ng-click="modifyFunction()">Save</button>
<button class="btn btn-danger" ng-click="$dismiss()">Cancel</button>
</div>

@ -0,0 +1,16 @@
<div class="modal-header">
<h4>Authorize To Role</h4>
</div>
<div class="modal-body">
<div ng-repeat="mod in modules.modules" class="list-group">
<div class="list-group-item list-group-item-info" ng-bind="mod.module_name+' - '+mod.remark"></div>
<a role="button" class="list-group-item" ng-repeat="func in mod.funcs" ng-bind="func.func_id+(func.remark?'('+func.remark+')':'')"
ng-class="{active:authorized.indexOf(func.func_id)>=0}" ng-click="toggleAuthorize(func)">
</a>
</div>
<div class="alert alert-danger" ng-if="errmsg" ng-bind="errmsg"></div>
</div>
<div class="modal-footer">
<button class="btn btn-success" ng-click="submitAuthorize()">Submit</button>
<button class="btn btn-danger" ng-click="$dismiss()">Cancel</button>
</div>

@ -0,0 +1,16 @@
<div class="modal-header">
<h4>Choose Module</h4>
</div>
<div class="modal-body">
<div class="list-group">
<a class="list-group-item" ng-repeat="mod in modules" ng-click="chooseModule(mod)" role="button">
<p>
<span class="pull-left" ng-bind="mod.module_name"></span>
<span class="pull-right" ng-bind="mod.remark"></span>
</p>
</a>
</div>
</div>
<div class="modal-footer">
<button class="btn btn-danger" ng-click="$dismiss()">Cancel</button>
</div>

@ -0,0 +1,38 @@
<section class="content-header">
<h1>Permission Config</h1>
<ol class="breadcrumb">
<li>
<a ui-sref="^"><i class="fa fa-cog"></i> System Config</a>
</li>
<li>Partner Permission Config</li>
</ol>
</section>
<section class="content">
<div class="row">
<div class="col-sm-12">
<div class="nav-tabs-custom">
<ul class="nav nav-tabs">
<li ui-sref-active-eq="active">
<a ui-sref="sysconfig.permissionPartner">Permissions</a>
</li>
<li ui-sref-active="active">
<a ui-sref=".functions">Functions</a>
</li>
<li ui-sref-active="active">
<a ui-sref=".modules">Modules</a>
</li>
</ul>
<div class="tab-content" ui-view>
<a class="btn btn-app" role="button" ng-click="authorizeRole('1')">
<i class="fa fa-user-secret"></i>
Administrator
</a>
<a class="btn btn-app" role="button" ng-click="authorizeRole('10')">
<i class="fa fa-eye"></i>
Compliance
</a>
</div>
</div>
</div>
</div>
</section>

@ -0,0 +1,43 @@
<div class="row margin-bottom">
<div class="col-xs-12">
<button class="btn btn-primary" ng-click="syncFunctions()">
<i class="fa fa-refresh"></i> Synchronize Code
</button>
</div>
</div>
<div class="panel panel-warning" ng-if="modFunctions.no_module.length">
<div class="panel-heading">Functions With No Modules</div>
<div class="panel-body table-responsive">
<table class="table table-hover">
<tbody>
<tr ng-repeat="func in modFunctions.no_module">
<th ng-bind="func.func_id" title="{{func.remark}}"></th>
<td ng-bind="func.uri+'['+func.req_methods+']'" title="{{func.remark}}"></td>
<td ng-bind="func.name"></td>
<td>
<a role="button" ng-click="moveFunction(func)" title="Move"><i class="fa fa-arrows"></i></a>
<a role="button" ng-click="editFunctionInfo(func)" title="Edit"><i class="fa fa-edit"></i></a>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<uib-accordion>
<uib-accordion-group ng-repeat="mod in modFunctions.modules" heading="{{mod.module_name+' - '+mod.remark}}">
<table class="table table-hover">
<tbody>
<tr ng-repeat="func in mod.funcs">
<th ng-bind="func.func_id+(func.remark?'('+func.remark+')':'')" title="{{func.remark}}"></th>
<td ng-bind="func.uri+'['+func.req_methods+']'" title="{{func.remark}}"></td>
<td ng-bind="func.name"></td>
<td>
<a role="button" ng-click="moveFunction(func)" title="Move"><i class="fa fa-arrows"></i></a>
<a role="button" ng-click="editFunctionInfo(func)" title="Edit"><i class="fa fa-edit"></i></a>
</td>
</tr>
</tbody>
</table>
</uib-accordion-group>
</uib-accordion>

@ -0,0 +1,35 @@
<div class="modal-header">
<h4 ng-if="!nameEditable">Edit Module</h4>
<h4 ng-if="nameEditable">New Module</h4>
</div>
<div class="modal-body">
<div class="alert alert-danger" ng-if="errmsg" ng-bind="errmsg"></div>
<div class="form-group">
<label class="control-label">Module Name</label>
<input ng-if="nameEditable" class="form-control" ng-model="module.module_name" placeholder="Module Name">
<p class="form-control-static" ng-bind="module.module_name" ng-if="!nameEditable"></p>
</div>
<div class="form-group">
<label class="control-label" for="jsModule">Js Module</label>
<input class="form-control" id="jsModule" ng-model="module.js_module">
</div>
<div class="form-group">
<label class="control-label" for="jsPath">Js Path</label>
<input class="form-control" id="jsPath" ng-model="module.js_path">
</div>
<div class="form-group">
<label class="control-label" for="remark">Remark</label>
<input class="form-control" id="remark" ng-model="module.remark">
</div>
<div class="form-group" ng-if="nameEditable">
<label class="control-label">是否开放</label>
<input class="control-in" type="checkbox" ng-model="module.initialize" bs-switch
switch-change="init()">
</div>
</div>
<div class="modal-footer">
<button class="btn btn-success" ng-click="save()">Submit</button>
<button class="btn btn-danger" ng-click="$dismiss()">Cancel</button>
</div>

@ -0,0 +1,30 @@
<div class="row margin-bottom">
<div class="col-xs-12">
<button class="btn btn-success" type="button" ng-click="newPartnerModule()"><i class="fa fa-plus"></i> Add Module</button>
</div>
</div>
<div class="table-responsive">
<table class="table table-bordered table-hover">
<thead>
<tr>
<th>Module ID</th>
<th>Module Name</th>
<th>Js Module</th>
<th>Remark</th>
<th>Operation</th>
</tr>
</thead>
<tbody>
<tr ng-repeat="mod in modules">
<td ng-bind="mod.id"></td>
<td ng-bind="mod.module_name"></td>
<td ng-bind="mod.js_module"></td>
<td ng-bind="mod.remark|limitTo:20" title="{{mod.remark}}"></td>
<td>
<a role="button" ng-click="editPartnerModule(mod)" title="Edit"><i class="fa fa-edit"></i></a>
<a role="button" class="text-danger" ng-click="deletePartnerModule(mod)" title="Delete"><i class="fa fa-trash"></i></a>
</td>
</tr>
</tbody>
</table>
</div>

@ -25,6 +25,11 @@
Mail Subscriptions
</a>
<a class="btn btn-app" role="button" ui-sref=".permissionPartner">
<i class="fa fa-key"></i>
Partner Permission Config
</a>
<!--<a class="btn btn-app" role="button" ui-sref=".payment_config">
<i class="fa fa-edit"></i>
Payment Config

Binary file not shown.

Before

Width:  |  Height:  |  Size: 38 KiB

After

Width:  |  Height:  |  Size: 104 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 104 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 82 KiB

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

Loading…
Cancel
Save