1
0
Переглянути джерело

Merge branch 'master' of http://git.ds-bay.com/project/kmall-pt-general

csk 4 роки тому
батько
коміт
4429a24203
84 змінених файлів з 4784 додано та 369 видалено
  1. 120 0
      kmall-admin/pom.xml
  2. 3 3
      kmall-admin/src/main/java/com/kmall/admin/controller/GoodsController.java
  3. 106 0
      kmall-admin/src/main/java/com/kmall/admin/controller/OrderAlipayRecordController.java
  4. 78 3
      kmall-admin/src/main/java/com/kmall/admin/controller/OrderController.java
  5. 1 1
      kmall-admin/src/main/java/com/kmall/admin/dao/GoodsDao.java
  6. 16 0
      kmall-admin/src/main/java/com/kmall/admin/dao/OrderAlipayRecordDao.java
  7. 460 0
      kmall-admin/src/main/java/com/kmall/admin/entity/OrderAlipayRecordEntity.java
  8. 10 0
      kmall-admin/src/main/java/com/kmall/admin/entity/OrderEntity.java
  9. 13 1
      kmall-admin/src/main/java/com/kmall/admin/entity/PickUpCodeEntity.java
  10. 6 0
      kmall-admin/src/main/java/com/kmall/admin/fromcomm/controller/SysLoginController.java
  11. 2 3
      kmall-admin/src/main/java/com/kmall/admin/service/GoodsService.java
  12. 77 0
      kmall-admin/src/main/java/com/kmall/admin/service/OrderAlipayRecordService.java
  13. 4 0
      kmall-admin/src/main/java/com/kmall/admin/service/OrderService.java
  14. 10 0
      kmall-admin/src/main/java/com/kmall/admin/service/OrderWXPayRecordService.java
  15. 2 2
      kmall-admin/src/main/java/com/kmall/admin/service/impl/GoodsServiceImpl.java
  16. 107 0
      kmall-admin/src/main/java/com/kmall/admin/service/impl/OrderAlipayRecordServiceImpl.java
  17. 259 19
      kmall-admin/src/main/java/com/kmall/admin/service/impl/OrderServiceImpl.java
  18. 30 0
      kmall-admin/src/main/java/com/kmall/admin/service/impl/OrderWXPayRecordServiceImpl.java
  19. 1 0
      kmall-admin/src/main/java/com/kmall/admin/service/impl/PickUpCodeServiceImpl.java
  20. 23 10
      kmall-admin/src/main/java/com/kmall/admin/task/TestTask.java
  21. 50 20
      kmall-admin/src/main/java/com/kmall/admin/websocket/WebSocketServer.java
  22. 41 41
      kmall-admin/src/main/resources/conf/fastdfs.properties
  23. 1 1
      kmall-admin/src/main/resources/logback.xml
  24. 5 5
      kmall-admin/src/main/resources/mybatis/mapper/GoodsDao.xml
  25. 226 0
      kmall-admin/src/main/resources/mybatis/mapper/OrderAlipayRecordDao.xml
  26. 1 0
      kmall-admin/src/main/resources/mybatis/mapper/OrderDao.xml
  27. 11 11
      kmall-admin/src/main/resources/mybatis/mapper/OrderProcessRecordDao.xml
  28. 15 9
      kmall-admin/src/main/resources/mybatis/mapper/PickUpCodeDao.xml
  29. 3 1
      kmall-admin/src/main/resources/mybatis/mapper/UserDao.xml
  30. 10 16
      kmall-admin/src/main/resources/spring/spring-context.xml
  31. 16 3
      kmall-admin/src/main/resources/spring/spring-main.xml
  32. 10 6
      kmall-admin/src/main/resources/spring/spring-mvc.xml
  33. BIN
      kmall-admin/src/main/webapp/WEB-INF/lib/alipay-sdk-java-3.3.0-source.jar
  34. BIN
      kmall-admin/src/main/webapp/WEB-INF/lib/alipay-sdk-java-3.3.0.jar
  35. BIN
      kmall-admin/src/main/webapp/WEB-INF/lib/alipay-trade-sdk-20161215-source.jar
  36. BIN
      kmall-admin/src/main/webapp/WEB-INF/lib/alipay-trade-sdk-20161215.jar
  37. BIN
      kmall-admin/src/main/webapp/WEB-INF/lib/commons-codec-1.10.jar
  38. BIN
      kmall-admin/src/main/webapp/WEB-INF/lib/commons-configuration-1.10.jar
  39. BIN
      kmall-admin/src/main/webapp/WEB-INF/lib/commons-lang-2.6.jar
  40. BIN
      kmall-admin/src/main/webapp/WEB-INF/lib/commons-logging-1.1.1.jar
  41. BIN
      kmall-admin/src/main/webapp/WEB-INF/lib/core-2.1.jar
  42. BIN
      kmall-admin/src/main/webapp/WEB-INF/lib/gson-2.3.1.jar
  43. BIN
      kmall-admin/src/main/webapp/WEB-INF/lib/hamcrest-core-1.3.jar
  44. 95 60
      kmall-admin/src/main/webapp/WEB-INF/page/sale/sale.html
  45. 1 1
      kmall-admin/src/main/webapp/WEB-INF/web.xml
  46. 276 32
      kmall-admin/src/main/webapp/js/sale/sale.js
  47. 31 17
      kmall-admin/src/main/webapp/login.html
  48. 12 1
      kmall-admin/src/main/webapp/statics/css/login.css
  49. 19 0
      kmall-admin/src/main/webapp/statics/css/sale.css
  50. BIN
      kmall-admin/src/main/webapp/statics/img/login1.jpg
  51. BIN
      kmall-admin/src/main/webapp/statics/img/logotest2.jpg
  52. 57 0
      kmall-api/pom.xml
  53. 10 0
      kmall-api/src/main/java/com/kmall/api/entity/OrderVo.java
  54. 201 0
      kmall-common/pom.xml
  55. 103 0
      kmall-framework/pom.xml
  56. 24 0
      kmall-gen/pom.xml
  57. 72 0
      kmall-manager/pom.xml
  58. 247 0
      kmall-manager/src/main/java/com/kmall/manager/manager/alipay/AliPayConfigs.java
  59. 214 0
      kmall-manager/src/main/java/com/kmall/manager/manager/alipay/AliPayMicropayApiResult.java
  60. 131 0
      kmall-manager/src/main/java/com/kmall/manager/manager/alipay/AliPayRequestParams.java
  61. 370 0
      kmall-manager/src/main/java/com/kmall/manager/manager/alipay/AliPayUtil.java
  62. 461 0
      kmall-manager/src/main/java/com/kmall/manager/manager/pay/alipay/AliPayMain.java
  63. 55 0
      kmall-manager/src/main/java/com/kmall/manager/manager/pay/alipay/DemoHbRunner.java
  64. 58 0
      kmall-manager/src/main/resources/conf/alipay.properties
  65. 22 22
      kmall-manager/src/main/resources/conf/cus.properties
  66. 7 7
      kmall-manager/src/main/resources/conf/db.properties
  67. 30 30
      kmall-manager/src/main/resources/conf/pingan-pay.properties
  68. 5 5
      kmall-manager/src/main/resources/conf/redis.properties
  69. 39 39
      kmall-manager/src/main/resources/conf/wx-global.properties
  70. BIN
      kmall-manager/src/main/resources/lib/alipay-sdk-java-3.3.0-source.jar
  71. BIN
      kmall-manager/src/main/resources/lib/alipay-sdk-java-3.3.0.jar
  72. BIN
      kmall-manager/src/main/resources/lib/alipay-trade-sdk-20161215-source.jar
  73. BIN
      kmall-manager/src/main/resources/lib/alipay-trade-sdk-20161215.jar
  74. BIN
      kmall-manager/src/main/resources/lib/commons-codec-1.10.jar
  75. BIN
      kmall-manager/src/main/resources/lib/commons-configuration-1.10.jar
  76. BIN
      kmall-manager/src/main/resources/lib/commons-lang-2.6.jar
  77. BIN
      kmall-manager/src/main/resources/lib/commons-logging-1.1.1.jar
  78. BIN
      kmall-manager/src/main/resources/lib/core-2.1.jar
  79. BIN
      kmall-manager/src/main/resources/lib/gson-2.3.1.jar
  80. BIN
      kmall-manager/src/main/resources/lib/hamcrest-core-1.3.jar
  81. 25 0
      kmall-manager/src/main/resources/log4j.properties
  82. 1 0
      kmall-manager/src/main/resources/spring/spring-manager-context.xml
  83. 134 0
      kmall-schedule/pom.xml
  84. 367 0
      pom.xml

+ 120 - 0
kmall-admin/pom.xml

