Browse Source

初始接米项目

caolong 5 years ago
parent
commit
d4f22f97a7
100 changed files with 6342 additions and 1004 deletions
  1. 588 354
      .idea/workspace.xml
  2. 195 0
      src/main/java/com/wxpay/zhuanz/CertHttpUtil.java
  3. 42 0
      src/main/java/com/wxpay/zhuanz/IWXPayDomain.java
  4. 684 0
      src/main/java/com/wxpay/zhuanz/WXPay.java
  5. 103 0
      src/main/java/com/wxpay/zhuanz/WXPayConfig.java
  6. 59 0
      src/main/java/com/wxpay/zhuanz/WXPayConstants.java
  7. 265 0
      src/main/java/com/wxpay/zhuanz/WXPayReport.java
  8. 260 0
      src/main/java/com/wxpay/zhuanz/WXPayRequest.java
  9. 295 0
      src/main/java/com/wxpay/zhuanz/WXPayUtil.java
  10. 30 0
      src/main/java/com/wxpay/zhuanz/WXPayXmlUtil.java
  11. 15 3
      src/main/java/com/yc/education/controller/AnnouncementController.java
  12. 0 1
      src/main/java/com/yc/education/controller/IndexController.java
  13. 28 3
      src/main/java/com/yc/education/controller/LabelBookController.java
  14. 258 22
      src/main/java/com/yc/education/controller/OrdersController.java
  15. 144 0
      src/main/java/com/yc/education/controller/WxTransferController.java
  16. 187 0
      src/main/java/com/yc/education/controller/WxpayController.java
  17. 42 0
      src/main/java/com/yc/education/controller/admin/NewsController.java
  18. 314 0
      src/main/java/com/yc/education/controller/admin/OrderAdminController.java
  19. 15 0
      src/main/java/com/yc/education/mapper/AuctionMapper.java
  20. 2 2
      src/main/java/com/yc/education/mapper/LabelbookMapper.java
  21. 23 0
      src/main/java/com/yc/education/mapper/NoticeMapper.java
  22. 20 0
      src/main/java/com/yc/education/mapper/OrdersMapper.java
  23. 5 0
      src/main/java/com/yc/education/mapper/ReceiptMapper.java
  24. 141 0
      src/main/java/com/yc/education/model/Auction.java
  25. 27 0
      src/main/java/com/yc/education/model/Meal.java
  26. 79 0
      src/main/java/com/yc/education/model/Notice.java
  27. 373 0
      src/main/java/com/yc/education/model/Orders.java
  28. 30 13
      src/main/java/com/yc/education/model/Serviceagreement.java
  29. 20 0
      src/main/java/com/yc/education/service/AuctionService.java
  30. 1 1
      src/main/java/com/yc/education/service/LabelbookService.java
  31. 19 0
      src/main/java/com/yc/education/service/NoticeService.java
  32. 23 0
      src/main/java/com/yc/education/service/OrdersService.java
  33. 3 0
      src/main/java/com/yc/education/service/ReceiptService.java
  34. 30 0
      src/main/java/com/yc/education/service/impl/AuctionServiceImpl.java
  35. 1 1
      src/main/java/com/yc/education/service/impl/LabelbookServiceImpl.java
  36. 30 0
      src/main/java/com/yc/education/service/impl/NoticeServiceImpl.java
  37. 45 0
      src/main/java/com/yc/education/service/impl/OrdersServiceImpl.java
  38. 10 0
      src/main/java/com/yc/education/service/impl/ReceiptServiceImpl.java
  39. 207 0
      src/main/webapp/WEB-INF/jsp/admin/addacution.jsp
  40. 1 1
      src/main/webapp/WEB-INF/jsp/admin/addlaberbook.jsp
  41. 10 1
      src/main/webapp/WEB-INF/jsp/admin/addmeal.jsp
  42. 229 0
      src/main/webapp/WEB-INF/jsp/admin/addorders.jsp
  43. 191 0
      src/main/webapp/WEB-INF/jsp/admin/adminauction.jsp
  44. 197 0
      src/main/webapp/WEB-INF/jsp/admin/adminorder.jsp
  45. 13 0
      src/main/webapp/WEB-INF/jsp/admin/index.jsp
  46. 7 2
      src/main/webapp/WEB-INF/jsp/center_order.jsp
  47. 77 46
      src/main/webapp/WEB-INF/jsp/center_order2.jsp
  48. 6 6
      src/main/webapp/WEB-INF/jsp/my_busnes.jsp
  49. 19 27
      src/main/webapp/WEB-INF/jsp/my_news.jsp
  50. 1 0
      src/main/webapp/WEB-INF/jsp/new_biding.jsp
  51. 24 10
      src/main/webapp/WEB-INF/jsp/notice_detail.jsp
  52. 165 188
      src/main/webapp/WEB-INF/jsp/order.jsp
  53. 49 51
      src/main/webapp/WEB-INF/jsp/order_detail.jsp
  54. 25 20
      src/main/webapp/WEB-INF/jsp/order_detail1.jsp
  55. 26 24
      src/main/webapp/WEB-INF/jsp/pay_way.jsp
  56. 75 21
      src/main/webapp/WEB-INF/jsp/upload.jsp
  57. 207 202
      src/main/webapp/WEB-INF/jsp/xieyi.jsp
  58. 383 0
      src/main/webapp/WEB-INF/jsp/xieyichakan.jsp
  59. 14 4
      src/main/webapp/WEB-INF/jsp/xieyiqr.jsp
  60. BIN
      src/main/webapp/uploadimg/1568199356048.png
  61. BIN
      src/main/webapp/uploadimg/1568199396022.png
  62. BIN
      src/main/webapp/uploadimg/15681994245011568199424501.png
  63. BIN
      src/main/webapp/uploadimg/15681994546571568199454657.png
  64. BIN
      src/main/webapp/uploadimg/15681995907251568199590725.png
  65. BIN
      target/classes/com/Base64/BASE64DecodedMultipartFile.class
  66. BIN
      target/classes/com/Base64/Base64StrToImage.class
  67. BIN
      target/classes/com/yc/education/controller/AnnouncementController.class
  68. BIN
      target/classes/com/yc/education/controller/IndexController.class
  69. BIN
      target/classes/com/yc/education/controller/LabelBookController.class
  70. BIN
      target/classes/com/yc/education/controller/OrdersController.class
  71. BIN
      target/classes/com/yc/education/mapper/LabelbookMapper.class
  72. BIN
      target/classes/com/yc/education/mapper/ReceiptMapper.class
  73. BIN
      target/classes/com/yc/education/mapper/ServiceagreementMapper.class
  74. BIN
      target/classes/com/yc/education/model/Meal.class
  75. BIN
      target/classes/com/yc/education/model/Serviceagreement.class
  76. BIN
      target/classes/com/yc/education/service/LabelbookService.class
  77. BIN
      target/classes/com/yc/education/service/ReceiptService.class
  78. BIN
      target/classes/com/yc/education/service/impl/LabelbookServiceImpl.class
  79. BIN
      target/classes/com/yc/education/service/impl/ReceiptServiceImpl.class
  80. BIN
      target/classes/com/yc/education/util/Base64Utils.class
  81. BIN
      target/jiemit/WEB-INF/classes/com/Base64/BASE64DecodedMultipartFile.class
  82. BIN
      target/jiemit/WEB-INF/classes/com/Base64/Base64StrToImage.class
  83. BIN
      target/jiemit/WEB-INF/classes/com/yc/education/controller/AnnouncementController.class
  84. BIN
      target/jiemit/WEB-INF/classes/com/yc/education/controller/IndexController.class
  85. BIN
      target/jiemit/WEB-INF/classes/com/yc/education/controller/LabelBookController.class
  86. BIN
      target/jiemit/WEB-INF/classes/com/yc/education/controller/OrdersController.class
  87. BIN
      target/jiemit/WEB-INF/classes/com/yc/education/mapper/LabelbookMapper.class
  88. BIN
      target/jiemit/WEB-INF/classes/com/yc/education/mapper/ReceiptMapper.class
  89. BIN
      target/jiemit/WEB-INF/classes/com/yc/education/mapper/ServiceagreementMapper.class
  90. BIN
      target/jiemit/WEB-INF/classes/com/yc/education/model/Meal.class
  91. BIN
      target/jiemit/WEB-INF/classes/com/yc/education/model/Serviceagreement.class
  92. BIN
      target/jiemit/WEB-INF/classes/com/yc/education/service/LabelbookService.class
  93. BIN
      target/jiemit/WEB-INF/classes/com/yc/education/service/ReceiptService.class
  94. BIN
      target/jiemit/WEB-INF/classes/com/yc/education/service/ServiceagreementService.class
  95. BIN
      target/jiemit/WEB-INF/classes/com/yc/education/service/impl/LabelbookServiceImpl.class
  96. BIN
      target/jiemit/WEB-INF/classes/com/yc/education/service/impl/ReceiptServiceImpl.class
  97. BIN
      target/jiemit/WEB-INF/classes/com/yc/education/service/impl/ServiceagreementServiceImpl.class
  98. BIN
      target/jiemit/WEB-INF/classes/com/yc/education/util/Base64Utils.class
  99. 10 1
      target/jiemit/WEB-INF/jsp/admin/addmeal.jsp
  100. 0 0
      target/jiemit/WEB-INF/jsp/admin/index.jsp

File diff suppressed because it is too large
+ 588 - 354
.idea/workspace.xml


+ 195 - 0
src/main/java/com/wxpay/zhuanz/CertHttpUtil.java

