Browse Source

新增仓库打印订单的功能

xian 6 years ago
parent
commit
4a5be387b4

+ 296 - 0
watero-rst-core/src/main/java/com.iamberry.rst.core/order/EOrderRequestData.java

@@ -0,0 +1,296 @@
+package com.iamberry.rst.core.order;
+
+import java.io.Serializable;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @author 献
+ * @company 深圳爱贝源科技有限公司
+ * @date 2018/5/25 18:10
+ * @tel 18271840547
+ * @website www.iamberry.com
+ */
+public class EOrderRequestData implements Serializable {
+
+    // 用户自定义回调信息
+    private String CallBack;
+    // 会员标识
+    private String MemberID;
+    // 电子面单客户账号
+    private String CustomerName;
+    // 电子面单密码
+    private String CustomerPwd;
+    // 收件网点标识
+    private String SendSite;
+    // 快递公司编码
+    private String ShipperCode;
+    // 快递单号
+    private String LogisticCode;
+    // 订单编号
+    private String OrderCode;
+    // 第三方订单编号
+    private String ThrOrderCode;
+    // 月结编码
+    private String MonthCode;
+    // 邮费支付方式:1-现付,2-到付,3-月结,4-第三方支付
+    private Integer PayType;
+    // 快递类型:1-标准快件
+    private String ExpType;
+    // 是否通知快递员上门揽件:0-通知;1-不通知;不填则默认为1
+    private Integer IsNotice;
+    // 寄件费(运费)
+    private Double Cost;
+    // 其他费用
+    private Double OtherCost;
+    // 收件人信息
+    private Map<String, Object> Receiver;
+    // 发件人信息
+    private Map<String, Object> Sender;
+    // 上门取货开始时间
+    private String StartDate;
+    // 上门取货结束时间
+    private String EndDate;
+    // 物品总重(KG)
+    private Double Weight;
+    // 件数
+    private Integer Quantity;
+    // 物品总体积m3
+    private Double Volume;
+    // 备注
+    private String Remark;
+    // 增值服务
+    private Map<String, Object> AddService;
+    // 寄件产品明细
+    private List<Map<String, Object>> Commodity;
+    // 返回电子面单模板:0-不需要;1-需要
+    private Integer IsReturnPrintTemplate;
+    // 是否订阅短信:0-不需要;1-需要
+    private Integer IsSendMessage;
+    // 模板规格(默认的模板无需传值,非默认模板传对应模板尺寸)
+    private String TemplateSize;
+
+    public String getCallBack() {
+        return CallBack;
+    }
+
+    public void setCallBack(String callBack) {
+        CallBack = callBack;
+    }
+
+    public String getMemberID() {
+        return MemberID;
+    }
+
+    public void setMemberID(String memberID) {
+        MemberID = memberID;
+    }
+
+    public String getCustomerName() {
+        return CustomerName;
+    }
+
+    public void setCustomerName(String customerName) {
+        CustomerName = customerName;
+    }
+
+    public String getCustomerPwd() {
+        return CustomerPwd;
+    }
+
+    public void setCustomerPwd(String customerPwd) {
+        CustomerPwd = customerPwd;
+    }
+
+    public String getSendSite() {
+        return SendSite;
+    }
+
+    public void setSendSite(String sendSite) {
+        SendSite = sendSite;
+    }
+
+    public String getShipperCode() {
+        return ShipperCode;
+    }
+
+    public void setShipperCode(String shipperCode) {
+        ShipperCode = shipperCode;
+    }
+
+    public String getLogisticCode() {
+        return LogisticCode;
+    }
+
+    public void setLogisticCode(String logisticCode) {
+        LogisticCode = logisticCode;
+    }
+
+    public String getOrderCode() {
+        return OrderCode;
+    }
+
+    public void setOrderCode(String orderCode) {
+        OrderCode = orderCode;
+    }
+
+    public String getThrOrderCode() {
+        return ThrOrderCode;
+    }
+
+    public void setThrOrderCode(String thrOrderCode) {
+        ThrOrderCode = thrOrderCode;
+    }
+
+    public String getMonthCode() {
+        return MonthCode;
+    }
+
+    public void setMonthCode(String monthCode) {
+        MonthCode = monthCode;
+    }
+
+    public Integer getPayType() {
+        return PayType;
+    }
+
+    public void setPayType(Integer payType) {
+        PayType = payType;
+    }
+
+    public String getExpType() {
+        return ExpType;
+    }
+
+    public void setExpType(String expType) {
+        ExpType = expType;
+    }
+
+    public Integer getIsNotice() {
+        return IsNotice;
+    }
+
+    public void setIsNotice(Integer isNotice) {
+        IsNotice = isNotice;
+    }
+
+    public Double getCost() {
+        return Cost;
+    }
+
+    public void setCost(Double cost) {
+        Cost = cost;
+    }
+
+    public Double getOtherCost() {
+        return OtherCost;
+    }
+
+    public void setOtherCost(Double otherCost) {
+        OtherCost = otherCost;
+    }
+
+    public Map<String, Object> getReceiver() {
+        return Receiver;
+    }
+
+    public void setReceiver(Map<String, Object> receiver) {
+        Receiver = receiver;
+    }
+
+    public Map<String, Object> getSender() {
+        return Sender;
+    }
+
+    public void setSender(Map<String, Object> sender) {
+        Sender = sender;
+    }
+
+    public String getStartDate() {
+        return StartDate;
+    }
+
+    public void setStartDate(String startDate) {
+        StartDate = startDate;
+    }
+
+    public String getEndDate() {
+        return EndDate;
+    }
+
+    public void setEndDate(String endDate) {
+        EndDate = endDate;
+    }
+
+    public Double getWeight() {
+        return Weight;
+    }
+
+    public void setWeight(Double weight) {
+        Weight = weight;
+    }
+
+    public Integer getQuantity() {
+        return Quantity;
+    }
+
+    public void setQuantity(Integer quantity) {
+        Quantity = quantity;
+    }
+
+    public Double getVolume() {
+        return Volume;
+    }
+
+    public void setVolume(Double volume) {
+        Volume = volume;
+    }
+
+    public String getRemark() {
+        return Remark;
+    }
+
+    public void setRemark(String remark) {
+        Remark = remark;
+    }
+
+    public Map<String, Object> getAddService() {
+        return AddService;
+    }
+
+    public void setAddService(Map<String, Object> addService) {
+        AddService = addService;
+    }
+
+    public Integer getIsReturnPrintTemplate() {
+        return IsReturnPrintTemplate;
+    }
+
+    public void setIsReturnPrintTemplate(Integer isReturnPrintTemplate) {
+        IsReturnPrintTemplate = isReturnPrintTemplate;
+    }
+
+    public Integer getIsSendMessage() {
+        return IsSendMessage;
+    }
+
+    public void setIsSendMessage(Integer isSendMessage) {
+        IsSendMessage = isSendMessage;
+    }
+
+    public String getTemplateSize() {
+        return TemplateSize;
+    }
+
+    public void setTemplateSize(String templateSize) {
+        TemplateSize = templateSize;
+    }
+
+    public List<Map<String, Object>> getCommodity() {
+        return Commodity;
+    }
+
+    public void setCommodity(List<Map<String, Object>> commodity) {
+        Commodity = commodity;
+    }
+}

