customer impression

master
wangning 7 years ago
parent fecd1beb28
commit 9d9b5d2527

@ -207,3 +207,5 @@ VALUES
'android_update' ,
'true'
);
ALTER table sys_clients_customers drop column update_time;

@ -13,7 +13,9 @@ public interface CustomerImpressionService {
JSONObject findOne(int client_id,String customer_id);
void generate(int client_id);
void generateTag(int client_id);
void generateInfo();
void modifyNameRemark(int client_id, String customer_id,String name_remark);
}

@ -1,8 +1,6 @@
package au.com.royalpay.payment.manage.apps.core.impls;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.annotation.Resource;
@ -10,6 +8,10 @@ import javax.annotation.Resource;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.time.DateFormatUtils;
import org.joda.time.DateTime;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.data.redis.core.BoundListOperations;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
@ -45,6 +47,9 @@ public class CustomerImpressionServiceImpl implements CustomerImpressionService
private CustomerRelationAlipayMapper customerRelationAlipayMapper;
@Resource
private CustomerMapper customerMapper;
@Resource
private StringRedisTemplate stringRedisTemplate;
Logger logger = LoggerFactory.getLogger(CustomerImpressionServiceImpl.class);
@Override
public JSONObject listPageble(CustomerImpressionQuery customerImpressionQuery) {
@ -91,19 +96,106 @@ public class CustomerImpressionServiceImpl implements CustomerImpressionService
return customer;
}
// @Override
// @Transactional
// public void generate(int client_id) {
// JSONObject params = new JSONObject();
// params.put("client_id", client_id);
// params.put("include_success_status", 3);
// PageList<JSONObject> lastRecord = clientCustomersMapper.listCustomerInfo(params, new PageBounds(1, 1,
// Order.formString("update_time.desc")));
// if (!CollectionUtils.isEmpty(lastRecord)) {
// params.put("confirm_time", lastRecord.get(0).getDate("update_time"));
// }
// List<JSONObject> orders = orderMapper.listAnalysisClientCustomer(params);
// Date now = new Date();
// for (JSONObject order : orders) {
// if (StringUtils.isEmpty(order.getString("channel"))) {
// continue;
// }
// JSONObject userInfo = customerMapper.findCustomerByOpenId(order.getString("customer_id"));
// if (userInfo == null) {
// userInfo = customerRelationAlipayMapper.findCustomerByUserId(order.getString("customer_id"));
// }
//
// JSONObject clientCustomerInfo = clientCustomersMapper.getClientCustomerWithNull(client_id,
// order.getString("customer_id"));
// if (clientCustomerInfo == null) {
// JSONObject client_customer = new JSONObject();
// client_customer.put("client_id", order.getIntValue("client_id"));
// client_customer.put("customer_id", order.getString("customer_id"));
// client_customer.put("channel", order.getString("channel"));
// client_customer.put("tag", "不活跃用户");
// if (userInfo != null) {
// client_customer.put("headimg", userInfo.getString("headimg"));
// client_customer.put("nick_name", userInfo.getString("nickname"));
// }
// client_customer.put("payment_times", order.getIntValue("payment_times"));
// client_customer.put("total_amount", order.getBigDecimal("total_amount"));
// client_customer.put("update_time", now);
// client_customer.put("last_payment_time", order.getDate("confirm_time"));
// clientCustomersMapper.insert(client_customer);
// } else {
// clientCustomerInfo.put("payment_times", clientCustomerInfo.getIntValue("payment_times") +
// order.getIntValue("payment_times"));
// BigDecimal total_amount = clientCustomerInfo.getBigDecimal("total_amount");
// if (total_amount != null) {
// clientCustomerInfo.put("total_amount",
// clientCustomerInfo.getBigDecimal("total_amount").add(order.getBigDecimal("total_amount")));
// } else {
// clientCustomerInfo.put("total_amount", order.getBigDecimal("total_amount"));
// }
// if (userInfo != null) {
// clientCustomerInfo.put("headimg", userInfo.getString("headimg"));
// clientCustomerInfo.put("nick_name", userInfo.getString("nickname"));
// }
// clientCustomerInfo.put("channel", order.getString("channel"));
// clientCustomerInfo.put("tag", "不活跃用户");
// clientCustomerInfo.put("update_time", now);
// clientCustomerInfo.put("last_payment_time", order.getDate("confirm_time"));
// clientCustomersMapper.update(clientCustomerInfo);
// }
// }
// generateTag(client_id);
// }
@Override
@Transactional
public void generate(int client_id) {
public void generateTag(int client_id) {
JSONObject params = new JSONObject();
DateTime dt = new DateTime();
dt = dt.minusMonths(5);
params.put("confirm_time", dt.toDate());
params.put("client_id", client_id);
params.put("include_success_status", 3);
PageList<JSONObject> lastRecord = clientCustomersMapper.listCustomerInfo(params, new PageBounds(1, 1, Order.formString("update_time.desc")));
if (!CollectionUtils.isEmpty(lastRecord)) {
params.put("confirm_time", lastRecord.get(0).getDate("update_time"));
}
List<JSONObject> orders = orderMapper.listAnalysisClientCustomer(params);
Date now = new Date();
for (JSONObject order : orders) {
int payment_times = order.getInteger("payment_times");
JSONObject updateRecord = new JSONObject();
updateRecord.put("client_id", order.getIntValue("client_id"));
updateRecord.put("customer_id", order.getString("customer_id"));
if (payment_times < 2) {
updateRecord.put("tag", "不活跃用户");
}
if (payment_times >= 2 && payment_times < 10) {
updateRecord.put("tag", "潜力用户");
}
if (payment_times >= 10) {
updateRecord.put("tag", "忠实用户");
}
clientCustomersMapper.update(updateRecord);
}
}
@Override
public void generateInfo() {
BoundListOperations<String, String> ops = stringRedisTemplate.boundListOps("customer_impression");
String redisValue = ops.leftPop();
while (!StringUtils.isEmpty(redisValue)) {
try {
JSONObject order = JSONObject.parseObject(redisValue);
redisValue = ops.leftPop();
if (StringUtils.isEmpty(order.getString("channel"))) {
continue;
}
@ -111,8 +203,7 @@ public class CustomerImpressionServiceImpl implements CustomerImpressionService
if (userInfo == null) {
userInfo = customerRelationAlipayMapper.findCustomerByUserId(order.getString("customer_id"));
}
JSONObject clientCustomerInfo = clientCustomersMapper.getClientCustomerWithNull(client_id, order.getString("customer_id"));
JSONObject clientCustomerInfo = clientCustomersMapper.getClientCustomerWithNull(order.getIntValue("client_id"), order.getString("customer_id"));
if (clientCustomerInfo == null) {
JSONObject client_customer = new JSONObject();
client_customer.put("client_id", order.getIntValue("client_id"));
@ -123,57 +214,24 @@ public class CustomerImpressionServiceImpl implements CustomerImpressionService
client_customer.put("headimg", userInfo.getString("headimg"));
client_customer.put("nick_name", userInfo.getString("nickname"));
}
client_customer.put("payment_times", order.getIntValue("payment_times"));
client_customer.put("payment_times", 1);
client_customer.put("total_amount", order.getBigDecimal("total_amount"));
client_customer.put("update_time", now);
client_customer.put("last_payment_time", order.getDate("confirm_time"));
clientCustomersMapper.insert(client_customer);
} else {
clientCustomerInfo.put("payment_times", clientCustomerInfo.getIntValue("payment_times") + order.getIntValue("payment_times"));
BigDecimal total_amount = clientCustomerInfo.getBigDecimal("total_amount");
if (total_amount != null) {
clientCustomerInfo.put("total_amount", clientCustomerInfo.getBigDecimal("total_amount").add(order.getBigDecimal("total_amount")));
} else {
clientCustomerInfo.put("payment_times", 1);
clientCustomerInfo.put("total_amount", order.getBigDecimal("total_amount"));
}
if (userInfo != null) {
clientCustomerInfo.put("headimg", userInfo.getString("headimg"));
clientCustomerInfo.put("nick_name", userInfo.getString("nickname"));
}
clientCustomerInfo.put("channel", order.getString("channel"));
clientCustomerInfo.put("tag", "不活跃用户");
clientCustomerInfo.put("update_time", now);
clientCustomerInfo.put("last_payment_time", order.getDate("confirm_time"));
clientCustomersMapper.update(clientCustomerInfo);
}
}
generateTag(client_id);
}
private void generateTag(int client_id) {
JSONObject params = new JSONObject();
DateTime dt = new DateTime();
dt = dt.minusMonths(5);
params.put("confirm_time", dt.toDate());
params.put("client_id", client_id);
List<JSONObject> orders = orderMapper.listAnalysisClientCustomer(params);
for (JSONObject order : orders) {
int payment_times = order.getInteger("payment_times");
JSONObject updateRecord = new JSONObject();
updateRecord.put("client_id", order.getIntValue("client_id"));
updateRecord.put("customer_id", order.getString("customer_id"));
if (payment_times < 2) {
updateRecord.put("tag", "不活跃用户");
clientCustomersMapper.updateAfterPaymentFinish(clientCustomerInfo);
}
if (payment_times >= 2 && payment_times < 10) {
updateRecord.put("tag", "潜力用户");
}
if (payment_times >= 10) {
updateRecord.put("tag", "忠实用户");
} catch (Exception e) {
logger.debug("Reduce Customer Impression Error Redis Value =" + redisValue, e);
}
clientCustomersMapper.update(updateRecord);
}
}
@Override

@ -0,0 +1,28 @@
package au.com.royalpay.payment.manage.apps.events.listeners;
import au.com.royalpay.payment.core.events.AfterPaymentFinishEvent;
import com.alibaba.fastjson.JSONObject;
import org.springframework.context.ApplicationListener;
import org.springframework.data.redis.core.BoundListOperations;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
/**
* Created by wangning on 17/01/2018.
*/
@Service
public class AfterPaymentFinishListener implements ApplicationListener<AfterPaymentFinishEvent> {
@Resource
private StringRedisTemplate stringRedisTemplate;
@Override
public void onApplicationEvent(AfterPaymentFinishEvent event) {
JSONObject order = event.getFinishedEvent().getOrder();
BoundListOperations<String, String> ops = stringRedisTemplate.boundListOps("customer_impression");
ops.rightPush(order.toJSONString());
}
}

@ -0,0 +1,4 @@
/**
* Created by wangning on 17/01/2018.
*/
package au.com.royalpay.payment.manage.apps.events;

@ -41,10 +41,4 @@ public class CustomerImpressionController {
@ModelAttribute(CommonConsts.RETAIL_DEVICE) JSONObject app) {
customerImpressionService.modifyNameRemark(app.getIntValue("client_id"), customer_id, customerInfo.getString("name_remark"));
}
@RequestMapping(value = "/gengrate", method = RequestMethod.PUT)
@ResponseBody
public void generate(@ModelAttribute(CommonConsts.RETAIL_DEVICE) JSONObject app) {
customerImpressionService.generate(app.getIntValue("client_id"));
}
}