@@ -0,0 +1,195 @@
+package com.wxpay.zhuanz;
+
+import com.wxpay.WxPayConfig;
+import org.apache.http.HttpEntity;
+import org.apache.http.HttpResponse;
+import org.apache.http.client.config.RequestConfig;
+import org.apache.http.client.methods.HttpPost;
+import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
+import org.apache.http.entity.StringEntity;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.apache.http.impl.client.HttpClients;
+import org.apache.http.ssl.SSLContexts;
+import org.apache.http.util.EntityUtils;
+import org.springframework.core.io.ClassPathResource;
+
+import javax.net.ssl.SSLContext;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.security.KeyStore;
+
+/**
+ * @author caolong
+ * @version 1.0.0
+ * @Details
+ * @ClassName CertHttpUtil
+ * @Description TODO
+ * @createTime 2019-07-18 13:37:00
+ */
+public class CertHttpUtil {
+
+
+    private static int socketTimeout = 10000;// 连接超时时间,默认10秒
+    private static int connectTimeout = 30000;// 传输超时时间,默认30秒
+    private static RequestConfig requestConfig;// 请求器的配置
+    private static CloseableHttpClient httpClient;// HTTP请求器
+
+    /**
+     * 通过Https往API post xml数据
+     *
+     * @param url      API地址
+     * @param xmlObj   要提交的XML数据对象
+     * @param mchId    商户ID
+     * @param certPath 证书位置
+     * @return
+     */
+
+
+    public static String postData(String url, String xmlObj, String mchId, String certPath) {
+        // 加载证书
+        try {
+            initCert();
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        String result = null;
+        HttpPost httpPost = new HttpPost(url);
+        // 得指明使用UTF-8编码,否则到API服务器XML的中文不能被成功识别
+        StringEntity postEntity = new StringEntity(xmlObj, "UTF-8");
+        httpPost.addHeader("Content-Type", "text/xml");
+        httpPost.setEntity(postEntity);
+        // 根据默认超时限制初始化requestConfig
+        requestConfig = RequestConfig.custom().setSocketTimeout(socketTimeout).setConnectTimeout(connectTimeout).build();
+        // 设置请求器的配置
+        httpPost.setConfig(requestConfig);
+        try {
+            HttpResponse response = null;
+            try {
+                response = httpClient.execute(httpPost);
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
+            HttpEntity entity = response.getEntity();
+            try {
+                result = EntityUtils.toString(entity, "UTF-8");
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
+        } finally {
+            httpPost.abort();
+        }
+        return result;
+    }
+
+    /**
+     * 加载证书
+     *
+     * @param mchId    商户ID
+     * @param certPath 证书位置
+     * @throws Exception
+     */
+    private static void initCert(String mchId, String certPath) throws Exception {
+        // 证书密码,默认为商户ID
+        String key = mchId;
+        // 证书的路径
+        String path = certPath;
+        // 指定读取证书格式为PKCS12
+        KeyStore keyStore = KeyStore.getInstance("PKCS12");
+        // 读取本机存放的PKCS12证书文件
+        ClassPathResource cp = new ClassPathResource(path);
+        InputStream instream = cp.getInputStream();
+        try {
+            // 指定PKCS12的密码(商户ID)
+            keyStore.load(instream, key.toCharArray());
+        } finally {
+            instream.close();
+        }
+        SSLContext sslcontext = SSLContexts.custom().loadKeyMaterial(keyStore, key.toCharArray()).build();
+        SSLConnectionSocketFactory sslsf =
+                new SSLConnectionSocketFactory(sslcontext, new String[]{"TLSv1"}, null,
+                        SSLConnectionSocketFactory.BROWSER_COMPATIBLE_HOSTNAME_VERIFIER);
+        httpClient = HttpClients.custom().setSSLSocketFactory(sslsf).build();
+    }
+
+    /**
+     * 通过Https往API post xml数据
+     *
+     * @param url    API地址
+     * @param xmlObj 要提交的XML数据对象
+     * @return
+     */
+    public static String postData(String url, String xmlObj) throws Exception {
+        // 加载证书
+        try {
+            initCert();
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        String result = null;
+        HttpPost httpPost = new HttpPost(url);
+        // 得指明使用UTF-8编码,否则到API服务器XML的中文不能被成功识别
+        StringEntity postEntity = new StringEntity(xmlObj, "UTF-8");
+        httpPost.addHeader("Content-Type", "text/xml");
+        httpPost.setEntity(postEntity);
+        // 根据默认超时限制初始化requestConfig
+        requestConfig = RequestConfig.custom()
+                .setSocketTimeout(socketTimeout)
+                .setConnectTimeout(connectTimeout)
+                .build();
+        // 设置请求器的配置
+        httpPost.setConfig(requestConfig);
+        try {
+            HttpResponse response = null;
+//            try {
+            response = httpClient.execute(httpPost);
+//            } catch (IOException e) {
+//                e.printStackTrace();
+//            }
+            HttpEntity entity = response.getEntity();
+            try {
+                result = EntityUtils.toString(entity, "UTF-8");
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
+        } finally {
+            httpPost.abort();
+        }
+        return result;
+    }
+
+    /**
+     * 加载证书
+     */
+    private static void initCert() throws Exception {
+        // 证书密码,默认为商户ID
+        String key = WxPayConfig.APPPAYMCH;
+        // 证书的路径
+        String path = WxPayConfig.SSLCERT_PATH;
+        // 指定读取证书格式为PKCS12
+        KeyStore keyStore = KeyStore.getInstance("PKCS12");
+        // 读取本机存放的PKCS12证书文件
+        FileInputStream instream = new FileInputStream(new File(path));
+        try {
+            // 指定PKCS12的密码(商户ID)
+            keyStore.load(instream, key.toCharArray());
+        } finally {
+            instream.close();
+        }
+        SSLContext sslcontext = SSLContexts
+                .custom()
+                .loadKeyMaterial(keyStore, key.toCharArray())
+                .build();
+        // 指定TLS版本
+        SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(
+                sslcontext, new String[]{"TLSv1"}, null,
+                SSLConnectionSocketFactory.BROWSER_COMPATIBLE_HOSTNAME_VERIFIER);
+        // 设置httpclient的SSLSocketFactory
+        httpClient = HttpClients
+                .custom()
+                .setSSLSocketFactory(sslsf)
+                .build();
+    }
+
+}

+ 42 - 0
src/main/java/com/wxpay/zhuanz/IWXPayDomain.java

@@ -0,0 +1,42 @@
+package com.wxpay.zhuanz;
+
+/**
+ * 域名管理,实现主备域名自动切换
+ */
+public abstract interface IWXPayDomain {
+    /**
+     * 上报域名网络状况
+     * @param domain 域名。 比如:api.mch.weixin.qq.com
+     * @param elapsedTimeMillis 耗时
+     * @param ex 网络请求中出现的异常。
+     *           null表示没有异常
+     *           ConnectTimeoutException,表示建立网络连接异常
+     *           UnknownHostException, 表示dns解析异常
+     */
+    abstract void report(final String domain, long elapsedTimeMillis, final Exception ex);
+
+    /**
+     * 获取域名
+     * @param config 配置
+     * @return 域名
+     */
+    abstract DomainInfo getDomain(final WXPayConfig config);
+
+    static class DomainInfo{
+        public String domain;       //域名
+        public boolean primaryDomain;     //该域名是否为主域名。例如:api.mch.weixin.qq.com为主域名
+        public DomainInfo(String domain, boolean primaryDomain) {
+            this.domain = domain;
+            this.primaryDomain = primaryDomain;
+        }
+
+        @Override
+        public String toString() {
+            return "DomainInfo{" +
+                    "domain='" + domain + '\'' +
+                    ", primaryDomain=" + primaryDomain +
+                    '}';
+        }
+    }
+
+}

+ 684 - 0
src/main/java/com/wxpay/zhuanz/WXPay.java

@@ -0,0 +1,684 @@
+package com.wxpay.zhuanz;
+
+
+import java.util.HashMap;
+import java.util.Map;
+
+public class WXPay {
+
+    private WXPayConfig config;
+    private WXPayConstants.SignType signType;
+    private boolean autoReport;
+    private boolean useSandbox;
+    private String notifyUrl;
+    private WXPayRequest wxPayRequest;
+
+    public WXPay(final WXPayConfig config) throws Exception {
+        this(config, null, true, false);
+    }
+
+    public WXPay(final WXPayConfig config, final boolean autoReport) throws Exception {
+        this(config, null, autoReport, false);
+    }
+
+
+    public WXPay(final WXPayConfig config, final boolean autoReport, final boolean useSandbox) throws Exception {
+        this(config, null, autoReport, useSandbox);
+    }
+
+    public WXPay(final WXPayConfig config, final String notifyUrl) throws Exception {
+        this(config, notifyUrl, true, false);
+    }
+
+    public WXPay(final WXPayConfig config, final String notifyUrl, final boolean autoReport) throws Exception {
+        this(config, notifyUrl, autoReport, false);
+    }
+
+    public WXPay(final WXPayConfig config, final String notifyUrl, final boolean autoReport, final boolean useSandbox) throws Exception {
+        this.config = config;
+        this.notifyUrl = notifyUrl;
+        this.autoReport = autoReport;
+        this.useSandbox = useSandbox;
+        if (useSandbox) {
+            this.signType = WXPayConstants.SignType.MD5; // 沙箱环境
+        } else {
+            this.signType = WXPayConstants.SignType.HMACSHA256;
+        }
+        this.wxPayRequest = new WXPayRequest(config);
+    }
+
+    private void checkWXPayConfig() throws Exception {
+        if (this.config == null) {
+            throw new Exception("config is null");
+        }
+        if (this.config.getAppID() == null || this.config.getAppID().trim().length() == 0) {
+            throw new Exception("appid in config is empty");
+        }
+        if (this.config.getMchID() == null || this.config.getMchID().trim().length() == 0) {
+            throw new Exception("appid in config is empty");
+        }
+        if (this.config.getCertStream() == null) {
+            throw new Exception("cert stream in config is empty");
+        }
+        if (this.config.getWXPayDomain() == null) {
+            throw new Exception("config.getWXPayDomain() is null");
+        }
+
+        if (this.config.getHttpConnectTimeoutMs() < 10) {
+            throw new Exception("http connect timeout is too small");
+        }
+        if (this.config.getHttpReadTimeoutMs() < 10) {
+            throw new Exception("http read timeout is too small");
+        }
+
+    }
+
+    /**
+     * 向 Map 中添加 appid、mch_id、nonce_str、sign_type、sign <br>
+     * 该函数适用于商户适用于统一下单等接口,不适用于红包、代金券接口
+     *
+     * @param reqData
+     * @return
+     * @throws Exception
+     */
+    public Map<String, String> fillRequestData(Map<String, String> reqData) throws Exception {
+        reqData.put("appid", config.getAppID());
+        reqData.put("mch_id", config.getMchID());
+        reqData.put("nonce_str", WXPayUtil.generateNonceStr());
+        if (WXPayConstants.SignType.MD5.equals(this.signType)) {
+            reqData.put("sign_type", WXPayConstants.MD5);
+        } else if (WXPayConstants.SignType.HMACSHA256.equals(this.signType)) {
+            reqData.put("sign_type", WXPayConstants.HMACSHA256);
+        }
+        reqData.put("sign", WXPayUtil.generateSignature(reqData, config.getKey(), this.signType));
+        return reqData;
+    }
+
+    /**
+     * 判断xml数据的sign是否有效,必须包含sign字段,否则返回false
+     *
+     * @param reqData 向wxpay post的请求数据
+     * @return 签名是否有效
+     * @throws Exception
+     */
+    public boolean isResponseSignatureValid(Map<String, String> reqData) throws Exception {
+        // 返回数据的签名方式和请求中给定的签名方式是一致的
+        return WXPayUtil.isSignatureValid(reqData, this.config.getKey(), this.signType);
+    }
+
+    /**
+     * 判断支付结果通知中的sign是否有效
+     *
+     * @param reqData 向wxpay post的请求数据
+     * @return 签名是否有效
+     * @throws Exception
+     */
+    public boolean isPayResultNotifySignatureValid(Map<String, String> reqData) throws Exception {
+        String signTypeInData = reqData.get(WXPayConstants.FIELD_SIGN_TYPE);
+        WXPayConstants.SignType signType;
+        if (signTypeInData == null) {
+            signType = WXPayConstants.SignType.MD5;
+        } else {
+            signTypeInData = signTypeInData.trim();
+            if (signTypeInData.length() == 0) {
+                signType = WXPayConstants.SignType.MD5;
+            } else if (WXPayConstants.MD5.equals(signTypeInData)) {
+                signType = WXPayConstants.SignType.MD5;
+            } else if (WXPayConstants.HMACSHA256.equals(signTypeInData)) {
+                signType = WXPayConstants.SignType.HMACSHA256;
+            } else {
+                throw new Exception(String.format("Unsupported sign_type: %s", signTypeInData));
+            }
+        }
+        return WXPayUtil.isSignatureValid(reqData, this.config.getKey(), signType);
+    }
+
+
+    /**
+     * 不需要证书的请求
+     *
+     * @param urlSuffix        String
+     * @param reqData          向wxpay post的请求数据
+     * @param connectTimeoutMs 超时时间,单位是毫秒
+     * @param readTimeoutMs    超时时间,单位是毫秒
+     * @return API返回数据
+     * @throws Exception
+     */
+    public String requestWithoutCert(String urlSuffix, Map<String, String> reqData,
+                                     int connectTimeoutMs, int readTimeoutMs) throws Exception {
+        String msgUUID = reqData.get("nonce_str");
+        String reqBody = WXPayUtil.mapToXml(reqData);
+
+        String resp = this.wxPayRequest.requestWithoutCert(urlSuffix, msgUUID, reqBody, connectTimeoutMs, readTimeoutMs, autoReport);
+        return resp;
+    }
+
+
+    /**
+     * 需要证书的请求
+     *
+     * @param urlSuffix        String
+     * @param reqData          向wxpay post的请求数据  Map
+     * @param connectTimeoutMs 超时时间,单位是毫秒
+     * @param readTimeoutMs    超时时间,单位是毫秒
+     * @return API返回数据
+     * @throws Exception
+     */
+    public String requestWithCert(String urlSuffix, Map<String, String> reqData,
+                                  int connectTimeoutMs, int readTimeoutMs) throws Exception {
+        String msgUUID = reqData.get("nonce_str");
+        String reqBody = WXPayUtil.mapToXml(reqData);
+
+        String resp = this.wxPayRequest.requestWithCert(urlSuffix, msgUUID, reqBody, connectTimeoutMs, readTimeoutMs, this.autoReport);
+        return resp;
+    }
+
+    /**
+     * 处理 HTTPS API返回数据,转换成Map对象。return_code为SUCCESS时,验证签名。
+     *
+     * @param xmlStr API返回的XML格式数据
+     * @return Map类型数据
+     * @throws Exception
+     */
+    public Map<String, String> processResponseXml(String xmlStr) throws Exception {
+        String RETURN_CODE = "return_code";
+        String return_code;
+        Map<String, String> respData = WXPayUtil.xmlToMap(xmlStr);
+        if (respData.containsKey(RETURN_CODE)) {
+            return_code = respData.get(RETURN_CODE);
+        } else {
+            throw new Exception(String.format("No `return_code` in XML: %s", xmlStr));
+        }
+
+        if (return_code.equals(WXPayConstants.FAIL)) {
+            return respData;
+        } else if (return_code.equals(WXPayConstants.SUCCESS)) {
+            if (this.isResponseSignatureValid(respData)) {
+                return respData;
+            } else {
+                throw new Exception(String.format("Invalid sign value in XML: %s", xmlStr));
+            }
+        } else {
+            throw new Exception(String.format("return_code value %s is invalid in XML: %s", return_code, xmlStr));
+        }
+    }
+
+    /**
+     * 作用:提交刷卡支付<br>
+     * 场景:刷卡支付
+     *
+     * @param reqData 向wxpay post的请求数据
+     * @return API返回数据
+     * @throws Exception
+     */
+    public Map<String, String> microPay(Map<String, String> reqData) throws Exception {
+        return this.microPay(reqData, this.config.getHttpConnectTimeoutMs(), this.config.getHttpReadTimeoutMs());
+    }
+
+
+    /**
+     * 作用:提交刷卡支付<br>
+     * 场景:刷卡支付
+     *
+     * @param reqData          向wxpay post的请求数据
+     * @param connectTimeoutMs 连接超时时间,单位是毫秒
+     * @param readTimeoutMs    读超时时间,单位是毫秒
+     * @return API返回数据
+     * @throws Exception
+     */
+    public Map<String, String> microPay(Map<String, String> reqData, int connectTimeoutMs, int readTimeoutMs) throws Exception {
+        String url;
+        if (this.useSandbox) {
+            url = WXPayConstants.SANDBOX_MICROPAY_URL_SUFFIX;
+        } else {
+            url = WXPayConstants.MICROPAY_URL_SUFFIX;
+        }
+        String respXml = this.requestWithoutCert(url, this.fillRequestData(reqData), connectTimeoutMs, readTimeoutMs);
+        return this.processResponseXml(respXml);
+    }
+
+    /**
+     * 提交刷卡支付,针对软POS,尽可能做成功
+     * 内置重试机制,最多60s
+     *
+     * @param reqData
+     * @return
+     * @throws Exception
+     */
+    public Map<String, String> microPayWithPos(Map<String, String> reqData) throws Exception {
+        return this.microPayWithPos(reqData, this.config.getHttpConnectTimeoutMs());
+    }
+
+    /**
+     * 提交刷卡支付,针对软POS,尽可能做成功
+     * 内置重试机制,最多60s
+     *
+     * @param reqData
+     * @param connectTimeoutMs
+     * @return
+     * @throws Exception
+     */
+    public Map<String, String> microPayWithPos(Map<String, String> reqData, int connectTimeoutMs) throws Exception {
+        int remainingTimeMs = 60 * 1000;
+        long startTimestampMs = 0;
+        Map<String, String> lastResult = null;
+        Exception lastException = null;
+
+        while (true) {
+            startTimestampMs = WXPayUtil.getCurrentTimestampMs();
+            int readTimeoutMs = remainingTimeMs - connectTimeoutMs;
+            if (readTimeoutMs > 1000) {
+                try {
+                    lastResult = this.microPay(reqData, connectTimeoutMs, readTimeoutMs);
+                    String returnCode = lastResult.get("return_code");
+                    if (returnCode.equals("SUCCESS")) {
+                        String resultCode = lastResult.get("result_code");
+                        String errCode = lastResult.get("err_code");
+                        if (resultCode.equals("SUCCESS")) {
+                            break;
+                        } else {
+                            // 看错误码,若支付结果未知,则重试提交刷卡支付
+                            if (errCode.equals("SYSTEMERROR") || errCode.equals("BANKERROR") || errCode.equals("USERPAYING")) {
+                                remainingTimeMs = remainingTimeMs - (int) (WXPayUtil.getCurrentTimestampMs() - startTimestampMs);
+                                if (remainingTimeMs <= 100) {
+                                    break;
+                                } else {
+                                    WXPayUtil.getLogger().info("microPayWithPos: try micropay again");
+                                    if (remainingTimeMs > 5 * 1000) {
+                                        Thread.sleep(5 * 1000);
+                                    } else {
+                                        Thread.sleep(1 * 1000);
+                                    }
+                                    continue;
+                                }
+                            } else {
+                                break;
+                            }
+                        }
+                    } else {
+                        break;
+                    }
+                } catch (Exception ex) {
+                    lastResult = null;
+                    lastException = ex;
+                }
+            } else {
+                break;
+            }
+        }
+
+        if (lastResult == null) {
+            throw lastException;
+        } else {
+            return lastResult;
+        }
+    }
+
+
+    /**
+     * 作用:统一下单<br>
+     * 场景:公共号支付、扫码支付、APP支付
+     *
+     * @param reqData 向wxpay post的请求数据
+     * @return API返回数据
+     * @throws Exception
+     */
+    public Map<String, String> unifiedOrder(Map<String, String> reqData) throws Exception {
+        return this.unifiedOrder(reqData, config.getHttpConnectTimeoutMs(), this.config.getHttpReadTimeoutMs());
+    }
+
+
+    /**
+     * 作用:统一下单<br>
+     * 场景:公共号支付、扫码支付、APP支付
+     *
+     * @param reqData          向wxpay post的请求数据
+     * @param connectTimeoutMs 连接超时时间,单位是毫秒
+     * @param readTimeoutMs    读超时时间,单位是毫秒
+     * @return API返回数据
+     * @throws Exception
+     */
+    public Map<String, String> unifiedOrder(Map<String, String> reqData, int connectTimeoutMs, int readTimeoutMs) throws Exception {
+        String url;
+        if (this.useSandbox) {
+            url = WXPayConstants.SANDBOX_UNIFIEDORDER_URL_SUFFIX;
+        } else {
+            url = WXPayConstants.UNIFIEDORDER_URL_SUFFIX;
+        }
+        if (this.notifyUrl != null) {
+            reqData.put("notify_url", this.notifyUrl);
+        }
+        String respXml = this.requestWithoutCert(url, this.fillRequestData(reqData), connectTimeoutMs, readTimeoutMs);
+        return this.processResponseXml(respXml);
+    }
+
+
+    /**
+     * 作用:查询订单<br>
+     * 场景:刷卡支付、公共号支付、扫码支付、APP支付
+     *
+     * @param reqData 向wxpay post的请求数据
+     * @return API返回数据
+     * @throws Exception
+     */
+    public Map<String, String> orderQuery(Map<String, String> reqData) throws Exception {
+        return this.orderQuery(reqData, config.getHttpConnectTimeoutMs(), this.config.getHttpReadTimeoutMs());
+    }
+
+
+    /**
+     * 作用:查询订单<br>
+     * 场景:刷卡支付、公共号支付、扫码支付、APP支付
+     *
+     * @param reqData          向wxpay post的请求数据 int
+     * @param connectTimeoutMs 连接超时时间,单位是毫秒
+     * @param readTimeoutMs    读超时时间,单位是毫秒
+     * @return API返回数据
+     * @throws Exception
+     */
+    public Map<String, String> orderQuery(Map<String, String> reqData, int connectTimeoutMs, int readTimeoutMs) throws Exception {
+        String url;
+        if (this.useSandbox) {
+            url = WXPayConstants.SANDBOX_ORDERQUERY_URL_SUFFIX;
+        } else {
+            url = WXPayConstants.ORDERQUERY_URL_SUFFIX;
+        }
+        String respXml = this.requestWithoutCert(url, this.fillRequestData(reqData), connectTimeoutMs, readTimeoutMs);
+        return this.processResponseXml(respXml);
+    }
+
+
+    /**
+     * 作用:撤销订单<br>
+     * 场景:刷卡支付
+     *
+     * @param reqData 向wxpay post的请求数据
+     * @return API返回数据
+     * @throws Exception
+     */
+    public Map<String, String> reverse(Map<String, String> reqData) throws Exception {
+        return this.reverse(reqData, config.getHttpConnectTimeoutMs(), this.config.getHttpReadTimeoutMs());
+    }
+
+
+    /**
+     * 作用:撤销订单<br>
+     * 场景:刷卡支付<br>
+     * 其他:需要证书
+     *
+     * @param reqData          向wxpay post的请求数据
+     * @param connectTimeoutMs 连接超时时间,单位是毫秒
+     * @param readTimeoutMs    读超时时间,单位是毫秒
+     * @return API返回数据
+     * @throws Exception
+     */
+    public Map<String, String> reverse(Map<String, String> reqData, int connectTimeoutMs, int readTimeoutMs) throws Exception {
+        String url;
+        if (this.useSandbox) {
+            url = WXPayConstants.SANDBOX_REVERSE_URL_SUFFIX;
+        } else {
+            url = WXPayConstants.REVERSE_URL_SUFFIX;
+        }
+        String respXml = this.requestWithCert(url, this.fillRequestData(reqData), connectTimeoutMs, readTimeoutMs);
+        return this.processResponseXml(respXml);
+    }
+
+
+    /**
+     * 作用:关闭订单<br>
+     * 场景:公共号支付、扫码支付、APP支付
+     *
+     * @param reqData 向wxpay post的请求数据
+     * @return API返回数据
+     * @throws Exception
+     */
+    public Map<String, String> closeOrder(Map<String, String> reqData) throws Exception {
+        return this.closeOrder(reqData, config.getHttpConnectTimeoutMs(), this.config.getHttpReadTimeoutMs());
+    }
+
+
+    /**
+     * 作用:关闭订单<br>
+     * 场景:公共号支付、扫码支付、APP支付
+     *
+     * @param reqData          向wxpay post的请求数据
+     * @param connectTimeoutMs 连接超时时间,单位是毫秒
+     * @param readTimeoutMs    读超时时间,单位是毫秒
+     * @return API返回数据
+     * @throws Exception
+     */
+    public Map<String, String> closeOrder(Map<String, String> reqData, int connectTimeoutMs, int readTimeoutMs) throws Exception {
+        String url;
+        if (this.useSandbox) {
+            url = WXPayConstants.SANDBOX_CLOSEORDER_URL_SUFFIX;
+        } else {
+            url = WXPayConstants.CLOSEORDER_URL_SUFFIX;
+        }
+        String respXml = this.requestWithoutCert(url, this.fillRequestData(reqData), connectTimeoutMs, readTimeoutMs);
+        return this.processResponseXml(respXml);
+    }
+
+
+    /**
+     * 作用:申请退款<br>
+     * 场景:刷卡支付、公共号支付、扫码支付、APP支付
+     *
+     * @param reqData 向wxpay post的请求数据
+     * @return API返回数据
+     * @throws Exception
+     */
+    public Map<String, String> refund(Map<String, String> reqData) throws Exception {
+        return this.refund(reqData, this.config.getHttpConnectTimeoutMs(), this.config.getHttpReadTimeoutMs());
+    }
+
+
+    /**
+     * 作用:申请退款<br>
+     * 场景:刷卡支付、公共号支付、扫码支付、APP支付<br>
+     * 其他:需要证书
+     *
+     * @param reqData          向wxpay post的请求数据
+     * @param connectTimeoutMs 连接超时时间,单位是毫秒
+     * @param readTimeoutMs    读超时时间,单位是毫秒
+     * @return API返回数据
+     * @throws Exception
+     */
+    public Map<String, String> refund(Map<String, String> reqData, int connectTimeoutMs, int readTimeoutMs) throws Exception {
+        String url;
+        if (this.useSandbox) {
+            url = WXPayConstants.SANDBOX_REFUND_URL_SUFFIX;
+        } else {
+            url = WXPayConstants.REFUND_URL_SUFFIX;
+        }
+        String respXml = this.requestWithCert(url, this.fillRequestData(reqData), connectTimeoutMs, readTimeoutMs);
+        return this.processResponseXml(respXml);
+    }
+
+
+    /**
+     * 作用:退款查询<br>
+     * 场景:刷卡支付、公共号支付、扫码支付、APP支付
+     *
+     * @param reqData 向wxpay post的请求数据
+     * @return API返回数据
+     * @throws Exception
+     */
+    public Map<String, String> refundQuery(Map<String, String> reqData) throws Exception {
+        return this.refundQuery(reqData, this.config.getHttpConnectTimeoutMs(), this.config.getHttpReadTimeoutMs());
+    }
+
+
+    /**
+     * 作用:退款查询<br>
+     * 场景:刷卡支付、公共号支付、扫码支付、APP支付
+     *
+     * @param reqData          向wxpay post的请求数据
+     * @param connectTimeoutMs 连接超时时间,单位是毫秒
+     * @param readTimeoutMs    读超时时间,单位是毫秒
+     * @return API返回数据
+     * @throws Exception
+     */
+    public Map<String, String> refundQuery(Map<String, String> reqData, int connectTimeoutMs, int readTimeoutMs) throws Exception {
+        String url;
+        if (this.useSandbox) {
+            url = WXPayConstants.SANDBOX_REFUNDQUERY_URL_SUFFIX;
+        } else {
+            url = WXPayConstants.REFUNDQUERY_URL_SUFFIX;
+        }
+        String respXml = this.requestWithoutCert(url, this.fillRequestData(reqData), connectTimeoutMs, readTimeoutMs);
+        return this.processResponseXml(respXml);
+    }
+
+
+    /**
+     * 作用:对账单下载(成功时返回对账单数据,失败时返回XML格式数据)<br>
+     * 场景:刷卡支付、公共号支付、扫码支付、APP支付
+     *
+     * @param reqData 向wxpay post的请求数据
+     * @return API返回数据
+     * @throws Exception
+     */
+    public Map<String, String> downloadBill(Map<String, String> reqData) throws Exception {
+        return this.downloadBill(reqData, this.config.getHttpConnectTimeoutMs(), this.config.getHttpReadTimeoutMs());
+    }
+
+
+    /**
+     * 作用:对账单下载<br>
+     * 场景:刷卡支付、公共号支付、扫码支付、APP支付<br>
+     * 其他:无论是否成功都返回Map。若成功,返回的Map中含有return_code、return_msg、data,
+     * 其中return_code为`SUCCESS`,data为对账单数据。
+     *
+     * @param reqData          向wxpay post的请求数据
+     * @param connectTimeoutMs 连接超时时间,单位是毫秒
+     * @param readTimeoutMs    读超时时间,单位是毫秒
+     * @return 经过封装的API返回数据
+     * @throws Exception
+     */
+    public Map<String, String> downloadBill(Map<String, String> reqData, int connectTimeoutMs, int readTimeoutMs) throws Exception {
+        String url;
+        if (this.useSandbox) {
+            url = WXPayConstants.SANDBOX_DOWNLOADBILL_URL_SUFFIX;
+        } else {
+            url = WXPayConstants.DOWNLOADBILL_URL_SUFFIX;
+        }
+        String respStr = this.requestWithoutCert(url, this.fillRequestData(reqData), connectTimeoutMs, readTimeoutMs).trim();
+        Map<String, String> ret;
+        // 出现错误,返回XML数据
+        if (respStr.indexOf("<") == 0) {
+            ret = WXPayUtil.xmlToMap(respStr);
+        } else {
+            // 正常返回csv数据
+            ret = new HashMap<String, String>();
+            ret.put("return_code", WXPayConstants.SUCCESS);
+            ret.put("return_msg", "ok");
+            ret.put("data", respStr);
+        }
+        return ret;
+    }
+
+
+    /**
+     * 作用:交易保障<br>
+     * 场景:刷卡支付、公共号支付、扫码支付、APP支付
+     *
+     * @param reqData 向wxpay post的请求数据
+     * @return API返回数据
+     * @throws Exception
+     */
+    public Map<String, String> report(Map<String, String> reqData) throws Exception {
+        return this.report(reqData, this.config.getHttpConnectTimeoutMs(), this.config.getHttpReadTimeoutMs());
+    }
+
+
+    /**
+     * 作用:交易保障<br>
+     * 场景:刷卡支付、公共号支付、扫码支付、APP支付
+     *
+     * @param reqData          向wxpay post的请求数据
+     * @param connectTimeoutMs 连接超时时间,单位是毫秒
+     * @param readTimeoutMs    读超时时间,单位是毫秒
+     * @return API返回数据
+     * @throws Exception
+     */
+    public Map<String, String> report(Map<String, String> reqData, int connectTimeoutMs, int readTimeoutMs) throws Exception {
+        String url;
+        if (this.useSandbox) {
+            url = WXPayConstants.SANDBOX_REPORT_URL_SUFFIX;
+        } else {
+            url = WXPayConstants.REPORT_URL_SUFFIX;
+        }
+        String respXml = this.requestWithoutCert(url, this.fillRequestData(reqData), connectTimeoutMs, readTimeoutMs);
+        return WXPayUtil.xmlToMap(respXml);
+    }
+
+
+    /**
+     * 作用:转换短链接<br>
+     * 场景:刷卡支付、扫码支付
+     *
+     * @param reqData 向wxpay post的请求数据
+     * @return API返回数据
+     * @throws Exception
+     */
+    public Map<String, String> shortUrl(Map<String, String> reqData) throws Exception {
+        return this.shortUrl(reqData, this.config.getHttpConnectTimeoutMs(), this.config.getHttpReadTimeoutMs());
+    }
+
+
+    /**
+     * 作用:转换短链接<br>
+     * 场景:刷卡支付、扫码支付
+     *
+     * @param reqData 向wxpay post的请求数据
+     * @return API返回数据
+     * @throws Exception
+     */
+    public Map<String, String> shortUrl(Map<String, String> reqData, int connectTimeoutMs, int readTimeoutMs) throws Exception {
+        String url;
+        if (this.useSandbox) {
+            url = WXPayConstants.SANDBOX_SHORTURL_URL_SUFFIX;
+        } else {
+            url = WXPayConstants.SHORTURL_URL_SUFFIX;
+        }
+        String respXml = this.requestWithoutCert(url, this.fillRequestData(reqData), connectTimeoutMs, readTimeoutMs);
+        return this.processResponseXml(respXml);
+    }
+
+
+    /**
+     * 作用:授权码查询OPENID接口<br>
+     * 场景:刷卡支付
+     *
+     * @param reqData 向wxpay post的请求数据
+     * @return API返回数据
+     * @throws Exception
+     */
+    public Map<String, String> authCodeToOpenid(Map<String, String> reqData) throws Exception {
+        return this.authCodeToOpenid(reqData, this.config.getHttpConnectTimeoutMs(), this.config.getHttpReadTimeoutMs());
+    }
+
+
+    /**
+     * 作用:授权码查询OPENID接口<br>
+     * 场景:刷卡支付
+     *
+     * @param reqData          向wxpay post的请求数据
+     * @param connectTimeoutMs 连接超时时间,单位是毫秒
+     * @param readTimeoutMs    读超时时间,单位是毫秒
+     * @return API返回数据
+     * @throws Exception
+     */
+    public Map<String, String> authCodeToOpenid(Map<String, String> reqData, int connectTimeoutMs, int readTimeoutMs) throws Exception {
+        String url;
+        if (this.useSandbox) {
+            url = WXPayConstants.SANDBOX_AUTHCODETOOPENID_URL_SUFFIX;
+        } else {
+            url = WXPayConstants.AUTHCODETOOPENID_URL_SUFFIX;
+        }
+        String respXml = this.requestWithoutCert(url, this.fillRequestData(reqData), connectTimeoutMs, readTimeoutMs);
+        return this.processResponseXml(respXml);
+    }
+
+
+} // end class

+ 103 - 0
src/main/java/com/wxpay/zhuanz/WXPayConfig.java

@@ -0,0 +1,103 @@
+package com.wxpay.zhuanz;
+
+import java.io.InputStream;
+
+public abstract class WXPayConfig {
+
+
+    /**
+     * 获取 App ID
+     *
+     * @return App ID
+     */
+    abstract String getAppID();
+
+
+    /**
+     * 获取 Mch ID
+     *
+     * @return Mch ID
+     */
+    abstract String getMchID();
+
+
+    /**
+     * 获取 API 密钥
+     *
+     * @return API密钥
+     */
+    abstract String getKey();
+
+
+    /**
+     * 获取商户证书内容
+     *
+     * @return 商户证书内容
+     */
+    abstract InputStream getCertStream();
+
+    /**
+     * HTTP(S) 连接超时时间,单位毫秒
+     *
+     * @return
+     */
+    public int getHttpConnectTimeoutMs() {
+        return 6 * 1000;
+    }
+
+    /**
+     * HTTP(S) 读数据超时时间,单位毫秒
+     *
+     * @return
+     */
+    public int getHttpReadTimeoutMs() {
+        return 8 * 1000;
+    }
+
+    /**
+     * 获取WXPayDomain, 用于多域名容灾自动切换
+     *
+     * @return
+     */
+    abstract IWXPayDomain getWXPayDomain();
+
+    /**
+     * 是否自动上报。
+     * 若要关闭自动上报,子类中实现该函数返回 false 即可。
+     *
+     * @return
+     */
+    public boolean shouldAutoReport() {
+        return true;
+    }
+
+    /**
+     * 进行健康上报的线程的数量
+     *
+     * @return
+     */
+    public int getReportWorkerNum() {
+        return 6;
+    }
+
+
+    /**
+     * 健康上报缓存消息的最大数量。会有线程去独立上报
+     * 粗略计算:加入一条消息200B,10000消息占用空间 2000 KB,约为2MB,可以接受
+     *
+     * @return
+     */
+    public int getReportQueueMaxSize() {
+        return 10000;
+    }
+
+    /**
+     * 批量上报,一次最多上报多个数据
+     *
+     * @return
+     */
+    public int getReportBatchSize() {
+        return 10;
+    }
+
+}

+ 59 - 0
src/main/java/com/wxpay/zhuanz/WXPayConstants.java

@@ -0,0 +1,59 @@
+package com.wxpay.zhuanz;
+
+import org.apache.http.client.HttpClient;
+
+/**
+ * 常量
+ */
+public class WXPayConstants {
+
+    public enum SignType {
+        MD5, HMACSHA256
+    }
+
+    public static final String DOMAIN_API = "api.mch.weixin.qq.com";
+    public static final String DOMAIN_API2 = "api2.mch.weixin.qq.com";
+    public static final String DOMAIN_APIHK = "apihk.mch.weixin.qq.com";
+    public static final String DOMAIN_APIUS = "apius.mch.weixin.qq.com";
+
+
+    public static final String FAIL     = "FAIL";
+    public static final String SUCCESS  = "SUCCESS";
+    public static final String HMACSHA256 = "HMAC-SHA256";
+    public static final String MD5 = "MD5";
+
+    public static final String FIELD_SIGN = "sign";
+    public static final String FIELD_SIGN_TYPE = "sign_type";
+
+    public static final String WXPAYSDK_VERSION = "WXPaySDK/3.0.9";
+    public static final String USER_AGENT = WXPAYSDK_VERSION +
+            " (" + System.getProperty("os.arch") + " " + System.getProperty("os.name") + " " + System.getProperty("os.version") +
+            ") Java/" + System.getProperty("java.version") + " HttpClient/" + HttpClient.class.getPackage().getImplementationVersion();
+
+    public static final String MICROPAY_URL_SUFFIX     = "/pay/micropay";
+    public static final String UNIFIEDORDER_URL_SUFFIX = "/pay/unifiedorder";
+    public static final String ORDERQUERY_URL_SUFFIX   = "/pay/orderquery";
+    public static final String REVERSE_URL_SUFFIX      = "/secapi/pay/reverse";
+    public static final String CLOSEORDER_URL_SUFFIX   = "/pay/closeorder";
+    public static final String REFUND_URL_SUFFIX       = "/secapi/pay/refund";
+    public static final String REFUNDQUERY_URL_SUFFIX  = "/pay/refundquery";
+    public static final String DOWNLOADBILL_URL_SUFFIX = "/pay/downloadbill";
+    public static final String REPORT_URL_SUFFIX       = "/payitil/report";
+    public static final String SHORTURL_URL_SUFFIX     = "/tools/shorturl";
+    public static final String AUTHCODETOOPENID_URL_SUFFIX = "/tools/authcodetoopenid";
+
+    // sandbox
+    public static final String SANDBOX_MICROPAY_URL_SUFFIX     = "/sandboxnew/pay/micropay";
+    public static final String SANDBOX_UNIFIEDORDER_URL_SUFFIX = "/sandboxnew/pay/unifiedorder";
+    public static final String SANDBOX_ORDERQUERY_URL_SUFFIX   = "/sandboxnew/pay/orderquery";
+    public static final String SANDBOX_REVERSE_URL_SUFFIX      = "/sandboxnew/secapi/pay/reverse";
+    public static final String SANDBOX_CLOSEORDER_URL_SUFFIX   = "/sandboxnew/pay/closeorder";
+    public static final String SANDBOX_REFUND_URL_SUFFIX       = "/sandboxnew/secapi/pay/refund";
+    public static final String SANDBOX_REFUNDQUERY_URL_SUFFIX  = "/sandboxnew/pay/refundquery";
+    public static final String SANDBOX_DOWNLOADBILL_URL_SUFFIX = "/sandboxnew/pay/downloadbill";
+    public static final String SANDBOX_REPORT_URL_SUFFIX       = "/sandboxnew/payitil/report";
+    public static final String SANDBOX_SHORTURL_URL_SUFFIX     = "/sandboxnew/tools/shorturl";
+    public static final String SANDBOX_AUTHCODETOOPENID_URL_SUFFIX = "/sandboxnew/tools/authcodetoopenid";
+
+}
+

+ 265 - 0
src/main/java/com/wxpay/zhuanz/WXPayReport.java

@@ -0,0 +1,265 @@
+package com.wxpay.zhuanz;
+
+import org.apache.http.HttpEntity;
+import org.apache.http.HttpResponse;
+import org.apache.http.client.HttpClient;
+import org.apache.http.client.config.RequestConfig;
+import org.apache.http.client.methods.HttpPost;
+import org.apache.http.config.RegistryBuilder;
+import org.apache.http.conn.socket.ConnectionSocketFactory;
+import org.apache.http.conn.socket.PlainConnectionSocketFactory;
+import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
+import org.apache.http.entity.StringEntity;
+import org.apache.http.impl.client.HttpClientBuilder;
+import org.apache.http.impl.conn.BasicHttpClientConnectionManager;
+import org.apache.http.util.EntityUtils;
+
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.LinkedBlockingQueue;
+import java.util.concurrent.ThreadFactory;
+
+/**
+ * 交易保障
+ */
+public class WXPayReport {
+
+    public static class ReportInfo {
+
+        /**
+         * 布尔变量使用int0false1true
+         */
+
+        // 基本信息
+        private String version = "v1";
+        private String sdk = WXPayConstants.WXPAYSDK_VERSION;
+        private String uuid;  // 交易的标识
+        private long timestamp;   // 上报时的时间戳,单位秒
+        private long elapsedTimeMillis; // 耗时,单位 毫秒
+
+        // 针对主域名
+        private String firstDomain;  // 第1次请求的域名
+        private boolean primaryDomain; //是否主域名
+        private int firstConnectTimeoutMillis;  // 第1次请求设置的连接超时时间,单位 毫秒
+        private int firstReadTimeoutMillis;  // 第1次请求设置的读写超时时间,单位 毫秒
+        private int firstHasDnsError;  // 第1次请求是否出现dns问题
+        private int firstHasConnectTimeout; // 第1次请求是否出现连接超时
+        private int firstHasReadTimeout; // 第1次请求是否出现连接超时
+
+        public ReportInfo(String uuid, long timestamp, long elapsedTimeMillis, String firstDomain, boolean primaryDomain, int firstConnectTimeoutMillis, int firstReadTimeoutMillis, boolean firstHasDnsError, boolean firstHasConnectTimeout, boolean firstHasReadTimeout) {
+            this.uuid = uuid;
+            this.timestamp = timestamp;
+            this.elapsedTimeMillis = elapsedTimeMillis;
+            this.firstDomain = firstDomain;
+            this.primaryDomain = primaryDomain;
+            this.firstConnectTimeoutMillis = firstConnectTimeoutMillis;
+            this.firstReadTimeoutMillis = firstReadTimeoutMillis;
+            this.firstHasDnsError = firstHasDnsError?1:0;
+            this.firstHasConnectTimeout = firstHasConnectTimeout?1:0;
+            this.firstHasReadTimeout = firstHasReadTimeout?1:0;
+         }
+
+        @Override
+        public String toString() {
+            return "ReportInfo{" +
+                    "version='" + version + '\'' +
+                    ", sdk='" + sdk + '\'' +
+                    ", uuid='" + uuid + '\'' +
+                    ", timestamp=" + timestamp +
+                    ", elapsedTimeMillis=" + elapsedTimeMillis +
+                    ", firstDomain='" + firstDomain + '\'' +
+                    ", primaryDomain=" + primaryDomain +
+                    ", firstConnectTimeoutMillis=" + firstConnectTimeoutMillis +
+                    ", firstReadTimeoutMillis=" + firstReadTimeoutMillis +
+                    ", firstHasDnsError=" + firstHasDnsError +
+                    ", firstHasConnectTimeout=" + firstHasConnectTimeout +
+                    ", firstHasReadTimeout=" + firstHasReadTimeout +
+                    '}';
+        }
+
+        /**
+         * 转换成 csv 格式
+         *
+         * @return
+         */
+        public String toLineString(String key) {
+            String separator = ",";
+            Object[] objects = new Object[] {
+                version, sdk, uuid, timestamp, elapsedTimeMillis,
+                    firstDomain, primaryDomain, firstConnectTimeoutMillis, firstReadTimeoutMillis,
+                    firstHasDnsError, firstHasConnectTimeout, firstHasReadTimeout
+            };
+            StringBuffer sb = new StringBuffer();
+            for(Object obj: objects) {
+                sb.append(obj).append(separator);
+            }
+            try {
+                String sign = WXPayUtil.HMACSHA256(sb.toString(), key);
+                sb.append(sign);
+                return sb.toString();
+            }
+            catch (Exception ex) {
+                return null;
+            }
+
+        }
+
+    }
+
+    private static final String REPORT_URL = "http://report.mch.weixin.qq.com/wxpay/report/default";
+    // private static final String REPORT_URL = "http://127.0.0.1:5000/test";
+
+
+    private static final int DEFAULT_CONNECT_TIMEOUT_MS = 6*1000;
+    private static final int DEFAULT_READ_TIMEOUT_MS = 8*1000;
+
+    private LinkedBlockingQueue<String> reportMsgQueue = null;
+    private WXPayConfig config;
+    private ExecutorService executorService;
+
+    private volatile static WXPayReport INSTANCE;
+
+    private WXPayReport(final WXPayConfig config) {
+        this.config = config;
+        reportMsgQueue = new LinkedBlockingQueue<String>(config.getReportQueueMaxSize());
+
+        // 添加处理线程
+        executorService = Executors.newFixedThreadPool(config.getReportWorkerNum(), new ThreadFactory() {
+            public Thread newThread(Runnable r) {
+                Thread t = Executors.defaultThreadFactory().newThread(r);
+                t.setDaemon(true);
+                return t;
+            }
+        });
+
+        if (config.shouldAutoReport()) {
+            WXPayUtil.getLogger().info("report worker num: {}", config.getReportWorkerNum());
+            for (int i = 0; i < config.getReportWorkerNum(); ++i) {
+                executorService.execute(new Runnable() {
+                    public void run() {
+                        while (true) {
+                            // 先用 take 获取数据
+                            try {
+                                StringBuffer sb = new StringBuffer();
+                                String firstMsg = reportMsgQueue.take();
+                                WXPayUtil.getLogger().info("get first report msg: {}", firstMsg);
+                                String msg = null;
+                                sb.append(firstMsg); //会阻塞至有消息
+                                int remainNum = config.getReportBatchSize() - 1;
+                                for (int j=0; j<remainNum; ++j) {
+                                    WXPayUtil.getLogger().info("try get remain report msg");
+                                    // msg = reportMsgQueue.poll();  // 不阻塞了
+                                    msg = reportMsgQueue.take();
+                                    WXPayUtil.getLogger().info("get remain report msg: {}", msg);
+                                    if (msg == null) {
+                                        break;
+                                    }
+                                    else {
+                                        sb.append("\n");
+                                        sb.append(msg);
+                                    }
+                                }
+                                // 上报
+                                WXPayReport.httpRequest(sb.toString(), DEFAULT_CONNECT_TIMEOUT_MS, DEFAULT_READ_TIMEOUT_MS);
+                            }
+                            catch (Exception ex) {
+                                WXPayUtil.getLogger().warn("report fail. reason: {}", ex.getMessage());
+                            }
+                        }
+                    }
+                });
+            }
+        }
+
+    }
+
+    /**
+     * 单例,双重校验,请在 JDK 1.5及更高版本中使用
+     *
+     * @param config
+     * @return
+     */
+    public static WXPayReport getInstance(WXPayConfig config) {
+        if (INSTANCE == null) {
+            synchronized (WXPayReport.class) {
+                if (INSTANCE == null) {
+                    INSTANCE = new WXPayReport(config);
+                }
+            }
+        }
+        return INSTANCE;
+    }
+
+    public void report(String uuid, long elapsedTimeMillis,
+                       String firstDomain, boolean primaryDomain, int firstConnectTimeoutMillis, int firstReadTimeoutMillis,
+                       boolean firstHasDnsError, boolean firstHasConnectTimeout, boolean firstHasReadTimeout) {
+        long currentTimestamp = WXPayUtil.getCurrentTimestamp();
+        ReportInfo reportInfo = new ReportInfo(uuid, currentTimestamp, elapsedTimeMillis,
+                firstDomain, primaryDomain, firstConnectTimeoutMillis, firstReadTimeoutMillis,
+                firstHasDnsError, firstHasConnectTimeout, firstHasReadTimeout);
+        String data = reportInfo.toLineString(config.getKey());
+        WXPayUtil.getLogger().info("report {}", data);
+        if (data != null) {
+            reportMsgQueue.offer(data);
+        }
+    }
+
+
+    @Deprecated
+    private void reportSync(final String data) throws Exception {
+        httpRequest(data, DEFAULT_CONNECT_TIMEOUT_MS, DEFAULT_READ_TIMEOUT_MS);
+    }
+
+    @Deprecated
+    private void reportAsync(final String data) throws Exception {
+        new Thread(new Runnable() {
+            public void run() {
+                try {
+                    httpRequest(data, DEFAULT_CONNECT_TIMEOUT_MS, DEFAULT_READ_TIMEOUT_MS);
+                }
+                catch (Exception ex) {
+                    WXPayUtil.getLogger().warn("report fail. reason: {}", ex.getMessage());
+                }
+            }
+        }).start();
+    }
+
+    /**
+     * http 请求
+     * @param data
+     * @param connectTimeoutMs
+     * @param readTimeoutMs
+     * @return
+     * @throws Exception
+     */
+    private static String httpRequest(String data, int connectTimeoutMs, int readTimeoutMs) throws Exception{
+        BasicHttpClientConnectionManager connManager;
+        connManager = new BasicHttpClientConnectionManager(
+                RegistryBuilder.<ConnectionSocketFactory>create()
+                        .register("http", PlainConnectionSocketFactory.getSocketFactory())
+                        .register("https", SSLConnectionSocketFactory.getSocketFactory())
+                        .build(),
+                null,
+                null,
+                null
+        );
+        HttpClient httpClient = HttpClientBuilder.create()
+                .setConnectionManager(connManager)
+                .build();
+
+        HttpPost httpPost = new HttpPost(REPORT_URL);
+
+        RequestConfig requestConfig = RequestConfig.custom().setSocketTimeout(readTimeoutMs).setConnectTimeout(connectTimeoutMs).build();
+        httpPost.setConfig(requestConfig);
+
+        StringEntity postEntity = new StringEntity(data, "UTF-8");
+        httpPost.addHeader("Content-Type", "text/xml");
+        httpPost.addHeader("User-Agent", WXPayConstants.USER_AGENT);
+        httpPost.setEntity(postEntity);
+
+        HttpResponse httpResponse = httpClient.execute(httpPost);
+        HttpEntity httpEntity = httpResponse.getEntity();
+        return EntityUtils.toString(httpEntity, "UTF-8");
+    }
+
+}

+ 260 - 0
src/main/java/com/wxpay/zhuanz/WXPayRequest.java

@@ -0,0 +1,260 @@
+package com.wxpay.zhuanz;
+
+import org.apache.http.HttpEntity;
+import org.apache.http.HttpResponse;
+import org.apache.http.client.HttpClient;
+import org.apache.http.client.config.RequestConfig;
+import org.apache.http.client.methods.HttpPost;
+import org.apache.http.config.RegistryBuilder;
+import org.apache.http.conn.ConnectTimeoutException;
+import org.apache.http.conn.socket.ConnectionSocketFactory;
+import org.apache.http.conn.socket.PlainConnectionSocketFactory;
+import org.apache.http.conn.ssl.DefaultHostnameVerifier;
+import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
+import org.apache.http.entity.StringEntity;
+import org.apache.http.impl.client.HttpClientBuilder;
+import org.apache.http.impl.conn.BasicHttpClientConnectionManager;
+import org.apache.http.util.EntityUtils;
+
+import javax.net.ssl.KeyManagerFactory;
+import javax.net.ssl.SSLContext;
+import java.io.InputStream;
+import java.net.SocketTimeoutException;
+import java.net.UnknownHostException;
+import java.security.KeyStore;
+import java.security.SecureRandom;
+
+import static com.wxpay.zhuanz.WXPayConstants.USER_AGENT;
+
+
+public class WXPayRequest {
+    private WXPayConfig config;
+
+    public WXPayRequest(WXPayConfig config) throws Exception {
+
+        this.config = config;
+    }
+
+    /**
+     * 请求,只请求一次,不做重试
+     *
+     * @param domain
+     * @param urlSuffix
+     * @param uuid
+     * @param data
+     * @param connectTimeoutMs
+     * @param readTimeoutMs
+     * @param useCert          是否使用证书,针对退款、撤销等操作
+     * @return
+     * @throws Exception
+     */
+    private String requestOnce(final String domain, String urlSuffix, String uuid, String data, int connectTimeoutMs, int readTimeoutMs, boolean useCert) throws Exception {
+        BasicHttpClientConnectionManager connManager;
+        if (useCert) {
+            // 证书
+            char[] password = config.getMchID().toCharArray();
+            InputStream certStream = config.getCertStream();
+            KeyStore ks = KeyStore.getInstance("PKCS12");
+            ks.load(certStream, password);
+
+            // 实例化密钥库 & 初始化密钥工厂
+            KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
+            kmf.init(ks, password);
+
+            // 创建 SSLContext
+            SSLContext sslContext = SSLContext.getInstance("TLS");
+            sslContext.init(kmf.getKeyManagers(), null, new SecureRandom());
+
+            SSLConnectionSocketFactory sslConnectionSocketFactory = new SSLConnectionSocketFactory(
+                    sslContext,
+                    new String[]{"TLSv1"},
+                    null,
+                    new DefaultHostnameVerifier());
+
+            connManager = new BasicHttpClientConnectionManager(
+                    RegistryBuilder.<ConnectionSocketFactory>create()
+                            .register("http", PlainConnectionSocketFactory.getSocketFactory())
+                            .register("https", sslConnectionSocketFactory)
+                            .build(),
+                    null,
+                    null,
+                    null
+            );
+        } else {
+            connManager = new BasicHttpClientConnectionManager(
+                    RegistryBuilder.<ConnectionSocketFactory>create()
+                            .register("http", PlainConnectionSocketFactory.getSocketFactory())
+                            .register("https", SSLConnectionSocketFactory.getSocketFactory())
+                            .build(),
+                    null,
+                    null,
+                    null
+            );
+        }
+
+        HttpClient httpClient = HttpClientBuilder.create()
+                .setConnectionManager(connManager)
+                .build();
+
+        String url = "https://" + domain + urlSuffix;
+        HttpPost httpPost = new HttpPost(url);
+
+        RequestConfig requestConfig = RequestConfig.custom().setSocketTimeout(readTimeoutMs).setConnectTimeout(connectTimeoutMs).build();
+        httpPost.setConfig(requestConfig);
+
+        StringEntity postEntity = new StringEntity(data, "UTF-8");
+        httpPost.addHeader("Content-Type", "text/xml");
+        httpPost.addHeader("User-Agent", USER_AGENT + " " + config.getMchID());
+        httpPost.setEntity(postEntity);
+
+        HttpResponse httpResponse = httpClient.execute(httpPost);
+        HttpEntity httpEntity = httpResponse.getEntity();
+        return EntityUtils.toString(httpEntity, "UTF-8");
+
+    }
+
+
+    private String request(String urlSuffix, String uuid, String data, int connectTimeoutMs, int readTimeoutMs, boolean useCert, boolean autoReport) throws Exception {
+        Exception exception = null;
+        long elapsedTimeMillis = 0;
+        long startTimestampMs = WXPayUtil.getCurrentTimestampMs();
+        boolean firstHasDnsErr = false;
+        boolean firstHasConnectTimeout = false;
+        boolean firstHasReadTimeout = false;
+        IWXPayDomain.DomainInfo domainInfo = config.getWXPayDomain().getDomain(config);
+        if (domainInfo == null) {
+            throw new Exception("WXPayConfig.getWXPayDomain().getDomain() is empty or null");
+        }
+        try {
+            String result = requestOnce(domainInfo.domain, urlSuffix, uuid, data, connectTimeoutMs, readTimeoutMs, useCert);
+            elapsedTimeMillis = WXPayUtil.getCurrentTimestampMs() - startTimestampMs;
+            config.getWXPayDomain().report(domainInfo.domain, elapsedTimeMillis, null);
+            WXPayReport.getInstance(config).report(
+                    uuid,
+                    elapsedTimeMillis,
+                    domainInfo.domain,
+                    domainInfo.primaryDomain,
+                    connectTimeoutMs,
+                    readTimeoutMs,
+                    firstHasDnsErr,
+                    firstHasConnectTimeout,
+                    firstHasReadTimeout);
+            return result;
+        } catch (UnknownHostException ex) {  // dns 解析错误,或域名不存在
+            exception = ex;
+            firstHasDnsErr = true;
+            elapsedTimeMillis = WXPayUtil.getCurrentTimestampMs() - startTimestampMs;
+            WXPayUtil.getLogger().warn("UnknownHostException for domainInfo {}", domainInfo);
+            WXPayReport.getInstance(config).report(
+                    uuid,
+                    elapsedTimeMillis,
+                    domainInfo.domain,
+                    domainInfo.primaryDomain,
+                    connectTimeoutMs,
+                    readTimeoutMs,
+                    firstHasDnsErr,
+                    firstHasConnectTimeout,
+                    firstHasReadTimeout
+            );
+        } catch (ConnectTimeoutException ex) {
+            exception = ex;
+            firstHasConnectTimeout = true;
+            elapsedTimeMillis = WXPayUtil.getCurrentTimestampMs() - startTimestampMs;
+            WXPayUtil.getLogger().warn("connect timeout happened for domainInfo {}", domainInfo);
+            WXPayReport.getInstance(config).report(
+                    uuid,
+                    elapsedTimeMillis,
+                    domainInfo.domain,
+                    domainInfo.primaryDomain,
+                    connectTimeoutMs,
+                    readTimeoutMs,
+                    firstHasDnsErr,
+                    firstHasConnectTimeout,
+                    firstHasReadTimeout
+            );
+        } catch (SocketTimeoutException ex) {
+            exception = ex;
+            firstHasReadTimeout = true;
+            elapsedTimeMillis = WXPayUtil.getCurrentTimestampMs() - startTimestampMs;
+            WXPayUtil.getLogger().warn("timeout happened for domainInfo {}", domainInfo);
+            WXPayReport.getInstance(config).report(
+                    uuid,
+                    elapsedTimeMillis,
+                    domainInfo.domain,
+                    domainInfo.primaryDomain,
+                    connectTimeoutMs,
+                    readTimeoutMs,
+                    firstHasDnsErr,
+                    firstHasConnectTimeout,
+                    firstHasReadTimeout);
+        } catch (Exception ex) {
+            exception = ex;
+            elapsedTimeMillis = WXPayUtil.getCurrentTimestampMs() - startTimestampMs;
+            WXPayReport.getInstance(config).report(
+                    uuid,
+                    elapsedTimeMillis,
+                    domainInfo.domain,
+                    domainInfo.primaryDomain,
+                    connectTimeoutMs,
+                    readTimeoutMs,
+                    firstHasDnsErr,
+                    firstHasConnectTimeout,
+                    firstHasReadTimeout);
+        }
+        config.getWXPayDomain().report(domainInfo.domain, elapsedTimeMillis, exception);
+        throw exception;
+    }
+
+
+    /**
+     * 可重试的,非双向认证的请求
+     *
+     * @param urlSuffix
+     * @param uuid
+     * @param data
+     * @return
+     */
+    public String requestWithoutCert(String urlSuffix, String uuid, String data, boolean autoReport) throws Exception {
+        return this.request(urlSuffix, uuid, data, config.getHttpConnectTimeoutMs(), config.getHttpReadTimeoutMs(), false, autoReport);
+    }
+
+    /**
+     * 可重试的,非双向认证的请求
+     *
+     * @param urlSuffix
+     * @param uuid
+     * @param data
+     * @param connectTimeoutMs
+     * @param readTimeoutMs
+     * @return
+     */
+    public String requestWithoutCert(String urlSuffix, String uuid, String data, int connectTimeoutMs, int readTimeoutMs, boolean autoReport) throws Exception {
+        return this.request(urlSuffix, uuid, data, connectTimeoutMs, readTimeoutMs, false, autoReport);
+    }
+
+    /**
+     * 可重试的,双向认证的请求
+     *
+     * @param urlSuffix
+     * @param uuid
+     * @param data
+     * @return
+     */
+    public String requestWithCert(String urlSuffix, String uuid, String data, boolean autoReport) throws Exception {
+        return this.request(urlSuffix, uuid, data, config.getHttpConnectTimeoutMs(), config.getHttpReadTimeoutMs(), true, autoReport);
+    }
+
+    /**
+     * 可重试的,双向认证的请求
+     *
+     * @param urlSuffix
+     * @param uuid
+     * @param data
+     * @param connectTimeoutMs
+     * @param readTimeoutMs
+     * @return
+     */
+    public String requestWithCert(String urlSuffix, String uuid, String data, int connectTimeoutMs, int readTimeoutMs, boolean autoReport) throws Exception {
+        return this.request(urlSuffix, uuid, data, connectTimeoutMs, readTimeoutMs, true, autoReport);
+    }
+}

+ 295 - 0
src/main/java/com/wxpay/zhuanz/WXPayUtil.java

@@ -0,0 +1,295 @@
+package com.wxpay.zhuanz;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+
+import javax.crypto.Mac;
+import javax.crypto.spec.SecretKeySpec;
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.transform.OutputKeys;
+import javax.xml.transform.Transformer;
+import javax.xml.transform.TransformerFactory;
+import javax.xml.transform.dom.DOMSource;
+import javax.xml.transform.stream.StreamResult;
+import java.io.ByteArrayInputStream;
+import java.io.InputStream;
+import java.io.StringWriter;
+import java.security.MessageDigest;
+import java.security.SecureRandom;
+import java.util.*;
+
+
+public class WXPayUtil {
+
+    private static final String SYMBOLS = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
+
+    private static final Random RANDOM = new SecureRandom();
+
+    /**
+     * XML格式字符串转换为Map
+     *
+     * @param strXML XML字符串
+     * @return XML数据转换后的Map
+     * @throws Exception
+     */
+    public static Map<String, String> xmlToMap(String strXML) throws Exception {
+        try {
+            Map<String, String> data = new HashMap<String, String>();
+            DocumentBuilder documentBuilder = WXPayXmlUtil.newDocumentBuilder();
+            InputStream stream = new ByteArrayInputStream(strXML.getBytes("UTF-8"));
+            org.w3c.dom.Document doc = documentBuilder.parse(stream);
+            doc.getDocumentElement().normalize();
+            NodeList nodeList = doc.getDocumentElement().getChildNodes();
+            for (int idx = 0; idx < nodeList.getLength(); ++idx) {
+                Node node = nodeList.item(idx);
+                if (node.getNodeType() == Node.ELEMENT_NODE) {
+                    org.w3c.dom.Element element = (org.w3c.dom.Element) node;
+                    data.put(element.getNodeName(), element.getTextContent());
+                }
+            }
+            try {
+                stream.close();
+            } catch (Exception ex) {
+                // do nothing
+            }
+            return data;
+        } catch (Exception ex) {
+            WXPayUtil.getLogger().warn("Invalid XML, can not convert to map. Error message: {}. XML content: {}", ex.getMessage(), strXML);
+            throw ex;
+        }
+
+    }
+
+    /**
+     * 将Map转换为XML格式的字符串
+     *
+     * @param data Map类型数据
+     * @return XML格式的字符串
+     * @throws Exception
+     */
+    public static String mapToXml(Map<String, String> data) throws Exception {
+        org.w3c.dom.Document document = WXPayXmlUtil.newDocument();
+        org.w3c.dom.Element root = document.createElement("xml");
+        document.appendChild(root);
+        for (String key : data.keySet()) {
+            String value = data.get(key);
+            if (value == null) {
+                value = "";
+            }
+            value = value.trim();
+            org.w3c.dom.Element filed = document.createElement(key);
+            filed.appendChild(document.createTextNode(value));
+            root.appendChild(filed);
+        }
+        TransformerFactory tf = TransformerFactory.newInstance();
+        Transformer transformer = tf.newTransformer();
+        DOMSource source = new DOMSource(document);
+        transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
+        transformer.setOutputProperty(OutputKeys.INDENT, "yes");
+        StringWriter writer = new StringWriter();
+        StreamResult result = new StreamResult(writer);
+        transformer.transform(source, result);
+        String output = writer.getBuffer().toString(); //.replaceAll("\n|\r", "");
+        try {
+            writer.close();
+        } catch (Exception ex) {
+        }
+        return output;
+    }
+
+
+    /**
+     * 生成带有 sign 的 XML 格式字符串
+     *
+     * @param data Map类型数据
+     * @param key  API密钥
+     * @return 含有sign字段的XML
+     */
+    public static String generateSignedXml(final Map<String, String> data, String key) throws Exception {
+        return generateSignedXml(data, key, WXPayConstants.SignType.MD5);
+    }
+
+    /**
+     * 生成带有 sign 的 XML 格式字符串
+     *
+     * @param data     Map类型数据
+     * @param key      API密钥
+     * @param signType 签名类型
+     * @return 含有sign字段的XML
+     */
+    public static String generateSignedXml(final Map<String, String> data, String key, WXPayConstants.SignType signType) throws Exception {
+        String sign = generateSignature(data, key, signType);
+        data.put(WXPayConstants.FIELD_SIGN, sign);
+        return mapToXml(data);
+    }
+
+
+    /**
+     * 判断签名是否正确
+     *
+     * @param xmlStr XML格式数据
+     * @param key    API密钥
+     * @return 签名是否正确
+     * @throws Exception
+     */
+    public static boolean isSignatureValid(String xmlStr, String key) throws Exception {
+        Map<String, String> data = xmlToMap(xmlStr);
+        if (!data.containsKey(WXPayConstants.FIELD_SIGN)) {
+            return false;
+        }
+        String sign = data.get(WXPayConstants.FIELD_SIGN);
+        return generateSignature(data, key).equals(sign);
+    }
+
+    /**
+     * 判断签名是否正确,必须包含sign字段,否则返回false。使用MD5签名。
+     *
+     * @param data Map类型数据
+     * @param key  API密钥
+     * @return 签名是否正确
+     * @throws Exception
+     */
+    public static boolean isSignatureValid(Map<String, String> data, String key) throws Exception {
+        return isSignatureValid(data, key, WXPayConstants.SignType.MD5);
+    }
+
+    /**
+     * 判断签名是否正确,必须包含sign字段,否则返回false
+     *
+     * @param data     Map类型数据
+     * @param key      API密钥
+     * @param signType 签名方式
+     * @return 签名是否正确
+     * @throws Exception
+     */
+    public static boolean isSignatureValid(Map<String, String> data, String key, WXPayConstants.SignType signType) throws Exception {
+        if (!data.containsKey(WXPayConstants.FIELD_SIGN)) {
+            return false;
+        }
+        String sign = data.get(WXPayConstants.FIELD_SIGN);
+        return generateSignature(data, key, signType).equals(sign);
+    }
+
+    /**
+     * 生成签名
+     *
+     * @param data 待签名数据
+     * @param key  API密钥
+     * @return 签名
+     */
+    public static String generateSignature(final Map<String, String> data, String key) throws Exception {
+        return generateSignature(data, key, WXPayConstants.SignType.MD5);
+    }
+
+    /**
+     * 生成签名. 注意,若含有sign_type字段,必须和signType参数保持一致。
+     *
+     * @param data     待签名数据
+     * @param key      API密钥
+     * @param signType 签名方式
+     * @return 签名
+     */
+    public static String generateSignature(final Map<String, String> data, String key, WXPayConstants.SignType signType) throws Exception {
+        Set<String> keySet = data.keySet();
+        String[] keyArray = keySet.toArray(new String[keySet.size()]);
+        Arrays.sort(keyArray);
+        StringBuilder sb = new StringBuilder();
+        for (String k : keyArray) {
+            if (k.equals(WXPayConstants.FIELD_SIGN)) {
+                continue;
+            }
+            if (data.get(k).trim().length() > 0) // 参数值为空,则不参与签名
+                sb.append(k).append("=").append(data.get(k).trim()).append("&");
+        }
+        sb.append("key=").append(key);
+        if (WXPayConstants.SignType.MD5.equals(signType)) {
+            return MD5(sb.toString()).toUpperCase();
+        } else if (WXPayConstants.SignType.HMACSHA256.equals(signType)) {
+            return HMACSHA256(sb.toString(), key);
+        } else {
+            throw new Exception(String.format("Invalid sign_type: %s", signType));
+        }
+    }
+
+
+    /**
+     * 获取随机字符串 Nonce Str
+     *
+     * @return String 随机字符串
+     */
+    public static String generateNonceStr() {
+        char[] nonceChars = new char[32];
+        for (int index = 0; index < nonceChars.length; ++index) {
+            nonceChars[index] = SYMBOLS.charAt(RANDOM.nextInt(SYMBOLS.length()));
+        }
+        return new String(nonceChars);
+    }
+
+
+    /**
+     * 生成 MD5
+     *
+     * @param data 待处理数据
+     * @return MD5结果
+     */
+    public static String MD5(String data) throws Exception {
+        MessageDigest md = MessageDigest.getInstance("MD5");
+        byte[] array = md.digest(data.getBytes("UTF-8"));
+        StringBuilder sb = new StringBuilder();
+        for (byte item : array) {
+            sb.append(Integer.toHexString((item & 0xFF) | 0x100).substring(1, 3));
+        }
+        return sb.toString().toUpperCase();
+    }
+
+    /**
+     * 生成 HMACSHA256
+     *
+     * @param data 待处理数据
+     * @param key  密钥
+     * @return 加密结果
+     * @throws Exception
+     */
+    public static String HMACSHA256(String data, String key) throws Exception {
+        Mac sha256_HMAC = Mac.getInstance("HmacSHA256");
+        SecretKeySpec secret_key = new SecretKeySpec(key.getBytes("UTF-8"), "HmacSHA256");
+        sha256_HMAC.init(secret_key);
+        byte[] array = sha256_HMAC.doFinal(data.getBytes("UTF-8"));
+        StringBuilder sb = new StringBuilder();
+        for (byte item : array) {
+            sb.append(Integer.toHexString((item & 0xFF) | 0x100).substring(1, 3));
+        }
+        return sb.toString().toUpperCase();
+    }
+
+    /**
+     * 日志
+     *
+     * @return
+     */
+    public static Logger getLogger() {
+        Logger logger = LoggerFactory.getLogger("wxpay java sdk");
+        return logger;
+    }
+
+    /**
+     * 获取当前时间戳,单位秒
+     *
+     * @return
+     */
+    public static long getCurrentTimestamp() {
+        return System.currentTimeMillis() / 1000;
+    }
+
+    /**
+     * 获取当前时间戳,单位毫秒
+     *
+     * @return
+     */
+    public static long getCurrentTimestampMs() {
+        return System.currentTimeMillis();
+    }
+
+}

+ 30 - 0
src/main/java/com/wxpay/zhuanz/WXPayXmlUtil.java

@@ -0,0 +1,30 @@
+package com.wxpay.zhuanz;
+
+import org.w3c.dom.Document;
+
+import javax.xml.XMLConstants;
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.parsers.ParserConfigurationException;
+
+/**
+ * 2018/7/3
+ */
+public final class WXPayXmlUtil {
+    public static DocumentBuilder newDocumentBuilder() throws ParserConfigurationException {
+        DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
+        documentBuilderFactory.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);
+        documentBuilderFactory.setFeature("http://xml.org/sax/features/external-general-entities", false);
+        documentBuilderFactory.setFeature("http://xml.org/sax/features/external-parameter-entities", false);
+        documentBuilderFactory.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false);
+        documentBuilderFactory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true);
+        documentBuilderFactory.setXIncludeAware(false);
+        documentBuilderFactory.setExpandEntityReferences(false);
+
+        return documentBuilderFactory.newDocumentBuilder();
+    }
+
+    public static Document newDocument() throws ParserConfigurationException {
+        return newDocumentBuilder().newDocument();
+    }
+}

+ 15 - 3
src/main/java/com/yc/education/controller/AnnouncementController.java

@@ -1,11 +1,14 @@
 package com.yc.education.controller;
 
 import com.yc.education.model.Announcement;
+import com.yc.education.model.Notice;
 import com.yc.education.service.AnnouncementService;
+import com.yc.education.service.NoticeService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Controller;
 import org.springframework.stereotype.Service;
 import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.servlet.ModelAndView;
 
 /**
@@ -22,6 +25,9 @@ public class AnnouncementController {
     @Autowired
     private AnnouncementService announcementService;
 
+    @Autowired
+    private NoticeService noticeService;
+
     /**
      * @Description 公告详情
      * @Author caolong
@@ -30,10 +36,16 @@ public class AnnouncementController {
      * @Return org.springframework.web.servlet.ModelAndView
      */
     @RequestMapping("notice_detail.html")
-    public ModelAndView notice_detail(int id) {
+    public ModelAndView notice_detail(int id, @RequestParam(required = false, defaultValue = "0") int type) {
         ModelAndView modelAndView = new ModelAndView();
-        Announcement announcement = announcementService.selectByKey(id);
-        modelAndView.addObject("announcement", announcement);
+        if (type == 0) {
+            Announcement announcement = announcementService.selectByKey(id);
+            modelAndView.addObject("announcement", announcement);
+        } else {
+            Notice notice = noticeService.selectByKey(id);
+            modelAndView.addObject("notice", notice);
+        }
+        modelAndView.addObject("type", type);
         return modelAndView;
     }
 

+ 0 - 1
src/main/java/com/yc/education/controller/IndexController.java

@@ -160,7 +160,6 @@ public class IndexController {
                     String contextPath = request.getSession().getServletContext().getContextPath();
 
                     File localFile = new File(path + "upload/" + fileName);
-                    System.err.println(path + "upload\\" + fileName);
 
                     try {
                         file.transferTo(localFile);

+ 28 - 3
src/main/java/com/yc/education/controller/LabelBookController.java

@@ -1,11 +1,16 @@
 package com.yc.education.controller;
 
 import com.yc.education.model.Labelbook;
+import com.yc.education.model.Notice;
+import com.yc.education.model.Orders;
 import com.yc.education.model.Users;
 import com.yc.education.service.LabelbookService;
+import com.yc.education.service.NoticeService;
+import com.yc.education.service.OrdersService;
 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.servlet.ModelAndView;
 
 import javax.servlet.http.HttpSession;
@@ -28,6 +33,12 @@ public class LabelBookController {
     @Autowired
     private LabelbookService labelbookService;
 
+    @Autowired
+    private OrdersService ordersService;
+
+    @Autowired
+    private NoticeService noticeService;
+
     /**
      * @Description 我的标书列表
      * @Author caolong
@@ -56,9 +67,9 @@ public class LabelBookController {
      * @Return org.springframework.web.servlet.ModelAndView
      */
     @RequestMapping("new_biding.html")
-    public ModelAndView new_biding() {
+    public ModelAndView new_biding(@RequestParam(required = false, defaultValue = "0") int orderid) {
         ModelAndView modelAndView = new ModelAndView();
-
+        modelAndView.addObject("orderid", orderid);
         return modelAndView;
     }
 
@@ -84,13 +95,27 @@ public class LabelBookController {
      * @Return org.springframework.web.servlet.ModelAndView
      */
     @RequestMapping("upbalerbook.html")
-    public ModelAndView upbalerbook(Labelbook labelbook) {
+    public ModelAndView upbalerbook(Labelbook labelbook, int orderid) {
         ModelAndView modelAndView = new ModelAndView("proxy_subsuces");
         labelbook.setAddtime(new Date());
         labelbook.setNum(6);
         labelbook.setStatus(0);
         labelbook.setActivation(0);
         int save = labelbookService.save(labelbook);
+        if (save > 0) {
+            Notice notice = new Notice();
+            notice.setTitle("标书提交成功");
+            notice.setResume("标书提交成功");
+            notice.setText("标书提交成功,等待审核");
+            notice.setAddtime(new Date());
+            notice.setUserid(labelbook.getUserid());
+            noticeService.save(notice);
+        }
+        if (orderid != 0) {
+            Orders orders = ordersService.selectByKey(orderid);
+            orders.setLabelnum(labelbook.getLabelnum());
+            ordersService.updateNotNull(orders);
+        }
         return modelAndView;
     }
 

+ 258 - 22
src/main/java/com/yc/education/controller/OrdersController.java

@@ -3,10 +3,7 @@ package com.yc.education.controller;
 import com.Base64.BASE64DecodedMultipartFile;
 import com.Base64.Base64StrToImage;
 import com.yc.education.model.*;
-import com.yc.education.service.BiddocumentService;
-import com.yc.education.service.LabelbookService;
-import com.yc.education.service.MealService;
-import com.yc.education.service.ServiceagreementService;
+import com.yc.education.service.*;
 import com.yc.education.util.AjaxMessage;
 import com.yc.education.util.MoneyUtil;
 import com.Base64.BASE64DecodedMultipartFile;
@@ -26,6 +23,7 @@ import java.io.FileOutputStream;
 import java.io.IOException;
 import java.io.OutputStream;
 import java.text.SimpleDateFormat;
+import java.util.ArrayList;
 import java.util.Calendar;
 import java.util.Date;
 import java.util.List;
@@ -54,6 +52,14 @@ public class OrdersController {
     @Autowired
     ServiceagreementService serviceagreementService;
 
+    @Autowired
+    OrdersService ordersService;
+
+    @Autowired
+    ReceiptService receiptService;
+
+    @Autowired
+    AuctionService auctionService;
 
     @RequestMapping("center_order2.html")
     public ModelAndView center_order2(int id, HttpSession httpSession) {
@@ -90,52 +96,190 @@ public class OrdersController {
 
 
     @RequestMapping("xieyiqr.html")
-    public ModelAndView xieyiqr(HttpSession httpSession, int mealid, String biaoshu) {
+    public ModelAndView xieyiqr(HttpSession httpSession, int mealid, String biaoshu,
+                                @RequestParam(required = false, defaultValue = "0") String biaoshu1,
+                                @RequestParam(required = false, defaultValue = "0") int bid) {
         Users users = (Users) httpSession.getAttribute("users");
         ModelAndView modelAndView = new ModelAndView();
         SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMdd");
         String dateString = formatter.format(new Date());
-        String xycode = "JM" + dateString + "" + users.getId();    //
+        int size = ordersService.ORDERS_LIST_USERID(users.getId()).size();
+        String xycode = "JM" + dateString + "" + users.getId() + "" + size;    //
         modelAndView.addObject("xycode", xycode);
         Meal meal = mealService.selectByKey(mealid);
+        List<Labelbook> labelbookList = new ArrayList<>();
+        if (meal.getType().equals(2)) {
+            Biddocument biddocument = biddocumentService.selectByKey(bid);
+            Labelbook labelbooks = labelbookService.LABELBOOK_BY_NUM(biaoshu);
+            Labelbook labelbooks1 = labelbookService.LABELBOOK_BY_NUM(biaoshu1);
+            labelbookList.add(labelbooks);
+            labelbookList.add(labelbooks1);
+            meal.setLabelbooks(labelbookList);
+            meal.setPayforprice(biddocument.getPayforprice());
+            meal.setPrice(biddocument.getPrice());
+        }
         if (meal.getType().equals(1)) {
-            List<Labelbook> labelbooks = labelbookService.LABELBOOK_BY_NUM(biaoshu);
-            meal.setLabelbook(labelbooks);
-            String price = MoneyUtil.change(meal.getPrice().doubleValue());
-            String payforprice = MoneyUtil.change(meal.getPayforprice().doubleValue());
-            modelAndView.addObject("payforprice", payforprice);
-            modelAndView.addObject("price", price);
-            modelAndView.addObject("meal", meal);
+            Labelbook labelbooks = labelbookService.LABELBOOK_BY_NUM(biaoshu);
+            labelbookList.add(labelbooks);
+            meal.setLabelbooks(labelbookList);
         }
+        String price = MoneyUtil.change(meal.getPrice().doubleValue());
+        String payforprice = MoneyUtil.change(meal.getPayforprice().doubleValue());
+        modelAndView.addObject("payforprice", payforprice);
+        modelAndView.addObject("price", price);
+        modelAndView.addObject("meal", meal);
         SimpleDateFormat formatters = new SimpleDateFormat("yyyy-MM-dd");
         String dateStrings = formatters.format(new Date());
         modelAndView.addObject("dateStrings", dateStrings);
         return modelAndView;
     }
 
+    /**
+     * @Description 协议
+     * @Author caolong
+     * @Date 2019-09-12 11:37
+     * @Param [id]
+     * @Return org.springframework.web.servlet.ModelAndView
+     */
+    @RequestMapping("xieyichakan.html")
+    public ModelAndView xieyichakan(int id) {
+        ModelAndView modelAndView = new ModelAndView();
+        Serviceagreement serviceagreement = serviceagreementService.selectByKey(id);
+        Meal meal = mealService.selectByKey(serviceagreement.getMealid());
+        List<Labelbook> labelbookList = new ArrayList<>();
+        if (meal.getType().equals(2)) {
+            meal.setPrice(serviceagreement.getPrice());
+            meal.setPayforprice(serviceagreement.getPayforprice());
+            Labelbook labelbooks = labelbookService.LABELBOOK_BY_NUM(serviceagreement.getLabelnum());
+            Labelbook labelbooks1 = labelbookService.LABELBOOK_BY_NUM(serviceagreement.getLabelnum1());
+            labelbookList.add(labelbooks);
+            labelbookList.add(labelbooks1);
+            meal.setLabelbook(labelbookList);
+        }
+        if (meal.getType().equals(1)) {
+            Labelbook labelbooks = labelbookService.LABELBOOK_BY_NUM(serviceagreement.getLabelnum());
+            labelbookList.add(labelbooks);
+            meal.setLabelbook(labelbookList);
+        }
+        String price = MoneyUtil.change(meal.getPrice().doubleValue());
+        String payforprice = MoneyUtil.change(meal.getPayforprice().doubleValue());
+        modelAndView.addObject("payforprice", payforprice);
+        modelAndView.addObject("price", price);
+        serviceagreement.setTitle(meal.getTitle());
+        modelAndView.addObject("serviceagreement", serviceagreement);
+        modelAndView.addObject("meal", meal);
+        return modelAndView;
+    }
+
+    /**
+     * @Description 协议
+     * @Author caolong
+     * @Date 2019-09-12 11:37
+     * @Param [id]
+     * @Return org.springframework.web.servlet.ModelAndView
+     */
+//    @RequestMapping("xieyi.html")
+//    public ModelAndView xieyi(int id) {
+//        ModelAndView modelAndView = new ModelAndView();
+//        Serviceagreement serviceagreement = serviceagreementService.selectByKey(id);
+//        modelAndView.addObject("serviceagreement", serviceagreement);
+//        return modelAndView;
+//    }
+
+    /**
+     * @Description 协议
+     * @Author caolong
+     * @Date 2019-09-12 11:37
+     * @Param [id]
+     * @Return org.springframework.web.servlet.ModelAndView
+     */
     @RequestMapping("xieyi.html")
     public ModelAndView xieyi() {
         ModelAndView modelAndView = new ModelAndView();
+//        Serviceagreement serviceagreement = serviceagreementService.selectByKey(id);
+//        modelAndView.addObject("serviceagreement", serviceagreement);
         return modelAndView;
     }
 
-    @ResponseBody
+
     @RequestMapping("sucess.html")
+    public ModelAndView sucess(int serverid, HttpServletRequest httpServletRequest) {
+        ModelAndView modelAndView = new ModelAndView();
+        Serviceagreement serviceagreement = serviceagreementService.selectByKey(serverid);
+        Meal meal = mealService.selectByKey(serviceagreement.getMealid());
+        Orders orders = new Orders();
+        if (serviceagreement.getLabelnum1() != null && !"".equals(serviceagreement.getLabelnum1())) {
+            orders.setLabelnum1(serviceagreement.getLabelnum1());
+        }
+        orders.setPrice(serviceagreement.getPrice());
+        orders.setPayforprice(serviceagreement.getPayforprice());
+        orders.setUserid(serviceagreement.getUserid());
+        orders.setMealid(serviceagreement.getMealid());
+        orders.setLabelnum(serviceagreement.getLabelnum());
+        orders.setServiceid(serviceagreement.getId());
+        orders.setAddtime(new Date());
+        orders.setType(meal.getType());
+        orders.setAuctionstatus(0);
+        SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMdd");
+        String dateString = formatter.format(new Date());
+        long timeInMillis = Calendar.getInstance().getTimeInMillis();
+        orders.setOrdersid(dateString + "" + timeInMillis);
+        orders.setNum(meal.getNum());
+        orders.setStatus(0);
+        int save = ordersService.save(orders);
+        if (save > 0) {
+            Object receipt = httpServletRequest.getSession().getAttribute("receipt");
+            if (receipt != null) {
+                Receipt receipts = (Receipt) receipt;
+                receipts.setOrderid(orders.getId());
+                int save1 = receiptService.save(receipts);
+            }
+        }
+        return modelAndView;
+    }
+
+    @ResponseBody
+    @RequestMapping("sucessajax.html")
     public AjaxMessage sucess(Serviceagreement serviceagreement, HttpServletRequest httpServletRequest) throws IOException {
+        AjaxMessage ajaxMessage = new AjaxMessage();
         serviceagreement.setAddtime(new Date());
+        serviceagreement.setQddate(new Date());
         String rootPath = httpServletRequest.getSession().getServletContext().getRealPath("/");
-        String s = GenerateImage(serviceagreement.getImg(), rootPath + "uploadimg/");
+        String s = GenerateImage(serviceagreement.getImg(), rootPath + "uploadimg/", httpServletRequest);
         serviceagreement.setImg(s);
         int save = serviceagreementService.save(serviceagreement);
-        return new AjaxMessage();
+        if (save > 0) {
+            ajaxMessage.setIs(true);
+            ajaxMessage.setData(serviceagreement.getId());
+        } else {
+            ajaxMessage.setIs(false);
+        }
+        return ajaxMessage;
     }
 
 
-    public static String GenerateImage(String imgStr, String rootPath) throws IOException {   //对字节数组字符串进行Base64解码并生成图片
+    @ResponseBody
+    @RequestMapping("uporder.html")
+    public AjaxMessage uporder(int orderid, String path) throws IOException {
+        AjaxMessage ajaxMessage = new AjaxMessage();
+        if (orderid != 0) {
+            Orders orders = new Orders();
+            orders.setId(orderid);
+            orders.setWay("线下支付");
+            orders.setPayimg(path);
+            ordersService.updateNotNull(orders);
+        }
+
+        return ajaxMessage;
+    }
+
+
+    public static String GenerateImage(String imgStr, String rootPath, HttpServletRequest request) throws IOException {   //对字节数组字符串进行Base64解码并生成图片
         BASE64DecodedMultipartFile base64DecodedMultipartFile = null;
         if (null != imgStr && !imgStr.isEmpty()) {
             base64DecodedMultipartFile = (BASE64DecodedMultipartFile) Base64StrToImage.base64MutipartFile(imgStr);
         }
+        String pathString = "";
         //Base64解码
         String originalFileName = base64DecodedMultipartFile.getOriginalFilename();
         // 取得后缀
@@ -143,11 +287,103 @@ public class OrdersController {
         //生成jpeg图片
         long timeInMillis = Calendar.getInstance().getTimeInMillis();
         String imgFilePath = rootPath + timeInMillis + originalFileName;//新生成的图片
-        OutputStream out = new FileOutputStream(imgFilePath);
-        out.write(base64DecodedMultipartFile.getBytes());
-        out.flush();
-        out.close();
-        return imgFilePath;
+        File localFile = new File(imgFilePath);
+        String contextPath = request.getSession().getServletContext().getContextPath();
+        try {
+            base64DecodedMultipartFile.transferTo(localFile);
+            // 将图片名称和相对路径存到数据库中
+        } catch (IllegalStateException e) {
+            e.printStackTrace();
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+        pathString = contextPath + "/uploadimg/" + timeInMillis + originalFileName;
+//        OutputStream out = new FileOutputStream(imgFilePath);
+//        out.write(base64DecodedMultipartFile.getBytes());
+//        out.flush();
+//        out.close();
+        return pathString;
+    }
+
+
+    /**
+     * @Description
+     * @Author caolong
+     * @Date 2019-09-12 10:10
+     * @Param [httpServletRequest]
+     * @Return org.springframework.web.servlet.ModelAndView
+     */
+    @RequestMapping("order.html")
+    public ModelAndView order(HttpServletRequest httpServletRequest) {
+        ModelAndView modelAndView = new ModelAndView();
+        Users users = (Users) httpServletRequest.getSession().getAttribute("users");
+        if (users != null) {
+            List<Orders> ordersList = ordersService.ORDERS_LIST_USERID(users.getId());
+            for (Orders orders : ordersList) {
+                Meal meal = mealService.selectByKey(orders.getMealid());
+                List<Auction> auctions = auctionService.AUCTION_LIST(orders.getId());
+                for (Auction auction : auctions) {
+                    if (auction.getPaystatus() != null) {
+                        if (auction.getPaystatus().equals(1)) {
+                            orders.setPaystatus(1);
+                        } else {
+                            orders.setPaystatus(0);
+                        }
+                    }
+                }
+                if (orders.getType().equals(1)) {
+                    Labelbook labelbook = labelbookService.LABELBOOK_BY_NUM(orders.getLabelnum());
+                    if (labelbook != null) {
+                        if (labelbook.getUseing() >= 6) {
+                            orders.setLabeluse(1);
+                        }
+                    }
+                }
+                if (orders.getType().equals(2)) {
+                    Labelbook labelbook = labelbookService.LABELBOOK_BY_NUM(orders.getLabelnum());
+                    Labelbook labelbook1 = labelbookService.LABELBOOK_BY_NUM(orders.getLabelnum1());
+                    if (labelbook != null) {
+                        if (labelbook.getUseing() >= 6) {
+                            orders.setLabeluse(1);
+                        }
+                    }
+                    if (labelbook1 != null) {
+                        if (labelbook1.getUseing() >= 6) {
+                            orders.setLabeluse(1);
+                        }
+                    }
+                }
+                orders.setMeal(meal);
+            }
+            modelAndView.addObject("ordersList", ordersList);
+        }
+        return modelAndView;
+    }
+
+    /**
+     * @Description
+     * @Author caolong
+     * @Date 2019-09-12 10:10
+     * @Param [httpServletRequest]
+     * @Return org.springframework.web.servlet.ModelAndView
+     */
+    @RequestMapping(value = {"order_detail.html", "order_detail1.html"})
+    public ModelAndView order_detail(int id) {
+        ModelAndView modelAndView = new ModelAndView();
+        Orders orders = ordersService.selectByKey(id);
+        List<Auction> auctions = auctionService.AUCTION_LIST(orders.getId());
+        orders.setAuctionList(auctions);
+        Receipt receipt = receiptService.RECEIPT_BY_ORDERID(orders.getId());
+        orders.setReceipt(receipt);
+        modelAndView.addObject("orders", orders);
+        return modelAndView;
+    }
+
+
+    @RequestMapping("my_busnes.html")
+    public ModelAndView my_busnes(HttpServletRequest request) {
+        ModelAndView modelAndView = new ModelAndView();
+        return modelAndView;
     }
 
 }

+ 144 - 0
src/main/java/com/yc/education/controller/WxTransferController.java

@@ -0,0 +1,144 @@
+package com.yc.education.controller;
+
+
+import com.wxpay.WxPayConfig;
+import com.wxpay.zhuanz.CertHttpUtil;
+import com.wxpay.zhuanz.WXPayUtil;
+import com.yc.education.model.Orders;
+import com.yc.education.model.Users;
+import com.yc.education.service.UsersService;
+import org.apache.http.client.config.RequestConfig;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.servlet.http.HttpServletRequest;
+
+import java.math.BigDecimal;
+import java.util.Map;
+import java.util.SortedMap;
+import java.util.TreeMap;
+
+import static com.wxpay.zhuanz.WXPayUtil.*;
+
+
+/**
+ * @author caolong
+ * @version 1.0.0
+ * @Details
+ * @ClassName WxTransferController
+ * @Description TODO
+ * @createTime 2019-07-23 09:29:00
+ */
+@RestController
+@RequestMapping("/api")
+public class WxTransferController extends BaseController {
+
+    public final static String SSLCERT_PATH = "/usr/local/java/zhengshu/apiclient_cert.p12";
+
+    private static int socketTimeout = 10000;// 连接超时时间,默认10秒
+
+    private static int connectTimeout = 30000;// 传输超时时间,默认30秒
+
+    private static RequestConfig requestConfig;
+
+    private static CloseableHttpClient httpClient;// HTTP请求器
+
+    @Autowired
+    private UsersService usersService;
+
+    /**
+     * @Title: transfer
+     * @Description: 企业转账到零钱
+     * @param:
+     * @return:
+     */
+//    @RequestMapping("pay.html")
+    public String transfer(HttpServletRequest request, Orders orders) {
+        Integer userid = orders.getUserid();
+        Users users = usersService.selectByKey(userid);
+        // 1.0 拼凑企业支付需要的参数
+        String appid = WxPayConfig.APPID; // 微信公众号的appid
+        String mch_id = WxPayConfig.APPPAYMCH; // 商户号
+        String nonce_str = generateNonceStr(); // 生成随机数
+        String partner_trade_no = generateNonceStr(); // 生成商户订单号
+        String openid = users.getOpenid(); // 支付给用户openid
+        String check_name = "NO_CHECK"; // 是否验证真实姓名呢
+        String re_user_name = users.getRzname(); // 收款用户姓名(非必须)
+        String amount = orders.getPayforprice().multiply(new BigDecimal(100)).toString(); // 企业付款金额,最少为100,单位为分
+        String desc = "赔付金额"; // 企业付款操作说明信息。必填。
+        String spbill_create_ip = getRequestIp(request); // 用户的ip地址
+
+        // 2.0 生成map集合
+        SortedMap<String, String> packageParams = new TreeMap<String, String>();
+        packageParams.put("mch_appid", appid); // 微信公众号的appid
+        packageParams.put("mchid", mch_id); // 商务号
+        packageParams.put("nonce_str", nonce_str); // 随机生成后数字,保证安全性
+
+        packageParams.put("partner_trade_no", partner_trade_no); // 生成商户订单号
+        packageParams.put("openid", openid); // 支付给用户openid
+        packageParams.put("check_name", check_name); // 是否验证真实姓名呢
+        packageParams.put("re_user_name", re_user_name);// 收款用户姓名
+        packageParams.put("amount", amount); // 企业付款金额,单位为分
+        packageParams.put("desc", desc); // 企业付款操作说明信息。必填。
+        packageParams.put("spbill_create_ip", spbill_create_ip); // 调用接口的机器Ip地址
+
+        try {
+            // 3.0 利用上面的参数,先去生成自己的签名
+            String sign = WXPayUtil.generateSignature(packageParams, WxPayConfig.APPPAYKEY);
+            // 4.0 将签名再放回map中,它也是一个参数
+            packageParams.put("sign", sign);
+
+            // 5.0将当前的map结合转化成xml格式
+            String xml = mapToXml(packageParams);
+
+            // 6.0获取需要发送的url地址
+            String wxUrl = "https://api.mch.weixin.qq.com/mmpaymkttransfers/promotion/transfers"; // 获取退款的api接口
+            System.out.println("发送前的xml为:" + xml.toString());
+
+            // 7,向微信发送请求转账请求
+            String returnXml = CertHttpUtil.postData(wxUrl, xml);
+
+            System.out.println("返回的returnXml为:" + returnXml);
+
+            // 8,将微信返回的xml结果转成map格式
+            Map<String, String> returnMap = xmlToMap(returnXml);
+
+            if (returnMap.get("return_code").equals("SUCCESS")) {
+                // 付款成功
+                System.out.println("returnMap为:" + returnMap);
+            }
+            return returnXml;
+        } catch (Exception e) {
+            // TODO Auto-generated catch block
+            e.printStackTrace();
+        }
+        return "error";
+    }
+
+    /**
+     * @Title: getRequestIp
+     * @Description: 获取用户的ip地址
+     * @param:
+     * @return:
+     */
+    public static String getRequestIp(HttpServletRequest request) {
+        String ip = request.getHeader("x-forwarded-for");
+        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
+            ip = request.getHeader("Proxy-Client-IP");
+        }
+        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
+            ip = request.getHeader("WL-Proxy-Client-IP");
+        }
+        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
+            ip = request.getRemoteAddr();
+        }
+        if (ip.indexOf(",") != -1) {
+            String[] ips = ip.split(",");
+            ip = ips[0].trim();
+        }
+        return ip;
+    }
+
+}

+ 187 - 0
src/main/java/com/yc/education/controller/WxpayController.java

@@ -0,0 +1,187 @@
+package com.yc.education.controller;
+
+import com.thoughtworks.xstream.XStream;
+import com.thoughtworks.xstream.io.xml.DomDriver;
+import com.thoughtworks.xstream.io.xml.XmlFriendlyReplacer;
+import com.wxpay.SignMap;
+import com.wxpay.WxPayConfig;
+import com.wxpay.WxPaySendData;
+import com.wxpay.util.WeiXinHelper;
+import com.yc.education.model.Orders;
+import com.yc.education.model.Users;
+import com.yc.education.service.OrdersService;
+import com.yc.education.service.UsersService;
+import com.yc.education.util.AjaxMessage;
+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.ResponseBody;
+import org.springframework.web.servlet.ModelAndView;
+
+import javax.servlet.http.HttpServletRequest;
+import java.math.BigDecimal;
+import java.text.SimpleDateFormat;
+import java.util.*;
+
+import static com.wxpay.util.WeiXinHelper.createSign;
+import static com.wxpay.util.WeiXinHelper.httpRequest2;
+
+/**
+ * @author caolong
+ * @version 1.0.0
+ * @Details
+ * @ClassName WxpayController
+ * @Description TODO
+ * @createTime 2019-09-16 17:44:00
+ */
+@Controller
+public class WxpayController {
+
+
+    @Autowired
+    private OrdersService ordersService;
+
+    @Autowired
+    private UsersService usersService;
+
+    /**
+     * 支付方法
+     *
+     * @param orderid
+     * @param request
+     * @return
+     */
+    @SuppressWarnings("unchecked")
+    @ResponseBody
+    @RequestMapping("wxPay.html")
+    public AjaxMessage<Object> wxpay(String orderid, HttpServletRequest request) {
+        AjaxMessage<Object> ajax = new AjaxMessage<>();
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
+        Date date = new Date();
+        // 订单查询
+        Orders orders = ordersService.selectByKey(orderid);
+        String openid = "";
+        Users users = (Users) request.getSession().getAttribute("users");
+        if (users != null) {
+            openid = users.getOpenid();
+        }
+        //获取openID
+        try {
+            //用户ip
+            String user_ip = WeiXinHelper.localIp();
+            //创建随机数
+            String nonceStr = WeiXinHelper.getNonceStr();
+
+            //统一订单发送参数
+            WxPaySendData data = new WxPaySendData();
+            data.setAppid(WxPayConfig.APPID);
+            data.setAttach("接米沪牌代拍");
+            data.setBody("套餐支付");
+            data.setMch_id(WxPayConfig.APPPAYMCH);
+            data.setNonce_str(nonceStr);
+            data.setNotify_url(WxPayConfig.NOTIFY_URL);
+            data.setOut_trade_no(orders.getOrdersid());
+            data.setTotal_fee((orders.getPrice().multiply(new BigDecimal(100))).intValue());//单位:分
+            data.setTrade_type("JSAPI");
+            data.setSpbill_create_ip(user_ip);
+            data.setOpenid(openid);
+            data.setTime_start(sdf.format(date));
+            String result = unifiedorder(data, WxPayConfig.APPPAYKEY);
+
+            Map<String, String> map = new HashMap<String, String>();
+            try {
+                map = WeiXinHelper.doXMLParse(result);
+            } catch (Exception e) {
+            }
+
+            if (map.get("return_code").toString().equals("SUCCESS") && map.get("result_code").toString().equals("SUCCESS")) {
+                ajax.setIs(true);
+                //生成sign
+                SortedMap<Object, Object> signMap = new TreeMap<Object, Object>();
+                signMap.put("appId", WxPayConfig.APPID);
+                signMap.put("timeStamp", WeiXinHelper.getTimeStamp());
+                signMap.put("nonceStr", nonceStr);
+                signMap.put("package", "prepay_id=" + map.get("prepay_id").toString());
+                signMap.put("signType", "MD5");
+                String paySin = createSign(signMap, WxPayConfig.APPPAYKEY);
+
+                SignMap signMap1 = new SignMap();
+                signMap1.setAppid(WxPayConfig.APPID);
+                signMap1.setTimeStamp(WeiXinHelper.getTimeStamp());
+                signMap1.setNonceStr(nonceStr);
+                signMap1.setPackageValue("prepay_id=" + map.get("prepay_id").toString());
+                signMap1.setSignType("MD5");
+                signMap1.setPaySign(paySin);
+                ajax.setData(signMap1);
+            } else {
+                ajax.setIs(false);
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+            ajax.setIs(false);
+        }
+        return ajax;
+    }
+
+    /**
+     * 调用统一下单
+     *
+     * @param data
+     * @param key
+     * @return
+     */
+    public String unifiedorder(WxPaySendData data, String key) {
+        //统一下单支付
+        String returnXml = null;
+
+        try {
+            //生成sign签名
+            SortedMap<Object, Object> parameters = new TreeMap<Object, Object>();
+            parameters.put("appid", data.getAppid());
+            parameters.put("attach", data.getAttach());
+            parameters.put("body", data.getBody());
+            parameters.put("mch_id", data.getMch_id());
+            parameters.put("nonce_str", data.getNonce_str());
+            parameters.put("notify_url", data.getNotify_url());
+            parameters.put("out_trade_no", data.getOut_trade_no());
+            parameters.put("total_fee", data.getTotal_fee());
+            parameters.put("trade_type", data.getTrade_type());
+            parameters.put("spbill_create_ip", data.getSpbill_create_ip());
+            parameters.put("openid", data.getOpenid());
+            parameters.put("device_info", data.getDevice_info());
+            parameters.put("time_start", data.getTime_start());
+
+            data.setSign(createSign(parameters, key));
+
+            XStream xs = new XStream(new DomDriver("UTF-8", new XmlFriendlyReplacer("-_", "_")));
+            xs.alias("xml", WxPaySendData.class);
+            String xml = xs.toXML(data);
+            //HttpClientUtil util = HttpClientUtil.getInstance();
+
+            returnXml = httpRequest2("https://api.mch.weixin.qq.com/pay/unifiedorder", "POST", xml);
+            //returnXml = util.doPostForString("https://api.mch.weixin.qq.com/pay/unifiedorder", null, xml);
+
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return returnXml;
+    }
+
+
+    @RequestMapping("pay_way.html")
+    public ModelAndView pay_way(int orderid) {
+        ModelAndView modelAndView = new ModelAndView();
+        Orders orders = ordersService.selectByKey(orderid);
+        modelAndView.addObject("orderid", orderid);
+        modelAndView.addObject("orders", orders);
+        return modelAndView;
+    }
+
+    @RequestMapping("upload.html")
+    public ModelAndView upload(int orderid) {
+        ModelAndView modelAndView = new ModelAndView();
+        modelAndView.addObject("orderid", orderid);
+        return modelAndView;
+    }
+
+}

+ 42 - 0
src/main/java/com/yc/education/controller/admin/NewsController.java

@@ -0,0 +1,42 @@
+package com.yc.education.controller.admin;
+
+import com.yc.education.model.Notice;
+import com.yc.education.model.Users;
+import com.yc.education.service.NoticeService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.servlet.ModelAndView;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.List;
+
+/**
+ * @author caolong
+ * @version 1.0.0
+ * @Details
+ * @ClassName NewsController
+ * @Description TODO
+ * @createTime 2019-09-17 09:16:00
+ */
+@Controller
+public class NewsController {
+
+
+    @Autowired
+    private NoticeService noticeService;
+
+
+    @RequestMapping("my_news.html")
+    public ModelAndView my_news(HttpServletRequest request) {
+        ModelAndView modelAndView = new ModelAndView();
+        Users users = (Users) request.getSession().getAttribute("users");
+        if (users != null) {
+            List<Notice> notices = noticeService.NOTICE_LIST_BY_USERID(users.getId());
+            modelAndView.addObject("notices", notices);
+        }
+        return modelAndView;
+    }
+
+
+}

+ 314 - 0
src/main/java/com/yc/education/controller/admin/OrderAdminController.java

@@ -0,0 +1,314 @@
+package com.yc.education.controller.admin;
+
+import com.github.pagehelper.PageInfo;
+import com.yc.education.controller.WxTransferController;
+import com.yc.education.model.*;
+import com.yc.education.service.*;
+import com.yc.education.util.AjaxMessage;
+import com.yc.education.util.ViewUtil;
+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.IOException;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+
+/**
+ * @author caolong
+ * @version 1.0.0
+ * @Details
+ * @ClassName OrderAdminController
+ * @Description TODO
+ * @createTime 2019-09-12 13:01:00
+ */
+@Controller
+@RequestMapping("/admin")
+public class OrderAdminController {
+
+
+    @Autowired
+    private OrdersService ordersService;
+
+    @Autowired
+    private MealService mealService;
+
+    @Autowired
+    private AuctionService auctionService;
+
+    @Autowired
+    private NoticeService noticeService;
+
+    @Autowired
+    private LabelbookService labelbookService;
+
+    @RequestMapping("adminorder.html")
+    public ModelAndView adminorder(@RequestParam(required = false, defaultValue = "3") int status,
+                                   @RequestParam(required = false, defaultValue = "0") int page,
+                                   @RequestParam(required = false, defaultValue = "10") int rows) {
+        ModelAndView modelAndView = new ModelAndView();
+        List<Orders> ordersList = ordersService.ORDERS_LIST_STATUS(status, page, rows);
+        for (Orders orders : ordersList) {
+            int size = 0;
+            Meal meal = mealService.selectByKey(orders.getMealid());
+            List<Auction> auctions = auctionService.AUCTION_LIST(orders.getId());
+            if (auctions != null) {
+                for (Auction auction : auctions) {
+                    if (!auction.getStatus().equals(3)) {
+                        size = size + 1;
+                    }
+                }
+                orders.setLabeluse(size);
+            }
+            if (orders.getType().equals(1)) {
+                Labelbook labelbook = labelbookService.LABELBOOK_BY_NUM(orders.getLabelnum());
+                orders.setLabelbook(labelbook);
+            } else {
+                List<Labelbook> labelbookList = new ArrayList<>();
+                Labelbook labelbook = labelbookService.LABELBOOK_BY_NUM(orders.getLabelnum());
+                Labelbook labelbook1 = labelbookService.LABELBOOK_BY_NUM(orders.getLabelnum1());
+                labelbookList.add(labelbook);
+                labelbookList.add(labelbook1);
+                orders.setLabelbooks(labelbookList);
+            }
+            orders.setMeal(meal);
+        }
+        modelAndView.addObject("pageInfo", new PageInfo<>(ordersList));
+        modelAndView.addObject("status", status);
+        return modelAndView;
+    }
+
+    /**
+     * @Description 订单编辑
+     * @Author caolong
+     * @Date 2019-09-12 13:37
+     * @Param [id]
+     * @Return org.springframework.web.servlet.ModelAndView
+     */
+    @RequestMapping("addorders.html")
+    public ModelAndView addorders(int id) {
+        ModelAndView modelAndView = new ModelAndView();
+        Orders orders = ordersService.selectByKey(id);
+        Meal meal = mealService.selectByKey(orders.getMealid());
+        orders.setMeal(meal);
+        modelAndView.addObject("orders", orders);
+        return modelAndView;
+    }
+
+    /**
+     * @Description 订单次数审核
+     * @Author caolong
+     * @Date 2019-09-12 13:37
+     * @Param [id]
+     * @Return org.springframework.web.servlet.ModelAndView
+     */
+    @RequestMapping("adminauction.html")
+    public ModelAndView adminauction(int id) {
+        ModelAndView modelAndView = new ModelAndView();
+        List<Auction> auctions = auctionService.AUCTION_LIST(id);
+        Orders orders = ordersService.selectByKey(id);
+        modelAndView.addObject("auctions", auctions);
+        modelAndView.addObject("orders", orders);
+        return modelAndView;
+    }
+
+
+    /**
+     * @Description 修改竞拍状态
+     * @Author caolong
+     * @Date 2019-09-12 13:37
+     * @Param [id]
+     * @Return org.springframework.web.servlet.ModelAndView
+     */
+    @RequestMapping("addacution.html")
+    public ModelAndView addacution(int id) {
+        ModelAndView modelAndView = new ModelAndView();
+        Auction auction = auctionService.selectByKey(id);
+        Orders orders = ordersService.selectByKey(auction.getOrderid());
+        modelAndView.addObject("auctions", auction);
+        modelAndView.addObject("orders", orders);
+        return modelAndView;
+    }
+
+
+    /**
+     * @Description 订单添加或编辑
+     * @Author caolong
+     * @Date 2019-09-10 10:45
+     * @Param [id] [type]
+     * @Return org.springframework.web.servlet.ModelAndView
+     */
+    @RequestMapping("uporders.html")
+    public ModelAndView uporders(Orders orders) {
+        int rows = 0;
+        if (orders.getId() != null) {
+            if (orders.getTimes() != null && !"".equals(orders.getTimes())) {
+                orders.setAuctionstatus(1);
+            }
+            rows = ordersService.updateNotNull(orders);
+            if (rows > 0) {
+                if (orders.getStatus().equals(1)) {
+                    Notice notice = new Notice();
+                    notice.setTitle("订单审核成功");
+                    notice.setResume("订单审核成功,等待竞拍");
+                    notice.setText("111");
+                    notice.setAddtime(new Date());
+                    notice.setUserid(orders.getUserid());
+                    noticeService.save(notice);
+                } else {
+                    Notice notice = new Notice();
+                    notice.setTitle("订单审核失败");
+                    notice.setResume("订单审核失败");
+                    notice.setText("111");
+                    notice.setAddtime(new Date());
+                    notice.setUserid(orders.getUserid());
+                    noticeService.save(notice);
+                }
+                if (orders.getStatus().equals(1)) {
+                    List<Auction> auctions = auctionService.AUCTION_LIST(orders.getId());
+                    if (auctions.size() == 0) {
+                        for (int i = 1; i <= orders.getNum(); i++) {
+                            Auction auction = new Auction();
+                            auction.setNum(i);
+                            auction.setOrderid(orders.getId());
+                            auction.setAddtime(new Date());
+                            auction.setPaystatus(0);
+                            auction.setStatus(3);
+                            auctionService.save(auction);
+                        }
+                    }
+                }
+            }
+        }
+        return ViewUtil.returnview(rows, "adminorder.html", "订单管理");
+    }
+
+
+    /**
+     * @Description 竞拍状态
+     * @Author caolong
+     * @Date 2019-09-10 10:45
+     * @Param [id] [type]
+     * @Return org.springframework.web.servlet.ModelAndView
+     */
+    @RequestMapping("upacution.html")
+    public ModelAndView upacution(Auction auction, HttpServletRequest request) {
+        int rows = 0;
+        if (auction.getId() != null) {
+            rows = auctionService.updateNotNull(auction);
+            Auction auction2 = auctionService.selectByKey(auction.getId());
+            if (rows > 0) {
+                Orders orders1 = ordersService.selectByKey(auction2.getOrderid());
+                if (orders1.getType().equals(1)) {
+                    Labelbook labelbook = labelbookService.LABELBOOK_BY_NUM(orders1.getLabelnum());
+                    labelbook.setUseing(labelbook.getUseing() + 1);
+                    labelbookService.updateNotNull(labelbook);
+                    if (labelbook.getUseing() == 6) {
+                        Notice notice = new Notice();
+                        notice.setTitle("标书使用次数提醒");
+                        notice.setResume("标书使用次数提醒");
+                        notice.setText("您的标书"+labelbook.getLabelnum()+"已使用完,请您重新上传标书");
+                        notice.setAddtime(new Date());
+                        notice.setUserid(orders1.getUserid());
+                        noticeService.save(notice);
+                    }
+                } else {
+                    Labelbook labelbook = labelbookService.LABELBOOK_BY_NUM(orders1.getLabelnum());
+                    Labelbook labelbook1 = labelbookService.LABELBOOK_BY_NUM(orders1.getLabelnum1());
+                    labelbook.setUseing(labelbook.getUseing() + 1);
+                    labelbookService.updateNotNull(labelbook);
+                    if (labelbook.getUseing() == 6) {
+                        Notice notice = new Notice();
+                        notice.setTitle("标书使用次数提醒");
+                        notice.setResume("标书使用次数提醒");
+                        notice.setText("您的标书"+labelbook.getLabelnum()+"已使用完,请您重新上传标书");
+                        notice.setAddtime(new Date());
+                        notice.setUserid(orders1.getUserid());
+                        noticeService.save(notice);
+                    }
+                    labelbook1.setUseing(labelbook1.getUseing() + 1);
+                    labelbookService.updateNotNull(labelbook1);
+                    if (labelbook1.getUseing() == 6) {
+                        Notice notice = new Notice();
+                        notice.setTitle("标书使用次数提醒");
+                        notice.setResume("标书使用次数提醒");
+                        notice.setText("您的标书"+labelbook1.getLabelnum()+"已使用完,请您重新上传标书");
+                        notice.setAddtime(new Date());
+                        notice.setUserid(orders1.getUserid());
+                        noticeService.save(notice);
+                    }
+                }
+                List<Auction> auctions = auctionService.AUCTION_LIST(auction.getOrderid());
+                for (Auction auction1 : auctions) {
+                    if (auction1.getStatus() != null) {
+                        if (auction2.getStatus().equals(1)) {
+                            Orders orders = new Orders();
+                            orders.setId(auction1.getOrderid());
+                            orders.setAuctionstatus(2);
+                            int i = ordersService.updateNotNull(orders);
+                            if (i > 0) {
+                                Notice notice = new Notice();
+                                notice.setTitle("竞拍成功提醒");
+                                notice.setResume("竞拍成功提醒");
+                                notice.setText("111");
+                                notice.setAddtime(new Date());
+                                notice.setUserid(orders.getUserid());
+                                noticeService.save(notice);
+                            }
+                        } else if (auction2.getNum() == auctions.size()) {
+                            Orders orders = new Orders();
+                            orders.setId(auction1.getOrderid());
+                            orders.setAuctionstatus(3);
+                            int i = ordersService.updateNotNull(orders);
+                            if (i > 0) {
+                                Notice notice = new Notice();
+                                notice.setTitle("竞拍失败提醒");
+                                notice.setResume("竞拍失败提醒");
+                                notice.setText("111");
+                                notice.setAddtime(new Date());
+                                notice.setUserid(orders.getUserid());
+                                noticeService.save(notice);
+                            }
+                        }
+                    }
+                }
+                if (auction.getPaystatus() != null) {
+                    if (auction.getPaystatus().equals(1)) {
+//                            赔付转账代码
+                        Orders orders = ordersService.selectByKey(auction.getOrderid());
+                        new WxTransferController().transfer(request, orders);
+                    }
+                }
+            }
+        }
+        return ViewUtil.returnview(rows, "adminauction.html?id=" + auction.getOrderid(), "竞拍管理");
+    }
+
+
+    /**
+     * 删除套餐
+     *
+     * @return
+     */
+    @ResponseBody
+    @RequestMapping("delorder.html")
+    public AjaxMessage<Object> delmeal(int id) throws IOException {
+        AjaxMessage<Object> ajax = new AjaxMessage<>();
+        int delete = ordersService.delete(id);
+        if (delete > 0) {
+            ajax.setMsg("删除成功");
+            ajax.setIs(true);
+        } else {
+            ajax.setMsg("删除失败");
+            ajax.setIs(false);
+        }
+        return ajax;
+    }
+
+}

+ 15 - 0
src/main/java/com/yc/education/mapper/AuctionMapper.java

@@ -0,0 +1,15 @@
+package com.yc.education.mapper;
+
+import com.yc.education.model.Auction;
+import com.yc.education.util.MyMapper;
+import org.apache.ibatis.annotations.Select;
+
+import java.util.List;
+
+public interface AuctionMapper extends MyMapper<Auction> {
+
+
+    @Select("select * from auction where orderid = #{0}")
+    List<Auction> auctionList(int orderid);
+
+}

+ 2 - 2
src/main/java/com/yc/education/mapper/LabelbookMapper.java

@@ -16,7 +16,7 @@ public interface LabelbookMapper extends MyMapper<Labelbook> {
     @Select("select * from labelbook")
     List<Labelbook> labelLists();
 
-    @Select("select * from labelbook where labelnum = #{0} limit 1")
-    List<Labelbook> labelListsByNum(String labelnum);
+    @Select("select * from labelbook where labelnum = #{0} and status = 1 and activation = 1  limit 1")
+    Labelbook labelListsByNum(String labelnum);
 
 }

+ 23 - 0
src/main/java/com/yc/education/mapper/NoticeMapper.java

@@ -0,0 +1,23 @@
+package com.yc.education.mapper;
+
+import com.yc.education.model.Notice;
+import com.yc.education.util.MyMapper;
+import org.apache.ibatis.annotations.Select;
+
+import java.util.List;
+
+/**
+ * @author caolong
+ * @version 1.0.0
+ * @Details
+ * @ClassName NoticeMapper
+ * @Description TODO
+ * @createTime 2019-09-17 09:26:00
+ */
+public interface NoticeMapper extends MyMapper<Notice> {
+
+
+    @Select("select * from notice where userid = #{0}")
+    List<Notice> NOTICE_LIST_BY_USERID(int userid);
+
+}

+ 20 - 0
src/main/java/com/yc/education/mapper/OrdersMapper.java

@@ -0,0 +1,20 @@
+package com.yc.education.mapper;
+
+import com.yc.education.model.Orders;
+import com.yc.education.util.MyMapper;
+import org.apache.ibatis.annotations.Select;
+import tk.mybatis.mapper.common.Mapper;
+
+import java.util.List;
+
+public interface OrdersMapper extends MyMapper<Orders> {
+
+    @Select("select * from orders where userid = #{0}")
+    List<Orders> ordersListByUserId(int userid);
+
+    @Select("select * from orders where status = #{0}")
+    List<Orders> selectStatus(int status);
+
+    @Select("select * from orders ")
+    List<Orders> ORDERS_LIST();
+}

+ 5 - 0
src/main/java/com/yc/education/mapper/ReceiptMapper.java

@@ -2,7 +2,12 @@ package com.yc.education.mapper;
 
 import com.yc.education.model.Receipt;
 import com.yc.education.util.MyMapper;
+import org.apache.ibatis.annotations.Select;
 import tk.mybatis.mapper.common.Mapper;
 
 public interface ReceiptMapper extends MyMapper<Receipt> {
+
+    @Select("select * from receipt where orderid = #{0}")
+    Receipt selectByOrderId(int orderid);
+
 }

+ 141 - 0
src/main/java/com/yc/education/model/Auction.java

@@ -0,0 +1,141 @@
+package com.yc.education.model;
+
+import java.util.Date;
+import javax.persistence.*;
+
+public class Auction {
+    @Id
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
+    private Integer id;
+
+    private Integer orderid;
+
+    /**
+     * 竞拍时间
+     */
+    private String times;
+
+    /**
+     * 竞拍状态
+     */
+    private Integer status;
+
+    /**
+     * 赔付状态
+     */
+    private Integer paystatus;
+
+    private Date addtime;
+
+    private Integer num;
+
+    /**
+     * @return id
+     */
+    public Integer getId() {
+        return id;
+    }
+
+    /**
+     * @param id
+     */
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    /**
+     * @return orderid
+     */
+    public Integer getOrderid() {
+        return orderid;
+    }
+
+    /**
+     * @param orderid
+     */
+    public void setOrderid(Integer orderid) {
+        this.orderid = orderid;
+    }
+
+    /**
+     * 获取竞拍时间
+     *
+     * @return times - 竞拍时间
+     */
+    public String getTimes() {
+        return times;
+    }
+
+    /**
+     * 设置竞拍时间
+     *
+     * @param times 竞拍时间
+     */
+    public void setTimes(String times) {
+        this.times = times;
+    }
+
+    /**
+     * 获取竞拍状态
+     *
+     * @return status - 竞拍状态
+     */
+    public Integer getStatus() {
+        return status;
+    }
+
+    /**
+     * 设置竞拍状态
+     *
+     * @param status 竞拍状态
+     */
+    public void setStatus(Integer status) {
+        this.status = status;
+    }
+
+    /**
+     * 获取赔付状态
+     *
+     * @return paystatus - 赔付状态
+     */
+    public Integer getPaystatus() {
+        return paystatus;
+    }
+
+    /**
+     * 设置赔付状态
+     *
+     * @param paystatus 赔付状态
+     */
+    public void setPaystatus(Integer paystatus) {
+        this.paystatus = paystatus;
+    }
+
+    /**
+     * @return addtime
+     */
+    public Date getAddtime() {
+        return addtime;
+    }
+
+    /**
+     * @param addtime
+     */
+    public void setAddtime(Date addtime) {
+        this.addtime = addtime;
+    }
+
+    /**
+     * @return num
+     */
+    public Integer getNum() {
+        return num;
+    }
+
+    /**
+     * @param num
+     */
+    public void setNum(Integer num) {
+        this.num = num;
+    }
+}

+ 27 - 0
src/main/java/com/yc/education/model/Meal.java

@@ -74,6 +74,8 @@ public class Meal {
      */
     private String explains;
 
+
+
     /**
      * 注意事项
      */
@@ -84,12 +86,37 @@ public class Meal {
      */
     private Integer sort;
 
+    /**
+     * 当type 为2时   支付价格与赔付价格取id
+     */
+    @Transient
+    private Integer bid;
+
     @Transient
     private List<Labelbook> labelbook;
 
+    @Transient
+    private List<Labelbook> labelbooks;
+
     @Transient
     private List<Biddocument> biddocumentList;
 
+    public List<Labelbook> getLabelbooks() {
+        return labelbooks;
+    }
+
+    public void setLabelbooks(List<Labelbook> labelbooks) {
+        this.labelbooks = labelbooks;
+    }
+
+    public Integer getBid() {
+        return bid;
+    }
+
+    public void setBid(Integer bid) {
+        this.bid = bid;
+    }
+
     public List<Biddocument> getBiddocumentList() {
         return biddocumentList;
     }

+ 79 - 0
src/main/java/com/yc/education/model/Notice.java

@@ -0,0 +1,79 @@
+package com.yc.education.model;
+
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import java.util.Date;
+
+/**
+ * @author caolong
+ * @version 1.0.0
+ * @Details
+ * @ClassName Notice
+ * @Description TODO
+ * @createTime 2019-09-17 09:25:00
+ */
+public class Notice {
+
+    @Id
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
+    private Integer id;
+
+    private String title;
+
+    private String resume;
+
+    private String text;
+
+    private Integer userid;
+
+    private Date addtime;
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public String getTitle() {
+        return title;
+    }
+
+    public void setTitle(String title) {
+        this.title = title;
+    }
+
+    public String getResume() {
+        return resume;
+    }
+
+    public void setResume(String resume) {
+        this.resume = resume;
+    }
+
+    public String getText() {
+        return text;
+    }
+
+    public void setText(String text) {
+        this.text = text;
+    }
+
+    public Integer getUserid() {
+        return userid;
+    }
+
+    public void setUserid(Integer userid) {
+        this.userid = userid;
+    }
+
+    public Date getAddtime() {
+        return addtime;
+    }
+
+    public void setAddtime(Date addtime) {
+        this.addtime = addtime;
+    }
+}

+ 373 - 0
src/main/java/com/yc/education/model/Orders.java

@@ -0,0 +1,373 @@
+package com.yc.education.model;
+
+import java.math.BigDecimal;
+import java.util.Date;
+import java.util.List;
+import javax.persistence.*;
+
+public class Orders {
+    @Id
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
+    private Integer id;
+
+    /**
+     * 代拍价格
+     */
+    private BigDecimal price;
+
+    /**
+     * 套餐类型
+     */
+    private Integer type;
+
+    /**
+     * 代拍次数
+     */
+    private Integer num;
+
+    /**
+     * 代拍月份
+     */
+    private String times;
+
+    /**
+     * 协议服务id
+     */
+    private Integer serviceid;
+
+    private String ordersid;
+
+    /**
+     * 赔付金额
+     */
+    private BigDecimal payforprice;
+
+    private Date addtime;
+
+    private Integer mealid;
+
+    private Integer status;
+
+    private Integer youhuijuanid;
+
+    /**
+     * 用户id
+     */
+    private Integer userid;
+
+    /**
+     * 标书id
+     */
+    private String labelnum;
+
+    private String labelnum1;
+
+    private String payimg;
+
+    private String way;
+
+    private Integer auctionstatus;
+
+    @Transient
+    private Integer labeluse;
+
+    @Transient
+    private Labelbook labelbook;
+
+    private Integer paystatus;
+
+
+    public Integer getYouhuijuanid() {
+        return youhuijuanid;
+    }
+
+    public void setYouhuijuanid(Integer youhuijuanid) {
+        this.youhuijuanid = youhuijuanid;
+    }
+
+    private List<Labelbook> labelbooks;
+
+    public Integer getLabeluse() {
+        return labeluse;
+    }
+
+    public void setLabeluse(Integer labeluse) {
+        this.labeluse = labeluse;
+    }
+
+    public List<Labelbook> getLabelbooks() {
+        return labelbooks;
+    }
+
+    public void setLabelbooks(List<Labelbook> labelbooks) {
+        this.labelbooks = labelbooks;
+    }
+
+    public Labelbook getLabelbook() {
+        return labelbook;
+    }
+
+    public void setLabelbook(Labelbook labelbook) {
+        this.labelbook = labelbook;
+    }
+
+    public String getLabelnum1() {
+        return labelnum1;
+    }
+
+    public void setLabelnum1(String labelnum1) {
+        this.labelnum1 = labelnum1;
+    }
+
+    public String getPayimg() {
+        return payimg;
+    }
+
+    public void setPayimg(String payimg) {
+        this.payimg = payimg;
+    }
+
+    public String getWay() {
+        return way;
+    }
+
+    public void setWay(String way) {
+        this.way = way;
+    }
+
+    @Transient
+    private Meal meal;
+
+    @Transient
+    private Receipt receipt;
+
+
+    @Transient
+    private List<Auction> auctionList;
+
+    public Integer getPaystatus() {
+        return paystatus;
+    }
+
+    public void setPaystatus(Integer paystatus) {
+        this.paystatus = paystatus;
+    }
+
+    public Receipt getReceipt() {
+        return receipt;
+    }
+
+    public void setReceipt(Receipt receipt) {
+        this.receipt = receipt;
+    }
+
+    public Meal getMeal() {
+        return meal;
+    }
+
+    public void setMeal(Meal meal) {
+        this.meal = meal;
+    }
+
+    public Integer getAuctionstatus() {
+        return auctionstatus;
+    }
+
+    public void setAuctionstatus(Integer auctionstatus) {
+        this.auctionstatus = auctionstatus;
+    }
+
+    public List<Auction> getAuctionList() {
+        return auctionList;
+    }
+
+    public void setAuctionList(List<Auction> auctionList) {
+        this.auctionList = auctionList;
+    }
+
+    public String getOrdersid() {
+        return ordersid;
+    }
+
+    public void setOrdersid(String ordersid) {
+        this.ordersid = ordersid;
+    }
+
+    public Integer getStatus() {
+        return status;
+    }
+
+    public void setStatus(Integer status) {
+        this.status = status;
+    }
+
+    public Integer getMealid() {
+        return mealid;
+    }
+
+    public void setMealid(Integer mealid) {
+        this.mealid = mealid;
+    }
+
+    /**
+     * @return id
+     */
+    public Integer getId() {
+        return id;
+    }
+
+    /**
+     * @param id
+     */
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    /**
+     * 获取代拍价格
+     *
+     * @return price - 代拍价格
+     */
+    public BigDecimal getPrice() {
+        return price;
+    }
+
+    /**
+     * 设置代拍价格
+     *
+     * @param price 代拍价格
+     */
+    public void setPrice(BigDecimal price) {
+        this.price = price;
+    }
+
+    /**
+     * 获取套餐类型
+     *
+     * @return type - 套餐类型
+     */
+    public Integer getType() {
+        return type;
+    }
+
+    /**
+     * 设置套餐类型
+     *
+     * @param type 套餐类型
+     */
+    public void setType(Integer type) {
+        this.type = type;
+    }
+
+    /**
+     * 获取代拍次数
+     *
+     * @return num - 代拍次数
+     */
+    public Integer getNum() {
+        return num;
+    }
+
+    /**
+     * 设置代拍次数
+     *
+     * @param num 代拍次数
+     */
+    public void setNum(Integer num) {
+        this.num = num;
+    }
+
+    /**
+     * 获取代拍月份
+     *
+     * @return times - 代拍月份
+     */
+    public String getTimes() {
+        return times;
+    }
+
+    /**
+     * 设置代拍月份
+     *
+     * @param times 代拍月份
+     */
+    public void setTimes(String times) {
+        this.times = times;
+    }
+
+    /**
+     * 获取协议服务id
+     *
+     * @return serviceid - 协议服务id
+     */
+    public Integer getServiceid() {
+        return serviceid;
+    }
+
+    /**
+     * 设置协议服务id
+     *
+     * @param serviceid 协议服务id
+     */
+    public void setServiceid(Integer serviceid) {
+        this.serviceid = serviceid;
+    }
+
+    /**
+     * 获取赔付金额
+     *
+     * @return payforprice - 赔付金额
+     */
+    public BigDecimal getPayforprice() {
+        return payforprice;
+    }
+
+    /**
+     * 设置赔付金额
+     *
+     * @param payforprice 赔付金额
+     */
+    public void setPayforprice(BigDecimal payforprice) {
+        this.payforprice = payforprice;
+    }
+
+    /**
+     * @return addtime
+     */
+    public Date getAddtime() {
+        return addtime;
+    }
+
+    /**
+     * @param addtime
+     */
+    public void setAddtime(Date addtime) {
+        this.addtime = addtime;
+    }
+
+    /**
+     * 获取用户id
+     *
+     * @return userid - 用户id
+     */
+    public Integer getUserid() {
+        return userid;
+    }
+
+    /**
+     * 设置用户id
+     *
+     * @param userid 用户id
+     */
+    public void setUserid(Integer userid) {
+        this.userid = userid;
+    }
+
+    public String getLabelnum() {
+        return labelnum;
+    }
+
+    public void setLabelnum(String labelnum) {
+        this.labelnum = labelnum;
+    }
+}

+ 30 - 13
src/main/java/com/yc/education/model/Serviceagreement.java

@@ -17,8 +17,18 @@ public class Serviceagreement {
 
     private String labelnum;
 
+    private String labelnum1;
+
     private Integer mealid;
 
+    public String getLabelnum1() {
+        return labelnum1;
+    }
+
+    public void setLabelnum1(String labelnum1) {
+        this.labelnum1 = labelnum1;
+    }
+
     /**
      * 协议编号
      */
@@ -45,7 +55,26 @@ public class Serviceagreement {
 
     private String yifangname;
 
-    private String qddate;
+    private Date qddate;
+
+    @Transient
+    private String title;
+
+    public Date getQddate() {
+        return qddate;
+    }
+
+    public void setQddate(Date qddate) {
+        this.qddate = qddate;
+    }
+
+    public String getTitle() {
+        return title;
+    }
+
+    public void setTitle(String title) {
+        this.title = title;
+    }
 
     public String getLabelnum() {
         return labelnum;
@@ -233,17 +262,5 @@ public class Serviceagreement {
         this.yifangname = yifangname;
     }
 
-    /**
-     * @return qddate
-     */
-    public String getQddate() {
-        return qddate;
-    }
 
-    /**
-     * @param qddate
-     */
-    public void setQddate(String qddate) {
-        this.qddate = qddate;
-    }
 }

+ 20 - 0
src/main/java/com/yc/education/service/AuctionService.java

@@ -0,0 +1,20 @@
+package com.yc.education.service;
+
+import com.yc.education.model.Auction;
+
+import java.util.List;
+
+/**
+ * @author caolong
+ * @version 1.0.0
+ * @Details
+ * @ClassName AuctionService
+ * @Description TODO
+ * @createTime 2019-09-12 10:29:00
+ */
+public interface AuctionService extends IService<Auction> {
+
+
+    List<Auction> AUCTION_LIST(int orderid);
+
+}

+ 1 - 1
src/main/java/com/yc/education/service/LabelbookService.java

@@ -20,6 +20,6 @@ public interface LabelbookService extends IService<Labelbook> {
 
     List<Labelbook> LABERL_LIST(int page, int rows);
 
-    List<Labelbook> LABELBOOK_BY_NUM(String labelnumnum);
+    Labelbook LABELBOOK_BY_NUM(String labelnumnum);
 
 }

+ 19 - 0
src/main/java/com/yc/education/service/NoticeService.java

@@ -0,0 +1,19 @@
+package com.yc.education.service;
+
+import com.yc.education.model.Notice;
+
+import java.util.List;
+
+/**
+ * @author caolong
+ * @version 1.0.0
+ * @Details
+ * @ClassName NoticeService
+ * @Description TODO
+ * @createTime 2019-09-17 09:27:00
+ */
+public interface NoticeService extends IService<Notice> {
+
+    List<Notice> NOTICE_LIST_BY_USERID(int userid);
+
+}

+ 23 - 0
src/main/java/com/yc/education/service/OrdersService.java

@@ -0,0 +1,23 @@
+package com.yc.education.service;
+
+import com.yc.education.model.Orders;
+
+import java.util.List;
+
+/**
+ * @author caolong
+ * @version 1.0.0
+ * @Details
+ * @ClassName OrdersService
+ * @Description TODO
+ * @createTime 2019-09-12 09:35:00
+ */
+public interface OrdersService extends IService<Orders> {
+
+
+    List<Orders> ORDERS_LIST_USERID(int userid);
+
+    List<Orders> ORDERS_LIST_STATUS(int status, int page, int rows);
+
+
+}

+ 3 - 0
src/main/java/com/yc/education/service/ReceiptService.java

@@ -12,4 +12,7 @@ import org.springframework.stereotype.Service;
  * @createTime 2019-09-11 14:40:00
  */
 public interface ReceiptService extends IService<Receipt> {
+
+    Receipt RECEIPT_BY_ORDERID(int orderid);
+
 }

+ 30 - 0
src/main/java/com/yc/education/service/impl/AuctionServiceImpl.java

@@ -0,0 +1,30 @@
+package com.yc.education.service.impl;
+
+import com.yc.education.mapper.AuctionMapper;
+import com.yc.education.model.Auction;
+import com.yc.education.service.AuctionService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * @author caolong
+ * @version 1.0.0
+ * @Details
+ * @ClassName AuctionServiceImpl
+ * @Description TODO
+ * @createTime 2019-09-12 10:29:00
+ */
+@Service
+public class AuctionServiceImpl extends BaseService<Auction> implements AuctionService {
+
+    @Autowired
+    AuctionMapper auctionMapper;
+
+
+    @Override
+    public List<Auction> AUCTION_LIST(int orderid) {
+        return auctionMapper.auctionList(orderid);
+    }
+}

+ 1 - 1
src/main/java/com/yc/education/service/impl/LabelbookServiceImpl.java

@@ -40,7 +40,7 @@ public class LabelbookServiceImpl extends BaseService<Labelbook> implements Labe
     }
 
     @Override
-    public List<Labelbook> LABELBOOK_BY_NUM(String labelnumnum) {
+    public Labelbook LABELBOOK_BY_NUM(String labelnumnum) {
         return labelbookMapper.labelListsByNum(labelnumnum);
     }
 }

+ 30 - 0
src/main/java/com/yc/education/service/impl/NoticeServiceImpl.java

@@ -0,0 +1,30 @@
+package com.yc.education.service.impl;
+
+import com.yc.education.mapper.NoticeMapper;
+import com.yc.education.model.Notice;
+import com.yc.education.service.NoticeService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * @author caolong
+ * @version 1.0.0
+ * @Details
+ * @ClassName NoticeServiceImpl
+ * @Description TODO
+ * @createTime 2019-09-17 09:27:00
+ */
+@Service
+public class NoticeServiceImpl extends BaseService<Notice> implements NoticeService {
+
+    @Autowired
+    NoticeMapper noticeMapper;
+
+
+    @Override
+    public List<Notice> NOTICE_LIST_BY_USERID(int userid) {
+        return noticeMapper.NOTICE_LIST_BY_USERID(userid);
+    }
+}

+ 45 - 0
src/main/java/com/yc/education/service/impl/OrdersServiceImpl.java

@@ -0,0 +1,45 @@
+package com.yc.education.service.impl;
+
+import com.github.pagehelper.PageHelper;
+import com.yc.education.mapper.OrdersMapper;
+import com.yc.education.model.Orders;
+import com.yc.education.service.OrdersService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * @author caolong
+ * @version 1.0.0
+ * @Details
+ * @ClassName OrdersServiceImpl
+ * @Description TODO
+ * @createTime 2019-09-12 09:35:00
+ */
+@Service
+public class OrdersServiceImpl extends BaseService<Orders> implements OrdersService {
+
+    @Autowired
+    OrdersMapper ordersMapper;
+
+    @Override
+    public List<Orders> ORDERS_LIST_USERID(int userid) {
+        return ordersMapper.ordersListByUserId(userid);
+    }
+
+    @Override
+    public List<Orders> ORDERS_LIST_STATUS(int status, int page, int rows) {
+        try {
+            PageHelper.startPage(page, rows);
+            if (status == 3) {
+                return ordersMapper.ORDERS_LIST();
+            } else {
+                return ordersMapper.selectStatus(status);
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return null;
+    }
+}

+ 10 - 0
src/main/java/com/yc/education/service/impl/ReceiptServiceImpl.java

@@ -1,7 +1,9 @@
 package com.yc.education.service.impl;
 
+import com.yc.education.mapper.ReceiptMapper;
 import com.yc.education.model.Receipt;
 import com.yc.education.service.ReceiptService;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
 /**
@@ -14,4 +16,12 @@ import org.springframework.stereotype.Service;
  */
 @Service
 public class ReceiptServiceImpl extends BaseService<Receipt> implements ReceiptService {
+
+    @Autowired
+    ReceiptMapper receiptMapper;
+
+    @Override
+    public Receipt RECEIPT_BY_ORDERID(int orderid) {
+        return receiptMapper.selectByOrderId(orderid);
+    }
 }

+ 207 - 0
src/main/webapp/WEB-INF/jsp/admin/addacution.jsp

@@ -0,0 +1,207 @@
+<%@ page contentType="text/html;charset=UTF-8" language="java" %>
+<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
+<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
+<%
+    String base = pageContext.getServletContext().getContextPath();
+%>
+<!--_meta 作为公共模版分离出去-->
+<!DOCTYPE HTML>
+<html>
+<head>
+    <meta charset="utf-8">
+    <script type="text/javascript">
+        window.UEDITOR_SERVER_URL = '<%=base%>';
+    </script>
+    <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"/>
+
+    <link rel="stylesheet" type="text/css"
+          href="${pageContext.request.contextPath}/static/admin/index/h-ui/css/H-ui.min.css"/>
+    <link rel="stylesheet" type="text/css"
+          href="${pageContext.request.contextPath}/static/admin/index/h-ui.admin/css/H-ui.admin.css"/>
+    <link rel="stylesheet" type="text/css"
+          href="${pageContext.request.contextPath}/static/admin/index/Hui-iconfont/1.0.8/iconfont.css"/>
+    <link rel="stylesheet" type="text/css" href="${pageContext.request.contextPath}/static/admin/icheck/icheck.css"/>
+    <link rel="stylesheet" type="text/css"
+          href="${pageContext.request.contextPath}/static/admin/index/h-ui.admin/skin/default/skin.css" id="skin"/>
+    <link rel="stylesheet" type="text/css"
+          href="${pageContext.request.contextPath}/static/css/WdatePicker.css"/>
+    <link rel="stylesheet" type="text/css"
+          href="${pageContext.request.contextPath}/static/admin/index/h-ui.admin/css/style.css"/>
+
+    <script type="text/javascript" src="${pageContext.request.contextPath}/static/js/jquery.min.js"></script>
+    <script type="text/javascript" src="${pageContext.request.contextPath}/static/admin/index/layer/layer.js"></script>
+    <script type="text/javascript"
+            src="${pageContext.request.contextPath}/static/admin/js/jquery.validate.min.js"></script>
+    <script type="text/javascript"
+            src="${pageContext.request.contextPath}/static/admin/js/validate-methods.js"></script>
+    <script type="text/javascript"
+            src="${pageContext.request.contextPath}/static/admin/js/messages_zh.min.js"></script>
+    <script type="text/javascript"
+            src="${pageContext.request.contextPath}/static/admin/icheck/jquery.icheck.min.js"></script>
+    <script src="${pageContext.request.contextPath}/static/admin/js/laydate/laydate.js"></script>
+    <script src="${pageContext.request.contextPath}/static/js/layer/layer.js"></script>
+    <script src="${pageContext.request.contextPath}/static/admin/manage/h-ui.admin/js/H-ui.admin.js"></script>
+    <title>管理员管理</title>
+</head>
+<body>
+<nav class="breadcrumb">
+    <a><i class="Hui-iconfont">&#xe67f;</i> 订单列表</a>
+    <span class="c-gray en">&gt;</span> 修改订单
+    <a class="btn btn-success radius r" style="line-height:1.6em;margin-top:3px"
+       href="javascript:location.replace(location.href);" title="刷新"><i class="Hui-iconfont">&#xe68f;</i></a>
+</nav>
+<article class="page-containe">
+    <form action="upacution.html" method="post" enctype="multipart/form-data" class="form form-horizontal"
+          id="subform">
+        <div class="row cl">
+            <label class="form-label col-xs-4 col-sm-2"><span class="c-red">*</span>订单编号:</label>
+            <div class="formControls col-xs-8 col-sm-9">
+                <input type="text" class="input-text" name="" readonly value="${orders.ordersid }">
+            </div>
+        </div>
+
+        <div class="row cl">
+            <label class="form-label col-xs-4 col-sm-2"><span class="c-red">*</span>代拍次数:</label>
+            <div class="formControls col-xs-8 col-sm-9">
+                <input type="text" class="input-text" name="" readonly value="第${auctions.num }次">
+            </div>
+        </div>
+
+        <input type="hidden" value="${auctions.id}" name="id"/>
+        <input type="hidden" value="${orders.id}" name="orderid"/>
+
+        <div class="row cl">
+            <label class="form-label col-xs-4 col-sm-2"><span class="c-red">*</span>赔付金额:</label>
+            <div class="formControls col-xs-8 col-sm-9">
+                <input type="text" class="input-text" name="price" readonly value="${orders.payforprice }">
+            </div>
+        </div>
+
+        <div class="row cl">
+            <label class="form-label col-xs-4 col-sm-2"><span class="c-red">*</span>代拍时间:</label>
+            <div class="formControls col-xs-8 col-sm-9">
+                <input type="text" class="input-text" id="test1" name="times" value="${auctions.times}"
+                       placeholder="yyyy-MM-dd">
+            </div>
+        </div>
+
+
+        <div class="row cl">
+            <label class="form-label col-xs-4 col-sm-2"><span class="c-red">*</span>赔付状态 :</label>
+            <div class="formControls col-xs-8 col-sm-9">
+                <select name="paystatus" class="input-text">
+                    <option value="0" <c:if test="${auctions.paystatus == 0}"> selected</c:if> >
+                        未赔付
+                    </option>
+                    <option value="1" <c:if test="${auctions.paystatus == 1}"> selected</c:if>>
+                        已赔付
+                    </option>
+                </select>
+            </div>
+        </div>
+
+        <div class="row cl">
+            <label class="form-label col-xs-4 col-sm-2"><span class="c-red">*</span>中标状态 :</label>
+            <div class="formControls col-xs-8 col-sm-9">
+                <select name="status" class="input-text">
+                    <option value="3" <c:if test="${auctions.status == 3}"> selected</c:if>>
+                        待竞拍
+                    </option>
+                    <option value="0" <c:if test="${auctions.status == 0}"> selected</c:if> >
+                        未中标
+                    </option>
+                    <option value="1" <c:if test="${auctions.status == 1}"> selected</c:if>>
+                        已中标
+                    </option>
+                </select>
+            </div>
+        </div>
+
+        <div class="row cl">
+            <div class="col-xs-8 col-sm-9 col-xs-offset-4 col-sm-offset-2">
+                <button type="submit" class="btn btn-success radius" id="sub" name="admin-role-save"><i
+                        class="icon-ok"></i> 确定
+                </button>
+            </div>
+        </div>
+    </form>
+</article>
+
+<!--请在下方写此页面业务相关的脚本-->
+<!-- 百度文本编辑器   引用文件 -->
+
+<link href="<%=base%>/static/ue/themes/default/css/ueditor.css" type="text/css" rel="stylesheet">
+<script src="<%=base%>/static/ue/ueditor.config.js" type="text/javascript"></script>
+<script src="<%=base%>/static/ue/ueditor.all.js" type="text/javascript"></script>
+<script type="text/javascript" src="<%=base%>/static/ue/lang/zh-cn/zh-cn.js"></script>
+<!-- 百度文本编辑器   js -->
+<script type="text/javascript">
+
+    function admin_role_edit(title, url, id, w, h) {
+        layer_show(title, url, w, h);
+    }
+
+    laydate.render({
+        elem: '#test1' //指定元素
+        , format: 'yyyy-MM-dd'
+    });
+
+    var num = 1;
+
+    $("#xiazai").click(function () {
+
+    });
+    $("#chakan").click(function () {
+
+    });
+
+    function norm_add() {
+        $("#norm_html").append('<div class="row cl">\n' +
+            '\t\t\t\t<label class="form-label col-xs-4 col-sm-2"></label>\n' +
+            '\t\t\t\t<div class="formControls col-xs-8 col-sm-2">\n' +
+            '\t\t\t\t\t<input type="text" class="input-text" name="meal.biddocumentList[' + num + '].price" placeholder="代拍价格">\n' +
+            '\t\t\t\t</div>\n' +
+            '\t\t\t\t<div class="formControls col-xs-8 col-sm-2">\n' +
+            '\t\t\t\t\t<input type="text" class="input-text" name="meal.biddocumentList[' + num + '].payforprice" placeholder="赔付价格">\n' +
+            '\t\t\t\t</div>');
+        num++;
+    }
+
+
+    var currentBrowserId;
+
+    function browserImage(targetId) {
+        currentBrowserId = targetId;
+        var weboxTemp = $.webox({
+            height: 600,
+            width: 1024,
+            bgvisibel: true,
+            title: '图片管理',
+            iframe: '<%=base%>/admin/image/imgbox.html?' + Math.random()
+        });
+    }
+
+    function setImagepath(imgPath) {
+        $('#' + currentBrowserId).val(imgPath);
+    }
+
+    function closeFrame() {
+        $('#locked .span').click();
+    }
+</script>
+
+
+<!--请在下方写此页面业务相关的脚本-->
+<script type="text/javascript">
+
+</script>
+<!--/请在上方写此页面业务相关的脚本-->
+</body>
+</html>

+ 1 - 1
src/main/webapp/WEB-INF/jsp/admin/addlaberbook.jsp

@@ -105,7 +105,7 @@
         <div class="row cl">
             <label class="form-label col-xs-4 col-sm-2"><span class="c-red">*</span>标书图片:</label>
             <div class="formControls col-xs-8 col-sm-9">
-                <img src="${labelbook.labelpic}" width="700px" height="600px" readonly="">
+                <img src="${labelbook.labelpic}" width="500px" height="600px" readonly="">
             </div>
         </div>
 

+ 10 - 1
src/main/webapp/WEB-INF/jsp/admin/addmeal.jsp

@@ -77,6 +77,7 @@
 
 
         <c:if test="${type == 2}">
+            <input type="hidden" name="num" value="1">
             <div class="row cl">
                 <label class="form-label col-xs-4 col-sm-2"><span class="c-red">*</span>套餐类型:</label>
                 <div class="formControls col-xs-8 col-sm-9">
@@ -103,7 +104,7 @@
                         </div>
                     </c:forEach>
                 </c:if>
-                <c:if test="${meal.biddocumentList.size() == 0}">
+                <c:if test="${meal.biddocumentList == null}">
                     <div class="row cl">
                         <label class="form-label col-xs-4 col-sm-2"></label>
                         <div class="formControls col-xs-8 col-sm-2">
@@ -186,6 +187,10 @@
 
 
 
+
+
+
+
                 </script>
             </div>
         </div>
@@ -202,6 +207,10 @@
 
 
 
+
+
+
+
                 </script>
             </div>
         </div>

+ 229 - 0
src/main/webapp/WEB-INF/jsp/admin/addorders.jsp

@@ -0,0 +1,229 @@
+<%@ page contentType="text/html;charset=UTF-8" language="java" %>
+<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
+<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
+<%
+    String base = pageContext.getServletContext().getContextPath();
+%>
+<!--_meta 作为公共模版分离出去-->
+<!DOCTYPE HTML>
+<html>
+<head>
+    <meta charset="utf-8">
+    <script type="text/javascript">
+        window.UEDITOR_SERVER_URL = '<%=base%>';
+    </script>
+    <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"/>
+
+    <link rel="stylesheet" type="text/css"
+          href="${pageContext.request.contextPath}/static/admin/index/h-ui/css/H-ui.min.css"/>
+    <link rel="stylesheet" type="text/css"
+          href="${pageContext.request.contextPath}/static/admin/index/h-ui.admin/css/H-ui.admin.css"/>
+    <link rel="stylesheet" type="text/css"
+          href="${pageContext.request.contextPath}/static/admin/index/Hui-iconfont/1.0.8/iconfont.css"/>
+    <link rel="stylesheet" type="text/css" href="${pageContext.request.contextPath}/static/admin/icheck/icheck.css"/>
+    <link rel="stylesheet" type="text/css"
+          href="${pageContext.request.contextPath}/static/admin/index/h-ui.admin/skin/default/skin.css" id="skin"/>
+    <link rel="stylesheet" type="text/css"
+          href="${pageContext.request.contextPath}/static/css/WdatePicker.css"/>
+    <link rel="stylesheet" type="text/css"
+          href="${pageContext.request.contextPath}/static/admin/index/h-ui.admin/css/style.css"/>
+
+    <script type="text/javascript" src="${pageContext.request.contextPath}/static/js/jquery.min.js"></script>
+    <script type="text/javascript" src="${pageContext.request.contextPath}/static/admin/index/layer/layer.js"></script>
+    <script type="text/javascript"
+            src="${pageContext.request.contextPath}/static/admin/js/jquery.validate.min.js"></script>
+    <script type="text/javascript"
+            src="${pageContext.request.contextPath}/static/admin/js/validate-methods.js"></script>
+    <script type="text/javascript"
+            src="${pageContext.request.contextPath}/static/admin/js/messages_zh.min.js"></script>
+    <script type="text/javascript"
+            src="${pageContext.request.contextPath}/static/admin/icheck/jquery.icheck.min.js"></script>
+    <script src="${pageContext.request.contextPath}/static/admin/js/laydate/laydate.js"></script>
+    <script src="${pageContext.request.contextPath}/static/js/layer/layer.js"></script>
+    <script src="${pageContext.request.contextPath}/static/admin/manage/h-ui.admin/js/H-ui.admin.js"></script>
+    <title>管理员管理</title>
+</head>
+<body>
+<nav class="breadcrumb">
+    <a><i class="Hui-iconfont">&#xe67f;</i> 订单列表</a>
+    <span class="c-gray en">&gt;</span> 修改订单
+    <a class="btn btn-success radius r" style="line-height:1.6em;margin-top:3px"
+       href="javascript:location.replace(location.href);" title="刷新"><i class="Hui-iconfont">&#xe68f;</i></a>
+</nav>
+<article class="page-containe">
+    <form action="uporders.html" method="post" enctype="multipart/form-data" class="form form-horizontal"
+          id="subform">
+        <div class="row cl">
+            <label class="form-label col-xs-4 col-sm-2"><span class="c-red">*</span>套餐名称:</label>
+            <div class="formControls col-xs-8 col-sm-9">
+                <input type="text" class="input-text" name="" readonly value="${orders.meal.title }">
+            </div>
+        </div>
+
+        <div class="row cl">
+            <label class="form-label col-xs-4 col-sm-2"><span class="c-red">*</span>订单金额:</label>
+            <div class="formControls col-xs-8 col-sm-9">
+                <input type="text" class="input-text" name="price" readonly value="${orders.price }">
+            </div>
+        </div>
+        <input type="hidden" value="${orders.id}" name="id"/>
+        <input type="hidden" value="${orders.userid}" name="userid"/>
+
+        <div class="row cl">
+            <label class="form-label col-xs-4 col-sm-2"><span class="c-red">*</span>赔付类型:</label>
+            <div class="formControls col-xs-4 col-sm-2">
+                <input type="text" class="input-text" name="num" readonly value="${orders.num}">
+            </div>
+            <div class="formControls col-xs-4 col-sm-2" style="margin: 0;line-height: 31px;padding: 0;width: 85px;">
+                次不中拍赔:
+            </div>
+            <div class="formControls col-xs-2 col-sm-2">
+                <input type="text" class="input-text" readonly name="payforprice" value="${orders.payforprice }">
+            </div>
+            <div class="formControls col-xs-2 col-sm-2" style="margin: 0;line-height: 31px;padding: 0;">
+                元
+            </div>
+        </div>
+
+        <div class="row cl">
+            <label class="form-label col-xs-4 col-sm-2"><span class="c-red">*</span>合同查看:</label>
+            <div class="formControls col-xs-8 col-sm-9">
+                <a title="合同查看" href="javascript:;"
+                   onclick="admin_role_edit('合同查看','../xieyichakan.html?id=${orders.serviceid}','1')"
+                   style="text-decoration:none"><i class="Hui-iconfont">合同查看</i></a>
+                <%--                <a href="javascript:;" id="xiazai">立即下载</a>--%>
+                <%--                <a href="javascript:;" id="chakan">立即查看</a>--%>
+            </div>
+        </div>
+
+        <div class="row cl">
+            <label class="form-label col-xs-4 col-sm-2"><span class="c-red">*</span>代拍时间:</label>
+            <div class="formControls col-xs-8 col-sm-9">
+                <input type="text" class="input-text" id="test1" name="times" value="${orders.times}"
+                       placeholder="yyyy-MM">
+            </div>
+        </div>
+
+
+        <div class="row cl">
+            <label class="form-label col-xs-4 col-sm-2"><span class="c-red">*</span>审核状态:</label>
+            <div class="formControls col-xs-8 col-sm-9">
+                <select name="status" class="input-text">
+                    <option value="0" <c:if test="${orders.status == 0}"> selected</c:if> >
+                        待审核
+                    </option>
+                    <option value="1" <c:if test="${orders.status == 1}"> selected</c:if>>
+                        审核通过
+                    </option>
+                    <option value="2" <c:if test="${orders.status == 2}"> selected</c:if>>
+                        审核驳回
+                    </option>
+                </select>
+            </div>
+        </div>
+
+        <div class="row cl">
+            <label class="form-label col-xs-4 col-sm-2"><span class="c-red">*</span>支付方式:</label>
+            <div class="formControls col-xs-8 col-sm-9">
+                <input type="text" class="input-text" name="price" readonly value="${orders.way }">
+            </div>
+        </div>
+
+
+        <c:if test="${orders.way == '线下支付'}">
+            <div class="row cl">
+                <label class="form-label col-xs-4 col-sm-2"><span class="c-red">*</span>支付凭证:</label>
+                <div class="formControls col-xs-8 col-sm-9">
+                    <img src="${orders.payimg}" width="500px" height="600px" readonly="">
+                </div>
+            </div>
+        </c:if>
+
+        <div class="row cl">
+            <div class="col-xs-8 col-sm-9 col-xs-offset-4 col-sm-offset-2">
+                <button type="submit" class="btn btn-success radius" id="sub" name="admin-role-save"><i
+                        class="icon-ok"></i> 确定
+                </button>
+            </div>
+        </div>
+    </form>
+</article>
+
+<!--请在下方写此页面业务相关的脚本-->
+<!-- 百度文本编辑器   引用文件 -->
+
+<link href="<%=base%>/static/ue/themes/default/css/ueditor.css" type="text/css" rel="stylesheet">
+<script src="<%=base%>/static/ue/ueditor.config.js" type="text/javascript"></script>
+<script src="<%=base%>/static/ue/ueditor.all.js" type="text/javascript"></script>
+<script type="text/javascript" src="<%=base%>/static/ue/lang/zh-cn/zh-cn.js"></script>
+<!-- 百度文本编辑器   js -->
+<script type="text/javascript">
+
+    function admin_role_edit(title, url, id, w, h) {
+        layer_show(title, url, w, h);
+    }
+
+    laydate.render({
+        elem: '#test1' //指定元素
+        , format: 'yyyy-MM'
+    });
+
+    var num = 1;
+
+    $("#xiazai").click(function () {
+
+    });
+    $("#chakan").click(function () {
+
+    });
+
+    function norm_add() {
+        $("#norm_html").append('<div class="row cl">\n' +
+            '\t\t\t\t<label class="form-label col-xs-4 col-sm-2"></label>\n' +
+            '\t\t\t\t<div class="formControls col-xs-8 col-sm-2">\n' +
+            '\t\t\t\t\t<input type="text" class="input-text" name="meal.biddocumentList[' + num + '].price" placeholder="代拍价格">\n' +
+            '\t\t\t\t</div>\n' +
+            '\t\t\t\t<div class="formControls col-xs-8 col-sm-2">\n' +
+            '\t\t\t\t\t<input type="text" class="input-text" name="meal.biddocumentList[' + num + '].payforprice" placeholder="赔付价格">\n' +
+            '\t\t\t\t</div>');
+        num++;
+    }
+
+
+    var currentBrowserId;
+
+    function browserImage(targetId) {
+        currentBrowserId = targetId;
+        var weboxTemp = $.webox({
+            height: 600,
+            width: 1024,
+            bgvisibel: true,
+            title: '图片管理',
+            iframe: '<%=base%>/admin/image/imgbox.html?' + Math.random()
+        });
+    }
+
+    function setImagepath(imgPath) {
+        $('#' + currentBrowserId).val(imgPath);
+    }
+
+    function closeFrame() {
+        $('#locked .span').click();
+    }
+</script>
+
+
+<!--请在下方写此页面业务相关的脚本-->
+<script type="text/javascript">
+
+</script>
+<!--/请在上方写此页面业务相关的脚本-->
+</body>
+</html>

+ 191 - 0
src/main/webapp/WEB-INF/jsp/admin/adminauction.jsp

@@ -0,0 +1,191 @@
+<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
+<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
+<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
+<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<html>
+<head>
+    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+    <title>后台管理</title>
+
+    <link rel="stylesheet" type="text/css"
+          href="${pageContext.request.contextPath}/static/admin/index/h-ui/css/H-ui.min.css"/>
+    <link rel="stylesheet" type="text/css"
+          href="${pageContext.request.contextPath}/static/admin/index/h-ui.admin/css/H-ui.admin.css"/>
+    <link rel="stylesheet" type="text/css"
+          href="${pageContext.request.contextPath}/static/admin/index/Hui-iconfont/1.0.8/iconfont.css"/>
+    <link rel="stylesheet" type="text/css"
+          href="${pageContext.request.contextPath}/static/admin/index/h-ui.admin/skin/default/skin.css" id="skin"/>
+    <link rel="stylesheet" type="text/css"
+          href="${pageContext.request.contextPath}/static/admin/index/h-ui.admin/css/style.css"/>
+    <link href="${pageContext.request.contextPath}/static/admin/css/page.css" rel="stylesheet" type="text/css"/>
+    <script type="text/javascript"
+            src="${pageContext.request.contextPath}/static/admin/index/jquery/1.9.1/jquery.min.js"></script>
+    <script type="text/javascript" src="${pageContext.request.contextPath}/static/admin/index/layer/layer.js"></script>
+    <script type="text/javascript"
+            src="${pageContext.request.contextPath}/static/admin/index/h-ui/js/H-ui.min.js"></script>
+    <script type="text/javascript"
+            src="${pageContext.request.contextPath}/static/admin/index/h-ui.admin/js/H-ui.admin.js"></script>
+</head>
+<body>
+<nav class="breadcrumb">
+    <i class="Hui-iconfont">&#xe67f;</i> 订单管理
+    <a class="btn btn-success radius r" style="line-height:1.6em;margin-top:3px"
+       href="javascript:location.replace(location.href);" title="刷新"><i class="Hui-iconfont">&#xe68f;</i></a>
+</nav>
+<div class="page-container">
+    <%--    <form action="adminorder.html" method="post" id="search">--%>
+    <%--        <div class="text-c">--%>
+    <%--            订单状态--%>
+    <%--            <span class="select-box inline">--%>
+    <%--					<select name="status" class="select">--%>
+    <%--						<option value="3" <c:if test="${status == 3 }">selected="selected"</c:if>>全部</option>--%>
+    <%--	              		<option value="0" <c:if test="${status == 0 }">selected="selected"</c:if>>待审核</option>--%>
+    <%--	              		<option value="1" <c:if test="${status == 1 }">selected="selected"</c:if>>审核通过</option>--%>
+    <%--	              		<option value="2" <c:if test="${status == 2 }">selected="selected"</c:if>>审核驳回</option>--%>
+    <%--					</select>--%>
+    <%--				</span>--%>
+    <%--            <button onClick="$('#search').submit()" class="btn btn-success" type="submit"><i class="Hui-iconfont">&#xe665;</i>--%>
+    <%--                搜索--%>
+    <%--            </button>--%>
+    <%--        </div>--%>
+    <%--    </form>--%>
+    <div class="cl pd-5 bg-1 bk-gray mt-20">
+        <span class="r">共有数据:<strong>${auctions.size() }</strong> 条</span>
+    </div>
+    <div class="mt-20">
+        <table class="table table-border table-bordered table-bg table-hover table-sort">
+            <thead>
+            <tr class="text-c">
+                <%--<th><input type="checkbox" id="sltall"/> </th>--%>
+                <th width="80">编号</th>
+                <th width="150">订单编号</th>
+                <th width="150">代拍次数</th>
+                <%--                <th width="150">赔付金额</th>--%>
+                <th width="200">代拍时间</th>
+                <th width="200">中标状态</th>
+                <th width="200">赔付状态</th>
+                <th width="200">添加时间</th>
+                <th width="200">操作</th>
+            </tr>
+            </thead>
+            <tbody>
+            <c:forEach items="${auctions}" var="auctions">
+                <tr class="text-c">
+                        <%--<td> <input type="checkbox" name="id" value="${item.id }"/></td>--%>
+                    <td>${auctions.id }</td>
+                    <td>${orders.ordersid }</td>
+                    <td>第${auctions.num }次</td>
+                        <%--                    <td>${orders.payforprice }</td>--%>
+                    <td>${auctions.times }</td>
+                    <c:if test="${auctions.times == '' || auctions.times == null}">
+                        <td>待竞拍</td>
+                    </c:if>
+                    <c:if test="${auctions.times != '' && auctions.times != null}">
+                        <c:if test="${auctions.status == 0}">
+                            <td>未中标</td>
+                        </c:if>
+                        <c:if test="${auctions.status == 1}">
+                            <td>已中标</td>
+                        </c:if>
+                        <c:if test="${auctions.status == 3}">
+                            <td>等待竞拍</td>
+                        </c:if>
+                    </c:if>
+                    <c:if test="${auctions.paystatus == 0}">
+                        <td>未赔付</td>
+                    </c:if>
+                    <c:if test="${auctions.paystatus == 1}">
+                        <td>已赔付</td>
+                    </c:if>
+                    <td><fmt:formatDate value="${auctions.addtime }" pattern="yyyy-MM-dd"/></td>
+                    <td class="f-14 td-manage">
+                        <a style="text-decoration:none" class="ml-5"
+                           href="addacution.html?id=${auctions.id }"
+                           title="查看"><i
+                                class="Hui-iconfont">&#xe6df;</i></a>
+                            <%--                        <a href="javascript:del(${item.id })"><i class="Hui-iconfont">&#xe6e2;</i></a>--%>
+                    </td>
+                </tr>
+            </c:forEach>
+            </tbody>
+        </table>
+    </div>
+
+    <%--    <div id="PageNum">--%>
+    <%--        <section>--%>
+    <%--            <div class="bd points-goods-list">--%>
+    <%--                <ul class="pages">--%>
+    <%--                    <li><a href="adminorder.html?status=${status}&page=1&rows=${pageInfo.pageSize}">首页</a></li>--%>
+    <%--                    <li class="prev"><a--%>
+    <%--                            href="adminorder.html?status=${status}&page=${pageInfo.prePage}&rows=${pageInfo.pageSize}">上一页</a>--%>
+    <%--                    </li>--%>
+    <%--                    <c:forEach items="${pageInfo.navigatepageNums}" var="nav">--%>
+    <%--                        <c:if test="${nav == pageInfo.pageNum}">--%>
+    <%--                            <li><a href="adminorder.html?status=${status}&page=${nav}&rows=${pageInfo.pageSize}"--%>
+    <%--                                   class="active">${nav}</a></li>--%>
+    <%--                        </c:if>--%>
+    <%--                        <c:if test="${nav != pageInfo.pageNum}">--%>
+    <%--                            <li>--%>
+    <%--                                <a href="adminorder.html?status=${status}&page=${nav}&rows=${pageInfo.pageSize}">${nav}</a>--%>
+    <%--                            </li>--%>
+    <%--                        </c:if>--%>
+    <%--                    </c:forEach>--%>
+    <%--                    <li class="next"><a--%>
+    <%--                            href="adminorder.html?status=${status}&page=${pageInfo.nextPage}&rows=${pageInfo.pageSize}">下一页</a>--%>
+    <%--                    </li>--%>
+    <%--                    <li>--%>
+    <%--                        <a href="adminorder.html?status=${status}&page=${pageInfo.pages }&rows=${pageInfo.pageSize}">末页</a>--%>
+    <%--                    </li>--%>
+    <%--                </ul>--%>
+    <%--            </div>--%>
+    <%--        </section>--%>
+    <%--    </div>--%>
+</div>
+</div>
+<script type="text/javascript">
+    //全选与反选
+    $("#sltall").click(function () {
+        if ($(this).prop("checked")) {
+            $("[name='id']").prop("checked", true);//全选
+        } else {
+            $("[name='id']").prop("checked", false);//取消全选
+        }
+    });
+
+
+    function downs() {
+        var chkvalue = "";//定义一个数组
+        $("input[name='id']:checked").each(function () {
+            chkvalue += $(this).val() + ",";
+        });
+        window.location.href = "signexcels.html?chkvalue=" + chkvalue;
+    };
+
+    function del(id) {
+        layer.confirm('确认要删除吗?', function (index) {
+            $.post("delorder.html", {id: id}, function (data) {
+                if (data.is) {
+                    layer.alert(data.msg, {skin: 'layui-layer-molv', closeBtn: 0, anim: 4}, function () {
+                        window.location = window.location;
+                    });
+                } else {
+                    layer.msg(data.msg, {icon: 2, time: 1000});
+                }
+            }, "json");
+        });
+    }
+
+    function lookimg(obj) {
+        var img = $(obj).find("img").attr("src");
+        layer.open({
+            type: 1, skin: 'layui-layer-rim', //加上边框
+            title: "查看大图",
+            area: ['45%', '60%'], //宽高
+            content: '<img id="img" src="' + img + '" width="95%" height="auto" style="margin: 2%;">'
+        });
+
+    }
+</script>
+</body>
+</html>

+ 197 - 0
src/main/webapp/WEB-INF/jsp/admin/adminorder.jsp

@@ -0,0 +1,197 @@
+<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
+<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
+<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
+<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<html>
+<head>
+    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+    <title>后台管理</title>
+
+    <link rel="stylesheet" type="text/css"
+          href="${pageContext.request.contextPath}/static/admin/index/h-ui/css/H-ui.min.css"/>
+    <link rel="stylesheet" type="text/css"
+          href="${pageContext.request.contextPath}/static/admin/index/h-ui.admin/css/H-ui.admin.css"/>
+    <link rel="stylesheet" type="text/css"
+          href="${pageContext.request.contextPath}/static/admin/index/Hui-iconfont/1.0.8/iconfont.css"/>
+    <link rel="stylesheet" type="text/css"
+          href="${pageContext.request.contextPath}/static/admin/index/h-ui.admin/skin/default/skin.css" id="skin"/>
+    <link rel="stylesheet" type="text/css"
+          href="${pageContext.request.contextPath}/static/admin/index/h-ui.admin/css/style.css"/>
+    <link href="${pageContext.request.contextPath}/static/admin/css/page.css" rel="stylesheet" type="text/css"/>
+    <script type="text/javascript"
+            src="${pageContext.request.contextPath}/static/admin/index/jquery/1.9.1/jquery.min.js"></script>
+    <script type="text/javascript" src="${pageContext.request.contextPath}/static/admin/index/layer/layer.js"></script>
+    <script type="text/javascript"
+            src="${pageContext.request.contextPath}/static/admin/index/h-ui/js/H-ui.min.js"></script>
+    <script type="text/javascript"
+            src="${pageContext.request.contextPath}/static/admin/index/h-ui.admin/js/H-ui.admin.js"></script>
+</head>
+<body>
+<nav class="breadcrumb">
+    <i class="Hui-iconfont">&#xe67f;</i> 订单管理
+    <a class="btn btn-success radius r" style="line-height:1.6em;margin-top:3px"
+       href="javascript:location.replace(location.href);" title="刷新"><i class="Hui-iconfont">&#xe68f;</i></a>
+</nav>
+<div class="page-container">
+    <form action="adminorder.html" method="post" id="search">
+        <div class="text-c">
+            订单状态
+            <span class="select-box inline">
+					<select name="status" class="select">
+						<option value="3" <c:if test="${status == 3 }">selected="selected"</c:if>>全部</option>
+	              		<option value="0" <c:if test="${status == 0 }">selected="selected"</c:if>>待审核</option>
+	              		<option value="1" <c:if test="${status == 1 }">selected="selected"</c:if>>审核通过</option>
+	              		<option value="2" <c:if test="${status == 2 }">selected="selected"</c:if>>审核驳回</option>
+					</select>
+				</span>
+            <button onClick="$('#search').submit()" class="btn btn-success" type="submit"><i class="Hui-iconfont">&#xe665;</i>
+                搜索
+            </button>
+        </div>
+    </form>
+    <div class="cl pd-5 bg-1 bk-gray mt-20">
+        <span class="r">共有数据:<strong>${pageInfo.total }</strong> 条</span>
+    </div>
+    <div class="mt-20">
+        <table class="table table-border table-bordered table-bg table-hover table-sort">
+            <thead>
+            <tr class="text-c">
+                <%--<th><input type="checkbox" id="sltall"/> </th>--%>
+                <th width="150">套餐名称</th>
+                <th width="200">用户编号</th>
+                <th width="150">订单金额</th>
+                <th width="150">代拍次数</th>
+                <th width="150">赔付金额</th>
+                <th width="200">标书可用次数</th>
+                <th width="200">竞拍次数</th>
+                <th width="200">订单状态</th>
+                <th width="200">添加时间</th>
+                <th width="200">操作</th>
+            </tr>
+            </thead>
+            <tbody>
+            <c:forEach items="${pageInfo.list }" var="item">
+                <tr class="text-c">
+                        <%--<td> <input type="checkbox" name="id" value="${item.id }"/></td>--%>
+                    <td>${item.meal.title }</td>
+                    <td>${item.userid }</td>
+                    <td>${item.price }</td>
+                    <td>${item.num }</td>
+                    <td>${item.payforprice }</td>
+                    <td>
+                        <c:if test="${item.type == 1}">
+                            ${item.labelbook.useing}/ ${item.labelbook.num}
+                        </c:if>
+                        <c:if test="${item.type == 2}">
+                            <c:forEach items="${item.labelbooks}" var="labelbooks">
+                                ${labelbooks.useing}/ ${labelbooks.num}
+                                <br/>
+                            </c:forEach>
+                        </c:if>
+                    </td>
+                    <td>${item.labeluse }</td>
+                    <c:if test="${item.status == 0}">
+                        <td>待审核</td>
+                    </c:if>
+                    <c:if test="${item.status == 1}">
+                        <td>审核通过</td>
+                    </c:if>
+                    <c:if test="${item.status == 2}">
+                        <td>审核驳回</td>
+                    </c:if>
+                    <td><fmt:formatDate value="${item.addtime }" pattern="yyyy-MM-dd"/></td>
+                    <td class="f-14 td-manage">
+                        <a style="text-decoration:none" class="ml-5"
+                           href="addorders.html?id=${item.id }"
+                           title="查看"><i
+                                class="Hui-iconfont">&#xe6df;</i></a>
+                        <a style="text-decoration:none" class="ml-5"
+                           href="adminauction.html?id=${item.id }"
+                           title="竞拍管理"><i
+                                class="Hui-iconfont">&#xe61d;</i></a>
+                        <a href="javascript:del(${item.id })"><i class="Hui-iconfont">&#xe6e2;</i></a>
+                    </td>
+                </tr>
+            </c:forEach>
+            </tbody>
+        </table>
+    </div>
+
+    <div id="PageNum">
+        <section>
+            <div class="bd points-goods-list">
+                <ul class="pages">
+                    <li><a href="adminorder.html?status=${status}&page=1&rows=${pageInfo.pageSize}">首页</a></li>
+                    <li class="prev"><a
+                            href="adminorder.html?status=${status}&page=${pageInfo.prePage}&rows=${pageInfo.pageSize}">上一页</a>
+                    </li>
+                    <c:forEach items="${pageInfo.navigatepageNums}" var="nav">
+                        <c:if test="${nav == pageInfo.pageNum}">
+                            <li><a href="adminorder.html?status=${status}&page=${nav}&rows=${pageInfo.pageSize}"
+                                   class="active">${nav}</a></li>
+                        </c:if>
+                        <c:if test="${nav != pageInfo.pageNum}">
+                            <li>
+                                <a href="adminorder.html?status=${status}&page=${nav}&rows=${pageInfo.pageSize}">${nav}</a>
+                            </li>
+                        </c:if>
+                    </c:forEach>
+                    <li class="next"><a
+                            href="adminorder.html?status=${status}&page=${pageInfo.nextPage}&rows=${pageInfo.pageSize}">下一页</a>
+                    </li>
+                    <li>
+                        <a href="adminorder.html?status=${status}&page=${pageInfo.pages }&rows=${pageInfo.pageSize}">末页</a>
+                    </li>
+                </ul>
+            </div>
+        </section>
+    </div>
+</div>
+</div>
+<script type="text/javascript">
+    //全选与反选
+    $("#sltall").click(function () {
+        if ($(this).prop("checked")) {
+            $("[name='id']").prop("checked", true);//全选
+        } else {
+            $("[name='id']").prop("checked", false);//取消全选
+        }
+    });
+
+
+    function downs() {
+        var chkvalue = "";//定义一个数组
+        $("input[name='id']:checked").each(function () {
+            chkvalue += $(this).val() + ",";
+        });
+        window.location.href = "signexcels.html?chkvalue=" + chkvalue;
+    };
+
+    function del(id) {
+        layer.confirm('确认要删除吗?', function (index) {
+            $.post("delorder.html", {id: id}, function (data) {
+                if (data.is) {
+                    layer.alert(data.msg, {skin: 'layui-layer-molv', closeBtn: 0, anim: 4}, function () {
+                        window.location = window.location;
+                    });
+                } else {
+                    layer.msg(data.msg, {icon: 2, time: 1000});
+                }
+            }, "json");
+        });
+    }
+
+    function lookimg(obj) {
+        var img = $(obj).find("img").attr("src");
+        layer.open({
+            type: 1, skin: 'layui-layer-rim', //加上边框
+            title: "查看大图",
+            area: ['45%', '60%'], //宽高
+            content: '<img id="img" src="' + img + '" width="95%" height="auto" style="margin: 2%;">'
+        });
+
+    }
+</script>
+</body>
+</html>

+ 13 - 0
src/main/webapp/WEB-INF/jsp/admin/index.jsp

@@ -134,6 +134,19 @@
             </dd>
         </dl>
 
+        <dl id="menu-article11">
+            <dt>
+                <i class="Hui-iconfont">&#xe687;</i>订单管理<i class="Hui-iconfont menu_dropdown-arrow">&#xe6d5;</i>
+            </dt>
+            <dd>
+                <ul>
+                    <li><a data-href="adminorder.html" data-title="订单管理" href="javascript:void(0)">订单管理</a></li>
+
+                    <%--                    <li><a data-href="adminmeal.html" data-title="双标书套餐" href="javascript:void(0)">双标书套餐</a></li>--%>
+                </ul>
+            </dd>
+        </dl>
+
         <dl id="menu-article3">
             <a style="text-decoration: none;" data-href="adminbanners.html" data-title="Banners管理"
                href="javascript:void(0)">

+ 7 - 2
src/main/webapp/WEB-INF/jsp/center_order.jsp

@@ -201,10 +201,15 @@
      * 页面跳转
      */
     function sendorder() {
-
+        var reg = new RegExp("^[0-9]*$");
         var mealid = '${meal.id}';
         var biaoshu = $("#biaoshu").text();
-        window.location.href = "xieyiqr.html?mealid=" + mealid + "&biaoshu=" + biaoshu;
+        if (!reg.test(biaoshu)) {
+            layer.msg("标书不能为空");
+            return false;
+        } else {
+            window.location.href = "xieyiqr.html?mealid=" + mealid + "&biaoshu=" + biaoshu;
+        }
 
     }
 

+ 77 - 46
src/main/webapp/WEB-INF/jsp/center_order2.jsp

@@ -24,6 +24,7 @@
             src="${pageContext.request.contextPath}/static/js/jquery.min.js"></script>
     <script type="text/javascript" src="${pageContext.request.contextPath}/static/js/swiper.min.js"></script>
     <script type="text/javascript" src="${pageContext.request.contextPath}/static/js/config.js"></script>
+    <script type="text/javascript" src="${pageContext.request.contextPath}/static/admin/index/layer/layer.js"></script>
 </head>
 <body class="gray ">
 <div class="body_tit">
@@ -53,7 +54,7 @@
     <div class="eprice clearfix">
         <ul>
             <c:forEach items="${meal.biddocumentList}" var="biddocumentList" begin="0" end="0">
-                <li class="pgkp_li addadms clearfix" value="${biddocumentList.payforprice}">
+                <li class="pgkp_li addadms clearfix" value="${biddocumentList.payforprice}" id="${biddocumentList.id}">
                     <div class="left_pre harfe">
                         <p class="serc_tit">代拍价格</p>
                         <p class="seg_nuber">${biddocumentList.price}元</p>
@@ -67,7 +68,7 @@
             </c:forEach>
             <c:forEach items="${meal.biddocumentList}" var="biddocumentList" begin="1"
                        end="${meal.biddocumentList.size()}">
-                <li class="pgkp_li  clearfix" value="${biddocumentList.payforprice}">
+                <li class="pgkp_li  clearfix" id="${biddocumentList.id}" value="${biddocumentList.payforprice}">
                     <div class="left_pre harfe">
                         <p class="serc_tit">代拍价格</p>
                         <p class="seg_nuber">${biddocumentList.price}元</p>
@@ -83,6 +84,30 @@
     </div>
 </div>
 <script>
+
+
+    /**
+     * 页面跳转
+     */
+    function sendorder() {
+        var reg = new RegExp("^[0-9]*$");
+        var mealid = '${meal.id}';
+        var bid = $(".addadms").attr("id");
+        var biaoshu = $(".selebiding").html();
+        var biaoshu1 = $(".selebidingtwo").html();
+        console.log(biaoshu);
+        console.log(biaoshu1);
+        if (!reg.test(biaoshu)) {
+            layer.msg("标书一不能为空");
+            return false;
+        } else if (!reg.test(biaoshu1)) {
+            layer.msg("标书二不能为空");
+            return false;
+        } else {
+            window.location.href = "xieyiqr.html?mealid=" + mealid + "&biaoshu=" + biaoshu + "&biaoshu1=" + biaoshu1 + "&bid=" + bid;
+        }
+    }
+
     $(window).ready(function () {
         var valuep = $(".pgkp_li").eq(0).attr("value");
         $("#price").text(valuep);
@@ -125,42 +150,21 @@
             </div>
         </c:if>
         <c:if test="${labelbooks != null}">
-            <c:forEach items="${labelbooks}" var="labelbook">
-                <c:if test="${labelbooks.size() == 1}">
-                    <!-- 有标书时显示 -->
-                    <div class="bslist">
-                        <p class="fndsi">*标书一</p>
-                        <div class="bjidfo selebiding">
-                            <span>${labelbook.labelnum}</span>
-                            <i class="myli_ocn sebidcon"></i>
-                        </div>
-                    </div>
-                    <div class="bslist">
-                        <p class="fndsi">*标书二</p>
-                        <div class="bjidfo selebiding">
-                            <span>请选择标书</span>
-                            <i class="myli_ocn sebidcon"></i>
-                        </div>
-                    </div>
-                </c:if>
-                <c:if test="${labelbooks.size() > 1}">
-                    <!-- 有标书时显示 -->
-                    <div class="bslist">
-                        <p class="fndsi">*标书一</p>
-                        <div class="bjidfo selebiding">
-                            <span>请选择标书</span>
-                            <i class="myli_ocn sebidcon"></i>
-                        </div>
-                    </div>
-                    <div class="bslist">
-                        <p class="fndsi">*标书二</p>
-                        <div class="bjidfo selebiding">
-                            <span>请选择标书</span>
-                            <i class="myli_ocn sebidcon"></i>
-                        </div>
-                    </div>
-                </c:if>
-            </c:forEach>
+            <!-- 有标书时显示 -->
+            <div class="bslist">
+                <p class="fndsi">*标书一</p>
+                <div class="bjidfo selebiding">
+                    <span id="biaoshu1">请选择标书</span>
+                    <i class="myli_ocn sebidcon"></i>
+                </div>
+            </div>
+            <div class="bslist">
+                <p class="fndsi">*标书二</p>
+                <div class="bjidfo selebidingtwo">
+                    <span id="biaoshu2">请选择标书</span>
+                    <i class="myli_ocn sebidcon"></i>
+                </div>
+            </div>
         </c:if>
         <!-- 赔付说明 -->
         <p class="pfsmed">赔付说明</p>
@@ -196,7 +200,7 @@
         </div>
         <p class="fpmsg"><span class="color_red">*</span>如需开发票,需要自行承担套餐金额8%的费用(6%的税率+2%的开票服务费</p>
 
-        <a href="xieyiqr.html" class="submitdes magnji">确认提交</a>
+        <a href="javascript:;" id="submit" onclick="sendorder()" class="submitdes magnji">确认提交</a>
 
 
         <p class="fbhdusia">点击确认提交即表示已阅读并同意
@@ -225,8 +229,8 @@
             <c:forEach items="${labelbooks}" var="labelbooks">
                 <li class="type_li">
                     <label>
-                        <input type="radio" name="help" id="q1_1" value="1" hidden="">
-                        <label for="q1_1" class="advice selbidrd"></label>
+                        <input type="radio" name="help" id="q1_1 ${labelbooks.id}" value="1" hidden="">
+                        <label for="q1_1 ${labelbooks.id}" class="advice selbidrd"></label>
                         <p class="radio-name selebidp">
                             <span>${labelbooks.labelnum}</span>
                             <span>${labelbooks.overtime}</span>
@@ -243,7 +247,7 @@
     </div>
 </div>
 
-<script>
+<script type="text/javascript">
     $(".tablists").click(function () {
         $(".tablists").removeClass("activest")
         $(this).addClass("activest")
@@ -263,16 +267,43 @@
             $(".tab3_cont").show();
         }
     })
-
+    var that;
     // 弹出选择标书方法
     $(".selebiding").click(function () {
+
+        console.log($(this))
         $(".shadow_selece_biding").show();
+        that = $(this);
+        //点击确定
+        $(".suresbtn").click(function () {
+            console.log(1)
+            vtext(that)
+        })
     })
-    //点击确定
-    $(".suresbtn").click(function () {
-        $(".shadow_selece_biding").hide();
+
+    $(".selebidingtwo").click(function () {
+        $(".shadow_selece_biding").show();
+        that = $(this);
+        //点击确定
+        $(".suresbtn").click(function () {
+            console.log(2)
+            vtext(that)
+        })
     })
 
+    //点击确定
+
+    function vtext(obje) {
+        var text = $('input[name=help]:checked').parents("label").find("span").eq(0).text();
+        if (text == '' || text == null) {
+            layer.msg("请选择标书")
+        } else {
+            obje.text(text);
+            // $('input[name=help]:checked').parents("li").remove();
+            $(".shadow_selece_biding").hide();
+        }
+    }
+
     //点击取消
     $(".cancelbid").click(function () {
         $(".shadow_selece_biding").hide();

+ 6 - 6
src/main/webapp/WEB-INF/jsp/my_busnes.jsp

@@ -16,12 +16,12 @@
 <meta id="description" name="Description" content=""/>
 <meta id="key" name="Keywords" content=""/>
 
-<link type="text/css" rel="stylesheet" href="css/swiper.min.css"/>
-<link type="text/css" rel="stylesheet" href="css/common.css"/>
-<link type="text/css" rel="stylesheet" href="css/index.css"/>
-<script language="javascript" type="text/javascript" src="js/jquery.min.js"></script>
-<script type="text/javascript" src="js/swiper.min.js"></script>
-<script type="text/javascript" src="js/config.js"></script>
+<link type="text/css" rel="stylesheet" href="${pageContext.request.contextPath}/static/css/swiper.min.css"/>
+<link type="text/css" rel="stylesheet" href="${pageContext.request.contextPath}/static/css/common.css"/>
+<link type="text/css" rel="stylesheet" href="${pageContext.request.contextPath}/static/css/index.css"/>
+<script language="javascript" type="text/javascript" src="${pageContext.request.contextPath}/static/js/jquery.min.js"></script>
+<script type="text/javascript" src="${pageContext.request.contextPath}/static/js/swiper.min.js"></script>
+<script type="text/javascript" src="${pageContext.request.contextPath}/static/js/config.js"></script>
 </head>
 <body class="gray bgcfff">
 <div class="body_tit">

+ 19 - 27
src/main/webapp/WEB-INF/jsp/my_news.jsp

@@ -17,12 +17,13 @@
     <meta id="description" name="Description" content=""/>
     <meta id="key" name="Keywords" content=""/>
 
-    <link type="text/css" rel="stylesheet" href="css/swiper.min.css"/>
-    <link type="text/css" rel="stylesheet" href="css/common.css"/>
-    <link type="text/css" rel="stylesheet" href="css/index.css"/>
-    <script language="javascript" type="text/javascript" src="js/jquery.min.js"></script>
-    <script type="text/javascript" src="js/swiper.min.js"></script>
-    <script type="text/javascript" src="js/config.js"></script>
+    <link type="text/css" rel="stylesheet" href="${pageContext.request.contextPath}/static/css/swiper.min.css"/>
+    <link type="text/css" rel="stylesheet" href="${pageContext.request.contextPath}/static/css/common.css"/>
+    <link type="text/css" rel="stylesheet" href="${pageContext.request.contextPath}/static/css/index.css"/>
+    <script language="javascript" type="text/javascript"
+            src="${pageContext.request.contextPath}/static/js/jquery.min.js"></script>
+    <script type="text/javascript" src="${pageContext.request.contextPath}/static/js/swiper.min.js"></script>
+    <script type="text/javascript" src="${pageContext.request.contextPath}/static/js/config.js"></script>
 </head>
 <body class="gray ">
 <div class="body_tit">
@@ -35,27 +36,18 @@
 
 <div class="notice">
     <ul id="notices">
-        <li>
-            <a href="#">
-                <div class="notice_con">
-                    <b></b>
-                    <div class="time">2017-12-15</div>
-                    <h2>交易完成</h2>
-                    <p>订单交易完成请进入订单查看</p>
-                </div>
-            </a>
-        </li>
-
-        <li>
-            <a href="#">
-                <div class="notice_con">
-                    <b></b>
-                    <div class="time">2017-12-15</div>
-                    <h2>竞拍失败提醒</h2>
-                    <p>竞拍失败提醒</p>
-                </div>
-            </a>
-        </li>
+        <c:forEach items="${notices}" var="notices">
+            <li>
+                <a href="notice_detail.html?type=1&id=${notices.id}">
+                    <div class="notice_con">
+                        <b></b>
+                        <div class="time"><fmt:formatDate value="${notices.addtime }" pattern="yyyy-MM-dd"/></div>
+                        <h2>${notices.title}</h2>
+                        <p>${notices.resume}</p>
+                    </div>
+                </a>
+            </li>
+        </c:forEach>
     </ul>
 </div>
 

+ 1 - 0
src/main/webapp/WEB-INF/jsp/new_biding.jsp

@@ -60,6 +60,7 @@
                 <span class="radio-name margin0">其他证件号</span>
             </label>
         </div>
+        <input value="${orderid}" name="orderid" hidden="hidden" />
         <div class="input_bding">
             <p class="input_bdname">证件号码</p>
             <input type="text" placeholder="请输入证件号码" name="idcode" id="idcode" class="inputyyf">

+ 24 - 10
src/main/webapp/WEB-INF/jsp/notice_detail.jsp

@@ -20,7 +20,8 @@
     <link type="text/css" rel="stylesheet" href="${pageContext.request.contextPath}/static/css/swiper.min.css"/>
     <link type="text/css" rel="stylesheet" href="${pageContext.request.contextPath}/static/css/common.css"/>
     <link type="text/css" rel="stylesheet" href="${pageContext.request.contextPath}/static/css/index.css"/>
-    <script language="javascript" type="text/javascript" src="${pageContext.request.contextPath}/static/js/jquery.min.js"></script>
+    <script language="javascript" type="text/javascript"
+            src="${pageContext.request.contextPath}/static/js/jquery.min.js"></script>
     <script type="text/javascript" src="${pageContext.request.contextPath}/static/js/swiper.min.js"></script>
     <script type="text/javascript" src="${pageContext.request.contextPath}/static/js/config.js"></script>
 </head>
@@ -32,16 +33,29 @@
 </div>
 <div class="height46"></div>
 
-<div class="notice_title">
-    ${announcement.title}
-</div>
-<div class="notice_time">
-    发布于<fmt:formatDate value="${announcement.addtime }" pattern="yyyy-MM-dd HH:mm:ss"/>
-</div>
-<div class="notice_cont">
-    ${announcement.detailed}
-</div>
+<c:if test="${type == 0}">
+    <div class="notice_title">
+            ${announcement.title}
+    </div>
+    <div class="notice_time">
+        发布于<fmt:formatDate value="${announcement.addtime }" pattern="yyyy-MM-dd HH:mm:ss"/>
+    </div>
+    <div class="notice_cont">
+            ${announcement.detailed}
+    </div>
+</c:if>
 
+<c:if test="${type != 0}">
+    <div class="notice_title">
+            ${notice.title}
+    </div>
+    <div class="notice_time">
+        发布于<fmt:formatDate value="${notice.addtime }" pattern="yyyy-MM-dd HH:mm:ss"/>
+    </div>
+    <div class="notice_cont">
+            ${notice.text}
+    </div>
+</c:if>
 
 <!-- <div class="footer_nav">
     <a href="index.html" class="foot_nav">

+ 165 - 188
src/main/webapp/WEB-INF/jsp/order.jsp

@@ -17,12 +17,13 @@
     <meta id="description" name="Description" content=""/>
     <meta id="key" name="Keywords" content=""/>
 
-    <link type="text/css" rel="stylesheet" href="css/swiper.min.css"/>
-    <link type="text/css" rel="stylesheet" href="css/common.css"/>
-    <link type="text/css" rel="stylesheet" href="css/index.css"/>
-    <script language="javascript" type="text/javascript" src="js/jquery.min.js"></script>
-    <script type="text/javascript" src="js/swiper.min.js"></script>
-    <script type="text/javascript" src="js/config.js"></script>
+    <link type="text/css" rel="stylesheet" href="${pageContext.request.contextPath}/static/css/swiper.min.css"/>
+    <link type="text/css" rel="stylesheet" href="${pageContext.request.contextPath}/static/css/common.css"/>
+    <link type="text/css" rel="stylesheet" href="${pageContext.request.contextPath}/static/css/index.css"/>
+    <script language="javascript" type="text/javascript"
+            src="${pageContext.request.contextPath}/static/js/jquery.min.js"></script>
+    <script type="text/javascript" src="${pageContext.request.contextPath}/static/js/swiper.min.js"></script>
+    <script type="text/javascript" src="${pageContext.request.contextPath}/static/js/config.js"></script>
 </head>
 <body class="gray bgcfff">
 <div class="body_tit">
@@ -43,195 +44,171 @@
 </div>
 <div class="biding_box ordering">
     <ul>
-        <li class="biding_list">
-            <div class="hed_name">
-                <p class="order_code">
-                    平台定制专属套餐
-                </p>
-                <p class="order_status">待审核</p>
-            </div>
-            <div class="bidhead clearfix">
-                <p class="bid_code">
-                    <img src="images/biding_icon.png" alt="" class="biding_icon">
-                    <span class="bid_nub">投标号:12458956</span>
-                </p>
-            </div>
-            <div class="bid_iten clearfix">
-                <p class="iten_listg">代拍价格</p>
-                <p class="iten_listg">赔付总额</p>
-                <p class="iten_listg">代拍次数</p>
-                <p class="iten_listg">代拍月份</p>
-            </div>
-            <div class="bid_iten umnbh clearfix">
-                <p class="iten_listg color0">15888元</p>
-                <p class="iten_listg color0">5000元</p>
-                <p class="iten_listg color0">6次</p>
-                <p class="iten_listg color0">--</p>
-            </div>
-            <div class="botom_btnbax">
-                <a href="order_detail.html" class="btngopak">订单详情</a>
-            </div>
-        </li>
-        <li class="biding_list">
-            <div class="hed_name">
-                <p class="order_code">
-                    平台定制专属套餐
-                </p>
-                <p class="order_status">已中标</p>
-            </div>
-            <div class="bidhead clearfix">
-                <p class="bid_code">
-                    <img src="images/biding_icon.png" alt="" class="biding_icon">
-                    <span class="bid_nub">投标号:12458956</span>
-                </p>
-            </div>
-            <div class="bid_iten clearfix">
-                <p class="iten_listg">代拍价格</p>
-                <p class="iten_listg">赔付总额</p>
-                <p class="iten_listg">代拍次数</p>
-                <p class="iten_listg">代拍月份</p>
-            </div>
-            <div class="bid_iten umnbh clearfix">
-                <p class="iten_listg color0">15888元</p>
-                <p class="iten_listg color0">5000元</p>
-                <p class="iten_listg color0">6次</p>
-                <p class="iten_listg color0">2019-08</p>
-            </div>
-            <div class="botom_btnbax">
-                <a href="pay_way.html" class="btngopak gopaybnt">立即支付</a>
-                <a href="order_detail.html" class="btngopak">订单详情</a>
-            </div>
-        </li>
-
-        <li class="biding_list">
-            <div class="hed_name">
-                <p class="order_code">
-                    平台定制专属套餐
-                </p>
-                <p class="order_status">竞拍中</p>
-            </div>
-            <div class="bidhead clearfix">
-                <p class="bid_code">
-                    <img src="images/biding_icon.png" alt="" class="biding_icon">
-                    <span class="bid_nub">投标号:12458956</span>
-                </p>
-            </div>
-            <div class="bid_iten clearfix">
-                <p class="iten_listg">代拍价格</p>
-                <p class="iten_listg">赔付总额</p>
-                <p class="iten_listg">代拍次数</p>
-                <p class="iten_listg">代拍月份</p>
-            </div>
-            <div class="bid_iten umnbh clearfix">
-                <p class="iten_listg color0">15888元</p>
-                <p class="iten_listg color0">5000元</p>
-                <p class="iten_listg color0">1次</p>
-                <p class="iten_listg color0">--</p>
-            </div>
-            <div class="botom_btnbax">
-                <a href="order_detail1.html" class="btngopak">订单详情</a>
-            </div>
-        </li>
-
-        <li class="biding_list">
-            <div class="hed_name">
-                <p class="order_code">
-                    平台定制专属套餐
-                </p>
-                <p class="order_status">竞拍中</p>
-            </div>
-            <div class="bidhead clearfix">
-                <p class="bid_code">
-                    <img src="images/biding_icon.png" alt="" class="biding_icon">
-                    <span class="bid_nub">投标号:12458956</span>
-                </p>
-            </div>
-            <div class="bid_iten clearfix">
-                <p class="iten_listg">代拍价格</p>
-                <p class="iten_listg">赔付总额</p>
-                <p class="iten_listg">代拍次数</p>
-                <p class="iten_listg">代拍月份</p>
-            </div>
-            <div class="bid_iten umnbh clearfix">
-                <p class="iten_listg color0">15888元</p>
-                <p class="iten_listg color0">5000元</p>
-                <p class="iten_listg color0">3次</p>
-                <p class="iten_listg color0">2019-11-13</p>
-            </div>
-            <div class="botom_btnbax">
-                <a href="order_detail3.html" class="btngopak">订单详情</a>
-            </div>
-        </li>
-
-        <li class="biding_list">
-            <div class="hed_name">
-                <p class="order_code">
-                    平台定制专属套餐
-                </p>
-                <p class="order_status">竞拍中</p>
-            </div>
-            <div class="bidhead clearfix">
-                <p class="bid_code">
-                    <img src="images/biding_icon.png" alt="" class="biding_icon">
-                    <span class="bid_nub">投标号:12458956</span>
-                </p>
-            </div>
-            <div class="bid_iten clearfix">
-                <p class="iten_listg">代拍价格</p>
-                <p class="iten_listg">赔付总额</p>
-                <p class="iten_listg">代拍次数</p>
-                <p class="iten_listg">代拍月份</p>
-            </div>
-            <div class="bid_iten umnbh clearfix">
-                <p class="iten_listg color0">15888元</p>
-                <p class="iten_listg color0">5000元</p>
-                <p class="iten_listg color0">6次</p>
-                <p class="iten_listg color0">2019-11-13</p>
-            </div>
-            <div class="botom_btnbax">
-                <a href="order_detail6.html" class="btngopak">订单详情</a>
-            </div>
-        </li>
+        <c:forEach items="${ordersList}" var="ordersList">
+            <c:if test="${ordersList.auctionstatus != 2 && ordersList.auctionstatus != 3}">
+                <c:if test="${ordersList.status == 0}">
+                    <li class="biding_list">
+                        <div class="hed_name">
+                            <p class="order_code">
+                                    ${ordersList.meal.title}
+                            </p>
+                            <p class="order_status">待审核</p>
+                        </div>
+                        <div class="bidhead clearfix">
+                            <p class="bid_code">
+                                <img src="${pageContext.request.contextPath}/static/images/biding_icon.png" alt=""
+                                     class="biding_icon">
+                                <span class="bid_nub">投标号:${ordersList.ordersid}</span>
+                            </p>
+                        </div>
+                        <div class="bid_iten clearfix">
+                            <p class="iten_listg">代拍价格</p>
+                            <p class="iten_listg">赔付总额</p>
+                            <p class="iten_listg">代拍次数</p>
+                            <p class="iten_listg">代拍月份</p>
+                        </div>
+                        <div class="bid_iten umnbh clearfix">
+                            <p class="iten_listg color0">${ordersList.price}元</p>
+                            <p class="iten_listg color0">${ordersList.payforprice}元</p>
+                            <p class="iten_listg color0">${ordersList.num}次</p>
+                            <p class="iten_listg color0">--</p>
+                        </div>
+                        <div class="botom_btnbax">
+                            <a href="order_detail1.html?id=${ordersList.id}" class="btngopak">订单详情</a>
+                        </div>
+                    </li>
+                </c:if>
 
+                <c:if test="${ordersList.status == 1 ||ordersList.status == 2}">
+                    <li class="biding_list">
+                        <div class="hed_name">
+                            <p class="order_code">
+                                    ${ordersList.meal.title}
+                            </p>
+                                <%--                            <c:if test="${ordersList.auctionstatus == 1 && ordersList.auctionstatus == 2 && ordersList.auctionstatus == 3}">--%>
+                                <%--                                <c:if test="${ordersList.status == 1 }">--%>
+                                <%--                                    审核通过--%>
+                                <%--                                </c:if>--%>
+                                <%--                                <c:if test="${ordersList.status == 2 }">--%>
+                                <%--                                    审核驳回--%>
+                                <%--                                </c:if>--%>
+                                <%--                            </c:if>--%>
+                            <c:if test="${ordersList.status == 2}">
+                                <p class="order_status">订单驳回</p>
+                            </c:if>
+                            <c:if test="${ordersList.auctionstatus == 1}">
+                                <p class="order_status">竞拍中</p>
+                            </c:if>
+                            <c:if test="${ordersList.auctionstatus == 2}">
+                                <p class="order_status">竞拍成功</p>
+                            </c:if>
+                            <c:if test="${ordersList.auctionstatus == 3}">
+                                <p class="order_status">竞拍失败</p>
+                            </c:if>
+                        </div>
+                        <div class="bidhead clearfix">
+                            <p class="bid_code">
+                                <img src="${pageContext.request.contextPath}/static/images/biding_icon.png" alt=""
+                                     class="biding_icon">
+                                <span class="bid_nub">投标号:${ordersList.ordersid}</span>
+                            </p>
+                        </div>
+                        <div class="bid_iten clearfix">
+                            <p class="iten_listg">代拍价格</p>
+                            <p class="iten_listg">赔付总额</p>
+                            <p class="iten_listg">代拍次数</p>
+                            <p class="iten_listg">代拍月份</p>
+                        </div>
+                        <div class="bid_iten umnbh clearfix">
+                            <p class="iten_listg color0">${ordersList.price}元</p>
+                            <p class="iten_listg color0">${ordersList.payforprice}元</p>
+                            <p class="iten_listg color0">${ordersList.num}次</p>
+                            <p class="iten_listg color0">${ordersList.times}</p>
+                        </div>
+                        <div class="botom_btnbax">
+                                <%--                            <a href="pay_way.html" class="btngopak gopaybnt">立即支付</a>--%>
+                            <a href="order_detail.html?id=${ordersList.id}" class="btngopak">订单详情</a>
+                            <c:if test="${ordersList.labeluse == 1}">
+                                <a href="new_biding.html?orderid=${ordersList.id}" class="btngopak">上传标书</a>
+                            </c:if>
+                        </div>
+                    </li>
+                </c:if>
+            </c:if>
+        </c:forEach>
     </ul>
 
-    <p class="notime_order">
-        暂无订单
-        <a href="packages.html" class="gomade_order">去下单</a>
-    </p>
+    <c:if test="${ordersList == null}">
+        <p class="notime_order">
+            暂无订单
+            <a href="packages.html" class="gomade_order">去下单</a>
+        </p>
+    </c:if>
 </div>
 
 <div class="pckgsbox ordered">
     <ul>
-        <li class="biding_list">
-            <div class="hed_name">
-                <p class="order_code">
-                    平台定制专属套餐
-                </p>
-                <p class="order_status">竞拍成功</p>
-            </div>
-            <div class="bidhead clearfix">
-                <p class="bid_code">
-                    <img src="images/biding_icon.png" alt="" class="biding_icon">
-                    <span class="bid_nub">投标号:12458956</span>
-                </p>
-            </div>
-            <div class="bid_iten clearfix">
-                <p class="iten_listg">代拍价格</p>
-                <p class="iten_listg">赔付总额</p>
-                <p class="iten_listg">代拍次数</p>
-                <p class="iten_listg">代拍月份</p>
-            </div>
-            <div class="bid_iten umnbh clearfix">
-                <p class="iten_listg color0">15888元</p>
-                <p class="iten_listg color0">5000元</p>
-                <p class="iten_listg color0">6次</p>
-                <p class="iten_listg color0">2019-08</p>
-            </div>
-            <div class="botom_btnbax">
-                <a href="order_detail.html" class="btngopak">订单详情</a>
-            </div>
-        </li>
+        <c:forEach items="${ordersList}" var="ordersList">
+            <c:if test="${ordersList.auctionstatus != 0 && ordersList.auctionstatus != 1}">
+                <li class="biding_list">
+                    <div class="hed_name">
+                        <p class="order_code">
+                                ${ordersList.meal.title}
+                        </p>
+                        <c:if test="${ordersList.auctionstatus == 1 && ordersList.auctionstatus == 2 && ordersList.auctionstatus == 3}">
+                            <c:if test="${ordersList.status == 1 }">
+                                审核通过
+                            </c:if>
+                            <c:if test="${ordersList.status == 2 }">
+                                审核驳回
+                            </c:if>
+                        </c:if>
+                        <c:if test="${ordersList.auctionstatus == 1}">
+                            <p class="order_status">竞拍中</p>
+                        </c:if>
+                        <c:if test="${ordersList.auctionstatus == 2}">
+                            <p class="order_status">竞拍成功</p>
+                        </c:if>
+                        <c:if test="${ordersList.auctionstatus == 3}">
+                            <p class="order_status">竞拍失败</p>
+                        </c:if>
+                    </div>
+                    <div class="bidhead clearfix">
+                        <p class="bid_code">
+                            <img src="${pageContext.request.contextPath}/static/images/biding_icon.png" alt=""
+                                 class="biding_icon">
+                            <span class="bid_nub">投标号:${ordersList.ordersid}</span>
+                        </p>
+                    </div>
+                    <div class="bid_iten clearfix">
+                        <p class="iten_listg">代拍价格</p>
+                        <p class="iten_listg">赔付总额</p>
+                        <p class="iten_listg">代拍次数</p>
+                        <p class="iten_listg">代拍月份</p>
+                    </div>
+                    <div class="bid_iten umnbh clearfix">
+                        <p class="iten_listg color0">${ordersList.price}元</p>
+                        <p class="iten_listg color0">${ordersList.payforprice}元</p>
+                        <p class="iten_listg color0">${ordersList.num}次</p>
+                        <p class="iten_listg color0">${ordersList.times}</p>
+                    </div>
+                    <div class="botom_btnbax">
+                        <c:if test="${ordersList.auctionstatus == 2}">
+                            <a href="pay_way.html?orderid=${ordersList.id}" class="btngopak gopaybnt">立即支付</a>
+                        </c:if>
+                        <c:if test="${ordersList.auctionstatus == 3}">
+                            <c:if test="${ordersList.paystatus == 1}">
+                                <span class="btngopak gopaybnt">已赔付</span>
+                            </c:if>
+                            <c:if test="${ordersList.paystatus == 0}">
+                                <span class="btngopak gopaybnt">等待赔付</span>
+                            </c:if>
+                        </c:if>
+                        <a href="order_detail.html?id=${ordersList.id}" class="btngopak">订单详情</a>
+                    </div>
+                </li>
+            </c:if>
+        </c:forEach>
     </ul>
 </div>
 

+ 49 - 51
src/main/webapp/WEB-INF/jsp/order_detail.jsp

@@ -17,12 +17,13 @@
     <meta id="description" name="Description" content=""/>
     <meta id="key" name="Keywords" content=""/>
 
-    <link type="text/css" rel="stylesheet" href="css/swiper.min.css"/>
-    <link type="text/css" rel="stylesheet" href="css/common.css"/>
-    <link type="text/css" rel="stylesheet" href="css/index.css"/>
-    <script language="javascript" type="text/javascript" src="js/jquery.min.js"></script>
-    <script type="text/javascript" src="js/swiper.min.js"></script>
-    <script type="text/javascript" src="js/config.js"></script>
+    <link type="text/css" rel="stylesheet" href="${pageContext.request.contextPath}/static/css/swiper.min.css"/>
+    <link type="text/css" rel="stylesheet" href="${pageContext.request.contextPath}/static/css/common.css"/>
+    <link type="text/css" rel="stylesheet" href="${pageContext.request.contextPath}/static/css/index.css"/>
+    <script language="javascript" type="text/javascript"
+            src="${pageContext.request.contextPath}/static/js/jquery.min.js"></script>
+    <script type="text/javascript" src="${pageContext.request.contextPath}/static/js/swiper.min.js"></script>
+    <script type="text/javascript" src="${pageContext.request.contextPath}/static/js/config.js"></script>
 </head>
 <body class="gray bgcfff">
 <div class="body_tit">
@@ -36,7 +37,7 @@
     订单信息
 </div>
 <div class="tsinfor">
-    订单提交成功,请等待标书审核,工作人员将于1个工作日内完成标书审核。
+    订单
 </div>
 <div class="order_infor">
     <ul>
@@ -45,7 +46,7 @@
                 投标号:
             </p>
             <p class="odinfo_nub">
-                201903021126
+                ${orders.ordersid}
             </p>
         </li>
         <li class="order_info_li clearfix">
@@ -53,7 +54,7 @@
                 下单时间:
             </p>
             <p class="odinfo_nub">
-                2019-09-20 15:55:31
+                <fmt:formatDate value="${orders.addtime}" pattern="yyyy-MM-dd HH:mm:ss"/>
             </p>
         </li>
         <li class="order_info_li clearfix">
@@ -61,7 +62,7 @@
                 代拍价格:
             </p>
             <p class="odinfo_nub">
-                15888
+                ${orders.price}
             </p>
         </li>
         <li class="order_info_li clearfix">
@@ -69,7 +70,7 @@
                 代拍次数:
             </p>
             <p class="odinfo_nub">
-                6
+                ${orders.num}
             </p>
         </li>
 
@@ -78,7 +79,7 @@
                 代拍月份:
             </p>
             <p class="odinfo_nub">
-                2019-08
+                ${orders.times}
             </p>
         </li>
 
@@ -87,7 +88,7 @@
                 代拍协议:
             </p>
             <p class="odinfo_nub">
-                <a href="xieyi.html" class="blurec">《代拍委托协议》</a>
+                <a href="xieyichakan.html?id=${orders.serviceid}" class="blurec">《代拍委托协议》</a>
             </p>
         </li>
 
@@ -96,7 +97,12 @@
                 有无发票:
             </p>
             <p class="odinfo_nub">
-                无
+                <c:if test="${orders.receipt == null}">
+                    无
+                </c:if>
+                <c:if test="${orders.receipt != null}">
+                    有
+                </c:if>
             </p>
         </li>
         <li class="order_info_li borderinm clearfix">
@@ -108,43 +114,35 @@
                 </div>
                 <div class="paks_botom">
                     <ul>
-                        <li class="times_list clearfix">
-                            <p class="jgfw widthauto">第1次</p>
-                            <p class="jgfw widthauto margleft">竞拍时间:<span class="timefontsm">2019-08-15</span></p>
-                            <p class=" order_status ghtime">未中标</p>
-                            <p class=" order_status ghtime">未赔付</p>
-                        </li>
-                        <li class="times_list clearfix">
-                            <p class="jgfw widthauto">第2次</p>
-                            <p class="jgfw widthauto margleft">竞拍时间:<span class="timefontsm">2019-08-15</span></p>
-                            <p class=" order_status ghtime">未中标</p>
-                            <p class=" order_status ghtime">未赔付</p>
-                        </li>
-                        <li class="times_list clearfix">
-                            <p class="jgfw widthauto">第3次</p>
-                            <p class="jgfw widthauto margleft">竞拍时间:<span class="timefontsm">2019-08-15</span></p>
-                            <p class=" order_status ghtime">未中标</p>
-                            <p class=" order_status ghtime">未赔付</p>
-                        </li>
-                        <li class="times_list clearfix">
-                            <p class="jgfw widthauto">第4次</p>
-                            <p class="jgfw widthauto margleft">竞拍时间:<span class="timefontsm">2019-08-15</span></p>
-                            <p class=" order_status ghtime">未中标</p>
-                            <p class=" order_status ghtime">未赔付</p>
-                        </li>
-                        <li class="times_list clearfix">
-                            <p class="jgfw widthauto">第5次</p>
-                            <p class="jgfw widthauto margleft">竞拍时间:<span class="timefontsm">2019-08-15</span></p>
-                            <p class=" order_status ghtime">未中标</p>
-                            <p class=" order_status ghtime">未赔付</p>
-                        </li>
-                        <li class="times_list clearfix">
-                            <p class="jgfw widthauto">第6次</p>
-                            <p class="jgfw widthauto margleft">竞拍时间:<span class="timefontsm">2019-08-15</span></p>
-                            <p class=" order_status ghtime">已中标
-                                <a href="pay_way.html" class="pay_btnet gopaybnt">立即支付</a>
-                            </p>
-                        </li>
+                        <c:if test="${orders.auctionList.size() == 0}">
+                            <%--                            <li class="times_list clearfix">--%>
+                            暂无竞标详情
+                            <%--                            </li>--%>
+                        </c:if>
+                        <c:forEach items="${orders.auctionList}" var="auctionList">
+                            <li class="times_list clearfix">
+                                <p class="jgfw widthauto">第${auctionList.num}次</p>
+                                <p class="jgfw widthauto margleft">竞拍时间:<span
+                                        class="timefontsm">${auctionList.times}</span></p>
+                                <c:if test="${auctionList.times == '' || auctionList.times ==null}">
+                                    待竞拍
+                                </c:if>
+                                <c:if test="${auctionList.times != '' && auctionList.times !=null}">
+                                    <c:if test="${auctionList.status == 0}">
+                                        <p class=" order_status ghtime">未中标</p>
+                                    </c:if>
+                                    <c:if test="${auctionList.status == 1}">
+                                        <p class=" order_status ghtime">已中标</p>
+                                    </c:if>
+                                    <c:if test="${auctionList.paystatus == 0}">
+                                        <p class=" order_status ghtime">未赔付</p>
+                                    </c:if>
+                                    <c:if test="${auctionList.paystatus == 1}">
+                                        <p class=" order_status ghtime">已赔付</p>
+                                    </c:if>
+                                </c:if>
+                            </li>
+                        </c:forEach>
                     </ul>
                 </div>
             </div>

+ 25 - 20
src/main/webapp/WEB-INF/jsp/order_detail1.jsp

@@ -17,12 +17,13 @@
     <meta id="description" name="Description" content=""/>
     <meta id="key" name="Keywords" content=""/>
 
-    <link type="text/css" rel="stylesheet" href="css/swiper.min.css"/>
-    <link type="text/css" rel="stylesheet" href="css/common.css"/>
-    <link type="text/css" rel="stylesheet" href="css/index.css"/>
-    <script language="javascript" type="text/javascript" src="js/jquery.min.js"></script>
-    <script type="text/javascript" src="js/swiper.min.js"></script>
-    <script type="text/javascript" src="js/config.js"></script>
+    <link type="text/css" rel="stylesheet" href="${pageContext.request.contextPath}/static/css/swiper.min.css"/>
+    <link type="text/css" rel="stylesheet" href="${pageContext.request.contextPath}/static/css/common.css"/>
+    <link type="text/css" rel="stylesheet" href="${pageContext.request.contextPath}/static/css/index.css"/>
+    <script language="javascript" type="text/javascript"
+            src="${pageContext.request.contextPath}/static/js/jquery.min.js"></script>
+    <script type="text/javascript" src="${pageContext.request.contextPath}/static/js/swiper.min.js"></script>
+    <script type="text/javascript" src="${pageContext.request.contextPath}/static/js/config.js"></script>
 </head>
 <body class="gray bgcfff">
 <div class="body_tit">
@@ -36,7 +37,7 @@
     订单信息
 </div>
 <div class="tsinfor">
-    订单提交成功,请等待标书审核,工作人员将于1个工作日内完成标书审核。
+    订单提交成功,请等待订单审核,工作人员将于1个工作日内完成订单审核。
 </div>
 <div class="order_infor">
     <ul>
@@ -45,7 +46,7 @@
                 投标号:
             </p>
             <p class="odinfo_nub">
-                201903021126
+                ${orders.ordersid}
             </p>
         </li>
         <li class="order_info_li clearfix">
@@ -53,7 +54,7 @@
                 下单时间:
             </p>
             <p class="odinfo_nub">
-                2019-09-20 15:55:31
+                <fmt:formatDate value="${orders.addtime}" pattern="yyyy-MM-dd HH:mm:ss"/>
             </p>
         </li>
         <li class="order_info_li clearfix">
@@ -61,7 +62,7 @@
                 代拍价格:
             </p>
             <p class="odinfo_nub">
-                15888
+                ${orders.price}
             </p>
         </li>
         <li class="order_info_li clearfix">
@@ -69,7 +70,7 @@
                 代拍次数:
             </p>
             <p class="odinfo_nub">
-                1
+                ${orders.num}
             </p>
         </li>
 
@@ -78,7 +79,7 @@
                 代拍月份:
             </p>
             <p class="odinfo_nub">
-                2019-08
+                ${orders.times}
             </p>
         </li>
 
@@ -87,7 +88,7 @@
                 代拍协议:
             </p>
             <p class="odinfo_nub">
-                <a href="xieyi.html" class="blurec">《代拍委托协议》</a>
+                <a href="xieyi.html?id=${orders.serviceid}" class="blurec">《代拍委托协议》</a>
             </p>
         </li>
 
@@ -96,7 +97,12 @@
                 有无发票:
             </p>
             <p class="odinfo_nub">
-                无
+                <c:if test="${orders.receipt == null}">
+                    无
+                </c:if>
+                <c:if test="${orders.receipt != null}">
+                    有
+                </c:if>
             </p>
         </li>
         <li class="order_info_li borderinm clearfix">
@@ -108,12 +114,11 @@
                 </div>
                 <div class="paks_botom">
                     <ul>
-                        <li class="times_list clearfix">
-                            <p class="jgfw widthauto">第1次</p>
-                            <p class="jgfw widthauto margleft">竞拍时间:<span class="timefontsm">2019-08-15</span></p>
-                            <p class=" order_status ghtime">未中标</p>
-                            <p class=" order_status ghtime">已赔付</p>
-                        </li>
+                        <c:if test="${orders.auctionList.size() == 0}">
+                            <%--                            <li class="times_list clearfix">--%>
+                            暂无竞标详情
+                            <%--                            </li>--%>
+                        </c:if>
                     </ul>
                 </div>
             </div>

+ 26 - 24
src/main/webapp/WEB-INF/jsp/pay_way.jsp

@@ -5,23 +5,25 @@
 <!DOCTYPE HTML>
 <html>
 <head>
-<title id="pageTitle">接米沪牌代拍</title>
-<meta name="renderer" content="webkit"/>
-<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
-<meta name="format-detection" content="telephone=no" />
-<meta name="apple-mobile-web-app-capable" content="yes" />
-<meta name="apple-mobile-web-app-status-bar-style" content="black" />
-<meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0 user-scalable=no"/>
-<meta id="description" name="Description" content=""/>
-<meta id="key" name="Keywords" content=""/>
+    <title id="pageTitle">接米沪牌代拍</title>
+    <meta name="renderer" content="webkit"/>
+    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"/>
+    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
+    <meta name="format-detection" content="telephone=no"/>
+    <meta name="apple-mobile-web-app-capable" content="yes"/>
+    <meta name="apple-mobile-web-app-status-bar-style" content="black"/>
+    <meta name="viewport"
+          content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0 user-scalable=no"/>
+    <meta id="description" name="Description" content=""/>
+    <meta id="key" name="Keywords" content=""/>
 
-<link type="text/css" rel="stylesheet" href="css/swiper.min.css"/>
-<link type="text/css" rel="stylesheet" href="css/common.css"/>
-<link type="text/css" rel="stylesheet" href="css/index.css"/>
-<script language="javascript" type="text/javascript" src="js/jquery.min.js"></script>
-<script type="text/javascript" src="js/swiper.min.js"></script>
-<script type="text/javascript" src="js/config.js"></script>
+    <link type="text/css" rel="stylesheet" href="${pageContext.request.contextPath}/static/css/swiper.min.css"/>
+    <link type="text/css" rel="stylesheet" href="${pageContext.request.contextPath}/static/css/common.css"/>
+    <link type="text/css" rel="stylesheet" href="${pageContext.request.contextPath}/static/css/index.css"/>
+    <script language="javascript" type="text/javascript"
+            src="${pageContext.request.contextPath}/static/js/jquery.min.js"></script>
+    <script type="text/javascript" src="${pageContext.request.contextPath}/static/js/swiper.min.js"></script>
+    <script type="text/javascript" src="${pageContext.request.contextPath}/static/js/config.js"></script>
 </head>
 <body class="gray bgcfff">
 <div class="body_tit">
@@ -30,10 +32,10 @@
     <a href="index.html" class="home_btn"></a>
 </div>
 <div class="height46"></div>
-    
+
 <div class="pay_w">
     <div class="pay_money">支付金额:
-        <b>¥180.00</b>
+        <b>¥${orders.price}</b>
     </div>
     <ul class="pay_ul">
         <li class="clearfix">
@@ -57,7 +59,7 @@
                     <span>线下支付</span>
                 </div>
                 <label class="indradio">
-                    <input type="radio" name="help" id="q1_2" value="2" hidden/> 
+                    <input type="radio" name="help" id="q1_2" value="2" hidden/>
                     <label for="q1_2" class="advice"></label>
                 </label>
             </label>
@@ -80,13 +82,13 @@
 </div>
 
 <script>
-    $(".addedtsp").click(function(){
+    $(".addedtsp").click(function () {
         var radios = $('input[name="help"]');
         console.log(radios.length)
-        for(var i=0;i<radios.length;i++){
-            if(radios.eq(i).is(":checked")){
-                if(radios.eq(i).val()=="2"){
-                    window.location.href="upload.html";
+        for (var i = 0; i < radios.length; i++) {
+            if (radios.eq(i).is(":checked")) {
+                if (radios.eq(i).val() == "2") {
+                    window.location.href = "upload.html?orderid=${orderid}";
                 }
             }
         }

+ 75 - 21
src/main/webapp/WEB-INF/jsp/upload.jsp

@@ -5,23 +5,26 @@
 <!DOCTYPE HTML>
 <html>
 <head>
-<title id="pageTitle">接米沪牌代拍</title>
-<meta name="renderer" content="webkit"/>
-<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
-<meta name="format-detection" content="telephone=no" />
-<meta name="apple-mobile-web-app-capable" content="yes" />
-<meta name="apple-mobile-web-app-status-bar-style" content="black" />
-<meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0 user-scalable=no"/>
-<meta id="description" name="Description" content=""/>
-<meta id="key" name="Keywords" content=""/>
-
-<link type="text/css" rel="stylesheet" href="css/swiper.min.css"/>
-<link type="text/css" rel="stylesheet" href="css/common.css"/>
-<link type="text/css" rel="stylesheet" href="css/index.css"/>
-<script language="javascript" type="text/javascript" src="js/jquery.min.js"></script>
-<script type="text/javascript" src="js/swiper.min.js"></script>
-<script type="text/javascript" src="js/config.js"></script>
+    <title id="pageTitle">接米沪牌代拍</title>
+    <meta name="renderer" content="webkit"/>
+    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"/>
+    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
+    <meta name="format-detection" content="telephone=no"/>
+    <meta name="apple-mobile-web-app-capable" content="yes"/>
+    <meta name="apple-mobile-web-app-status-bar-style" content="black"/>
+    <meta name="viewport"
+          content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0 user-scalable=no"/>
+    <meta id="description" name="Description" content=""/>
+    <meta id="key" name="Keywords" content=""/>
+
+    <link type="text/css" rel="stylesheet" href="${pageContext.request.contextPath}/static/css/swiper.min.css"/>
+    <link type="text/css" rel="stylesheet" href="${pageContext.request.contextPath}/static/css/common.css"/>
+    <link type="text/css" rel="stylesheet" href="${pageContext.request.contextPath}/static/css/index.css"/>
+    <script language="javascript" type="text/javascript"
+            src="${pageContext.request.contextPath}/static/js/jquery.min.js"></script>
+    <script type="text/javascript" src="${pageContext.request.contextPath}/static/js/swiper.min.js"></script>
+    <script type="text/javascript" src="${pageContext.request.contextPath}/static/js/config.js"></script>
+    <script type="text/javascript" src="${pageContext.request.contextPath}/static/js/ajaxfileupload.js"></script>
 </head>
 <body class="gray bgcfff">
 <div class="body_tit">
@@ -30,13 +33,13 @@
     <a href="index.html" class="home_btn"></a>
 </div>
 <div class="height46"></div>
-    
+
 <div class="pay_infor">
     <p class="payinfor_tit">支付信息</p>
     <ul>
         <li>用户名:季一鸣</li>
         <li>开户行:上海银行 古美路支行</li>
-        <li>账  号:6224 6800 1019 9619 07</li>
+        <li>账 号:6224 6800 1019 9619 07</li>
         <li>支付宝账号:jym1992225@sohu.com</li>
     </ul>
 </div>
@@ -44,14 +47,65 @@
 <div class="upload_sc">
     <p class="upload_tit">上传付款凭证</p>
     <label class="upload_label" for="">
-        <input type="file" name="">
-        <img src="images/timg.jpg">
+        <input type="file" name="payimg" id="licenseimg">
+        <input id="license" type="hidden" name="payimg"/>
+        <img src="${pageContext.request.contextPath}/static/images/timg.jpg" id="payimg">
     </label>
     <p class="upload_des">提示:上传你的付款单据或者支付截图,<br>图片大小不超过1M。</p>
     <a href="upload_success.html" class="upload uploadsc">提交付款凭证</a>
     <p class="upload_des upload_ts">提示:提交完成后付款凭证不可更改。</p>
 </div>
 
+<script type="text/javascript">
+
+    var orderid = '${orderid}'
+
+    $(function () {
+        $("#licenseimg").change(function () {
+            $.ajaxFileUpload({
+                fileElementId: 'licenseimg',
+                url: 'uploadImage',
+                dataType: 'text',
+                data: {},
+                async: true,
+                error: function (data) {
+                    alert("网络异常,请重试");
+                },
+                success: function (message) {
+                    $("#license").val(message);
+                    $("#payimg").attr("src", message);
+                    chen();
+                    $.post("uporder.html", {"orderid": orderid, "path": message}, function (data) {
+
+                    })
+                }
+            });
+        });
+
+        function chen() {
+            $("#licenseimg").change(function () {
+                $.ajaxFileUpload({
+                    fileElementId: 'licenseimg',
+                    url: 'uploadImage',
+                    dataType: 'text',
+                    data: {},
+                    async: true,
+                    error: function (data) {
+                        alert("网络异常,请重试");
+                    },
+                    success: function (message) {
+                        $("#license").val(message);
+                        $("#payimg").attr("src", message);
+                        chen();
+                        $.post("uporder.html", {"orderid": orderid, "path": message}, function (data) {
+
+                        })
+                    }
+                });
+            });
+        }
+    })
+</script>
 
 </body>
 </html>

+ 207 - 202
src/main/webapp/WEB-INF/jsp/xieyi.jsp

@@ -5,23 +5,25 @@
 <!DOCTYPE HTML>
 <html>
 <head>
-<title id="pageTitle">接米沪牌代拍</title>
-<meta name="renderer" content="webkit"/>
-<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
-<meta name="format-detection" content="telephone=no" />
-<meta name="apple-mobile-web-app-capable" content="yes" />
-<meta name="apple-mobile-web-app-status-bar-style" content="black" />
-<meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0 user-scalable=no"/>
-<meta id="description" name="Description" content=""/>
-<meta id="key" name="Keywords" content=""/>
+    <title id="pageTitle">接米沪牌代拍</title>
+    <meta name="renderer" content="webkit"/>
+    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"/>
+    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
+    <meta name="format-detection" content="telephone=no"/>
+    <meta name="apple-mobile-web-app-capable" content="yes"/>
+    <meta name="apple-mobile-web-app-status-bar-style" content="black"/>
+    <meta name="viewport"
+          content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0 user-scalable=no"/>
+    <meta id="description" name="Description" content=""/>
+    <meta id="key" name="Keywords" content=""/>
 
-<link type="text/css" rel="stylesheet" href="css/swiper.min.css"/>
-<link type="text/css" rel="stylesheet" href="css/common.css"/>
-<link type="text/css" rel="stylesheet" href="css/index.css"/>
-<script language="javascript" type="text/javascript" src="js/jquery.min.js"></script>
-<script type="text/javascript" src="js/swiper.min.js"></script>
-<script type="text/javascript" src="js/config.js"></script>
+    <link type="text/css" rel="stylesheet" href="${pageContext.request.contextPath}/static/css/swiper.min.css"/>
+    <link type="text/css" rel="stylesheet" href="${pageContext.request.contextPath}/static/css/common.css"/>
+    <link type="text/css" rel="stylesheet" href="${pageContext.request.contextPath}/static/css/index.css"/>
+    <script language="javascript" type="text/javascript"
+            src="${pageContext.request.contextPath}/static/js/jquery.min.js"></script>
+    <script type="text/javascript" src="${pageContext.request.contextPath}/static/js/swiper.min.js"></script>
+    <script type="text/javascript" src="${pageContext.request.contextPath}/static/js/config.js"></script>
 </head>
 <body class="gray bgcfff">
 <div class="body_tit">
@@ -31,200 +33,203 @@
 </div>
 <div class="height46"></div>
 <div class="sytjtc bgcfff maniteet">
-<p class="xieyi_title" style="text-align:center;font-size:18px;margin:0 0 30px;">代理拍沪(车)牌服务协议</p>
-<p>
-	委托人(下称“甲方”):
-</p>
-<p style="text-indent:2em;">
-	姓 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 名:<input type="text" class="headingtu">
-</p>
-<p style="text-indent:2em;">
-	身份证号码:<input type="text" class="headingtu">
-</p>
-<p style="text-indent:2em;">
-	预留手机号:<input type="text" class="headingtu">
-</p>
-<p>
-	<br>
-</p>
-<p>
-	代理人(下称“乙方”):上海接米网络工作室
-</p>
-<p>
-	__
-</p>
+    <p class="xieyi_title" style="text-align:center;font-size:18px;margin:0 0 30px;">代理拍沪(车)牌服务协议</p>
+    <p>
+        委托人(下称“甲方”):
+    </p>
+    <p style="text-indent:2em;">
+        姓 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 名:<input type="text" class="headingtu">
+    </p>
+    <p style="text-indent:2em;">
+        身份证号码:<input type="text" class="headingtu">
+    </p>
+    <p style="text-indent:2em;">
+        预留手机号:<input type="text" class="headingtu">
+    </p>
+    <p>
+        <br>
+    </p>
+    <p>
+        代理人(下称“乙方”):上海接米网络工作室
+    </p>
+    <p>
+        __
+    </p>
 
-<p style="text-indent:2em;">
-	由于甲方对电脑操作不熟练且不能很好的掌握拍卖规则和技巧,故甲方通过接米代拍操作在未来<input value="6" type="text">个月内“上海市个人非营业性客车额度拍卖”。甲、乙、双方遵循平等、自愿、互利和诚实信用原则,经友好协商,就有关代理拍沪(车)牌事项达成如下协议(协议编号<input class="input_text1" value="JM20190611018" type="text">),以资信守。
-</p>
-<p>
-	<br>
-</p>
-<p class="xieyi_item_tit" style="font-weight:bold;text-indent:2em;">
-	1. 代理服务内容、期限、赔偿金
-</p>
-<p style="text-indent:2em;">
-	1.1甲方所提供的拍卖额度标书账号为<input class="input_text1" type="text">,拍卖额度标书密码为<input type="text"> 。
-</p>
-<p>
-	<br>
-</p>
-<p style="text-indent:2em;">
-	1.2 经甲乙双方确认,此次代理服务有效期为<input value="6" type="text">个自然月,即从您满足拍卖资格的月份算起,往后延续6个自然月。因服务的具体事宜为操作每月仅一次的“上海市个人非营业性客车额度拍卖会”,有效期内乙方若为甲方拍中额度即为服务完成,服务有效期自动终止。若乙方在6个自然月内的拍卖会上仍未拍中额度,本协议的代理服务亦即刻终止。 
-</p>
-<p>
-	<br>
-</p>
-<p style="text-indent:2em;">
-	1.2.1 乙方是否在本协议约定期限内为甲方拍得额度,以“上海国际商品拍卖有限公司”劲标网“www.alltobid.com”查询结果为准。
-</p>
-<p>
-	<br>
-</p>
-<p style="text-indent:2em;">
-	1.2.2 本协议约定期限内,甲方通过劲标网“www.alltobid.com”查得额度被拍中,甲方将无条件认可乙方的代理服务已完成,并按协议规定期限支付全额代拍服务费用。 
-</p>
-<p>
-	<br>
-</p>
-<p style="text-indent:2em;">
-	1.3 乙方在约定服务期间内为甲方拍得额度,乙方的代拍服务费的结算方式如下: 
-</p>
-<p>
-	<br>
-</p>
-<p style="text-indent:2em;">
-	甲方应在拍得额度3个工作日内将代拍服务费<input class="input_text1" type="text">元(大写:<input class="input_text1" type="text">)支付至乙方服务平台。 
-</p>
-<p>
-	<br>
-</p>
-<p style="text-indent:2em;">
-	1.32 乙方在约定服务期间未为甲方拍得额度,赔偿的金额结算方式如下:
-</p>
-<p style="text-indent:2em;">
-	乙方应在服务结束后3个工作日内将赔偿金额<input class="input_text1" type="text">元(大写:<input class="input_text1" type="text">)支付至甲方账户。
-</p>
-<p>
-	<br>
-</p>
-<p>
-	<br>
-</p>
-<p style="text-indent:2em;">
-	1.4.1 代理服务有效期内,乙方若无法为甲方拍得当月的额度,甲方均无需支付乙方任何费用,乙方根据甲方在平台所选的套餐情况向甲方支付赔付金。
-</p>
-<p>
-	<br>
-</p>
-<p style="text-indent:2em;">
-	1.4.1 代理服务有效期内,乙方若无法为甲方拍得当月的额度,甲方均无需支付乙方任何费用,乙方根据甲方在平台所选的套餐情况向甲方支付赔付金。 
-</p>
-<p style="text-indent:2em;">
-	1.4.2 甲方自主选择平台<input type="text">代拍套餐。 
-</p>
+    <p style="text-indent:2em;">
+        由于甲方对电脑操作不熟练且不能很好的掌握拍卖规则和技巧,故甲方通过接米代拍操作在未来<input value="6" type="text">个月内“上海市个人非营业性客车额度拍卖”。甲、乙、双方遵循平等、自愿、互利和诚实信用原则,经友好协商,就有关代理拍沪(车)牌事项达成如下协议(协议编号<input
+            class="input_text1" value="JM20190611018" type="text">),以资信守。
+    </p>
+    <p>
+        <br>
+    </p>
+    <p class="xieyi_item_tit" style="font-weight:bold;text-indent:2em;">
+        1. 代理服务内容、期限、赔偿金
+    </p>
+    <p style="text-indent:2em;">
+        1.1甲方所提供的拍卖额度标书账号为<input class="input_text1" type="text">,拍卖额度标书密码为<input type="text"> 。
+    </p>
+    <p>
+        <br>
+    </p>
+    <p style="text-indent:2em;">
+        1.2 经甲乙双方确认,此次代理服务有效期为<input value="6" type="text">个自然月,即从您满足拍卖资格的月份算起,往后延续6个自然月。因服务的具体事宜为操作每月仅一次的“上海市个人非营业性客车额度拍卖会”,有效期内乙方若为甲方拍中额度即为服务完成,服务有效期自动终止。若乙方在6个自然月内的拍卖会上仍未拍中额度,本协议的代理服务亦即刻终止。
+    </p>
+    <p>
+        <br>
+    </p>
+    <p style="text-indent:2em;">
+        1.2.1 乙方是否在本协议约定期限内为甲方拍得额度,以“上海国际商品拍卖有限公司”劲标网“www.alltobid.com”查询结果为准。
+    </p>
+    <p>
+        <br>
+    </p>
+    <p style="text-indent:2em;">
+        1.2.2 本协议约定期限内,甲方通过劲标网“www.alltobid.com”查得额度被拍中,甲方将无条件认可乙方的代理服务已完成,并按协议规定期限支付全额代拍服务费用。
+    </p>
+    <p>
+        <br>
+    </p>
+    <p style="text-indent:2em;">
+        1.3 乙方在约定服务期间内为甲方拍得额度,乙方的代拍服务费的结算方式如下:
+    </p>
+    <p>
+        <br>
+    </p>
+    <p style="text-indent:2em;">
+        甲方应在拍得额度3个工作日内将代拍服务费<input class="input_text1" type="text">元(大写:<input class="input_text1" type="text">)支付至乙方服务平台。
+    </p>
+    <p>
+        <br>
+    </p>
+    <p style="text-indent:2em;">
+        1.32 乙方在约定服务期间未为甲方拍得额度,赔偿的金额结算方式如下:
+    </p>
+    <p style="text-indent:2em;">
+        乙方应在服务结束后3个工作日内将赔偿金额<input class="input_text1" type="text">元(大写:<input class="input_text1" type="text">)支付至甲方账户。
+    </p>
+    <p>
+        <br>
+    </p>
+    <p>
+        <br>
+    </p>
+    <p style="text-indent:2em;">
+        1.4.1 代理服务有效期内,乙方若无法为甲方拍得当月的额度,甲方均无需支付乙方任何费用,乙方根据甲方在平台所选的套餐情况向甲方支付赔付金。
+    </p>
+    <p>
+        <br>
+    </p>
+    <p style="text-indent:2em;">
+        1.4.1 代理服务有效期内,乙方若无法为甲方拍得当月的额度,甲方均无需支付乙方任何费用,乙方根据甲方在平台所选的套餐情况向甲方支付赔付金。
+    </p>
+    <p style="text-indent:2em;">
+        1.4.2 甲方自主选择平台<input type="text">代拍套餐。
+    </p>
+    <p class="xieyi_item_tit" style="font-weight:bold;text-indent:2em;">
+        2. 各方责任、违约处罚
+    </p>
+    <p>
+        <br>
+    </p>
+    <p style="text-indent:2em;">
+        2.1 甲方责任
+    </p>
+    <p>
+        <br>
+    </p>
+    <p style="text-indent:2em;">
+        2.1.1 甲方签订此协议后,应积极配合向乙方平台提供参加拍卖会的相应材料,并保证其提供的信息和资料的真实性,不得提供虚假资料或隐瞒其他重要事实。
+    </p>
+    <p>
+        <br>
+    </p>
 
+    <p style="text-indent:2em;">
+        2.1.2
+        甲方应在每次拍卖会后,及时去国拍官网查询拍卖结果,得知拍中额度后不得以任何理由拒付代拍服务费,应自觉在协议约定时间内将该服务费支付到乙方平台,超过协议约定最迟付款日,则属于甲方违约,额外支付合同总额5%的违约金,另自甲方应支付费用之日起至实际支付完毕之日止,每天按应付而未付金额的1%承担滞纳金。
 
-<p class="xieyi_item_tit" style="font-weight:bold;text-indent:2em;">
-	2. 各方责任、违约处罚 
-</p>
-<p>
-	<br>
-</p>
-<p style="text-indent:2em;">
-	2.1 甲方责任 
-</p>
-<p>
-	<br>
-</p>
-<p style="text-indent:2em;">
-	2.1.1 甲方签订此协议后,应积极配合向乙方平台提供参加拍卖会的相应材料,并保证其提供的信息和资料的真实性,不得提供虚假资料或隐瞒其他重要事实。 
-</p>
-<p>
-	<br>
-</p>
+    </p>
+    <p>
+        <br>
+    </p>
+    <p style="text-indent:2em;">
+        2.1.3甲方签订此协议后,严禁将协议内所标注的买卖额度标书账号和密码泄露给任意第三方,在拍卖会举行的全程严禁以此标书账号登录国拍系统从而干扰乙方代理服务的正常进行。
+    </p>
+    <p>
+        <br>
+    </p>
+    <p style="text-indent:2em;">
+        2.2 乙方责任
+    </p>
+    <p>
+        <br>
+    </p>
 
-<p style="text-indent:2em;">
-	2.1.2 甲方应在每次拍卖会后,及时去国拍官网查询拍卖结果,得知拍中额度后不得以任何理由拒付代拍服务费,应自觉在协议约定时间内将该服务费支付到乙方平台,超过协议约定最迟付款日,则属于甲方违约,额外支付合同总额5%的违约金,另自甲方应支付费用之日起至实际支付完毕之日止,每天按应付而未付金额的1%承担滞纳金。 
+    <p style="text-indent:2em;">
+        2.2.1 乙方签订此协议后,应履约代理甲方参与拍卖会并认真操作“上海市个人非营业性客车额度拍卖”,严禁漏拍这类明显损害甲方利益的行为,乙方漏拍一次需向甲方赔付500元罚金。(漏拍:额度拍卖全程未出价。)
+    </p>
+    <p>
+        <br>
+    </p>
+    <p style="text-indent:2em;">
+        2.2.2 乙方严禁将甲方所提供的买卖额度标书账号和密码泄露或转卖给任意第三方。
+    </p>
+    <p>
+        <br>
+    </p>
+    <p>
+        <br>
+    </p>
+    <p>
+        <br>
+    </p>
 
-</p>
-<p>
-	<br>
-</p>
-<p style="text-indent:2em;">
-	2.1.3甲方签订此协议后,严禁将协议内所标注的买卖额度标书账号和密码泄露给任意第三方,在拍卖会举行的全程严禁以此标书账号登录国拍系统从而干扰乙方代理服务的正常进行。
-</p>
-<p>
-	<br>
-</p>
-<p style="text-indent:2em;">
-	2.2 乙方责任 
-</p>
-<p>
-	<br>
-</p>
+    <p>
+        甲方(姓名):<input type="text" class="headingtu">
+    </p>
+    <p>
+        <br>
+    </p>
+    <p>
+        日 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 期:<input type="text"
+                                                                                            class="headingtu">
+    </p>
+    <p>
+        <br>
+    </p>
+    <p>
+        <br>
+    </p>
+    <p>
+        <br>
+    </p>
+    <p>
+        乙 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 方:<input type="text"
+                                                                                            class="headingtu">
+    </p>
 
-<p style="text-indent:2em;">
-	2.2.1 乙方签订此协议后,应履约代理甲方参与拍卖会并认真操作“上海市个人非营业性客车额度拍卖”,严禁漏拍这类明显损害甲方利益的行为,乙方漏拍一次需向甲方赔付500元罚金。(漏拍:额度拍卖全程未出价。) 
-</p>
-<p>
-	<br>
-</p>
-<p style="text-indent:2em;">
-	2.2.2 乙方严禁将甲方所提供的买卖额度标书账号和密码泄露或转卖给任意第三方。 
-</p>
-<p>
-	<br>
-</p>
-<p>
-	<br>
-</p>
-<p>
-	<br>
-</p>
+    <p>
+        <br>
+    </p>
+    <p>
+        日 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 期:<input type="text"
+                                                                                            class="headingtu">
+    </p>
 
-<p>
-	甲方(姓名):<input type="text" class="headingtu">
-</p>
-<p>
-	<br>
-</p>
-<p>
-	日 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 期:<input type="text" class="headingtu">
-</p>
-<p>
-	<br>
-</p>
-<p>
-	<br>
-</p>
-<p>
-	<br>
-</p>
-<p>
-	乙 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 方:<input type="text" class="headingtu">
-</p>
+    <p>
+        <br>
+    </p>
+    <p>
+        <br>
+    </p>
+    <p>
+        <br>
+    </p>
 
-<p>
-	<br>
-</p>
-<p>
-	日 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 期:<input type="text" class="headingtu">
-</p>
-
-<p>
-	<br>
-</p>
-<p>
-	<br>
-</p>
-<p>
-	<br>
-</p>
-
-<p>
-	<br>
-</p>
+    <p>
+        <br>
+    </p>
 </div>
 
 

File diff suppressed because it is too large
+ 383 - 0
src/main/webapp/WEB-INF/jsp/xieyichakan.jsp


+ 14 - 4
src/main/webapp/WEB-INF/jsp/xieyiqr.jsp

@@ -77,8 +77,12 @@
             1. 代理服务内容、期限、赔偿金
         </p>
         <p style="text-indent:2em;">
-            <c:forEach items="${meal.labelbook}" var="labelbook" begin="0" end="0">
-                1.1甲方所提供的拍卖额度标书账号为<input class="input_text1" name="labelnum" value="${labelbook.labelnum}" type="text">,拍卖额度标书密码为<input type="text" name="labelpwd" value="${labelbook.labelpwd}" > 。
+            <c:forEach items="${meal.labelbooks}" var="labelbook" begin="0" end="0">
+                1.1甲方所提供的拍卖额度标书账号为<input class="input_text1" name="labelnum" value="${labelbook.labelnum}" type="text">,拍卖额度标书密码为<input
+                type="text" name="labelpwd" value="${labelbook.labelpwd}"> 。
+            </c:forEach>
+            <c:forEach items="${meal.labelbooks}" var="labelbook" begin="1" end="1">
+                <input class="input_text1" name="labelnum1" value="${labelbook.labelnum}" hidden="hidden">
             </c:forEach>
         </p>
         <p>
@@ -243,6 +247,8 @@
         </p>
         <p>
             乙 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 方:<input type="text"
+                                                                                                name="yifangname"
+                                                                                                value="上海接米网络工作室"
                                                                                                 class="headingtu">
         </p>
 
@@ -251,6 +257,7 @@
         </p>
         <p>
             日 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 期:<input type="text"
+                                                                                                value="${dateStrings}"
                                                                                                 class="headingtu">
         </p>
 
@@ -337,8 +344,11 @@
         $('#signature').append(img);
         $("#qianm").val(dataUrl);
         $(".qianzi_shadow").hide();
-        $.post("sucess.html", $("#xieyi").serialize(), function (data) {
-
+        $.post("sucessajax.html", $("#xieyi").serialize(), function (data) {
+            var obj = eval("(" + data + ")");
+            if (obj.is) {
+                window.location.href = 'sucess.html?serverid=' + obj.data;
+            }
         })
     }
 

BIN
src/main/webapp/uploadimg/1568199356048.png


BIN
src/main/webapp/uploadimg/1568199396022.png


BIN
src/main/webapp/uploadimg/15681994245011568199424501.png


BIN
src/main/webapp/uploadimg/15681994546571568199454657.png


BIN
src/main/webapp/uploadimg/15681995907251568199590725.png


BIN
target/classes/com/Base64/BASE64DecodedMultipartFile.class


BIN
target/classes/com/Base64/Base64StrToImage.class


BIN
target/classes/com/yc/education/controller/AnnouncementController.class


BIN
target/classes/com/yc/education/controller/IndexController.class


BIN
target/classes/com/yc/education/controller/LabelBookController.class


BIN
target/classes/com/yc/education/controller/OrdersController.class


BIN
target/classes/com/yc/education/mapper/LabelbookMapper.class


BIN
target/classes/com/yc/education/mapper/ReceiptMapper.class


BIN
target/classes/com/yc/education/mapper/ServiceagreementMapper.class


BIN
target/classes/com/yc/education/model/Meal.class


BIN
target/classes/com/yc/education/model/Serviceagreement.class


BIN
target/classes/com/yc/education/service/LabelbookService.class


BIN
target/classes/com/yc/education/service/ReceiptService.class


BIN
target/classes/com/yc/education/service/impl/LabelbookServiceImpl.class


BIN
target/classes/com/yc/education/service/impl/ReceiptServiceImpl.class


BIN
target/classes/com/yc/education/util/Base64Utils.class


BIN
target/jiemit/WEB-INF/classes/com/Base64/BASE64DecodedMultipartFile.class


BIN
target/jiemit/WEB-INF/classes/com/Base64/Base64StrToImage.class


BIN
target/jiemit/WEB-INF/classes/com/yc/education/controller/AnnouncementController.class


BIN
target/jiemit/WEB-INF/classes/com/yc/education/controller/IndexController.class


BIN
target/jiemit/WEB-INF/classes/com/yc/education/controller/LabelBookController.class


BIN
target/jiemit/WEB-INF/classes/com/yc/education/controller/OrdersController.class


BIN
target/jiemit/WEB-INF/classes/com/yc/education/mapper/LabelbookMapper.class


BIN
target/jiemit/WEB-INF/classes/com/yc/education/mapper/ReceiptMapper.class


BIN
target/jiemit/WEB-INF/classes/com/yc/education/mapper/ServiceagreementMapper.class


BIN
target/jiemit/WEB-INF/classes/com/yc/education/model/Meal.class


BIN
target/jiemit/WEB-INF/classes/com/yc/education/model/Serviceagreement.class


BIN
target/jiemit/WEB-INF/classes/com/yc/education/service/LabelbookService.class


BIN
target/jiemit/WEB-INF/classes/com/yc/education/service/ReceiptService.class


BIN
target/jiemit/WEB-INF/classes/com/yc/education/service/ServiceagreementService.class


BIN
target/jiemit/WEB-INF/classes/com/yc/education/service/impl/LabelbookServiceImpl.class


BIN
target/jiemit/WEB-INF/classes/com/yc/education/service/impl/ReceiptServiceImpl.class


BIN
target/jiemit/WEB-INF/classes/com/yc/education/service/impl/ServiceagreementServiceImpl.class


BIN
target/jiemit/WEB-INF/classes/com/yc/education/util/Base64Utils.class


+ 10 - 1
target/jiemit/WEB-INF/jsp/admin/addmeal.jsp

@@ -77,6 +77,7 @@
 
 
         <c:if test="${type == 2}">
+            <input type="hidden" name="num" value="1">
             <div class="row cl">
                 <label class="form-label col-xs-4 col-sm-2"><span class="c-red">*</span>套餐类型:</label>
                 <div class="formControls col-xs-8 col-sm-9">
@@ -103,7 +104,7 @@
                         </div>
                     </c:forEach>
                 </c:if>
-                <c:if test="${meal.biddocumentList.size() == 0}">
+                <c:if test="${meal.biddocumentList == null}">
                     <div class="row cl">
                         <label class="form-label col-xs-4 col-sm-2"></label>
                         <div class="formControls col-xs-8 col-sm-2">
@@ -186,6 +187,10 @@
 
 
 
+
+
+
+
                 </script>
             </div>
         </div>
@@ -202,6 +207,10 @@
 
 
 
+
+
+
+
                 </script>
             </div>
         </div>

+ 0 - 0
target/jiemit/WEB-INF/jsp/admin/index.jsp


Some files were not shown because too many files changed in this diff