+ 182 - 7
watero-rst-web/src/main/java/com/iamberry/rst/controllers/order/AwaitSendController.java

@@ -1,13 +1,30 @@
 package com.iamberry.rst.controllers.order;
 
+import com.alibaba.fastjson.JSONObject;
 import com.iamberry.rst.core.cm.SalesOrder;
+import com.iamberry.rst.core.cm.SalesOrderItem;
+import com.iamberry.rst.core.order.EOrderRequestData;
+import com.iamberry.rst.core.page.PagedResult;
+import com.iamberry.rst.core.tools.LogisticsInfo;
+import com.iamberry.rst.faces.cm.SalesOrderService;
+import com.iamberry.rst.utils.OrderUtils;
+import com.iamberry.rst.utils.StitchAttrUtil;
 import com.iamberry.wechat.tools.ResponseJson;
+import org.apache.poi.hssf.record.cf.IconMultiStateFormatting;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Controller;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.ResponseBody;
 import org.springframework.web.servlet.ModelAndView;
 
+import javax.servlet.http.HttpServletRequest;
+import java.io.*;
+import java.util.*;
+
 /**
  * @author 献
  * @company 深圳爱贝源科技有限公司
@@ -19,27 +36,185 @@ import org.springframework.web.servlet.ModelAndView;
 @RequestMapping("/admin/await_send")
 public class AwaitSendController {
 
+    @Autowired
+    private SalesOrderService salesOrderService;
+
+    private static final Logger LOGGER = LoggerFactory.getLogger(AwaitSendController.class);
+
     // 仓库查询待发货订单
     @RequestMapping("/listAwaitSendOrder")
-    public ModelAndView listAwaitSendOrder(SalesOrder salesOrder) {
+    @RequiresPermissions("order:listAwaitSendOrder")
+    public ModelAndView listAwaitSendOrder(HttpServletRequest request, SalesOrder salesOrder,
+                                           @RequestParam(value = "pageSize", defaultValue = "10", required = false) Integer pageSize,
+                                           @RequestParam(value = "pageNO", defaultValue = "1", required = false) Integer pageNO,
+                                           @RequestParam(value = "totalNum", defaultValue = "0", required = false) Integer totalNum) {
+        // 分页获取订单信息
+        PagedResult<SalesOrder> pagedResult = salesOrderService.listSalesOrderPage(pageNO, pageSize, salesOrder,totalNum == 0);
+        if (totalNum != 0) {
+            pagedResult.setTotal(totalNum);
+        }
+        // 查询订单项
+        if (pagedResult != null && pagedResult.getDataList() != null && !pagedResult.getDataList().isEmpty()) {
+            for (SalesOrder temp : pagedResult.getDataList()) {
+                SalesOrderItem item = new SalesOrderItem();
+                item.setItemOrderId(temp.getSalesId());
+                temp.setSalesOrderItemList(salesOrderService.listSalesOrderItem(item));
+            }
+        }
 
-        return null;
+        salesOrder.setSalesOrderItemList(null);
+        ModelAndView mv = new ModelAndView("order/salesOrder/list_wait_send_order");
+        StitchAttrUtil.getSa()
+                .addDatePro("yyyy-MM-dd HH:mm:ss","startDate","endDate")
+                .setModelAndView(salesOrder, mv, "/admin/await_send/listAwaitSendOrder", pagedResult);
+        mv.addObject("req",salesOrder);
+        return mv;
     }
 
     // 打单发货页面
     @RequestMapping("/printOrderUI")
-    public ModelAndView printOrderUI(@RequestParam("orderId") String[] orders) {
-        return null;
+    @RequiresPermissions("order:listAwaitSendOrder")
+    public ModelAndView printOrderUI(@RequestParam(value = "orderId", required = false) String[] orders) {
+        SalesOrder salesOrder = new SalesOrder();
+        if (orders == null) {
+            salesOrder.setSalesShippingStatus(1);
+        } else {
+            salesOrder.setSalesIds(orders);
+        }
+        PagedResult<SalesOrder> pagedResult = salesOrderService.listSalesOrderPage(1, 1000, salesOrder, false);
+        // 查询订单项
+        if (pagedResult != null && pagedResult.getDataList() != null && !pagedResult.getDataList().isEmpty()) {
+            for (SalesOrder temp : pagedResult.getDataList()) {
+                SalesOrderItem item = new SalesOrderItem();
+                item.setItemOrderId(temp.getSalesId());
+                temp.setSalesOrderItemList(salesOrderService.listSalesOrderItem(item));
+            }
+        }
+        return new ModelAndView("order/salesOrder/print_order").addObject("page", pagedResult).addObject("posts", salesOrderService.getLogisticsInfo(new LogisticsInfo()));
     }
 
     // 打单发货
     @ResponseBody
     @RequestMapping("/printOrder")
-    public ResponseJson printOrder(@RequestParam("post") String postType,
-                                   @RequestParam("orderId") String orderId) {
+    @RequiresPermissions("order:listAwaitSendOrder")
+    public ResponseJson printOrder(@RequestParam("post") String post,
+                                   @RequestParam("orderId") String orderId,
+                                   @RequestParam("salesId") Integer salesId,
+                                   HttpServletRequest request) {
+        SalesOrder salesOrderInfo = salesOrderService.getSalesOrderById(salesId);
+
+        /*
+         * 组装数据
+         */
+        EOrderRequestData eOrderRequestData = new EOrderRequestData();
+        eOrderRequestData.setShipperCode(post);
+        eOrderRequestData.setOrderCode(orderId);
+        eOrderRequestData.setPayType(3);
+        eOrderRequestData.setExpType("1");
+        eOrderRequestData.setCost(0.00);
+        eOrderRequestData.setOtherCost(0.0);
+        if (post.equalsIgnoreCase("DBL")) {
+            eOrderRequestData.setCustomerName("testdbl");
+        }
+        // 收件人信息
+        String[] addrs = salesOrderInfo.getSalesAddressInfo().split("-");
+        if (addrs.length <= 3) {
+            addrs = salesOrderInfo.getSalesAddressInfo().split(" ");
+        }
+        Map<String, Object> Receiver = new HashMap<String, Object>();
+        Receiver.put("Name", salesOrderInfo.getSalesAddressName());
+        Receiver.put("Tel", salesOrderInfo.getSalesAddressTel());
+        Receiver.put("ProvinceName", addrs[0]);
+        Receiver.put("CityName", addrs[1]);
+        Receiver.put("Address", salesOrderInfo.getSalesAddressInfo());
+        eOrderRequestData.setReceiver(Receiver);
+        // 发件人信息
+        Map<String, Object> Sender = new HashMap<String, Object>();
+        Sender.put("Name", "爱贝源");
+        Sender.put("Tel", "13112639663");
+        Sender.put("ProvinceName", "广东省");
+        Sender.put("CityName", "东莞市");
+        Sender.put("Address", "东莞清溪三中金龙工业区徐福记对面优尼雅电子科技");
+        eOrderRequestData.setSender(Sender);
+        // 产品信息
+        List<Map<String, Object>> Commodity = new ArrayList<>();
+        SalesOrderItem item = new SalesOrderItem();
+        item.setItemOrderId(salesOrderInfo.getSalesId());
+        List<SalesOrderItem> items = salesOrderService.listSalesOrderItem(item);
+        for (SalesOrderItem temp : items) {
+            Map<String, Object> product1 = new HashMap<String, Object>();
+            product1.put("GoodsName", temp.getItemProductName() + "(" + (temp.getItemProductColor()) + ")");
+            product1.put("GoodsWeight", 10.0);
+            Commodity.add(product1);
+        }
+        eOrderRequestData.setCommodity(Commodity);
+        eOrderRequestData.setWeight(1.0);
+        eOrderRequestData.setQuantity(1);
+        eOrderRequestData.setIsReturnPrintTemplate(1);
 