@ -26,6 +26,8 @@ public interface ClientCustomersMapper {
@AutoSql(type = SqlType.UPDATE)
public void update(JSONObject obj);
public void updateAfterPaymentFinish(JSONObject obj);
PageList<JSONObject> listCustomerInfo(JSONObject params, PageBounds pageBounds);
}

@ -31,7 +31,7 @@ public class CustomerImpressionTask {
private ThreadPoolExecutor generatePool = new ThreadPoolExecutor(10, 30, 5, TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>());
@Scheduled(cron = "0 0 3 * * ?")
public void generate() {
public void generateTags() {
List<JSONObject> clients = clientMapper.listValidClient();
List<List<JSONObject>> splitList = new ArrayList<>();
for (int i = 0; i < clients.size(); i+=200) {
@ -45,9 +45,14 @@ public class CustomerImpressionTask {
for (List<JSONObject> splitClients : splitList) {
Runnable task = () -> splitClients.forEach((p)->{
System.out.println("当前执行到"+p.getIntValue("client_id"));
customerImpressionService.generate(p.getIntValue("client_id"));
customerImpressionService.generateTag(p.getIntValue("client_id"));
});
generatePool.execute(task);
}
}
@Scheduled(cron = "0/1 * * * * ?")
public void generateInfo() {
customerImpressionService.generateInfo();
}
}

@ -31,4 +31,16 @@
and customer_id = #{customer_id}
</select>
<update id="updateAfterPaymentFinish">
update sys_clients_customers
set total_amount = total_amount + #{total_amount},
payment_times = payment_times + #{payment_times},
last_payment_time = #{last_payment_time},
nick_name = #{nick_name},
headimg = #{headimg}
where client_id= #{client_id}
and customer_id = #{customer_id}
</update>
</mapper>

@ -11,58 +11,47 @@ import javax.annotation.Resource;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.core.BoundListOperations;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.test.context.ActiveProfiles;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.util.CollectionUtils;
import com.alibaba.fastjson.JSONObject;
import au.com.royalpay.payment.manage.apps.core.CustomerImpressionService;
import au.com.royalpay.payment.manage.mappers.payment.OrderMapper;
import au.com.royalpay.payment.manage.mappers.system.ClientMapper;
import au.com.royalpay.payment.manage.mappers.system.CustomerRelationAlipayMapper;
/**
* Created by wangning on 05/01/2018.
*/
@SpringBootTest
@ActiveProfiles({"production","alipay","wechat","jd","bestpay"})
@ActiveProfiles({ "local", "alipay", "wechat", "jd", "bestpay" })
@RunWith(SpringRunner.class)
public class CustomerImpressionImplTest {
@Resource
private CustomerImpressionService customerImpression;
@Resource
private ClientMapper clientMapper;
private ThreadPoolExecutor generatePool = new ThreadPoolExecutor(10, 30, 5, TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>());
private OrderMapper orderMapper;
@Test
public void generate() throws Exception {
customerImpression.generate(9);
}
@Resource
private StringRedisTemplate stringRedisTemplate;
@Test
public void generateAll(){
List<JSONObject> clients = clientMapper.listValidClient();
List<List<JSONObject>> splitList = new ArrayList<>();
for (int i = 0; i < clients.size(); i+=200) {
if(i+200>clients.size()){
splitList.add(clients.subList(i,clients.size()));
}else {
splitList.add(clients.subList(i,i+200));
public void redisQueue() {
BoundListOperations<String, String> ops = stringRedisTemplate.boundListOps("customer_impression");
JSONObject order = orderMapper.find("00009201711300930013961422");
for (int i = 0; i < 10000; i++) {
synchronized (lock) {
ops.rightPush(order.toJSONString());
}
}
for (List<JSONObject> splitClients : splitList) {
Runnable task = () -> splitClients.forEach((p)->{
System.out.println("当前执行到"+p.getIntValue("client_id"));
customerImpression.generate(p.getIntValue("client_id"));
});
generatePool.execute(task);
}
generatePool.shutdown();
try {
generatePool.awaitTermination(5, TimeUnit.HOURS);
} catch (InterruptedException e) {
e.printStackTrace();
System.out.println("asdsada");
System.out.println("asdsada");
System.out.println("asdsada");
System.out.println("asdsada");
System.out.println("asdsada");
System.out.println("asdsada");
}
}
}
Loading…
Cancel
Save