@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>kmall-pt-general</artifactId>
+        <groupId>com.kmall</groupId>
+        <version>3.1.0</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>kmall-admin</artifactId>
+    <packaging>war</packaging>
+    <description>管理后台</description>
+
+
+    <dependencies>
+
+        <dependency>
+            <groupId>com.kmall</groupId>
+            <artifactId>kmall-common</artifactId>
+            <version>${kmall-version}</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.kmall</groupId>
+            <artifactId>kmall-gen</artifactId>
+            <version>${kmall-version}</version>
+        </dependency>
+        <dependency>
+            <groupId>com.kmall</groupId>
+            <artifactId>kmall-api</artifactId>
+            <version>${kmall-version}</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework</groupId>
+            <artifactId>spring-websocket</artifactId>
+            <version>${springframework-version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework</groupId>
+            <artifactId>spring-messaging</artifactId>
+            <version>${springframework-version}</version>
+        </dependency>
+        <dependency>
+            <groupId>javax.websocket</groupId>
+            <artifactId>javax.websocket-api</artifactId>
+            <version>1.1</version>
+            <scope>provided</scope>
+        </dependency>
+
+    </dependencies>
+
+    <build>
+        <scriptSourceDirectory>src/main/java</scriptSourceDirectory>
+
+        <resources>
+            <resource>
+                <directory>src/main/resources</directory>
+                <filtering>true</filtering>
+                <includes>
+                    <include>**/*.xml</include>
+                    <include>**/*.properties</include>
+                </includes>
+            </resource>
+            <resource>
+                <directory>src/main/java</directory>
+                <filtering>true</filtering>
+                <includes>
+                    <include>**/*.xml</include>
+                    <include>**/*.properties</include>
+                </includes>
+            </resource>
+        </resources>
+
+        <plugins>
+
+            <!-- 拷贝依赖的jar包到lib目录 -->
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-dependency-plugin</artifactId>
+                <executions>
+                    <execution>
+                        <id>copy-dependency</id>
+                        <phase>package</phase>
+                        <goals>
+                            <goal>copy-dependencies</goal>
+                        </goals>
+                        <configuration>
+                            <outputDirectory>${project.build.directory}/lib</outputDirectory>
+                            <excludeTransitive>false</excludeTransitive>
+                            <stripVersion>false</stripVersion>
+                        </configuration>
+                    </execution>
+                </executions>
+            </plugin>
+
+            <plugin>
+                <artifactId>maven-war-plugin</artifactId>
+                <version>${maven.war.version}</version>
+                <configuration>
+                    <packagingExcludes>WEB-INF/web.xml</packagingExcludes>
+                    <failOnMissingWebXml>false</failOnMissingWebXml>
+                    <warSourceDirectory>src/main/webapp</warSourceDirectory>
+                    <failOnMissingWebXml>false</failOnMissingWebXml>
+                    <webResources>
+                        <resource>
+                            <directory>src/main/resources/conf</directory>
+                            <targetPath>WEB-INF/classes/conf</targetPath>
+                            <filtering>true</filtering>
+                        </resource>
+                    </webResources>
+                </configuration>
+            </plugin>
+        </plugins>
+
+    </build>
+
+</project>

+ 3 - 3
kmall-admin/src/main/java/com/kmall/admin/controller/GoodsController.java

@@ -283,9 +283,9 @@ public class GoodsController {
         return R.ok().put("goods", goods);
     }
 
-    @RequestMapping("/details/{prodBarcode}")
+    @RequestMapping("/details/{prodBarcode}/{storeId}")
 //    @RequiresPermissions("goods:details") http://127.0.0.1:8080/goods/details/11111
-    public R details(@PathVariable("prodBarcode")String prodBarcode) {
+    public R details(@PathVariable("prodBarcode")String prodBarcode,@PathVariable("storeId")String storeId) {
         SysUserEntity user = ShiroUtils.getUserEntity();
         if(user == null) {
             return R.error("用户登录超时,请重新登录");
@@ -293,7 +293,7 @@ public class GoodsController {
         if (!user.getRoleType().equalsIgnoreCase("2")) {
             return R.error("该操作只允许店员账户操作");
         }
-        GoodsDetailsDto goods = goodsService.queryGoodsDetailsByProdBarcode(prodBarcode);
+        GoodsDetailsDto goods = goodsService.queryGoodsDetailsByProdBarcode(prodBarcode,storeId);
         if(goods == null) {
             return R.error("商品信息不存在");
         }

+ 106 - 0
kmall-admin/src/main/java/com/kmall/admin/controller/OrderAlipayRecordController.java

@@ -0,0 +1,106 @@
+package com.kmall.admin.controller;
+
+import java.util.List;
+import java.util.Map;
+
+import com.kmall.admin.entity.OrderAlipayRecordEntity;
+import com.kmall.admin.service.OrderAlipayRecordService;
+import com.kmall.common.utils.PageUtils;
+import com.kmall.common.utils.Query;
+import com.kmall.common.utils.R;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.*;
+
+/**
+ * 支付宝付款码支付记录Controller
+ *
+ * @author emato
+ * @email admin@qhdswl.com
+ * @date 2020-05-21 09:31:51
+ */
+@Controller
+@RequestMapping("orderalipayrecord")
+public class OrderAlipayRecordController {
+    @Autowired
+    private OrderAlipayRecordService orderAlipayRecordService;
+
+    /**
+     * 查看列表
+     */
+    @RequestMapping("/list")
+    @RequiresPermissions("orderalipayrecord:list")
+    @ResponseBody
+    public R list(@RequestParam Map<String, Object> params) {
+        //查询列表数据
+        Query query = new Query(params);
+
+        List<OrderAlipayRecordEntity> orderAlipayRecordList = orderAlipayRecordService.queryList(query);
+        int total = orderAlipayRecordService.queryTotal(query);
+
+        PageUtils pageUtil = new PageUtils(orderAlipayRecordList, total, query.getLimit(), query.getPage());
+
+        return R.ok().put("page", pageUtil);
+    }
+
+    /**
+     * 查看信息
+     */
+    @RequestMapping("/info/{id}")
+    @RequiresPermissions("orderalipayrecord:info")
+    @ResponseBody
+    public R info(@PathVariable("id") Integer id) {
+        OrderAlipayRecordEntity orderAlipayRecord = orderAlipayRecordService.queryObject(id);
+
+        return R.ok().put("orderAlipayRecord", orderAlipayRecord);
+    }
+
+    /**
+     * 保存
+     */
+    @RequestMapping("/save")
+    @RequiresPermissions("orderalipayrecord:save")
+    @ResponseBody
+    public R save(@RequestBody OrderAlipayRecordEntity orderAlipayRecord) {
+        orderAlipayRecordService.save(orderAlipayRecord);
+
+        return R.ok();
+    }
+
+    /**
+     * 修改
+     */
+    @RequestMapping("/update")
+    @RequiresPermissions("orderalipayrecord:update")
+    @ResponseBody
+    public R update(@RequestBody OrderAlipayRecordEntity orderAlipayRecord) {
+        orderAlipayRecordService.update(orderAlipayRecord);
+
+        return R.ok();
+    }
+
+    /**
+     * 删除
+     */
+    @RequestMapping("/delete")
+    @RequiresPermissions("orderalipayrecord:delete")
+    @ResponseBody
+    public R delete(@RequestBody Integer[]ids) {
+        orderAlipayRecordService.deleteBatch(ids);
+
+        return R.ok();
+    }
+
+    /**
+     * 查看所有列表
+     */
+    @RequestMapping("/queryAll")
+    @ResponseBody
+    public R queryAll(@RequestParam Map<String, Object> params) {
+
+        List<OrderAlipayRecordEntity> list = orderAlipayRecordService.queryList(params);
+
+        return R.ok().put("list", list);
+    }
+}

+ 78 - 3
kmall-admin/src/main/java/com/kmall/admin/controller/OrderController.java

@@ -39,9 +39,12 @@ import javax.servlet.http.HttpServletResponse;
 import javax.websocket.server.PathParam;
 import java.io.IOException;
 import java.math.BigDecimal;
+import java.math.RoundingMode;
 import java.text.ParseException;
 import java.text.SimpleDateFormat;
 import java.util.*;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
 
 
 /**
@@ -293,6 +296,14 @@ public class OrderController {
         return R.ok().put("ticket", ticket);
     }
 
+    @RequestMapping("/printMsgAndChangeCode")
+    public R printMsgAndChangeCode(@RequestBody Map param) {
+        Integer id = (Integer) param.get("id");
+        String sessionId = (String) param.get("sessionId");
+        Ticket ticket = orderService.printMsg(id.longValue(),sessionId);
+        return R.ok().put("ticket", ticket);
+    }
+
     @RequestMapping("/printCode")
     public R printMsg(){
 
@@ -853,16 +864,51 @@ public class OrderController {
     }
 
 
-
+    /**
+     * 收银端支付
+     * @param param
+     * @return
+     * @throws IOException
+     */
     @RequestMapping("/orderConfirm")
     public R orderConfirm(@RequestBody Map param) throws IOException {
 
         SysUserEntity user = ShiroUtils.getUserEntity();
-        Map resultObj = orderService.offlineRetailSubmit(param,user);
+        Map resultObj = null;
+        try {
+//            throw new RuntimeException("系统异常");
+            resultObj = orderService.offlineRetailSubmit(param,user);
+            return R.ok().put("resultObj", resultObj);
+        } catch (Exception e) {
+            return R.error(e.getMessage());
+
+        }
+
+    }
+
+    /**
+     *
+     * @param param
+     * @return
+     * @throws IOException
+     */
+    @RequestMapping("/orderRefund")
+    public R orderRefund( @RequestBody Map param) {
+        Integer orderId = (Integer) param.get("orderId");
+        OrderEntity orderInfo = orderService.queryObject(orderId.longValue());
 
-        return R.ok().put("resultObj", resultObj);
+        String sessionId = (String) param.get("sessionId");
+
+        try {
+            orderService.orderRefund(orderInfo,sessionId);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+
+        return R.ok();
     }
 
+
     @RequestMapping("/orderDetail/{orderSn}")
     public R orderDetail(@PathVariable("orderSn") String orderSn) throws IOException {
 
@@ -872,11 +918,40 @@ public class OrderController {
         map.put("orderId",orderEntity.getId());
         List<OrderGoodsEntity> goodsList = orderGoodsService.queryList(map);
 
+        BigDecimal tax = new BigDecimal(0);
+        for(OrderGoodsEntity orderGoodsEntity : goodsList){
+            BigDecimal retailPrice = orderGoodsEntity.getRetailPrice();
+            BigDecimal goodsRate = orderGoodsEntity.getGoodsRate();
+            Integer number = orderGoodsEntity.getNumber();
+            BigDecimal goodsTax = retailPrice.multiply(goodsRate).multiply(new BigDecimal(number));
+            tax = tax.add(goodsTax);
+        }
+
         Map<String,Object> result = new HashMap<>();
         result.put("orderProcessRecordEntity",orderProcessRecordEntity);
         result.put("orderEntity",orderEntity);
         result.put("goodsList",goodsList);
+        result.put("tax",tax.setScale(2, RoundingMode.HALF_DOWN).toString());
 
         return R.ok().put("resultObj", result);
     }
+
+    @RequestMapping("/getIdCardInfo")
+    public R getIdCardInfo() throws IOException {
+
+        Map map = new HashMap();
+        String ssl = OkHttpUtils.post(map,"http://qhdswl.f3322.net:56800/api/limit/get", "SSL");
+        Pattern pattern = Pattern.compile("(\\\\u(\\p{XDigit}{4}))");
+        Matcher matcher = pattern.matcher(ssl);
+        char ch;
+        while (matcher.find()) {
+            ch = (char) Integer.parseInt(matcher.group(2), 16);
+            ssl = ssl.replace(matcher.group(1), ch + "");
+        }
+
+        return R.ok().put("info",ssl);
+
+    }
+
+
 }

+ 1 - 1
kmall-admin/src/main/java/com/kmall/admin/dao/GoodsDao.java

@@ -24,7 +24,7 @@ public interface GoodsDao extends BaseDao<GoodsEntity> {
 
     GoodsEntity queryObjectByProdBarcodeAndStore(@Param("prodBarcode")String prodBarcode, @Param("storeId")Integer storeId);
 
-    GoodsDetailsDto queryGoodsDetailsByProdBarcode(@Param("prodBarcode")String prodBarcode);
+    GoodsDetailsDto queryGoodsDetailsByProdBarcode(@Param("prodBarcode") String prodBarcode, @Param("storeId")String storeId);
 
     List<GoodsEntity> querySame(Map<String, Object> map);
 

+ 16 - 0
kmall-admin/src/main/java/com/kmall/admin/dao/OrderAlipayRecordDao.java

@@ -0,0 +1,16 @@
+package com.kmall.admin.dao;
+
+import com.kmall.admin.entity.OrderAlipayRecordEntity;
+import com.kmall.manager.dao.BaseDao;
+
+/**
+ * 支付宝付款码支付记录Dao
+ *
+ * @author emato
+ * @email admin@qhdswl.com
+ * @date 2020-05-21 09:31:51
+ */
+public interface OrderAlipayRecordDao extends BaseDao<OrderAlipayRecordEntity> {
+    public int countByOutTradeNo(String outTradeNo);
+
+}

+ 460 - 0
kmall-admin/src/main/java/com/kmall/admin/entity/OrderAlipayRecordEntity.java

@@ -0,0 +1,460 @@
+package com.kmall.admin.entity;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * 支付宝付款码支付记录实体
+ * 表名 mall_order_alipay_record
+ *
+ * @author emato
+ * @email admin@qhdswl.com
+ * @date 2020-05-21 09:31:51
+ */
+public class OrderAlipayRecordEntity implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 编号
+     */
+    private Integer id;
+    /**
+     * 返回状态码
+     */
+    private String returnCode;
+    /**
+     * 返回信息
+     */
+    private String returnMsg;
+    /**
+     * 业务结果
+     */
+    private String resultCode;
+    /**
+     * 错误代码
+     */
+    private String errCode;
+    /**
+     * 错误代码描述
+     */
+    private String errCodeDes;
+    /**
+     * 买家支付宝账号
+     */
+    private String buyerLogonId;
+    /**
+     * 是否关注公众账号(未使用)
+     */
+    private String isSubscribe;
+    /**
+     * 交易类型(MICROPAY 付款码支付)
+     */
+    private String tradeType;
+    /**
+     * 货币类型(默认人民币:CNY)
+     */
+    private String feeType;
+    /**
+     * 订单金额(订单总金额,单位为分,只能为整数)
+     */
+    private String totalFee;
+    /**
+     * 支付宝交易号
+     */
+    private String tradeNo;
+    /**
+     * 商户订单号
+     */
+    private String outTradeNo;
+    /**
+     * 发送给支付宝的商户订单号  outTradeNo + _ + (发送次数-1)
+     */
+    private String outTradeNoAlipay;
+    /**
+     * 商家数据包,原样返回
+     */
+    private String attach;
+    /**
+     * 支付完成时间,格式为yyyyMMddHHmmss
+     */
+    private String timeEnd;
+    /**
+     * 交易状态,SUCCESS—支付成功,REFUND—转入退款,NOTPAY—未支付,CLOSED—已关闭,REVOKED—已撤销(付款码支付),USERPAYING--用户支付中(付款码支付),PAYERROR--支付失败(其他原因,如银行返回失败)
+     */
+    private String tradeState;
+    /**
+     * 创建人编号
+     */
+    private String createrSn;
+    /**
+     * 创建时间
+     */
+    private Date createTime;
+    /**
+     * 修改人编号
+     */
+    private String moderSn;
+    /**
+     * 修改时间
+     */
+    private Date modTime;
+    /**
+     * 时间戳
+     */
+    private Date tstm;
+    /**
+     * 网关返回码
+     */
+    private String code;
+    /**
+     * 网关返回码描述
+     */
+    private String msg;
+    /**
+     * 业务返回码
+     */
+    private String subCode;
+    /**
+     * 业务返回码描述
+     */
+    private String subMsg;
+
+    /**
+     * 设置:编号
+     */
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    /**
+     * 获取:编号
+     */
+    public Integer getId() {
+        return id;
+    }
+    /**
+     * 设置:返回状态码
+     */
+    public void setReturnCode(String returnCode) {
+        this.returnCode = returnCode;
+    }
+
+    /**
+     * 获取:返回状态码
+     */
+    public String getReturnCode() {
+        return returnCode;
+    }
+    /**
+     * 设置:返回信息
+     */
+    public void setReturnMsg(String returnMsg) {
+        this.returnMsg = returnMsg;
+    }
+
+    /**
+     * 获取:返回信息
+     */
+    public String getReturnMsg() {
+        return returnMsg;
+    }
+    /**
+     * 设置:业务结果
+     */
+    public void setResultCode(String resultCode) {
+        this.resultCode = resultCode;
+    }
+
+    /**
+     * 获取:业务结果
+     */
+    public String getResultCode() {
+        return resultCode;
+    }
+    /**
+     * 设置:错误代码
+     */
+    public void setErrCode(String errCode) {
+        this.errCode = errCode;
+    }
+
+    /**
+     * 获取:错误代码
+     */
+    public String getErrCode() {
+        return errCode;
+    }
+    /**
+     * 设置:错误代码描述
+     */
+    public void setErrCodeDes(String errCodeDes) {
+        this.errCodeDes = errCodeDes;
+    }
+
+    /**
+     * 获取:错误代码描述
+     */
+    public String getErrCodeDes() {
+        return errCodeDes;
+    }
+    /**
+     * 设置:买家支付宝账号
+     */
+    public void setBuyerLogonId(String buyerLogonId) {
+        this.buyerLogonId = buyerLogonId;
+    }
+
+    /**
+     * 获取:买家支付宝账号
+     */
+    public String getBuyerLogonId() {
+        return buyerLogonId;
+    }
+    /**
+     * 设置:是否关注公众账号(未使用)
+     */
+    public void setIsSubscribe(String isSubscribe) {
+        this.isSubscribe = isSubscribe;
+    }
+
+    /**
+     * 获取:是否关注公众账号(未使用)
+     */
+    public String getIsSubscribe() {
+        return isSubscribe;
+    }
+    /**
+     * 设置:交易类型(MICROPAY 付款码支付)
+     */
+    public void setTradeType(String tradeType) {
+        this.tradeType = tradeType;
+    }
+
+    /**
+     * 获取:交易类型(MICROPAY 付款码支付)
+     */
+    public String getTradeType() {
+        return tradeType;
+    }
+    /**
+     * 设置:货币类型(默认人民币:CNY)
+     */
+    public void setFeeType(String feeType) {
+        this.feeType = feeType;
+    }
+
+    /**
+     * 获取:货币类型(默认人民币:CNY)
+     */
+    public String getFeeType() {
+        return feeType;
+    }
+    /**
+     * 设置:订单金额(订单总金额,单位为分,只能为整数)
+     */
+    public void setTotalFee(String totalFee) {
+        this.totalFee = totalFee;
+    }
+
+    /**
+     * 获取:订单金额(订单总金额,单位为分,只能为整数)
+     */
+    public String getTotalFee() {
+        return totalFee;
+    }
+    /**
+     * 设置:支付宝交易号
+     */
+    public void setTradeNo(String tradeNo) {
+        this.tradeNo = tradeNo;
+    }
+
+    /**
+     * 获取:支付宝交易号
+     */
+    public String getTradeNo() {
+        return tradeNo;
+    }
+    /**
+     * 设置:商户订单号
+     */
+    public void setOutTradeNo(String outTradeNo) {
+        this.outTradeNo = outTradeNo;
+    }
+
+    /**
+     * 获取:商户订单号
+     */
+    public String getOutTradeNo() {
+        return outTradeNo;
+    }
+    /**
+     * 设置:发送给支付宝的商户订单号  outTradeNo + _ + (发送次数-1)
+     */
+    public void setOutTradeNoAlipay(String outTradeNoAlipay) {
+        this.outTradeNoAlipay = outTradeNoAlipay;
+    }
+
+    /**
+     * 获取:发送给支付宝的商户订单号  outTradeNo + _ + (发送次数-1)
+     */
+    public String getOutTradeNoAlipay() {
+        return outTradeNoAlipay;
+    }
+    /**
+     * 设置:商家数据包,原样返回
+     */
+    public void setAttach(String attach) {
+        this.attach = attach;
+    }
+
+    /**
+     * 获取:商家数据包,原样返回
+     */
+    public String getAttach() {
+        return attach;
+    }
+    /**
+     * 设置:支付完成时间,格式为yyyyMMddHHmmss
+     */
+    public void setTimeEnd(String timeEnd) {
+        this.timeEnd = timeEnd;
+    }
+
+    /**
+     * 获取:支付完成时间,格式为yyyyMMddHHmmss
+     */
+    public String getTimeEnd() {
+        return timeEnd;
+    }
+    /**
+     * 设置:交易状态,SUCCESS—支付成功,REFUND—转入退款,NOTPAY—未支付,CLOSED—已关闭,REVOKED—已撤销(付款码支付),USERPAYING--用户支付中(付款码支付),PAYERROR--支付失败(其他原因,如银行返回失败)
+     */
+    public void setTradeState(String tradeState) {
+        this.tradeState = tradeState;
+    }
+
+    /**
+     * 获取:交易状态,SUCCESS—支付成功,REFUND—转入退款,NOTPAY—未支付,CLOSED—已关闭,REVOKED—已撤销(付款码支付),USERPAYING--用户支付中(付款码支付),PAYERROR--支付失败(其他原因,如银行返回失败)
+     */
+    public String getTradeState() {
+        return tradeState;
+    }
+    /**
+     * 设置:创建人编号
+     */
+    public void setCreaterSn(String createrSn) {
+        this.createrSn = createrSn;
+    }
+
+    /**
+     * 获取:创建人编号
+     */
+    public String getCreaterSn() {
+        return createrSn;
+    }
+    /**
+     * 设置:创建时间
+     */
+    public void setCreateTime(Date createTime) {
+        this.createTime = createTime;
+    }
+
+    /**
+     * 获取:创建时间
+     */
+    public Date getCreateTime() {
+        return createTime;
+    }
+    /**
+     * 设置:修改人编号
+     */
+    public void setModerSn(String moderSn) {
+        this.moderSn = moderSn;
+    }
+
+    /**
+     * 获取:修改人编号
+     */
+    public String getModerSn() {
+        return moderSn;
+    }
+    /**
+     * 设置:修改时间
+     */
+    public void setModTime(Date modTime) {
+        this.modTime = modTime;
+    }
+
+    /**
+     * 获取:修改时间
+     */
+    public Date getModTime() {
+        return modTime;
+    }
+    /**
+     * 设置:时间戳
+     */
+    public void setTstm(Date tstm) {
+        this.tstm = tstm;
+    }
+
+    /**
+     * 获取:时间戳
+     */
+    public Date getTstm() {
+        return tstm;
+    }
+    /**
+     * 设置:网关返回码
+     */
+    public void setCode(String code) {
+        this.code = code;
+    }
+
+    /**
+     * 获取:网关返回码
+     */
+    public String getCode() {
+        return code;
+    }
+    /**
+     * 设置:网关返回码描述
+     */
+    public void setMsg(String msg) {
+        this.msg = msg;
+    }
+
+    /**
+     * 获取:网关返回码描述
+     */
+    public String getMsg() {
+        return msg;
+    }
+    /**
+     * 设置:业务返回码
+     */
+    public void setSubCode(String subCode) {
+        this.subCode = subCode;
+    }
+
+    /**
+     * 获取:业务返回码
+     */
+    public String getSubCode() {
+        return subCode;
+    }
+    /**
+     * 设置:业务返回码描述
+     */
+    public void setSubMsg(String subMsg) {
+        this.subMsg = subMsg;
+    }
+
+    /**
+     * 获取:业务返回码描述
+     */
+    public String getSubMsg() {
+        return subMsg;
+    }
+}

+ 10 - 0
kmall-admin/src/main/java/com/kmall/admin/entity/OrderEntity.java

@@ -133,6 +133,8 @@ public class OrderEntity implements Serializable {
 
     private String orderSnWx;
 
+    private String AliTradeNo;
+
     private String isMergePay;
     //商品名称
     private String goodsName;
@@ -1085,4 +1087,12 @@ public class OrderEntity implements Serializable {
     public void setOrderProcessRecord(OrderProcessRecordEntity orderProcessRecord) {
         this.orderProcessRecord = orderProcessRecord;
     }
+
+    public String getAliTradeNo() {
+        return AliTradeNo;
+    }
+
+    public void setAliTradeNo(String aliTradeNo) {
+        AliTradeNo = aliTradeNo;
+    }
 }

+ 13 - 1
kmall-admin/src/main/java/com/kmall/admin/entity/PickUpCodeEntity.java

@@ -27,7 +27,7 @@ public class PickUpCodeEntity implements Serializable {
      */
     private String merchOrderSn;
     /**
-     * 取货码状态,0:未取,1:已取
+     * 取货码状态,0:未取,1:已取,2:可取
      */
     private String pickUpCodeStatus;
     /**
@@ -39,6 +39,10 @@ public class PickUpCodeEntity implements Serializable {
      */
     private String pickUpCodeVerificationtime;
     /**
+     * 门店id
+     */
+    private String storeId;
+    /**
      * 创建时间,yyyy-MM-dd HH:mm:ss
      */
     private Date createTime;
@@ -185,4 +189,12 @@ public class PickUpCodeEntity implements Serializable {
     public Date getTstm() {
         return tstm;
     }
+
+    public String getStoreId() {
+        return storeId;
+    }
+
+    public void setStoreId(String storeId) {
+        this.storeId = storeId;
+    }
 }

+ 6 - 0
kmall-admin/src/main/java/com/kmall/admin/fromcomm/controller/SysLoginController.java

@@ -9,6 +9,8 @@ import com.kmall.manager.manager.redis.JedisUtil;
 import org.apache.shiro.authc.*;
 import org.apache.shiro.crypto.hash.Sha256Hash;
 import org.apache.shiro.subject.Subject;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Controller;
 import org.springframework.web.bind.annotation.RequestMapping;
@@ -38,6 +40,8 @@ public class SysLoginController {
     private Producer producer;
     public static int wsTokenExpireTime = 3600 * 24 * 30;
 
+    private final Logger LOGGER = LoggerFactory.getLogger(SysLoginController.class);
+
     @RequestMapping("captcha.jpg")
     public void captcha(HttpServletResponse response, HttpSession session) throws ServletException, IOException {
         response.setHeader("Cache-Control", "no-store, no-cache");
@@ -50,6 +54,7 @@ public class SysLoginController {
         //保存到shiro session
         JedisUtil.set(Constants.KAPTCHA_SESSION_KEY, text, wsTokenExpireTime);
 
+        LOGGER.info("生成验证码:"+text);
         ServletOutputStream out = response.getOutputStream();
         ImageIO.write(image, "jpg", out);
     }
@@ -62,6 +67,7 @@ public class SysLoginController {
     @RequestMapping(value = "/sys/login", method = RequestMethod.POST)
     public R login(String username, String password, String captcha,HttpSession session) throws IOException {
         String kaptcha = (String) JedisUtil.get(Constants.KAPTCHA_SESSION_KEY);
+        LOGGER.info("获取验证码:"+kaptcha);
         System.out.println(kaptcha);
         JedisUtil.del(Constants.KAPTCHA_SESSION_KEY);
         if (!captcha.equalsIgnoreCase(kaptcha)) {

+ 2 - 3
kmall-admin/src/main/java/com/kmall/admin/service/GoodsService.java

@@ -3,8 +3,6 @@ package com.kmall.admin.service;
 import com.kmall.admin.dto.GoodsDetailsDto;
 import com.kmall.admin.dto.GoodsDto;
 import com.kmall.admin.entity.GoodsEntity;
-import com.kmall.common.utils.R;
-import org.springframework.web.multipart.MultipartFile;
 
 import java.util.List;
 import java.util.Map;
@@ -128,7 +126,8 @@ public interface GoodsService {
     /**
      * 条形码查询商品详情
      * @param prodBarcode 条形码
+     * @param storeId
      * @return
      */
-    GoodsDetailsDto queryGoodsDetailsByProdBarcode(String prodBarcode);
+    GoodsDetailsDto queryGoodsDetailsByProdBarcode(String prodBarcode, String storeId);
 }

+ 77 - 0
kmall-admin/src/main/java/com/kmall/admin/service/OrderAlipayRecordService.java

@@ -0,0 +1,77 @@
+package com.kmall.admin.service;
+
+import com.kmall.admin.entity.OrderAlipayRecordEntity;
+import com.kmall.admin.entity.OrderEntity;
+import com.kmall.manager.manager.alipay.AliPayMicropayApiResult;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 支付宝付款码支付记录Service接口
+ *
+ * @author emato
+ * @email admin@qhdswl.com
+ * @date 2020-05-21 09:31:51
+ */
+public interface OrderAlipayRecordService {
+
+    /**
+     * 根据主键查询实体
+     *
+     * @param id 主键
+     * @return 实体
+     */
+    OrderAlipayRecordEntity queryObject(Integer id);
+
+    public OrderAlipayRecordEntity saveRecord(OrderEntity order);
+    /**
+     * 分页查询
+     *
+     * @param map 参数
+     * @return list
+     */
+    List<OrderAlipayRecordEntity> queryList(Map<String, Object> map);
+
+    int updateRecord(Integer id, AliPayMicropayApiResult apiResult);
+
+    /**
+     * 分页统计总数
+     *
+     * @param map 参数
+     * @return 总数
+     */
+    int queryTotal(Map<String, Object> map);
+
+    /**
+     * 保存实体
+     *
+     * @param orderAlipayRecord 实体
+     * @return 保存条数
+     */
+    int save(OrderAlipayRecordEntity orderAlipayRecord);
+
+    /**
+     * 根据主键更新实体
+     *
+     * @param orderAlipayRecord 实体
+     * @return 更新条数
+     */
+    int update(OrderAlipayRecordEntity orderAlipayRecord);
+
+    /**
+     * 根据主键删除
+     *
+     * @param id
+     * @return 删除条数
+     */
+    int delete(Integer id);
+
+    /**
+     * 根据主键批量删除
+     *
+     * @param ids
+     * @return 删除条数
+     */
+    int deleteBatch(Integer[] ids);
+}

+ 4 - 0
kmall-admin/src/main/java/com/kmall/admin/service/OrderService.java

@@ -58,6 +58,8 @@ public interface OrderService {
      */
     Ticket printMsg(Long id);
 
+    Ticket printMsg(Long id,String sessionId);
+
     /**
      * 退款
      */
@@ -139,4 +141,6 @@ public interface OrderService {
     Map offlineRetailSubmit(Map param, SysUserEntity user);
 
     OrderEntity queryObjectByOrderSn(String orderSn);
+
+    void orderRefund(OrderEntity orderInfo, String sessionId) throws Exception;
 }

+ 10 - 0
kmall-admin/src/main/java/com/kmall/admin/service/OrderWXPayRecordService.java

@@ -5,6 +5,7 @@ import com.kmall.admin.entity.OrderWXPayRecordEntity;
 import com.kmall.api.entity.OrderVo;
 import com.kmall.common.utils.wechat.WechatMicropayApiResult;
 import com.kmall.common.utils.wechat.WechatRefundApiResult;
+import com.kmall.manager.manager.alipay.AliPayMicropayApiResult;
 
 import java.util.List;
 
@@ -65,4 +66,13 @@ public interface OrderWXPayRecordService {
     int updateWXPayRecordTradeState(Integer id, WechatRefundApiResult wechatRefundApiResult);
 
     OrderWXPayRecordEntity saveRecordVo(OrderVo order);
+
+    /**
+     * 根据支付宝返回的信息修改支付记录
+     *
+     * @param id                      支付记录id
+     * @param aliPayMicropayApiResult 微信返回的信息
+     * @return 0为成功
+     */
+    int updateRecordByAli(Integer id, AliPayMicropayApiResult aliPayMicropayApiResult);
 }

+ 2 - 2
kmall-admin/src/main/java/com/kmall/admin/service/impl/GoodsServiceImpl.java

@@ -1020,8 +1020,8 @@ public class GoodsServiceImpl implements GoodsService {
     }
 
     @Override
-    public GoodsDetailsDto queryGoodsDetailsByProdBarcode(String prodBarcode) {
-        return goodsDao.queryGoodsDetailsByProdBarcode(prodBarcode);
+    public GoodsDetailsDto queryGoodsDetailsByProdBarcode(String prodBarcode, String storeId) {
+        return goodsDao.queryGoodsDetailsByProdBarcode(prodBarcode,storeId);
     }
 /*  @Override
     @Transactional

+ 107 - 0
kmall-admin/src/main/java/com/kmall/admin/service/impl/OrderAlipayRecordServiceImpl.java

@@ -0,0 +1,107 @@
+package com.kmall.admin.service.impl;
+
+import com.kmall.admin.dao.OrderAlipayRecordDao;
+import com.kmall.admin.entity.OrderAlipayRecordEntity;
+import com.kmall.admin.entity.OrderEntity;
+import com.kmall.admin.service.OrderAlipayRecordService;
+import com.kmall.common.utils.Constant;
+import com.kmall.common.utils.DateUtils;
+import com.kmall.common.utils.RRException;
+import com.kmall.manager.manager.alipay.AliPayMicropayApiResult;
+import org.apache.commons.lang.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+
+/**
+ * 支付宝付款码支付记录Service实现类
+ *
+ * @author emato
+ * @email admin@qhdswl.com
+ * @date 2020-05-21 09:31:51
+ */
+@Service("orderAlipayRecordService")
+public class OrderAlipayRecordServiceImpl implements OrderAlipayRecordService {
+    @Autowired
+    private OrderAlipayRecordDao orderAlipayRecordDao;
+
+    @Override
+    public OrderAlipayRecordEntity queryObject(Integer id) {
+        return orderAlipayRecordDao.queryObject(id);
+    }
+
+    @Override
+    public List<OrderAlipayRecordEntity> queryList(Map<String, Object> map) {
+        return orderAlipayRecordDao.queryList(map);
+    }
+
+    @Override
+    public OrderAlipayRecordEntity saveRecord(OrderEntity order) {
+        if (order == null) {
+            throw new RRException("订单信息为空");
+        }
+
+        int count = countByOutTradeNo(order.getOrderSn());
+        OrderAlipayRecordEntity alipayRecordEntity  = new OrderAlipayRecordEntity();
+        alipayRecordEntity.setFeeType("CNY");
+        alipayRecordEntity.setTotalFee(String.valueOf(order.getActualPrice().multiply(Constant.ONE_HUNDRED).intValue()));
+        alipayRecordEntity.setTradeType("MICROPAY");
+        alipayRecordEntity.setOutTradeNo(order.getOrderSn());
+        alipayRecordEntity.setOutTradeNoAlipay(order.getOrderSn() + "_" + count);
+        alipayRecordEntity.setCreateTime(new Date());
+        alipayRecordEntity.setModTime(new Date());
+        alipayRecordEntity.setTradeState("NOTPAY");
+        orderAlipayRecordDao.save(alipayRecordEntity);
+        return alipayRecordEntity;
+    }
+    @Override
+    public int updateRecord(Integer id, AliPayMicropayApiResult apiResult) {
+        OrderAlipayRecordEntity alipayRecordEntity = new OrderAlipayRecordEntity();
+        alipayRecordEntity.setId(id);
+        alipayRecordEntity.setCode(apiResult.getCode());
+        alipayRecordEntity.setMsg(apiResult.getMsg());
+        alipayRecordEntity.setTradeNo(apiResult.getTradeNo());
+        alipayRecordEntity.setTotalFee(apiResult.getTotalAmount());
+        alipayRecordEntity.setOutTradeNo(apiResult.getOutTradeNo());
+        alipayRecordEntity.setTimeEnd(DateUtils.format(apiResult.getGmtPayment(),DateUtils.DATE_TIME_PATTERN_YYYY_MM_DD_HH_MM_SS));
+        alipayRecordEntity.setTradeState(apiResult.getTradeState());
+        alipayRecordEntity.setModTime(new Date());
+        orderAlipayRecordDao.update(alipayRecordEntity);
+        return 0;
+    }
+
+    public int countByOutTradeNo(String outTradeNo) {
+        if (StringUtils.isEmpty(outTradeNo)) {
+            throw new RRException("订单编号为空");
+        }
+        return orderAlipayRecordDao.countByOutTradeNo(outTradeNo);
+    }
+    @Override
+    public int queryTotal(Map<String, Object> map) {
+        return orderAlipayRecordDao.queryTotal(map);
+    }
+
+    @Override
+    public int save(OrderAlipayRecordEntity orderAlipayRecord) {
+        return orderAlipayRecordDao.save(orderAlipayRecord);
+    }
+
+    @Override
+    public int update(OrderAlipayRecordEntity orderAlipayRecord) {
+        return orderAlipayRecordDao.update(orderAlipayRecord);
+    }
+
+    @Override
+    public int delete(Integer id) {
+        return orderAlipayRecordDao.delete(id);
+    }
+
+    @Override
+    public int deleteBatch(Integer[]ids) {
+        return orderAlipayRecordDao.deleteBatch(ids);
+    }
+}

+ 259 - 19
kmall-admin/src/main/java/com/kmall/admin/service/impl/OrderServiceImpl.java

@@ -5,7 +5,6 @@ import com.google.common.collect.ImmutableBiMap;
 import com.google.common.collect.Maps;
 import com.kmall.admin.dao.*;
 import com.kmall.admin.dao.mk.store.MkStorePromOrderRealDao;
-import com.kmall.admin.dto.GoodsDto;
 import com.kmall.admin.dto.OrderExpressDto;
 import com.kmall.admin.dto.OrderRecognitionDto;
 import com.kmall.admin.entity.*;
@@ -14,13 +13,13 @@ import com.kmall.admin.entity.mk.store.MkStorePromOrderRealEntity;
 import com.kmall.admin.fromcomm.dao.SysConfigDao;
 import com.kmall.admin.service.*;
 import com.kmall.admin.websocket.WebSocketServer;
-import com.kmall.api.dto.CampMinusDto;
 import com.kmall.api.entity.*;
-import com.kmall.api.entity.mk.MkStoreCampMinusVo;
-import com.kmall.api.entity.mk.MkStoreTicketDiscountVo;
 import com.kmall.common.utils.ResponseData;
 import com.kmall.common.utils.wechat.WechatMicropayApiResult;
 import com.kmall.common.utils.wechat.WechatReverseApiResult;
+import com.kmall.manager.manager.alipay.AliPayMicropayApiResult;
+import com.kmall.manager.manager.alipay.AliPayRequestParams;
+import com.kmall.manager.manager.alipay.AliPayUtil;
 import com.kmall.manager.manager.express.sf.properties.SFPropertiesBuilder;
 import com.kmall.manager.manager.express.sf.properties.SFUtil;
 import com.kmall.manager.manager.express.sf.entity.SfRouteServiceResponseEntity;
@@ -39,10 +38,13 @@ import com.kmall.common.utils.*;
 import com.kmall.common.utils.print.ticket.item.*;
 import com.kmall.manager.manager.express.kdn.KdniaoUtil;
 import com.kmall.common.utils.wechat.WechatRefundApiResult;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
+import java.io.IOException;
 import java.math.BigDecimal;
 import java.text.ParseException;
 import java.text.SimpleDateFormat;
@@ -51,6 +53,10 @@ import java.util.*;
 
 @Service("orderService")
 public class OrderServiceImpl implements OrderService {
+
+
+    private final Logger LOGGER = LoggerFactory.getLogger(OrderServiceImpl.class);
+
     @Autowired
     private OrderDao orderDao;
     @Autowired
@@ -101,6 +107,8 @@ public class OrderServiceImpl implements OrderService {
     @Autowired
     private PickUpCodeService pickUpCodeService;
 
+
+
     @Override
     public OrderEntity queryObject(Long id) {
         return orderDao.queryObject(id);
@@ -234,6 +242,9 @@ public class OrderServiceImpl implements OrderService {
     @Override
     public Ticket printMsg(Long id) {
         OrderEntity orderEntity = queryInfos(id);
+
+
+
         List<OrderGoodsEntity> orderGoodsEntityList = orderEntity.getOrderGoodsEntityList();
         // 获取门店
         StoreEntity storeEntity = storeDao.queryObject(orderEntity.getStoreId());
@@ -286,6 +297,82 @@ public class OrderServiceImpl implements OrderService {
         cusListing.setOriginAddress(PrintTicketPropertiesBuilder.instance().getAddress());
         cusListing.setDeliveryAddress(storeEntity.getStoreAddress());
 
+
+
+
+
+        return TicketPrintUtil.print(head, goodsList, cashInfo, cusListing);
+    }
+
+    @Override
+    public Ticket printMsg(Long id, String sessionId) {
+        OrderEntity orderEntity = queryInfos(id);
+
+
+
+        List<OrderGoodsEntity> orderGoodsEntityList = orderEntity.getOrderGoodsEntityList();
+        // 获取门店
+        StoreEntity storeEntity = storeDao.queryObject(orderEntity.getStoreId());
+        // 获取清关信息
+        OrderProcessRecordEntity orderProcessRecordEntity =
+                orderProcessRecordDao.queryObjectByOrderSn(orderEntity.getOrderSn());
+
+        // 小票头
+        TicketHead head = new TicketHead();
+        head.setTitle(OmsMerchPropertiesBuilder.instance().getMerchName() + storeEntity.getStoreName());
+        //        head.setMemberId(orderEntity.getUserName().toString());
+        head.setOrderId(orderEntity.getOrderSn());
+        head.setTradeTime(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss EEE").format(new Date()));
+
+        // 商品信息
+        Integer goodsTotal = 0; // 商品总个数
+        BigDecimal total = Constant.ZERO; // 商品总计
+        List<Goods> goodsList = new ArrayList<>();
+        for (OrderGoodsEntity orderGoods : orderGoodsEntityList) {
+            goodsTotal += orderGoods.getNumber();
+            total = total.add(orderGoods.getRetailPrice().multiply(new BigDecimal(orderGoods.getNumber())))
+                    .setScale(2, BigDecimal.ROUND_HALF_UP);
+            Goods goods = new Goods(orderGoods.getGoodsName(), orderGoods.getRetailPrice().toString(),
+                    orderGoods.getNumber().toString(),
+                    orderGoods.getRetailPrice().multiply(new BigDecimal(orderGoods.getNumber()))
+                            .setScale(2, BigDecimal.ROUND_HALF_UP).toString());
+            goodsList.add(goods);
+        }
+
+        // 收银信息
+        CashInfo cashInfo = new CashInfo();
+        cashInfo.setGoodsTotal(goodsTotal.toString());
+        cashInfo.setTotal(total.setScale(2, BigDecimal.ROUND_HALF_UP).toString());
+        cashInfo.setReceipts(orderEntity.getActualPrice().setScale(2, BigDecimal.ROUND_HALF_UP).toString());
+        cashInfo.setOddChange("0.00");
+        cashInfo.setCoupon(orderEntity.getCouponPrice().setScale(2, BigDecimal.ROUND_HALF_UP).toString());
+        cashInfo.setFreight(
+                new BigDecimal(orderEntity.getFreightPrice()).setScale(2, BigDecimal.ROUND_HALF_UP).toString());
+        cashInfo.setPaymentMode("微信支付");
+
+        // 海关清单
+        CusListing cusListing = new CusListing();
+        cusListing.setOrderId(orderEntity.getOrderSn());
+        if (!orderEntity.getOrderBizType().equalsIgnoreCase(Dict.orderBizType.item_11.getItem())) {
+            cusListing.setWaybillId(orderProcessRecordEntity.getLogisticsNo());
+            cusListing.setInvtNo(orderProcessRecordEntity.getInvtNo());
+            cusListing.setConsignee(orderEntity.getConsignee());
+            cusListing.setConsigneeTel(orderEntity.getMobile());
+        }
+        cusListing.setOriginAddress(PrintTicketPropertiesBuilder.instance().getAddress());
+        cusListing.setDeliveryAddress(storeEntity.getStoreAddress());
+        // 尝试在取货码表中查询数据,如果有的话就改变状态
+        String orderSn = orderEntity.getOrderSn();
+        PickUpCodeEntity pickUpCodeEntity = pickUpCodeService.queryObject(orderSn);
+        if(pickUpCodeEntity != null){
+            pickUpCodeEntity.setPickUpCodeStatus("1");
+            pickUpCodeService.update(pickUpCodeEntity);
+//            try {
+//                WebSocketServer.delete(sessionId,orderEntity.getStoreId(),pickUpCodeEntity);
+//            } catch (IOException e) {
+//                e.printStackTrace();
+//            }
+        }
         return TicketPrintUtil.print(head, goodsList, cashInfo, cusListing);
     }
 
@@ -341,6 +428,7 @@ public class OrderServiceImpl implements OrderService {
         }
         // 更新库存
         updateStock(order, "管理后台订单退款");*/
+//        updateStock(order, "管理后台订单退款");
 
         queryStorePromRealUpdateIsScan(order);
     }
@@ -1003,7 +1091,7 @@ public class OrderServiceImpl implements OrderService {
         BigDecimal goodsTotalPrice = new BigDecimal(0.00);
         for (LinkedHashMap goods : goodsList) {
             goodsTotalPrice = goodsTotalPrice
-                    .add(new BigDecimal((Double) goods.get("retailPrice")).multiply(new BigDecimal((Integer) goods.get("sellVolume"))));
+                    .add(new BigDecimal( goods.get("retailPrice").toString()).multiply(new BigDecimal( goods.get("sellVolume").toString())));
         }
         //订单价格计算:订单的总价+运费
         BigDecimal orderTotalPrice = goodsTotalPrice.add(freightPrice);
@@ -1174,8 +1262,12 @@ public class OrderServiceImpl implements OrderService {
         orderEntity.setPayStatus(Integer.parseInt(Dict.payStatus.item_2.getItem()));
         orderEntity.setPayFlag(payFlag);
         orderEntity.setPayTime(new Date());
-        if(orderSnWx != null){
-            orderEntity.setOrderSnWx(orderSnWx);
+        if(Dict.payFlag.item_alipay.getItem().equalsIgnoreCase(payFlag)){
+            orderEntity.setAliTradeNo(orderSnWx);
+        }else {
+            if (orderSnWx != null) {
+                orderEntity.setOrderSnWx(orderSnWx);
+            }
         }
         orderDao.update(orderEntity);
         return 0;
@@ -1398,6 +1490,7 @@ public class OrderServiceImpl implements OrderService {
      * @return
      */
     @Override
+    @Transactional
     public Map offlineRetailSubmit(Map param, SysUserEntity user) {
         // 解析订单数据 List
         List<LinkedHashMap> goodsList = (List<LinkedHashMap>) param.get("goodsList");
@@ -1439,8 +1532,7 @@ public class OrderServiceImpl implements OrderService {
                     return resultObj;
                 }
                 Integer sellVolume = (Integer)goodsDto.get("sellVolume");
-                goodsEntity.setGoodsNumber(sellVolume);
-                goodsEntities.add(goodsEntity);
+
                 goodsDto.put("goodsId",goodsEntity.getId());
                 goodsDto.put("goodsSn",goodsEntity.getGoodsSn());
                 goodsDto.put("productId",goodsEntity.getProductId());
@@ -1460,13 +1552,15 @@ public class OrderServiceImpl implements OrderService {
                         productInfo.setStockNum(productInfo.getStockNum() - sellVolume);
                         productInfo.setStoreId(Long.valueOf(storeId));
                         productInfo.addSellVolume();
-//                        productStoreRelaDao.updateStockNum(productInfo);//修改普通商品库存
+                        productStoreRelaDao.updateStockNum(productInfo);//修改普通商品库存
 
                         if(goodsEntity != null) {
-                            goodsEntity.setStockNum((Integer.parseInt(goodsEntity.getStockNum()) - sellVolume)+"");
-//                            goodsDao.update(goodsEntity);
+                            goodsEntity.setGoodsNumber(goodsEntity.getGoodsNumber() - sellVolume);
+                            goodsDao.update(goodsEntity);
                         }
                     }
+                    goodsEntity.setGoodsNumber(sellVolume);
+                    goodsEntities.add(goodsEntity);
                 }
             }
 
@@ -1481,6 +1575,7 @@ public class OrderServiceImpl implements OrderService {
                 userEntity.setGender(1);
                 userEntity.setRegisterTime(new Date());
                 userEntity.setLastLoginTime(new Date());
+                userEntity.setIdNo((String) userInfo.get("customIDCard"));
                 userDao.save(userEntity);
             }
 
@@ -1492,7 +1587,7 @@ public class OrderServiceImpl implements OrderService {
             order.setStore_id(storeId.longValue());
             order.setMerchOrderSn(merchOrderSn);
 
-            //开启事务,插入订单信息和订单商品
+            //插入订单信息和订单商品
             orderDao.saveOrderVo(order);
 
             // TODO 订单流转表
@@ -1534,9 +1629,9 @@ public class OrderServiceImpl implements OrderService {
 
 
             // 微信支付
-            wxPay(user, parCode, resultObj, order, processRecordEntity, orderWXPayRecordCurrent, store);
+//            wxPay(user, parCode, resultObj, order, processRecordEntity, orderWXPayRecordCurrent, store);
             // 支付宝支付
-//            AliPay();
+            AliPay(user, parCode, resultObj, order, processRecordEntity, orderWXPayRecordCurrent, store);
 
             // 保存订单流转表
             // 设置下单完成时间
@@ -1560,8 +1655,8 @@ public class OrderServiceImpl implements OrderService {
         } catch (Exception e) {
             e.printStackTrace();
             resultObj.put("errno", 400);
-            resultObj.put("errmsg", "订单异常");
-            return resultObj;
+            resultObj.put("errmsg", "订单异常------"+e.getMessage());
+            throw new RuntimeException(e);
         }
 
 
@@ -1570,6 +1665,106 @@ public class OrderServiceImpl implements OrderService {
         return resultObj;
     }
 
+    private void AliPay(SysUserEntity user, String parCode, Map resultObj, OrderVo order, OrderProcessRecordEntity processRecordEntity, OrderWXPayRecordEntity orderWXPayRecordCurrent, StoreEntity store) throws Exception {
+
+        AliPayRequestParams params = new AliPayRequestParams();
+        params.setAuthCode(parCode);
+        params.setBody(order.getApprovalRemark());
+        params.setOutTradeNo(order.getOrder_sn());
+        params.setSubject("CW下单");
+        params.setStoreId(store.getId()+"");
+        params.setTotalAmount(order.getActual_price().setScale(2,BigDecimal.ROUND_HALF_UP)+"");
+        LOGGER.info("调用阿里支付接口的请求参数:"+JacksonUtils.toJson(params));
+        AliPayMicropayApiResult aliPayMicropayApiResult = AliPayUtil.aliTradePay(params);
+        orderWXPayRecordService.updateRecordByAli(orderWXPayRecordCurrent.getId(), aliPayMicropayApiResult);
+        LOGGER.info("调用阿里支付接口的同步返回结果:"+JacksonUtils.toJson(aliPayMicropayApiResult));
+        resultObj.put("shopName",store.getStoreName()); // 根据门店编号查询
+        resultObj.put("userName",user.getUsername());
+
+
+        // 修改订单状态
+        //当支付成功时,修改订单,并把其他支付记录撤销
+        if (AliPayUtil.AliPayTradeState.SUCC.getCode().equals(aliPayMicropayApiResult.getCode())) {
+//            //查询当前订单所有的支付记录
+//            List<OrderWXPayRecordEntity> orderWXPayRecordEntitys =
+//                    orderWXPayRecordService.getRecordsByOutTradeNo(order.getOrder_sn());
+            this.confirmPay(order.getId(), Dict.payFlag.item_alipay.getItem(), aliPayMicropayApiResult.getTradeNo());
+            // 设置支付单完成时间
+            processRecordEntity.setPaymentSuccTime(aliPayMicropayApiResult.getGmtPayment());
+            processRecordEntity.setPayTransactionId(aliPayMicropayApiResult.getTradeNo());
+
+        // 系统繁忙
+        } else if(AliPayUtil.AliPayTradeState.SERVER_FAIL.getCode().equals(aliPayMicropayApiResult.getCode())){
+            LOGGER.info(aliPayMicropayApiResult.getSubMsg());
+            throw new RuntimeException(aliPayMicropayApiResult.getSubMsg()+",请稍后再试");
+
+        // 支付失败
+        }else if(AliPayUtil.AliPayTradeState.BUSINESS_FAIL.getCode().equals(aliPayMicropayApiResult.getCode())){
+            // 系统异常
+            if(AliPayUtil.BusinessFailState.SYSTEM_ERROR.getCode().equalsIgnoreCase(aliPayMicropayApiResult.getSubCode())){
+                LOGGER.info(aliPayMicropayApiResult.getSubMsg());
+                throw new RuntimeException(aliPayMicropayApiResult.getSubMsg()+",请稍后再试");
+            // 订单总额超过限额
+            }else if(AliPayUtil.BusinessFailState.TOTAL_FEE_EXCEED.getCode().equalsIgnoreCase(aliPayMicropayApiResult.getSubCode())){
+                LOGGER.info(aliPayMicropayApiResult.getSubMsg());
+                throw new RuntimeException(aliPayMicropayApiResult.getSubMsg()+",请告知顾客");
+            // 授权码无效
+            }else if(AliPayUtil.BusinessFailState.PAYMENT_AUTH_CODE_INVALID.getCode().equalsIgnoreCase(aliPayMicropayApiResult.getSubCode())){
+                LOGGER.info(aliPayMicropayApiResult.getSubMsg());
+                throw new RuntimeException(aliPayMicropayApiResult.getSubMsg()+",请顾客刷新条码后,重新支付");
+            // 交易信息被篡改
+            }else if(AliPayUtil.BusinessFailState.CONTEXT_INCONSISTENT.getCode().equalsIgnoreCase(aliPayMicropayApiResult.getSubCode())){
+                LOGGER.info(aliPayMicropayApiResult.getSubMsg());
+                throw new RuntimeException(aliPayMicropayApiResult.getSubMsg()+",请重试");
+            // 余额支付功能关闭
+            }else if(AliPayUtil.BusinessFailState.ERROR_BALANCE_PAYMENT_DISABLE.getCode().equalsIgnoreCase(aliPayMicropayApiResult.getSubCode())){
+                LOGGER.info(aliPayMicropayApiResult.getSubMsg());
+                throw new RuntimeException(aliPayMicropayApiResult.getSubMsg()+",请用户打开余额支付");
+            // 交易买家不匹配
+            }else if(AliPayUtil.BusinessFailState.TRADE_BUYER_NOT_MATCH.getCode().equalsIgnoreCase(aliPayMicropayApiResult.getSubCode())){
+                LOGGER.info(aliPayMicropayApiResult.getSubMsg());
+                throw new RuntimeException(aliPayMicropayApiResult.getSubMsg()+",请重试");
+            // 买家状态非法
+            }else if(AliPayUtil.BusinessFailState.BUYER_ENABLE_STATUS_FORBID.getCode().equalsIgnoreCase(aliPayMicropayApiResult.getSubCode())){
+                LOGGER.info(aliPayMicropayApiResult.getSubMsg());
+                throw new RuntimeException(aliPayMicropayApiResult.getSubMsg()+",请买家联系支付宝小二,确认为什么非法");
+            // 唤起移动收银台失败
+            }else if(AliPayUtil.BusinessFailState.PULL_MOBILE_CASHIER_FAIL.getCode().equalsIgnoreCase(aliPayMicropayApiResult.getSubCode())){
+                LOGGER.info(aliPayMicropayApiResult.getSubMsg());
+                throw new RuntimeException(aliPayMicropayApiResult.getSubMsg()+",请用户刷新条码后,重新支付");
+            // 用户的无限支付开关关闭
+            }else if(AliPayUtil.BusinessFailState.MOBILE_PAYMENT_SWITCH_OFF.getCode().equalsIgnoreCase(aliPayMicropayApiResult.getSubCode())){
+                LOGGER.info(aliPayMicropayApiResult.getSubMsg());
+                throw new RuntimeException(aliPayMicropayApiResult.getSubMsg()+",请用户在PC上打开无线支付开关后,在发起支付");
+            // 支付失败
+            }else if(AliPayUtil.BusinessFailState.PAYMENT_FAIL.getCode().equalsIgnoreCase(aliPayMicropayApiResult.getSubCode())){
+                LOGGER.info(aliPayMicropayApiResult.getSubMsg());
+                throw new RuntimeException(aliPayMicropayApiResult.getSubMsg()+",请重试");
+            // 商户账号被冻结
+            }else if(AliPayUtil.BusinessFailState.SELLER_BEEN_BLOCKED.getCode().equalsIgnoreCase(aliPayMicropayApiResult.getSubCode())){
+                LOGGER.info(aliPayMicropayApiResult.getSubMsg());
+                throw new RuntimeException(aliPayMicropayApiResult.getSubMsg()+",请联系支付宝小二解冻");
+            // 买家未通过人行认证
+            }else if(AliPayUtil.BusinessFailState.ERROR_BUYER_CERTIFY_LEVEL_LIMIT.getCode().equalsIgnoreCase(aliPayMicropayApiResult.getSubCode())){
+                LOGGER.info(aliPayMicropayApiResult.getSubMsg());
+                throw new RuntimeException(aliPayMicropayApiResult.getSubMsg()+",请买家联系支付宝小二");
+            // 用户当面付付款开关管壁
+            }else if(AliPayUtil.BusinessFailState.USER_FACE_PAYMENT_SWITCH_OFF.getCode().equalsIgnoreCase(aliPayMicropayApiResult.getSubCode())){
+                LOGGER.info(aliPayMicropayApiResult.getSubMsg());
+                throw new RuntimeException(aliPayMicropayApiResult.getSubMsg()+",请买家打开当面付付款开关");
+            }else{
+                LOGGER.info(aliPayMicropayApiResult.getSubMsg());
+                throw new RuntimeException(aliPayMicropayApiResult.getSubMsg());
+            }
+        // 其他支付异常状态
+        } else {
+            LOGGER.info(aliPayMicropayApiResult.getSubMsg());
+            throw new RuntimeException(aliPayMicropayApiResult.getSubMsg()+"...........请联系管理员");
+        }
+
+
+    }
+
     private void wxPay(SysUserEntity user, String parCode, Map resultObj, OrderVo order, OrderProcessRecordEntity processRecordEntity, OrderWXPayRecordEntity orderWXPayRecordCurrent, StoreEntity store) throws ParseException {
         R r;
         WechatMicropayApiResult wechatMicropayApiResult = WechatUtil
@@ -1649,6 +1844,50 @@ public class OrderServiceImpl implements OrderService {
         return orderDao.queryObjectByOrderSn(orderSn);
     }
 
+    @Override
+    public void orderRefund(OrderEntity order, String sessionId) throws Exception {
+        boolean needUpdateStock = true;
+        if (order.getOrderStatus() == Integer.parseInt(Dict.orderStatus.item_201.getItem())) {
+            order.setOrderStatus(Integer.parseInt(Dict.orderStatus.item_401.getItem()));
+        }
+        if (Dict.payFlag.item_cash.getItem().equals(order.getPayFlag())) {
+            order.setPayStatus(Integer.parseInt(Dict.payStatus.item_4.getItem()));
+        }else{
+
+            AliPayMicropayApiResult userRefund = AliPayUtil.aliTradeRefund(order.getMerchOrderSn(), "38.81",
+                    "用户退款", order.getStoreId() + "");
+
+            LOGGER.info(userRefund.getSubMsg());
+            order.setPayStatus(Integer.parseInt(Dict.payStatus.item_3.getItem()));
+            OrderRefundEntity orderRefund = new OrderRefundEntity();
+            orderRefund.setRefundId(userRefund.getTradeNo());
+            orderRefund.setOutRefundNo(userRefund.getOutTradeNo());
+            orderRefund
+                    .setRefundMoney(new BigDecimal(userRefund.getRefundFee()));
+            orderRefund.setRefundStatus(Integer.parseInt(Dict.RefundStatus.item_2.getItem()));//退款成功
+            orderRefund.setModTime(new Date());
+
+                orderRefund.setOrderId(Integer.parseInt(order.getId() + ""));
+                orderRefund.setUserId(Integer.parseInt(order.getUserId() + ""));
+                orderRefund.setCreateTime(new Date());
+                List<OrderEntity> list = orderDao.queryObjectByMerchOrderSn(order.getMerchOrderSn());
+                if(list.size()>1){//多条订单
+                    orderRefund.setRefundType(Integer.parseInt(Dict.RefundType.item_2.getItem()));//部分退款
+                }else{
+                    orderRefund.setRefundType(Integer.parseInt(Dict.RefundType.item_1.getItem()));//用户全额退款
+                }
+                orderRefundDao.save(orderRefund);//退款记录
+        }
+        orderDao.update(order);//修改为退款成功
+        // 修改取货码
+        PickUpCodeEntity pickUpCodeEntity = pickUpCodeService.queryObject(order.getOrderSn());
+        pickUpCodeEntity.setPickUpCodeStatus("3");
+        pickUpCodeService.update(pickUpCodeEntity);
+//        WebSocketServer.delete(sessionId,order.getStoreId(),pickUpCodeEntity);
+        updateStock(order, "收银端退款");
+
+    }
+
 
     /**
      * 设置订单数据
@@ -1660,8 +1899,9 @@ public class OrderServiceImpl implements OrderService {
         BigDecimal goodsTotalPrice = new BigDecimal(0.00);
         BigDecimal freightPrice = Constant.ZERO;
         for (LinkedHashMap goods : goodsList) {
+
             goodsTotalPrice = goodsTotalPrice
-                    .add(new BigDecimal((Double) goods.get("retailPrice")).multiply(new BigDecimal((Integer) goods.get("sellVolume"))));
+                    .add(new BigDecimal(goods.get("retailPrice").toString()).multiply(new BigDecimal(goods.get("sellVolume").toString())));
         }
 
 
@@ -1709,7 +1949,7 @@ public class OrderServiceImpl implements OrderService {
         orderInfo.setOrder_price(orderTotalPrice);
         orderInfo.setActual_price(actualPrice);
         orderInfo.setOrder_type("1");
-        orderInfo.setOrder_status(201);
+        orderInfo.setOrder_status(0);
         orderInfo.setShipping_status(0);
         orderInfo.setPay_status(0);
         orderInfo.setShipping_id(0L);

+ 30 - 0
kmall-admin/src/main/java/com/kmall/admin/service/impl/OrderWXPayRecordServiceImpl.java

@@ -4,6 +4,7 @@ import com.kmall.admin.dao.*;
 import com.kmall.admin.entity.*;
 import com.kmall.admin.service.OrderWXPayRecordService;
 import com.kmall.api.entity.OrderVo;
+import com.kmall.manager.manager.alipay.AliPayMicropayApiResult;
 import com.kmall.manager.manager.wechat.WechatUtil;
 import com.kmall.common.utils.Constant;
 import com.kmall.common.utils.RRException;
@@ -132,4 +133,33 @@ public class OrderWXPayRecordServiceImpl
         orderWXPayRecordDao.save(orderWXPayRecord);
         return orderWXPayRecord;
     }
+
+    /**
+     * 根据支付宝返回的信息修改支付记录
+     *
+     * @param id                      支付记录id
+     * @param aliPayMicropayApiResult 微信返回的信息
+     * @return 0为成功
+     */
+    @Override
+    public int updateRecordByAli(Integer id, AliPayMicropayApiResult aliPayMicropayApiResult) {
+        OrderWXPayRecordEntity orderWXPayRecord = new OrderWXPayRecordEntity();
+        orderWXPayRecord.setId(id);
+        orderWXPayRecord.setTradeState(aliPayMicropayApiResult.getTradeState());
+        if(WechatUtil.WXTradeState.SUCCESS.getCode().equals(orderWXPayRecord.getTradeState())){
+            orderWXPayRecord.setResultCode(orderWXPayRecord.getTradeState());
+            orderWXPayRecord.setErrCode("");
+            orderWXPayRecord.setErrCodeDes("");
+//            orderWXPayRecord.setOpenid(aliPayMicropayApiResult.getOpenid());
+//            orderWXPayRecord.setIsSubscribe(aliPayMicropayApiResult.getIs_subscribe());
+            orderWXPayRecord.setTradeType("MICROPAY"); // TODO 先写死,后期改
+            orderWXPayRecord.setFeeType("CNY"); // TODO 先写死,后期修改
+            orderWXPayRecord.setTotalFee(aliPayMicropayApiResult.getReceiptAmount());
+//            orderWXPayRecord.setTransactionId(aliPayMicropayApiResult.getTradeNo()); // TODO  支付宝流水号 可能长度不够
+//            orderWXPayRecord.setAttach(aliPayMicropayApiResult.getAttach());
+        }
+        orderWXPayRecord.setModTime(new Date());
+        orderWXPayRecordDao.update(orderWXPayRecord);
+        return 0;
+    }
 }

+ 1 - 0
kmall-admin/src/main/java/com/kmall/admin/service/impl/PickUpCodeServiceImpl.java

@@ -55,6 +55,7 @@ public class PickUpCodeServiceImpl implements PickUpCodeService {
             pickUpCode.setPickUpCodeCreatetime(df.format(new Date()));// new Date()为获取当前系统时间
         }
         pickUpCode.setModerSn(ShiroUtils.getUserEntity().getUserId().toString());
+        pickUpCode.setStoreId(ShiroUtils.getUserEntity().getStoreId().toString());
         pickUpCode.setCreateTime(new Date());
         pickUpCode.setModTime(new Date());
 

+ 23 - 10
kmall-admin/src/main/java/com/kmall/admin/task/TestTask.java

@@ -1,13 +1,24 @@
 package com.kmall.admin.task;
 
+import com.kmall.admin.entity.PickUpCodeEntity;
 import com.kmall.admin.fromcomm.entity.SysUserEntity;
 import com.kmall.admin.fromcomm.service.SysUserService;
+import com.kmall.admin.service.PickUpCodeService;
+import com.kmall.admin.websocket.WebSocketServer;
 import org.apache.commons.lang.builder.ToStringBuilder;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.annotation.EnableScheduling;
+import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.stereotype.Component;
 
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
 /**
  * 测试定时任务(演示Demo,可删除)
  * <p>
@@ -17,24 +28,26 @@ import org.springframework.stereotype.Component;
  * @email
  * @date 2016年11月30日 下午1:34:24
  */
-//@Component("testTask")
+@Component("testTask")
+@EnableScheduling
 public class TestTask {
     private Logger logger = LoggerFactory.getLogger(getClass());
 
     @Autowired
     private SysUserService sysUserService;
+    @Autowired
+    private static PickUpCodeService pickUpCodeService;
+
+
 
-    public void test(String params) {
-        logger.info("我是带参数的test方法,正在被执行,参数为:" + params);
+    @Scheduled(cron = "0/5 * * * * ?")
+    public void flushPickUpCode() {
+        logger.info("flushPickUpCode-----------------" );
 
-        try {
-            Thread.sleep(1000L);
-        } catch (InterruptedException e) {
-            e.printStackTrace();
-        }
 
-        SysUserEntity user = sysUserService.queryObject(1L);
-        System.out.println(ToStringBuilder.reflectionToString(user));
+        WebSocketServer.broadcastInfo("broadcast");
+//        SysUserEntity user = sysUserService.queryObject(1L);
+//        System.out.println(ToStringBuilder.reflectionToString(user));
 
     }
 

+ 50 - 20
kmall-admin/src/main/java/com/kmall/admin/websocket/WebSocketServer.java

@@ -37,10 +37,13 @@ public class WebSocketServer {
     private static CopyOnWriteArraySet<Session> SessionSet ;
     // 存放取货码,key是收银员编号
     private static Map<String, List<PickUpCodeEntity>> pickUpCodeMap ;
+
+    private static List<PickUpCodeEntity> pickUpList ;
     static {
         // concurrent包的线程安全Set,用来存放每个客户端对应的Session对象。
         SessionSet = new CopyOnWriteArraySet<Session>();
         pickUpCodeMap = new HashMap<>();
+        pickUpList = new ArrayList<>();
     }
 
 
@@ -52,19 +55,34 @@ public class WebSocketServer {
     public void setOptionService(PickUpCodeService pickUpCodeService) {
         WebSocketServer.pickUpCodeService = pickUpCodeService;
     }
+
+    public static void delete(String sessionId, Integer storeId, PickUpCodeEntity pickUpCodeEntity) throws IOException {
+//        List<PickUpCodeEntity> pickUpCodeEntities = pickUpCodeMap.get(storeId+"");
+//        for(PickUpCodeEntity pick : pickUpList){
+//            if(pick.getPickUpCodeSn().equalsIgnoreCase(pickUpCodeEntity.getPickUpCodeSn())){
+//                pickUpList.remove(pick);
+//            }
+//        }
+
+        sendMessage(sessionId,"delete",storeId+"");
+
+    }
+
     /**
      * 连接建立成功调用的方法
      */
     @OnOpen
     public void onOpen(Session session,@PathParam(value="param")String param ) {
         List<PickUpCodeEntity> pickUpCodeEntities = pickUpCodeMap.get(param);
-        if(pickUpCodeEntities == null){
+        // TODO
+//        if(pickUpCodeEntities == null){
             // 查询所有的取货码
-            Map<String,Object> dataParam = new HashMap<>();
-            dataParam.put("pickUpCodeCreatetime",new SimpleDateFormat("yyyy-MM-dd").format(new Date()));
-            pickUpCodeEntities = pickUpCodeService.queryList(dataParam);
-            pickUpCodeMap.put(param,pickUpCodeEntities);
-        }
+        Map<String,Object> dataParam = new HashMap<>();
+        dataParam.put("pickUpCodeCreatetime",new SimpleDateFormat("yyyy-MM-dd").format(new Date()));
+//        dataParam.put("pickUpCodeStatus","0");
+        pickUpList = pickUpCodeService.queryList(dataParam);
+        pickUpCodeMap.put(param,pickUpList);
+//        }
         SessionSet.add(session);
         logger.info("WebSocket连接请求 session id:{}", session.getId());
         // 在线数加1
@@ -120,28 +138,39 @@ public class WebSocketServer {
 
     public static void sendMessage(Session session, String message,String picNo) {
         try {
-            List<PickUpCodeEntity> pickUpCodeEntities = new ArrayList<>();
-            if(picNo != null){
-                pickUpCodeEntities = pickUpCodeMap.get(picNo);
-            }
+//            List<PickUpCodeEntity> pickUpCodeEntities = new ArrayList<>();
+            logger.info(picNo);
+//            if(picNo != null){
+//                pickUpCodeEntities = pickUpCodeMap.get(picNo);
+//            }
             Map<String,Object> data = new HashMap<>();
             if("服务端返回WebSocket连接成功".equalsIgnoreCase(message)){
 
-
-
                 data.put("sessionId",session.getId());
-                data.put("pickUpCodeList",pickUpCodeEntities);
+                data.put("pickUpCodeList",pickUpList);
 
                 String info = JSONObject.toJSONString(data);
                 session.getBasicRemote().sendText(info);
+                logger.info("发送条形码给前端,内容:" + info);
             }else{
-                // 根据订单id查询条形码,返回给前端页面
-                PickUpCodeEntity pickUpCodeEntity = pickUpCodeService.queryObject(message);
-                pickUpCodeEntities.add(pickUpCodeEntity);
-                data.put("pickUpCodeList",pickUpCodeEntities);
-                String info = JSONObject.toJSONString(data);
-                session.getBasicRemote().sendText(info);
-                logger.info("发送条形码给前端,内容:"+info);
+                if("broadcast".equalsIgnoreCase(message)){
+                    Map<String,Object> dataParam = new HashMap<>();
+                    dataParam.put("pickUpCodeCreatetime",new SimpleDateFormat("yyyy-MM-dd").format(new Date()));
+                    List<PickUpCodeEntity> pickUpList = pickUpCodeService.queryList(dataParam);
+                    data.put("pickUpCodeList", pickUpList);
+                    String info = JSONObject.toJSONString(data);
+                    session.getBasicRemote().sendText(info);
+                    logger.info("发送条形码给前端,内容:" + info);
+                }else {
+                    // 根据订单id查询条形码,返回给前端页面
+                    PickUpCodeEntity pickUpCodeEntity = pickUpCodeService.queryObject(message);
+                    pickUpList.add(pickUpCodeEntity);
+
+                    data.put("pickUpCodeList", pickUpList);
+                    String info = JSONObject.toJSONString(data);
+                    session.getBasicRemote().sendText(info);
+                    logger.info("发送条形码给前端,内容:" + info);
+                }
             }
 
 
@@ -186,6 +215,7 @@ public class WebSocketServer {
         }
         if (session != null) {
             sendMessage(session, message,storeId);
+            logger.info("sessionId:"+session.getId());
         } else {
             logger.warn("没有找到你指定ID的会话:{}", sessionId);
         }

+ 41 - 41
kmall-admin/src/main/resources/conf/fastdfs.properties

@@ -1,43 +1,7 @@
-##\u8FDE\u63A5\u8D85\u65F6\u65F6\u95F4
-connect_timeout=30
-
-#\u7F51\u7EDC\u8D85\u65F6\u65F6\u95F4
-network_timeout=60
-
-#\u6587\u4EF6\u8DEF\u5F84
-base_path=/data/files/
-
-#tracker server\u662FFastDFS\u6587\u4EF6\u7CFB\u7EDF\u7684\u534F\u8C03\u8005,\u5176\u4E3B\u8981\u4F5C\u7528\u662F\u8D1F\u8F7D\u5747\u8861\u548C\u8C03\u5EA6\u3002
-#Tracker server\u5728\u5185\u5B58\u4E2D\u8BB0\u5F55\u5206\u7EC4\u548CStorage server\u7684\u72B6\u6001\u7B49\u4FE1\u606F\uFF0C\u4E0D\u8BB0\u5F55\u6587\u4EF6\u7D22\u5F15\u4FE1\u606F
-tracker_server=192.168.1.251:22122
-
-log_level=info
-
-use_connection_pool = false
-
-connection_pool_max_idle_time = 3600
-
-load_fdfs_parameters_from_tracker=false
-
-use_storage_id = false
-
-storage_ids_filename = storage_ids.conf
-
-#HTTP \u670D\u52A1\u5668\u5730\u5740
-http.tracket_nginx_addr=192.168.1.251
-
-#HTTP \u670D\u52A1\u5668\u7AEF\u53E3\u53F7
-http.tracker_server_port=80
-
-#\u6587\u4EF6\u4F5C\u8005
-file.author=kmall-pt
-
-
-#############\u751F\u4EA7\u73AF\u5883################
 ###\u8FDE\u63A5\u8D85\u65F6\u65F6\u95F4
-##connect_timeout=30
-##
-###\u7F51\u7EDC\u8D85\u65F6\u65F6\u95F4
+#connect_timeout=30
+#
+##\u7F51\u7EDC\u8D85\u65F6\u65F6\u95F4
 #network_timeout=60
 #
 ##\u6587\u4EF6\u8DEF\u5F84
@@ -45,7 +9,7 @@ file.author=kmall-pt
 #
 ##tracker server\u662FFastDFS\u6587\u4EF6\u7CFB\u7EDF\u7684\u534F\u8C03\u8005,\u5176\u4E3B\u8981\u4F5C\u7528\u662F\u8D1F\u8F7D\u5747\u8861\u548C\u8C03\u5EA6\u3002
 ##Tracker server\u5728\u5185\u5B58\u4E2D\u8BB0\u5F55\u5206\u7EC4\u548CStorage server\u7684\u72B6\u6001\u7B49\u4FE1\u606F\uFF0C\u4E0D\u8BB0\u5F55\u6587\u4EF6\u7D22\u5F15\u4FE1\u606F
-#tracker_server=120.76.26.84:22122
+#tracker_server=192.168.1.251:22122
 #
 #log_level=info
 #
@@ -60,10 +24,46 @@ file.author=kmall-pt
 #storage_ids_filename = storage_ids.conf
 #
 ##HTTP \u670D\u52A1\u5668\u5730\u5740
-#http.tracket_nginx_addr=120.76.26.84
+#http.tracket_nginx_addr=192.168.1.251
 #
 ##HTTP \u670D\u52A1\u5668\u7AEF\u53E3\u53F7
 #http.tracker_server_port=80
 #
 ##\u6587\u4EF6\u4F5C\u8005
 #file.author=kmall-pt
+
+
+#############\u751F\u4EA7\u73AF\u5883################
+##\u8FDE\u63A5\u8D85\u65F6\u65F6\u95F4
+#connect_timeout=30
+#
+##\u7F51\u7EDC\u8D85\u65F6\u65F6\u95F4
+network_timeout=60
+
+#\u6587\u4EF6\u8DEF\u5F84
+base_path=/data/files/
+
+#tracker server\u662FFastDFS\u6587\u4EF6\u7CFB\u7EDF\u7684\u534F\u8C03\u8005,\u5176\u4E3B\u8981\u4F5C\u7528\u662F\u8D1F\u8F7D\u5747\u8861\u548C\u8C03\u5EA6\u3002
+#Tracker server\u5728\u5185\u5B58\u4E2D\u8BB0\u5F55\u5206\u7EC4\u548CStorage server\u7684\u72B6\u6001\u7B49\u4FE1\u606F\uFF0C\u4E0D\u8BB0\u5F55\u6587\u4EF6\u7D22\u5F15\u4FE1\u606F
+tracker_server=120.76.26.84:22122
+
+log_level=info
+
+use_connection_pool = false
+
+connection_pool_max_idle_time = 3600
+
+load_fdfs_parameters_from_tracker=false
+
+use_storage_id = false
+
+storage_ids_filename = storage_ids.conf
+
+#HTTP \u670D\u52A1\u5668\u5730\u5740
+http.tracket_nginx_addr=120.76.26.84
+
+#HTTP \u670D\u52A1\u5668\u7AEF\u53E3\u53F7
+http.tracker_server_port=80
+
+#\u6587\u4EF6\u4F5C\u8005
+file.author=kmall-pt

+ 1 - 1
kmall-admin/src/main/resources/logback.xml

@@ -6,7 +6,7 @@ debug:当此属性设置为true时,将打印出logback内部日志信息,
 -->
 <configuration scan="false" scanPeriod="60 seconds" debug="false">
 
-    <property name="LOG_HOME" value="/data/project/logs/kmall-pt/kmall-admin/"/>
+    <property name="LOG_HOME" value="/data/project/logs/kmall-cw/kmall-admin/"/>
     <!-- 定义日志的根目录 -->
     <property name="TRACE_DIR" value="trace" />
     <property name="DEBUG_DIR" value="debug" />

+ 5 - 5
kmall-admin/src/main/resources/mybatis/mapper/GoodsDao.xml

@@ -201,7 +201,7 @@
 
     <select id="queryObjectByProdBarcodeAndStore" resultType="com.kmall.admin.entity.GoodsEntity">
          SELECT
-            a.id,a.sku,a.goods_sn,a.name,a.list_pic_url,a.prod_barcode,r.market_price storeMarketPrice,r.retail_price storeRetailPrice ,r.stock_num,s.store_name,r.product_id,s.id 'storeId'
+            a.id,a.sku,a.goods_number,a.goods_sn,a.name,a.list_pic_url,a.prod_barcode,r.market_price storeMarketPrice,r.retail_price storeRetailPrice ,r.stock_num,s.store_name,r.product_id,s.id 'storeId',a.goods_rate as goodsRate
         FROM
             mall_goods a
         LEFT JOIN mall_product_store_rela r ON r.goods_id = a.id
@@ -224,13 +224,13 @@
     </select>
 
     <select id="queryGoodsDetailsByProdBarcode" resultType="com.kmall.admin.dto.GoodsDetailsDto">
-        SELECT
-        a.goods_sn as GoodsSn,a.retail_price as retailPrice,a.prod_barcode as prodBarcode,a.name,a.brand,a.goods_desc as goodsDesc,a.goods_unit as goodsUnit,a.goods_rate as goodsRate,a.primary_pic_url ,r.value as specification
+        SELECT distinct
+        a.goods_sn as GoodsSn,m.retail_price as retailPrice,a.prod_barcode as prodBarcode,a.name,a.brand,a.goods_desc as goodsDesc,a.goods_unit as goodsUnit,a.goods_rate as goodsRate,a.primary_pic_url ,r.value as specification
         FROM
             mall_goods a
         LEFT JOIN mall_goods_specification r ON r.goods_id = a.id
-
-        where a.prod_barcode = #{prodBarcode}
+        left join mall_product_store_rela m on m.goods_id = a.id and r.goods_id = m.goods_id
+        where a.prod_barcode = #{prodBarcode} and m.store_id = #{storeId}
     </select>
 
 

+ 226 - 0
kmall-admin/src/main/resources/mybatis/mapper/OrderAlipayRecordDao.xml

@@ -0,0 +1,226 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+
+<mapper namespace="com.kmall.admin.dao.OrderAlipayRecordDao">
+
+    <resultMap type="com.kmall.admin.entity.OrderAlipayRecordEntity" id="orderAlipayRecordMap">
+        <result property="id" column="id"/>
+        <result property="returnCode" column="return_code"/>
+        <result property="returnMsg" column="return_msg"/>
+        <result property="resultCode" column="result_code"/>
+        <result property="errCode" column="err_code"/>
+        <result property="errCodeDes" column="err_code_des"/>
+        <result property="buyerLogonId" column="buyer_logon_id"/>
+        <result property="isSubscribe" column="is_subscribe"/>
+        <result property="tradeType" column="trade_type"/>
+        <result property="feeType" column="fee_type"/>
+        <result property="totalFee" column="total_fee"/>
+        <result property="tradeNo" column="trade_no"/>
+        <result property="outTradeNo" column="out_trade_no"/>
+        <result property="outTradeNoAlipay" column="out_trade_no_alipay"/>
+        <result property="attach" column="attach"/>
+        <result property="timeEnd" column="time_end"/>
+        <result property="tradeState" column="trade_state"/>
+        <result property="createrSn" column="creater_sn"/>
+        <result property="createTime" column="create_time"/>
+        <result property="moderSn" column="moder_sn"/>
+        <result property="modTime" column="mod_time"/>
+        <result property="tstm" column="tstm"/>
+        <result property="code" column="code"/>
+        <result property="msg" column="msg"/>
+        <result property="subCode" column="sub_code"/>
+        <result property="subMsg" column="sub_msg"/>
+    </resultMap>
+
+	<select id="queryObject" resultType="com.kmall.admin.entity.OrderAlipayRecordEntity">
+		select
+			`id`,
+			`return_code`,
+			`return_msg`,
+			`result_code`,
+			`err_code`,
+			`err_code_des`,
+			`buyer_logon_id`,
+			`is_subscribe`,
+			`trade_type`,
+			`fee_type`,
+			`total_fee`,
+			`trade_no`,
+			`out_trade_no`,
+			`out_trade_no_alipay`,
+			`attach`,
+			`time_end`,
+			`trade_state`,
+			`creater_sn`,
+			`create_time`,
+			`moder_sn`,
+			`mod_time`,
+			`tstm`,
+			`code`,
+			`msg`,
+			`sub_code`,
+			`sub_msg`
+		from mall_order_alipay_record
+		where id = #{id}
+		<if test="name != null and name.trim() != ''">
+			AND name LIKE concat('%',#{name},'%')
+		</if>
+	</select>
+
+	<select id="queryList" resultType="com.kmall.admin.entity.OrderAlipayRecordEntity">
+		select
+    		`id`,
+    		`return_code`,
+    		`return_msg`,
+    		`result_code`,
+    		`err_code`,
+    		`err_code_des`,
+    		`buyer_logon_id`,
+    		`is_subscribe`,
+    		`trade_type`,
+    		`fee_type`,
+    		`total_fee`,
+    		`trade_no`,
+    		`out_trade_no`,
+    		`out_trade_no_alipay`,
+    		`attach`,
+    		`time_end`,
+    		`trade_state`,
+    		`creater_sn`,
+    		`create_time`,
+    		`moder_sn`,
+    		`mod_time`,
+    		`tstm`,
+    		`code`,
+    		`msg`,
+    		`sub_code`,
+    		`sub_msg`
+		from mall_order_alipay_record
+		WHERE 1=1
+		<if test="name != null and name.trim() != ''">
+			AND name LIKE concat('%',#{name},'%')
+		</if>
+        <choose>
+            <when test="sidx != null and sidx.trim() != ''">
+                order by ${sidx} ${order}
+            </when>
+			<otherwise>
+                order by id desc
+			</otherwise>
+        </choose>
+		<if test="offset != null and limit != null">
+			limit #{offset}, #{limit}
+		</if>
+	</select>
+	
+ 	<select id="queryTotal" resultType="int">
+		select count(*) from mall_order_alipay_record
+		WHERE 1=1
+        <if test="name != null and name.trim() != ''">
+            AND name LIKE concat('%',#{name},'%')
+        </if>
+	</select>
+	 
+	<insert id="save" parameterType="com.kmall.admin.entity.OrderAlipayRecordEntity" useGeneratedKeys="true" keyProperty="id">
+		insert into mall_order_alipay_record(
+			`return_code`,
+			`return_msg`,
+			`result_code`,
+			`err_code`,
+			`err_code_des`,
+			`buyer_logon_id`,
+			`is_subscribe`,
+			`trade_type`,
+			`fee_type`,
+			`total_fee`,
+			`trade_no`,
+			`out_trade_no`,
+			`out_trade_no_alipay`,
+			`attach`,
+			`time_end`,
+			`trade_state`,
+			`creater_sn`,
+			`create_time`,
+			`moder_sn`,
+			`mod_time`,
+			`tstm`,
+			`code`,
+			`msg`,
+			`sub_code`,
+			`sub_msg`)
+		values(
+			#{returnCode},
+			#{returnMsg},
+			#{resultCode},
+			#{errCode},
+			#{errCodeDes},
+			#{buyerLogonId},
+			#{isSubscribe},
+			#{tradeType},
+			#{feeType},
+			#{totalFee},
+			#{tradeNo},
+			#{outTradeNo},
+			#{outTradeNoAlipay},
+			#{attach},
+			#{timeEnd},
+			#{tradeState},
+			#{createrSn},
+			#{createTime},
+			#{moderSn},
+			#{modTime},
+			#{tstm},
+			#{code},
+			#{msg},
+			#{subCode},
+			#{subMsg})
+	</insert>
+	 
+	<update id="update" parameterType="com.kmall.admin.entity.OrderAlipayRecordEntity">
+		update mall_order_alipay_record 
+		<set>
+			<if test="returnCode != null">`return_code` = #{returnCode}, </if>
+			<if test="returnMsg != null">`return_msg` = #{returnMsg}, </if>
+			<if test="resultCode != null">`result_code` = #{resultCode}, </if>
+			<if test="errCode != null">`err_code` = #{errCode}, </if>
+			<if test="errCodeDes != null">`err_code_des` = #{errCodeDes}, </if>
+			<if test="buyerLogonId != null">`buyer_logon_id` = #{buyerLogonId}, </if>
+			<if test="isSubscribe != null">`is_subscribe` = #{isSubscribe}, </if>
+			<if test="tradeType != null">`trade_type` = #{tradeType}, </if>
+			<if test="feeType != null">`fee_type` = #{feeType}, </if>
+			<if test="totalFee != null">`total_fee` = #{totalFee}, </if>
+			<if test="tradeNo != null">`trade_no` = #{tradeNo}, </if>
+			<if test="outTradeNo != null">`out_trade_no` = #{outTradeNo}, </if>
+			<if test="outTradeNoAlipay != null">`out_trade_no_alipay` = #{outTradeNoAlipay}, </if>
+			<if test="attach != null">`attach` = #{attach}, </if>
+			<if test="timeEnd != null">`time_end` = #{timeEnd}, </if>
+			<if test="tradeState != null">`trade_state` = #{tradeState}, </if>
+			<if test="createrSn != null">`creater_sn` = #{createrSn}, </if>
+			<if test="createTime != null">`create_time` = #{createTime}, </if>
+			<if test="moderSn != null">`moder_sn` = #{moderSn}, </if>
+			<if test="modTime != null">`mod_time` = #{modTime}, </if>
+			<if test="tstm != null">`tstm` = #{tstm}, </if>
+			<if test="code != null">`code` = #{code}, </if>
+			<if test="msg != null">`msg` = #{msg}, </if>
+			<if test="subCode != null">`sub_code` = #{subCode}, </if>
+			<if test="subMsg != null">`sub_msg` = #{subMsg}</if>
+		</set>
+		where id = #{id}
+	</update>
+	
+	<delete id="delete">
+		delete from mall_order_alipay_record where id = #{value}
+	</delete>
+	
+	<delete id="deleteBatch">
+		delete from mall_order_alipay_record where id in 
+		<foreach item="id" collection="array" open="(" separator="," close=")">
+			#{id}
+		</foreach>
+	</delete>
+
+	<select id="countByOutTradeNo" resultType="int">
+		select count(id) from mall_order_alipay_record where out_trade_no = #{outTradeNo}
+	</select>
+
+</mapper>

+ 1 - 0
kmall-admin/src/main/resources/mybatis/mapper/OrderDao.xml

@@ -783,6 +783,7 @@
             <if test="campMinusId != null">`camp_minus_id` = #{campMinusId},</if>
             <if test="campName != null">`camp_name` = #{campName},</if>
             <if test="callbackStatus != null">`callback_status` = #{callbackStatus},</if>
+            <if test="AliTradeNo != null">`ali_trade_no` = #{AliTradeNo},</if>
             <if test="orderType != null">`order_type` = #{orderType},</if>
             <if test="storeId != null">`store_id` = #{storeId},</if>
             <if test="payFlag != null">`pay_flag` = #{payFlag},</if>

+ 11 - 11
kmall-admin/src/main/resources/mybatis/mapper/OrderProcessRecordDao.xml

@@ -30,7 +30,7 @@
         <result property="shipmentSuccTime" column="shipment_succ_time"/>
         <result property="processContent" column="process_content"/>
         <result property="tstm" column="tstm"/>
-		<result property="payTransactionId" column="pay_transaction_id"/>
+		<result property="payTransactionId" column="ali_trade_no"/>
     </resultMap>
 
 	<select id="queryObject" resultType="com.kmall.admin.entity.OrderProcessRecordEntity">
@@ -61,7 +61,7 @@
 			`shipment_succ_time`,
 			`process_content`,
 			r.`tstm`,
-			o.pay_transaction_id
+			o.ali_trade_no
 		from mall_order_process_record r inner join mall_order o on r.order_sn = o.order_sn
 		where id = #{id}
 	</select>
@@ -94,7 +94,7 @@
 		`shipment_succ_time`,
 		`process_content`,
 		r.`tstm`,
-		o.pay_transaction_id
+		o.ali_trade_no as pay_transaction_id
 		from mall_order_process_record r inner join mall_order o on r.order_sn = o.order_sn
 		where r.order_sn = #{orderSn}
 	</select>
@@ -144,7 +144,7 @@
 			limit #{offset}, #{limit}
 		</if>
 	</select>
-	
+
  	<select id="queryTotal" resultType="int">
 		select count(*) from mall_order_process_record
 		WHERE 1=1
@@ -152,7 +152,7 @@
             AND name LIKE concat('%',#{name},'%')
         </if>
 	</select>
-	 
+
 	<insert id="save" parameterType="com.kmall.admin.entity.OrderProcessRecordEntity" useGeneratedKeys="true" keyProperty="id">
 		insert into mall_order_process_record(
 			`order_sn`,
@@ -207,9 +207,9 @@
 			#{processContent},
 			#{tstm})
 	</insert>
-	 
+
 	<update id="update" parameterType="com.kmall.admin.entity.OrderProcessRecordEntity">
-		update mall_order_process_record 
+		update mall_order_process_record
 		<set>
 			<if test="orderSn != null">`order_sn` = #{orderSn}, </if>
 			<if test="userId != null">`user_id` = #{userId}, </if>
@@ -239,16 +239,16 @@
 		</set>
 		where id = #{id}
 	</update>
-	
+
 	<delete id="delete">
 		delete from mall_order_process_record where id = #{value}
 	</delete>
-	
+
 	<delete id="deleteBatch">
-		delete from mall_order_process_record where id in 
+		delete from mall_order_process_record where id in
 		<foreach item="id" collection="array" open="(" separator="," close=")">
 			#{id}
 		</foreach>
 	</delete>
 
-</mapper>
+</mapper>

+ 15 - 9
kmall-admin/src/main/resources/mybatis/mapper/PickUpCodeDao.xml

@@ -10,6 +10,7 @@
         <result property="pickUpCodeStatus" column="pick_up_code_status"/>
         <result property="pickUpCodeCreatetime" column="pick_up_code_createtime"/>
         <result property="pickUpCodeVerificationtime" column="pick_up_code_verificationtime"/>
+		<result property="storeId" column="store_id"/>
         <result property="createTime" column="create_time"/>
         <result property="moderSn" column="moder_sn"/>
         <result property="modTime" column="mod_time"/>
@@ -24,6 +25,7 @@
 			`pick_up_code_status`,
 			`pick_up_code_createtime`,
 			`pick_up_code_verificationtime`,
+			`store_id`,
 			`create_time`,
 			`moder_sn`,
 			`mod_time`,
@@ -47,6 +49,7 @@
     		`pick_up_code_status`,
     		`pick_up_code_createtime`,
     		`pick_up_code_verificationtime`,
+    		`store_id`,
     		`create_time`,
     		`moder_sn`,
     		`mod_time`,
@@ -67,14 +70,14 @@
                 order by ${sidx} ${order}
             </when>
 			<otherwise>
-                order by order_sn desc
+                order by pick_up_code_createtime desc
 			</otherwise>
         </choose>
 		<if test="offset != null and limit != null">
 			limit #{offset}, #{limit}
 		</if>
 	</select>
-	
+
  	<select id="queryTotal" resultType="int">
 		select count(*) from mall_pick_up_code
 		WHERE 1=1
@@ -82,7 +85,7 @@
             AND `order_sn` LIKE concat('%',#{orderSn},'%')
         </if>
 	</select>
-	 
+
 	<insert id="save" parameterType="com.kmall.admin.entity.PickUpCodeEntity">
 		insert into mall_pick_up_code(
 			`order_sn`,
@@ -91,6 +94,7 @@
 			`pick_up_code_status`,
 			`pick_up_code_createtime`,
 			`pick_up_code_verificationtime`,
+			`store_id`,
 			`create_time`,
 			`moder_sn`,
 			`mod_time`,
@@ -102,20 +106,22 @@
 			#{pickUpCodeStatus},
 			#{pickUpCodeCreatetime},
 			#{pickUpCodeVerificationtime},
+			#{storeId},
 			#{createTime},
 			#{moderSn},
 			#{modTime},
 			#{tstm})
 	</insert>
-	 
+
 	<update id="update" parameterType="com.kmall.admin.entity.PickUpCodeEntity">
-		update mall_pick_up_code 
+		update mall_pick_up_code
 		<set>
 			<if test="pickUpCodeSn != null">`pick_up_code_sn` = #{pickUpCodeSn}, </if>
 			<if test="merchOrderSn != null">`merch_order_sn` = #{merchOrderSn}, </if>
 			<if test="pickUpCodeStatus != null">`pick_up_code_status` = #{pickUpCodeStatus}, </if>
 			<if test="pickUpCodeCreatetime != null">`pick_up_code_createtime` = #{pickUpCodeCreatetime}, </if>
 			<if test="pickUpCodeVerificationtime != null">`pick_up_code_verificationtime` = #{pickUpCodeVerificationtime}, </if>
+			<if test="storeId != null">`store_id` = #{storeId}, </if>
 			<if test="createTime != null">`create_time` = #{createTime}, </if>
 			<if test="moderSn != null">`moder_sn` = #{moderSn}, </if>
 			<if test="modTime != null">`mod_time` = #{modTime}, </if>
@@ -123,16 +129,16 @@
 		</set>
 		where order_sn = #{orderSn}
 	</update>
-	
+
 	<delete id="delete">
 		delete from mall_pick_up_code where order_sn = #{orderSn}
 	</delete>
-	
+
 	<delete id="deleteBatch">
-		delete from mall_pick_up_code where order_sn in 
+		delete from mall_pick_up_code where order_sn in
 		<foreach item="orderSn" collection="array" open="(" separator="," close=")">
 			#{orderSn}
 		</foreach>
 	</delete>
 
-</mapper>
+</mapper>

+ 3 - 1
kmall-admin/src/main/resources/mybatis/mapper/UserDao.xml

@@ -18,7 +18,7 @@
         <result property="registerIp" column="register_ip"/>
         <result property="avatar" column="avatar"/>
         <result property="weixinOpenid" column="weixin_openid"/>
-        <result property="id" column="id_no"/>
+        <result property="idNo" column="id_no"/>
         <result property="lastFaceTime" column="last_face_time"/>
     </resultMap>
 
@@ -95,6 +95,7 @@
 		insert into mall_user(
 			`username`,
 			`password`,
+			`id_no`,
 			`gender`,
 			`birthday`,
 			`register_time`,
@@ -110,6 +111,7 @@
 		values(
 			#{username},
 			#{password},
+			#{idNo},
 			#{gender},
 			#{birthday},
 			#{registerTime},

+ 10 - 16
kmall-admin/src/main/resources/spring/spring-context.xml

@@ -5,29 +5,23 @@
        xmlns:aop="http://www.springframework.org/schema/aop"
        xmlns:mvc="http://www.springframework.org/schema/mvc"
        xsi:schemaLocation="
-        http://www.springframework.org/schema/beans 
-        http://www.springframework.org/schema/beans/spring-beans-4.2.xsd        
-        http://www.springframework.org/schema/context 
+        http://www.springframework.org/schema/beans
+        http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
+        http://www.springframework.org/schema/context
         http://www.springframework.org/schema/context/spring-context-4.2.xsd
-     	http://www.springframework.org/schema/aop 
+     	http://www.springframework.org/schema/aop
      	http://www.springframework.org/schema/aop/spring-aop-4.2.xsd
-		http://www.springframework.org/schema/mvc 
+		http://www.springframework.org/schema/mvc
      	http://www.springframework.org/schema/mvc/spring-mvc-4.2.xsd">
 
+    <import resource="spring-main.xml"/>
 
     <context:component-scan base-package="com.kmall.admin.**, com.kmall.api.**, com.kmall.manager.**, com.kmall.common.**, com.kmall.gen.**">
+        <context:exclude-filter type="aspectj" expression="com.kmall.admin.controller.**"/>
+        <context:exclude-filter type="aspectj" expression="com.kmall.admin.websocket.**"/>
     </context:component-scan>
 
-    <bean id="placeholderConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
-        <property name="locations">
-            <list>
-                <value>classpath:conf/db.properties</value>
-                <value>classpath:conf/servlet.properties</value>
-                <value>classpath:conf/fastdfs.properties</value>
-            </list>
-        </property>
-        <property name="fileEncoding" value="UTF-8"/>
-    </bean>
 
 
-</beans>
+
+</beans>

+ 16 - 3
kmall-admin/src/main/resources/spring/spring-main.xml

@@ -5,7 +5,7 @@
        xmlns:aop="http://www.springframework.org/schema/aop"
        xmlns:mvc="http://www.springframework.org/schema/mvc"
        xsi:schemaLocation="
-        http://www.springframework.org/schema/beans 
+        http://www.springframework.org/schema/beans
         http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
         http://www.springframework.org/schema/context
         http://www.springframework.org/schema/context/spring-context-4.2.xsd
@@ -14,10 +14,23 @@
 		http://www.springframework.org/schema/mvc
      	http://www.springframework.org/schema/mvc/spring-mvc-4.2.xsd">
 
-    <import resource="spring-context.xml"/>
+
+    <bean id="placeholderConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
+        <property name="locations">
+            <list>
+                <value>classpath:conf/db.properties</value>
+                <value>classpath:conf/servlet.properties</value>
+                <value>classpath:conf/fastdfs.properties</value>
+            </list>
+        </property>
+        <property name="fileEncoding" value="UTF-8"/>
+    </bean>
+
     <import resource="classpath:spring/spring-manager-main.xml"/>
     <import resource="spring-mvc.xml"/>
     <import resource="spring-shiro.xml"/>
     <import resource="classpath:kmall-api.xml"/>
 
-</beans>
+
+
+</beans>

+ 10 - 6
kmall-admin/src/main/resources/spring/spring-mvc.xml

@@ -5,17 +5,21 @@
        xmlns:aop="http://www.springframework.org/schema/aop"
        xmlns:mvc="http://www.springframework.org/schema/mvc"
        xsi:schemaLocation="
-        http://www.springframework.org/schema/beans 
-        http://www.springframework.org/schema/beans/spring-beans-4.2.xsd        
-        http://www.springframework.org/schema/context 
+        http://www.springframework.org/schema/beans
+        http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
+        http://www.springframework.org/schema/context
         http://www.springframework.org/schema/context/spring-context-4.2.xsd
-     	http://www.springframework.org/schema/aop 
+     	http://www.springframework.org/schema/aop
      	http://www.springframework.org/schema/aop/spring-aop-4.2.xsd
-		http://www.springframework.org/schema/mvc 
+		http://www.springframework.org/schema/mvc
      	http://www.springframework.org/schema/mvc/spring-mvc-4.2.xsd">
 
     <mvc:default-servlet-handler/>
 
+    <context:component-scan base-package="com.kmall.admin.**, com.kmall.api.**, com.kmall.manager.**, com.kmall.common.**, com.kmall.gen.**">
+        <context:exclude-filter type="aspectj" expression="com.kmall.admin.task.**"/>
+    </context:component-scan>
+
     <aop:aspectj-autoproxy proxy-target-class="true"/>
     <mvc:annotation-driven>
         <mvc:message-converters register-defaults="true">
@@ -103,4 +107,4 @@
     </bean>
 
 
-</beans>
+</beans>

BIN
kmall-admin/src/main/webapp/WEB-INF/lib/alipay-sdk-java-3.3.0-source.jar


BIN
kmall-admin/src/main/webapp/WEB-INF/lib/alipay-sdk-java-3.3.0.jar


BIN
kmall-admin/src/main/webapp/WEB-INF/lib/alipay-trade-sdk-20161215-source.jar


BIN
kmall-admin/src/main/webapp/WEB-INF/lib/alipay-trade-sdk-20161215.jar


BIN
kmall-admin/src/main/webapp/WEB-INF/lib/commons-codec-1.10.jar


BIN
kmall-admin/src/main/webapp/WEB-INF/lib/commons-configuration-1.10.jar


BIN
kmall-admin/src/main/webapp/WEB-INF/lib/commons-lang-2.6.jar


BIN
kmall-admin/src/main/webapp/WEB-INF/lib/commons-logging-1.1.1.jar


BIN
kmall-admin/src/main/webapp/WEB-INF/lib/core-2.1.jar


BIN
kmall-admin/src/main/webapp/WEB-INF/lib/gson-2.3.1.jar


BIN
kmall-admin/src/main/webapp/WEB-INF/lib/hamcrest-core-1.3.jar


+ 95 - 60
kmall-admin/src/main/webapp/WEB-INF/page/sale/sale.html

@@ -1,41 +1,65 @@
 <!DOCTYPE html>
 <html>
 <head>
-
     <title>收付款管理</title>
     #parse("sys/header.html")
 
-
-    <style> 
-
+    <style type="text/css">
+        #saomiao{
+            padding-right: 30px;
+        }
+        #saomiao input{
+            margin-top:20px;
+            height: 70px;
+            width: 100%;
+            border: 3px solid #62e2f5
+        }
+        .goods-button{
+            border: #e5a032;
+            background-color: #e5a032;
+            font-size: 1.3em;
+            margin-left: 20px;
+        }
     </style>
     <link rel="stylesheet" href="${rc.contextPath}/statics/plugins/jqgrid/ui.jqgrid-bootstrap.css">
+    <!--<link rel="stylesheet" href="${rc.contextPath}/statics/css/sale.css">-->
 </head>
 <body>
-
-
 <div id="rrapp" v-cloak>
-    <div v-show="showList">
-        <Row :gutter="16">
-            <ul class="nav navbar-top-links navbar-right">
-                <li >
-                    <span>&nbsp; 门店:深圳Xxxxxx店</span>
-                </li>
-                <li><span><i class="fa fa-user-circle" ></i> &nbsp;收银员:张三</span></li>
-                <li><a @click="logout"><i class="fa fa fa-sign-out"></i> 退出</a></li>
-            </ul>
-        </Row>
-    </div>
 
-    <div class="container-fluid">
+    <header class="main-header">
+        <div class="container-fluid">
+            <div class="row" style="border:0;margin-bottom:10px">
+                <div class="col-md-3 logodiv">
+                    <!--center-block-->
+                    <img src="${rc.contextPath}/statics/img/logotest2.jpg" class="img-rounded img-responsive" style="height: 70px;">
+                </div>
+                <div class="col-md-9" style="background-color: #f0f0f0;margin:0px;padding: 0px" >
+                    <div v-show="showList">
+                        <Row :gutter="16">
+                            <ul class="nav navbar-top-links navbar-right" style="font-size: 1.3em;">
+                                <li >
+                                    <span style="margin-right: 40px">&nbsp; 门店:<b>{{storeName}}</b></span>
+                                </li>
+                                <li><span style="margin-right: 35px"><i class="fa fa-user-circle" ></i> &nbsp;收银员:<b>{{sysUserInfo.username}}</b></span></li>
+                                <li><a @click="logout" style="font-size: 1em"><i class="fa fa fa-sign-out"></i> 退出</a></li>
+                            </ul>
+                        </Row>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </header>
+
+    <div class="container-fluid" style="margin-top: 15px">
         <div id="content" class="row-fluid">
             <div class="col-md-3">
                 <ul class="list-unstyled">
                     <li >
-                        <i-input v-model="prodBarcode" @on-enter="query" placeholder="输入或扫码商品条形码"/>
+                        <i-input v-model="prodBarcode" @on-enter="query" placeholder="输入或扫码商品条形码" id="saomiao"  />
                     </li>
-                    <li style="margin-top: 50px;">
-                        <div v-show="goodsDetail">
+                    <li style="margin-top: 50px;" >
+                        <div v-show="goodsDetail" style="font-size: 1.2em">
                             <img style="height: 400px;width: 400px;" :src="goods.primaryPicUrl" class="img-rounded"/>
                             <h3 style="margin: 8px;">{{goods.name}}</h3>
                             <p style="margin: 8px;">单价: {{goods.retailPrice}}</p>
@@ -44,25 +68,27 @@
                             <span style="margin: 8px;">商品描述: {{goods.goodsDesc}}</span>
                         </div>
                         <div v-show="!goodsDetail">
-                            请扫描商品
+                            <h3 style="text-align: center">请扫描商品</h3>
                         </div>
                     </li>
                 </ul>
-
             </div>
-            <div class="col-md-6">
+            <div class="col-md-6" style="padding: 0px;padding-bottom: 10%;background-color: #f0f0f0">
                 <ul class="list-unstyled">
-                    <li style="height: 500px;">
+                    <!--<li style="height: 500px;border:1px solid #F5DCB3">-->
+                    <li style="height: 600px">
                         <table id="cbec" class="table .table-striped">
-                            <tr style="border: white;background-color: orange">
-                                <th>跨境商品名称</th>
-                                <th>规格</th>
+                            <!--<tr style="border: white;background-color: orange">-->
+                            <!--#E5BB71 #F5DCB3 #FB554E #FFA498-->
+                            <tr style="border: white;background-color: #F5DCB3;font-size: 1.3em" >
+                                <th style="width: 371px">跨境商品名称</th>
+                                <th >规格</th>
                                 <th>单价</th>
                                 <!--<th>税费</th>-->
                                 <th>数量</th>
                                 <th>操作</th>
                             </tr>
-                            <tr v-for="(item,i) in goodsList" v-if="item.name">
+                            <tr v-for="(item,i) in goodsList" v-if="item.name" style="font-size: 1.3em">
                                 <td><h3>{{item.name}}</h3></td>
                                 <td> {{item.specification}}</td>
                                 <td> {{item.retailPrice}}</td>
@@ -76,24 +102,21 @@
                                 </td>
                             </tr>
                         </table>
-
                     </li>
-                    <li  style="height: 300px;">
+                    <!--<li  style="height: 300px;">
                         <table id="general" class="table .table-striped">
                             <tr style="border: white;background-color: orange">
                                 <th>一般贸易</th>
                                 <th>规格</th>
                                 <th>单价</th>
                                 <th>数量</th>
-                                <th>操作</th>
+                                <th>操作</th>getStoresByMerch
                             </tr>
-
                         </table>
-                    </li>
-
+                    </li>-->
                     <li  style="height: 100px;">
-                        <i-button type="warning" @click="clearGoodsList"><i class="fa fa-pencil-square-o"></i>&nbsp;清空商品列表</i-button>
-                        <i-button data-toggle="modal" data-target="#myModal" type="warning" ><i class="fa fa-pencil-square-o"></i>&nbsp;提交订单</i-button>
+                        <i-button type="warning" @click="clearGoodsList" class="goods-button"><i class="fa fa-pencil-square-o"></i>&nbsp;清空商品列表</i-button>
+                        <i-button data-toggle="modal" @click="toOrderSubmit" type="warning" class="goods-button" ><i class="fa fa-pencil-square-o"></i>&nbsp;提交订单</i-button>
 
                         <div class="modal fade" id="myModal"  role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
                             <div class="modal-dialog">
@@ -106,11 +129,11 @@
                                         <form>
                                             <div class="form-group">
                                                 <label for="customName" class="control-label">姓名:</label>
-                                                <input type="text" class="form-control" ref="customName" id="customName">
+                                                <input type="text" class="form-control"  ref="customName"  id="customName">
                                             </div>
                                             <div class="form-group">
                                                 <label for="customIDCard" class="control-label">身份证:</label>
-                                                <input type="text" class="form-control" ref="customIDCard" id="customIDCard" />
+                                                <input type="text" class="form-control"  ref="customIDCard"  id="customIDCard" />
                                             </div>
                                             <div class="form-group">
                                                 <label for="customPhone" class="control-label">手机号:</label>
@@ -120,6 +143,7 @@
                                     </div>
                                     <div class="modal-footer">
                                         <button type="button" class="btn btn-default" data-dismiss="modal">关闭</button>
+                                        <button type="button" class="btn btn-primary" @click="getIDCardInfo" id="IDCard">读取身份证信息</button>
                                         <button type="button" class="btn btn-primary" @click="submitCustomInfo" id="Send">去付款</button>
                                     </div>
                                 </div>
@@ -137,7 +161,6 @@
                                     <div class="modal-body">
                                         <form>
                                             <div class="form-group">
-<!--                                                <input type="text" class="form-control" ref="payCode" id="payCode" />-->
                                                 <i-input id="payCode"  @on-enter="submitOrder" ref="payCode" placeholder="请输入付款码"/>
                                             </div>
 
@@ -151,12 +174,16 @@
                         </div>
                     </li>
                 </ul>
+
+
             </div>
             <div class="col-md-3">
-                <h2 class="text-center">取票码</h2>
-                <div class="row" >
+                <h2 class="text-center" style="border: white;background-color: #F5DCB3;padding: 8px" >取货码</h2><br/>
+                <div class="row" style="border: white;background-color: #f0f0f0">
                     <div class="col-xs-4 col-sm-4" v-for="(item,i) in pickUpCodeList" style="margin-bottom: 8px;">
-                        <i-button data-toggle="modal" data-target="#orderDetail" type="warning" @click="queryOrderDetail(item.orderSn)" ><i class="fa fa-pencil-square-o"></i>&nbsp;{{item.pickUpCodeSn}}</i-button>
+                        <i-button data-toggle="modal" data-target="#orderDetail" style="width: 110px;font-family: 微软雅黑" @click="queryOrderDetail(item.orderSn)" v-if="item.pickUpCodeStatus == 0"  >&nbsp;{{item.pickUpCodeSn}}</i-button>
+                        <i-button data-toggle="modal" data-target="#orderDetail" style="background-color:#83e7b4;width: 110px;font-family: 微软雅黑" @click="queryOrderDetail(item.orderSn)" v-if="item.pickUpCodeStatus == 1" >{{item.pickUpCodeSn}}</i-button>
+                        <i-button data-toggle="modal" data-target="#orderDetail" style="background-color:#808080;width: 110px;font-family: 微软雅黑" @click="queryOrderDetail(item.orderSn)" v-if="item.pickUpCodeStatus == 2" >{{item.pickUpCodeSn}}</i-button>
                     </div>
                 </div>
             </div>
@@ -173,32 +200,44 @@
                                 <div class="row" style="border:0">
                                     <div class="col-md-3" id="orderNo">订单编号: {{orderEntity.orderSn}}</div>
                                     <div class="col-md-3" id="serialNumber">支付流水号: <span>{{orderProcessRecord.payTransactionId}}</span></div>
-                                    <div class="col-md-3" id="waybillNo">运单编号: </div>
-                                    <div class="col-md-3" id="inventoryNo">清单编号: </div>
+                                    <div class="col-md-3" id="waybillNo">运单编号: {{orderProcessRecord.logisticsNo}}</div>
+                                    <div class="col-md-3" id="inventoryNo">清单编号: {{orderProcessRecord.invtNo}}</div>
                                 </div>
                                 <div class="row" style="border:0">
-                                    <div class="col-md-3" id="orderDeclarationTime">订单申报时间: </div>
-                                    <div class="col-md-3" id="payDeclarationTime">支付单申报时间: </div>
-                                    <div class="col-md-3" id="waybillDeclarationTime">运单申报时间: </div>
-                                    <div class="col-md-3" id="inventoryDeclarationTime">清单放行时间: </div>
+                                    <div class="col-md-3" id="orderDeclarationTime">订单申报时间: {{orderProcessRecord.eleOrderStartTime}}</div>
+                                    <div class="col-md-3" id="payDeclarationTime">支付单申报时间: {{orderProcessRecord.paymentStartTime}}</div>
+                                    <div class="col-md-3" id="waybillDeclarationTime">运单申报时间: {{orderProcessRecord.waybillStartTime}}</div>
+                                    <div class="col-md-3" id="inventoryDeclarationTime">清单放行时间: {{orderProcessRecord.customsSuccTime}}</div>
                                 </div>
                             <div class="row" style="border:0">
-                                <div class="col-md-3" id="orderSubmitTime">订单提交时间: </div>
+                                <div class="col-md-3" id="orderSubmitTime">订单提交时间: {{orderProcessRecord.addOrderStartTime}}</div>
                                 <div class="col-md-3" id="payStatus">支付状态:
                                     <span v-if="orderEntity.payStatus == 0">未付款</span>
                                     <span v-if="orderEntity.payStatus == 1">付款中</span>
                                     <span v-if="orderEntity.payStatus == 2">已付款</span>
                                 </div>
-                                <div class="col-md-3" id="inventoryStatus">清关状态: </div>
+                                <div class="col-md-3" id="inventoryStatus">清关状态:
+                                    <span v-if="orderProcessRecord.isCustomsSend == 0">失败</span>
+                                    <span v-if="orderProcessRecord.isCustomsSend == 1">成功</span>
+                                    <span v-if="orderProcessRecord.isCustomsSend == 2">清关中</span>
+                                </div>
                             </div>
                             <div class="row" style="border:0">
-                                <div class="col-md-3" id="orderDeclareStatus">订单申报状态: </div>
-                                <div class="col-md-3" id="payOrderDeclareStatus">支付单申报状态: </div>
+                                <div class="col-md-3" id="orderDeclareStatus">订单申报状态:
+                                    <span v-if="orderProcessRecord.isEleOrderSend == 0">失败</span>
+                                    <span v-if="orderProcessRecord.isEleOrderSend == 1">成功</span>
+                                    <span v-if="orderProcessRecord.isEleOrderSend == 2">申报中</span>
+                                </div>
+                                <div class="col-md-3" id="payOrderDeclareStatus">支付单申报状态:
+                                    <span v-if="orderProcessRecord.isPaymentSend == 0">失败</span>
+                                    <span v-if="orderProcessRecord.isPaymentSend == 1">成功</span>
+                                    <span v-if="orderProcessRecord.isPaymentSend == 2">申报中</span>
+                                </div>
                             </div>
                             <div class="row" style="border:0">
                                 <div class="col-md-3" id="orderTotal">订单总额: {{orderEntity.actualPrice}}</div>
-                                <div class="col-md-3" id="orderTaxes">订单税费: </div>
-                                <div class="col-md-3" id="invetoryReceipt">清关回执: </div>
+                                <div class="col-md-3" id="orderTaxes">订单税费: {{tax}}</div>
+                                <div class="col-md-3" id="invetoryReceipt">清关回执: <!--{{orderProcessRecord.eleOrderStartTime}}--></div>
                             </div>
                             <table id="goodsDetailTable" class="table .table-striped" style="margin-top: 50px;">
                                 <tr style="border: white;background-color: orange">
@@ -222,18 +261,14 @@
                         <div class="modal-footer">
                             <button type="button" class="btn btn-primary" @click="verification" id="verification" data-dismiss="modal">核销</button>
                             <button type="button" class="btn btn-primary" @click="refundOrder" id="refundOrder" data-dismiss="modal">退款</button>
-                            <button type="button" class="btn btn-primary" @click="retrySendOrder" id="retrySendOrder" data-dismiss="modal">订单重推</button>
+                            <!--<button type="button" class="btn btn-primary" @click="retrySendOrder" id="retrySendOrder" data-dismiss="modal">订单重推</button>-->
                         </div>
                     </div>
                 </div><!-- /.modal -->
             </div>
         </div>
     </div>
-
-
-
 </div>
-
 <script src="${rc.contextPath}/js/sale/sale.js?_${date.systemTime}"></script>
 <script src="https://cdn.staticfile.org/jquery/2.1.1/jquery.min.js"></script>
 <script src="${rc.contextPath}/statics/libs/bootstrap.min.js"></script>

+ 1 - 1
kmall-admin/src/main/webapp/WEB-INF/web.xml

@@ -27,7 +27,7 @@
     <context-param>
         <param-name>contextConfigLocation</param-name>
         <param-value>
-            classpath:spring/spring-main.xml
+            classpath:spring/spring-context.xml
         </param-value>
     </context-param>
 

+ 276 - 32
kmall-admin/src/main/webapp/js/sale/sale.js

@@ -1,9 +1,12 @@
 $(function () {
 
     openWebSocket();
+    queryAssistantInfo();
 });
 
-
+window.onbeforeunload = function(){
+    closeWebSocket();
+}
 
 let vm = new Vue({
     el: '#rrapp',
@@ -16,13 +19,19 @@ let vm = new Vue({
         goodsList:[],
         orderInfo:[],
         userInfo:{},
+        sysUserInfo:{},
+        storeName:null,
         prodBarcode:null,
         sessionId:null,
         pickUpCodeList:[],
         goodsDetailList:[],
         orderEntity:{},
         orderProcessRecord:{},
+        tax:0,
         currentOrderNo:null,
+        customname:'',
+        customidcard:'',
+        storeId:null,
         index:0,
         max:0,
         ruleValidate: {
@@ -37,8 +46,13 @@ let vm = new Vue({
     methods: {
         query: function () {
 
+            vm.storeId = sessionStorage.getItem("storeId");;
+
             var thisGoods = {};
-            $.get("../goods/details/"+vm.prodBarcode, function (r) {
+            $.get("../goods/details/"+vm.prodBarcode+"/"+vm.storeId, function (r) {
+                console.log(typeof r);
+                console.log(r.code == 0);
+                console.log(r.code);
                 if (r.code == 0) {
 
                     vm.goodsDetail = true;
@@ -47,7 +61,7 @@ let vm = new Vue({
                     thisGoods.retailPrice = r.goodsDetails.retailPrice;
                     thisGoods.specification = r.goodsDetails.specification;
                     thisGoods.prodBarcode = r.goodsDetails.prodBarcode;
-                    thisGoods.goodsDesc = r.goodsDetails.goodsDesc;
+                   //  thisGoods.goodsDesc = r.goodsDetails.goodsDesc;
                     thisGoods.sellVolume = 1;
 
                     if(!vm.goodsList[vm.index]){
@@ -89,14 +103,20 @@ let vm = new Vue({
         },
         clearGoodsList:function(){
             this.goodsList = [];
+
+
+        },
+        toOrderSubmit:function(){
+
+            if(this.goodsList.length == 0){
+                alert("请选择商品");
+                return;
+            }
+            $('#myModal').modal('show')
         },
         submitOrder:function(){
             $('#payCode').unbind('keydown').keydown(function(event){});
-            $(".form-group input[type=text]").each(function(){
-                this.value = '';
-            })
-            var saler = "张三";
-            var saleNo = "001";
+
 
             var param = {'userInfo':vm.userInfo,'payCode':this.$refs.payCode.currentValue,'goodsList':vm.goodsList,'sessionId':vm.sessionId};
             this.$refs.payCode.currentValue = '';
@@ -106,13 +126,18 @@ let vm = new Vue({
                 contentType: "application/json",
                 data: JSON.stringify(param),
                 success: function (r) {
+                    console.log(r);
                     if (r.code == 0) {
                         if (r.resultObj != null) {
-
+                            $(".form-group input[type=text]").each(function(){
+                                this.value = '';
+                            })
                             // 打印取货码小票
                             var content = getPrintContent(r.resultObj);
                             printArea(content);
                             vm.goodsList = [];
+                            vm.customname = '' ;
+                            vm.customidcard = '';
                             // alert('打印小票完成');
                         }else{
                             // alert("打印小票失败");
@@ -124,10 +149,31 @@ let vm = new Vue({
             });
 
         },
+        getIDCardInfo: function(){
+            console.log(1);
+            $.get("../order/getIdCardInfo", function (r){
+                if(r.code === 0){
+                    var data = JSON.parse(r.info);
+                    vm.$refs.customName.value = data.rows[0].data.name;
+                    vm.$refs.customIDCard.value = data.rows[0].data.id_no;
+                }
+            });
+
+        },
         submitCustomInfo:function(){
-            this.userInfo.customName = this.$refs.customName.value;
-            this.userInfo.customIDCard = this.$refs.customIDCard.value;
+            this.userInfo.customName = this.$refs.customName.value ;
+            this.userInfo.customIDCard =  this.$refs.customIDCard.value ;
             this.userInfo.customPhone = this.$refs.customPhone.value;
+            var idcardReg = /^[1-9]\d{7}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}$|^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}([0-9]|X)$/;
+            if(!idcardReg.test(this.userInfo.customIDCard)){
+                // alert("请输入正确的身份证号");
+                // return ;
+            }
+
+            if(!(/^1[3456789]\d{9}$/.test(this.userInfo.customPhone))){
+                // alert("手机号码有误,请重填");
+                // return ;
+            }
 
 
 
@@ -150,27 +196,52 @@ let vm = new Vue({
 
         },
         queryOrderDetail:function(orderSn){
+            var storeId = sessionStorage.getItem("storeId");;
             $.get("../order/orderDetail/"+orderSn, function (r) {
                 if (r.code == 0) {
                     vm.orderProcessRecord = r.resultObj.orderProcessRecordEntity;
                     vm.orderEntity = r.resultObj.orderEntity;
                     vm.goodsDetailList = r.resultObj.goodsList;
                     vm.currentOrderNo = r.resultObj.orderEntity.id;
+                    vm.tax = r.resultObj.tax;
+
+                    if(vm.orderProcessRecord.eleOrderStartTime){
+                        vm.orderProcessRecord.eleOrderStartTime = parsedate(vm.orderProcessRecord.eleOrderStartTime);
+                    }
+                    if(vm.orderProcessRecord.paymentStartTime){
+                      vm.orderProcessRecord.paymentStartTime = parsedate(vm.orderProcessRecord.paymentStartTime);
+                    }
+                    if(vm.orderProcessRecord.waybillStartTime){
+                        vm.orderProcessRecord.waybillStartTime = parsedate(vm.orderProcessRecord.waybillStartTime);
+                    }
+                    if(vm.orderProcessRecord.customsSuccTime){
+                        vm.orderProcessRecord.customsSuccTime = parsedate(vm.orderProcessRecord.customsSuccTime);
+                    }
+                    if(vm.orderProcessRecord.addOrderStartTime){
+                        vm.orderProcessRecord.addOrderStartTime = parsedate(vm.orderProcessRecord.addOrderStartTime);
+                    }
+
+
                 }
             });
         },
         verification:function(){
 
+            if(vm.orderProcessRecord.isCustomsSend != 1){
+                alert("请等待清关完成");
+                return ;
+            }
+
             confirm('确认核销吗?', function () {
                 $.ajax({
                     type: "POST",
-                    url: "../order/printMsg",
+                    url: "../order/printMsgAndChangeCode",
                     contentType: "application/json",
-                    data: JSON.stringify(vm.currentOrderNo),
+                    data: JSON.stringify({'id':vm.currentOrderNo,'sessionId':vm.sessionId}),
                     success: function (r) {
                         if (r.ticket != null) {
                             // printArea(r.ticket);
-                            var content = getPrintContent(r.ticket);
+                            var content = getPrintContentOrder(r.ticket);
                             printArea(content);
                             alert('打印小票完成');
                         }else{
@@ -181,10 +252,24 @@ let vm = new Vue({
             })
         },
         refundOrder:function(){
-            console.log("退款的订单号:"+vm.currentOrderNo);
+            confirm('确认退款吗?', function () {
+                $.ajax({
+                    type: "POST",
+                    url: "../order/orderRefund",
+                    contentType: "application/json",
+                    data: JSON.stringify({'orderId':9000,'sessionId':vm.sessionId}),
+                    success: function (r) {
+                        if (r.code == 0) {
+                            alert("退款成功")
+                        }else{
+                            alert("退款失败,请联系管理员");
+                        }
+                    }
+                });
+            })
+
         },
         retrySendOrder:function(){
-            console.log("重推的订单号:"+vm.currentOrderNo);
         },
         getInfo: function (id) {
             $.get("../sys/notice/info/" + id, function (r) {
@@ -228,31 +313,30 @@ let vm = new Vue({
 });
 
 function getPrintContent(ticket) {
-    var content = "<div style=\"width: 250px;font-family: 微软雅黑;font-size: 8px;\">";
+    var content = "<div style=\"width: 250px;font-family: 微软雅黑;font-size: 15px;\">";
     //小票头
-    content += "<div style=\"text-align: center;width: 100%;font-weight:bold;font-size: 13px;\">";
+    content += "<div style=\"text-align: center;width: 100%;font-weight:bold;font-size: 15px;\">";
     content += ticket.shopName
     content += "</div>";
     content += "<div style=\"width: 100%;overflow:hidden;white-space: nowrap;\">--------------------------------------------------</div>";
-    content += "<div style=\"width: 100%;\">";
-    content += "收银机号:" + ticket.salesNo;
+    content += "<div style=\"width: 100%;margin:5px 0px;\">";
+    /*content += "收银机号:" + ticket.salesNo;
     content += "</div>";
-    content += "<div style=\"width: 100%;\">";
+    content += "<div style=\"width: 100%;\">";*/
     content += "收银员:" + ticket.userName;
     content += "</div>";
-    content += "<div style=\"width: 100%;\">";
+    content += "<div style=\"width: 100%;font-size: 30px;margin:15px 0 10px 5px;\">";
     content += "取货码:" + ticket.code;
     content += "</div>";
-
-    content += "<div style=\"width: 100%;\">";
-    content += "该取货单号只有当天有效"
-    content += "</div>";
-    content += "<div style=\"width: 100%;\">";
+    content += "<div style=\"width: 100%;margin:5px 0px;\">";
     content += "订单编号:" + ticket.orderNo;
     content += "</div>";
-    content += "<div style=\"width: 100%;\">";
+    content += "<div style=\"width: 100%;margin:5px 0px;\">";
     content += "打印日期:" + ticket.time;
     content += "</div>";
+    content += "<div style=\"width: 100%;margin:5px 0px;font-size: 13px;\">";
+    content += "该取货单号只有当天有效"
+    content += "</div>";
 
     return content;
 }
@@ -264,7 +348,7 @@ function printArea(content) {
     removePrintArea(idPrefix + printAreaCount);
     printAreaCount++;
     var iframeId = idPrefix + printAreaCount;
-    var iframeStyle = 'position:absolute;width:0px;height:0px;left:-500px;top:-500px;';
+    var iframeStyle = 'width:0px;height:0px;left:0px;top:0px;';
     iframe = document.createElement('IFRAME');
     $(iframe).attr({
         style: iframeStyle,
@@ -283,10 +367,11 @@ function printArea(content) {
     doc.write('<div class="">' + content
         + '</div>');
     doc.close();
+    console.log(doc);
     var frameWindow = iframe.contentWindow;
     frameWindow.close();
     frameWindow.focus();
-    frameWindow.print();
+    // frameWindow.print();
     frameWindow.print();
 }
 var removePrintArea = function (id) {
@@ -297,6 +382,7 @@ var removePrintArea = function (id) {
 var webSocket;
 
 function openWebSocket() {
+    var storeId = sessionStorage.getItem("storeId");
     if ("WebSocket" in window) {
         console.log("当前浏览器支持WebSocket");
 
@@ -305,7 +391,8 @@ function openWebSocket() {
         //注意ws、wss使用不同的端口。我使用自签名的证书测试,
         //无法使用wss,浏览器打开WebSocket时报错
         //ws对应http、wss对应https。
-        webSocket = new WebSocket("ws://localhost:8080/ws/server/{10}");
+        // webSocket = new WebSocket("ws://183.62.225.124:8080/ws/server/"+storeId);
+        webSocket = new WebSocket("ws://127.0.0.1:8080/ws/server/"+storeId);
         if (webSocket.readyState === webSocket.CONNECTING) {
             console.log('1.连接正在打开......');
         }
@@ -326,7 +413,16 @@ function openWebSocket() {
             var data = Object.assign({}, JSON.parse(msg.data));
             vm.sessionId = data.sessionId;
             vm.pickUpCodeList = [];
-            vm.pickUpCodeList = vm.pickUpCodeList.concat(data.pickUpCodeList);
+            if(data.pickUpCodeList.length > 0){
+                for(var i = 0 ; i < data.pickUpCodeList.length ; i++){
+                    console.log(data.pickUpCodeList[i].storeId);
+                    if(data.pickUpCodeList[i].storeId === storeId){
+                        vm.pickUpCodeList.push(data.pickUpCodeList[i]);
+                    }
+                }
+            }
+            // vm.pickUpCodeList = vm.pickUpCodeList.concat(data.pickUpCodeList);
+            // console.log(vm.pickUpCodeList);
             // webSocket.send("2.client发测试消息:Client sent test msg。");
         };
         //连接关闭事件
@@ -365,3 +461,151 @@ function closeWebSocket() {
 window.unload = function () {
     webSocket.close();
 };
+
+
+function parsedate(value){
+    var date = new Date(value);
+    var year = date.getFullYear();
+    var month = date.getMonth()+1; //月份+1
+    var day = date.getDate();
+    var hour = date.getHours();
+    var minutes = date.getMinutes();
+    var second = date.getSeconds();
+    return  year+"-"+month+"-"+day+" "+hour+":"+minutes +":"+second;
+}
+
+function getPrintContentOrder(ticket) {
+    var content = "<div style=\"width: 250px;font-family: 微软雅黑;font-size: 8px;\">";
+    //小票头
+    content += "<div style=\"text-align: center;width: 100%;font-weight:bold;font-size: 13px;\">";
+    content += ticket.ticketHead.title;
+    content += "</div>";
+    /*content += "<div style=\"width: 100%;\">";
+    content += "会员:" + ticket.ticketHead.memberId;
+    content += "</div>";*/
+    content += "<div style=\"width: 100%;\">";
+    content += "订单号:" + ticket.ticketHead.orderId;
+    content += "</div>";
+    content += "<div style=\"width: 100%;\">";
+    content += "交易时间:" + ticket.ticketHead.tradeTime;
+    content += "</div>";
+    content += "<div style=\"width: 100%;overflow:hidden;white-space: nowrap;\">--------------------------------------------------</div>";
+    //商品信息
+    content += "<table style=\"width: 100%;\" border=\"0\" cellspacing=\"0\" cellpadding=\"0\">";
+    content += "<tr>";
+    content += "<td style=\"width: 50%;text-align: left;font-size: 10px;font-weight: bold;\">商品名称</td>";
+    content += "<td style=\"width: 17%;text-align: right;font-size: 10px;font-weight: bold;\">单价</td>";
+    content += "<td style=\"width: 15%;text-align: right;font-size: 10px;font-weight: bold;\">数量</td>";
+    content += "<td style=\"width: 18%;text-align: right;font-size: 10px;font-weight: bold;\">小计</td>";
+    content += "</tr>";
+    content += "</table>";
+    content += "<div style=\"width: 100%;overflow:hidden;white-space: nowrap;\">--------------------------------------------------</div>";
+    content += "<table style=\"width: 100%;\" border=\"0\" cellspacing=\"0\" cellpadding=\"0\">";
+    for (var i=0;i< ticket.goods.length;i++){
+        content += "<tr>";
+        content += "<td style=\"width: 50%;text-align: left;font-size: 8px;padding-top: 8px;\">";
+        content += "<table style=\"width: 100%;\" border=\"0\" cellspacing=\"0\" cellpadding=\"0\">";
+        content += "<tr>";
+        content += "<td style=\"text-align: left;font-size: 8px;vertical-align:top;\">#</td>";
+        content += "<td style=\"text-align: left;font-size: 8px;\">" + ticket.goods[i].gname + "</td>";
+        content += "</tr>";
+        content += "</table>";
+        content += "</td>";
+        content += "<td style=\"width: 17%;text-align: right;font-size: 8px;vertical-align:bottom;padding-top: 8px;\">" + ticket.goods[i].uprice + "</td>";
+        content += "<td style=\"width: 15%;text-align: right;font-size: 8px;vertical-align:bottom;padding-top: 8px;\">" + ticket.goods[i].num + "</td>";
+        content += "<td style=\"width: 18%;text-align: right;font-size: 8px;vertical-align:bottom;padding-top: 8px;\">" + ticket.goods[i].subtotal + "元</td>";
+        content += "</tr>";
+
+    }
+    content += "</table>";
+    content += "<div style=\"width: 100%;overflow:hidden;white-space: nowrap;\">--------------------------------------------------</div>";
+    //收银信息
+    content += "<div style=\"width: 100%;\">";
+    content += "<span style=\"float: left;width: 50%;text-align: left;\">商品合计:</span>";
+    content += "<span style=\"float: left;width: 17%;text-align: left;\">" + ticket.cashInfo.goodsTotal + "件</span>";
+    content += "<span style=\"float: right;width: 33%;text-align: right;\">" + ticket.cashInfo.total + "元</span>";
+    content += "</div>";
+    content += "<div style=\"width: 100%;\">";
+    content += "<span style=\"float: left;width: 50%;text-align: left;\">实收:</span>";
+    content += "<span style=\"float: right;width: 50%;text-align: right;\">" + ticket.cashInfo.receipts + "元</span>";
+    content += "</div>";
+    content += "<div style=\"width: 100%;\">";
+    content += "<span style=\"float: left;width: 50%;text-align: left;\">找零:</span>";
+    content += "<span style=\"float: right;width: 50%;text-align: right;\">" + ticket.cashInfo.oddChange + "元</span>";
+    content += "</div>";
+    content += "<div style=\"width: 100%;\">";
+    content += "<span style=\"float: left;width: 50%;text-align: left;\">优惠券:</span>";
+    content += "<span style=\"float: right;width: 50%;text-align: right;\">" + ticket.cashInfo.coupon + "元</span>";
+    content += "</div>";
+    content += "<div style=\"width: 100%;\">";
+    content += "<span style=\"float: left;width: 50%;text-align: left;\">运费:</span>";
+    content += "<span style=\"float: right;width: 50%;text-align: right;\">" + ticket.cashInfo.freight + "元</span>";
+    content += "</div>";
+    content += "<div style=\"width: 100%;\">";
+    content += "<span style=\"float: left;width: 50%;text-align: left;\">支付渠道:</span>";
+    content += "<span style=\"float: right;width: 50%;text-align: right;\">" + ticket.cashInfo.paymentMode + "</span>";
+    content += "</div>";
+    content += "<div style=\"width: 100%;overflow:hidden;white-space: nowrap;\">--------------------------------------------------</div>";
+    //海关清单信息
+    content += "<div style=\"width: 100%;\">";
+    content += "订单号:" + ticket.cusListing.orderId;
+    content += "</div>";
+    content += "<div style=\"width: 100%;\">";
+    content += "运单编号:" + ticket.cusListing.waybillId;
+    content += "</div>";
+    content += "<div style=\"width: 100%;\">";
+    content += "海关清单号:" + ticket.cusListing.invtNo;
+    content += "</div>";
+    content += "<div style=\"width: 100%;\">";
+    content += "收货人:" + ticket.cusListing.consignee;
+    content += "</div>";
+    content += "<div style=\"width: 100%;\">";
+    content += "收货人电话:" + ticket.cusListing.consigneeTel;
+    content += "</div>";
+    content += "<div style=\"width: 100%;\">";
+    content += "始发地:" + ticket.cusListing.originAddress;
+    content += "</div>";
+    content += "<div style=\"width: 100%;\">";
+    content += "交货地:" + ticket.cusListing.deliveryAddress;
+    content += "</div>";
+    content += "<div style=\"width: 100%;overflow:hidden;white-space: nowrap;\">--------------------------------------------------</div>";
+    content += "<div style=\"width: 100%;\">";
+    content += ticket.ticketFoot.summary;
+    content += "</div>";
+    content += "<div style=\"width: 100%;\">";
+    content += "客服电话:" + ticket.ticketFoot.serviceTel;
+    content += "</div>";
+    content += "<div style=\"width: 100%;\">";
+    content += "网址:" + ticket.ticketFoot.url1;
+    content += "</div>";
+    content += "<div style=\"width: 100%;\">";
+    content += ticket.ticketFoot.welcome;
+    content += "</div>";
+    return content;
+}
+
+
+function queryAssistantInfo(){
+    $.get("../sys/user/info", function (r) {
+
+        if(r.code == 0){
+            vm.sysUserInfo = r.user;
+
+            $.get("../store/getStoresByMerch?merchSn="+r.user.merchSn+"&_=1590374349985",function(result){
+                if(result.code == 0){
+                    for(var i = 0 ;i < result.list.length; i++){
+                        if(result.list[i].id == r.user.storeId){
+                            vm.storeName = result.list[i].storeName;
+                            break;
+                        }
+                    }
+                }
+            });
+
+        }
+    });
+
+
+}
+
+

+ 31 - 17
kmall-admin/src/main/webapp/login.html

@@ -21,7 +21,12 @@
 </head>
 <body class="signin hold-transition login-page">
 <div class="loginscreen animated fadeInDown signinpanel" id="loginBox" v-cloak>
-    <div class="row">
+    <!--<div class="row" style="background: rgba(109, 109, 109, 0.23);border: 0px solid #dddee1;padding:72px 2px">-->
+    <div class="row" style="background: rgba(109, 109, 109, 0.45);border-radius: 20px;border: 0px solid #6d6d6d;padding:13px 22px 35px 22px;">
+        <div class="row" style="border: 0px solid #6d6d6d">
+            <p style="font-size: 45px;font-family: 微软雅黑;color: #ffffff;text-shadow: 5px 5px 5px #000;margin-bottom: 10px" align="center"><b>跨 境 电 商 &nbsp;&nbsp;新零售</b></p>
+            <hr/>
+        </div>
         <!--<div class="col-md-7">
             <div class="signin-info">
                 <div class="logopanel m-b">
@@ -46,37 +51,46 @@
                 </ul>
             </div>
         </div>-->
-        <div class="col-md-5" style="margin-left: 450px;">
-            <Card class="m-t text-center" style="background: rgba(109, 109, 109, 0.23);border: 0px solid #dddee1;">
-                <p style="padding: 0 20px 20px 20px;">登录管理平台</p>
+        <div class="col-md-7" >
+            <p style="font-size: 35px;font-family: 微软雅黑;color: #3bc8ff;text-shadow: 2px 2px 5px #000;padding-right: 10px;margin: 45px 0 0;" align="center">
+                <span >现场速递</span>
+                <br/>
+                <span style="font-size: 45px">收 银 系 统</span>
+                <br/>
+                <span style="font-size: 23px">0755-8818999</span>
+            </p>
+            <!--<p style="font-size: 20px;font-family: 微软雅黑;color: #3bc8ff;text-shadow: 2px 2px 5px #000;padding-right: 10px;margin: 30px 0 0;"></p>-->
+        </div>
+        <div class="col-md-5">
+            <div class="m-t text-center" style="border: 0px solid #dddee1;">
                 <div class="form-group has-feedback">
-                    <i-input v-model="username" @on-enter="login" placeholder="账号" style="width: 200px;" autofocus/>
+                    <i-input class="userinput" v-model="username" @on-enter="login" placeholder="账号" style="width: 250px;" autofocus/>
                 </div>
                 <div class="form-group has-feedback">
-                    <i-input type="password" v-model="password" @on-enter="login" style="width: 200px;"
+                    <i-input class="userinput"  type="password" v-model="password" @on-enter="login" style="width: 250px;"
                              placeholder="密码"/>
                 </div>
-                <div class="form-group has-feedback">
-                    <div style="display: inline-block;width: 100px;">
+                <div class="form-group has-feedback" id="authcode">
+                    <div style="display: inline-block;width: 150px;height:45px;padding-left: 2px">
                         <i-input v-model="captcha" @on-enter="login"
-                                 placeholder="验证码"/>
+                                 placeholder="验证码" class="authcode" />
                     </div>
                     <div style="display: inline-block;width: 100px;">
-                        <img style="height: 32px;width: 96px;border-radius: 4px;" alt="如果看不清楚,请单击图片刷新!" title="点击刷新"
+                        <img style="height: 45px;width: 96px;border-radius: 4px;" alt="如果看不清楚,请单击图片刷新!" title="点击刷新"
                              class="pointer" :src="src" @click="refreshCode">
                     </div>
                 </div>
                 <div>
-                    <i-button type="primary" @click="login" style="width: 200px;">登录</i-button>
+                    <i-button type="primary" @click="login" style="width: 250px;height: 45px">登录</i-button>
                 </div>
-            </Card>
-        </div>
-    </div>
-    <div class="signup-footer">
-        <div class="pull-left" style="margin-left: 520px;">
-            2018~2018 &copy; <a href="#" target="_blank">中网科技(深圳)有限公司</a>
+            </div>
         </div>
     </div>
+    <!--<div class="signup-footer">-->
+        <!--<div class="pull-left" style="margin-left: 520px;">-->
+            <!--2018~2020 &copy; <a href="#" target="_blank">中网科技(深圳)有限公司</a>-->
+        <!--</div>-->
+    <!--</div>-->
 </div>
 <!-- /.login-box -->
 <script src="statics/libs/jquery.min.js"></script>

+ 12 - 1
kmall-admin/src/main/webapp/statics/css/login.css

@@ -2,7 +2,7 @@ html{height: 100%;}
 body.signin {
     background: #18c8f6;
     height: auto;
-    background:url("../img/login.jpeg") no-repeat center fixed;
+    background:url("../img/login1.jpg") no-repeat center fixed;
     -webkit-background-size: cover;
     -moz-background-size: cover;
     -o-background-size: cover;
@@ -90,3 +90,14 @@ body.signin {
         width:auto;
     }
 }
+/*hhq*/
+.userinput input{
+    width: 250px;
+    height: 45px;
+}
+#authcode{
+    margin-bottom: 20px;
+}
+.authcode input{
+    height: 45px;
+}

+ 19 - 0
kmall-admin/src/main/webapp/statics/css/sale.css

@@ -0,0 +1,19 @@
+#saomiao input{
+    margin-top:50px;
+    height: 70px;
+    /*padding:70px*/
+    /*width: 350px;*/
+    width: 100%;
+    border: 3px solid #4d42f5;
+    background: #444444;
+}
+.logodiv{
+    height: 50px;
+    width: 150px;
+    background: #18c8f6;
+    background:url("../img/logotest.jpg") no-repeat center fixed;
+    -webkit-background-size: cover;
+    -moz-background-size: cover;
+    -o-background-size: cover;
+    background-size: cover
+}

BIN
kmall-admin/src/main/webapp/statics/img/login1.jpg


BIN
kmall-admin/src/main/webapp/statics/img/logotest2.jpg


+ 57 - 0
kmall-api/pom.xml

@@ -0,0 +1,57 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>kmall-pt-general</artifactId>
+        <groupId>com.kmall</groupId>
+        <version>3.1.0</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>kmall-api</artifactId>
+    <packaging>jar</packaging>
+    <description>API接口模块</description>
+
+
+    <dependencies>
+        <dependency>
+            <groupId>com.kmall</groupId>
+            <artifactId>kmall-common</artifactId>
+            <version>${kmall-version}</version>
+        </dependency>
+        <dependency>
+            <groupId>com.kmall</groupId>
+            <artifactId>kmall-manager</artifactId>
+            <version>${kmall-version}</version>
+        </dependency>
+
+        <!--swagger 依赖-->
+        <dependency>
+            <groupId>io.springfox</groupId>
+            <artifactId>springfox-swagger2</artifactId>
+            <version>2.4.0</version>
+        </dependency>
+
+        <dependency>
+            <groupId>io.springfox</groupId>
+            <artifactId>springfox-swagger-ui</artifactId>
+            <version>2.4.0</version>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-surefire-plugin</artifactId>
+                <version>2.18.1</version>
+                <configuration>
+                    <skipTests>true</skipTests>
+                    <argLine>-Dfile.encoding=UTF-8</argLine>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>

+ 10 - 0
kmall-api/src/main/java/com/kmall/api/entity/OrderVo.java

@@ -155,6 +155,8 @@ public class OrderVo implements Serializable {
     private String payMobile;
 
 
+    private String aliTradeNo;
+
     private String merchSn;
 
     private String sku;
@@ -994,4 +996,12 @@ public class OrderVo implements Serializable {
     public void setComment_count(Integer comment_count) {
         this.comment_count = comment_count;
     }
+
+    public String getAliTradeNo() {
+        return aliTradeNo;
+    }
+
+    public void setAliTradeNo(String aliTradeNo) {
+        this.aliTradeNo = aliTradeNo;
+    }
 }

+ 201 - 0
kmall-common/pom.xml

@@ -0,0 +1,201 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>kmall-pt-general</artifactId>
+        <groupId>com.kmall</groupId>
+        <version>3.1.0</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>kmall-common</artifactId>
+    <packaging>jar</packaging>
+    <description>公共模块</description>
+
+
+    <properties>
+        <qiniu-version>[7.2.0, 7.2.99]</qiniu-version>
+        <aliyun-oss-version>2.5.0</aliyun-oss-version>
+        <qcloud-cos-version>4.4</qcloud-cos-version>
+        <okhttp.version>3.4.1</okhttp.version>
+        <jackson.version>2.5.1</jackson.version>
+        <jackson.core.version>2.7.3</jackson.core.version>
+        <poi.version>3.15</poi.version>
+        <poi.ooxml.version>3.15</poi.ooxml.version>
+        <xmlbeans.version>2.6.0</xmlbeans.version>
+        <guava.version>17.0</guava.version>
+        <bouncycastle.version>1.45</bouncycastle.version>
+        <javax-servlet.version>4.0.1</javax-servlet.version>
+    </properties>
+
+    <dependencies>
+
+        <dependency>
+            <groupId>com.qiniu</groupId>
+            <artifactId>qiniu-java-sdk</artifactId>
+            <version>${qiniu-version}</version>
+        </dependency>
+        <dependency>
+            <groupId>com.aliyun.oss</groupId>
+            <artifactId>aliyun-sdk-oss</artifactId>
+            <version>${aliyun-oss-version}</version>
+        </dependency>
+        <dependency>
+            <groupId>com.qcloud</groupId>
+            <artifactId>cos_api</artifactId>
+            <version>${qcloud-cos-version}</version>
+        </dependency>
+
+        <!-- httpclient -->
+        <dependency>
+            <groupId>commons-httpclient</groupId>
+            <artifactId>commons-httpclient</artifactId>
+            <version>3.1</version>
+        </dependency>
+
+        <!-- HTTP工具 -->
+        <dependency>
+            <groupId>com.squareup.okhttp3</groupId>
+            <artifactId>okhttp</artifactId>
+            <version>${okhttp.version}</version>
+        </dependency>
+
+        <!-- json -->
+        <dependency>
+            <groupId>com.fasterxml.jackson.core</groupId>
+            <artifactId>jackson-annotations</artifactId>
+            <version>${jackson.version}</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.fasterxml.jackson.core</groupId>
+            <artifactId>jackson-core</artifactId>
+            <version>${jackson.core.version}</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.fasterxml.jackson.core</groupId>
+            <artifactId>jackson-databind</artifactId>
+            <version>${jackson.version}</version>
+        </dependency>
+        <!--<dependency>-->
+            <!--<groupId>com.fasterxml.jackson.dataformat</groupId>-->
+            <!--<artifactId>jackson-dataformat-xml</artifactId>-->
+            <!--<version>2.8.10</version>-->
+        <!--</dependency>-->
+
+        <dependency>
+            <groupId>dom4j</groupId>
+            <artifactId>dom4j</artifactId>
+            <version>1.6.1</version>
+        </dependency>
+
+        <dependency>
+            <groupId>jstl</groupId>
+            <artifactId>jstl</artifactId>
+            <version>1.2</version>
+        </dependency>
+        <dependency>
+            <groupId>org.quartz-scheduler</groupId>
+            <artifactId>quartz</artifactId>
+            <version>2.2.3</version>
+            <exclusions>
+                <exclusion>
+                    <artifactId>c3p0</artifactId>
+                    <groupId>c3p0</groupId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+
+        <!-- POI依赖 ,处理EXCEL WORD  PDF�?-->
+        <dependency>
+            <groupId>org.apache.poi</groupId>
+            <artifactId>poi</artifactId>
+            <version>${poi.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.poi</groupId>
+            <artifactId>poi-ooxml</artifactId>
+            <version>${poi.ooxml.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.poi</groupId>
+            <artifactId>poi-ooxml-schemas</artifactId>
+            <version>${poi.version}</version>
+            <exclusions>
+                <exclusion>
+                    <artifactId>stax-api</artifactId>
+                    <groupId>stax</groupId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+
+        <!-- redis clients -->
+        <dependency>
+            <groupId>redis.clients</groupId>
+            <artifactId>jedis</artifactId>
+            <version>2.8.2</version>
+        </dependency>
+
+        <!-- google java lib -->
+        <dependency>
+            <groupId>com.google.guava</groupId>
+            <artifactId>guava</artifactId>
+            <version>${guava.version}</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.commons</groupId>
+            <artifactId>commons-lang3</artifactId>
+            <version>3.3.2</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.jxls</groupId>
+            <artifactId>jxls</artifactId>
+            <version>2.4.7</version>
+        </dependency>
+        <dependency>
+            <groupId>org.jxls</groupId>
+            <artifactId>jxls-poi</artifactId>
+            <version>1.0.16</version>
+        </dependency>
+
+        <!-- https://mvnrepository.com/artifact/org.jxls/jxls-jexcel -->
+        <dependency>
+            <groupId>org.jxls</groupId>
+            <artifactId>jxls-jexcel</artifactId>
+            <version>1.0.7</version>
+        </dependency>
+        <!-- https://mvnrepository.com/artifact/org.jxls/jxls-reader -->
+        <dependency>
+            <groupId>org.jxls</groupId>
+            <artifactId>jxls-reader</artifactId>
+            <version>2.0.5</version>
+        </dependency>
+
+        <!-- https://mvnrepository.com/artifact/org.java-websocket/Java-WebSocket -->
+        <dependency>
+            <groupId>org.java-websocket</groupId>
+            <artifactId>Java-WebSocket</artifactId>
+            <version>1.3.9</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.xmlbeans</groupId>
+            <artifactId>xmlbeans</artifactId>
+            <version>${xmlbeans.version}</version>
+            <exclusions>
+                <exclusion>
+                    <artifactId>stax-api</artifactId>
+                    <groupId>stax</groupId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+
+        <!-- POI依赖 ,处理EXCEL WORD  PDF -->
+    </dependencies>
+
+
+</project>

+ 103 - 0
kmall-framework/pom.xml

@@ -0,0 +1,103 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>kmall-pt-general</artifactId>
+        <groupId>com.kmall</groupId>
+        <version>3.1.0</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>kmall-framework</artifactId>
+
+    <name>kmall-framework</name>
+    <description>
+        此项目为系统WEB合并,
+        合并项目可以根据需要自己配置。
+        最终打包的项目也根据此配置进行打包。
+    </description>
+
+
+    <dependencies>
+
+        <dependency>
+            <groupId>com.kmall</groupId>
+            <artifactId>kmall-common</artifactId>
+            <version>${kmall-version}</version>
+        </dependency>
+        <dependency>
+            <groupId>com.kmall</groupId>
+            <artifactId>kmall-api</artifactId>
+            <version>${kmall-version}</version>
+        </dependency>
+        <dependency>
+            <groupId>com.kmall</groupId>
+            <artifactId>kmall-admin</artifactId>
+            <version>${kmall-version}</version>
+            <type>war</type>
+        </dependency>
+        <dependency>
+            <groupId>com.kmall</groupId>
+            <artifactId>kmall-gen</artifactId>
+            <version>${kmall-version}</version>
+        </dependency>
+
+    </dependencies>
+
+    <!--<build>
+        <sourceDirectory>src/main/java</sourceDirectory>
+        <finalName>kmall-framework</finalName>
+
+        <resources>
+            <resource>
+                <directory>src/main/resources</directory>
+                <filtering>true</filtering>
+                <includes>
+                    <include>**/*.xml</include>
+                    <include>**/*.properties</include>
+                </includes>
+            </resource>
+            <resource>
+                <directory>src/main/java</directory>
+                <filtering>true</filtering>
+                <includes>
+                    <include>**/*.xml</include>
+                    <include>**/*.properties</include>
+                </includes>
+            </resource>
+        </resources>
+
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-surefire-plugin</artifactId>
+                <version>${maven.surefire.plugin.version}</version>
+                <configuration>
+                    <skipTests>true</skipTests>
+                </configuration>
+            </plugin>
+            &lt;!&ndash; 合并多个war &ndash;&gt;
+            &lt;!&ndash;<plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-war-plugin</artifactId>
+                <version>2.6</version>
+                <configuration>
+                    <packagingExcludes>WEB-INF/web.xml</packagingExcludes>
+                    <failOnMissingWebXml>false</failOnMissingWebXml>
+                    <overlays>
+                        <overlay>
+                            <groupId>com.kmall</groupId>
+                            <artifactId>kmall-admin</artifactId>
+                        </overlay>
+
+                        &lt;!&ndash; 待添加其他要合并的 web 模块 &ndash;&gt;
+                    </overlays>
+                </configuration>
+            </plugin>&ndash;&gt;
+        </plugins>
+
+
+    </build>-->
+
+</project>

+ 24 - 0
kmall-gen/pom.xml

@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>kmall-pt-general</artifactId>
+        <groupId>com.kmall</groupId>
+        <version>3.1.0</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <groupId>com.kmall</groupId>
+    <artifactId>kmall-gen</artifactId>
+    <description>代码生成器模块</description>
+
+    <dependencies>
+        <dependency>
+            <groupId>com.kmall</groupId>
+            <artifactId>kmall-common</artifactId>
+            <version>${kmall-version}</version>
+        </dependency>
+    </dependencies>
+
+</project>

+ 72 - 0
kmall-manager/pom.xml

@@ -0,0 +1,72 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>kmall-pt-general</artifactId>
+        <groupId>com.kmall</groupId>
+        <version>3.1.0</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>kmall-manager</artifactId>
+    <description>通用业务管理</description>
+
+
+    <dependencies>
+        <dependency>
+            <groupId>com.kmall</groupId>
+            <artifactId>kmall-common</artifactId>
+            <version>${kmall-version}</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.alipay</groupId>
+            <artifactId>com-alipay</artifactId>
+            <version>1.0</version>
+            <scope>system</scope>
+            <systemPath>${project.basedir}/src/main/resources/lib/alipay-sdk-java-3.3.0.jar</systemPath>
+        </dependency>
+        <dependency>
+            <groupId>com.alipay.demo</groupId>
+            <artifactId>com-alipay-demo</artifactId>
+            <version>1.0</version>
+            <scope>system</scope>
+            <systemPath>${project.basedir}/src/main/resources/lib/alipay-trade-sdk-20161215.jar</systemPath>
+        </dependency>
+
+
+        <dependency>
+            <groupId>com.alipay</groupId>
+            <artifactId>commons-codec</artifactId>
+            <version>1.0</version>
+            <scope>system</scope>
+            <systemPath>${project.basedir}/src/main/resources/lib/commons-codec-1.10.jar</systemPath>
+        </dependency>
+        <dependency>
+            <groupId>com.alipay.demo</groupId>
+            <artifactId>commons-configuration</artifactId>
+            <version>1.0</version>
+            <scope>system</scope>
+            <systemPath>${project.basedir}/src/main/resources/lib/commons-configuration-1.10.jar</systemPath>
+        </dependency>
+
+
+    </dependencies>
+
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+                <configuration>
+                    <includeSystemScope>true</includeSystemScope>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+
+
+
+</project>

+ 247 - 0
kmall-manager/src/main/java/com/kmall/manager/manager/alipay/AliPayConfigs.java

@@ -0,0 +1,247 @@
+package com.kmall.manager.manager.alipay;
+
+import org.apache.commons.configuration.Configuration;
+import org.apache.commons.configuration.ConfigurationException;
+import org.apache.commons.configuration.PropertiesConfiguration;
+import org.apache.commons.lang.StringUtils;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+public class AliPayConfigs {
+    private static Log log = LogFactory.getLog(AliPayConfigs.class);
+    private static Configuration configs;
+
+    private static String openApiDomain;   // 支付宝openapi域名
+    private static String mcloudApiDomain;  // 支付宝mcloudmonitor域名
+    private static String pid;             // 商户partner id
+    private static String appid;           // 商户应用id
+
+    private static String privateKey;      // RSA私钥,用于对商户请求报文加签
+    private static String publicKey;       // RSA公钥,仅用于验证开发者网关
+    private static String alipayPublicKey; // 支付宝RSA公钥,用于验签支付宝应答
+    private static String signType;     // 签名类型
+
+    private static int maxQueryRetry;   // 最大查询次数
+    private static long queryDuration;  // 查询间隔(毫秒)
+
+    private static int maxCancelRetry;  // 最大撤销次数
+    private static long cancelDuration; // 撤销间隔(毫秒)
+
+    private static long heartbeatDelay ; // 交易保障线程第一次调度延迟(秒)
+    private static long heartbeatDuration ; // 交易保障线程调度间隔(秒)
+
+    private AliPayConfigs() {
+        // No Constructor
+    }
+
+    // 根据文件名读取配置文件,文件后缀名必须为.properties
+    public synchronized static void init(String filePath) {
+        if (configs != null) {
+            return;
+        }
+
+        try {
+            configs = new PropertiesConfiguration(filePath);
+        } catch (ConfigurationException e) {
+            e.printStackTrace();
+        }
+
+        if (configs == null) {
+            throw new IllegalStateException("can`t find file by path:" + filePath);
+        }
+
+        openApiDomain = configs.getString("open_api_domain");
+        mcloudApiDomain = configs.getString("mcloud_api_domain");
+
+        pid = configs.getString("pid");
+        appid = configs.getString("appid");
+
+        // RSA
+        privateKey = configs.getString("private_key");
+        publicKey = configs.getString("public_key");
+        alipayPublicKey = configs.getString("alipay_public_key");
+        signType = configs.getString("sign_type");
+
+        // 查询参数
+        maxQueryRetry = configs.getInt("max_query_retry");
+        queryDuration = configs.getLong("query_duration");
+        maxCancelRetry = configs.getInt("max_cancel_retry");
+        cancelDuration = configs.getLong("cancel_duration");
+
+        // 交易保障调度线程
+        heartbeatDelay = configs.getLong("heartbeat_delay");
+        heartbeatDuration = configs.getLong("heartbeat_duration");
+
+        log.info("配置文件名: " + filePath);
+        log.info(description());
+    }
+
+    public static String description() {
+        StringBuilder sb = new StringBuilder("Configs{");
+        sb.append("支付宝openapi网关: ").append(openApiDomain).append("\n");
+        if (StringUtils.isNotEmpty(mcloudApiDomain)) {
+            sb.append(", 支付宝mcloudapi网关域名: ").append(mcloudApiDomain).append("\n");
+        }
+
+        if (StringUtils.isNotEmpty(pid)) {
+            sb.append(", pid: ").append(pid).append("\n");
+        }
+        sb.append(", appid: ").append(appid).append("\n");
+
+        sb.append(", 商户RSA私钥: ").append(getKeyDescription(privateKey)).append("\n");
+        sb.append(", 商户RSA公钥: ").append(getKeyDescription(publicKey)).append("\n");
+        sb.append(", 支付宝RSA公钥: ").append(getKeyDescription(alipayPublicKey)).append("\n");
+        sb.append(", 签名类型: ").append(signType).append("\n");
+
+        sb.append(", 查询重试次数: ").append(maxQueryRetry).append("\n");
+        sb.append(", 查询间隔(毫秒): ").append(queryDuration).append("\n");
+        sb.append(", 撤销尝试次数: ").append(maxCancelRetry).append("\n");
+        sb.append(", 撤销重试间隔(毫秒): ").append(cancelDuration).append("\n");
+
+        sb.append(", 交易保障调度延迟(秒): ").append(heartbeatDelay).append("\n");
+        sb.append(", 交易保障调度间隔(秒): ").append(heartbeatDuration).append("\n");
+        sb.append("}");
+        return sb.toString();
+    }
+
+    private static String getKeyDescription(String key) {
+        int showLength = 6;
+        if (StringUtils.isNotEmpty(key) &&
+            key.length() > showLength) {
+            return new StringBuilder(key.substring(0, showLength))
+                    .append("******")
+                    .append(key.substring(key.length() - showLength))
+                    .toString();
+        }
+        return null;
+    }
+
+    public static Configuration getConfigs() {
+        return configs;
+    }
+
+    public static String getOpenApiDomain() {
+        return openApiDomain;
+    }
+
+    public static Log getLog() {
+        return log;
+    }
+
+    public static void setLog(Log log) {
+        AliPayConfigs.log = log;
+    }
+
+    public static void setConfigs(Configuration configs) {
+        AliPayConfigs.configs = configs;
+    }
+
+    public static void setOpenApiDomain(String openApiDomain) {
+        AliPayConfigs.openApiDomain = openApiDomain;
+    }
+
+    public static String getMcloudApiDomain() {
+        return mcloudApiDomain;
+    }
+
+    public static void setMcloudApiDomain(String mcloudApiDomain) {
+        AliPayConfigs.mcloudApiDomain = mcloudApiDomain;
+    }
+
+    public static String getPid() {
+        return pid;
+    }
+
+    public static void setPid(String pid) {
+        AliPayConfigs.pid = pid;
+    }
+
+    public static String getAppid() {
+        return appid;
+    }
+
+    public static void setAppid(String appid) {
+        AliPayConfigs.appid = appid;
+    }
+
+    public static String getPrivateKey() {
+        return privateKey;
+    }
+
+    public static void setPrivateKey(String privateKey) {
+        AliPayConfigs.privateKey = privateKey;
+    }
+
+    public static String getPublicKey() {
+        return publicKey;
+    }
+
+    public static void setPublicKey(String publicKey) {
+        AliPayConfigs.publicKey = publicKey;
+    }
+
+    public static String getAlipayPublicKey() {
+        return alipayPublicKey;
+    }
+
+    public static void setAlipayPublicKey(String alipayPublicKey) {
+        AliPayConfigs.alipayPublicKey = alipayPublicKey;
+    }
+
+    public static String getSignType() {
+        return signType;
+    }
+
+    public static void setSignType(String signType) {
+        AliPayConfigs.signType = signType;
+    }
+
+    public static int getMaxQueryRetry() {
+        return maxQueryRetry;
+    }
+
+    public static void setMaxQueryRetry(int maxQueryRetry) {
+        AliPayConfigs.maxQueryRetry = maxQueryRetry;
+    }
+
+    public static long getQueryDuration() {
+        return queryDuration;
+    }
+
+    public static void setQueryDuration(long queryDuration) {
+        AliPayConfigs.queryDuration = queryDuration;
+    }
+
+    public static int getMaxCancelRetry() {
+        return maxCancelRetry;
+    }
+
+    public static void setMaxCancelRetry(int maxCancelRetry) {
+        AliPayConfigs.maxCancelRetry = maxCancelRetry;
+    }
+
+    public static long getCancelDuration() {
+        return cancelDuration;
+    }
+
+    public static void setCancelDuration(long cancelDuration) {
+        AliPayConfigs.cancelDuration = cancelDuration;
+    }
+
+    public static long getHeartbeatDelay() {
+        return heartbeatDelay;
+    }
+
+    public static void setHeartbeatDelay(long heartbeatDelay) {
+        AliPayConfigs.heartbeatDelay = heartbeatDelay;
+    }
+
+    public static long getHeartbeatDuration() {
+        return heartbeatDuration;
+    }
+
+    public static void setHeartbeatDuration(long heartbeatDuration) {
+        AliPayConfigs.heartbeatDuration = heartbeatDuration;
+    }
+}
+

+ 214 - 0
kmall-manager/src/main/java/com/kmall/manager/manager/alipay/AliPayMicropayApiResult.java

@@ -0,0 +1,214 @@
+package com.kmall.manager.manager.alipay;
+
+import java.util.Date;
+
+/**
+ * 响应信息
+ */
+public class AliPayMicropayApiResult {
+
+    //公共响应参数
+    private String code;    //返回状态码
+    private String msg;     //返回信息
+    private String subCode;    //业务返回码
+    private String subMsg;     //业务返回码描述
+
+
+    private String buyerLogonId;    //买家支付宝账号
+    private String buyerUserId;    //买家在支付宝的用户id
+    //支付
+    private String tradeNo;    //支付宝交易号
+    private String outTradeNo;    //商户订单号
+    private String receiptAmount;    //实收金额
+    private String buyerPayAmount;    //买家付款的金额
+    private Date gmtPayment;    //交易支付时间
+
+
+    //退款
+    private String fundChange;    //本次退款是否发生了资金变化 Y
+    private String refundFee;    //退款总金额
+    private Date gmtRefundPay;    //退款支付时间
+    private String presentRefundDiscountAmount;  //本次退款金额中平台优惠退款金额
+
+
+    //撤销
+    private String retryFlag;   //是否需要重试
+    private String action;  //本次撤销触发的交易动作,接口调用成功且交易存在时返回。可能的返回值:close:交易未支付,触发关闭交易动作,无退款;refund:交易已支付,触发交易退款动作;未返回:未查询到交易,或接口调用失败;
+
+
+    //查询
+    private String tradeStatus;//交易状态:WAIT_BUYER_PAY(交易创建,等待买家付款)、TRADE_CLOSED(未付款交易超时关闭,或支付完成后全额退款)、TRADE_SUCCESS(交易支付成功)、TRADE_FINISHED(交易结束,不可退款)
+    private String totalAmount;//交易的订单金额,单位为元,两位小数
+
+    /**
+     * SUCCESS—支付成功
+     REFUND—转入退款
+     NOTPAY—未支付
+     CLOSED—已关闭
+     REVOKED—已撤销
+     USERPAYING--用户支付中
+     PAYERROR--支付失败
+     */
+    private String tradeState; //支付状态
+
+
+    public String getCode() {
+        return code;
+    }
+
+    public void setCode(String code) {
+        this.code = code;
+    }
+
+    public String getMsg() {
+        return msg;
+    }
+
+    public void setMsg(String msg) {
+        this.msg = msg;
+    }
+
+    public String getSubCode() {
+        return subCode;
+    }
+
+    public void setSubCode(String subCode) {
+        this.subCode = subCode;
+    }
+
+    public String getTradeState() {
+        return tradeState;
+    }
+
+    public void setTradeState(String tradeState) {
+        this.tradeState = tradeState;
+    }
+
+    public String getSubMsg() {
+        return subMsg;
+    }
+
+    public void setSubMsg(String subMsg) {
+        this.subMsg = subMsg;
+    }
+
+    public String getBuyerLogonId() {
+        return buyerLogonId;
+    }
+
+    public void setBuyerLogonId(String buyerLogonId) {
+        this.buyerLogonId = buyerLogonId;
+    }
+
+    public String getTradeNo() {
+        return tradeNo;
+    }
+
+    public void setTradeNo(String tradeNo) {
+        this.tradeNo = tradeNo;
+    }
+
+    public String getOutTradeNo() {
+        return outTradeNo;
+    }
+
+    public void setOutTradeNo(String outTradeNo) {
+        this.outTradeNo = outTradeNo;
+    }
+
+    public String getReceiptAmount() {
+        return receiptAmount;
+    }
+
+    public void setReceiptAmount(String receiptAmount) {
+        this.receiptAmount = receiptAmount;
+    }
+
+    public String getBuyerPayAmount() {
+        return buyerPayAmount;
+    }
+
+    public void setBuyerPayAmount(String buyerPayAmount) {
+        this.buyerPayAmount = buyerPayAmount;
+    }
+
+    public Date getGmtPayment() {
+        return gmtPayment;
+    }
+
+    public void setGmtPayment(Date gmtPayment) {
+        this.gmtPayment = gmtPayment;
+    }
+
+    public String getFundChange() {
+        return fundChange;
+    }
+
+    public void setFundChange(String fundChange) {
+        this.fundChange = fundChange;
+    }
+
+    public String getRefundFee() {
+        return refundFee;
+    }
+
+    public void setRefundFee(String refundFee) {
+        this.refundFee = refundFee;
+    }
+
+    public Date getGmtRefundPay() {
+        return gmtRefundPay;
+    }
+
+    public void setGmtRefundPay(Date gmtRefundPay) {
+        this.gmtRefundPay = gmtRefundPay;
+    }
+
+    public String getBuyerUserId() {
+        return buyerUserId;
+    }
+
+    public void setBuyerUserId(String buyerUserId) {
+        this.buyerUserId = buyerUserId;
+    }
+
+    public String getPresentRefundDiscountAmount() {
+        return presentRefundDiscountAmount;
+    }
+
+    public void setPresentRefundDiscountAmount(String presentRefundDiscountAmount) {
+        this.presentRefundDiscountAmount = presentRefundDiscountAmount;
+    }
+
+    public String getRetryFlag() {
+        return retryFlag;
+    }
+
+    public void setRetryFlag(String retryFlag) {
+        this.retryFlag = retryFlag;
+    }
+
+    public String getAction() {
+        return action;
+    }
+
+    public void setAction(String action) {
+        this.action = action;
+    }
+
+    public String getTradeStatus() {
+        return tradeStatus;
+    }
+
+    public void setTradeStatus(String tradeStatus) {
+        this.tradeStatus = tradeStatus;
+    }
+
+    public String getTotalAmount() {
+        return totalAmount;
+    }
+
+    public void setTotalAmount(String totalAmount) {
+        this.totalAmount = totalAmount;
+    }
+}

+ 131 - 0
kmall-manager/src/main/java/com/kmall/manager/manager/alipay/AliPayRequestParams.java

@@ -0,0 +1,131 @@
+package com.kmall.manager.manager.alipay;
+
+
+
+import com.alipay.api.domain.GoodsDetail;
+
+import java.util.List;
+
+/**
+ * 请求参数
+ */
+public class AliPayRequestParams {
+    private String outTradeNo;            //商户订单号
+    private String authCode;               //支付授权码
+    private String subject;                 //订单标题
+    private String totalAmount;            //订单总金额,单位为元,精确到小数点后两位
+    private String body;                    //订单描述
+    private String storeId;              //商户门店编号
+
+    private String operatorId;             //操作员id
+    private String productCode;            //销售产品码
+    private String scene = "bar_code";     //支付场景;条码支付,取值:bar_code;声波支付,取值:wave_code
+    private String buyerId;                //买家的支付宝用户 id,如果为空,会从传入的码值信息中获取买家 ID
+    private String sellerId;               //卖家支付宝账号ID,用于支持一个签约账号下支持打款到不同的收款账号,如果该值为空,则默认为商户签约账号对应的支付宝用户ID
+//    private List<GoodsDetail> goodsDetail; //订单包含的商品列表信息
+    private String timeoutExpress = "5m";  //该笔订单允许的最晚付款时间,逾期将关闭交易。取值范围:1m~15d。m-分钟,h-小时,d-天
+
+    public String getOutTradeNo() {
+        return outTradeNo;
+    }
+
+    public void setOutTradeNo(String outTradeNo) {
+        this.outTradeNo = outTradeNo;
+    }
+
+    public String getAuthCode() {
+        return authCode;
+    }
+
+    public void setAuthCode(String authCode) {
+        this.authCode = authCode;
+    }
+
+    public String getSubject() {
+        return subject;
+    }
+
+    public void setSubject(String subject) {
+        this.subject = subject;
+    }
+
+    public String getTotalAmount() {
+        return totalAmount;
+    }
+
+    public void setTotalAmount(String totalAmount) {
+        this.totalAmount = totalAmount;
+    }
+
+    public String getBody() {
+        return body;
+    }
+
+    public void setBody(String body) {
+        this.body = body;
+    }
+
+    public String getStoreId() {
+        return storeId;
+    }
+
+    public void setStoreId(String storeId) {
+        this.storeId = storeId;
+    }
+
+    public String getProductCode() {
+        return productCode;
+    }
+
+    public void setProductCode(String productCode) {
+        this.productCode = productCode;
+    }
+
+    public String getScene() {
+        return scene;
+    }
+
+    public void setScene(String scene) {
+        this.scene = scene;
+    }
+
+    public String getBuyerId() {
+        return buyerId;
+    }
+
+    public void setBuyerId(String buyerId) {
+        this.buyerId = buyerId;
+    }
+
+    public String getSellerId() {
+        return sellerId;
+    }
+
+    public void setSellerId(String sellerId) {
+        this.sellerId = sellerId;
+    }
+//
+//    public List<GoodsDetail> getGoodsDetail() {
+//        return goodsDetail;
+//    }
+//
+//    public void setGoodsDetail(List<GoodsDetail> goodsDetail) {
+//        this.goodsDetail = goodsDetail;
+//    }
+
+    public String getTimeoutExpress() {
+        return timeoutExpress;
+    }
+
+    public void setTimeoutExpress(String timeoutExpress) {
+        this.timeoutExpress = timeoutExpress;
+    }
+
+    public String getOperatorId() {
+        return operatorId;
+    }
+
+    public void setOperatorId(String operatorId) {
+        this.operatorId = operatorId;
+    }
+}

+ 370 - 0
kmall-manager/src/main/java/com/kmall/manager/manager/alipay/AliPayUtil.java

@@ -0,0 +1,370 @@
+package com.kmall.manager.manager.alipay;
+
+import com.alibaba.druid.support.logging.Log;
+import com.alibaba.druid.support.logging.LogFactory;
+import com.alipay.api.AlipayApiException;
+import com.alipay.api.AlipayClient;
+import com.alipay.api.DefaultAlipayClient;
+import com.alipay.api.request.AlipayTradeCancelRequest;
+import com.alipay.api.response.AlipayTradeCancelResponse;
+import com.alipay.demo.trade.config.Configs;
+import com.alipay.demo.trade.model.builder.AlipayTradeCancelRequestBuilder;
+import com.alipay.demo.trade.model.builder.AlipayTradePayRequestBuilder;
+import com.alipay.demo.trade.model.builder.AlipayTradeQueryRequestBuilder;
+import com.alipay.demo.trade.model.builder.AlipayTradeRefundRequestBuilder;
+import com.alipay.demo.trade.model.result.AlipayF2FPayResult;
+import com.alipay.demo.trade.model.result.AlipayF2FQueryResult;
+import com.alipay.demo.trade.model.result.AlipayF2FRefundResult;
+import com.alipay.demo.trade.service.AlipayTradeService;
+import com.alipay.demo.trade.service.impl.AlipayTradeServiceImpl;
+
+import java.util.*;
+
+public class AliPayUtil {
+    private static Log log = LogFactory.getLog(AliPayUtil.class);
+
+    // 支付宝当面付2.0服务
+    private static AlipayTradeService tradeService;
+
+    // 支付宝当面付2.0服务(集成了交易保障接口逻辑)
+    //    private static AlipayTradeService   tradeWithHBService;
+
+
+    static {
+        /** 一定要在创建AlipayTradeService之前调用Configs.init()设置默认参数
+         *  Configs会读取classpath下的zfbinfo.properties文件配置信息,如果找不到该文件则确认该文件是否在classpath目录
+         */
+        Configs.init("conf/alipay.properties");
+        AliPayConfigs.init("conf/alipay.properties");
+
+        /**
+         * 使用Configs提供的默认参数
+         *  AlipayTradeService可以使用单例或者为静态成员对象,不需要反复new
+         */
+        tradeService = new AlipayTradeServiceImpl.ClientBuilder().build();
+
+        // 支付宝当面付2.0服务(集成了交易保障接口逻辑)
+        //        tradeWithHBService = new AlipayTradeWithHBServiceImpl.ClientBuilder().build();
+
+    }
+
+    public enum AliPayTradeState {
+        /**
+         * 支付成功
+         */
+        SUCCESS("SUCCESS", "支付成功"),
+        /**
+         * 转入退款
+         */
+        REFUND("REFUND", "转入退款"),
+
+        /**
+         * 未支付
+         */
+        NOTPAY("NOTPAY", "未支付"),
+
+        /**
+         * 已关闭
+         */
+        CLOSED("CLOSED", "已关闭"),
+
+        /**
+         * 已撤销(付款码支付)
+         */
+        REVOKED("REVOKED", "已撤销"),
+
+        /**
+         * 用户支付中(付款码支付)
+         */
+        USERPAYING("USERPAYING", "用户支付中"),
+
+        /**
+         * 支付失败(付款码支付)
+         */
+        PAYERROR("PAYERROR", "支付失败"),
+
+        SUCC("10000","接口调用成功"),
+        SERVER_FAIL("20000","服务不可用"),
+        PERMISSION_DENIED("20001","授权权限不足"),
+        MISSING_PARAM("40001","缺少必选参数"),
+        ILLEGAL_PARAM("40002","非法的参数"),
+        BUSINESS_FAIL("40004","业务处理失败"),
+        ISV_PERMISSION("40006","权限不足");
+
+
+        private String code;
+        private String codeZn;
+
+        private AliPayTradeState(String code, String codeZn) {
+            this.code = code;
+            this.codeZn = codeZn;
+        }
+
+        public String getCode() {
+            return code;
+        }
+
+        public String getCodeZn() {
+            return codeZn;
+        }
+    }
+
+    public enum BusinessFailState {
+
+        SYSTEM_ERROR("ACQ.SYSTEM_ERROR","接口返回错误"),
+        EXIST_FORBIDDEN_WORD("ACQ.EXIST_FORBIDDEN_WORD","订单信息中包含违禁词"),
+        TOTAL_FEE_EXCEED("ACQ.TOTAL_FEE_EXCEED","订单总金额超过限额"),
+        PAYMENT_AUTH_CODE_INVALID("ACQ.PAYMENT_AUTH_CODE_INVALID","支付授权码无效"),
+        CONTEXT_INCONSISTENT("ACQ.CONTEXT_INCONSISTENT","交易信息被篡改"),
+        TRADE_HAS_SUCCESS("ACQ.TRADE_HAS_SUCCESS","交易已被支付"),
+        TRADE_HAS_CLOSE("ACQ.TRADE_HAS_CLOSE","交易已经关闭"),
+        BUYER_BALANCE_NOT_ENOUGH("ACQ.BUYER_BALANCE_NOT_ENOUGH","买家余额不足"),
+        BUYER_BANKCARD_BALANCE_NOT_ENOUGH("ACQ.BUYER_BANKCARD_BALANCE_NOT_ENOUGH","用户银行卡余额不足"),
+        ERROR_BALANCE_PAYMENT_DISABLE("ACQ.ERROR_BALANCE_PAYMENT_DISABLE","余额支付功能关闭"),
+        BUYER_SELLER_EQUAL("ACQ.BUYER_SELLER_EQUAL","买卖家不能相同"),
+        TRADE_BUYER_NOT_MATCH("ACQ.TRADE_BUYER_NOT_MATCH","交易买家不匹配"),
+        BUYER_ENABLE_STATUS_FORBID("ACQ.BUYER_ENABLE_STATUS_FORBID","买家状态非法"),
+        PULL_MOBILE_CASHIER_FAIL("ACQ.PULL_MOBILE_CASHIER_FAIL","唤起移动收银台失败"),
+        MOBILE_PAYMENT_SWITCH_OFF("ACQ.MOBILE_PAYMENT_SWITCH_OFF","用户的无线支付开关关闭"),
+        PAYMENT_FAIL("ACQ.PAYMENT_FAIL","支付失败"),
+        BUYER_PAYMENT_AMOUNT_DAY_LIMIT_ERROR("ACQ.BUYER_PAYMENT_AMOUNT_DAY_LIMIT_ERROR","买家付款日限额超限"),
+        BEYOND_PAY_RESTRICTION("ACQ.BEYOND_PAY_RESTRICTION","商户收款额度超限"),
+        BEYOND_PER_RECEIPT_RESTRICTION("ACQ.BEYOND_PER_RECEIPT_RESTRICTION","商户收款金额超过月限额"),
+        BUYER_PAYMENT_AMOUNT_MONTH_LIMIT_ERROR("ACQ.BUYER_PAYMENT_AMOUNT_MONTH_LIMIT_ERROR","买家付款月额度超限"),
+        SELLER_BEEN_BLOCKED("ACQ.SELLER_BEEN_BLOCKED","商家账号被冻结"),
+        ERROR_BUYER_CERTIFY_LEVEL_LIMIT("ACQ.ERROR_BUYER_CERTIFY_LEVEL_LIMIT","买家未通过人行认证"),
+        PAYMENT_REQUEST_HAS_RISK("ACQ.PAYMENT_REQUEST_HAS_RISK","支付有风险"),
+        NO_PAYMENT_INSTRUMENTS_AVAILABLE("ACQ.NO_PAYMENT_INSTRUMENTS_AVAILABLE","没用可用的支付工具"),
+        USER_FACE_PAYMENT_SWITCH_OFF("ACQ.USER_FACE_PAYMENT_SWITCH_OFF","用户当面付付款开关关闭"),
+
+        ;
+        private String code;
+        private String codeZn;
+
+        private BusinessFailState(String code, String codeZn) {
+            this.code = code;
+            this.codeZn = codeZn;
+        }
+
+        public String getCode() {
+            return code;
+        }
+
+        public String getCodeZn() {
+            return codeZn;
+        }
+    }
+
+
+    /**
+     * 支付宝退款
+     * @param outTradeNo    外部订单号,需要退款交易的商户外部订单号
+     * @param refundAmount  退款金额,该金额必须小于等于订单的支付金额
+     * @param refundReason  退款原因
+     * @param storeId   商户门店编号
+     * @return
+     * @throws Exception
+     */
+    public static AliPayMicropayApiResult aliTradeRefund(String outTradeNo,String refundAmount,String refundReason,String storeId) throws Exception{
+        // (可选,需要支持重复退货时必填) 商户退款请求号,相同支付宝交易号下的不同退款请求号对应同一笔交易的不同退款申请,
+        // 对于相同支付宝交易号下多笔相同商户退款请求号的退款交易,支付宝只会进行一次退款
+        String outRequestNo = "";
+
+        // 创建退款请求builder,设置请求参数
+        AlipayTradeRefundRequestBuilder builder =
+                new AlipayTradeRefundRequestBuilder().setOutTradeNo(outTradeNo)
+                                                     .setRefundAmount(refundAmount)
+                                                     .setRefundReason(refundReason)
+                                                     .setOutRequestNo(outRequestNo)
+                                                     .setStoreId(storeId);
+
+        AlipayF2FRefundResult result = tradeService.tradeRefund(builder);
+        AliPayMicropayApiResult apiResult = new AliPayMicropayApiResult();
+
+        apiResult.setCode(result.getResponse().getCode());
+        apiResult.setMsg(result.getResponse().getMsg());
+        apiResult.setSubCode(result.getResponse().getSubCode());
+        apiResult.setSubMsg(result.getResponse().getSubMsg());
+
+        apiResult.setOutTradeNo(result.getResponse().getOutTradeNo());
+        apiResult.setTradeNo(result.getResponse().getTradeNo());
+        apiResult.setBuyerLogonId(result.getResponse().getBuyerLogonId());
+        apiResult.setBuyerUserId(result.getResponse().getBuyerUserId());
+
+        apiResult.setRefundFee(result.getResponse().getRefundFee());
+        apiResult.setGmtRefundPay(result.getResponse().getGmtRefundPay());
+        apiResult.setPresentRefundDiscountAmount(result.getResponse().getPresentRefundDiscountAmount());
+
+        if ("SUCCESS".equals(result.getTradeStatus().name())) {
+            apiResult.setTradeState(AliPayTradeState.REFUND.getCode());
+        }
+
+        return apiResult;
+    }
+
+    /**
+     * 查询订单
+     *
+     * @param outTradeNo 订单编号
+     * @param tradeNo    支付宝交易号
+     * @return
+     */
+    public static AliPayMicropayApiResult aliTradeQuery(String outTradeNo, String tradeNo) throws Exception{
+
+        // 创建查询请求builder,设置请求参数
+        AlipayTradeQueryRequestBuilder builder = new AlipayTradeQueryRequestBuilder().setOutTradeNo(outTradeNo);
+
+        AlipayF2FQueryResult result = tradeService.queryTradeResult(builder);
+        AliPayMicropayApiResult apiResult = new AliPayMicropayApiResult();
+
+        apiResult.setCode(result.getResponse().getCode());
+        apiResult.setMsg(result.getResponse().getMsg());
+        apiResult.setSubCode(result.getResponse().getSubCode());
+        apiResult.setSubMsg(result.getResponse().getSubMsg());
+
+        apiResult.setOutTradeNo(result.getResponse().getOutTradeNo());
+        apiResult.setTradeNo(result.getResponse().getTradeNo());
+        apiResult.setBuyerLogonId(result.getResponse().getBuyerLogonId());
+        apiResult.setBuyerUserId(result.getResponse().getBuyerUserId());
+
+        apiResult.setReceiptAmount(result.getResponse().getReceiptAmount());
+        apiResult.setBuyerPayAmount(result.getResponse().getBuyerPayAmount());
+        apiResult.setTradeStatus(result.getResponse().getTradeStatus());
+        apiResult.setTotalAmount(result.getResponse().getTotalAmount());
+
+        if ("WAIT_BUYER_PAY".equals(apiResult.getTradeStatus())) {
+            apiResult.setTradeState(AliPayTradeState.NOTPAY.getCode());
+        } else if ("TRADE_CLOSED".equals(apiResult.getTradeStatus())) {
+            apiResult.setTradeState(AliPayTradeState.CLOSED.getCode());
+        } else if ("TRADE_SUCCESS".equals(apiResult.getTradeStatus())) {
+            apiResult.setTradeState(AliPayTradeState.SUCCESS.getCode());
+        } else if ("TRADE_FINISHED".equals(apiResult.getTradeStatus())) {
+            apiResult.setTradeState(AliPayTradeState.CLOSED.getCode());
+        }
+        return apiResult;
+    }
+
+    /**
+     * 支付宝支付
+     *
+     * 功能描述:   必填参数
+     * OutTradeNo 订单编号
+     * Subject  订单标题
+     * AuthCode 付款码
+     * TotalAmount  订单金额
+     * StoreId  商户ID
+     *
+     * @version 1.0.0
+     * 2020/5/21 16:52
+     */
+    public static AliPayMicropayApiResult aliTradePay(AliPayRequestParams params) throws Exception{
+
+        //        String appAuthToken = "应用授权令牌";//根据真实值填写
+
+        // 创建条码支付请求builder,设置请求参数
+        AlipayTradePayRequestBuilder builder = new AlipayTradePayRequestBuilder()
+                //            .setAppAuthToken(appAuthToken)
+                .setOutTradeNo(params.getOutTradeNo())
+                .setSubject(params.getSubject())
+                .setAuthCode(params.getAuthCode())
+                .setTotalAmount(params.getTotalAmount())
+                .setStoreId(params.getStoreId())
+                .setBody(params.getBody())
+                .setOperatorId(params.getOperatorId())
+                .setSellerId(params.getSellerId())
+//                .setGoodsDetailList(params.getGoodsDetail())
+                .setTimeoutExpress(params.getTimeoutExpress());
+
+
+        // 调用tradePay方法获取当面付应答
+        AlipayF2FPayResult result = tradeService.tradePay(builder);
+
+        AliPayMicropayApiResult apiResult = new AliPayMicropayApiResult();
+
+        apiResult.setCode(result.getResponse().getCode());
+        apiResult.setMsg(result.getResponse().getMsg());
+        apiResult.setSubCode(result.getResponse().getSubCode());
+        apiResult.setSubMsg(result.getResponse().getSubMsg());
+
+        apiResult.setOutTradeNo(result.getResponse().getOutTradeNo());
+        apiResult.setTradeNo(result.getResponse().getTradeNo());
+        apiResult.setBuyerLogonId(result.getResponse().getBuyerLogonId());
+        apiResult.setBuyerUserId(result.getResponse().getBuyerUserId());
+
+        apiResult.setReceiptAmount(result.getResponse().getReceiptAmount());
+        apiResult.setBuyerPayAmount(result.getResponse().getBuyerPayAmount());
+        apiResult.setGmtPayment(result.getResponse().getGmtPayment());
+
+        if ("SUCCESS".equals(result.getTradeStatus().name())) {
+            apiResult.setTradeState(AliPayTradeState.SUCCESS.getCode());
+        } else {
+            apiResult.setTradeState(AliPayTradeState.PAYERROR.getCode());
+        }
+
+        return apiResult;
+    }
+
+    /**
+     * 撤销
+     * @param outTradeNo 订单编号
+     * @param tradeNo    支付宝交易号
+     * @return
+     */
+    public static AliPayMicropayApiResult aliTradeCancel(String outTradeNo, String tradeNo) throws Exception{
+
+        AlipayClient alipayClient = new DefaultAlipayClient
+                (AliPayConfigs.getOpenApiDomain(), AliPayConfigs.getAppid(), AliPayConfigs.getPrivateKey(), "json", "GBK", AliPayConfigs.getAlipayPublicKey(), "RSA2");
+        AlipayTradeCancelRequest request = new AlipayTradeCancelRequest();
+        request.setBizContent("{" +
+                              "\"out_trade_no\":"+outTradeNo+"," +
+                              "\"trade_no\":"+tradeNo+"}");
+        AlipayTradeCancelResponse response = null;
+        try {
+            response = alipayClient.execute(request);
+        } catch (AlipayApiException e) {
+            e.printStackTrace();
+            log.info("支付宝撤销异常!!");
+            log.info(e.getErrMsg());
+        }
+
+        AliPayMicropayApiResult apiResult = new AliPayMicropayApiResult();
+
+        apiResult.setCode(response.getCode());
+        apiResult.setMsg(response.getMsg());
+        apiResult.setSubCode(response.getSubCode());
+        apiResult.setSubMsg(response.getSubMsg());
+
+        apiResult.setOutTradeNo(response.getOutTradeNo());
+        apiResult.setTradeNo(response.getTradeNo());
+        apiResult.setAction(response.getAction());
+        apiResult.setRetryFlag(response.getRetryFlag());
+
+        if(response.isSuccess()){
+            apiResult.setTradeState(AliPayTradeState.REVOKED.getCode());
+        }
+        return apiResult;
+    }
+
+    public static void main(String[] args) throws Exception{
+        //支付
+        AliPayRequestParams params = new AliPayRequestParams();
+        params.setAuthCode("283476976115347941");
+        params.setBody("");
+        params.setOutTradeNo("521521521521521");
+        params.setSubject("main测试");
+        params.setStoreId("200");
+        params.setTotalAmount("10");
+        AliPayMicropayApiResult aliPayMicropayApiResult = aliTradePay(params);
+//        System.out.println(aliPayMicropayApiResult.getSubMsg());
+        //查询
+//        AliPayMicropayApiResult aliPayMicropayApiResult = aliTradeQuery("521521521521521", "");
+        //退款
+//        AliPayMicropayApiResult aliPayMicropayApiResult = aliTradeRefund("521521521521521", "10","正常退款","10");
+        //撤销
+//        AliPayMicropayApiResult aliPayMicropayApiResult = aliTradeCancel("521521521521324", "");
+        System.out.println(aliPayMicropayApiResult.getSubMsg());
+    }
+
+
+
+}

+ 461 - 0
kmall-manager/src/main/java/com/kmall/manager/manager/pay/alipay/AliPayMain.java

@@ -0,0 +1,461 @@
+package com.kmall.manager.manager.pay.alipay;
+
+import com.alipay.api.AlipayResponse;
+import com.alipay.api.domain.TradeFundBill;
+import com.alipay.api.response.AlipayTradePrecreateResponse;
+import com.alipay.api.response.AlipayTradeQueryResponse;
+import com.alipay.api.response.MonitorHeartbeatSynResponse;
+import com.alipay.demo.trade.config.Configs;
+import com.alipay.demo.trade.model.ExtendParams;
+import com.alipay.demo.trade.model.GoodsDetail;
+import com.alipay.demo.trade.model.builder.*;
+import com.alipay.demo.trade.model.hb.*;
+import com.alipay.demo.trade.model.result.AlipayF2FPayResult;
+import com.alipay.demo.trade.model.result.AlipayF2FPrecreateResult;
+import com.alipay.demo.trade.model.result.AlipayF2FQueryResult;
+import com.alipay.demo.trade.model.result.AlipayF2FRefundResult;
+import com.alipay.demo.trade.service.AlipayMonitorService;
+import com.alipay.demo.trade.service.AlipayTradeService;
+import com.alipay.demo.trade.service.impl.AlipayMonitorServiceImpl;
+import com.alipay.demo.trade.service.impl.AlipayTradeServiceImpl;
+import com.alipay.demo.trade.service.impl.AlipayTradeWithHBServiceImpl;
+import com.alipay.demo.trade.utils.Utils;
+import org.apache.commons.lang.StringUtils;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+import java.util.*;
+
+/**
+ * Created by liuyangkly on 15/8/9.
+ * 简单main函数,用于测试当面付api
+ * sdk和demo的意见和问题反馈请联系:liuyang.kly@alipay.com
+ */
+public class AliPayMain {
+    private static Log log = LogFactory.getLog(AliPayMain.class);
+
+    // 支付宝当面付2.0服务
+    private static AlipayTradeService   tradeService;
+
+    // 支付宝当面付2.0服务(集成了交易保障接口逻辑)
+    private static AlipayTradeService   tradeWithHBService;
+
+    // 支付宝交易保障接口服务,供测试接口api使用,请先阅读readme.txt
+    private static AlipayMonitorService monitorService;
+
+    static {
+        /** 一定要在创建AlipayTradeService之前调用Configs.init()设置默认参数
+         *  Configs会读取classpath下的zfbinfo.properties文件配置信息,如果找不到该文件则确认该文件是否在classpath目录
+         */
+        Configs.init("conf/alipay.properties");
+
+//        AliPayProperties instance = AliPayPropertiesBuilder.instance();
+        /**
+         * 使用Configs提供的默认参数
+         *  AlipayTradeService可以使用单例或者为静态成员对象,不需要反复new
+         */
+        tradeService = new AlipayTradeServiceImpl.ClientBuilder().build();
+
+        // 支付宝当面付2.0服务(集成了交易保障接口逻辑)
+        tradeWithHBService = new AlipayTradeWithHBServiceImpl.ClientBuilder().build();
+
+        /** 如果需要在程序中覆盖Configs提供的默认参数, 可以使用ClientBuilder类的setXXX方法修改默认参数 否则使用代码中的默认设置 */
+        monitorService = new AlipayMonitorServiceImpl.ClientBuilder()
+            .setGatewayUrl("http://mcloudmonitor.com/gateway.do").setCharset("GBK")
+            .setFormat("json").build();
+    }
+
+    // 简单打印应答
+    private void dumpResponse(AlipayResponse response) {
+        if (response != null) {
+            log.info(String.format("code:%s, msg:%s", response.getCode(), response.getMsg()));
+            if (StringUtils.isNotEmpty(response.getSubCode())) {
+                log.info(String.format("subCode:%s, subMsg:%s", response.getSubCode(),
+                    response.getSubMsg()));
+            }
+            log.info("body:" + response.getBody());
+        }
+    }
+
+    public static void main(String[] args) {
+        AliPayMain main = new AliPayMain();
+
+        // 系统商商测试交易保障接口api
+        //        main.test_monitor_sys();
+
+        // POS厂商测试交易保障接口api
+        //        main.test_monitor_pos();
+
+        // 测试交易保障接口调度
+        //        main.test_monitor_schedule_logic();
+
+        // 测试当面付2.0支付(使用未集成交易保障接口的当面付2.0服务)
+        main.test_trade_pay(tradeService,"123","284239087978423252");
+
+        // 测试查询当面付2.0交易
+        //        main.test_trade_query();
+
+        // 测试当面付2.0退货
+        //        main.test_trade_refund();
+
+        // 测试当面付2.0生成支付二维码
+//        main.test_trade_precreate();
+    }
+
+    /**
+     * 当面付
+     */
+    public void tradePay(String outTradeNo,String auth_code){
+        test_trade_pay(tradeService,outTradeNo,auth_code);
+    }
+    // 测试系统商交易保障调度
+//    public void test_monitor_schedule_logic() {
+//        // 启动交易保障线程
+//        DemoHbRunner demoRunner = new DemoHbRunner(monitorService);
+//        demoRunner.setDelay(5); // 设置启动后延迟5秒开始调度,不设置则默认3秒
+//        demoRunner.setDuration(10); // 设置间隔10秒进行调度,不设置则默认15 * 60秒
+//        demoRunner.schedule();
+//
+//        // 启动当面付,此处每隔5秒调用一次支付接口,并且当随机数为0时交易保障线程退出
+//        while (Math.random() != 0) {
+//            test_trade_pay(tradeWithHBService);
+//            Utils.sleep(5 * 1000);
+//        }
+//
+//        // 满足退出条件后可以调用shutdown优雅安全退出
+//        demoRunner.shutdown();
+//    }
+
+    // 系统商的调用样例,填写了所有系统商商需要填写的字段
+    public void test_monitor_sys() {
+        // 系统商使用的交易信息格式,json字符串类型
+        List<SysTradeInfo> sysTradeInfoList = new ArrayList<SysTradeInfo>();
+        sysTradeInfoList.add(SysTradeInfo.newInstance("00000001", 5.2, HbStatus.S));
+        sysTradeInfoList.add(SysTradeInfo.newInstance("00000002", 4.4, HbStatus.F));
+        sysTradeInfoList.add(SysTradeInfo.newInstance("00000003", 11.3, HbStatus.P));
+        sysTradeInfoList.add(SysTradeInfo.newInstance("00000004", 3.2, HbStatus.X));
+        sysTradeInfoList.add(SysTradeInfo.newInstance("00000005", 4.1, HbStatus.X));
+
+        // 填写异常信息,如果有的话
+        List<ExceptionInfo> exceptionInfoList = new ArrayList<ExceptionInfo>();
+        exceptionInfoList.add(ExceptionInfo.HE_SCANER);
+        //        exceptionInfoList.add(ExceptionInfo.HE_PRINTER);
+        //        exceptionInfoList.add(ExceptionInfo.HE_OTHER);
+
+        // 填写扩展参数,如果有的话
+        Map<String, Object> extendInfo = new HashMap<String, Object>();
+        //        extendInfo.put("SHOP_ID", "BJ_ZZ_001");
+        //        extendInfo.put("TERMINAL_ID", "1234");
+
+        String appAuthToken = "应用授权令牌";//根据真实值填写
+
+        AlipayHeartbeatSynRequestBuilder builder = new AlipayHeartbeatSynRequestBuilder()
+            .setAppAuthToken(appAuthToken).setProduct(Product.FP).setType(Type.CR)
+            .setEquipmentId("cr1000001").setEquipmentStatus(EquipStatus.NORMAL)
+            .setTime(Utils.toDate(new Date())).setStoreId("store10001").setMac("0a:00:27:00:00:00")
+            .setNetworkType("LAN").setProviderId("2088911212323549") // 设置系统商pid
+            .setSysTradeInfoList(sysTradeInfoList) // 系统商同步trade_info信息
+            //                .setExceptionInfoList(exceptionInfoList)  // 填写异常信息,如果有的话
+            .setExtendInfo(extendInfo) // 填写扩展信息,如果有的话
+        ;
+
+        MonitorHeartbeatSynResponse response = monitorService.heartbeatSyn(builder);
+        dumpResponse(response);
+    }
+
+    // POS厂商的调用样例,填写了所有pos厂商需要填写的字段
+    public void test_monitor_pos() {
+        // POS厂商使用的交易信息格式,字符串类型
+        List<PosTradeInfo> posTradeInfoList = new ArrayList<PosTradeInfo>();
+        posTradeInfoList.add(PosTradeInfo.newInstance(HbStatus.S, "1324", 7));
+        posTradeInfoList.add(PosTradeInfo.newInstance(HbStatus.X, "1326", 15));
+        posTradeInfoList.add(PosTradeInfo.newInstance(HbStatus.S, "1401", 8));
+        posTradeInfoList.add(PosTradeInfo.newInstance(HbStatus.F, "1405", 3));
+
+        // 填写异常信息,如果有的话
+        List<ExceptionInfo> exceptionInfoList = new ArrayList<ExceptionInfo>();
+        exceptionInfoList.add(ExceptionInfo.HE_PRINTER);
+
+        // 填写扩展参数,如果有的话
+        Map<String, Object> extendInfo = new HashMap<String, Object>();
+        //        extendInfo.put("SHOP_ID", "BJ_ZZ_001");
+        //        extendInfo.put("TERMINAL_ID", "1234");
+
+        AlipayHeartbeatSynRequestBuilder builder = new AlipayHeartbeatSynRequestBuilder()
+            .setProduct(Product.FP)
+            .setType(Type.SOFT_POS)
+            .setEquipmentId("soft100001")
+            .setEquipmentStatus(EquipStatus.NORMAL)
+            .setTime("2015-09-28 11:14:49")
+            .setManufacturerPid("2088000000000009")
+            // 填写机具商的支付宝pid
+            .setStoreId("store200001").setEquipmentPosition("31.2433190000,121.5090750000")
+            .setBbsPosition("2869719733-065|2896507033-091").setNetworkStatus("gggbbbgggnnn")
+            .setNetworkType("3G").setBattery("98").setWifiMac("0a:00:27:00:00:00")
+            .setWifiName("test_wifi_name").setIp("192.168.1.188")
+            .setPosTradeInfoList(posTradeInfoList) // POS厂商同步trade_info信息
+            //                .setExceptionInfoList(exceptionInfoList) // 填写异常信息,如果有的话
+            .setExtendInfo(extendInfo) // 填写扩展信息,如果有的话
+        ;
+
+        MonitorHeartbeatSynResponse response = monitorService.heartbeatSyn(builder);
+        dumpResponse(response);
+    }
+
+    // 测试当面付2.0支付
+    public void test_trade_pay(AlipayTradeService service,String outTradeNo,String authCode) {
+        // (必填) 商户网站订单系统中唯一订单号,64个字符以内,只能包含字母、数字、下划线,
+        // 需保证商户系统端不能重复,建议通过数据库sequence生成,
+//        String outTradeNo = "tradepay" + System.currentTimeMillis()
+//                            + (long) (Math.random() * 10000000L);
+
+        // (必填) 订单标题,粗略描述用户的支付目的。如“xxx品牌xxx门店消费”
+        String subject = "xxx品牌xxx门店当面付消费";
+
+        // (必填) 订单总金额,单位为元,不能超过1亿元
+        // 如果同时传入了【打折金额】,【不可打折金额】,【订单总金额】三者,则必须满足如下条件:【订单总金额】=【打折金额】+【不可打折金额】
+        String totalAmount = "1";
+
+        // (必填) 付款条码,用户支付宝钱包手机app点击“付款”产生的付款条码
+//        String authCode = "283644246383364778";//"用户自己的支付宝付款码"; // 条码示例,286648048691290423
+        // (可选,根据需要决定是否使用) 订单可打折金额,可以配合商家平台配置折扣活动,如果订单部分商品参与打折,可以将部分商品总价填写至此字段,默认全部商品可打折
+        // 如果该值未传入,但传入了【订单总金额】,【不可打折金额】 则该值默认为【订单总金额】- 【不可打折金额】
+        //        String discountableAmount = "1.00"; //
+
+        // (可选) 订单不可打折金额,可以配合商家平台配置折扣活动,如果酒水不参与打折,则将对应金额填写至此字段
+        // 如果该值未传入,但传入了【订单总金额】,【打折金额】,则该值默认为【订单总金额】-【打折金额】
+        String undiscountableAmount = "0.0";
+
+        // 卖家支付宝账号ID,用于支持一个签约账号下支持打款到不同的收款账号,(打款到sellerId对应的支付宝账号)
+        // 如果该字段为空,则默认为与支付宝签约的商户的PID,也就是appid对应的PID
+        String sellerId = "";
+
+        // 订单描述,可以对交易或商品进行一个详细地描述,比如填写"购买商品3件共20.00元"
+        String body = "购买商品3件共20.00元";
+
+        // 商户操作员编号,添加此参数可以为商户操作员做销售统计
+        String operatorId = "test_operator_id";
+
+        // (必填) 商户门店编号,通过门店号和商家后台可以配置精准到门店的折扣信息,详询支付宝技术支持
+        String storeId = "test_store_id";
+
+        // 业务扩展参数,目前可添加由支付宝分配的系统商编号(通过setSysServiceProviderId方法),详情请咨询支付宝技术支持
+        String providerId = "2088100200300400500";
+        ExtendParams extendParams = new ExtendParams();
+        extendParams.setSysServiceProviderId(providerId);
+
+        // 支付超时,线下扫码交易定义为5分钟
+        String timeoutExpress = "5m";
+
+        // 商品明细列表,需填写购买商品详细信息,
+        List<GoodsDetail> goodsDetailList = new ArrayList<GoodsDetail>();
+        // 创建一个商品信息,参数含义分别为商品id(使用国标)、名称、单价(单位为分)、数量,如果需要添加商品类别,详见GoodsDetail
+        GoodsDetail goods1 = GoodsDetail.newInstance("goods_id001", "xxx面包", 1000, 1);
+        // 创建好一个商品后添加至商品明细列表
+        goodsDetailList.add(goods1);
+
+        // 继续创建并添加第一条商品信息,用户购买的产品为“黑人牙刷”,单价为5.00元,购买了两件
+        GoodsDetail goods2 = GoodsDetail.newInstance("goods_id002", "xxx牙刷", 500, 2);
+        goodsDetailList.add(goods2);
+
+        String appAuthToken = "应用授权令牌";//根据真实值填写
+
+        // 创建条码支付请求builder,设置请求参数
+        AlipayTradePayRequestBuilder builder = new AlipayTradePayRequestBuilder()
+            //            .setAppAuthToken(appAuthToken)
+            .setOutTradeNo(outTradeNo).setSubject(subject).setAuthCode(authCode)
+            .setTotalAmount(totalAmount).setStoreId(storeId)
+            .setUndiscountableAmount(undiscountableAmount).setBody(body).setOperatorId(operatorId)
+            .setExtendParams(extendParams).setSellerId(sellerId)
+            .setGoodsDetailList(goodsDetailList).setTimeoutExpress(timeoutExpress);
+
+        // 调用tradePay方法获取当面付应答
+        AlipayF2FPayResult result = service.tradePay(builder);
+        switch (result.getTradeStatus()) {
+            case SUCCESS:
+                log.info("支付宝支付成功: )");
+                break;
+
+            case FAILED:
+                log.error("支付宝支付失败!!!");
+                break;
+
+            case UNKNOWN:
+                log.error("系统异常,订单状态未知!!!");
+                break;
+
+            default:
+                log.error("不支持的交易状态,交易返回异常!!!");
+                break;
+        }
+    }
+
+    // 测试当面付2.0查询订单
+    public void test_trade_query() {
+        // (必填) 商户订单号,通过此商户订单号查询当面付的交易状态
+        String outTradeNo = "tradepay14817938139942440181";
+
+        // 创建查询请求builder,设置请求参数
+        AlipayTradeQueryRequestBuilder builder = new AlipayTradeQueryRequestBuilder()
+            .setOutTradeNo(outTradeNo);
+
+        AlipayF2FQueryResult result = tradeService.queryTradeResult(builder);
+        switch (result.getTradeStatus()) {
+            case SUCCESS:
+                log.info("查询返回该订单支付成功: )");
+
+                AlipayTradeQueryResponse response = result.getResponse();
+                dumpResponse(response);
+
+                log.info(response.getTradeStatus());
+                if (Utils.isListNotEmpty(response.getFundBillList())) {
+                    for (TradeFundBill bill : response.getFundBillList()) {
+                        log.info(bill.getFundChannel() + ":" + bill.getAmount());
+                    }
+                }
+                break;
+
+            case FAILED:
+                log.error("查询返回该订单支付失败或被关闭!!!");
+                break;
+
+            case UNKNOWN:
+                log.error("系统异常,订单支付状态未知!!!");
+                break;
+
+            default:
+                log.error("不支持的交易状态,交易返回异常!!!");
+                break;
+        }
+    }
+
+    // 测试当面付2.0退款
+    public void test_trade_refund() {
+        // (必填) 外部订单号,需要退款交易的商户外部订单号
+        String outTradeNo = "tradepay14817938139942440181";
+
+        // (必填) 退款金额,该金额必须小于等于订单的支付金额,单位为元
+        String refundAmount = "0.01";
+
+        // (可选,需要支持重复退货时必填) 商户退款请求号,相同支付宝交易号下的不同退款请求号对应同一笔交易的不同退款申请,
+        // 对于相同支付宝交易号下多笔相同商户退款请求号的退款交易,支付宝只会进行一次退款
+        String outRequestNo = "";
+
+        // (必填) 退款原因,可以说明用户退款原因,方便为商家后台提供统计
+        String refundReason = "正常退款,用户买多了";
+
+        // (必填) 商户门店编号,退款情况下可以为商家后台提供退款权限判定和统计等作用,详询支付宝技术支持
+        String storeId = "test_store_id";
+
+        // 创建退款请求builder,设置请求参数
+        AlipayTradeRefundRequestBuilder builder = new AlipayTradeRefundRequestBuilder()
+            .setOutTradeNo(outTradeNo).setRefundAmount(refundAmount).setRefundReason(refundReason)
+            .setOutRequestNo(outRequestNo).setStoreId(storeId);
+
+        AlipayF2FRefundResult result = tradeService.tradeRefund(builder);
+        switch (result.getTradeStatus()) {
+            case SUCCESS:
+                log.info("支付宝退款成功: )");
+                break;
+
+            case FAILED:
+                log.error("支付宝退款失败!!!");
+                break;
+
+            case UNKNOWN:
+                log.error("系统异常,订单退款状态未知!!!");
+                break;
+
+            default:
+                log.error("不支持的交易状态,交易返回异常!!!");
+                break;
+        }
+    }
+
+    // 测试当面付2.0生成支付二维码
+    public void test_trade_precreate() {
+        // (必填) 商户网站订单系统中唯一订单号,64个字符以内,只能包含字母、数字、下划线,
+        // 需保证商户系统端不能重复,建议通过数据库sequence生成,
+        String outTradeNo = "tradeprecreate" + System.currentTimeMillis()
+                            + (long) (Math.random() * 10000000L);
+
+        // (必填) 订单标题,粗略描述用户的支付目的。如“xxx品牌xxx门店当面付扫码消费”
+        String subject = "xxx品牌xxx门店当面付扫码消费";
+
+        // (必填) 订单总金额,单位为元,不能超过1亿元
+        // 如果同时传入了【打折金额】,【不可打折金额】,【订单总金额】三者,则必须满足如下条件:【订单总金额】=【打折金额】+【不可打折金额】
+        String totalAmount = "0.01";
+
+        // (可选) 订单不可打折金额,可以配合商家平台配置折扣活动,如果酒水不参与打折,则将对应金额填写至此字段
+        // 如果该值未传入,但传入了【订单总金额】,【打折金额】,则该值默认为【订单总金额】-【打折金额】
+        String undiscountableAmount = "0";
+
+        // 卖家支付宝账号ID,用于支持一个签约账号下支持打款到不同的收款账号,(打款到sellerId对应的支付宝账号)
+        // 如果该字段为空,则默认为与支付宝签约的商户的PID,也就是appid对应的PID
+        String sellerId = "";
+
+        // 订单描述,可以对交易或商品进行一个详细地描述,比如填写"购买商品2件共15.00元"
+        String body = "购买商品3件共20.00元";
+
+        // 商户操作员编号,添加此参数可以为商户操作员做销售统计
+        String operatorId = "test_operator_id";
+
+        // (必填) 商户门店编号,通过门店号和商家后台可以配置精准到门店的折扣信息,详询支付宝技术支持
+        String storeId = "test_store_id";
+
+        // 业务扩展参数,目前可添加由支付宝分配的系统商编号(通过setSysServiceProviderId方法),详情请咨询支付宝技术支持
+        ExtendParams extendParams = new ExtendParams();
+        extendParams.setSysServiceProviderId("2088100200300400500");
+
+        // 支付超时,定义为120分钟
+        String timeoutExpress = "120m";
+
+        // 商品明细列表,需填写购买商品详细信息,
+        List<GoodsDetail> goodsDetailList = new ArrayList<GoodsDetail>();
+        // 创建一个商品信息,参数含义分别为商品id(使用国标)、名称、单价(单位为分)、数量,如果需要添加商品类别,详见GoodsDetail
+        GoodsDetail goods1 = GoodsDetail.newInstance("goods_id001", "xxx小面包", 1000, 1);
+        // 创建好一个商品后添加至商品明细列表
+        goodsDetailList.add(goods1);
+
+        // 继续创建并添加第一条商品信息,用户购买的产品为“黑人牙刷”,单价为5.00元,购买了两件
+        GoodsDetail goods2 = GoodsDetail.newInstance("goods_id002", "xxx牙刷", 500, 2);
+        goodsDetailList.add(goods2);
+
+        // 创建扫码支付请求builder,设置请求参数
+        AlipayTradePrecreateRequestBuilder builder = new AlipayTradePrecreateRequestBuilder()
+            .setSubject(subject).setTotalAmount(totalAmount).setOutTradeNo(outTradeNo)
+            .setUndiscountableAmount(undiscountableAmount).setSellerId(sellerId).setBody(body)
+            .setOperatorId(operatorId).setStoreId(storeId).setExtendParams(extendParams)
+            .setTimeoutExpress(timeoutExpress)
+            //                .setNotifyUrl("http://www.test-notify-url.com")//支付宝服务器主动通知商户服务器里指定的页面http路径,根据需要设置
+            .setGoodsDetailList(goodsDetailList);
+
+        AlipayF2FPrecreateResult result = tradeService.tradePrecreate(builder);
+        switch (result.getTradeStatus()) {
+            case SUCCESS:
+                log.info("支付宝预下单成功: )");
+
+                AlipayTradePrecreateResponse response = result.getResponse();
+                dumpResponse(response);
+
+                // 需要修改为运行机器上的路径
+                String filePath = String.format("/Users/sudo/Desktop/qr-%s.png",
+                    response.getOutTradeNo());
+                log.info("filePath:" + filePath);
+                //                ZxingUtils.getQRCodeImge(response.getQrCode(), 256, filePath);
+                break;
+
+            case FAILED:
+                log.error("支付宝预下单失败!!!");
+                break;
+
+            case UNKNOWN:
+                log.error("系统异常,预下单状态未知!!!");
+                break;
+
+            default:
+                log.error("不支持的交易状态,交易返回异常!!!");
+                break;
+        }
+    }
+}

+ 55 - 0
kmall-manager/src/main/java/com/kmall/manager/manager/pay/alipay/DemoHbRunner.java

@@ -0,0 +1,55 @@
+package com.kmall.manager.manager.pay.alipay;
+
+import com.alipay.demo.trade.model.builder.AlipayHeartbeatSynRequestBuilder;
+import com.alipay.demo.trade.model.hb.*;
+import com.alipay.demo.trade.service.AlipayMonitorService;
+import com.alipay.demo.trade.service.impl.hb.AbsHbRunner;
+import com.alipay.demo.trade.service.impl.hb.HbQueue;
+import com.alipay.demo.trade.utils.Utils;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * Created by liuyangkly on 15/10/23.
+ 执行调度,主要任务由两个线程完成,交易线程(调用当面付2.0接口)和交易保障线程(轮询),具体需要做的事情
+ 1.当面付程序每执行完一笔交易后将交易结果保存在临时队列
+ 2.轮询线程读取临时队列,获取基础采集信息和最多30条trade_info信息,调用支付宝monitor.heartbeat.syn接口
+ 示例代码仅封装了如何调用该接口api,采集数据,比如采集网络信息、交易耗时、异常信息等,需要系统商开发者自行完成。
+ */
+public class DemoHbRunner
+        extends AbsHbRunner {
+
+    public DemoHbRunner(AlipayMonitorService monitorService) {
+        super(monitorService);
+    }
+
+    @Override
+    public String getAppAuthToken() {
+        // 对于系统商,如果是为了商户开发监控保障接口,则需要传此值,否则如果为系统商自己做交易保障接口开发,则可不传。
+        return null;
+    }
+
+    @Override
+    public AlipayHeartbeatSynRequestBuilder getBuilder() {
+        // 系统商使用的交易信息格式,json字符串类型,从交易队列中获取
+        List<SysTradeInfo> sysTradeInfoList = HbQueue.poll();
+
+        // 异常信息的采集,系统商自行完成
+        List<ExceptionInfo> exceptionInfoList = new ArrayList<ExceptionInfo>();
+        //        exceptionInfoList.add(ExceptionInfo.HE_SCANER);
+        //        exceptionInfoList.add(ExceptionInfo.HE_PRINTER);
+        //        exceptionInfoList.add(ExceptionInfo.HE_OTHER);
+
+        AlipayHeartbeatSynRequestBuilder builder = new AlipayHeartbeatSynRequestBuilder()
+            .setProduct(Product.FP).setType(Type.CR).setEquipmentId("cr1000001")
+            .setEquipmentStatus(EquipStatus.NORMAL).setTime(Utils.toDate(new Date()))
+            .setStoreId("store10001").setMac("0a:00:27:00:00:00").setNetworkType("LAN")
+            .setProviderId("2088911212323549") // 设置系统商pid
+            .setSysTradeInfoList(sysTradeInfoList) // 系统商同步trade_info信息
+            .setExceptionInfoList(exceptionInfoList) // 填写异常信息,如果有的话
+        ;
+        return builder;
+    }
+}

+ 58 - 0
kmall-manager/src/main/resources/conf/alipay.properties

@@ -0,0 +1,58 @@
+#
+## \u6C99\u7BB1 \u652F\u4ED8\u5B9D\u7F51\u5173\u540D\u3001partnerId\u548CappId
+#open_api_domain=https://openapi.alipaydev.com/gateway.do
+#mcloud_api_domain=http://mcloudmonitor.com/gateway.do
+#pid=2088102176590386
+#appid=2017103009619232
+## RSA\u79C1\u94A5\u3001\u516C\u94A5\u548C\u652F\u4ED8\u5B9D\u516C\u94A5
+## \u4E2D\u7F51RSA2 \u79C1\u94A5 -- hhq
+#private_key=MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQCAw4hQJytraRr7yJUYkVh38rHuciupGZZwVUbwWFMw5AT/Ms0+UgwleeOc6KHDbwanGD4ZYwBjEGQGisj6Bxgu+2M2voS50J+YM+MAL/X7AF+kIbmuHBZjIzuvWEDOZnt+ZXks+gsXZKh0wc9wZpwb/jG8uHmBAhWcCvPz+dx5TSh6KcWuFLR2rf76mwRkCMx+xtHw9Dh+02Fuhx7tb1Wp4lQZzQ3X+pyRVYvjdoPOSuAUY0NwZ7YK1kBzfYaTcK31kp+quqr6zdJTeNDIswt7VJb2gKHkahJmTAcFZza4AbPEDXmDQ0gDoy6I3wOs3OUFHDEjN1+ZMj/D99MEuKThAgMBAAECggEAGjy9h+eTV12hW/CxQMJNDpPrYbTt5JUMLHOT8uFsgifURNPrMmmxg+lkUdKtM49qAZ5U+QNNTuJGH3ckIJ5VdS1QOBV2Ig66ll7sQFuFedHHq0Ab/7hFb4n8XWxUODp1q3mtyVZh8DBYiwH67OJbqPCQ3e2RBJKSKKuqreoZ3LVsCsks4l7hpxgw0KbFqGhVaTOhYlUdGwJ10PPtWwnIDAMIM87uvf2Q9wxPGtGVO3CmvwGS8vZNkyXcO37DLPM/RTsq+KU3melfAh9asm15aW5CGlXgiVzzGv9syoNl+ENS7ezO0oIzpKROPLRhmD9gxVj1JGqo7ggIErYr/slCqQKBgQDBCFfVZgkbohPbcMtcTwgCU1XLBMIYgfPeDkOUGLalXO6mkManGQk8ywhKEP2M035XmX5PmApSqusVZbFc/gZlXFTHZqLDu0LR2nhJPL0TsgAJhBuywOAbI8/7UbwqL3sG99vm1NSVVAs8MJwQVMa7kALKpnS4SWRA1a5gXWaTtwKBgQCqxERuDBXLjjY5mznHABG9X3Mf4hB5AyGFEwMzbyx+p0zG+i9DCHljXeoRL0gn/2btUoP9dVhulKXSbD/mVv0V3WcYadEfNCzvTkih5BBtDYtjc9oCcE59myf4CMfVXiKLfnt6sXrjK6okPq0vwbwKxWO7uv2sF0+CHjU6lND8JwKBgCDAuaaL2Z/GsHfbe6X+Au3iFfyMoiJmamqTIQRP7S3BxvycNBjGNrsJ+C4ZE+yBNj7G3JfExHuiZKEM0DtnHs60C+6Ji7SKYZwZ5a8Hj014Nmlm8QwzjdMNEI0kITlHNSjJhZZ1JlzwFbfwx4o92DqbBN49wDBEw638k8nmDzGhAoGAXz09SP72fOOgvHolPCZ+vlZot8R2GXe0jypuY5ZCg5S9DlBkYYdtZAzxyYnMPXqFJiEaOhbjLjE7VmNHNCkZ18L2h7gkiLmpwgGwIpI20wt1zQ7E7Q1DyWvqW7xR718j9xaguWoYtnAY4UQPhQ4Q2RUDraT5a6xIjLJaT4TGFYsCgYBNH5GsYBzoo+U6N0bnia1r5mBQZtVHPE1pkChhvlGJPu1U5iMDttGb2Xsmyk7n9QyRdcCmvyd0TnFaUCokPs4OjBqpi3X5yWuldbVKDQ/swsyIpUIEVm7idlv8dbladu3QFxw17LBvSglsB/jJZEMc1JlgizNIiQRngA96mfmLIw==
+## \u4E2D\u7F51RSA2 \u516C\u94A5 -- hhq
+#public_key=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAgMOIUCcra2ka+8iVGJFYd/Kx7nIrqRmWcFVG8FhTMOQE/zLNPlIMJXnjnOihw28Gpxg+GWMAYxBkBorI+gcYLvtjNr6EudCfmDPjAC/1+wBfpCG5rhwWYyM7r1hAzmZ7fmV5LPoLF2SodMHPcGacG/4xvLh5gQIVnArz8/nceU0oeinFrhS0dq3++psEZAjMfsbR8PQ4ftNhboce7W9VqeJUGc0N1/qckVWL43aDzkrgFGNDcGe2CtZAc32Gk3Ct9ZKfqrqq+s3SU3jQyLMLe1SW9oCh5GoSZkwHBWc2uAGzxA15g0NIA6MuiN8DrNzlBRwxIzdfmTI/w/fTBLik4QIDAQAB
+##SHA1withRsa\u5BF9\u5E94\u652F\u4ED8\u5B9D\u516C\u94A5
+##alipay_public_key = MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDDI6d306Q8fIfCOaTXyiUeJHkrIvYISRcc73s3vF1ZT7XN8RNPwJxo8pWaJMmvyTn9N4HQ632qJBVHf8sxHi/fEsraprwCtzvzQETrNRwVxLO5jVmRGi60j8Ue1efIlzPXV9je9mkjzOmdssymZkh2QhUrCmZYI/FCEa3/cNMW0QIDAQAB
+##SHA256withRsa\u5BF9\u5E94\u652F\u4ED8\u5B9D\u516C\u94A5
+#alipay_public_key=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAtr0hvHSwFmRHx/NAaKgqVZ2zDLrCoJiMKOYeL1BtKXhT6IbgnXERgxXgW1T+XC1ZdkagQa7nhw8ckEGTwfvhbJXryA+9hpePjeouFf+IOU7Qlk/ndjT7mmSAi/rP8FsJJ8p1/NcxcRRtFC0zUolC8ZgcfTcJgJb1dnAlZWOCB7+JQrxQbk1Gn7m2oAOl8gBQSFfmtEBBosZwq2PWM4psHoQ5yrfMJHmCrWGSEu3UVAZwNNMJ4hclgMGiVxRvzUPX80IuOOlHTZOaF01EjTPsKxF9SvXqSlnMGot3rTmlAP/RYplhwHSKi5JBxPYu4AiTMLgfzPbg61pmNeELO11QpwIDAQAB
+## \u7B7E\u540D\u7C7B\u578B: RSA->SHA1withRsa,RSA2->SHA256withRsa
+#sign_type=RSA2
+## \u5F53\u9762\u4ED8\u6700\u5927\u67E5\u8BE2\u6B21\u6570\u548C\u67E5\u8BE2\u95F4\u9694\uFF08\u6BEB\u79D2\uFF09
+#max_query_retry=5
+#query_duration=5000
+## \u5F53\u9762\u4ED8\u6700\u5927\u64A4\u9500\u6B21\u6570\u548C\u64A4\u9500\u95F4\u9694\uFF08\u6BEB\u79D2\uFF09
+#max_cancel_retry=3
+#cancel_duration=2000
+## \u4EA4\u6613\u4FDD\u969C\u7EBF\u7A0B\u7B2C\u4E00\u6B21\u8C03\u5EA6\u5EF6\u8FDF\u548C\u8C03\u5EA6\u95F4\u9694\uFF08\u79D2\uFF09
+#heartbeat_delay=5
+#heartbeat_duration=900
+
+
+
+# \u652F\u4ED8\u5B9D\u7F51\u5173\u540D\u3001partnerId\u548CappId
+open_api_domain = https://openapi.alipay.com/gateway.do
+mcloud_api_domain = http://mcloudmonitor.com/gateway.do
+pid = 2088821582509154
+appid = 2017103009619232
+
+# RSA\u79C1\u94A5\u3001\u516C\u94A5\u548C\u652F\u4ED8\u5B9D\u516C\u94A5
+private_key = MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQC1DOjdI/nVtDq3NRU8mZ08uTzDWcGYFCV1c+pH8q0MjdA518xsQv5ecuyf1jNwMJ7YcartUeanLHF/mys4hbTCyeOXwC9rX9Dd6xGSC6K/jCMiKu4ZDIRWpA93a35Lu9qRZKkD7h+cWuCMfu6s+qM8ikDN1MU2y7846AKL39XtDEpOzHKuctvxysXfz2MkI4rsKLyy8TmkG+q5hAU1C+Rs+nDp3D2C5dC9Aku7hRCW68rQo3yzuvn0EZ37BxIQO4pTCSbyI0N0C7gv5yjr+jFRnguXcNO/Qf0Vyfu9EUDPabQHwckoqD3ZAysS38oqvC3N1NlLI/+FEks4uR1cZAubAgMBAAECggEBAJjbwW+UBEdt13T/GGMFvz+ZlbfJfC4ONGIp78+3EGvc/8UWcb2mAmVz2lxI2T0Lj9Fmhs2/rGHQoDMAq0kZejhLhCCHXoHlb88tvLP1pv7aLn+Wh1gWvVT5RyWoWAVRIYRH3Hs4/O9hutxj/teE9XUTtQsTbT6KX3SITj4SSefMYREqMGro2qwL8yBj3d/wspi4iFQM8IbQdXWUlCbq9Y+hS3pDKxZn7MRqL2gcASbPvI9JRl2m5eqWRVG/2SdYvyFIuzas7l0ytuR/86bxw/rsmTNPZfcW7Y/MN9/+PGLJY0lDKD4QLnp/vG7hjXEgVqFuys7rCCWX0fgJiBNO22ECgYEA2dXkwG9U3COC3Bh/snJ9yRNeUkeZo8W3EfdRgKJqmid8dBR1hvV8dDgOTVsk5I7J4uktBruUN1i1FJwxU9mDuoWE1wbEnirdqyGVi4v9bLgmckTF5pr6y/q5PzVMcNgf64iu28PHv8cWdiltnBG622mFcJG/9KaaMlRaVFY/19UCgYEA1MUsdYDT6RgcDoMoGCoc2mX7Bv/2M6M0p5PURl/2o8Z4EdcqZO57ieCL5UVlXdHUkfuui9lVELv8zZXP7+OKiI/fV9yG37gtPH3c1pVj9wuAWhY0S0ENMIT4PELSiturGWA7GRBM5p6CDxA1N+ANcdg6ZzLgk6p8D0T1NI+q/a8CgYAK6YcbCLi0imbcxbFn7ApXD0xTTNjqdlYUZVJE4l36uO2oFvpIN3XzkHdO8rjnZivA3TNvOehT2XLAxI5ICAZsSpH7/4/L6JPQJc+K/QlF7/elE8LiKXNU0ouDGhVpNbprnx47ThRsi/mZE7w07EJzCVcw62w1Qj9JNCaOQP/TvQKBgQCtLnwcfCp/3JbhnRGicYygm0cykF51805lY+bxDST0cxPB+a9RDefR9soHaG+0aJkr5X5R6CjcARcowtrIOB3HP8ubeSzypbd0OEHrCxedumfTa6VO53jz2Bcw/XbffSML+Y7AvMrLH5Ne7WNTwnNPCZ+n5fpzVt25k/g9uv6DkwKBgQCbJFdWeLM3Ve7ci38bh53Elp+BLSQjViRvj59xb8Ymm3H1UbwyLPQQ48lJXAVDo1AZe1MXEr40mbqGrKnjaTv3T2r4Vj7UT4y3O0attE6t3gWv8AXR6nidj60RQhynnv4oFEBDUWuIIjez4xSMH9og8ZYHBWOis1isQ8vu4fVRtQ==
+public_key = MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAtQzo3SP51bQ6tzUVPJmdPLk8w1nBmBQldXPqR/KtDI3QOdfMbEL+XnLsn9YzcDCe2HGq7VHmpyxxf5srOIW0wsnjl8Ava1/Q3esRkguiv4wjIiruGQyEVqQPd2t+S7vakWSpA+4fnFrgjH7urPqjPIpAzdTFNsu/OOgCi9/V7QxKTsxyrnLb8crF389jJCOK7Ci8svE5pBvquYQFNQvkbPpw6dw9guXQvQJLu4UQluvK0KN8s7r59BGd+wcSEDuKUwkm8iNDdAu4L+co6/oxUZ4Ll3DTv0H9Fcn7vRFAz2m0B8HJKKg92QMrEt/KKrwtzdTZSyP/hRJLOLkdXGQLmwIDAQAB
+
+#SHA1withRsa\u5BF9\u5E94\u652F\u4ED8\u5B9D\u516C\u94A5
+#alipay_public_key = MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDDI6d306Q8fIfCOaTXyiUeJHkrIvYISRcc73s3vF1ZT7XN8RNPwJxo8pWaJMmvyTn9N4HQ632qJBVHf8sxHi/fEsraprwCtzvzQETrNRwVxLO5jVmRGi60j8Ue1efIlzPXV9je9mkjzOmdssymZkh2QhUrCmZYI/FCEa3/cNMW0QIDAQAB
+
+#SHA256withRsa\u5BF9\u5E94\u652F\u4ED8\u5B9D\u516C\u94A5
+alipay_public_key = MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAqxh6qHdB39ZB77asmE+kxMJbw7qWN0QlL5g8X++Idg/WmXR0RcEnKjTr3T43jB2Vb1jkMFOWhvf/LtiWxIfjVnlMvNdDiCHDPUPu/HGbAM4EvMKDMjdiSPAkP8Phm7hbGh/Oqy9tovoqM367ELocw/xi+1qvu76uflAIlrtXLvJLfbA7OJ/f5fHZAuKoraeuIPEsfjIocHH+OXpcyjdw02IpauOnOvUnfd6gXMqcbU1KfjI3Nd36W8VQhgvdGIJy818VhwgpwD3ZMm40Fq1Uf9gGox6yvDdFJ2n9FjxypiIUaNgSnclnbWKUW9aIVPCTtPxWeTKx+9wciRrQeeVOLwIDAQAB
+
+# \u7B7E\u540D\u7C7B\u578B: RSA->SHA1withRsa,RSA2->SHA256withRsa
+sign_type = RSA2
+# \u5F53\u9762\u4ED8\u6700\u5927\u67E5\u8BE2\u6B21\u6570\u548C\u67E5\u8BE2\u95F4\u9694\uFF08\u6BEB\u79D2\uFF09
+max_query_retry = 5
+query_duration = 5000
+
+# \u5F53\u9762\u4ED8\u6700\u5927\u64A4\u9500\u6B21\u6570\u548C\u64A4\u9500\u95F4\u9694\uFF08\u6BEB\u79D2\uFF09
+max_cancel_retry = 3
+cancel_duration = 2000
+
+# \u4EA4\u6613\u4FDD\u969C\u7EBF\u7A0B\u7B2C\u4E00\u6B21\u8C03\u5EA6\u5EF6\u8FDF\u548C\u8C03\u5EA6\u95F4\u9694\uFF08\u79D2\uFF09
+heartbeat_delay = 5
+heartbeat_duration = 900

+ 22 - 22
kmall-manager/src/main/resources/conf/cus.properties

@@ -1,40 +1,40 @@
-########## 海关 配置 ##########
+########## \u6D77\u5173 \u914D\u7F6E ##########
 
 # [dev, prod]
 cus.env = dev
 
-# 开发环境
-# 企业返回海关实时数据接口地址
+# \u5F00\u53D1\u73AF\u5883
+# \u4F01\u4E1A\u8FD4\u56DE\u6D77\u5173\u5B9E\u65F6\u6570\u636E\u63A5\u53E3\u5730\u5740
 cus.dev.payDateUrl=https://swapptest.singlewindow.cn/ceb2grab/grab/realTimeDataUpload
-# 电商平台代码, 中网科技(深圳)有限公司
+# \u7535\u5546\u5E73\u53F0\u4EE3\u7801, \u4E2D\u7F51\u79D1\u6280\uFF08\u6DF1\u5733\uFF09\u6709\u9650\u516C\u53F8
 cus.dev.ebpCode=4403160Z3Y
-# 支付企业代码, 财付通支付科技有限公司
+# \u652F\u4ED8\u4F01\u4E1A\u4EE3\u7801, \u8D22\u4ED8\u901A\u652F\u4ED8\u79D1\u6280\u6709\u9650\u516C\u53F8
 cus.dev.payCode=440316T004
-# 收款账号
+# \u6536\u6B3E\u8D26\u53F7
 cus.dev.recpAccount=20000032506200012146872
-# 收款企业代码(境内企业为统一社会信用代码;境外企业可不填写)
+# \u6536\u6B3E\u4F01\u4E1A\u4EE3\u7801\uFF08\u5883\u5185\u4F01\u4E1A\u4E3A\u7EDF\u4E00\u793E\u4F1A\u4FE1\u7528\u4EE3\u7801\uFF1B\u5883\u5916\u4F01\u4E1A\u53EF\u4E0D\u586B\u5199\uFF09
 cus.dev.recpCode=91440300MA5DGG1J0R
-# 收款企业名称
-cus.dev.recpName=中网科技(深圳)有限公司
-# 商品展示链接地址
+# \u6536\u6B3E\u4F01\u4E1A\u540D\u79F0
+cus.dev.recpName=\u4E2D\u7F51\u79D1\u6280\uFF08\u6DF1\u5733\uFF09\u6709\u9650\u516C\u53F8
+# \u5546\u54C1\u5C55\u793A\u94FE\u63A5\u5730\u5740
 cus.dev.itemLink=http://qhdswl.f3322.net:9002/api/goods/detail
-# 定时器请求地址
+# \u5B9A\u65F6\u5668\u8BF7\u6C42\u5730\u5740
 cus.dev.sendUrl=http://qhdswl.f3322.net:9002/cus/send
 
-# 生产环境
-# 企业返回海关实时数据接口地址
+# \u751F\u4EA7\u73AF\u5883
+# \u4F01\u4E1A\u8FD4\u56DE\u6D77\u5173\u5B9E\u65F6\u6570\u636E\u63A5\u53E3\u5730\u5740
 cus.prod.payDateUrl=https://customs.chinaport.gov.cn/ceb2grab/grab/realTimeDataUpload
-#电商平台代码, 中网科技(深圳)有限公司
+#\u7535\u5546\u5E73\u53F0\u4EE3\u7801, \u4E2D\u7F51\u79D1\u6280\uFF08\u6DF1\u5733\uFF09\u6709\u9650\u516C\u53F8
 cus.prod.ebpCode=4403160Z3Y
-#支付企业代码, 财付通支付科技有限公司
+#\u652F\u4ED8\u4F01\u4E1A\u4EE3\u7801, \u8D22\u4ED8\u901A\u652F\u4ED8\u79D1\u6280\u6709\u9650\u516C\u53F8
 cus.prod.payCode=440316T004
-# 收款账号
+# \u6536\u6B3E\u8D26\u53F7
 cus.prod.recpAccount=20000032506200012146872
-# 收款企业代码(境内企业为统一社会信用代码;境外企业可不填写)
+# \u6536\u6B3E\u4F01\u4E1A\u4EE3\u7801\uFF08\u5883\u5185\u4F01\u4E1A\u4E3A\u7EDF\u4E00\u793E\u4F1A\u4FE1\u7528\u4EE3\u7801\uFF1B\u5883\u5916\u4F01\u4E1A\u53EF\u4E0D\u586B\u5199\uFF09
 cus.prod.recpCode=91440300MA5DGG1J0R
-# 收款企业名称
-cus.prod.recpName=中网科技(深圳)有限公司
-# 商品展示链接地址
+# \u6536\u6B3E\u4F01\u4E1A\u540D\u79F0
+cus.prod.recpName=\u4E2D\u7F51\u79D1\u6280\uFF08\u6DF1\u5733\uFF09\u6709\u9650\u516C\u53F8
+# \u5546\u54C1\u5C55\u793A\u94FE\u63A5\u5730\u5740
 cus.prod.itemLink=https://mp.k1net.cn/api/goods/detail
-# 定时器请求地址
-cus.prod.sendUrl=https://mp.k1net.cn/cus/send
+# \u5B9A\u65F6\u5668\u8BF7\u6C42\u5730\u5740
+cus.prod.sendUrl=https://mp.k1net.cn/cus/send

+ 7 - 7
kmall-manager/src/main/resources/conf/db.properties

@@ -1,7 +1,7 @@
 ########## \u6570\u636E\u5E93\u914D\u7F6E ##########
 
 #========== \u5F00\u53D1\u73AF\u5883 ==========
-jdbc.url=jdbc:mysql://120.76.84.45:3306/kmall_pt?allowMultiQueries=true&useUnicode=true&characterEncoding=UTF-8
+jdbc.url=jdbc:mysql://120.76.84.45:3306/kmall_pt_general?allowMultiQueries=true&useUnicode=true&characterEncoding=UTF-8
 jdbc.username=tuser
 jdbc.password=Qq!123
 #jdbc.url=jdbc:mysql://127.0.0.1:3306/kmall_pt?serverTimezone=GMT%2B8&allowMultiQueries=true&useUnicode=true&characterEncoding=UTF-8
@@ -27,12 +27,12 @@ jdbc.validationTimeout=4000
 
 
 ####========== \u751F\u4EA7\u73AF\u5883 ==========
-##\u963F\u91CC\u4E91\u5185\u7F51\u5730\u5740
-####jdbc.url=jdbc:mysql://rm-wz9rps8173a1nx63g819.mysql.rds.aliyuncs.com:3306/kmall_pt?allowMultiQueries=true&useUnicode=true&characterEncoding=UTF-8
-##\u963F\u91CC\u4E91\u5916\u7F51\u5730\u5740
-#jdbc.url=jdbc:mysql://out-rm-wz9rps8173a1nx63gio.mysql.rds.aliyuncs.com:3306/kmall_pt?allowMultiQueries=true&useUnicode=true&characterEncoding=UTF-8
-#jdbc.username=kmall_pt
-#jdbc.password=AFnwRBu!3q
+#\u963F\u91CC\u4E91\u5185\u7F51\u5730\u5740
+###jdbc.url=jdbc:mysql://rm-wz9rps8173a1nx63g819.mysql.rds.aliyuncs.com:3306/kmall_pt?allowMultiQueries=true&useUnicode=true&characterEncoding=UTF-8
+#\u963F\u91CC\u4E91\u5916\u7F51\u5730\u5740
+#jdbc.url=jdbc:mysql://out-rm-wz9rps8173a1nx63gio.mysql.rds.aliyuncs.com:3306/kmall_cw?allowMultiQueries=true&useUnicode=true&characterEncoding=UTF-8
+#jdbc.username=kmall_cw
+#jdbc.password=eb6zHJg%x3
 #
 #jdbc.initialSize=5
 #jdbc.maxActive=30

+ 30 - 30
kmall-manager/src/main/resources/conf/pingan-pay.properties

@@ -1,62 +1,62 @@
-########## 平安支付配置 ##########
+########## \u5E73\u5B89\u652F\u4ED8\u914D\u7F6E ##########
 
 # [dev, prod]
 pay.pingan.env = dev
 
 
-#========== 开发环境 ==========
-#平安支付open_id
+#========== \u5F00\u53D1\u73AF\u5883 ==========
+#\u5E73\u5B89\u652F\u4ED8open_id
 pingan.dev.payOpenId=6ad8a69d33b5bf188f7c0ab7bae95931
-#平安支付open_key
+#\u5E73\u5B89\u652F\u4ED8open_key
 pingan.dev.payOpenKey=ac1705d3ace4b6b69044494d0e28310e
-#平安退款公钥
+#\u5E73\u5B89\u9000\u6B3E\u516C\u94A5
 pingan.dev.payPublicKey=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC7q4B8d6EIMUo8AK2sdgxbmdrFyklVW+4+y2KI+jeHgAwA9SwBn3KVIUa1aVrBcZzQh0RhSCy8r+vfh67/KVTU+Oaav0ZH3B/Wem5DkLMrkz8IMm17NsUFhXZCCyC5KXIbzciueHdYTObbV4r4oDazf52708jSIVKDSYkjcTEoiQIDAQAB
-#平安取消交易私钥
+#\u5E73\u5B89\u53D6\u6D88\u4EA4\u6613\u79C1\u94A5
 pingan.dev.payPrivateKey=MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBALurgHx3oQgxSjwArax2DFuZ2sXKSVVb7j7LYoj6N4eADAD1LAGfcpUhRrVpWsFxnNCHRGFILLyv69+Hrv8pVNT45pq/RkfcH9Z6bkOQsyuTPwgybXs2xQWFdkILILkpchvNyK54d1hM5ttXivigNrN/nbvTyNIhUoNJiSNxMSiJAgMBAAECgYAB3H+XvHACbsq3saIHVdxlhC8hSxJTIGhKgyXlCeZHF8QGtmfLVFOEmyHiZrsZtBDEGLNa66ZV8MC8JNJdgYFv3vZeYpLDgmAPmiKadEiCu4pg/QwpfeHGEDZfaxWfjWfNwyLv6RmXv310hP8WEMC9xv2Cx9DXIAcXg0SlNy4CoQJBAOLsicAop3i7LT+oGw6GoPTaHyTk20yJVXn/VMKXMLIT4371bcANrj1zj2EWjLUPOqYAApWxYDahg4hLIcD1e40CQQDTt16bagAJw/sShVXYcKuuf3vKIG/ZMXgfxddxFkd4aMmpImW6LwqFIV96J5jhYlcVwtXdWtDiuqHgsAgPD6PtAkBRxIfybPPDpjaszGdLeal/8STtx2VaE9ZwClhBcfdDA7Wi5s7wOD3DuOM+ScDT8TPh4vkLdYnExbg+oUv9Wrd1AkEAvC6k/Ob/Ga8FH7U8VKHxN61Azqx+PkNmTnd/w5jV9gTOGnPkj9T4ONUtFFrV3J+YYFNJ3PK38I+LCzfsMdbpEQJAWoJ7g9IMMu6yx4JyCzE15OdOcJDytqZ6gIiXvtkqEGywyxNdEyUOu/+BkAQElTdUCCWuVBllm09K/y95I6zG8A==
-#平安进件open_id
+#\u5E73\u5B89\u8FDB\u4EF6open_id
 pingan.dev.pluginOpenId=txafCXQt058248b3230c9081ff90ce80
-#平安进件open_key
+#\u5E73\u5B89\u8FDB\u4EF6open_key
 pingan.dev.pluginOpenKey=aG0ck19g2HdthGRdSCfmiloOoGXoOzWZ
-#平安进件公钥
+#\u5E73\u5B89\u8FDB\u4EF6\u516C\u94A5
 pingan.dev.pluginPublicKey=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuyohp+CrDTaz6tW2uMrWxs2lFwEbRCsPg69gObtjirgMuGtcB+vhzCFn6rN8IvohvpGkO8vjZw6qrmlbNrauaUuW5j82eyZ749ZfTggFjIqteL9MeF88sAY3rw0AItcUUP3XaYamedKGrdeellfbgvyaJJ+m2evY/yP9FRTVEKgmbi0UvNMvCqqiWty3H3WURFjjj2J+/4b5zI8od4rSTsHetD8psOViMbHuYoqhl583UW/6veu1+ZvKPkJ8ZneP/jGCWe3BNWUMH3Y9+rPSOn+pnWmV3R926qKReeZBdMfK9ExYMFZi7ZfypEASz5pG+Jh5lTAwvgEATznQ7iESNQIDAQAB
-#平安进件私钥
+#\u5E73\u5B89\u8FDB\u4EF6\u79C1\u94A5
 pingan.dev.pluginPrivateKey=MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQC7KiGn4KsNNrPq1ba4ytbGzaUXARtEKw+Dr2A5u2OKuAy4a1wH6+HMIWfqs3wi+iG+kaQ7y+NnDqquaVs2tq5pS5bmPzZ7Jnvj1l9OCAWMiq14v0x4XzywBjevDQAi1xRQ/ddphqZ50oat156WV9uC/Jokn6bZ69j/I/0VFNUQqCZuLRS80y8KqqJa3LcfdZREWOOPYn7/hvnMjyh3itJOwd60Pymw5WIxse5iiqGXnzdRb/q967X5m8o+Qnxmd4/+MYJZ7cE1ZQwfdj36s9I6f6mdaZXdH3bqopF55kF0x8r0TFgwVmLtl/KkQBLPmkb4mHmVMDC+AQBPOdDuIRI1AgMBAAECggEAYH/ihmoCB3gS35t88F40yp+w5OF/K3CAOUcs99c0BYvLkzJXawYlj1gR+iK8eFQ7HcR9xw7imnonanGLw/QAjO2aSfCBqJE5A0m+Lb9ZDRNbSYxoYw/HfIJYJ3sufMgkA3Y9oHz6TIlNQ0iOzblSxoBzATsHjghaA4KMtFffWwxVgeY1ozHGwt4pOv5opdr7JfJHz4Xv/G2wbmDpYEwlHWn4Iu1QZgOcmnufzIjEK7OXSvfEc0Ohjta4TikpfJK9W4gZ28B3yPSUmNlszsRUbOT8R5sI2QIYHemlYuyY9h9d1ZxgMv6QVu2dYdZSGHOzqd04mueYzPIWRD4WRETvaQKBgQDk6xwaq0JnZBVy9UXbS9Kn75SaYferqgKClYbeu7GfzYyjj5N/XZEuj5DwfxQa2jijy7QqX7Tqskridh7+sTcNDZZ4J6dT5Tivgfb3YQCVXIWL16uqSdasG1thGOAI9/0tzkHjknpjIpMNcT3s15I7tx7b4kyUlhR1FTKHygh5IwKBgQDRTn1V0iwbi3P0hV3bqHRxcCLmO9Bhdf3UekDiVvegtihLVZoUGCx/aOlhWQa5+1SVMziB7ms+16vEB9QI0wZXhrHCBszknMvYJFp9AuErvFAVCkgL0cAnhvj6QBFji5AFElNyNlExZ+hUpj6nBB/kmvF/kyiOQdAQM6WInJv4xwKBgC+aJFH3YuuVCFDLaCdd8QQy8bfYv2PXCoaVCWKvrRQJ7kDkzksh7dq8x+r6wfeDgVuuNFzLYheb066b2X4k48m3FZ8Ov+DWPZ9hazWt2i00/CBETNIwYI+RcMMUJSI4T1GDHnhwMTsEKYgWEEZ73VDFl4kp2brcKozeR4+tF235AoGBAJsk9N5iVXNtYNwE51dkfDuBhTznZUR4s1eF7wZWtGKZ4zBEGVt/t6wRVbxkwwmkdEPLnb0hvrjsIFPEAbUwxmimXKiXZdSnLKnf+HrlYYaLpUiTQGgSZ75k27STPNBuqKg5t0TXYkOe46WrPJGMCx/mgc+wgsU/nzwDLFYgz7QNAoGAXNjnCWMvwDeIS4tMYDfrVUfmvjXRFZuiOm0+a92huKlu72azi3mIme0YyIVSFGLl+Lk/BeBJYWnLNo6CsGyPqLyi4Pkoftq+BZS3ls25pFl+8QGjrLXky+nIXbceqf1YwdNHEEIOU14jHZyPAJR2M2Trj1iKrqJIRhkTT6WtjgE=
-#平安交接口交易地址
+#\u5E73\u5B89\u4EA4\u63A5\u53E3\u4EA4\u6613\u5730\u5740
 pingan.dev.payUrl=https://api.orangebank.com.cn/mct1/
-#平安交接口进件地址
+#\u5E73\u5B89\u4EA4\u63A5\u53E3\u8FDB\u4EF6\u5730\u5740
 pingan.dev.pluginUrl=https://mixpayuat4.orangebank.com.cn/org1/
-#平安交文件上传地址
+#\u5E73\u5B89\u4EA4\u6587\u4EF6\u4E0A\u4F20\u5730\u5740
 pingan.dev.fileUrl=https://mixpayst6.orangebank.com.cn/fileup1/
-#平安下单异步通知地址
+#\u5E73\u5B89\u4E0B\u5355\u5F02\u6B65\u901A\u77E5\u5730\u5740
 pingan.dev.notifyUrl=http://qhdswl.f3322.net:9002/api/pay/pingan/notify
-#平安支付成功跳转地址
+#\u5E73\u5B89\u652F\u4ED8\u6210\u529F\u8DF3\u8F6C\u5730\u5740
 pingan.dev.jumpUrl=
 
 
-#========== 生产环境 ==========
-#平安支付open_id
+#========== \u751F\u4EA7\u73AF\u5883 ==========
+#\u5E73\u5B89\u652F\u4ED8open_id
 pingan.prod.payOpenId=6ad8a69d33b5bf188f7c0ab7bae95931
-#平安支付open_key
+#\u5E73\u5B89\u652F\u4ED8open_key
 pingan.prod.payOpenKey=ac1705d3ace4b6b69044494d0e28310e
-#平安退款公钥
+#\u5E73\u5B89\u9000\u6B3E\u516C\u94A5
 pingan.prod.payPublicKey=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC7q4B8d6EIMUo8AK2sdgxbmdrFyklVW+4+y2KI+jeHgAwA9SwBn3KVIUa1aVrBcZzQh0RhSCy8r+vfh67/KVTU+Oaav0ZH3B/Wem5DkLMrkz8IMm17NsUFhXZCCyC5KXIbzciueHdYTObbV4r4oDazf52708jSIVKDSYkjcTEoiQIDAQAB
-#平安取消交易私钥
+#\u5E73\u5B89\u53D6\u6D88\u4EA4\u6613\u79C1\u94A5
 pingan.prod.payPrivateKey=MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBALurgHx3oQgxSjwArax2DFuZ2sXKSVVb7j7LYoj6N4eADAD1LAGfcpUhRrVpWsFxnNCHRGFILLyv69+Hrv8pVNT45pq/RkfcH9Z6bkOQsyuTPwgybXs2xQWFdkILILkpchvNyK54d1hM5ttXivigNrN/nbvTyNIhUoNJiSNxMSiJAgMBAAECgYAB3H+XvHACbsq3saIHVdxlhC8hSxJTIGhKgyXlCeZHF8QGtmfLVFOEmyHiZrsZtBDEGLNa66ZV8MC8JNJdgYFv3vZeYpLDgmAPmiKadEiCu4pg/QwpfeHGEDZfaxWfjWfNwyLv6RmXv310hP8WEMC9xv2Cx9DXIAcXg0SlNy4CoQJBAOLsicAop3i7LT+oGw6GoPTaHyTk20yJVXn/VMKXMLIT4371bcANrj1zj2EWjLUPOqYAApWxYDahg4hLIcD1e40CQQDTt16bagAJw/sShVXYcKuuf3vKIG/ZMXgfxddxFkd4aMmpImW6LwqFIV96J5jhYlcVwtXdWtDiuqHgsAgPD6PtAkBRxIfybPPDpjaszGdLeal/8STtx2VaE9ZwClhBcfdDA7Wi5s7wOD3DuOM+ScDT8TPh4vkLdYnExbg+oUv9Wrd1AkEAvC6k/Ob/Ga8FH7U8VKHxN61Azqx+PkNmTnd/w5jV9gTOGnPkj9T4ONUtFFrV3J+YYFNJ3PK38I+LCzfsMdbpEQJAWoJ7g9IMMu6yx4JyCzE15OdOcJDytqZ6gIiXvtkqEGywyxNdEyUOu/+BkAQElTdUCCWuVBllm09K/y95I6zG8A==
-#平安进件open_id
+#\u5E73\u5B89\u8FDB\u4EF6open_id
 pingan.prod.pluginOpenId=txafCXQt058248b3230c9081ff90ce80
-#平安进件open_key
+#\u5E73\u5B89\u8FDB\u4EF6open_key
 pingan.prod.pluginOpenKey=aG0ck19g2HdthGRdSCfmiloOoGXoOzWZ
-#平安进件公钥
+#\u5E73\u5B89\u8FDB\u4EF6\u516C\u94A5
 pingan.prod.pluginPublicKey=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuyohp+CrDTaz6tW2uMrWxs2lFwEbRCsPg69gObtjirgMuGtcB+vhzCFn6rN8IvohvpGkO8vjZw6qrmlbNrauaUuW5j82eyZ749ZfTggFjIqteL9MeF88sAY3rw0AItcUUP3XaYamedKGrdeellfbgvyaJJ+m2evY/yP9FRTVEKgmbi0UvNMvCqqiWty3H3WURFjjj2J+/4b5zI8od4rSTsHetD8psOViMbHuYoqhl583UW/6veu1+ZvKPkJ8ZneP/jGCWe3BNWUMH3Y9+rPSOn+pnWmV3R926qKReeZBdMfK9ExYMFZi7ZfypEASz5pG+Jh5lTAwvgEATznQ7iESNQIDAQAB
-#平安进件私钥
+#\u5E73\u5B89\u8FDB\u4EF6\u79C1\u94A5
 pingan.prod.pluginPrivateKey=MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQC7KiGn4KsNNrPq1ba4ytbGzaUXARtEKw+Dr2A5u2OKuAy4a1wH6+HMIWfqs3wi+iG+kaQ7y+NnDqquaVs2tq5pS5bmPzZ7Jnvj1l9OCAWMiq14v0x4XzywBjevDQAi1xRQ/ddphqZ50oat156WV9uC/Jokn6bZ69j/I/0VFNUQqCZuLRS80y8KqqJa3LcfdZREWOOPYn7/hvnMjyh3itJOwd60Pymw5WIxse5iiqGXnzdRb/q967X5m8o+Qnxmd4/+MYJZ7cE1ZQwfdj36s9I6f6mdaZXdH3bqopF55kF0x8r0TFgwVmLtl/KkQBLPmkb4mHmVMDC+AQBPOdDuIRI1AgMBAAECggEAYH/ihmoCB3gS35t88F40yp+w5OF/K3CAOUcs99c0BYvLkzJXawYlj1gR+iK8eFQ7HcR9xw7imnonanGLw/QAjO2aSfCBqJE5A0m+Lb9ZDRNbSYxoYw/HfIJYJ3sufMgkA3Y9oHz6TIlNQ0iOzblSxoBzATsHjghaA4KMtFffWwxVgeY1ozHGwt4pOv5opdr7JfJHz4Xv/G2wbmDpYEwlHWn4Iu1QZgOcmnufzIjEK7OXSvfEc0Ohjta4TikpfJK9W4gZ28B3yPSUmNlszsRUbOT8R5sI2QIYHemlYuyY9h9d1ZxgMv6QVu2dYdZSGHOzqd04mueYzPIWRD4WRETvaQKBgQDk6xwaq0JnZBVy9UXbS9Kn75SaYferqgKClYbeu7GfzYyjj5N/XZEuj5DwfxQa2jijy7QqX7Tqskridh7+sTcNDZZ4J6dT5Tivgfb3YQCVXIWL16uqSdasG1thGOAI9/0tzkHjknpjIpMNcT3s15I7tx7b4kyUlhR1FTKHygh5IwKBgQDRTn1V0iwbi3P0hV3bqHRxcCLmO9Bhdf3UekDiVvegtihLVZoUGCx/aOlhWQa5+1SVMziB7ms+16vEB9QI0wZXhrHCBszknMvYJFp9AuErvFAVCkgL0cAnhvj6QBFji5AFElNyNlExZ+hUpj6nBB/kmvF/kyiOQdAQM6WInJv4xwKBgC+aJFH3YuuVCFDLaCdd8QQy8bfYv2PXCoaVCWKvrRQJ7kDkzksh7dq8x+r6wfeDgVuuNFzLYheb066b2X4k48m3FZ8Ov+DWPZ9hazWt2i00/CBETNIwYI+RcMMUJSI4T1GDHnhwMTsEKYgWEEZ73VDFl4kp2brcKozeR4+tF235AoGBAJsk9N5iVXNtYNwE51dkfDuBhTznZUR4s1eF7wZWtGKZ4zBEGVt/t6wRVbxkwwmkdEPLnb0hvrjsIFPEAbUwxmimXKiXZdSnLKnf+HrlYYaLpUiTQGgSZ75k27STPNBuqKg5t0TXYkOe46WrPJGMCx/mgc+wgsU/nzwDLFYgz7QNAoGAXNjnCWMvwDeIS4tMYDfrVUfmvjXRFZuiOm0+a92huKlu72azi3mIme0YyIVSFGLl+Lk/BeBJYWnLNo6CsGyPqLyi4Pkoftq+BZS3ls25pFl+8QGjrLXky+nIXbceqf1YwdNHEEIOU14jHZyPAJR2M2Trj1iKrqJIRhkTT6WtjgE=
-#平安交接口交易地址
+#\u5E73\u5B89\u4EA4\u63A5\u53E3\u4EA4\u6613\u5730\u5740
 pingan.prod.payUrl=https://api.orangebank.com.cn/mct1/
-#平安交接口进件地址
+#\u5E73\u5B89\u4EA4\u63A5\u53E3\u8FDB\u4EF6\u5730\u5740
 pingan.prod.pluginUrl=https://api.orangebank.com.cn/org1/
-#平安交文件上传地址
+#\u5E73\u5B89\u4EA4\u6587\u4EF6\u4E0A\u4F20\u5730\u5740
 pingan.prod.fileUrl=https://up.orangebank.com.cn/fileup1/
-#平安下单异步通知地址
+#\u5E73\u5B89\u4E0B\u5355\u5F02\u6B65\u901A\u77E5\u5730\u5740
 pingan.prod.notifyUrl=https://mp.k1net.cn/api/pay/pingan/notify
-#平安支付成功跳转地址
-pingan.prod.jumpUrl=
+#\u5E73\u5B89\u652F\u4ED8\u6210\u529F\u8DF3\u8F6C\u5730\u5740
+pingan.prod.jumpUrl=

+ 5 - 5
kmall-manager/src/main/resources/conf/redis.properties

@@ -1,9 +1,9 @@
-########## redis 配置 ##########
+########## redis \u914D\u7F6E ##########
 
 # [dev, prod]
 redis.env = dev
 
-# 开发环境
+# \u5F00\u53D1\u73AF\u5883
 redis.dev.keyPrefix=platform
 redis.dev.host=127.0.0.1
 redis.dev.port=6379
@@ -13,16 +13,16 @@ redis.dev.pool.maxTotal=10000
 redis.dev.pool.testOnBorrow=true
 
 
-# 中网生产环境
+# \u4E2D\u7F51\u751F\u4EA7\u73AF\u5883
 redis.prod.keyPrefix=platform
-redis.prod.host=172.18.132.30
+redis.prod.host=183.62.225.124
 redis.prod.port=6379
 redis.prod.pool.maxIdle=200
 redis.prod.pool.maxWait=1000
 redis.prod.pool.maxTotal=10000
 redis.prod.pool.testOnBorrow=true
 
-## 中网国际生产环境
+## \u4E2D\u7F51\u56FD\u9645\u751F\u4EA7\u73AF\u5883
 #redis.prod.keyPrefix=platform
 #redis.prod.host=183.62.225.124
 #redis.prod.port=6379

+ 39 - 39
kmall-manager/src/main/resources/conf/wx-global.properties

@@ -1,84 +1,84 @@
-########## 微信小程序配置 ##########
+########## \u5FAE\u4FE1\u5C0F\u7A0B\u5E8F\u914D\u7F6E ##########
 
 # [dev, prod]
 pay.wx.global.env = dev
 
 
-#========== 开发环境 ==========
-#小程序ID
+#========== \u5F00\u53D1\u73AF\u5883 ==========
+#\u5C0F\u7A0B\u5E8FID
 wx.global.dev.appId=wx59c05dcbb3ef2f36
-#小程序密钥
+#\u5C0F\u7A0B\u5E8F\u5BC6\u94A5
 wx.global.dev.secret=bb4029cd5149cbe5975bc14a99feaa9d
-#商户号
+#\u5546\u6237\u53F7
 wx.global.dev.mchId=103106626
-#支付签名
+#\u652F\u4ED8\u7B7E\u540D
 wx.global.dev.paySignKey=CAXRUxp7mzgc1LhOMezsvS3PXbqi7KhY
-#交易类型
+#\u4EA4\u6613\u7C7B\u578B
 wx.global.dev.tradeType=JSAPI
-#商户币种
+#\u5546\u6237\u5E01\u79CD
 wx.global.dev.feeType=CNY
-#证书名称,对应不同的商户号
+#\u8BC1\u4E66\u540D\u79F0\uFF0C\u5BF9\u5E94\u4E0D\u540C\u7684\u5546\u6237\u53F7
 wx.global.dev.certName=/cert/apiclient_cert.p12
-#支付回调地址
+#\u652F\u4ED8\u56DE\u8C03\u5730\u5740
 wx.global.dev.notifyUrl=http://qhdswl.f3322.net:9001/platform-framework/api/global/pay/notify
-#获取code的请求地址
+#\u83B7\u53D6code\u7684\u8BF7\u6C42\u5730\u5740
 wx.global.dev.getCode=https://open.weixin.qq.com/connect/oauth2/authorize?appid=%s&redirect_uri=%s&response_type=code&scope=%s&state=STAT#wechat_redirect
-#获取Web_access_tokenhttps的请求地址
+#\u83B7\u53D6Web_access_tokenhttps\u7684\u8BF7\u6C42\u5730\u5740
 wx.global.dev.webAccessTokenhttps = https://api.weixin.qq.com/sns/jscode2session?appid=%s&secret=%s&js_code=%s&grant_type=authorization_code
-#拉取用户信息的请求地址
+#\u62C9\u53D6\u7528\u6237\u4FE1\u606F\u7684\u8BF7\u6C42\u5730\u5740
 wx.global.dev.userMessage=https://api.weixin.qq.com/sns/userinfo?access_token=%s&openid=%s&lang=zh_CN
-#微信统一下单接口路径
+#\u5FAE\u4FE1\u7EDF\u4E00\u4E0B\u5355\u63A5\u53E3\u8DEF\u5F84
 wx.global.dev.uniformorder=https://api.mch.weixin.qq.com/pay/unifiedorder
-#退款地址
+#\u9000\u6B3E\u5730\u5740
 wx.global.dev.refundUrl=https://api.mch.weixin.qq.com/secapi/pay/refund
-#退款回调地址
+#\u9000\u6B3E\u56DE\u8C03\u5730\u5740
 wx.global.dev.refundNotifyUrl=http://qhdswl.f3322.net:9001/platform-framework/api/global/pay/refundNotify
-#退款查询地址
+#\u9000\u6B3E\u67E5\u8BE2\u5730\u5740
 wx.global.dev.refundqueryUrl=https://api.mch.weixin.qq.com/pay/refundquery
-#微信查询订单状态
+#\u5FAE\u4FE1\u67E5\u8BE2\u8BA2\u5355\u72B6\u6001
 wx.global.dev.orderquery=https://api.mch.weixin.qq.com/pay/orderquery
-#查询汇率
+#\u67E5\u8BE2\u6C47\u7387
 wx.global.dev.ratequery=https://api.mch.weixin.qq.com/pay/queryexchagerate
-#服务器Ip
+#\u670D\u52A1\u5668Ip
 wx.global.dev.spbillCreateIp=127.0.0.1
 
 
-#========== 生产环境 ==========
-#小程序ID
+#========== \u751F\u4EA7\u73AF\u5883 ==========
+#\u5C0F\u7A0B\u5E8FID
 wx.global.prod.appId=wx59c05dcbb3ef2f36
-#小程序密钥
+#\u5C0F\u7A0B\u5E8F\u5BC6\u94A5
 wx.global.prod.secret=bb4029cd5149cbe5975bc14a99feaa9d
-#商户号
+#\u5546\u6237\u53F7
 wx.global.prod.mchId=103106626
-#支付签名
+#\u652F\u4ED8\u7B7E\u540D
 wx.global.prod.paySignKey=CAXRUxp7mzgc1LhOMezsvS3PXbqi7KhY
-#交易类型
+#\u4EA4\u6613\u7C7B\u578B
 wx.global.prod.tradeType=JSAPI
-#商户币种
+#\u5546\u6237\u5E01\u79CD
 wx.global.prod.feeType=CNY
-#证书名称,对应不同的商户号
+#\u8BC1\u4E66\u540D\u79F0\uFF0C\u5BF9\u5E94\u4E0D\u540C\u7684\u5546\u6237\u53F7
 wx.global.prod.certName=/app/project/kmall_pt_global/cert/apiclient_cert.p12
-#支付回调地址
+#\u652F\u4ED8\u56DE\u8C03\u5730\u5740
 wx.global.prod.notifyUrl=https://mp.k1net.cn/api/global/pay/notify
-#获取code的请求地址
+#\u83B7\u53D6code\u7684\u8BF7\u6C42\u5730\u5740
 wx.global.prod.getCode=https://open.weixin.qq.com/connect/oauth2/authorize?appid=%s&redirect_uri=%s&response_type=code&scope=%s&state=STAT#wechat_redirect
-#获取Web_access_tokenhttps的请求地址
+#\u83B7\u53D6Web_access_tokenhttps\u7684\u8BF7\u6C42\u5730\u5740
 wx.global.prod.webAccessTokenhttps = https://api.weixin.qq.com/sns/jscode2session?appid=%s&secret=%s&js_code=%s&grant_type=authorization_code
-#拉取用户信息的请求地址
+#\u62C9\u53D6\u7528\u6237\u4FE1\u606F\u7684\u8BF7\u6C42\u5730\u5740
 wx.global.prod.userMessage=https://api.weixin.qq.com/sns/userinfo?access_token=%s&openid=%s&lang=zh_CN
-#微信统一下单接口路径
+#\u5FAE\u4FE1\u7EDF\u4E00\u4E0B\u5355\u63A5\u53E3\u8DEF\u5F84
 wx.global.prod.uniformorder=https://api.mch.weixin.qq.com/pay/unifiedorder
-#退款地址
+#\u9000\u6B3E\u5730\u5740
 wx.global.prod.refundUrl=https://api.mch.weixin.qq.com/secapi/pay/refund
-#退款回调地址
+#\u9000\u6B3E\u56DE\u8C03\u5730\u5740
 wx.global.prod.refundNotifyUrl=https://mp.k1net.cn/api/global/pay/refundNotify
-#退款查询地址
+#\u9000\u6B3E\u67E5\u8BE2\u5730\u5740
 wx.global.prod.refundqueryUrl=https://api.mch.weixin.qq.com/pay/refundquery
-#微信查询订单状态
+#\u5FAE\u4FE1\u67E5\u8BE2\u8BA2\u5355\u72B6\u6001
 wx.global.prod.orderquery=https://api.mch.weixin.qq.com/pay/orderquery
-#查询汇率
+#\u67E5\u8BE2\u6C47\u7387
 wx.global.prod.ratequery=https://api.mch.weixin.qq.com/pay/queryexchagerate
-#服务器Ip
+#\u670D\u52A1\u5668Ip
 wx.global.prod.spbillCreateIp=127.0.0.1
 
 

BIN
kmall-manager/src/main/resources/lib/alipay-sdk-java-3.3.0-source.jar


BIN
kmall-manager/src/main/resources/lib/alipay-sdk-java-3.3.0.jar


BIN
kmall-manager/src/main/resources/lib/alipay-trade-sdk-20161215-source.jar


BIN
kmall-manager/src/main/resources/lib/alipay-trade-sdk-20161215.jar


BIN
kmall-manager/src/main/resources/lib/commons-codec-1.10.jar


BIN
kmall-manager/src/main/resources/lib/commons-configuration-1.10.jar


BIN
kmall-manager/src/main/resources/lib/commons-lang-2.6.jar


BIN
kmall-manager/src/main/resources/lib/commons-logging-1.1.1.jar


BIN
kmall-manager/src/main/resources/lib/core-2.1.jar


BIN
kmall-manager/src/main/resources/lib/gson-2.3.1.jar


BIN
kmall-manager/src/main/resources/lib/hamcrest-core-1.3.jar


+ 25 - 0
kmall-manager/src/main/resources/log4j.properties

@@ -0,0 +1,25 @@
+log4j.rootLogger=INFO,stdout,file
+#控制台输出
+log4j.appender.stdout=org.apache.log4j.ConsoleAppender
+log4j.appender.stdout.Target=System.out
+log4j.appender.stdout.Threshold=INFO
+log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
+log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss SSS}|%5p|%F.%M:%L|%m%n
+#INFO所有日志
+log4j.logger.file=info
+log4j.appender.file=org.apache.log4j.DailyRollingFileAppender
+log4j.appender.file.File=../logs/junitTestInfo.log
+log4j.appender.file.datePattern='.'yyyy-MM-dd'.log'
+log4j.appender.file.append=true
+log4j.appender.file.Threshold=INFO
+log4j.appender.file.encoding=UTF-8
+log4j.appender.file.ImmediateFlush=true
+log4j.appender.file.layout=org.apache.log4j.PatternLayout
+log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss SSS}|%5p|%F.%M:%L|%m%n
+#控制台输出所有SQL
+#便于调试  生产环境注释
+log4j.logger.com.kmall.framework.dao=DEBUG,sql
+log4j.appender.sql=org.apache.log4j.ConsoleAppender
+log4j.appender.sql.Target=System.out
+log4j.appender.sql.layout=org.apache.log4j.PatternLayout
+log4j.appender.sql.layout.ConversionPattern=%m %n

+ 1 - 0
kmall-manager/src/main/resources/spring/spring-manager-context.xml

@@ -33,6 +33,7 @@
                 <value>classpath:conf/oms-merch.properties</value>
                 <value>classpath:conf/common.properties</value>
                 <value>classpath:conf/express-sf.properties</value>
+                <value>classpath:conf/alipay.properties</value>
             </list>
         </property>
         <property name="fileEncoding" value="UTF-8"/>

+ 134 - 0
kmall-schedule/pom.xml

@@ -0,0 +1,134 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>kmall-pt-general</artifactId>
+        <groupId>com.kmall</groupId>
+        <version>3.1.0</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>kmall-schedule</artifactId>
+    <packaging>war</packaging>
+    <description>定时任务模块</description>
+
+    <properties>
+        <quartz-version>2.3.0</quartz-version>
+    </properties>
+
+    <dependencies>
+
+        <dependency>
+            <groupId>com.kmall</groupId>
+            <artifactId>kmall-common</artifactId>
+            <version>${kmall-version}</version>
+        </dependency>
+        <dependency>
+            <groupId>com.kmall</groupId>
+            <artifactId>kmall-manager</artifactId>
+            <version>${kmall-version}</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.quartz-scheduler</groupId>
+            <artifactId>quartz</artifactId>
+            <version>${quartz-version}</version>
+            <exclusions>
+                <exclusion>
+                    <artifactId>c3p0</artifactId>
+                    <groupId>c3p0</groupId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+    </dependencies>
+
+
+    <!-- Build Settings -->
+    <build>
+        <resources>
+            <resource>
+                <directory>src/main/resources</directory>
+                <filtering>true</filtering>
+                <includes>
+                    <include>**/*.xml</include>
+                    <include>**/*.properties</include>
+                </includes>
+            </resource>
+            <resource>
+                <directory>src/main/java</directory>
+                <filtering>true</filtering>
+                <includes>
+                    <include>**/*.xml</include>
+                    <include>**/*.properties</include>
+                </includes>
+            </resource>
+        </resources>
+
+        <plugins>
+
+            <!-- 拷贝依赖的jar包到lib目录 -->
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-dependency-plugin</artifactId>
+                <executions>
+                    <execution>
+                        <id>copy-dependency</id>
+                        <phase>package</phase>
+                        <goals>
+                            <goal>copy-dependencies</goal>
+                        </goals>
+                        <configuration>
+                            <outputDirectory>${project.build.directory}/lib</outputDirectory>
+                            <excludeTransitive>false</excludeTransitive>
+                            <stripVersion>false</stripVersion>
+                        </configuration>
+                    </execution>
+                </executions>
+            </plugin>
+
+            <!-- 打包可执行jar -->
+            <!-- 无依赖其他任何jar -->
+            <!-- 打包jar文件时,配置manifest文件,加入lib包的jar依赖 -->
+            <!--<plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-jar-plugin</artifactId>
+                <version>${maven.jar.version}</version>
+                <configuration>
+                    <archive>
+                        <addMavenDescriptor>false</addMavenDescriptor>
+                        <manifest>
+                            <addClasspath>true</addClasspath>
+                            <classpathPrefix>lib/</classpathPrefix>
+                            <mainClass>com.kmall.schedule.Main</mainClass>
+                        </manifest>
+                    </archive>
+                </configuration>
+            </plugin>-->
+
+
+            <!-- 打包war包 -->
+            <plugin>
+                <artifactId>maven-war-plugin</artifactId>
+                <version>${maven.war.version}</version>
+                <configuration>
+                    <packagingExcludes>WEB-INF/web.xml</packagingExcludes>
+                    <failOnMissingWebXml>false</failOnMissingWebXml>
+                    <warSourceDirectory>src/main/webapp</warSourceDirectory>
+                    <failOnMissingWebXml>false</failOnMissingWebXml>
+                    <webResources>
+                        <resource>
+                            <directory>src/main/resources/conf</directory>
+                            <targetPath>WEB-INF/classes/conf</targetPath>
+                            <filtering>true</filtering>
+                        </resource>
+                    </webResources>
+                </configuration>
+            </plugin>
+
+        </plugins>
+
+    </build>
+
+
+</project>

+ 367 - 0
pom.xml

@@ -0,0 +1,367 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+    <groupId>com.kmall</groupId>
+    <artifactId>kmall-pt-general</artifactId>
+    <packaging>pom</packaging>
+    <version>3.1.0</version>
+    <modules>
+        <module>kmall-admin</module>
+        <module>kmall-api</module>
+        <module>kmall-common</module>
+        <module>kmall-gen</module>
+        <module>kmall-framework</module>
+        <module>kmall-schedule</module>
+        <module>kmall-manager</module>
+    </modules>
+
+
+    <properties>
+
+        <kmall-version>3.1.0</kmall-version>
+        <argLine>-Dfile.encoding=UTF-8</argLine>
+        <!-- JDK版本 -->
+        <java.version>1.8</java.version>
+        <!-- 文件拷贝时的编码 -->
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
+        <!-- 编译时的编码 -->
+        <maven.compiler.encoding>UTF-8</maven.compiler.encoding>
+
+
+        <maven.resources.version>3.1.0</maven.resources.version>
+        <maven.compiler.version>3.8.0</maven.compiler.version>
+        <maven.war.version>3.2.2</maven.war.version>
+        <maven.jar.version>3.1.1</maven.jar.version>
+        <maven.surefire.plugin.version>2.22.1</maven.surefire.plugin.version>
+
+        <servlet-version>3.1.0</servlet-version>
+        <junit-version>4.12</junit-version>
+        <springframework-version>4.3.7.RELEASE</springframework-version>
+        <mybatis-version>3.4.1</mybatis-version>
+        <mybatis-spring-version>1.3.0</mybatis-spring-version>
+        <mysql-version>8.0.15</mysql-version>
+        <hibernate-validator-version>5.4.1.Final</hibernate-validator-version>
+        <druid-version>1.1.14</druid-version>
+        <druid-version>1.0.28</druid-version>
+        <mariadb-version>2.4.0</mariadb-version>
+        <HikariCP-version>2.6.3</HikariCP-version>
+        <commons-lang-version>2.6</commons-lang-version>
+        <commons-fileupload-version>1.3.1</commons-fileupload-version>
+        <commons-io-version>2.5</commons-io-version>
+        <commons-codec-version>1.10</commons-codec-version>
+        <commons-configuration-version>1.10</commons-configuration-version>
+        <commons-beanutils-version>1.9.3</commons-beanutils-version>
+        <slf4j-version>1.7.19</slf4j-version>
+        <logback-version>1.2.3</logback-version>
+        <logback-ext-spring-version>0.1.5</logback-ext-spring-version>
+        <log4j-version>1.2.17</log4j-version>
+        <fastjson-version>1.2.30</fastjson-version>
+        <shiro-version>1.3.2</shiro-version>
+        <kaptcha-version>0.0.9</kaptcha-version>
+        <velocity-version>1.7</velocity-version>
+        <velocity-tools-version>2.0</velocity-tools-version>
+        <jstl-version>1.2</jstl-version>
+        <taglibs-version>1.1.2</taglibs-version>
+        <freemarker-version>2.3.23</freemarker-version>
+
+    </properties>
+
+    <!-- 阿里云maven仓库 -->
+    <repositories>
+        <repository>
+            <id>public</id>
+            <name>aliyun nexus</name>
+            <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
+            <releases>
+                <enabled>true</enabled>
+            </releases>
+        </repository>
+    </repositories>
+    <pluginRepositories>
+        <pluginRepository>
+            <id>public</id>
+            <name>aliyun nexus</name>
+            <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
+            <releases>
+                <enabled>true</enabled>
+            </releases>
+            <snapshots>
+                <enabled>false</enabled>
+            </snapshots>
+        </pluginRepository>
+    </pluginRepositories>
+
+    <dependencies>
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+            <version>${junit-version}</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>javax.servlet</groupId>
+            <artifactId>javax.servlet-api</artifactId>
+            <version>${servlet-version}</version>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.mybatis</groupId>
+            <artifactId>mybatis</artifactId>
+            <version>${mybatis-version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.mybatis</groupId>
+            <artifactId>mybatis-spring</artifactId>
+            <version>${mybatis-spring-version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.hibernate</groupId>
+            <artifactId>hibernate-validator</artifactId>
+            <version>${hibernate-validator-version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework</groupId>
+            <artifactId>spring-webmvc</artifactId>
+            <version>${springframework-version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework</groupId>
+            <artifactId>spring-jdbc</artifactId>
+            <version>${springframework-version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework</groupId>
+            <artifactId>spring-context-support</artifactId>
+            <version>${springframework-version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework</groupId>
+            <artifactId>spring-aop</artifactId>
+            <version>${springframework-version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework</groupId>
+            <artifactId>spring-aspects</artifactId>
+            <version>${springframework-version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework</groupId>
+            <artifactId>spring-test</artifactId>
+            <version>${springframework-version}</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.slf4j</groupId>
+            <artifactId>slf4j-api</artifactId>
+            <version>${slf4j-version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.slf4j</groupId>
+            <artifactId>slf4j-log4j12</artifactId>
+            <version>${slf4j-version}</version>
+        </dependency>
+        <!--把spring日志转发给SLF4J,使用桥接jcl-over-slf4j-->
+        <!--把Spring中使用的commons-logging替换成slf4j-->
+        <dependency>
+            <groupId>org.slf4j</groupId>
+            <artifactId>jcl-over-slf4j</artifactId>
+            <version>${slf4j-version}</version>
+        </dependency>
+        <dependency>
+            <groupId>log4j</groupId>
+            <artifactId>log4j</artifactId>
+            <version>${log4j-version}</version>
+        </dependency>
+        <dependency>
+            <groupId>ch.qos.logback</groupId>
+            <artifactId>logback-core</artifactId>
+            <version>${logback-version}</version>
+        </dependency>
+        <dependency>
+            <groupId>ch.qos.logback</groupId>
+            <artifactId>logback-classic</artifactId>
+            <version>${logback-version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.logback-extensions</groupId>
+            <artifactId>logback-ext-spring</artifactId>
+            <version>${logback-ext-spring-version}</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.zaxxer</groupId>
+            <artifactId>HikariCP</artifactId>
+            <version>${HikariCP-version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.mariadb.jdbc</groupId>
+            <artifactId>mariadb-java-client</artifactId>
+            <version>${mariadb-version}</version>
+        </dependency>
+
+        <dependency>
+            <groupId>mysql</groupId>
+            <artifactId>mysql-connector-java</artifactId>
+            <version>${mysql-version}</version>
+        </dependency>
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>druid</artifactId>
+            <version>${druid-version}</version>
+        </dependency>
+        <dependency>
+            <groupId>commons-lang</groupId>
+            <artifactId>commons-lang</artifactId>
+            <version>${commons-lang-version}</version>
+        </dependency>
+        <dependency>
+            <groupId>commons-fileupload</groupId>
+            <artifactId>commons-fileupload</artifactId>
+            <version>${commons-fileupload-version}</version>
+        </dependency>
+        <dependency>
+            <groupId>commons-io</groupId>
+            <artifactId>commons-io</artifactId>
+            <version>${commons-io-version}</version>
+        </dependency>
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>fastjson</artifactId>
+            <version>${fastjson-version}</version>
+        </dependency>
+        <dependency>
+            <groupId>commons-codec</groupId>
+            <artifactId>commons-codec</artifactId>
+            <version>${commons-codec-version}</version>
+        </dependency>
+        <dependency>
+            <groupId>commons-configuration</groupId>
+            <artifactId>commons-configuration</artifactId>
+            <version>${commons-configuration-version}</version>
+        </dependency>
+        <dependency>
+            <groupId>commons-beanutils</groupId>
+            <artifactId>commons-beanutils</artifactId>
+            <version>${commons-beanutils-version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.shiro</groupId>
+            <artifactId>shiro-core</artifactId>
+            <version>${shiro-version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.shiro</groupId>
+            <artifactId>shiro-spring</artifactId>
+            <version>${shiro-version}</version>
+        </dependency>
+        <dependency>
+            <groupId>com.github.axet</groupId>
+            <artifactId>kaptcha</artifactId>
+            <version>${kaptcha-version}</version>
+        </dependency>
+        <!-- Velocity视图所需jar -->
+        <dependency>
+            <artifactId>velocity</artifactId>
+            <groupId>org.apache.velocity</groupId>
+            <version>${velocity-version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.velocity</groupId>
+            <artifactId>velocity-tools</artifactId>
+            <version>${velocity-tools-version}</version>
+            <exclusions>
+                <exclusion>
+                    <artifactId>dom4j</artifactId>
+                    <groupId>dom4j</groupId>
+                </exclusion>
+                <exclusion>
+                    <artifactId>oro</artifactId>
+                    <groupId>oro</groupId>
+                </exclusion>
+                <exclusion>
+                    <artifactId>sslext</artifactId>
+                    <groupId>sslext</groupId>
+                </exclusion>
+                <exclusion>
+                    <artifactId>struts-core</artifactId>
+                    <groupId>org.apache.struts</groupId>
+                </exclusion>
+                <exclusion>
+                    <artifactId>struts-taglib</artifactId>
+                    <groupId>org.apache.struts</groupId>
+                </exclusion>
+                <exclusion>
+                    <artifactId>struts-tiles</artifactId>
+                    <groupId>org.apache.struts</groupId>
+                </exclusion>
+                <exclusion>
+                    <artifactId>commons-validator</artifactId>
+                    <groupId>commons-validator</groupId>
+                </exclusion>
+                <!--<exclusion>-->
+                    <!--<artifactId>commons-beanutils</artifactId>-->
+                    <!--<groupId>commons-beanutils</groupId>-->
+                <!--</exclusion>-->
+                <exclusion>
+                    <artifactId>commons-chain</artifactId>
+                    <groupId>commons-chain</groupId>
+                </exclusion>
+                <exclusion>
+                    <artifactId>commons-collections</artifactId>
+                    <groupId>commons-collections</groupId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+        <!-- JSP视图所需jar -->
+        <dependency>
+            <groupId>jstl</groupId>
+            <artifactId>jstl</artifactId>
+            <version>${jstl-version}</version>
+        </dependency>
+        <dependency>
+            <groupId>taglibs</groupId>
+            <artifactId>standard</artifactId>
+            <version>${taglibs-version}</version>
+        </dependency>
+        <!-- Freemarker视图所需jar -->
+        <dependency>
+            <groupId>org.freemarker</groupId>
+            <artifactId>freemarker</artifactId>
+            <version>${freemarker-version}</version>
+        </dependency>
+
+    </dependencies>
+
+    <build>
+        <plugins>
+
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <version>${maven.compiler.version}</version>
+                <configuration>
+                    <source>${java.version}</source>
+                    <target>${java.version}</target>
+                    <encoding>${project.build.sourceEncoding}</encoding>
+                    <!-- true:跳过测试 -->
+                    <skip>true</skip>
+                </configuration>
+            </plugin>
+
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-resources-plugin</artifactId>
+                <version>${maven.resources.version}</version>
+                <configuration>
+                    <encoding>${maven.compiler.encoding}</encoding>
+                </configuration>
+            </plugin>
+
+        </plugins>
+
+    </build>
+</project>