-        return null;
+        try {
+            String json = OrderUtils.orderOnlineByJson(eOrderRequestData);
+            JSONObject jsonObject = JSONObject.parseObject(json);
+            boolean flag = jsonObject.getBoolean("Success");
+            if (flag) {
+                // 获取电子面单成功
+                String code = jsonObject.getJSONObject("Order").getString("LogisticCode");
+                // 订单发货
+                SalesOrder salesOrder = new SalesOrder();
+                salesOrder.setSalesPostFirm(post);
+                salesOrder.setSalesPostNum(code);
+                salesOrder.setSalesShippingStatus(2);
+                salesOrder.setSalesSendTime(new Date());
+                salesOrder.setSalesId(salesId);
+                salesOrderService.updateSalesOrder(salesOrder);
+                // 保存HTML
+                String filePath = request.getServletContext().getRealPath("/common/");
+                File dir = new File(filePath + File.separator + "send_order");
+                if (!dir.exists()) {
+                    dir.mkdir();
+                }
+                File file = new File(dir.getAbsolutePath() + File.separator + orderId + ".txt");
+                file.createNewFile();
+                FileWriter fileWriter = null;
+                try {
+                    fileWriter = new FileWriter(file, false);
+                    fileWriter.write(json);
+                } catch (Exception e) {
+                    LOGGER.error("", e);
+                } finally {
+                    if (fileWriter != null) {
+                        fileWriter.close();
+                    }
+                }
+            } else {
+                // 获取电子面单失败
+                LOGGER.info("{} 获取电子名单失败,原因{}", orderId, jsonObject.get("Reason"));
+            }
+            return ResponseJson.getSUCCESS().addResponseKeyValue("json", json);
+        } catch (Exception e) {
+            return ResponseJson.getFAILURE().addResponseKeyValue("error", e.getMessage());
+        }
     }
 
