|
@@ -41,6 +41,7 @@ import com.iamberry.wechat.tools.ObjectExcelView;
|
|
|
import com.iamberry.wechat.tools.ResponseJson;
|
|
|
import com.iamberry.wechat.tools.payUtil.DatetimeUtil;
|
|
|
import com.iamberry.wechat.tools.payUtil.StringUtil;
|
|
|
+import org.apache.commons.collections.list.SynchronizedList;
|
|
|
import org.apache.commons.lang.StringUtils;
|
|
|
import org.apache.shiro.SecurityUtils;
|
|
|
import org.apache.shiro.authz.annotation.Logical;
|
|
@@ -61,6 +62,12 @@ import javax.servlet.http.HttpServletResponse;
|
|
|
import java.io.*;
|
|
|
import java.text.SimpleDateFormat;
|
|
|
import java.util.*;
|
|
|
+import java.util.concurrent.Callable;
|
|
|
+import java.util.concurrent.CyclicBarrier;
|
|
|
+import java.util.concurrent.ExecutorService;
|
|
|
+import java.util.concurrent.locks.Condition;
|
|
|
+import java.util.concurrent.locks.Lock;
|
|
|
+import java.util.concurrent.locks.ReentrantLock;
|
|
|
|
|
|
/**
|
|
|
* 订单 handler
|
|
@@ -111,6 +118,11 @@ public class AdminOrderController {
|
|
|
private DealerProductService dealerProductService;
|
|
|
|
|
|
/**
|
|
|
+ * 缓存物流公司名称和变的规则
|
|
|
+ */
|
|
|
+ private static final Map<String, String> LOGISTICE_CACHE = Collections.<String, String>synchronizedMap(new WeakHashMap<String, String>(30));
|
|
|
+
|
|
|
+ /**
|
|
|
* 进入更换滤芯页面
|
|
|
*
|
|
|
* @return
|
|
@@ -752,8 +764,8 @@ public class AdminOrderController {
|
|
|
public ResponseJson valDownloadOrderExcel(HttpServletRequest request,SalesOrder so) throws Exception {
|
|
|
ResponseJson rj = ResponseJson.getFAILURE();
|
|
|
Integer num = salesOrderService.listSalesOrderAndItemNum(so);
|
|
|
- if(num > 5000){
|
|
|
- rj.setResultMsg("下载订单超过5000条,请精确查询条件");
|
|
|
+ if(num > 20000){
|
|
|
+ rj.setResultMsg("下载订单超过20000条,请精确查询条件");
|
|
|
return rj;
|
|
|
}
|
|
|
return ResponseJson.getSUCCESS();
|
|
@@ -768,19 +780,15 @@ public class AdminOrderController {
|
|
|
@RequestMapping("/download_order_excel")
|
|
|
@RequiresPermissions("salesOrder:download:Logistics")
|
|
|
public ModelAndView downloadOrderExcel(HttpServletRequest request,SalesOrder so) throws Exception {
|
|
|
-
|
|
|
+ // 查询数据
|
|
|
List<SalesOrder> temporarySalesOrderList = salesOrderService.listSalesOrderAndItem(so);
|
|
|
-
|
|
|
- if(temporarySalesOrderList.size() > 5000){
|
|
|
- return new ModelAndView().addObject("下载出错");
|
|
|
- }
|
|
|
-
|
|
|
+ long ctrStart = System.currentTimeMillis();
|
|
|
// 准备model
|
|
|
- Map<String, Object> model = new HashMap<String, Object>(5);
|
|
|
+ Map<String, Object> model = new HashMap<String, Object>(3);
|
|
|
model.put("fileName", "订单列表");
|
|
|
|
|
|
// 标题
|
|
|
- List<String> titles = new ArrayList<String>();
|
|
|
+ List<String> titles = new ArrayList<String>(22);
|
|
|
titles.add("订单创建日期");
|
|
|
titles.add("订单编号");
|
|
|
titles.add("交易号");
|
|
@@ -803,78 +811,57 @@ public class AdminOrderController {
|
|
|
titles.add("邮费成本");
|
|
|
titles.add("发货仓库");
|
|
|
model.put("titles", titles);
|
|
|
- List<List<Object>> countexts = new ArrayList<List<Object>>();
|
|
|
+ List<List<Object>> countexts = Collections.synchronizedList(new ArrayList<>(temporarySalesOrderList.size()));
|
|
|
if(temporarySalesOrderList.size() > 0){
|
|
|
- for (SalesOrder salesOrder : temporarySalesOrderList) {
|
|
|
- List<Object> row = new ArrayList<Object>();
|
|
|
- SimpleDateFormat formatter = new SimpleDateFormat("yyyy年MM月dd日");
|
|
|
- row.add(salesOrder.getSalesCreateTime() == null ? null:formatter.format(salesOrder.getSalesCreateTime()));
|
|
|
- row.add(salesOrder.getSalesOrderId());
|
|
|
- row.add(salesOrder.getSalesDealCode());
|
|
|
- if(salesOrder.getSalesCustomerId() == null){
|
|
|
- row.add("正常订单");
|
|
|
- }else{
|
|
|
- String typeName = salesOrder.getProcTypeName() == null ? "":salesOrder.getProcTypeName();
|
|
|
- row.add("售后订单("+ typeName +")");
|
|
|
- }
|
|
|
- row.add(salesOrder.getSalesAddressName());
|
|
|
- row.add(salesOrder.getSalesAddressTel());
|
|
|
- //分割省市
|
|
|
- if(salesOrder.getSalesAddressInfo() == null){
|
|
|
- row.add(null);
|
|
|
- row.add(null);
|
|
|
- }else{
|
|
|
- String[] strarray=salesOrder.getSalesAddressInfo().split(" ");
|
|
|
- row.add(strarray[0]);
|
|
|
- row.add(strarray[1]);
|
|
|
+ // 同步两个线程
|
|
|
+ Lock lock = new ReentrantLock();
|
|
|
+ Condition condition = lock.newCondition();
|
|
|
+ // 并发的线程
|
|
|
+ int threadSize = temporarySalesOrderList.size() >= 5000 ? 5 : 1;
|
|
|
+ // 每个线程处理的数量
|
|
|
+ int size = temporarySalesOrderList.size()/threadSize;
|
|
|
+ final CyclicBarrier cyclicBarrier = new CyclicBarrier(threadSize, new Runnable() {
|
|
|
+ @Override
|
|
|
+ public void run() {
|
|
|
+ // 尝试获取Lock
|
|
|
+ lock.lock();
|
|
|
+ // 通知一个正在等待队列的线程,此处为下载线程
|
|
|
+ condition.signal();
|
|
|
+ // 释放锁
|
|
|
+ lock.unlock();
|
|
|
}
|
|
|
- row.add(salesOrder.getSalesAddressInfo());
|
|
|
- if(salesOrder.getSalesPostFirm() != null){
|
|
|
- String frim = replace(salesOrder.getSalesPostFirm());
|
|
|
- row.add(frim);
|
|
|
- }else{
|
|
|
- row.add(null);
|
|
|
- }
|
|
|
- row.add(salesOrder.getSalesPostNum());
|
|
|
- row.add(salesOrder.getItemProductName() == null ? null:salesOrder.getItemProductName()+(salesOrder.getItemProductColor() == null ? null:"-"+salesOrder.getItemProductColor()));
|
|
|
- row.add(salesOrder.getItemNum());
|
|
|
- row.add(salesOrder.getItemReturnNum());
|
|
|
- row.add(salesOrder.getCompanyName());
|
|
|
- row.add(salesOrder.getStoreName());
|
|
|
- row.add(salesOrder.getSalesDeliverTime() == null ? null:formatter.format(salesOrder.getSalesDeliverTime()));
|
|
|
- if(salesOrder.getSalesDistributionTime() == null){
|
|
|
- if(salesOrder.getSalesSendTime() != null){
|
|
|
- row.add(formatter.format(salesOrder.getSalesSendTime()));
|
|
|
- }else{
|
|
|
- row.add(null);
|
|
|
- }
|
|
|
- }else{
|
|
|
- row.add(formatter.format(salesOrder.getSalesDistributionTime()));
|
|
|
- }
|
|
|
- row.add(salesOrder.getProcMethodName());
|
|
|
- row.add(salesOrder.getSalesPostageCost() == null ? 0 : salesOrder.getSalesPostageCost()/100);
|
|
|
- String temp = "京东仓";
|
|
|
- if (salesOrder.getSalesSendType() != 3) {
|
|
|
- if (salesOrder.getSalesWarehouseId() == null) {
|
|
|
- temp = null;
|
|
|
- } else {
|
|
|
- if (salesOrder.getSalesWarehouseId() == 1) {
|
|
|
- temp = "正常仓库";
|
|
|
- } else {
|
|
|
- temp = "维修仓库";
|
|
|
- }
|
|
|
- }
|
|
|
+ });
|
|
|
+
|
|
|
+ // 分组提交数据
|
|
|
+ for (int i = 0; i < threadSize; i++) {
|
|
|
+ int start = size * i;
|
|
|
+ int stop = 0;
|
|
|
+ if (i == (threadSize-1)) {
|
|
|
+ stop = temporarySalesOrderList.size()-1;
|
|
|
+ } else {
|
|
|
+ stop = (i+1) * size - 1;
|
|
|
}
|
|
|
- row.add(temp);
|
|
|
- countexts.add(row);
|
|
|
+ // 此处会有一个问题:如果当线程池的数量都被占用,那么此处将会一直无法完成,如果线程池的数量小于本次提交的,则会导致此操作永远无法完成,所以需要将线程池大小设置为>=6,即其他线程完成后,此功能可以使用
|
|
|
+ AdminSalesOrderController.THREAD_POOL.execute(new DownOrderRunnable(cyclicBarrier, start, stop, temporarySalesOrderList, this, countexts));
|
|
|
}
|
|
|
+ /**
|
|
|
+ * 等待所有数据完成
|
|
|
+ */
|
|
|
+ // 获取锁对象 lock
|
|
|
+ lock.lock();
|
|
|
+ // 将当前下载线程加入等待队列,并释放锁,为回调线程提供锁
|
|
|
+ condition.await();
|
|
|
+ // 释放锁
|
|
|
+ lock.unlock();
|
|
|
}
|
|
|
+
|
|
|
+ System.out.println("组装数据共花费:" + (System.currentTimeMillis()-ctrStart));
|
|
|
+
|
|
|
model.put("varList", countexts);
|
|
|
ObjectExcelView erv = new ObjectExcelView();
|
|
|
return new ModelAndView(erv,model);
|
|
|
}
|
|
|
|
|
|
-
|
|
|
/**
|
|
|
* 保存交易号
|
|
|
* @param filePath
|
|
@@ -922,13 +909,17 @@ public class AdminOrderController {
|
|
|
|
|
|
/**物流名称替换**/
|
|
|
public String replace(String code) {
|
|
|
- String name = "";
|
|
|
if(code == null || "".equals(code)){
|
|
|
return "";
|
|
|
}
|
|
|
+ String firm = LOGISTICE_CACHE.get("LOGISTICS_" + code);
|
|
|
+ if (firm != null) {
|
|
|
+ return firm;
|
|
|
+ }
|
|
|
List<LogisticsInfo> logisticsInfoList = logisticsInfoService.getLogisticsInfoList(new LogisticsInfo());
|
|
|
for (LogisticsInfo logistics:logisticsInfoList) {
|
|
|
if(code .equalsIgnoreCase(logistics.getLogisticsRstCode())){
|
|
|
+ LOGISTICE_CACHE.put("LOGISTICS_" + code, logistics.getLogisticsName());
|
|
|
return logistics.getLogisticsName();
|
|
|
}
|
|
|
}
|