diff --git a/src/db/modify.sql b/src/db/modify.sql index b76c689d8..4bbd1d4c2 100644 --- a/src/db/modify.sql +++ b/src/db/modify.sql @@ -206,4 +206,6 @@ VALUES ( 'android_update' , 'true' - ); \ No newline at end of file + ); + +ALTER table sys_clients_customers drop column update_time; \ No newline at end of file diff --git a/src/main/java/au/com/royalpay/payment/manage/apps/core/CustomerImpressionService.java b/src/main/java/au/com/royalpay/payment/manage/apps/core/CustomerImpressionService.java index 2f15ef700..36e3c92f5 100644 --- a/src/main/java/au/com/royalpay/payment/manage/apps/core/CustomerImpressionService.java +++ b/src/main/java/au/com/royalpay/payment/manage/apps/core/CustomerImpressionService.java @@ -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); } diff --git a/src/main/java/au/com/royalpay/payment/manage/apps/core/impls/CustomerImpressionServiceImpl.java b/src/main/java/au/com/royalpay/payment/manage/apps/core/impls/CustomerImpressionServiceImpl.java index a7dcc4f49..47a479195 100644 --- a/src/main/java/au/com/royalpay/payment/manage/apps/core/impls/CustomerImpressionServiceImpl.java +++ b/src/main/java/au/com/royalpay/payment/manage/apps/core/impls/CustomerImpressionServiceImpl.java @@ -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,66 +96,72 @@ 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 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 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) { - JSONObject params = new JSONObject(); - params.put("client_id", client_id); - params.put("include_success_status", 3); - PageList 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 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); - } - - private void generateTag(int client_id) { + public void generateTag(int client_id) { JSONObject params = new JSONObject(); DateTime dt = new DateTime(); dt = dt.minusMonths(5); @@ -176,6 +187,53 @@ public class CustomerImpressionServiceImpl implements CustomerImpressionService } + @Override + public void generateInfo() { + BoundListOperations 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; + } + JSONObject userInfo = customerMapper.findCustomerByOpenId(order.getString("customer_id")); + if (userInfo == null) { + userInfo = customerRelationAlipayMapper.findCustomerByUserId(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")); + 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", 1); + client_customer.put("total_amount", order.getBigDecimal("total_amount")); + client_customer.put("last_payment_time", order.getDate("confirm_time")); + clientCustomersMapper.insert(client_customer); + } 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("last_payment_time", order.getDate("confirm_time")); + clientCustomersMapper.updateAfterPaymentFinish(clientCustomerInfo); + } + } catch (Exception e) { + logger.debug("Reduce Customer Impression Error Redis Value =" + redisValue, e); + } + } + } + @Override public void modifyNameRemark(int client_id, String customer_id, String name_remark) { JSONObject clientCustomerInfo = clientCustomersMapper.getClientCustomer(client_id, customer_id); diff --git a/src/main/java/au/com/royalpay/payment/manage/apps/events/listeners/AfterPaymentFinishListener.java b/src/main/java/au/com/royalpay/payment/manage/apps/events/listeners/AfterPaymentFinishListener.java new file mode 100644 index 000000000..30f21ef73 --- /dev/null +++ b/src/main/java/au/com/royalpay/payment/manage/apps/events/listeners/AfterPaymentFinishListener.java @@ -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 { + @Resource + private StringRedisTemplate stringRedisTemplate; + + @Override + public void onApplicationEvent(AfterPaymentFinishEvent event) { + JSONObject order = event.getFinishedEvent().getOrder(); + BoundListOperations ops = stringRedisTemplate.boundListOps("customer_impression"); + ops.rightPush(order.toJSONString()); + } +} \ No newline at end of file diff --git a/src/main/java/au/com/royalpay/payment/manage/apps/events/package-info.java b/src/main/java/au/com/royalpay/payment/manage/apps/events/package-info.java new file mode 100644 index 000000000..99acb1d8e --- /dev/null +++ b/src/main/java/au/com/royalpay/payment/manage/apps/events/package-info.java @@ -0,0 +1,4 @@ +/** + * Created by wangning on 17/01/2018. + */ +package au.com.royalpay.payment.manage.apps.events; \ No newline at end of file diff --git a/src/main/java/au/com/royalpay/payment/manage/apps/web/CustomerImpressionController.java b/src/main/java/au/com/royalpay/payment/manage/apps/web/CustomerImpressionController.java index d19dbe8b6..24d062285 100644 --- a/src/main/java/au/com/royalpay/payment/manage/apps/web/CustomerImpressionController.java +++ b/src/main/java/au/com/royalpay/payment/manage/apps/web/CustomerImpressionController.java @@ -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")); - } } diff --git a/src/main/java/au/com/royalpay/payment/manage/mappers/client/ClientCustomersMapper.java b/src/main/java/au/com/royalpay/payment/manage/mappers/client/ClientCustomersMapper.java index 52257fdfe..b15607431 100644 --- a/src/main/java/au/com/royalpay/payment/manage/mappers/client/ClientCustomersMapper.java +++ b/src/main/java/au/com/royalpay/payment/manage/mappers/client/ClientCustomersMapper.java @@ -26,6 +26,8 @@ public interface ClientCustomersMapper { @AutoSql(type = SqlType.UPDATE) public void update(JSONObject obj); + public void updateAfterPaymentFinish(JSONObject obj); + PageList listCustomerInfo(JSONObject params, PageBounds pageBounds); } diff --git a/src/main/java/au/com/royalpay/payment/manage/task/CustomerImpressionTask.java b/src/main/java/au/com/royalpay/payment/manage/task/CustomerImpressionTask.java index d54ccbf23..ec3dd6246 100644 --- a/src/main/java/au/com/royalpay/payment/manage/task/CustomerImpressionTask.java +++ b/src/main/java/au/com/royalpay/payment/manage/task/CustomerImpressionTask.java @@ -31,7 +31,7 @@ public class CustomerImpressionTask { private ThreadPoolExecutor generatePool = new ThreadPoolExecutor(10, 30, 5, TimeUnit.SECONDS, new LinkedBlockingQueue()); @Scheduled(cron = "0 0 3 * * ?") - public void generate() { + public void generateTags() { List clients = clientMapper.listValidClient(); List> splitList = new ArrayList<>(); for (int i = 0; i < clients.size(); i+=200) { @@ -45,9 +45,14 @@ public class CustomerImpressionTask { for (List 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(); + } } diff --git a/src/main/resources/au/com/royalpay/payment/manage/mappers/client/ClientCustomersMapper.xml b/src/main/resources/au/com/royalpay/payment/manage/mappers/client/ClientCustomersMapper.xml index 780110af8..ae1d2d552 100644 --- a/src/main/resources/au/com/royalpay/payment/manage/mappers/client/ClientCustomersMapper.xml +++ b/src/main/resources/au/com/royalpay/payment/manage/mappers/client/ClientCustomersMapper.xml @@ -31,4 +31,16 @@ and customer_id = #{customer_id} + + + 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} + + \ No newline at end of file diff --git a/src/test/java/au/com/royalpay/payment/manage/apps/core/impls/CustomerImpressionImplTest.java b/src/test/java/au/com/royalpay/payment/manage/apps/core/impls/CustomerImpressionImplTest.java index df64a02c2..d62d26edf 100644 --- a/src/test/java/au/com/royalpay/payment/manage/apps/core/impls/CustomerImpressionImplTest.java +++ b/src/test/java/au/com/royalpay/payment/manage/apps/core/impls/CustomerImpressionImplTest.java @@ -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()); + private OrderMapper orderMapper; - @Test - public void generate() throws Exception { - customerImpression.generate(9); - } + @Resource + private StringRedisTemplate stringRedisTemplate; @Test - public void generateAll(){ - List clients = clientMapper.listValidClient(); - List> 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 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 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"); } - } \ No newline at end of file