+    // 重新打印发货
+    @ResponseBody
+    @RequestMapping("/rePrintOrder")
+    @RequiresPermissions("order:listAwaitSendOrder")
+    public ResponseJson rePrintOrder(@RequestParam("orderId") String orderId,
+                                     HttpServletRequest request) throws IOException {
+        String filePath = request.getServletContext().getRealPath("/common/send_order");
+        filePath = filePath + File.separator + orderId + ".txt";
+        // 读取文件内容
+        FileReader reader = new FileReader(filePath);
+        StringBuilder stringBuilder = new StringBuilder();
+        char[] chars = new char[1024];
+        int len = 0;
+        while((len = reader.read(chars)) != -1) {
+            stringBuilder.append(new String(chars, 0, len));
+        }
+        reader.close();
+
+        return ResponseJson.getSUCCESS().addResponseKeyValue("json", stringBuilder.toString());
+    }
 
 }

+ 155 - 0
watero-rst-web/src/main/java/com/iamberry/rst/utils/OrderUtils.java

@@ -0,0 +1,155 @@
+package com.iamberry.rst.utils;
+
+import com.alibaba.fastjson.JSONObject;
+import com.iamberry.rst.core.order.EOrderRequestData;
+import com.iamberry.wechat.tools.HttpClient431Util;
+import com.sun.org.apache.xml.internal.security.utils.Base64;
+
+import java.io.FileOutputStream;
+import java.io.OutputStream;
+import java.io.UnsupportedEncodingException;
+import java.net.URLEncoder;
+import java.security.MessageDigest;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @author 献
+ * @company 深圳爱贝源科技有限公司
+ * @date 2018/5/25 17:50
+ * @tel 18271840547
+ * @website www.iamberry.com
+ */
+public class OrderUtils {
+
+    //电商ID
+    private static final String EBusinessID="1343593";
+    //电商加密私钥,快递鸟提供
+    private static final String AppKey="3597c368-9dc0-40b5-9cf2-86d9cb90e38a";
+    // 正式环境地址:http://api.kdniao.cc/api/Eorderservice
+    // 测试环境地址:http://testapi.kdniao.cc:8081/api/EOrderService
+    private static final String ReqURL="http://testapi.kdniao.cc:8081/api/Eorderservice";
+
+    public static void main(String[] args) throws Exception {
+        EOrderRequestData eOrderRequestData = new EOrderRequestData();
+        eOrderRequestData.setShipperCode("SF");
+        eOrderRequestData.setOrderCode("28230283280823");
+        eOrderRequestData.setPayType(1);
+        eOrderRequestData.setExpType("1");
+        eOrderRequestData.setCost(3680.00);
+        eOrderRequestData.setOtherCost(0.0);
+        // 收件人信息
+        Map<String, Object> Receiver = new HashMap<String, Object>();
+        Receiver.put("Name", "何秀刚");
+        Receiver.put("Tel", "18989890909");
+        Receiver.put("ProvinceName", "广东省");
+        Receiver.put("CityName", "深圳市");
+        Receiver.put("Address", "莲花街道深南大道特区报业大厦12B");
+        eOrderRequestData.setReceiver(Receiver);
+        // 发件人信息
+        Map<String, Object> Sender = new HashMap<String, Object>();
+        Sender.put("Name", "何秀刚");
+        Sender.put("Tel", "18778780808");
+        Sender.put("ProvinceName", "广东省");
+        Sender.put("CityName", "深圳市");
+        Sender.put("Address", "莲花街道深南大道特区报业大厦12B");
+        eOrderRequestData.setSender(Sender);
+        // 产品信息
+        List<Map<String, Object>> Commodity = new ArrayList<>();
+        Map<String, Object> product1 = new HashMap<String, Object>();
+        product1.put("GoodsName", "美国WaterO净饮水一体机");
+        Map<String, Object> product2 = new HashMap<String, Object>();
+        product2.put("GoodsName", "爱贝源智能冲奶机M1");
+        Commodity.add(product1);
+        // Commodity.add(product2);
+        eOrderRequestData.setCommodity(Commodity);
+        eOrderRequestData.setWeight(11.9);
+        eOrderRequestData.setQuantity(2);
+        eOrderRequestData.setIsReturnPrintTemplate(1);
+
+        // 执行
+        String json = orderOnlineByJson(eOrderRequestData);
+        System.out.println(json);
+        JSONObject jsonObject = JSONObject.parseObject(json);
+        Object template = jsonObject.get("PrintTemplate");
+        // 写入本地磁盘
+        OutputStream outputStream = new FileOutputStream("C:\\Users\\Administrator\\Desktop\\test.html");
+        outputStream.write(template.toString().getBytes("UTF-8"));
+        outputStream.flush();
+        outputStream.close();
+    }
+
+    /**
+     * Json方式 电子面单
+     * @throws Exception
+     */
+    public static String orderOnlineByJson(EOrderRequestData orderRequestData) throws Exception {
+        // 生成电子面单的请求数据
+        String requestData = JSONObject.toJSONString(orderRequestData);
+        // 生成系统级请求数据
+        Map<String, String> params = new HashMap<String, String>();
+        params.put("RequestData", urlEncoder(requestData, "UTF-8"));
+        params.put("EBusinessID", EBusinessID);
+        params.put("RequestType", "1007");
+        String dataSign=encrypt(requestData, AppKey, "UTF-8");
+        params.put("DataSign", urlEncoder(dataSign, "UTF-8"));
+        params.put("DataType", "2");
+        // 发送请求
+        return HttpClient431Util.doPost(params, ReqURL);
+    }
+    /**
+     * MD5加密
+     * @param str 内容
+     * @param charset 编码方式
+     * @throws Exception
+     */
+    @SuppressWarnings("unused")
+    private static String MD5(String str, String charset) throws Exception {
+        MessageDigest md = MessageDigest.getInstance("MD5");
+        md.update(str.getBytes(charset));
+        byte[] result = md.digest();
+        StringBuilder sb = new StringBuilder(32);
+        for (byte aResult : result) {
+            int val = aResult & 0xff;
+            if (val <= 0xf) {
+                sb.append("0");
+            }
+            sb.append(Integer.toHexString(val));
+        }
+        return sb.toString().toLowerCase();
+    }
+
+    /**
+     * base64编码
+     * @param str 内容
+     * @param charset 编码方式
+     * @throws UnsupportedEncodingException
+     */
+    private static String base64(String str, String charset) throws UnsupportedEncodingException {
+        return Base64.encode(str.getBytes(charset));
+    }
+
+    @SuppressWarnings("unused")
+    private static String urlEncoder(String str, String charset) throws UnsupportedEncodingException{
+        return URLEncoder.encode(str, charset);
+    }
+
+    /**
+     * 电商Sign签名生成
+     * @param content 内容
+     * @param keyValue Appkey
+     * @param charset 编码方式
+     * @throws UnsupportedEncodingException ,Exception
+     * @return DataSign签名
+     */
+    @SuppressWarnings("unused")
+    private static String encrypt (String content, String keyValue, String charset) throws UnsupportedEncodingException, Exception {
+        if (keyValue != null)
+        {
+            return base64(MD5(content + keyValue, charset), charset);
+        }
+        return base64(MD5(content, charset), charset);
+    }
+}

