# Conflicts: # src/main/resources/application-local.properties # src/main/resources/application.properties # src/test/java/au/com/royalpay/payment/manage/apps/core/impls/CustomerImpressionImplTest.javamaster
commit
25d54b340b
@ -0,0 +1,24 @@
|
||||
package au.com.royalpay.payment.manage.mappers.system;
|
||||
|
||||
import com.alibaba.fastjson.JSONObject;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import cn.yixblog.support.mybatis.autosql.annotations.AutoMapper;
|
||||
import cn.yixblog.support.mybatis.autosql.annotations.AutoSql;
|
||||
import cn.yixblog.support.mybatis.autosql.annotations.SqlType;
|
||||
|
||||
/**
|
||||
* Create by yixian at 2017-12-13 19:10
|
||||
*/
|
||||
@AutoMapper(tablename = "sys_mail_send", pkName = "id")
|
||||
public interface MailSendMapper {
|
||||
@AutoSql(type = SqlType.INSERT)
|
||||
void save(JSONObject record);
|
||||
|
||||
@AutoSql(type = SqlType.UPDATE)
|
||||
void update(JSONObject record);
|
||||
|
||||
@AutoSql(type = SqlType.SELECT)
|
||||
JSONObject find(String emailId, String contact_email);
|
||||
}
|
@ -0,0 +1,26 @@
|
||||
package au.com.royalpay.payment.manage.system.core;
|
||||
|
||||
|
||||
import au.com.royalpay.payment.tools.mail.SendMail;
|
||||
|
||||
import com.alibaba.fastjson.JSONObject;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.net.URISyntaxException;
|
||||
import java.util.Set;
|
||||
|
||||
public interface MailGunService {
|
||||
|
||||
void dealNotify(String nofityString) throws Exception;
|
||||
|
||||
void dealDroppedNotify(String content) throws Exception;
|
||||
|
||||
JSONObject sendMail(SendMail sendMail);
|
||||
|
||||
JSONObject addClientToMailList(JSONObject client);
|
||||
|
||||
JSONObject updateClientOfMailList(JSONObject newClient,JSONObject oldClient);
|
||||
|
||||
JSONObject sendEmail(String notice_id, String title, Set<String> mailTo, String content) throws URISyntaxException, IOException ;
|
||||
|
||||
}
|
@ -0,0 +1,167 @@
|
||||
package au.com.royalpay.payment.manage.system.core.impl;
|
||||
|
||||
import au.com.royalpay.payment.manage.mappers.system.MailSendMapper;
|
||||
import au.com.royalpay.payment.manage.system.core.MailGunService;
|
||||
import au.com.royalpay.payment.tools.connections.attachment.core.AttachmentClient;
|
||||
import au.com.royalpay.payment.tools.mail.MailGunClient;
|
||||
import au.com.royalpay.payment.tools.mail.SendMail;
|
||||
|
||||
import com.alibaba.fastjson.JSONObject;
|
||||
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.jsoup.Jsoup;
|
||||
import org.jsoup.nodes.Document;
|
||||
import org.jsoup.nodes.Element;
|
||||
import org.jsoup.select.Elements;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.springframework.beans.factory.annotation.Value;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.net.URISyntaxException;
|
||||
import java.net.URLDecoder;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
|
||||
@Service
|
||||
public class MailGunServiceImpl implements MailGunService {
|
||||
Logger logger = LoggerFactory.getLogger(getClass());
|
||||
|
||||
@Resource
|
||||
private MailSendMapper mailSendMapper;
|
||||
|
||||
@Resource
|
||||
private MailGunClient mailGunClient;
|
||||
|
||||
@Value("${mail.mailgun.default.merchantlist}")
|
||||
private String mailListDefault;
|
||||
|
||||
@Resource
|
||||
private AttachmentClient attachmentClient;
|
||||
|
||||
@Override
|
||||
public void dealNotify(String nofityString) throws Exception {
|
||||
String dd = URLDecoder.decode(nofityString, "UTF-8");
|
||||
Map<String, String> mailgunNotify = getQueryMap(dd);
|
||||
String myData = mailgunNotify.get("my-custom-data");
|
||||
String recipient = mailgunNotify.get("recipient");
|
||||
if (StringUtils.isNotEmpty(myData) && StringUtils.isNotEmpty(recipient)) {
|
||||
JSONObject tmpJSONObject = JSONObject.parseObject(myData);
|
||||
String[] mailAddresses = recipient.split(",");
|
||||
for (String mailAddress : mailAddresses) {
|
||||
JSONObject record = new JSONObject();
|
||||
record.put("id", tmpJSONObject.getString("id"));
|
||||
record.put("mail_address", mailAddress);
|
||||
record.put("status", 1);
|
||||
mailSendMapper.update(record);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void dealDroppedNotify(String content) throws Exception {
|
||||
String dd = URLDecoder.decode(content, "UTF-8");
|
||||
Map<String, String> mailgunNotify = getQueryMap(dd);
|
||||
String myData = mailgunNotify.get("my-custom-data");
|
||||
String recipient = mailgunNotify.get("recipient");
|
||||
if (StringUtils.isNotEmpty(myData) && StringUtils.isNotEmpty(recipient)) {
|
||||
JSONObject tmpJSONObject = JSONObject.parseObject(myData);
|
||||
String[] mailAddresses = recipient.split(",");
|
||||
for (String mailAddress : mailAddresses) {
|
||||
JSONObject record = new JSONObject();
|
||||
record.put("id", tmpJSONObject.getString("id"));
|
||||
record.put("mail_address", mailAddress);
|
||||
record.put("status", 2);
|
||||
mailSendMapper.update(record);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public JSONObject sendMail(SendMail sendMail) {
|
||||
return mailGunClient.sendMail(sendMail);
|
||||
}
|
||||
|
||||
@Override
|
||||
public JSONObject addClientToMailList(JSONObject client) {
|
||||
JSONObject result = null;
|
||||
try {
|
||||
JSONObject var = new JSONObject();
|
||||
var.put("client_moniker", client.getString("client_moniker"));
|
||||
var.put("short_name", client.getString("short_name"));
|
||||
result = mailGunClient.addListMember(client.getString("contact_email"), mailListDefault, client.getString("contact_person"), var);
|
||||
} catch (Exception ignore) {
|
||||
logger.info("add Mail List Failed email:" + client.getString("contact_email") + " client_moniker:" + client.getString("client_moniker"));
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
@Override
|
||||
public JSONObject updateClientOfMailList(JSONObject newClient, JSONObject oldClient) {
|
||||
JSONObject result = null;
|
||||
try {
|
||||
JSONObject var = new JSONObject();
|
||||
var.put("client_moniker", newClient.getString("client_moniker"));
|
||||
var.put("short_name", newClient.getString("short_name"));
|
||||
result = mailGunClient.updateClientOfMailList(newClient.getString("contact_email"), mailListDefault, newClient.getString("contact_person"),
|
||||
oldClient.getString("contact_email"), var);
|
||||
} catch (Exception ignore) {
|
||||
logger.info("Modify Mail List Failed oldEmail:" + oldClient.getString("contact_email") + " client_moniker:" + newClient.getString("client_moniker")
|
||||
+ " newEmail:" + newClient.getString("contact_email"));
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
@Override
|
||||
public JSONObject sendEmail(String notice_id, String title, Set<String> mailTo, String content) throws URISyntaxException, IOException {
|
||||
Document doc = Jsoup.parse(content);
|
||||
Elements links = doc.select("a[href]");
|
||||
List<JSONObject> files = new ArrayList<>();
|
||||
for (Element link : links) {
|
||||
String linkHref = link.attr("href");
|
||||
String linkText = link.text();
|
||||
Element e = link.previousElementSibling();
|
||||
if (e != null && "img".equalsIgnoreCase(e.tagName())) {
|
||||
e.remove();
|
||||
}
|
||||
if (linkHref.contains("mailto")) {
|
||||
continue;
|
||||
}
|
||||
JSONObject file = new JSONObject();
|
||||
file.put("name", linkText);
|
||||
file.put("byteArr", attachmentClient.getFileByUrl(linkHref));
|
||||
files.add(file);
|
||||
}
|
||||
|
||||
SendMail sendMail = new SendMail();
|
||||
sendMail.setFrom("postmaster@mail.royalpay.com.au");
|
||||
sendMail.setTitle(title);
|
||||
sendMail.setContent(doc.outerHtml());
|
||||
sendMail.setNotice_id(notice_id);
|
||||
sendMail.setMailTos(mailTo);
|
||||
sendMail.setAttachFiles(files);
|
||||
|
||||
return mailGunClient.sendMail(sendMail);
|
||||
}
|
||||
|
||||
|
||||
|
||||
public Map<String, String> getQueryMap(String query) {
|
||||
String[] params = query.split("&");
|
||||
Map<String, String> map = new HashMap<>();
|
||||
for (String param : params) {
|
||||
String[] tmpArr = param.split("=");
|
||||
if (tmpArr.length < 2) {
|
||||
continue;
|
||||
}
|
||||
map.put(tmpArr[0], tmpArr[1]);
|
||||
}
|
||||
return map;
|
||||
}
|
||||
}
|
@ -0,0 +1,30 @@
|
||||
package au.com.royalpay.payment.manage.system.web;
|
||||
|
||||
import au.com.royalpay.payment.manage.system.core.MailGunService;
|
||||
|
||||
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 javax.annotation.Resource;
|
||||
|
||||
@RestController
|
||||
@RequestMapping(value = "/mailgun")
|
||||
public class MailCallBackController {
|
||||
|
||||
@Resource
|
||||
private MailGunService mailService;
|
||||
|
||||
@RequestMapping(value = "/callback", method = RequestMethod.POST)
|
||||
public void dealSuccessNptify(@RequestBody String content) throws Exception {
|
||||
mailService.dealNotify(content);
|
||||
}
|
||||
|
||||
|
||||
@RequestMapping(value = "/callback/dropped", method = RequestMethod.POST)
|
||||
public void contractList(@RequestBody String content) throws Exception {
|
||||
mailService.dealDroppedNotify(content);
|
||||
}
|
||||
|
||||
}
|
@ -1,6 +1,6 @@
|
||||
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
|
||||
spring.datasource.schema-name=royalpay_production
|
||||
spring.datasource.host=192.168.0.49:3306
|
||||
spring.datasource.host=192.168.99.100:3306
|
||||
spring.datasource.url=jdbc:mysql://${spring.datasource.host}/${spring.datasource.schema-name}?useUnicode=true&characterEncoding=utf8&useSSL=false
|
||||
spring.datasource.username=root
|
||||
spring.datasource.password=root
|
After Width: | Height: | Size: 3.2 KiB |
After Width: | Height: | Size: 3.7 KiB |
After Width: | Height: | Size: 3.5 KiB |
After Width: | Height: | Size: 4.0 KiB |
After Width: | Height: | Size: 3.1 KiB |
After Width: | Height: | Size: 3.7 KiB |
@ -1,158 +1,146 @@
|
||||
<div ui-view>
|
||||
<section class="content-header">
|
||||
<h1>List of Products Sold</h1>
|
||||
<ol class="breadcrumb">
|
||||
<li>
|
||||
<i class="fa fa-sitemap"></i> Products & Sale
|
||||
</li>
|
||||
<li class="active">Sale</li>
|
||||
</ol>
|
||||
</section>
|
||||
|
||||
<div class="content">
|
||||
<div class="row">
|
||||
<div class="col-sm-12">
|
||||
<div class="box-solid">
|
||||
<div class="box box-warning">
|
||||
<div class="box-header">
|
||||
<div class="form-inline">
|
||||
<div class="form-group col-xs-12">
|
||||
<label class="control-label col-xs-4 col-sm-2">Status</label>
|
||||
<div class="col-sm-10 col-xs-8">
|
||||
<p class="form-control-static">
|
||||
<a role="button" ng-class="{'bg-primary':params.status=='ALL'}"
|
||||
ng-click="params.status='ALL';loadGoodOrders(1)">All</a> |
|
||||
<a role="button" ng-class="{'bg-primary':params.status=='PAID'}"
|
||||
ng-click="params.status='1';loadGoodOrders(1)">Payment Success</a> |
|
||||
<a role="button" ng-class="{'bg-primary':params.status=='UNPAID'}"
|
||||
ng-click="params.status='0';loadGoodOrders(1)">Waiting for Payment</a>
|
||||
</p>
|
||||
<div class="row">
|
||||
<div class="col-sm-12">
|
||||
<div class="box-solid">
|
||||
<div class="box box-warning">
|
||||
<div class="box-header">
|
||||
<div class="form-inline">
|
||||
<div class="form-group col-xs-12">
|
||||
<label class="control-label col-xs-4 col-sm-2">Status</label>
|
||||
<div class="col-sm-10 col-xs-8">
|
||||
<p class="form-control-static">
|
||||
<a role="button" ng-class="{'bg-primary':params.status=='ALL'}"
|
||||
ng-click="params.status='ALL';loadGoodOrders(1)">All</a> |
|
||||
<a role="button" ng-class="{'bg-primary':params.status=='PAID'}"
|
||||
ng-click="params.status='1';loadGoodOrders(1)">Payment Success</a> |
|
||||
<a role="button" ng-class="{'bg-primary':params.status=='UNPAID'}"
|
||||
ng-click="params.status='0';loadGoodOrders(1)">Waiting for Payment</a>
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group col-xs-12">
|
||||
<label class="control-label col-xs-4 col-sm-2">Date Range</label>
|
||||
<div class="col-sm-10 col-xs-8">
|
||||
<div class="form-control-static form-inline">
|
||||
<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>
|
||||
<div class="form-group col-xs-12">
|
||||
<label class="control-label col-xs-4 col-sm-2">Date Range</label>
|
||||
<div class="col-sm-10 col-xs-8">
|
||||
<div class="form-control-static form-inline">
|
||||
<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>
|
||||
|
||||
<div class="btn-group">
|
||||
<a role="button" class="btn btn-default btn-sm"
|
||||
ng-click="chooseToday()">Today</a>
|
||||
</div>
|
||||
<div class="btn-group">
|
||||
<a role="button" class="btn btn-default btn-sm"
|
||||
ng-click="chooseYesterday()">Yesterday</a>
|
||||
</div>
|
||||
<div class="btn-group">
|
||||
<a role="button" class="btn btn-default btn-sm"
|
||||
ng-click="chooseLast7Days()">Last 7
|
||||
Days</a>
|
||||
</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>
|
||||
</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>
|
||||
|
||||
<div class="btn-group">
|
||||
<a role="button" class="btn btn-default btn-sm"
|
||||
ng-click="chooseToday()">Today</a>
|
||||
</div>
|
||||
<div class="btn-group">
|
||||
<a role="button" class="btn btn-default btn-sm"
|
||||
ng-click="chooseYesterday()">Yesterday</a>
|
||||
</div>
|
||||
<div class="btn-group">
|
||||
<a role="button" class="btn btn-default btn-sm"
|
||||
ng-click="chooseLast7Days()">Last 7
|
||||
Days</a>
|
||||
</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>
|
||||
</div>
|
||||
<!--<div class="form-group">-->
|
||||
<!--<label class="control-label" for="short-name-search">Partner Name</label>-->
|
||||
<!--<input type="text" class="form-control" id="short-name-search"-->
|
||||
<!--ng-model="params.short_name">-->
|
||||
<!--</div>-->
|
||||
<button class="btn btn-success" type="button" ng-click="loadGoodOrders(1)">
|
||||
<i class="fa fa-search"></i> Search
|
||||
</button>
|
||||
|
||||
</div>
|
||||
|
||||
</div>
|
||||
<!--<div class="form-group">-->
|
||||
<!--<label class="control-label" for="short-name-search">Partner Name</label>-->
|
||||
<!--<input type="text" class="form-control" id="short-name-search"-->
|
||||
<!--ng-model="params.short_name">-->
|
||||
<!--</div>-->
|
||||
<button class="btn btn-success" type="button" ng-click="loadGoodOrders(1)">
|
||||
<i class="fa fa-search"></i> Search
|
||||
</button>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
<div class="box">
|
||||
<div class="box-header">
|
||||
<h3 class="box-title">List of Products Sold</h3>
|
||||
</div>
|
||||
|
||||
<div class="box-body no-padding table-responsive">
|
||||
<table class="table table-striped">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Sale ID</th>
|
||||
<th>Payment Order ID</th>
|
||||
<th>Product Name</th>
|
||||
<th>Unit Price</th>
|
||||
<th>Quantity</th>
|
||||
<th>Order Total</th>
|
||||
<th>Order Status</th>
|
||||
<th>Create Time</th>
|
||||
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr ng-repeat="goodOrder in sales">
|
||||
|
||||
<!--<td><span ng-bind="good.goodId"></span><i class="fa fa-sitemap" ng-if="good.parent_client_id" title="Sub Partner"></i></td>-->
|
||||
<td ng-bind="goodOrder.id"></td>
|
||||
<td ng-bind="goodOrder.order_id"></td>
|
||||
<td ng-bind="goodOrder.title"></td>
|
||||
<td ng-bind="goodOrder.price"></td>
|
||||
<td ng-bind="goodOrder.count"></td>
|
||||
<td ng-bind="goodOrder.order_total"></td>
|
||||
<!--<td ng-bind="good.is_using"></td>-->
|
||||
<td>
|
||||
<span ng-if="goodOrder.order_status==1">PAID</span>
|
||||
<span ng-if="goodOrder.order_status==0">NOT PAID</span>
|
||||
<span ng-if="goodOrder.order_status==2">CLOSED</span>
|
||||
</td>
|
||||
<td ng-bind="goodOrder.create_time"></td>
|
||||
<div class="box">
|
||||
<div class="box-header">
|
||||
<h3 class="box-title">List of Products Sold</h3>
|
||||
</div>
|
||||
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<div class="box-body no-padding table-responsive">
|
||||
<table class="table table-striped">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Sale ID</th>
|
||||
<th>Payment Order ID</th>
|
||||
<th>Product Name</th>
|
||||
<th>Unit Price</th>
|
||||
<th>Quantity</th>
|
||||
<th>Order Total</th>
|
||||
<th>Order Status</th>
|
||||
<th>Create Time</th>
|
||||
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr ng-repeat="goodOrder in sales">
|
||||
|
||||
<!--<td><span ng-bind="good.goodId"></span><i class="fa fa-sitemap" ng-if="good.parent_client_id" title="Sub Partner"></i></td>-->
|
||||
<td ng-bind="goodOrder.id"></td>
|
||||
<td ng-bind="goodOrder.order_id"></td>
|
||||
<td ng-bind="goodOrder.title"></td>
|
||||
<td ng-bind="goodOrder.price"></td>
|
||||
<td ng-bind="goodOrder.count"></td>
|
||||
<td ng-bind="goodOrder.order_total"></td>
|
||||
<!--<td ng-bind="good.is_using"></td>-->
|
||||
<td>
|
||||
<span ng-if="goodOrder.order_status==1">PAID</span>
|
||||
<span ng-if="goodOrder.order_status==0">NOT PAID</span>
|
||||
<span ng-if="goodOrder.order_status==2">CLOSED</span>
|
||||
</td>
|
||||
<td ng-bind="goodOrder.create_time"></td>
|
||||
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
</div>
|
||||
<div class="box-footer" ng-if="goods.length">
|
||||
<uib-pagination class="pagination"
|
||||
total-items="pagination.totalCount"
|
||||
boundary-links="true"
|
||||
ng-model="pagination.page"
|
||||
items-per-page="pagination.limit"
|
||||
max-size="10"
|
||||
ng-change="loadGoodOrders()"
|
||||
previous-text="‹"
|
||||
next-text="›"
|
||||
first-text="«"
|
||||
last-text="»"></uib-pagination>
|
||||
<div class="row">
|
||||
<div class="col-xs-12">Total Records:{{pagination.totalCount}};Total Pages:{{pagination.totalPages}}</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="box-footer" ng-if="goods.length">
|
||||
<uib-pagination class="pagination"
|
||||
total-items="pagination.totalCount"
|
||||
boundary-links="true"
|
||||
ng-model="pagination.page"
|
||||
items-per-page="pagination.limit"
|
||||
max-size="10"
|
||||
ng-change="loadGoodOrders()"
|
||||
previous-text="‹"
|
||||
next-text="›"
|
||||
first-text="«"
|
||||
last-text="»"></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>
|
||||
|
@ -1,135 +1,150 @@
|
||||
<div ui-view>
|
||||
<section class="content-header">
|
||||
<h1>Product Management</h1>
|
||||
<ol class="breadcrumb">
|
||||
<li>
|
||||
<i class="fa fa-sitemap"></i> Products & Sale
|
||||
</li>
|
||||
<li class="active">Product Management</li>
|
||||
</ol>
|
||||
</section>
|
||||
|
||||
<div class="content">
|
||||
<section class="content-header">
|
||||
<h1>Product & Sale</h1>
|
||||
<ol class="breadcrumb">
|
||||
<li>
|
||||
<i class="fa fa-sitemap"></i> Products & Sale
|
||||
</li>
|
||||
<li class="active">Product & Sale Management</li>
|
||||
</ol>
|
||||
</section>
|
||||
<div class="content">
|
||||
<div class="row">
|
||||
<div class="col-sm-12">
|
||||
<div class="box-solid">
|
||||
<div class="box box-warning">
|
||||
<div class="box-header">
|
||||
<div class="form-inline">
|
||||
<!--<div class="form-group">-->
|
||||
<!--<label class="control-label" for="good-code-search">Good Code</label>-->
|
||||
<!--<input class="form-control" id="good-code-search" ng-model="params.code">-->
|
||||
<!--</div>-->
|
||||
<div class="form-group">
|
||||
<label class="control-label" for="good-title-search">Product Name</label>
|
||||
<input type="number" class="form-control" id="good-title-search"
|
||||
ng-model="params.title">
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="control-label" for="good-type-search">Product Type</label>
|
||||
<input type="number" class="form-control" id="good-type-search"
|
||||
ng-model="params.type">
|
||||
</div>
|
||||
<!--<div class="form-group">-->
|
||||
<!--<label class="control-label" for="short-name-search">Partner Name</label>-->
|
||||
<!--<input type="text" class="form-control" id="short-name-search"-->
|
||||
<!--ng-model="params.short_name">-->
|
||||
<!--</div>-->
|
||||
<div class="form-group">
|
||||
<button class="btn btn-primary" type="button" ng-click="loadGood(1)"><i
|
||||
class="fa fa-search"></i></button>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<div class="nav-tabs-custom">
|
||||
<ul class="nav nav-tabs">
|
||||
<li ui-sref-active-eq="active">
|
||||
<a ui-sref="goods">Product</a>
|
||||
</li>
|
||||
<li ui-sref-active="active">
|
||||
<a ui-sref="goods.sale">Sale</a>
|
||||
</li>
|
||||
</ul>
|
||||
<div class="tab-content" ui-view>
|
||||
<div class="row">
|
||||
<div class="col-sm-12">
|
||||
<div class="box-solid">
|
||||
<div class="box box-warning">
|
||||
<div class="box-header">
|
||||
<div class="form-inline">
|
||||
<!--<div class="form-group">-->
|
||||
<!--<label class="control-label" for="good-code-search">Good Code</label>-->
|
||||
<!--<input class="form-control" id="good-code-search" ng-model="params.code">-->
|
||||
<!--</div>-->
|
||||
<div class="form-group">
|
||||
<label class="control-label" for="good-title-search">Product Name</label>
|
||||
<input type="number" class="form-control" id="good-title-search"
|
||||
ng-model="params.title">
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="control-label" for="good-type-search">Product Type</label>
|
||||
<input type="number" class="form-control" id="good-type-search"
|
||||
ng-model="params.type">
|
||||
</div>
|
||||
<!--<div class="form-group">-->
|
||||
<!--<label class="control-label" for="short-name-search">Partner Name</label>-->
|
||||
<!--<input type="text" class="form-control" id="short-name-search"-->
|
||||
<!--ng-model="params.short_name">-->
|
||||
<!--</div>-->
|
||||
<div class="form-group">
|
||||
<button class="btn btn-primary" type="button" ng-click="loadGood(1)"><i
|
||||
class="fa fa-search"></i></button>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
|
||||
<a role="button" class="btn btn-info pull-right" ui-sref=".new" title="Add Product">
|
||||
<i class="fa fa-plus"></i>
|
||||
Add Product
|
||||
</a>
|
||||
</div>
|
||||
<a role="button" class="btn btn-info pull-right" ui-sref=".new" title="Add Product">
|
||||
<i class="fa fa-plus"></i>
|
||||
Add Product
|
||||
</a>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
<div class="box">
|
||||
<div class="box-header">
|
||||
<h3 class="box-title">List of Products</h3>
|
||||
</div>
|
||||
<div class="box">
|
||||
<div class="box-header">
|
||||
<h3 class="box-title">List of Products</h3>
|
||||
</div>
|
||||
|
||||
<div class="box-body no-padding table-responsive">
|
||||
<table class="table table-striped">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Product Image</th>
|
||||
<th>Product Name</th>
|
||||
<th>Price (AUD)</th>
|
||||
<th>Current Price (AUD)</th>
|
||||
<th>Price (CNY)</th>
|
||||
<th>Current Price(CNY)</th>
|
||||
<th>Product Type</th>
|
||||
<th>Stocks Available</th>
|
||||
<th>Origin</th>
|
||||
<th>Status</th>
|
||||
<th>Operation</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr ng-repeat="good in goods">
|
||||
<div class="box-body no-padding table-responsive">
|
||||
<table class="table table-striped">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Product Image</th>
|
||||
<th>Product Name</th>
|
||||
<th>Price (AUD)</th>
|
||||
<th>Current Price (AUD)</th>
|
||||
<th>Price (CNY)</th>
|
||||
<th>Current Price(CNY)</th>
|
||||
<th>Product Type</th>
|
||||
<th>Stocks Available</th>
|
||||
<th>Origin</th>
|
||||
<th>Status</th>
|
||||
<th>Operation</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr ng-repeat="good in goods">
|
||||
|
||||
<!--<td><span ng-bind="good.goodId"></span><i class="fa fa-sitemap" ng-if="good.parent_client_id" title="Sub Partner"></i></td>-->
|
||||
<td><img ng-if="good.thumbnailUrl" src="{{good.thumbnailUrl}}"></td>
|
||||
<td ng-bind="good.title"></td>
|
||||
<td ng-bind="good.price"></td>
|
||||
<td ng-bind="good.actual_price"></td>
|
||||
<td ng-bind="good.cny_price"></td>
|
||||
<td ng-bind="good.actual_cny_price"></td>
|
||||
<td ng-bind="good.type"></td>
|
||||
<td ng-bind="good.inventory"></td>
|
||||
<td ng-bind="good.origin"></td>
|
||||
<!--<td ng-bind="good.is_using"></td>-->
|
||||
<td>
|
||||
<span ng-if="good.is_using==1">On Sale</span>
|
||||
<span ng-if="good.is_using==0">Out Of Stock</span>
|
||||
</td>
|
||||
<td>
|
||||
<a class="text-primary" role="button" title="Detail"
|
||||
ui-sref=".detail({goodId:good.id})">
|
||||
<i class="fa fa-search"></i> Detail
|
||||
</a>|
|
||||
<a class="text-primary" role="button" title="Delete"
|
||||
ng-click="deleteGoods(good.id)">
|
||||
<i class="fa fa-trash-o"></i> Delete
|
||||
</a>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<!--<td><span ng-bind="good.goodId"></span><i class="fa fa-sitemap" ng-if="good.parent_client_id" title="Sub Partner"></i></td>-->
|
||||
<td><img ng-if="good.thumbnailUrl" src="{{good.thumbnailUrl}}"></td>
|
||||
<td ng-bind="good.title"></td>
|
||||
<td ng-bind="good.price"></td>
|
||||
<td ng-bind="good.actual_price"></td>
|
||||
<td ng-bind="good.cny_price"></td>
|
||||
<td ng-bind="good.actual_cny_price"></td>
|
||||
<td ng-bind="good.type"></td>
|
||||
<td ng-bind="good.inventory"></td>
|
||||
<td ng-bind="good.origin"></td>
|
||||
<!--<td ng-bind="good.is_using"></td>-->
|
||||
<td>
|
||||
<span ng-if="good.is_using==1">On Sale</span>
|
||||
<span ng-if="good.is_using==0">Out Of Stock</span>
|
||||
</td>
|
||||
<td>
|
||||
<a class="text-primary" role="button" title="Detail"
|
||||
ui-sref=".detail({goodId:good.id})">
|
||||
<i class="fa fa-search"></i> Detail
|
||||
</a>|
|
||||
<a class="text-primary" role="button" title="Delete"
|
||||
ng-click="deleteGoods(good.id)">
|
||||
<i class="fa fa-trash-o"></i> Delete
|
||||
</a>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
</div>
|
||||
<div class="box-footer" ng-if="goods.length">
|
||||
<uib-pagination class="pagination"
|
||||
total-items="pagination.totalCount"
|
||||
boundary-links="true"
|
||||
ng-model="pagination.page"
|
||||
items-per-page="pagination.limit"
|
||||
max-size="10"
|
||||
ng-change="loadGoods()"
|
||||
previous-text="‹"
|
||||
next-text="›"
|
||||
first-text="«"
|
||||
last-text="»"></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 class="box-footer" ng-if="goods.length">
|
||||
<uib-pagination class="pagination"
|
||||
total-items="pagination.totalCount"
|
||||
boundary-links="true"
|
||||
ng-model="pagination.page"
|
||||
items-per-page="pagination.limit"
|
||||
max-size="10"
|
||||
ng-change="loadGoods()"
|
||||
previous-text="‹"
|
||||
next-text="›"
|
||||
first-text="«"
|
||||
last-text="»"></uib-pagination>
|
||||
<div class="row">
|
||||
<div class="col-xs-12">Total Records:{{pagination.totalCount}};Total Pages:{{pagination.totalPages}}</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
@ -0,0 +1,79 @@
|
||||
/**
|
||||
* Created by yixian on 2016-07-15.
|
||||
*/
|
||||
$(document).ready(function () {
|
||||
'use strict';
|
||||
decode();
|
||||
function decode() {
|
||||
var redirect = window.redirect;
|
||||
while(redirect.indexOf('://')<0){
|
||||
redirect = decodeURIComponent(redirect);
|
||||
if(redirect==window.redirect){
|
||||
break;
|
||||
}
|
||||
window.redirect = redirect;
|
||||
}
|
||||
}
|
||||
var dataCache = {paying: false};
|
||||
$('#key_P').bind('touchstart', startPay);
|
||||
function startPay() {
|
||||
$('#wdiv').show();
|
||||
if (dataCache.paying) {
|
||||
return;
|
||||
}
|
||||
dataCache.paying = true;
|
||||
|
||||
$.ajax({
|
||||
url: '/api/v1.0/alipay/partners/' + window.client_moniker + '/orders/'+window.order_id+'/order_params',
|
||||
method: 'GET',
|
||||
dataType: 'json',
|
||||
success: function (pay) {
|
||||
if (pay.direct_paid) {
|
||||
location.href = window.redirect;
|
||||
return;
|
||||
}
|
||||
if (window.AlipayJSBridge) {
|
||||
callPayment();
|
||||
} else {
|
||||
// 如果没有注入则监听注入的事件
|
||||
document.addEventListener('AlipayJSBridgeReady', callPayment, false);
|
||||
}
|
||||
|
||||
function callPayment() {
|
||||
try {
|
||||
AlipayJSBridge.call('tradePay', {
|
||||
tradeNO: pay.trade_no
|
||||
}, function (res) {
|
||||
dataCache.paying = false;
|
||||
if (res.resultCode == '9000') {
|
||||
AlipayJSBridge.call('startApp', {
|
||||
appId: '20000056',
|
||||
param: {
|
||||
actionType: 'showSuccPage',
|
||||
payResult: res.result
|
||||
},
|
||||
closeCurrentApp: false
|
||||
});
|
||||
location.href = window.redirect;
|
||||
} else {
|
||||
alert(res.memo);
|
||||
}
|
||||
$('#wdiv').hide();
|
||||
})
|
||||
} catch (err) {
|
||||
alert(err);
|
||||
$('#wdiv').hide();
|
||||
}
|
||||
}
|
||||
},
|
||||
error: function (jqXhr) {
|
||||
alert(jqXhr.responseJSON.message);
|
||||
$('#wdiv').hide();
|
||||
dataCache.paying = false;
|
||||
}
|
||||
})
|
||||
|
||||
|
||||
}
|
||||
|
||||
});
|
@ -0,0 +1,120 @@
|
||||
.weui_cell_ft {
|
||||
max-width: 60%;
|
||||
white-space: normal
|
||||
}
|
||||
.pay-container{
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
right: 0;
|
||||
bottom: 0;
|
||||
}
|
||||
.pay-container>img{
|
||||
display: block;
|
||||
margin: auto;
|
||||
width: 250px;
|
||||
}
|
||||
div,span,img,button,a,p{
|
||||
box-sizing: border-box;
|
||||
}
|
||||
body{
|
||||
background: #fff;
|
||||
}
|
||||
.royal-container{
|
||||
margin-top: 20%;
|
||||
display: block;
|
||||
width: 100%;
|
||||
padding: 10px 30px;
|
||||
}
|
||||
|
||||
.royal-container .royal-row{
|
||||
border-bottom: 1px solid #d1d2d4;
|
||||
padding: 5px 0;
|
||||
}
|
||||
.royal-container .royal-row.brand{
|
||||
text-align: center;
|
||||
}
|
||||
.royal-container .royal-row.brand img{
|
||||
display: block;
|
||||
max-width: 60%;
|
||||
max-height: 100px;
|
||||
margin: auto;
|
||||
}
|
||||
.royal-container .royal-row.brand .name{
|
||||
display: block;
|
||||
margin: auto;
|
||||
font-size: 1.6em;
|
||||
}
|
||||
.text-title{
|
||||
color: #888888;
|
||||
font-size: 0.9em;
|
||||
}
|
||||
|
||||
.text-main{
|
||||
color: #333333;
|
||||
font-size: 1.1em;
|
||||
}
|
||||
|
||||
.royal-pay-btn{
|
||||
background: #30af69;
|
||||
color: #fff;
|
||||
width: 96%;
|
||||
display: block;
|
||||
margin: 10px auto 30px;
|
||||
height: 50px;
|
||||
line-height: 50px;
|
||||
font-size: 1.4em;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.alipay .royal-pay-btn{
|
||||
background: #108ee9;
|
||||
}
|
||||
|
||||
.alipay .amount_title{
|
||||
background: #108ee9;
|
||||
}
|
||||
|
||||
.amount_title{
|
||||
height: 14%;
|
||||
z-index: 10;
|
||||
background: #30af69;
|
||||
max-height: 200px;
|
||||
min-height: 120px;
|
||||
width: 100%;
|
||||
}
|
||||
.amount_title_logo{
|
||||
float: left;
|
||||
max-width: 90px;
|
||||
min-width: 80px;
|
||||
margin-left: 10px;
|
||||
}
|
||||
.amount_title_content{
|
||||
float: left;
|
||||
}
|
||||
.amount_title_content_amount{
|
||||
font-family: Avenir-Roman;
|
||||
font-size: 30px;
|
||||
color: #FFFFFF;
|
||||
}
|
||||
|
||||
.amount_title_content_text{
|
||||
font-family: PingFangSC-Regular;
|
||||
font-size: 17px;
|
||||
color: #FFFFFF;
|
||||
}
|
||||
.merchant_info{
|
||||
height: 100px;
|
||||
z-index: 1;
|
||||
position: absolute;
|
||||
width: 94%;
|
||||
margin: -5% 0% 0px 3%;
|
||||
text-align: center;
|
||||
background-color: #FFFFFF;
|
||||
box-shadow: 0px 0px 8px 0px rgba(171,171,171,0.50);
|
||||
}
|
||||
|
||||
.merchant_info img{
|
||||
max-height: 60px;
|
||||
min-height: 50px;
|
||||
}
|
@ -0,0 +1,106 @@
|
||||
|
||||
$(document).ready(function () {
|
||||
'use strict';
|
||||
decode();
|
||||
|
||||
function decode() {
|
||||
var redirect = window.redirect;
|
||||
while (redirect.indexOf('://') < 0) {
|
||||
redirect = decodeURIComponent(redirect);
|
||||
if (redirect == window.redirect) {
|
||||
break;
|
||||
}
|
||||
window.redirect = redirect;
|
||||
}
|
||||
}
|
||||
|
||||
var dataCache = {paying: false};
|
||||
$('#key_P').bind('touchstart', startPay);
|
||||
|
||||
function startPay() {
|
||||
$('#wdiv').show();
|
||||
if (dataCache.paying) {
|
||||
return;
|
||||
}
|
||||
dataCache.paying = true;
|
||||
|
||||
$.ajax({
|
||||
url: '/api/payment/v1.0/wechat_jsapi_payment/partners/' + window.client_moniker + '/orders/' + window.order_id + '/preorder',
|
||||
method: 'get',
|
||||
dataType: 'json',
|
||||
success: function (pay) {
|
||||
try {
|
||||
if (pay.direct_paid) {
|
||||
dataCache.paying = false;
|
||||
location.href = window.redirect;
|
||||
}
|
||||
var paydata = pay.jsapi;
|
||||
invokePay(paydata);
|
||||
}catch (e) {
|
||||
alert("Unexpected Error:" + e);
|
||||
$('#wdiv').hide();
|
||||
dataCache.paying = false;
|
||||
}
|
||||
},
|
||||
error: function (jqXhr) {
|
||||
var respText = jqXhr.responseText;
|
||||
try {
|
||||
alert(JSON.parse(respText).message);
|
||||
$('#wdiv').hide();
|
||||
dataCache.paying = false;
|
||||
} catch (e) {
|
||||
alert("Unexpected Error:" + respText);
|
||||
$('#wdiv').hide();
|
||||
dataCache.paying = false;
|
||||
}
|
||||
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
}
|
||||
|
||||
function invokePay(paydata) {
|
||||
WeixinJSBridge.invoke('getBrandWCPayRequest', {
|
||||
'appId': paydata.appId,
|
||||
'timeStamp': paydata.timeStamp,
|
||||
'nonceStr': paydata.nonceStr,
|
||||
'package': paydata.package,
|
||||
'signType': paydata.signType,
|
||||
'paySign': paydata.paySign
|
||||
}, function (res) {
|
||||
dataCache.paying = false;
|
||||
if (res.err_msg == 'get_brand_wcpay_request:ok') {
|
||||
startCheckOrder(window.order_id)
|
||||
} else {
|
||||
if (res.err_msg != 'get_brand_wcpay_request:cancel' && res.err_msg != 'get_brand_wcpay_request:fail') {
|
||||
alert('WeChat Error:' + res.err_msg);
|
||||
}
|
||||
if (window.paydata) {
|
||||
location.href = window.redirect + (window.redirect.indexOf('?') < 0 ? '?' : '&') + 'success=false';
|
||||
}
|
||||
}
|
||||
//todo get status from server
|
||||
$('#wdiv').hide();
|
||||
})
|
||||
}
|
||||
|
||||
function startCheckOrder(orderId) {
|
||||
function checkOrderStd() {
|
||||
$.ajax({
|
||||
url: '/api/v1.0/payment/orders/' + orderId + '/status',
|
||||
method: 'GET',
|
||||
dataType: 'json',
|
||||
success: function (res) {
|
||||
if (res.paid) {
|
||||
location.href = window.redirect + (window.redirect.indexOf('?') < 0 ? '?' : '&') + 'success=true';
|
||||
} else {
|
||||
setTimeout(checkOrderStd, 500);
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
checkOrderStd();
|
||||
}
|
||||
});
|
@ -0,0 +1,30 @@
|
||||
package au.com.royalpay.payment.manage.system.core.impl;
|
||||
|
||||
import au.com.royalpay.payment.manage.system.core.MailGunService;
|
||||
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
import org.springframework.boot.test.context.SpringBootTest;
|
||||
import org.springframework.test.context.ActiveProfiles;
|
||||
import org.springframework.test.context.junit4.SpringRunner;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
|
||||
@SpringBootTest
|
||||
@ActiveProfiles({ "local", "alipay", "wechat", "jd", "bestpay" })
|
||||
@RunWith(SpringRunner.class)
|
||||
public class MailGunServiceImplTest {
|
||||
|
||||
@Resource
|
||||
MailGunService mailService;
|
||||
@Test
|
||||
public void dealNotify() {
|
||||
String dd= "timestamp=1526298391&token=b7ad8dc0905c46b1c4853200941d30417b4d3f3695815dc729&signature=a3507be4d7ad2b48c4b57202eabd6f63b75abfacd974a9bc7773dc968a12c34e&X-Mailgun-Sid=WyJlMjYwYSIsICI0NjQ1NjMxMThAcXEuY29tIiwgIjQzODY0NiJd&domain=dev.showcodes.com&X-Mailgun-Tag=test1&event=delivered&event-timestamp=1526298391.16&message-headers=[[\"X-Mailgun-Sending-Ip\", \"184.173.153.207\"], [\"X-Mailgun-Sid\", \"WyJlMjYwYSIsICI0NjQ1NjMxMThAcXEuY29tIiwgIjQzODY0NiJd\"], [\"List-Unsubscribe\", \"<mailto:u+mq6timzygy2dmjtjhuzdamjyga2tcnbrge2dmmrzfyys4msdivdecmkegi3uenbwgu4ugnbfgqygizlwfzzwq33xmnxwizltfzrw63jgna6tgmbummzdqnjzga2tkylggfqwkzjqhbrwiyzumzqtkztgg44donrgnu6tknjugqytomjgoi6tinrugu3dgmjrhastimdroexgg33nezwxslldovzxi33nfvsgc5dbhustoqrfgizgwzlzeuzdejjtiestemtwmfwhkzjfgizckn2e@dev.showcodes.com>\"], [\"Received\", \"by luna.mailgun.net with SMTP X-Mailgun-List-Id=5544171, 8794346058393; Mon, 14 May 2018 11:46:29 +0000\"], [\"X-Mailgun-List-Id\", \"5544171\"], [\"X-Mailgun-List-Address\", \"info@dev.showcodes.com\"], [\"List-Id\", \"<info.dev.showcodes.com>\"], [\"Received\", \"by luna.mailgun.net with HTTP; Mon, 14 May 2018 11:46:27 +0000\"], [\"Date\", \"Mon, 14 May 2018 11:46:27 +0000\"], [\"Sender\", \"postmaster@mail.royalpay.com.au\"], [\"X-Mailgun-Variables\", \"{\\\"my-custom-data\\\": \\\"{\\\\\\\"key\\\\\\\":\\\\\\\"value\\\\\\\"}\\\"}\"], [\"X-Mailgun-Tag\", \"test1\"], [\"From\", \"postmaster@mail.royalpay.com.au\"], [\"Subject\", \"Testqweasdzxc1\"], [\"Mime-Version\", \"1.0\"], [\"Content-Type\", [\"multipart/alternative\", {\"boundary\": \"12109fc0295a479385fcbed01f501455\"}]], [\"Message-Id\", \"<20180514114629.1.2CEFA1D27B4659C4@dev.showcodes.com>\"], [\"To\", \"yz <464563118@qq.com>\"]]&Message-Id=<20180514114629.1.2CEFA1D27B4659C4@dev.showcodes.com>&recipient=464563118@qq.com&my-custom-data={\"id\":\"123\"}&body-plain=";
|
||||
try {
|
||||
mailService.dealNotify(dd);
|
||||
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Reference in new issue