File diff suppressed because it is too large
+ 164 - 0
watero-rst-web/src/main/webapp/WEB-INF/views/order/salesOrder/list_wait_send_order.ftl


+ 161 - 0
watero-rst-web/src/main/webapp/WEB-INF/views/order/salesOrder/print_order.ftl

@@ -0,0 +1,161 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+    <meta charset="utf-8">
+    <meta name="renderer" content="webkit|ie-comp|ie-stand">
+    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
+    <meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1.0,maximum-scale=1.0,user-scalable=no" />
+    <meta http-equiv="Cache-Control" content="no-siteapp" />
+    <link rel="Bookmark" href="/favicon.ico" >
+    <link rel="Shortcut Icon" href="/favicon.ico" />
+    <#include "/base/add_base.ftl">
+    <script type="text/javascript" src="//s.iamberry.com/js/LodopFuncs.js"></script>
+    <title>打单发货</title>
+
+</head>
+<body>
+<div class="page-container">
+    <div class="order-list">
+
+        <div>
+            本次共 <span style="color: red;">${(page.dataList?size)!"0"}</span> 个订单
+        </div>
+        <div class="mt-20" style="height: 330px;overflow: auto;overflow-x: hidden;margin-bottom: 12px;border: 1px solid #ddd;">
+            <table class="table table-border table-bordered table-bg table-hover table-sort">
+                <thead>
+                <tr class="text-c">
+                    <th width="20">状态</th>
+                    <th width="70">订单编号</th>
+                    <th width="30">姓名</th>
+                    <th width="50">电话</th>
+                    <th width="100">收货地址</th>
+                    <th width="100">订单产品</th>
+                </tr>
+                </thead>
+                <tbody id="productHtml">
+                    <#if (page.dataList?size <= 0)>
+                        <tr class="text-c"><td colspan="12">暂无数据</td></tr>
+                    <#else>
+                        <#list page.dataList as o>
+                            <tr class="text-c wait-print-order" printState="1">
+                                <td>待处理</td>
+                                <td salesId="${o.salesId}">${(o.salesOrderId)!}</td>
+                                <td>${(o.salesAddressName)!}</td>
+                                <td>${(o.salesAddressTel)!}</td>
+                                <td>${(o.salesAddressInfo)!}</td>
+                                <td style="text-align: left;">
+                                    <#if o.salesOrderItemList ??>
+                                        <#list o.salesOrderItemList as d>
+                                            <span class="label label-success radius">${(d.itemProductName)!}(${(d.itemProductColor)!})*${(d.itemNum)!}</span>
+                                        </#list>
+                                    </#if>
+                                </td>
+                            </tr>
+                        </#list>
+                    </#if>
+                </tbody>
+            </table>
+        </div>
+
+        <div class="formControls col-1 col-sm-1" style="width: 100%;">
+            <select class="select" id="all-post-select" style="margin-left: -15px;height: 31px;width: 150px">
+                <#list posts as d>
+                    <option value="${(d.logisticsRstCode)!}">${(d.logisticsName)!}</option>
+                </#list>
+            </select>
+            <select class="select" id="print-machine" style="height: 31px;width: 150px">
+            </select>
+            <button type="button" class="btn btn-primary" style="background: #32a3d8;color: #fff;" id="sub-post">开始打印</button>
+        </div>
+
+        <div id="print-pageview-div" style="display: none"></div>
+    </div>
+
+</div>
+
+<tfoot>
+</tfoot>
+
+<script type="text/javascript">
+    var LODOP=getLodop();
+    $(function () {
+        // 获取系统的打印机
+        setPrintMachine();
+        function setPrintMachine() {
+            var count = LODOP.GET_PRINTER_COUNT() - 1;
+            for (var i = 0; i <= count; i++) {
+                var text = LODOP.GET_PRINTER_NAME(i+":PrinterName");
+                $("#print-machine").append("<option value='" + text + "'>" + text + "</option>")
+            }
+        }
+        // 开始打印
+        $("#sub-post").click(function() {
+            var orders = $(".wait-print-order");
+            if (orders == null || orders.length <= 0) {
+                layer.msg("未选中订单",{icon: 2,time:3000});
+                return;
+            }
+            // 指定打印设备
+            LODOP.SET_PRINTER_INDEX($("#print-machine").val());
+            // 启动打印
+            startPrint();
+        });
+
+        function nextPrintOrder() {
+            var orders = $(".wait-print-order");
+            for(var i = 0; i < orders.length; i++) {
+                if ($(orders[i]).attr("printState") == "1") {
+                    // 待打印
+                    return $(orders[i]);
+                }
+            }
+        }
+
+        function startPrint() {
+            var order = nextPrintOrder();
+            if (order == null || typeof(order) == undefined) {
+                alert("打印完成");
+                return;
+            }
+            var $td = $(order.find("td")[1]);
+            var orderId = $td.text().trim();
+            var salesId = $td.attr("salesId");
+            // 单个打印
+            $.ajax({
+                type: "POST",
+                data: {
+                    "post":$("#all-post-select").val(),
+                    "orderId":orderId,
+                    "salesId":salesId
+                },
+                async: true,
+                url: "${path}/admin/await_send/printOrder",
+                beforeSend: function () {
+                    // 请求开始
+                    order.attr("printState", "2");
+                    $(order.find("td")[0]).html("<span style='color: rgba(243, 123, 29, 1);'>处理中</span>");
+                },
+                success: function(data){
+                    // 请求成功
+                    var res = $.parseJSON(data.returnMsg.json);
+                    if (data.resultMsg && res.Success) {
+                        var html = res.PrintTemplate;
+                        LODOP.PRINT_INIT('打印订单');
+                        LODOP.SET_PRINT_PAGESIZE(0, 0, 0,"");
+                        LODOP.ADD_PRINT_HTM("2mm","2mm","100%","100%", html);
+                        var flag = LODOP.PRINT();
+                        $(order.find("td")[0]).html("<span style='color: blue'>打印完成</span>");
+                        if (flag) {
+                            startPrint();
+                        }
+                    } else {
+                        $(order.find("td")[0]).html("<span style='color: red;'>失败(" + res.Reason + ")</span>");
+                        startPrint();
+                    }
+                }
+            });
+        }
+    });
+</script>
+</body>
+</html>