Parcourir la source

Merge branch '0930' of kjds/maopengtech into master

zhengjie il y a 3 ans
Parent
commit
ca6b33be0c
40 fichiers modifiés avec 2357 ajouts et 481 suppressions
  1. 0 41
      build-api.sh
  2. 11 1
      buyer-api/src/main/java/cn/lili/controller/order/CartController.java
  3. 171 0
      buyer-api/src/test/java/cn/lili/buyer/test/customs/CustomsTest.java
  4. 6 4
      buyer-api/src/test/resources/application.yml
  5. 417 418
      framework/pom.xml
  6. BIN
      framework/src/lib/AESEncrypt.jar
  7. 12 0
      framework/src/main/java/cn/lili/common/enums/HTTPMethodEnum.java
  8. 161 0
      framework/src/main/java/cn/lili/common/enums/JGS20Unit.java
  9. 1 0
      framework/src/main/java/cn/lili/common/enums/ResultCode.java
  10. 12 0
      framework/src/main/java/cn/lili/common/exception/UnitIllegalException.java
  11. 18 0
      framework/src/main/java/cn/lili/common/properties/AbstractHttpEndPointProperties.java
  12. 4 0
      framework/src/main/java/cn/lili/common/properties/holder/PlatformIntergrationHolder.java
  13. 11 0
      framework/src/main/java/cn/lili/common/properties/httpEndPointProperties.java
  14. 133 0
      framework/src/main/java/cn/lili/common/utils/AesEncrypt.java
  15. 77 0
      framework/src/main/java/cn/lili/common/utils/JaxbUtils.java
  16. 14 0
      framework/src/main/java/cn/lili/common/utils/StringUtils.java
  17. 273 0
      framework/src/main/java/cn/lili/common/utils/XmlMapUtils.java
  18. 30 0
      framework/src/main/java/cn/lili/modules/order/customs/CustomPayload.java
  19. 21 0
      framework/src/main/java/cn/lili/modules/order/customs/CustomsExchange.java
  20. 91 0
      framework/src/main/java/cn/lili/modules/order/customs/JiangyinServiceManager.java
  21. 19 0
      framework/src/main/java/cn/lili/modules/order/customs/JiangyinServiceParam.java
  22. 29 0
      framework/src/main/java/cn/lili/modules/order/customs/NameSpace.java
  23. 15 0
      framework/src/main/java/cn/lili/modules/order/customs/converter/CustomsReqConverter.java
  24. 72 0
      framework/src/main/java/cn/lili/modules/order/customs/converter/JiangyinServiceBeanReqConverter.java
  25. 203 0
      framework/src/main/java/cn/lili/modules/order/customs/converter/JiangyinServiceReqConverter.java
  26. 54 0
      framework/src/main/java/cn/lili/modules/order/customs/model/BaseTransfer.java
  27. 48 0
      framework/src/main/java/cn/lili/modules/order/customs/model/CEB303Message.java
  28. 81 0
      framework/src/main/java/cn/lili/modules/order/customs/model/Order.java
  29. 111 0
      framework/src/main/java/cn/lili/modules/order/customs/model/OrderHead.java
  30. 90 0
      framework/src/main/java/cn/lili/modules/order/customs/model/OrderList.java
  31. 14 0
      framework/src/main/java/cn/lili/modules/order/customs/model/package-info.java
  32. 12 0
      framework/src/main/java/cn/lili/modules/order/order/entity/dos/Order.java
  33. 59 0
      framework/src/main/java/cn/lili/modules/order/order/entity/dos/OrderCustoms.java
  34. 17 0
      framework/src/main/java/cn/lili/modules/order/order/entity/dos/OrderItem.java
  35. 15 0
      framework/src/main/java/cn/lili/modules/order/order/mapper/OrderCustomsMapper.java
  36. 7 0
      framework/src/main/java/cn/lili/modules/order/order/service/OrderService.java
  37. 23 1
      framework/src/main/java/cn/lili/modules/order/order/serviceimpl/OrderServiceImpl.java
  38. 6 0
      seller-api/src/main/java/cn/lili/controller/order/OrderStoreController.java
  39. 19 1
      start-api.sh
  40. 0 15
      stop-api.sh

+ 0 - 41
build-api.sh

@@ -1,41 +0,0 @@
1
-#版本 注意,需要跟随版本号进行调整
2
-version=4.2.4
3
-#代码目录
4
-code_path=/home/source/maopengtech
5
-#运行目录
6
-run_path=/home/source/api/
7
-#代码分支
8
-branch=enversion
9
-
10
-mkdir -p ${code_path}
11
-mkdir -p ${run_path}
12
-cd ${code_path}
13
-git fetch origin 
14
-git checkout ${branch}
15
-git pull origin ${branch}
16
-git reset origin/${branch} --hard
17
-mvn clean install -DskipTests
18
-
19
-ps -ef |grep java |grep buyer  |grep -v 'grep'|awk '{print $2}'  | xargs kill -9
20
-ps -ef |grep java |grep seller  |grep -v 'grep'|awk '{print $2}'  | xargs kill -9
21
-ps -ef |grep java |grep manager  |grep -v 'grep'|awk '{print $2}'  | xargs kill -9
22
-ps -ef |grep java |grep common  |grep -v 'grep'|awk '{print $2}'  | xargs kill -9
23
-ps -ef |grep java |grep consumer  |grep -v 'grep'|awk '{print $2}'  | xargs kill -9
24
-
25
-rm -rf ${run_path}*.jar
26
-mv ${code_path}/common-api/target/common-api-$version.jar ${run_path}
27
-mv ${code_path}/buyer-api/target/buyer-api-$version.jar ${run_path}
28
-mv ${code_path}/consumer/target/consumer-$version.jar ${run_path}
29
-mv ${code_path}/manager-api/target/manager-api-$version.jar ${run_path}
30
-mv ${code_path}/seller-api/target/seller-api-$version.jar ${run_path}
31
-
32
-cd ${run_path}
33
-
34
-mkdir logs
35
-
36
-nohup java -Xmx256m -Xms128m -Xss256k  -jar manager-api-$version.jar> logs/manager.out  &
37
-nohup java -Xmx256m -Xms128m -Xss256k  -jar common-api-$version.jar> logs/common.out  &
38
-nohup java -Xmx256m -Xms128m -Xss256k  -jar buyer-api-$version.jar> logs/buyer.out  &
39
-nohup java -Xmx256m -Xms128m -Xss256k  -jar consumer-$version.jar> logs/consumer.out  &
40
-nohup java -Xmx256m -Xms128m -Xss256k  -jar seller-api-$version.jar> logs/seller.out  &
41
-

+ 11 - 1
buyer-api/src/main/java/cn/lili/controller/order/CartController.java

@@ -9,7 +9,10 @@ import cn.lili.modules.order.cart.entity.dto.TradeDTO;
9 9
 import cn.lili.modules.order.cart.entity.enums.CartTypeEnum;
10 10
 import cn.lili.modules.order.cart.entity.vo.TradeParams;
11 11
 import cn.lili.modules.order.cart.service.CartService;
12
+import cn.lili.modules.order.order.entity.dos.Trade;
12 13
 import cn.lili.modules.order.order.entity.vo.ReceiptVO;
14
+import cn.lili.modules.order.order.service.OrderService;
15
+import cn.lili.modules.payment.entity.enums.PaymentMethodEnum;
13 16
 import io.swagger.annotations.Api;
14 17
 import io.swagger.annotations.ApiImplicitParam;
15 18
 import io.swagger.annotations.ApiImplicitParams;
@@ -40,6 +43,12 @@ public class CartController {
40 43
     @Autowired
41 44
     private CartService cartService;
42 45
 
46
+    /**
47
+     * 订单
48
+     */
49
+    @Autowired
50
+    private OrderService orderService;
51
+
43 52
 
44 53
     @ApiOperation(value = "向购物车中添加一个产品")
45 54
     @PostMapping
@@ -242,7 +251,8 @@ public class CartController {
242 251
     public ResultMessage<Object> crateTrade(@RequestBody TradeParams tradeParams) {
243 252
         try {
244 253
             //读取选中的列表
245
-            return ResultUtil.data(this.cartService.createTrade(tradeParams));
254
+            Trade trade = this.cartService.createTrade(tradeParams);
255
+            return ResultUtil.data(trade);
246 256
         } catch (ServiceException se) {
247 257
             log.info(se.getMsg(), se);
248 258
             throw se;

+ 171 - 0
buyer-api/src/test/java/cn/lili/buyer/test/customs/CustomsTest.java

@@ -0,0 +1,171 @@
1
+package cn.lili.buyer.test.customs;
2
+
3
+import cn.hutool.core.util.XmlUtil;
4
+import cn.hutool.json.JSONUtil;
5
+import org.w3c.dom.Document;
6
+import org.w3c.dom.Element;
7
+
8
+import java.util.Map;
9
+
10
+//@ExtendWith(SpringExtension.class)
11
+//@SpringBootTest
12
+public class CustomsTest {
13
+
14
+
15
+    public static void main(String[] args){
16
+        String xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +
17
+                "<ceb:CEB303Message guid=\"311af125-6fed-4603-8c5d-49b1fa4b4b9b\" version=\"1.0\"  xmlns:ceb=\"http://www.chinaport.gov.cn/ceb\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">\n" +
18
+                "\t<ceb:Order>\n" +
19
+                "\t\t<ceb:OrderHead>\n" +
20
+                "\t\t\t<ceb:guid>704ea0f1-b229-4e89-9f2f-c2e550e95c86</ceb:guid>\n" +
21
+                "\t\t\t<ceb:appType>1</ceb:appType>\n" +
22
+                "\t\t\t<ceb:appTime>20180507153001</ceb:appTime>\n" +
23
+                "\t\t\t<ceb:appStatus>2</ceb:appStatus>\n" +
24
+                "\t\t\t<ceb:orderType>E</ceb:orderType>\n" +
25
+                "\t\t\t<ceb:orderNo>order2018050711340001</ceb:orderNo>\n" +
26
+                "\t\t\t<ceb:ebpCode>1105910159</ceb:ebpCode>\n" +
27
+                "\t\t\t<ceb:ebpName>东方物通科技(北京)有限公司</ceb:ebpName>\n" +
28
+                "\t\t\t<ceb:ebcCode>1105910159</ceb:ebcCode>\n" +
29
+                "\t\t\t<ceb:ebcName>东方物通科技(北京)有限公司</ceb:ebcName>\n" +
30
+                "\t\t\t<ceb:goodsValue>12345678912345.12345</ceb:goodsValue>\n" +
31
+                "\t\t\t<ceb:freight>0</ceb:freight>\n" +
32
+                "\t\t\t<ceb:currency>142</ceb:currency>\n" +
33
+                "\t\t\t<ceb:note>test</ceb:note>\n" +
34
+                "\t\t</ceb:OrderHead>\n" +
35
+                "\t\t<ceb:OrderList>\n" +
36
+                "\t\t\t<ceb:gnum>1</ceb:gnum>\n" +
37
+                "\t\t\t<ceb:itemNo>AF001-001</ceb:itemNo>\n" +
38
+                "\t\t\t<ceb:itemName>小米盒子</ceb:itemName>\n" +
39
+                "\t\t\t<ceb:itemDescribe>小米盒子</ceb:itemDescribe>\n" +
40
+                "\t\t\t<ceb:barCode>2345123</ceb:barCode>\n" +
41
+                "\t\t\t<ceb:unit>aaa</ceb:unit>\n" +
42
+                "\t\t\t<ceb:currency>aaa</ceb:currency>\n" +
43
+                "\t\t\t<ceb:qty>100</ceb:qty>\n" +
44
+                "\t\t\t<ceb:price>20</ceb:price>\n" +
45
+                "\t\t\t<ceb:totalPrice>2000</ceb:totalPrice>\n" +
46
+                "\t\t\t<ceb:note>test</ceb:note>\n" +
47
+                "\t\t</ceb:OrderList>\n" +
48
+                "\t</ceb:Order>\n" +
49
+                "    <ceb:Order>\n" +
50
+                "\t\t<ceb:OrderHead>\n" +
51
+                "\t\t\t<ceb:guid>704ea0f1-b229-4e89-9f2f-c2e550e95c86</ceb:guid>\n" +
52
+                "\t\t\t<ceb:appType>1</ceb:appType>\n" +
53
+                "\t\t\t<ceb:appTime>20180507153001</ceb:appTime>\n" +
54
+                "\t\t\t<ceb:appStatus>2</ceb:appStatus>\n" +
55
+                "\t\t\t<ceb:orderType>E</ceb:orderType>\n" +
56
+                "\t\t\t<ceb:orderNo>order2018050711340001</ceb:orderNo>\n" +
57
+                "\t\t\t<ceb:ebpCode>1105910159</ceb:ebpCode>\n" +
58
+                "\t\t\t<ceb:ebpName>东方物通科技(北京)有限公司</ceb:ebpName>\n" +
59
+                "\t\t\t<ceb:ebcCode>1105910159</ceb:ebcCode>\n" +
60
+                "\t\t\t<ceb:ebcName>东方物通科技(北京)有限公司</ceb:ebcName>\n" +
61
+                "\t\t\t<ceb:goodsValue>12345678912345.12345</ceb:goodsValue>\n" +
62
+                "\t\t\t<ceb:freight>0</ceb:freight>\n" +
63
+                "\t\t\t<ceb:currency>142</ceb:currency>\n" +
64
+                "\t\t\t<ceb:note>test</ceb:note>\n" +
65
+                "\t\t</ceb:OrderHead>\n" +
66
+                "\t\t<ceb:OrderList>\n" +
67
+                "\t\t\t<ceb:gnum>1</ceb:gnum>\n" +
68
+                "\t\t\t<ceb:itemNo>AF001-001</ceb:itemNo>\n" +
69
+                "\t\t\t<ceb:itemName>小米盒子</ceb:itemName>\n" +
70
+                "\t\t\t<ceb:itemDescribe>小米盒子</ceb:itemDescribe>\n" +
71
+                "\t\t\t<ceb:barCode>2345123</ceb:barCode>\n" +
72
+                "\t\t\t<ceb:unit>aaa</ceb:unit>\n" +
73
+                "\t\t\t<ceb:currency>aaa</ceb:currency>\n" +
74
+                "\t\t\t<ceb:qty>100</ceb:qty>\n" +
75
+                "\t\t\t<ceb:price>20</ceb:price>\n" +
76
+                "\t\t\t<ceb:totalPrice>2000</ceb:totalPrice>\n" +
77
+                "\t\t\t<ceb:note>test</ceb:note>\n" +
78
+                "\t\t</ceb:OrderList>\n" +
79
+                "\t</ceb:Order>\n" +
80
+                "\t<ceb:BaseTransfer>\n" +
81
+                "\t\t<ceb:copCode>1105910159</ceb:copCode>\n" +
82
+                "\t\t<ceb:copName>东方物通科技(北京)有限公司</ceb:copName>\n" +
83
+                "\t\t<ceb:dxpMode>DXP</ceb:dxpMode>\n" +
84
+                "\t\t<ceb:dxpId>DXPLGS0000000001</ceb:dxpId>\n" +
85
+                "\t\t<ceb:note>test</ceb:note>\n" +
86
+                "\t</ceb:BaseTransfer>\n" +
87
+                "\t<ceb:BaseTransfer>\n" +
88
+                "\t\t<ceb:copCode>1105910159</ceb:copCode>\n" +
89
+                "\t\t<ceb:copName>东方物通科技(北京)有限公司</ceb:copName>\n" +
90
+                "\t\t<ceb:dxpMode>DXP</ceb:dxpMode>\n" +
91
+                "\t\t<ceb:dxpId>DXPLGS0000000001</ceb:dxpId>\n" +
92
+                "\t\t<ceb:note>test</ceb:note>\n" +
93
+                "\t</ceb:BaseTransfer>\n" +
94
+                "\t<ds:Signature xmlns:ds=\"http://www.w3.org/2000/09/xmldsig#\">\n" +
95
+                "<ds:SignedInfo>\n" +
96
+                "<ds:CanonicalizationMethod Algorithm=\"http://www.w3.org/TR/2001/REC-xml-c14n-20010315\"></ds:CanonicalizationMethod>\n" +
97
+                "<ds:SignatureMethod Algorithm=\"http://www.chinaport.gov.cn/2022/04/xmldsig#sm2-sm3\"></ds:SignatureMethod>\n" +
98
+                "<ds:Reference URI=\"\">\n" +
99
+                "<ds:Transforms>\n" +
100
+                "<ds:Transform Algorithm=\"http://www.w3.org/2000/09/xmldsig#enveloped-signature\"></ds:Transform>\n" +
101
+                "</ds:Transforms>\n" +
102
+                "<ds:DigestMethod Algorithm=\"http://www.chinaport.gov.cn/2022/04/xmldsig#sm3\"></ds:DigestMethod>\n" +
103
+                "<ds:DigestValue>SF/P+2sVsRQ9dJIqJSroW6ajb0Y=</ds:DigestValue>\n" +
104
+                "</ds:Reference>\n" +
105
+                "</ds:SignedInfo>\n" +
106
+                "<ds:SignatureValue>\n" +
107
+                "AI0wdcUHaaOR+FZ7W8lN6FrjzS+iru1qoBTCxm4S6knmLFLunPkLueELV69nYZr4x+uCPnNDD/wq\n" +
108
+                "jSqyPnH2xrrx8EFvsIhxNMCi+IlfS1z440YmeMEXnhff0pxSBGgrhETrq1tqp6QBZE5siBF4ow10\n" +
109
+                "0Q9RKaB+OMs4AB6I+0g=\n" +
110
+                "</ds:SignatureValue>\n" +
111
+                "<ds:KeyInfo>\n" +
112
+                "<ds:KeyName>0001</ds:KeyName>\n" +
113
+                "<ds:X509Data>\n" +
114
+                "<ds:X509Certificate>\n" +
115
+                "MIIEWzCCA8SgAwIBAgIDAJknMA0GCSqGSIb3DQEBBQUAMHYxCzAJBgNVBAYTAmNuMREwDwYDVQQK\n" +
116
+                "Hgh1NVtQU+NcuDENMAsGA1UECx4EAEMAQTENMAsGA1UECB4EUxdOrDEjMCEGA1UEAx4aTi1W/XU1\n" +
117
+                "W1BT41y4ZXBjbk4tX8NfAFPRUzoxETAPBgNVBAceCE4cZblef1c6MB4XDTE1MDUxOTAwMDAwMFoX\n" +
118
+                "DTQ5MTIwODAwMDAwMFowJTEjMCEGA1UEAx4aADEAM1P3W8aUpW1Li9VnDVKhVmhfAFPRUzowgZ8w\n" +
119
+                "DQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAKoQc7txXMb5VuXJnALpKQ1mAxFW2hxPwRhXY0mirNIL\n" +
120
+                "2gLY2z7ysqRvkpSRzr3BEq97xWLlXkQDG1QnzvTvh1YQzrffARSlCy6dYJ3YgM+Bps2NsPXhw1Lk\n" +
121
+                "vk0wn7LXAskEbwRgLihu1pH6/IGEocgeFusWTXT6B/ppTiEXL/87AgMBAAGjggJGMIICQjALBgNV\n" +
122
+                "HQ8EBAMCBsAwCQYDVR0TBAIwADCBoAYDVR0jBIGYMIGVgBQsaDiQrlh9ryILr2BYMK/wvmRvlqF6\n" +
123
+                "pHgwdjELMAkGA1UEBhMCY24xETAPBgNVBAoeCHU1W1BT41y4MQ0wCwYDVQQLHgQAQwBBMQ0wCwYD\n" +
124
+                "VQQIHgRTF06sMSMwIQYDVQQDHhpOLVb9dTVbUFPjXLhlcGNuTi1fw18AU9FTOjERMA8GA1UEBx4I\n" +
125
+                "ThxluV5/VzqCASUwHQYDVR0OBBYEFPcD90hfpSLKzuhaE3NvhU1xwHDAMEIGA1UdIAQ7MDkwNwYG\n" +
126
+                "K4EHAQECMC0wKwYIKwYBBQUHAgEWH2h0dHA6Ly9jcHMuY2hpbmFwb3J0Lmdvdi5jbi9DUFMwQgYD\n" +
127
+                "VR0fBDswOTA3oDWgM4YxaHR0cDovL2xkYXAuY2hpbmFwb3J0Lmdvdi5jbjo4MDg4L2R6a2EwMDAt\n" +
128
+                "MTk2LmNybDA9BggrBgEFBQcBAQQxMC8wLQYIKwYBBQUHMAGGIWh0dHA6Ly9vY3NwLmNoaW5hcG9y\n" +
129
+                "dC5nb3YuY246ODA4ODAqBgorBgEEAalDZAUBBBwWGtbQufq159fTv9qwtsr9vt3W0NDEv6q3osf4\n" +
130
+                "MBoGCisGAQQBqUNkBQYEDBYKUzAyMDEyMDAzODAaBgorBgEEAalDZAUJBAwWClMwMjAxMjAwMzgw\n" +
131
+                "EgYKKwYBBAGpQ2QCBAQEFgJDQTASBgorBgEEAalDZAIBBAQWAjE5MBMGBSpWCwcFBAoWCLXn19O/\n" +
132
+                "2rC2MA0GCSqGSIb3DQEBBQUAA4GBAFqdOOqCs/0zfJj5NM3UPXzAK/yIyx6b8ZEQXuY/aojzE46Q\n" +
133
+                "QXX1/N+G3DsKPvUhXQj1mAsZQeT0aMiUa1aNCd0P8p+PsfrB9E5oZnFhp4cLDkkuh2gx+MCFOHe2\n" +
134
+                "oEbi2/nCZpvWRJ34id5szTIw1n96/nrrg2+qFk+ddFr0xRzz\n" +
135
+                "</ds:X509Certificate>\n" +
136
+                "</ds:X509Data>\n" +
137
+                "</ds:KeyInfo>\n" +
138
+                "</ds:Signature>\n" +
139
+                "</ceb:CEB303Message>";
140
+
141
+
142
+
143
+
144
+
145
+
146
+
147
+
148
+
149
+
150
+
151
+        // XMLString转Map
152
+        System.out.println(xml);
153
+        Map<String, Object> map = XmlUtil.xmlToMap(xml);
154
+        System.out.println(JSONUtil.toJsonStr(map));
155
+
156
+        // map解析
157
+        Document ceb = XmlUtil.mapToXml(map, "ceb:CEB303Message");
158
+        // 添加首个Node的属性
159
+        Element element = ceb.getDocumentElement();
160
+        element.setAttribute("guid", "311af125-6fed-4603-8c5d-49b1fa4b4b9b");
161
+        element.setAttribute("version", "1.0");
162
+        element.setAttribute("xmlns:xsi", "http://www.w3.org/2001/XMLSchema-instance");
163
+        element.setAttribute("xmlns:ceb", "http://www.chinaport.gov.cn/ceb");
164
+        ceb.setXmlStandalone(true);
165
+        // 转String
166
+        String xmlString = XmlUtil.toStr(ceb);
167
+        System.out.println();
168
+
169
+        //requestMsg.setBaseTransfer();
170
+    }
171
+}

+ 6 - 4
buyer-api/src/test/resources/application.yml

@@ -179,10 +179,12 @@ logging:
179 179
   file:
180 180
     # 指定路径
181 181
     path: lili-logs
182
-    # 最大保存天数
183
-    max-history: 7
184
-    # 每个文件最大大小
185
-    max-size: 5MB
182
+  logback:
183
+    rollingpolicy:
184
+      # 最大保存天数
185
+      max-history: 7
186
+      # 每个文件最大大小
187
+      max-file-size: 5MB
186 188
 #加密参数
187 189
 jasypt:
188 190
   encryptor:

+ 417 - 418
framework/pom.xml

@@ -1,419 +1,418 @@
1
-<?xml version="1.0" encoding="UTF-8"?>
2
-<project xmlns="http://maven.apache.org/POM/4.0.0"
3
-         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4
-         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
5
-    <modelVersion>4.0.0</modelVersion>
6
-
7
-    <parent>
8
-        <groupId>cn.lili</groupId>
9
-        <artifactId>lili-shop-parent</artifactId>
10
-        <version>${revision}</version>
11
-        <relativePath>../pom.xml</relativePath>
12
-    </parent>
13
-
14
-    <artifactId>framework</artifactId>
15
-    <packaging>jar</packaging>
16
-
17
-    <dependencies>
18
-        <dependency>
19
-            <groupId>org.springframework.boot</groupId>
20
-            <artifactId>spring-boot-properties-migrator</artifactId>
21
-            <scope>runtime</scope>
22
-        </dependency>
23
-        <dependency>
24
-            <groupId>org.junit.vintage</groupId>
25
-            <artifactId>junit-vintage-engine</artifactId>
26
-            <scope>test</scope>
27
-            <exclusions>
28
-                <exclusion>
29
-                    <groupId>org.hamcrest</groupId>
30
-                    <artifactId>hamcrest-core</artifactId>
31
-                </exclusion>
32
-            </exclusions>
33
-        </dependency>
34
-        <!--定时任务-->
35
-        <dependency>
36
-            <groupId>org.springframework.boot</groupId>
37
-            <artifactId>spring-boot-starter-quartz</artifactId>
38
-            <exclusions>
39
-                <exclusion>
40
-                    <artifactId>slf4j-api</artifactId>
41
-                    <groupId>org.slf4j</groupId>
42
-                </exclusion>
43
-            </exclusions>
44
-        </dependency>
45
-
46
-        <dependency>
47
-            <groupId>org.springframework.boot</groupId>
48
-            <artifactId>spring-boot-starter-web</artifactId>
49
-            <exclusions>
50
-                <exclusion>
51
-                    <artifactId>log4j-to-slf4j</artifactId>
52
-                    <groupId>org.apache.logging.log4j</groupId>
53
-                </exclusion>
54
-            </exclusions>
55
-        </dependency>
56
-        <dependency>
57
-            <groupId>org.springframework.boot</groupId>
58
-            <artifactId>spring-boot-starter-security</artifactId>
59
-        </dependency>
60
-        <dependency>
61
-            <groupId>org.springframework.boot</groupId>
62
-            <artifactId>spring-boot-starter-validation</artifactId>
63
-        </dependency>
64
-        <dependency>
65
-            <groupId>org.springframework.boot</groupId>
66
-            <artifactId>spring-boot-configuration-processor</artifactId>
67
-            <optional>true</optional>
68
-        </dependency>
69
-        <dependency>
70
-            <groupId>org.springframework.boot</groupId>
71
-            <artifactId>spring-boot-starter-aop</artifactId>
72
-        </dependency>
73
-        <dependency>
74
-            <groupId>org.springframework.boot</groupId>
75
-            <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
76
-            <exclusions>
77
-                <exclusion>
78
-                    <artifactId>HdrHistogram</artifactId>
79
-                    <groupId>org.hdrhistogram</groupId>
80
-                </exclusion>
81
-                <exclusion>
82
-                    <artifactId>slf4j-api</artifactId>
83
-                    <groupId>org.slf4j</groupId>
84
-                </exclusion>
85
-            </exclusions>
86
-        </dependency>
87
-        <dependency>
88
-            <groupId>org.springframework</groupId>
89
-            <artifactId>spring-context-support</artifactId>
90
-        </dependency>
91
-        <dependency>
92
-            <groupId>org.springframework.integration</groupId>
93
-            <artifactId>spring-integration-redis</artifactId>
94
-            <exclusions>
95
-                <exclusion>
96
-                    <artifactId>slf4j-api</artifactId>
97
-                    <groupId>org.slf4j</groupId>
98
-                </exclusion>
99
-            </exclusions>
100
-        </dependency>
101
-        <dependency>
102
-            <groupId>org.apache.commons</groupId>
103
-            <artifactId>commons-pool2</artifactId>
104
-        </dependency>
105
-        <!--        &lt;!&ndash; Websocket &ndash;&gt;-->
106
-        <!--        <dependency>-->
107
-        <!--            <groupId>org.springframework.boot</groupId>-->
108
-        <!--            <artifactId>spring-boot-starter-websocket</artifactId>-->
109
-        <!--        </dependency>-->
110
-        <!-- MybatisPlus -->
111
-        <dependency>
112
-            <groupId>com.baomidou</groupId>
113
-            <artifactId>mybatis-plus-boot-starter</artifactId>
114
-            <version>${mybatis-plus-version}</version>
115
-            <exclusions>
116
-                <exclusion>
117
-                    <artifactId>slf4j-api</artifactId>
118
-                    <groupId>org.slf4j</groupId>
119
-                </exclusion>
120
-            </exclusions>
121
-        </dependency>
122
-        <!-- Mysql Connector -->
123
-        <dependency>
124
-            <groupId>mysql</groupId>
125
-            <artifactId>mysql-connector-java</artifactId>
126
-        </dependency>
127
-        <!-- Redis-->
128
-        <dependency>
129
-            <groupId>org.springframework.boot</groupId>
130
-            <artifactId>spring-boot-starter-data-redis</artifactId>
131
-        </dependency>
132
-        <!-- https://mvnrepository.com/artifact/org.redisson/redisson-spring-boot-starter -->
133
-        <dependency>
134
-            <groupId>org.redisson</groupId>
135
-            <artifactId>redisson</artifactId>
136
-            <version>${redisson}</version>
137
-        </dependency>
138
-
139
-        <dependency>
140
-            <groupId>com.github.xiaoymin</groupId>
141
-            <artifactId>knife4j-spring-boot-starter</artifactId>
142
-            <version>${knife4j.version}</version>
143
-            <exclusions>
144
-                <exclusion>
145
-                    <artifactId>slf4j-api</artifactId>
146
-                    <groupId>org.slf4j</groupId>
147
-                </exclusion>
148
-            </exclusions>
149
-        </dependency>
150
-        <!-- Hutool工具包 -->
151
-        <dependency>
152
-            <groupId>cn.hutool</groupId>
153
-            <artifactId>hutool-all</artifactId>
154
-            <version>${Hutool-version}</version>
155
-        </dependency>
156
-        <dependency>
157
-            <groupId>io.github.biezhi</groupId>
158
-            <artifactId>TinyPinyin</artifactId>
159
-            <version>${TinyPinyin-verions}</version>
160
-        </dependency>
161
-        <!-- Lombok -->
162
-        <dependency>
163
-            <groupId>org.projectlombok</groupId>
164
-            <artifactId>lombok</artifactId>
165
-            <version>${lombok-version}</version>
166
-        </dependency>
167
-        <!-- Jasypt加密 -->
168
-        <dependency>
169
-            <groupId>com.github.ulisesbocchio</groupId>
170
-            <artifactId>jasypt-spring-boot-starter</artifactId>
171
-            <version>${jasypt-version}</version>
172
-        </dependency>
173
-        <!-- 阿里云核心包-->
174
-        <dependency>
175
-            <groupId>com.aliyun</groupId>
176
-            <artifactId>aliyun-java-sdk-core</artifactId>
177
-            <version>${aliyun-version}</version>
178
-            <exclusions>
179
-                <exclusion>
180
-                    <artifactId>slf4j-api</artifactId>
181
-                    <groupId>org.slf4j</groupId>
182
-                </exclusion>
183
-            </exclusions>
184
-        </dependency>
185
-        <!-- 阿里云OSS -->
186
-        <dependency>
187
-            <groupId>com.aliyun.oss</groupId>
188
-            <artifactId>aliyun-sdk-oss</artifactId>
189
-            <version>${aliyun-sdk-oss-version}</version>
190
-            <exclusions>
191
-                <exclusion>
192
-                    <artifactId>aliyun-java-sdk-core</artifactId>
193
-                    <groupId>com.aliyun</groupId>
194
-                </exclusion>
195
-            </exclusions>
196
-        </dependency>
197
-
198
-        <dependency>
199
-            <groupId>com.aliyun</groupId>
200
-            <artifactId>dysmsapi20170525</artifactId>
201
-            <version>${aliyun-sdk-dysms-version}</version>
202
-            <exclusions>
203
-                <exclusion>
204
-                    <artifactId>org.jacoco.agent</artifactId>
205
-                    <groupId>org.jacoco</groupId>
206
-                </exclusion>
207
-                <exclusion>
208
-                    <artifactId>bcprov-jdk15on</artifactId>
209
-                    <groupId>org.bouncycastle</groupId>
210
-                </exclusion>
211
-            </exclusions>
212
-        </dependency>
213
-        <!--脚本编程-->
214
-        <dependency>
215
-            <groupId>org.codehaus.groovy</groupId>
216
-            <artifactId>groovy</artifactId>
217
-        </dependency>
218
-        <!-- rocketmq-spring-boot-starter -->
219
-        <dependency>
220
-            <groupId>org.apache.rocketmq</groupId>
221
-            <artifactId>rocketmq-spring-boot-starter</artifactId>
222
-            <version>${rocketmq-version}</version>
223
-            <exclusions>
224
-                <exclusion>
225
-                    <artifactId>fastjson</artifactId>
226
-                    <groupId>com.alibaba</groupId>
227
-                </exclusion>
228
-                <exclusion>
229
-                    <artifactId>slf4j-api</artifactId>
230
-                    <groupId>org.slf4j</groupId>
231
-                </exclusion>
232
-            </exclusions>
233
-        </dependency>
234
-        <!--   token加密 -->
235
-        <dependency>
236
-            <groupId>io.jsonwebtoken</groupId>
237
-            <artifactId>jjwt-api</artifactId>
238
-            <version>${jwt-version}</version>
239
-        </dependency>
240
-        <dependency>
241
-            <groupId>io.jsonwebtoken</groupId>
242
-            <artifactId>jjwt-impl</artifactId>
243
-            <version>${jwt-version}</version>
244
-            <scope>runtime</scope>
245
-        </dependency>
246
-        <dependency>
247
-            <groupId>io.jsonwebtoken</groupId>
248
-            <artifactId>jjwt-jackson</artifactId>
249
-            <version>${jwt-version}</version>
250
-            <scope>runtime</scope>
251
-        </dependency>
252
-        <!--test-->
253
-        <dependency>
254
-            <groupId>org.springframework.boot</groupId>
255
-            <artifactId>spring-boot-starter-test</artifactId>
256
-            <exclusions>
257
-                <exclusion>
258
-                    <artifactId>slf4j-api</artifactId>
259
-                    <groupId>org.slf4j</groupId>
260
-                </exclusion>
261
-            </exclusions>
262
-        </dependency>
263
-
264
-        <!-- 解决版本提示问题 -->
265
-        <dependency>
266
-            <groupId>org.antlr</groupId>
267
-            <artifactId>antlr4</artifactId>
268
-            <version>${antlr4-version}</version>
269
-        </dependency>
270
-
271
-        <dependency>
272
-            <groupId>org.apache.commons</groupId>
273
-            <artifactId>commons-lang3</artifactId>
274
-        </dependency>
275
-
276
-
277
-        <!--sharding jdbc springboot-->
278
-        <dependency>
279
-            <groupId>org.apache.shardingsphere</groupId>
280
-            <artifactId>sharding-jdbc-spring-boot-starter</artifactId>
281
-            <version>${sharding-jdbc-version}</version>
282
-            <exclusions>
283
-                <exclusion>
284
-                    <artifactId>groovy</artifactId>
285
-                    <groupId>org.codehaus.groovy</groupId>
286
-                </exclusion>
287
-                <exclusion>
288
-                    <artifactId>commons-collections4</artifactId>
289
-                    <groupId>org.apache.commons</groupId>
290
-                </exclusion>
291
-                <exclusion>
292
-                    <artifactId>antlr4-runtime</artifactId>
293
-                    <groupId>org.antlr</groupId>
294
-                </exclusion>
295
-                <exclusion>
296
-                    <artifactId>slf4j-api</artifactId>
297
-                    <groupId>org.slf4j</groupId>
298
-                </exclusion>
299
-            </exclusions>
300
-        </dependency>
301
-
302
-        <dependency>
303
-            <groupId>org.apache.shardingsphere</groupId>
304
-            <artifactId>sharding-jdbc-spring-namespace</artifactId>
305
-            <version>${sharding-jdbc-version}</version>
306
-            <exclusions>
307
-                <exclusion>
308
-                    <artifactId>slf4j-api</artifactId>
309
-                    <groupId>org.slf4j</groupId>
310
-                </exclusion>
311
-            </exclusions>
312
-        </dependency>
313
-        <!--druid-->
314
-        <dependency>
315
-            <groupId>com.alibaba</groupId>
316
-            <artifactId>druid</artifactId>
317
-            <version>${druid-version}</version>
318
-        </dependency>
319
-        <dependency>
320
-            <groupId>com.xkcoding.http</groupId>
321
-            <artifactId>simple-http</artifactId>
322
-            <version>${simple-http-version}</version>
323
-        </dependency>
324
-        <dependency>
325
-            <groupId>org.antlr</groupId>
326
-            <artifactId>antlr4-runtime</artifactId>
327
-            <version>${antlr4-runtime-version}</version>
328
-        </dependency>
329
-        <dependency>
330
-            <groupId>com.alipay.sdk</groupId>
331
-            <artifactId>alipay-sdk-java</artifactId>
332
-            <version>${alipay-sdk-version}</version>
333
-            <exclusions>
334
-                <exclusion>
335
-                    <artifactId>bcprov-jdk15on</artifactId>
336
-                    <groupId>org.bouncycastle</groupId>
337
-                </exclusion>
338
-                <exclusion>
339
-                    <artifactId>commons-logging</artifactId>
340
-                    <groupId>commons-logging</groupId>
341
-                </exclusion>
342
-                <exclusion>
343
-                    <artifactId>xml-apis</artifactId>
344
-                    <groupId>xml-apis</groupId>
345
-                </exclusion>
346
-            </exclusions>
347
-        </dependency>
348
-
349
-        <!--用户端类型处理-->
350
-        <dependency>
351
-            <groupId>eu.bitwalker</groupId>
352
-            <artifactId>UserAgentUtils</artifactId>
353
-            <version>${userAgentUtils}</version>
354
-        </dependency>
355
-        <dependency>
356
-            <groupId>org.apache.poi</groupId>
357
-            <artifactId>poi</artifactId>
358
-            <version>${poi-version}</version>
359
-        </dependency>
360
-        <dependency>
361
-            <groupId>org.apache.poi</groupId>
362
-            <artifactId>poi-ooxml</artifactId>
363
-            <version>${poi-ooxml-version}</version>
364
-        </dependency>
365
-        <!--集成logstash-->
366
-        <dependency>
367
-            <groupId>net.logstash.logback</groupId>
368
-            <artifactId>logstash-logback-encoder</artifactId>
369
-            <version>${logstash-logback-encoder}</version>
370
-        </dependency>
371
-        <dependency>
372
-            <groupId>de.codecentric</groupId>
373
-            <artifactId>spring-boot-admin-starter-client</artifactId>
374
-            <version>${de.codecentric}</version>
375
-        </dependency>
376
-        <!-- 开源多维码生成工具 -->
377
-        <dependency>
378
-            <groupId>com.google.zxing</groupId>
379
-            <artifactId>core</artifactId>
380
-            <version>${zxing}</version>
381
-        </dependency>
382
-        <dependency>
383
-            <groupId>com.google.zxing</groupId>
384
-            <artifactId>javase</artifactId>
385
-            <version>${zxing}</version>
386
-        </dependency>
387
-        <dependency>
388
-            <groupId>org.slf4j</groupId>
389
-            <artifactId>slf4j-api</artifactId>
390
-            <version>${slf4j-api}</version>
391
-        </dependency>
392
-        <!-- 开源多维码生成工具 -->
393
-        <dependency>
394
-            <groupId>com.github.xkzhangsan</groupId>
395
-            <artifactId>xk-time</artifactId>
396
-            <version>${xk-time}</version>
397
-        </dependency>
398
-        <dependency>
399
-            <groupId>org.apache.commons</groupId>
400
-            <artifactId>commons-text</artifactId>
401
-            <version>${commons-text}</version>
402
-        </dependency>
403
-        <!-- https://mvnrepository.com/artifact/com.googlecode.owasp-java-html-sanitizer/owasp-java-html-sanitizer -->
404
-        <dependency>
405
-            <groupId>com.googlecode.owasp-java-html-sanitizer</groupId>
406
-            <artifactId>owasp-java-html-sanitizer</artifactId>
407
-            <version>${owasp-java-html-sanitizer}</version>
408
-            <exclusions>
409
-                <exclusion>
410
-                    <artifactId>guava</artifactId>
411
-                    <groupId>com.google.guava</groupId>
412
-                </exclusion>
413
-            </exclusions>
414
-        </dependency>
415
-
416
-    </dependencies>
417
-
418
-
1
+<?xml version="1.0" encoding="UTF-8"?>
2
+<project xmlns="http://maven.apache.org/POM/4.0.0"
3
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
5
+    <modelVersion>4.0.0</modelVersion>
6
+
7
+    <parent>
8
+        <groupId>cn.lili</groupId>
9
+        <artifactId>lili-shop-parent</artifactId>
10
+        <version>${revision}</version>
11
+        <relativePath>../pom.xml</relativePath>
12
+    </parent>
13
+
14
+    <artifactId>framework</artifactId>
15
+    <packaging>jar</packaging>
16
+
17
+    <dependencies>
18
+        <dependency>
19
+            <groupId>org.springframework.boot</groupId>
20
+            <artifactId>spring-boot-properties-migrator</artifactId>
21
+            <scope>runtime</scope>
22
+        </dependency>
23
+        <dependency>
24
+            <groupId>org.junit.vintage</groupId>
25
+            <artifactId>junit-vintage-engine</artifactId>
26
+            <scope>test</scope>
27
+            <exclusions>
28
+                <exclusion>
29
+                    <groupId>org.hamcrest</groupId>
30
+                    <artifactId>hamcrest-core</artifactId>
31
+                </exclusion>
32
+            </exclusions>
33
+        </dependency>
34
+        <!--定时任务-->
35
+        <dependency>
36
+            <groupId>org.springframework.boot</groupId>
37
+            <artifactId>spring-boot-starter-quartz</artifactId>
38
+            <exclusions>
39
+                <exclusion>
40
+                    <artifactId>slf4j-api</artifactId>
41
+                    <groupId>org.slf4j</groupId>
42
+                </exclusion>
43
+            </exclusions>
44
+        </dependency>
45
+
46
+        <dependency>
47
+            <groupId>org.springframework.boot</groupId>
48
+            <artifactId>spring-boot-starter-web</artifactId>
49
+            <exclusions>
50
+                <exclusion>
51
+                    <artifactId>log4j-to-slf4j</artifactId>
52
+                    <groupId>org.apache.logging.log4j</groupId>
53
+                </exclusion>
54
+            </exclusions>
55
+        </dependency>
56
+        <dependency>
57
+            <groupId>org.springframework.boot</groupId>
58
+            <artifactId>spring-boot-starter-security</artifactId>
59
+        </dependency>
60
+        <dependency>
61
+            <groupId>org.springframework.boot</groupId>
62
+            <artifactId>spring-boot-starter-validation</artifactId>
63
+        </dependency>
64
+        <dependency>
65
+            <groupId>org.springframework.boot</groupId>
66
+            <artifactId>spring-boot-configuration-processor</artifactId>
67
+            <optional>true</optional>
68
+        </dependency>
69
+        <dependency>
70
+            <groupId>org.springframework.boot</groupId>
71
+            <artifactId>spring-boot-starter-aop</artifactId>
72
+        </dependency>
73
+        <dependency>
74
+            <groupId>org.springframework.boot</groupId>
75
+            <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
76
+            <exclusions>
77
+                <exclusion>
78
+                    <artifactId>HdrHistogram</artifactId>
79
+                    <groupId>org.hdrhistogram</groupId>
80
+                </exclusion>
81
+                <exclusion>
82
+                    <artifactId>slf4j-api</artifactId>
83
+                    <groupId>org.slf4j</groupId>
84
+                </exclusion>
85
+            </exclusions>
86
+        </dependency>
87
+        <dependency>
88
+            <groupId>org.springframework</groupId>
89
+            <artifactId>spring-context-support</artifactId>
90
+        </dependency>
91
+        <dependency>
92
+            <groupId>org.springframework.integration</groupId>
93
+            <artifactId>spring-integration-redis</artifactId>
94
+            <exclusions>
95
+                <exclusion>
96
+                    <artifactId>slf4j-api</artifactId>
97
+                    <groupId>org.slf4j</groupId>
98
+                </exclusion>
99
+            </exclusions>
100
+        </dependency>
101
+        <dependency>
102
+            <groupId>org.apache.commons</groupId>
103
+            <artifactId>commons-pool2</artifactId>
104
+        </dependency>
105
+        <!--        &lt;!&ndash; Websocket &ndash;&gt;-->
106
+        <!--        <dependency>-->
107
+        <!--            <groupId>org.springframework.boot</groupId>-->
108
+        <!--            <artifactId>spring-boot-starter-websocket</artifactId>-->
109
+        <!--        </dependency>-->
110
+        <!-- MybatisPlus -->
111
+        <dependency>
112
+            <groupId>com.baomidou</groupId>
113
+            <artifactId>mybatis-plus-boot-starter</artifactId>
114
+            <version>${mybatis-plus-version}</version>
115
+            <exclusions>
116
+                <exclusion>
117
+                    <artifactId>slf4j-api</artifactId>
118
+                    <groupId>org.slf4j</groupId>
119
+                </exclusion>
120
+            </exclusions>
121
+        </dependency>
122
+        <!-- Mysql Connector -->
123
+        <dependency>
124
+            <groupId>mysql</groupId>
125
+            <artifactId>mysql-connector-java</artifactId>
126
+        </dependency>
127
+        <!-- Redis-->
128
+        <dependency>
129
+            <groupId>org.springframework.boot</groupId>
130
+            <artifactId>spring-boot-starter-data-redis</artifactId>
131
+        </dependency>
132
+        <!-- https://mvnrepository.com/artifact/org.redisson/redisson-spring-boot-starter -->
133
+        <dependency>
134
+            <groupId>org.redisson</groupId>
135
+            <artifactId>redisson</artifactId>
136
+            <version>${redisson}</version>
137
+        </dependency>
138
+
139
+        <dependency>
140
+            <groupId>com.github.xiaoymin</groupId>
141
+            <artifactId>knife4j-spring-boot-starter</artifactId>
142
+            <version>${knife4j.version}</version>
143
+            <exclusions>
144
+                <exclusion>
145
+                    <artifactId>slf4j-api</artifactId>
146
+                    <groupId>org.slf4j</groupId>
147
+                </exclusion>
148
+            </exclusions>
149
+        </dependency>
150
+        <!-- Hutool工具包 -->
151
+        <dependency>
152
+            <groupId>cn.hutool</groupId>
153
+            <artifactId>hutool-all</artifactId>
154
+            <version>${Hutool-version}</version>
155
+        </dependency>
156
+        <dependency>
157
+            <groupId>io.github.biezhi</groupId>
158
+            <artifactId>TinyPinyin</artifactId>
159
+            <version>${TinyPinyin-verions}</version>
160
+        </dependency>
161
+        <!-- Lombok -->
162
+        <dependency>
163
+            <groupId>org.projectlombok</groupId>
164
+            <artifactId>lombok</artifactId>
165
+            <version>${lombok-version}</version>
166
+        </dependency>
167
+        <!-- Jasypt加密 -->
168
+        <dependency>
169
+            <groupId>com.github.ulisesbocchio</groupId>
170
+            <artifactId>jasypt-spring-boot-starter</artifactId>
171
+            <version>${jasypt-version}</version>
172
+        </dependency>
173
+        <!-- 阿里云核心包-->
174
+        <dependency>
175
+            <groupId>com.aliyun</groupId>
176
+            <artifactId>aliyun-java-sdk-core</artifactId>
177
+            <version>${aliyun-version}</version>
178
+            <exclusions>
179
+                <exclusion>
180
+                    <artifactId>slf4j-api</artifactId>
181
+                    <groupId>org.slf4j</groupId>
182
+                </exclusion>
183
+            </exclusions>
184
+        </dependency>
185
+        <!-- 阿里云OSS -->
186
+        <dependency>
187
+            <groupId>com.aliyun.oss</groupId>
188
+            <artifactId>aliyun-sdk-oss</artifactId>
189
+            <version>${aliyun-sdk-oss-version}</version>
190
+            <exclusions>
191
+                <exclusion>
192
+                    <artifactId>aliyun-java-sdk-core</artifactId>
193
+                    <groupId>com.aliyun</groupId>
194
+                </exclusion>
195
+            </exclusions>
196
+        </dependency>
197
+
198
+        <dependency>
199
+            <groupId>com.aliyun</groupId>
200
+            <artifactId>dysmsapi20170525</artifactId>
201
+            <version>${aliyun-sdk-dysms-version}</version>
202
+            <exclusions>
203
+                <exclusion>
204
+                    <artifactId>org.jacoco.agent</artifactId>
205
+                    <groupId>org.jacoco</groupId>
206
+                </exclusion>
207
+                <exclusion>
208
+                    <artifactId>bcprov-jdk15on</artifactId>
209
+                    <groupId>org.bouncycastle</groupId>
210
+                </exclusion>
211
+            </exclusions>
212
+        </dependency>
213
+        <!--脚本编程-->
214
+        <dependency>
215
+            <groupId>org.codehaus.groovy</groupId>
216
+            <artifactId>groovy</artifactId>
217
+        </dependency>
218
+        <!-- rocketmq-spring-boot-starter -->
219
+        <dependency>
220
+            <groupId>org.apache.rocketmq</groupId>
221
+            <artifactId>rocketmq-spring-boot-starter</artifactId>
222
+            <version>${rocketmq-version}</version>
223
+            <exclusions>
224
+                <exclusion>
225
+                    <artifactId>fastjson</artifactId>
226
+                    <groupId>com.alibaba</groupId>
227
+                </exclusion>
228
+                <exclusion>
229
+                    <artifactId>slf4j-api</artifactId>
230
+                    <groupId>org.slf4j</groupId>
231
+                </exclusion>
232
+            </exclusions>
233
+        </dependency>
234
+        <!--   token加密 -->
235
+        <dependency>
236
+            <groupId>io.jsonwebtoken</groupId>
237
+            <artifactId>jjwt-api</artifactId>
238
+            <version>${jwt-version}</version>
239
+        </dependency>
240
+        <dependency>
241
+            <groupId>io.jsonwebtoken</groupId>
242
+            <artifactId>jjwt-impl</artifactId>
243
+            <version>${jwt-version}</version>
244
+            <scope>runtime</scope>
245
+        </dependency>
246
+        <dependency>
247
+            <groupId>io.jsonwebtoken</groupId>
248
+            <artifactId>jjwt-jackson</artifactId>
249
+            <version>${jwt-version}</version>
250
+            <scope>runtime</scope>
251
+        </dependency>
252
+        <!--test-->
253
+        <dependency>
254
+            <groupId>org.springframework.boot</groupId>
255
+            <artifactId>spring-boot-starter-test</artifactId>
256
+            <exclusions>
257
+                <exclusion>
258
+                    <artifactId>slf4j-api</artifactId>
259
+                    <groupId>org.slf4j</groupId>
260
+                </exclusion>
261
+            </exclusions>
262
+        </dependency>
263
+
264
+        <!-- 解决版本提示问题 -->
265
+        <dependency>
266
+            <groupId>org.antlr</groupId>
267
+            <artifactId>antlr4</artifactId>
268
+            <version>${antlr4-version}</version>
269
+        </dependency>
270
+
271
+        <dependency>
272
+            <groupId>org.apache.commons</groupId>
273
+            <artifactId>commons-lang3</artifactId>
274
+        </dependency>
275
+
276
+
277
+        <!--sharding jdbc springboot-->
278
+        <dependency>
279
+            <groupId>org.apache.shardingsphere</groupId>
280
+            <artifactId>sharding-jdbc-spring-boot-starter</artifactId>
281
+            <version>${sharding-jdbc-version}</version>
282
+            <exclusions>
283
+                <exclusion>
284
+                    <artifactId>groovy</artifactId>
285
+                    <groupId>org.codehaus.groovy</groupId>
286
+                </exclusion>
287
+                <exclusion>
288
+                    <artifactId>commons-collections4</artifactId>
289
+                    <groupId>org.apache.commons</groupId>
290
+                </exclusion>
291
+                <exclusion>
292
+                    <artifactId>antlr4-runtime</artifactId>
293
+                    <groupId>org.antlr</groupId>
294
+                </exclusion>
295
+                <exclusion>
296
+                    <artifactId>slf4j-api</artifactId>
297
+                    <groupId>org.slf4j</groupId>
298
+                </exclusion>
299
+            </exclusions>
300
+        </dependency>
301
+
302
+        <dependency>
303
+            <groupId>org.apache.shardingsphere</groupId>
304
+            <artifactId>sharding-jdbc-spring-namespace</artifactId>
305
+            <version>${sharding-jdbc-version}</version>
306
+            <exclusions>
307
+                <exclusion>
308
+                    <artifactId>slf4j-api</artifactId>
309
+                    <groupId>org.slf4j</groupId>
310
+                </exclusion>
311
+            </exclusions>
312
+        </dependency>
313
+        <!--druid-->
314
+        <dependency>
315
+            <groupId>com.alibaba</groupId>
316
+            <artifactId>druid</artifactId>
317
+            <version>${druid-version}</version>
318
+        </dependency>
319
+        <dependency>
320
+            <groupId>com.xkcoding.http</groupId>
321
+            <artifactId>simple-http</artifactId>
322
+            <version>${simple-http-version}</version>
323
+        </dependency>
324
+        <dependency>
325
+            <groupId>org.antlr</groupId>
326
+            <artifactId>antlr4-runtime</artifactId>
327
+            <version>${antlr4-runtime-version}</version>
328
+        </dependency>
329
+        <dependency>
330
+            <groupId>com.alipay.sdk</groupId>
331
+            <artifactId>alipay-sdk-java</artifactId>
332
+            <version>${alipay-sdk-version}</version>
333
+            <exclusions>
334
+                <exclusion>
335
+                    <artifactId>bcprov-jdk15on</artifactId>
336
+                    <groupId>org.bouncycastle</groupId>
337
+                </exclusion>
338
+                <exclusion>
339
+                    <artifactId>commons-logging</artifactId>
340
+                    <groupId>commons-logging</groupId>
341
+                </exclusion>
342
+                <exclusion>
343
+                    <artifactId>xml-apis</artifactId>
344
+                    <groupId>xml-apis</groupId>
345
+                </exclusion>
346
+            </exclusions>
347
+        </dependency>
348
+
349
+        <!--用户端类型处理-->
350
+        <dependency>
351
+            <groupId>eu.bitwalker</groupId>
352
+            <artifactId>UserAgentUtils</artifactId>
353
+            <version>${userAgentUtils}</version>
354
+        </dependency>
355
+        <dependency>
356
+            <groupId>org.apache.poi</groupId>
357
+            <artifactId>poi</artifactId>
358
+            <version>${poi-version}</version>
359
+        </dependency>
360
+        <dependency>
361
+            <groupId>org.apache.poi</groupId>
362
+            <artifactId>poi-ooxml</artifactId>
363
+            <version>${poi-ooxml-version}</version>
364
+        </dependency>
365
+        <!--集成logstash-->
366
+        <dependency>
367
+            <groupId>net.logstash.logback</groupId>
368
+            <artifactId>logstash-logback-encoder</artifactId>
369
+            <version>${logstash-logback-encoder}</version>
370
+        </dependency>
371
+        <dependency>
372
+            <groupId>de.codecentric</groupId>
373
+            <artifactId>spring-boot-admin-starter-client</artifactId>
374
+            <version>${de.codecentric}</version>
375
+        </dependency>
376
+        <!-- 开源多维码生成工具 -->
377
+        <dependency>
378
+            <groupId>com.google.zxing</groupId>
379
+            <artifactId>core</artifactId>
380
+            <version>${zxing}</version>
381
+        </dependency>
382
+        <dependency>
383
+            <groupId>com.google.zxing</groupId>
384
+            <artifactId>javase</artifactId>
385
+            <version>${zxing}</version>
386
+        </dependency>
387
+        <dependency>
388
+            <groupId>org.slf4j</groupId>
389
+            <artifactId>slf4j-api</artifactId>
390
+            <version>${slf4j-api}</version>
391
+        </dependency>
392
+        <!-- 开源多维码生成工具 -->
393
+        <dependency>
394
+            <groupId>com.github.xkzhangsan</groupId>
395
+            <artifactId>xk-time</artifactId>
396
+            <version>${xk-time}</version>
397
+        </dependency>
398
+        <dependency>
399
+            <groupId>org.apache.commons</groupId>
400
+            <artifactId>commons-text</artifactId>
401
+            <version>${commons-text}</version>
402
+        </dependency>
403
+        <!-- https://mvnrepository.com/artifact/com.googlecode.owasp-java-html-sanitizer/owasp-java-html-sanitizer -->
404
+        <dependency>
405
+            <groupId>com.googlecode.owasp-java-html-sanitizer</groupId>
406
+            <artifactId>owasp-java-html-sanitizer</artifactId>
407
+            <version>${owasp-java-html-sanitizer}</version>
408
+            <exclusions>
409
+                <exclusion>
410
+                    <artifactId>guava</artifactId>
411
+                    <groupId>com.google.guava</groupId>
412
+                </exclusion>
413
+            </exclusions>
414
+        </dependency>
415
+
416
+    </dependencies>
417
+
419 418
 </project>

BIN
framework/src/lib/AESEncrypt.jar


+ 12 - 0
framework/src/main/java/cn/lili/common/enums/HTTPMethodEnum.java

@@ -0,0 +1,12 @@
1
+package cn.lili.common.enums;
2
+
3
+public enum HTTPMethodEnum {
4
+    GET,
5
+    POST,
6
+    PUT,
7
+    DELETE,
8
+    OPTIONS,
9
+    HEAD,
10
+    TRACE,
11
+    CONNECT
12
+}

+ 161 - 0
framework/src/main/java/cn/lili/common/enums/JGS20Unit.java

@@ -0,0 +1,161 @@
1
+package cn.lili.common.enums;
2
+
3
+import cn.lili.common.exception.UnitIllegalException;
4
+
5
+import java.util.stream.Stream;
6
+
7
+/**
8
+ * JGS-20海关业务代码集 - 计量单位代码
9
+ * @ref http://www.servicetree.cn/?p=456
10
+ */
11
+public enum JGS20Unit {
12
+    UNIT001("台", "001"),
13
+    UNIT002("座", "002"),
14
+    UNIT003("辆", "003"),
15
+    UNIT004("艘", "004"),
16
+    UNIT005("架", "005"),
17
+    UNIT006("套", "006"),
18
+    UNIT007("个", "007"),
19
+    UNIT008("只", "008"),
20
+    UNIT009("头", "009"),
21
+    UNIT010("张", "010"),
22
+    UNIT011("件", "011"),
23
+    UNIT012("支", "012"),
24
+    UNIT013("枝", "013"),
25
+    UNIT014("根", "014"),
26
+    UNIT015("条", "015"),
27
+    UNIT016("把", "016"),
28
+    UNIT017("块", "017"),
29
+    UNIT018("卷", "018"),
30
+    UNIT019("副", "019"),
31
+    UNIT020("片", "020"),
32
+    UNIT021("组", "021"),
33
+    UNIT022("份", "022"),
34
+    UNIT023("幅", "023"),
35
+    UNIT025("双", "025"),
36
+    UNIT026("对", "026"),
37
+    UNIT027("棵", "027"),
38
+    UNIT028("株", "028"),
39
+    UNIT029("井", "029"),
40
+    UNIT030("米", "030"),
41
+    UNIT031("盘", "031"),
42
+    UNIT032("平方米", "032"),
43
+    UNIT033("立方米", "033"),
44
+    UNIT034("筒", "034"),
45
+    UNIT035("千克", "035"),
46
+    UNIT036("克", "036"),
47
+    UNIT037("盆", "037"),
48
+    UNIT038("万个", "038"),
49
+    UNIT039("具", "039"),
50
+    UNIT040("百副", "040"),
51
+    UNIT041("百支", "041"),
52
+    UNIT042("百把", "042"),
53
+    UNIT043("百个", "043"),
54
+    UNIT044("百片", "044"),
55
+    UNIT045("刀", "045"),
56
+    UNIT046("疋", "046"),
57
+    UNIT047("公担", "047"),
58
+    UNIT048("扇", "048"),
59
+    UNIT049("百枝", "049"),
60
+    UNIT050("千只", "050"),
61
+    UNIT051("千块", "051"),
62
+    UNIT052("千盒", "052"),
63
+    UNIT053("千枝", "053"),
64
+    UNIT054("千个", "054"),
65
+    UNIT055("亿支", "055"),
66
+    UNIT056("亿个", "056"),
67
+    UNIT057("万套", "057"),
68
+    UNIT058("千张", "058"),
69
+    UNIT059("万张", "059"),
70
+    UNIT060("千伏安", "060"),
71
+    UNIT061("千瓦", "061"),
72
+    UNIT062("千瓦时", "062"),
73
+    UNIT063("千升", "063"),
74
+    UNIT067("英尺", "067"),
75
+    UNIT070("吨", "070"),
76
+    UNIT071("长吨", "071"),
77
+    UNIT072("短吨", "072"),
78
+    UNIT073("司马担", "073"),
79
+    UNIT074("司马斤", "074"),
80
+    UNIT075("斤", "075"),
81
+    UNIT076("磅", "076"),
82
+    UNIT077("担", "077"),
83
+    UNIT078("英担", "078"),
84
+    UNIT079("短担", "079"),
85
+    UNIT080("两", "080"),
86
+    UNIT081("市担", "081"),
87
+    UNIT083("盎司", "083"),
88
+    UNIT084("克拉", "084"),
89
+    UNIT085("市尺", "085"),
90
+    UNIT086("码", "086"),
91
+    UNIT088("英寸", "088"),
92
+    UNIT089("寸", "089"),
93
+    UNIT095("升", "095"),
94
+    UNIT096("毫升", "096"),
95
+    UNIT097("英加仑", "097"),
96
+    UNIT098("美加仑", "098"),
97
+    UNIT099("立方英尺", "099"),
98
+    UNIT101("立方尺", "101"),
99
+    UNIT110("平方码", "110"),
100
+    UNIT111("平方英尺", "111"),
101
+    UNIT112("平方尺", "112"),
102
+    UNIT115("英制马力", "115"),
103
+    UNIT116("公制马力", "116"),
104
+    UNIT118("令", "118"),
105
+    UNIT120("箱", "120"),
106
+    UNIT121("批", "121"),
107
+    UNIT122("罐", "122"),
108
+    UNIT123("桶", "123"),
109
+    UNIT124("扎", "124"),
110
+    UNIT125("包", "125"),
111
+    UNIT126("箩", "126"),
112
+    UNIT127("打", "127"),
113
+    UNIT128("筐", "128"),
114
+    UNIT129("罗", "129"),
115
+    UNIT130("匹", "130"),
116
+    UNIT131("册", "131"),
117
+    UNIT132("本", "132"),
118
+    UNIT133("发", "133"),
119
+    UNIT134("枚", "134"),
120
+    UNIT135("捆", "135"),
121
+    UNIT136("袋", "136"),
122
+    UNIT139("粒", "139"),
123
+    UNIT140("盒", "140"),
124
+    UNIT141("合", "141"),
125
+    UNIT142("瓶", "142"),
126
+    UNIT143("千支", "143"),
127
+    UNIT144("万双", "144"),
128
+    UNIT145("万粒", "145"),
129
+    UNIT146("千粒", "146"),
130
+    UNIT147("千米", "147"),
131
+    UNIT148("千英尺", "148"),
132
+    UNIT149("百万贝可", "149"),
133
+    UNIT163("部", "163"),
134
+    UNIT164("亿株", "164");
135
+
136
+    JGS20Unit(String cnName, String code) {
137
+        this.cnName = cnName;
138
+        this.code = code;
139
+    }
140
+
141
+    /**
142
+     * 根据中文名称获取
143
+     * @param cnName 中文名称
144
+     * @return JGS-20 标准单位
145
+     */
146
+    public static JGS20Unit ofCnName(String cnName){
147
+        return Stream.of(values())
148
+                .filter(unit -> unit.cnName.equals(cnName))
149
+                .findFirst()
150
+                .orElseThrow(UnitIllegalException::new);
151
+    }
152
+
153
+    /**
154
+     * 中文名称
155
+     */
156
+    public String cnName;
157
+    /**
158
+     * 计量单位代码
159
+     */
160
+    public String code;
161
+}

+ 1 - 0
framework/src/main/java/cn/lili/common/enums/ResultCode.java

@@ -181,6 +181,7 @@ public enum ResultCode {
181 181
     ORDER_BATCH_DELIVER_ERROR(31013, "批量发货,文件读取失败"),
182 182
     ORDER_ITEM_NOT_EXIST(31014, "当前订单项不存在!"),
183 183
     POINT_NOT_ENOUGH(31015, "当前会员积分不足购买当前积分商品!"),
184
+    ORDER_CUSTOMS_ERROR(31016, "订单推送海关失败"),
184 185
 
185 186
 
186 187
     /**

+ 12 - 0
framework/src/main/java/cn/lili/common/exception/UnitIllegalException.java

@@ -0,0 +1,12 @@
1
+package cn.lili.common.exception;
2
+
3
+import lombok.Data;
4
+
5
+@Data
6
+public class UnitIllegalException extends RuntimeException {
7
+
8
+    /**
9
+     * 异常消息
10
+     */
11
+    private String msg = "单位转换失败,请检查单位信息维护是否遵照JGS-20标准,参考网址:http://www.servicetree.cn/?p=456";
12
+}

+ 18 - 0
framework/src/main/java/cn/lili/common/properties/AbstractHttpEndPointProperties.java

@@ -0,0 +1,18 @@
1
+package cn.lili.common.properties;
2
+
3
+import cn.lili.common.enums.HTTPMethodEnum;
4
+
5
+public abstract class AbstractHttpEndPointProperties {
6
+
7
+    /** 主机域名或IP */
8
+    public String host;
9
+
10
+    /** 端口 */
11
+    public Integer port;
12
+
13
+    /** 路由 */
14
+    public String path;
15
+
16
+    /** HTTP方法 */
17
+    public HTTPMethodEnum method;
18
+}

+ 4 - 0
framework/src/main/java/cn/lili/common/properties/holder/PlatformIntergrationHolder.java

@@ -0,0 +1,4 @@
1
+package cn.lili.common.properties.holder;
2
+
3
+public class PlatformIntergrationHolder {
4
+}

+ 11 - 0
framework/src/main/java/cn/lili/common/properties/httpEndPointProperties.java

@@ -0,0 +1,11 @@
1
+package cn.lili.common.properties;
2
+
3
+import cn.lili.common.enums.HTTPMethodEnum;
4
+
5
+public interface httpEndPointProperties {
6
+
7
+    String url();
8
+
9
+    HTTPMethodEnum method();
10
+
11
+}

+ 133 - 0
framework/src/main/java/cn/lili/common/utils/AesEncrypt.java

@@ -0,0 +1,133 @@
1
+package cn.lili.common.utils;
2
+
3
+import javax.crypto.*;
4
+import javax.crypto.spec.SecretKeySpec;
5
+import java.io.UnsupportedEncodingException;
6
+import java.nio.charset.StandardCharsets;
7
+import java.security.InvalidKeyException;
8
+import java.security.NoSuchAlgorithmException;
9
+import java.security.SecureRandom;
10
+
11
+public class AesEncrypt {
12
+    public AesEncrypt() {
13
+    }
14
+
15
+    public static String encrypt(String content, String password) {
16
+        try {
17
+            KeyGenerator kgen = KeyGenerator.getInstance("AES");
18
+            // 防止Linux下随机生成Key
19
+            SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG");
20
+            secureRandom.setSeed(password.getBytes());
21
+            kgen.init(128, secureRandom);
22
+            // kgen.init(128, new SecureRandom(password.getBytes()));
23
+            SecretKey secretKey = kgen.generateKey();
24
+            byte[] enCodeFormat = secretKey.getEncoded();
25
+            SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES");
26
+            Cipher cipher = Cipher.getInstance("AES");
27
+            byte[] byteContent = content.getBytes("utf-8");
28
+            cipher.init(1, key);
29
+            byte[] result = cipher.doFinal(byteContent);
30
+            return parseByte2HexStr(result);
31
+        } catch (NoSuchAlgorithmException var9) {
32
+            var9.printStackTrace();
33
+        } catch (NoSuchPaddingException var10) {
34
+            var10.printStackTrace();
35
+        } catch (InvalidKeyException var11) {
36
+            var11.printStackTrace();
37
+        } catch (UnsupportedEncodingException var12) {
38
+            var12.printStackTrace();
39
+        } catch (IllegalBlockSizeException var13) {
40
+            var13.printStackTrace();
41
+        } catch (BadPaddingException var14) {
42
+            var14.printStackTrace();
43
+        }
44
+
45
+        return null;
46
+    }
47
+
48
+    public static String decrypt(String encrypt, String password) {
49
+        try {
50
+            byte[] decode = parseHexStr2Byte(encrypt);
51
+            KeyGenerator kgen = KeyGenerator.getInstance("AES");
52
+            // 防止Linux下随机生成Key
53
+            SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG");
54
+            secureRandom.setSeed(password.getBytes());
55
+            kgen.init(128, secureRandom);
56
+            SecretKey secretKey = kgen.generateKey();
57
+            byte[] enCodeFormat = secretKey.getEncoded();
58
+            SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES");
59
+            Cipher cipher = Cipher.getInstance("AES");
60
+            cipher.init(2, key);
61
+            byte[] result = cipher.doFinal(decode);
62
+            return new String(result, StandardCharsets.UTF_8);
63
+        } catch (NoSuchAlgorithmException var9) {
64
+            var9.printStackTrace();
65
+        } catch (NoSuchPaddingException var10) {
66
+            var10.printStackTrace();
67
+        } catch (InvalidKeyException var11) {
68
+            var11.printStackTrace();
69
+        } catch (IllegalBlockSizeException var12) {
70
+            var12.printStackTrace();
71
+        } catch (BadPaddingException var13) {
72
+            var13.printStackTrace();
73
+        }
74
+
75
+        return null;
76
+    }
77
+
78
+    private static String parseByte2HexStr(byte[] buf) {
79
+        StringBuffer sb = new StringBuffer();
80
+
81
+        for(int i = 0; i < buf.length; ++i) {
82
+            String hex = Integer.toHexString(buf[i] & 255);
83
+            if (hex.length() == 1) {
84
+                hex = '0' + hex;
85
+            }
86
+
87
+            sb.append(hex.toUpperCase());
88
+        }
89
+
90
+        return sb.toString();
91
+    }
92
+
93
+    private static byte[] parseHexStr2Byte(String hexStr) {
94
+        if (hexStr.length() < 1) {
95
+            return null;
96
+        } else {
97
+            byte[] result = new byte[hexStr.length() / 2];
98
+
99
+            for(int i = 0; i < hexStr.length() / 2; ++i) {
100
+                int high = Integer.parseInt(hexStr.substring(i * 2, i * 2 + 1), 16);
101
+                int low = Integer.parseInt(hexStr.substring(i * 2 + 1, i * 2 + 2), 16);
102
+                result[i] = (byte)(high * 16 + low);
103
+            }
104
+
105
+            return result;
106
+        }
107
+    }
108
+
109
+    public static byte[] encrypt2(String content, String password) {
110
+        try {
111
+            SecretKeySpec key = new SecretKeySpec(password.getBytes(), "AES");
112
+            Cipher cipher = Cipher.getInstance("AES/ECB/NoPadding");
113
+            byte[] byteContent = content.getBytes("utf-8");
114
+            cipher.init(1, key);
115
+            byte[] result = cipher.doFinal(byteContent);
116
+            return result;
117
+        } catch (NoSuchAlgorithmException var6) {
118
+            var6.printStackTrace();
119
+        } catch (NoSuchPaddingException var7) {
120
+            var7.printStackTrace();
121
+        } catch (InvalidKeyException var8) {
122
+            var8.printStackTrace();
123
+        } catch (UnsupportedEncodingException var9) {
124
+            var9.printStackTrace();
125
+        } catch (IllegalBlockSizeException var10) {
126
+            var10.printStackTrace();
127
+        } catch (BadPaddingException var11) {
128
+            var11.printStackTrace();
129
+        }
130
+
131
+        return null;
132
+    }
133
+}

+ 77 - 0
framework/src/main/java/cn/lili/common/utils/JaxbUtils.java

@@ -0,0 +1,77 @@
1
+package cn.lili.common.utils;
2
+
3
+import javax.xml.bind.JAXBContext;
4
+import javax.xml.bind.Marshaller;
5
+import javax.xml.bind.Unmarshaller;
6
+import java.io.StringReader;
7
+import java.io.StringWriter;
8
+import java.util.ArrayList;
9
+import java.util.List;
10
+
11
+/**
12
+ * java2xml 工具类
13
+ */
14
+public class JaxbUtils {
15
+    /**
16
+     * JavaBean转换成xml
17
+     * 默认编码UTF-8
18
+     *
19
+     * @param obj
20
+     * @return
21
+     */
22
+    public static String convertToXml(Object obj) {
23
+        return convertToXml(obj, "UTF-8");
24
+    }
25
+
26
+    /**
27
+     * JavaBean转换成xml
28
+     *
29
+     * @param obj
30
+     * @param encoding
31
+     * @return
32
+     */
33
+    public static String convertToXml(Object obj, String encoding) {
34
+        String result = null;
35
+        try {
36
+            JAXBContext context = JAXBContext.newInstance(obj.getClass());
37
+            Marshaller marshaller = context.createMarshaller();
38
+            //格式化xml格式
39
+            marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
40
+
41
+            marshaller.setProperty(Marshaller.JAXB_ENCODING, encoding);
42
+            //去掉生成xml的默认报文头
43
+            marshaller.setProperty(Marshaller.JAXB_FRAGMENT, true);
44
+
45
+            StringWriter writer = new StringWriter();
46
+            // 由于不能优雅的去掉 standalone="yes" 所以只能去掉整个头部,然后手动插入一个符合条件的头部   该行为不优雅需要进行升级
47
+            writer.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>" + "\n");
48
+            marshaller.marshal(obj, writer);
49
+            result = writer.toString();
50
+        } catch (Exception e) {
51
+            e.printStackTrace();
52
+        }
53
+        return result;
54
+    }
55
+
56
+    /**
57
+     * xml转换成JavaBean
58
+     *
59
+     * @param xml
60
+     * @param c
61
+     * @return
62
+     */
63
+    @SuppressWarnings("unchecked")
64
+    public static <T> T converyToJavaBean(String xml, Class<T> c) {
65
+        T t = null;
66
+        try {
67
+            JAXBContext context = JAXBContext.newInstance(c);
68
+            Unmarshaller unmarshaller = context.createUnmarshaller();
69
+            t = (T) unmarshaller.unmarshal(new StringReader(xml));
70
+        } catch (Exception e) {
71
+            e.printStackTrace();
72
+        }
73
+        return t;
74
+    }
75
+}
76
+
77
+

+ 14 - 0
framework/src/main/java/cn/lili/common/utils/StringUtils.java

@@ -176,6 +176,20 @@ public class StringUtils extends StrUtil {
176 176
         return str;
177 177
     }
178 178
 
179
+    /**
180
+     * 查询字符串中首个数字或字母出现的位置
181
+     * @param str 查询的字符串
182
+     * @return 若存在,返回位置索引,否则返回-1;
183
+     */
184
+    public static int findFirstIdxAlphabetNumber(String str){
185
+        int i = -1;
186
+        Matcher matcher = Pattern.compile("[A-Za-z0-9]").matcher(str);
187
+        if(matcher.find()) {
188
+            i = matcher.start();
189
+        }
190
+        return i;
191
+    }
192
+
179 193
 }
180 194
 
181 195
 

+ 273 - 0
framework/src/main/java/cn/lili/common/utils/XmlMapUtils.java

@@ -0,0 +1,273 @@
1
+package cn.lili.common.utils;
2
+
3
+
4
+import org.dom4j.Document;
5
+import org.dom4j.DocumentException;
6
+import org.dom4j.DocumentHelper;
7
+import org.dom4j.Element;
8
+import org.dom4j.io.OutputFormat;
9
+import org.dom4j.io.SAXReader;
10
+import org.dom4j.io.XMLWriter;
11
+
12
+import java.io.IOException;
13
+import java.io.StringReader;
14
+import java.io.StringWriter;
15
+import java.util.*;
16
+
17
+
18
+/**
19
+ * 提供Map<String,Object>转XML,XML转Map<String,Object>
20
+ */
21
+
22
+
23
+public class XmlMapUtils {
24
+
25
+
26
+    /**
27
+     *
28
+     * 通过Map创建XML,Map可以多层转换
29
+     *
30
+     * @param params
31
+     * @return	String-->XML
32
+     */
33
+    public static String createXmlByMap(String parentName,Map<String, Object> params,boolean isCDATA){
34
+        Document doc = DocumentHelper.createDocument();
35
+        doc.addElement(parentName);
36
+        String xml = iteratorXml(doc.getRootElement(),parentName,params,isCDATA);
37
+        return formatXML(xml);
38
+    }
39
+
40
+    /**
41
+     *
42
+     * 通过Map创建XML,Map可以多层转换
43
+     * 可以自定义parent节点
44
+     *
45
+     * @param params
46
+     * @return	String-->XML
47
+     */
48
+    public static String createXmlByMap(String parentName,Map<String, Object> params){
49
+        Document doc = DocumentHelper.createDocument();
50
+        doc.addElement(parentName);
51
+        String xml = iteratorXml(doc.getRootElement(),parentName,params,false);
52
+        return formatXML(xml);
53
+    }
54
+
55
+    /**
56
+     *
57
+     * 通过Map创建XML,Map可以多层转
58
+     * 固定节点parent为Document
59
+     *
60
+     * @param params
61
+     * @return	String-->XML
62
+     */
63
+    public static String createXmlByMap(Map<String, Object> params){
64
+        String parentName = "Request";
65
+        Document doc = DocumentHelper.createDocument();
66
+        doc.addElement(parentName);
67
+        String xml = iteratorXml(doc.getRootElement(),parentName,params,false);
68
+        return formatXML(xml);
69
+    }
70
+
71
+    /**
72
+     *
73
+     * MapToXml循环遍历创建xml节点
74
+     * 此方法在value中加入CDATA标识符
75
+     *
76
+     * @param element 根节点
77
+     * @param parentName 子节点名字
78
+     * @param params map数据
79
+     * @return String-->Xml
80
+     */
81
+
82
+    @SuppressWarnings("unchecked")
83
+    public static String iteratorXml(Element element,String parentName,Map<String,Object> params,boolean isCDATA) {
84
+        Element e = element.addElement(parentName);
85
+        Set<String> set = params.keySet();
86
+        for (Iterator<String> it = set.iterator(); it.hasNext();) {
87
+            String key = (String) it.next();
88
+            if(params.get(key) instanceof Map) {
89
+                iteratorXml(e,key,(Map<String,Object>)params.get(key),isCDATA);
90
+            }else {
91
+                String value = params.get(key)==null?"":params.get(key).toString();
92
+                if(!isCDATA) {
93
+                    e.addElement(key).addText(value);
94
+                }else {
95
+                    e.addElement(key).addCDATA(value);
96
+                }
97
+            }
98
+        }
99
+        return e.asXML();
100
+    }
101
+
102
+    /**
103
+     * 格式化xml,显示为容易看的XML格式
104
+     *
105
+     * @param inputXML
106
+     * @return
107
+     */
108
+    public static String formatXML(String inputXML){
109
+        String requestXML = null;
110
+        XMLWriter writer = null;
111
+        Document document = null;
112
+        try {
113
+            SAXReader reader = new SAXReader();
114
+            document = reader.read(new StringReader(inputXML));
115
+            if (document != null) {
116
+                StringWriter stringWriter = new StringWriter();
117
+                OutputFormat format = new OutputFormat("	", true);//格式化,每一级前的空格
118
+                format.setNewLineAfterDeclaration(false);	//xml声明与内容是否添加空行
119
+                format.setSuppressDeclaration(false);		//是否设置xml声明头部
120
+                format.setNewlines(true);		//设置分行
121
+                writer = new XMLWriter(stringWriter, format);
122
+                writer.write(document);
123
+                writer.flush();
124
+                requestXML = stringWriter.getBuffer().toString();
125
+            }
126
+            return requestXML;
127
+        } catch (Exception e1) {
128
+            e1.printStackTrace();
129
+            return null;
130
+        }finally {
131
+            if (writer != null) {
132
+                try {
133
+                    writer.close();
134
+                } catch (IOException e) {
135
+
136
+                }
137
+            }
138
+        }
139
+    }
140
+
141
+
142
+    /**
143
+     *
144
+     * 通过XML转换为Map<String,Object>
145
+     *
146
+     * @param xml 为String类型的Xml
147
+     * @return 第一个为Root节点,Root节点之后为Root的元素,如果为多层,可以通过key获取下一层Map
148
+     */
149
+    public static Map<String, Object> createMapByXml(String xml) {
150
+        Document doc = null;
151
+        try {
152
+            doc = DocumentHelper.parseText(xml);
153
+        } catch (DocumentException e) {
154
+            e.printStackTrace();
155
+        }
156
+        Map<String, Object> map = new HashMap<String, Object>();
157
+        if (doc == null)
158
+            return map;
159
+        Element rootElement = doc.getRootElement();
160
+        elementTomap(rootElement,map);
161
+        return map;
162
+    }
163
+
164
+    /***
165
+     *
166
+     * XmlToMap核心方法,里面有递归调用
167
+     *
168
+     * @param outele
169
+     * @param outmap
170
+     */
171
+    @SuppressWarnings("unchecked")
172
+    public static Map<String, Object> elementTomap (Element outele,Map<String,Object> outmap) {
173
+        List<Element> list = outele.elements();
174
+        int size = list.size();
175
+        if(size == 0){
176
+            outmap.put(outele.getName(), outele.getTextTrim());
177
+        }else{
178
+            Map<String, Object> innermap = new HashMap<String, Object>();
179
+            for(Element ele1 : list){
180
+                String eleName = ele1.getName();
181
+                Object obj =  innermap.get(eleName);
182
+                if(obj == null){
183
+                    elementTomap(ele1,innermap);
184
+                }else{
185
+                    if(obj instanceof java.util.Map){
186
+                        List<Map<String, Object>> list1 = new ArrayList<Map<String, Object>>();
187
+                        list1.add((Map<String, Object>) innermap.remove(eleName));
188
+                        elementTomap(ele1,innermap);
189
+                        list1.add((Map<String, Object>) innermap.remove(eleName));
190
+                        innermap.put(eleName, list1);
191
+                    }else{
192
+                        elementTomap(ele1,innermap);
193
+                        ((List<Map<String, Object>>)obj).add(innermap);
194
+                    }
195
+                }
196
+            }
197
+            outmap.put(outele.getName(), innermap);
198
+        }
199
+        return outmap;
200
+    }
201
+
202
+    /**
203
+     * Map or JSON 转换成Xml
204
+     *
205
+     * fastJSON实现了Map<String,Object> 所以此处直接传json 也可以的
206
+     */
207
+    public static String mapToXML(Map map, StringBuffer sb) {
208
+        Set set = map.keySet();
209
+        for (Iterator it = set.iterator(); it.hasNext(); ) {
210
+            String key = (String) it.next();
211
+            Object value = map.get(key);
212
+            if (null == value)
213
+                value = "";
214
+            if (value.getClass().getName().equals("java.util.ArrayList")) {
215
+                List list = (List) map.get(key);
216
+                sb.append("<" + key + ">");
217
+                for (int i = 0; i < list.size(); i++) {
218
+                    HashMap hm = (HashMap) list.get(i);
219
+                    mapToXML(hm, sb);
220
+                }
221
+                sb.append("</" + key + ">");
222
+
223
+            } else {
224
+                if (value instanceof HashMap) {
225
+                    sb.append("<" + key + ">");
226
+                    mapToXML((HashMap) value, sb);
227
+                    sb.append("</" + key + ">");
228
+                } else {
229
+                    sb.append("<" + key + ">" + value + "</" + key + ">");
230
+                }
231
+            }
232
+        }
233
+//        String xmlString = "<?xml version=\"1.0\" encoding=\"GBK\"?>\n" +
234
+//                "<Packet type=\"RESPONSE\" version=\"1.0\">\n" +
235
+//                "    <Head>\n" +
236
+//                "        <errorCode>00000</errorCode>\n" +
237
+//                "        <errorMessage>成功</errorMessage>\n" +
238
+//                "    </Head>\n" +
239
+//                "    <Body>\n" +
240
+//                "        <ResInformation>\n" +
241
+//                "            <User>\n" +
242
+//                "                <id>1</id>\n" +
243
+//                "                <name>张三</name>\n" +
244
+//                "                <age>18</age>\n" +
245
+//                "                <sex>男</sex>\n" +
246
+//                "            </User>\n" +
247
+//                "            <User>\n" +
248
+//                "                <id>2</id>\n" +
249
+//                "                <name>李四</name>\n" +
250
+//                "                <age>20</age>\n" +
251
+//                "                <sex>女</sex>\n" +
252
+//                "            </User>\n" +
253
+//                "            <User>\n" +
254
+//                "                <id>3</id>\n" +
255
+//                "                <name>王五</name>\n" +
256
+//                "                <age>19</age>\n" +
257
+//                "                <sex>女</sex>\n" +
258
+//                "            </User>\n" +
259
+//                "            <School>\n" +
260
+//                "                <id>3</id>\n" +
261
+//                "                <province>广东省</province>\n" +
262
+//                "                <city>深圳市</city>\n" +
263
+//                "                <name>XXXX大学</name>\n" +
264
+//                "            </School>\n" +
265
+//                "        </ResInformation>\n" +
266
+//                "    </Body>\n" +
267
+//                "</Packet>\n";
268
+        return sb.toString();
269
+    }
270
+
271
+}
272
+
273
+

+ 30 - 0
framework/src/main/java/cn/lili/modules/order/customs/CustomPayload.java

@@ -0,0 +1,30 @@
1
+package cn.lili.modules.order.customs;
2
+
3
+import lombok.ToString;
4
+
5
+@ToString
6
+public enum CustomPayload {
7
+    JiangyinXingguang("DXPENT0000474373", "DXP", "江阴星光进出口有限公司", "3216960A23", "dcits123456", "test");
8
+
9
+    CustomPayload(String dxpId, String dxpMode, String copName, String copCode, String signKey, String note) {
10
+        this.dxpId = dxpId;
11
+        this.dxpMode = dxpMode;
12
+        this.copName = copName;
13
+        this.copCode = copCode;
14
+        this.signKey = signKey;
15
+        this.note = note;
16
+    }
17
+
18
+    /** 向中国电子口岸数据中心申请数据交换平台的用户编号 */
19
+    public String dxpId;
20
+    /** 默认为DXP,指中国电子口岸数据交换平台 */
21
+    public String dxpMode;
22
+    /** 报文传输的企业代码(海关编码,需要与接入客户端的企业身份一致) */
23
+    public String copCode;
24
+    /** 报文传输的企业名称 */
25
+    public String copName;
26
+    /** 签名key */
27
+    public String signKey;
28
+    /** 备注 */
29
+    public String note;
30
+}

+ 21 - 0
framework/src/main/java/cn/lili/modules/order/customs/CustomsExchange.java

@@ -0,0 +1,21 @@
1
+package cn.lili.modules.order.customs;
2
+
3
+import cn.lili.modules.order.order.entity.vo.OrderDetailVO;
4
+import lombok.AllArgsConstructor;
5
+import lombok.Data;
6
+import lombok.NoArgsConstructor;
7
+
8
+import java.util.Map;
9
+
10
+@Data
11
+@NoArgsConstructor
12
+@AllArgsConstructor
13
+public class CustomsExchange {
14
+    private String guid;
15
+
16
+    private OrderDetailVO orderDetailVO;
17
+
18
+    private String appTime;
19
+
20
+    private Map<String, String> id2Unit;
21
+}

+ 91 - 0
framework/src/main/java/cn/lili/modules/order/customs/JiangyinServiceManager.java

@@ -0,0 +1,91 @@
1
+package cn.lili.modules.order.customs;
2
+
3
+import cn.hutool.core.bean.BeanUtil;
4
+import cn.hutool.core.date.DatePattern;
5
+import cn.hutool.core.date.DateUtil;
6
+import cn.hutool.core.lang.Assert;
7
+import cn.hutool.http.HttpUtil;
8
+import cn.hutool.json.JSONUtil;
9
+import cn.lili.common.exception.ServiceException;
10
+import cn.lili.common.utils.AesEncrypt;
11
+import cn.lili.modules.order.customs.converter.CustomsReqConverter;
12
+import cn.lili.modules.order.order.entity.dos.Order;
13
+import cn.lili.modules.order.order.entity.dos.OrderCustoms;
14
+import cn.lili.modules.order.order.entity.enums.PayStatusEnum;
15
+import cn.lili.modules.order.order.entity.vo.OrderDetailVO;
16
+import cn.lili.modules.order.order.mapper.OrderCustomsMapper;
17
+import cn.lili.modules.order.order.mapper.OrderMapper;
18
+import lombok.extern.slf4j.Slf4j;
19
+import org.springframework.beans.factory.annotation.Autowired;
20
+import org.springframework.beans.factory.annotation.Qualifier;
21
+import org.springframework.stereotype.Component;
22
+
23
+import java.time.LocalDateTime;
24
+import java.util.Map;
25
+import java.util.UUID;
26
+
27
+import static cn.lili.common.enums.ResultCode.ORDER_CUSTOMS_ERROR;
28
+
29
+@Slf4j
30
+@Component
31
+public class JiangyinServiceManager {
32
+
33
+    private static final String JIANGYIN_ORDER_PUSH_URL = "http://117.80.148.225:8010/webapi-jiangyin/api/custom/platReceiveOf9710";
34
+
35
+    private final CustomsReqConverter converter;
36
+
37
+    private final OrderMapper orderMapper;
38
+
39
+    private final OrderCustomsMapper orderCustomsMapper;
40
+
41
+    @Autowired
42
+    public JiangyinServiceManager(@Qualifier("jiangyinServiceBeanReqConverter") CustomsReqConverter converter,
43
+                                  OrderMapper orderMapper,
44
+                                  OrderCustomsMapper orderCustomsMapper) {
45
+        this.converter = converter;
46
+        this.orderMapper = orderMapper;
47
+        this.orderCustomsMapper = orderCustomsMapper;
48
+    }
49
+
50
+    public boolean push(OrderDetailVO detailVO){
51
+        Assert.isTrue(!detailVO.getOrder().getCustomsFlag(), () -> new ServiceException(ORDER_CUSTOMS_ERROR,"订单已推送海关,请勿重复推送"));
52
+        Assert.isTrue(PayStatusEnum.PAID.name().equals(detailVO.getOrder().getPayStatus()),
53
+                () -> new ServiceException(ORDER_CUSTOMS_ERROR,"订单尚未支付,无法推送海关"));
54
+        // 企业凭证相关(后续动态获取)
55
+        CustomPayload payload = CustomPayload.JiangyinXingguang;
56
+        OrderCustoms customsRec = new OrderCustoms();
57
+        log.info("method input param: {}, payload: {}", JSONUtil.toJsonStr(detailVO), payload.toString());
58
+        // 报文内容(密文)
59
+        CustomsExchange exchange = new CustomsExchange(UUID.randomUUID().toString(), detailVO ,null, null);
60
+        final String reqMsg = converter.toReq(exchange, payload);
61
+        System.out.println(reqMsg);
62
+        customsRec.setReqMsg(reqMsg);
63
+        String encryptContent = AesEncrypt.encrypt(reqMsg, payload.signKey);
64
+        // 构建参数
65
+        JiangyinServiceParam param = JiangyinServiceParam.builder()
66
+                .signMsg(converter.getSign(encryptContent, payload.signKey))
67
+                .content(encryptContent)
68
+                // 唯一序号
69
+                .copMsgId(detailVO.getOrder().getSn() + DateUtil.format(LocalDateTime.now(), DatePattern.PURE_DATETIME_PATTERN))
70
+                .sendCode(payload.copCode)
71
+                .build();
72
+        // 开始调用
73
+        Map<String, Object> paramMap = BeanUtil.beanToMap(param);
74
+        log.info("request body: {}", paramMap);
75
+//        String res = "";
76
+        String res = HttpUtil.post(JIANGYIN_ORDER_PUSH_URL, paramMap, 30000);
77
+        log.info("response msg: {}", res);
78
+        customsRec.setResMsg(res);
79
+        boolean success = converter.checkSuccess(res);
80
+        if (success){
81
+            // 推送成功更新订单状态为已推送
82
+            Order order = exchange.getOrderDetailVO().getOrder();
83
+            order.setCustomsFlag(true);
84
+            order.setCustomsGuid(exchange.getGuid());
85
+            orderMapper.updateById(order);
86
+        }
87
+        orderCustomsMapper.insert(customsRec);
88
+        return success;
89
+    }
90
+}
91
+

+ 19 - 0
framework/src/main/java/cn/lili/modules/order/customs/JiangyinServiceParam.java

@@ -0,0 +1,19 @@
1
+package cn.lili.modules.order.customs;
2
+
3
+import lombok.Builder;
4
+import lombok.Data;
5
+
6
+@Data
7
+@Builder
8
+public class JiangyinServiceParam {
9
+    /** 数字签名 */
10
+    String signMsg;
11
+    /** 报文内容 */
12
+    String content;
13
+    /** 消息类型 */
14
+    final String msgType = "CEB303Message";
15
+    /** 用户自定义生成报文唯一序号 */
16
+    String copMsgId;
17
+    /** 发送方代码(企业海关10位编码) */
18
+    String sendCode;
19
+}

+ 29 - 0
framework/src/main/java/cn/lili/modules/order/customs/NameSpace.java

@@ -0,0 +1,29 @@
1
+package cn.lili.modules.order.customs;
2
+
3
+/**
4
+ * xml 命名空间
5
+ */
6
+public class NameSpace {
7
+
8
+    /**
9
+     * order 订单节点
10
+     */
11
+    public static final String NAMESPACE_CEB_URI = "http://www.chinaport.gov.cn/ceb";
12
+
13
+
14
+    /**
15
+     * dep终端节点报文
16
+     */
17
+    public static final String NAMESPACE_DXP_URI = "http://www.chinaport.gov.cn/dxp";
18
+
19
+    /**
20
+     * xsi规范
21
+     */
22
+    public static final String NAMESPACE_XSI_URI = "http://www.w3.org/2001/XMLSchema-instance";
23
+
24
+    /**
25
+     * 签名节点xml
26
+     */
27
+    public static final String NAMESPACE_DS_URL = "http://www.w3.org/2000/09/xmldsig#";
28
+
29
+}

+ 15 - 0
framework/src/main/java/cn/lili/modules/order/customs/converter/CustomsReqConverter.java

@@ -0,0 +1,15 @@
1
+package cn.lili.modules.order.customs.converter;
2
+
3
+import cn.lili.modules.order.customs.CustomPayload;
4
+import cn.lili.modules.order.customs.CustomsExchange;
5
+
6
+public interface CustomsReqConverter{
7
+    /** 生成报文 */
8
+    String toReq(CustomsExchange exchange, CustomPayload payload);
9
+
10
+    /** 获取签名 */
11
+    String getSign(String content, String key);
12
+
13
+    /** 确认响应信息是否成功调用 */
14
+    boolean checkSuccess(String resStr);
15
+}

+ 72 - 0
framework/src/main/java/cn/lili/modules/order/customs/converter/JiangyinServiceBeanReqConverter.java

@@ -0,0 +1,72 @@
1
+package cn.lili.modules.order.customs.converter;
2
+
3
+import cn.hutool.core.date.DatePattern;
4
+import cn.hutool.core.date.DateUtil;
5
+import cn.hutool.core.util.XmlUtil;
6
+import cn.hutool.crypto.digest.DigestUtil;
7
+import cn.lili.common.exception.ServiceException;
8
+import cn.lili.common.utils.JaxbUtils;
9
+import cn.lili.modules.goods.entity.dos.Goods;
10
+import cn.lili.modules.goods.entity.dto.GoodsSearchParams;
11
+import cn.lili.modules.goods.service.GoodsService;
12
+import cn.lili.modules.order.customs.CustomPayload;
13
+import cn.lili.modules.order.customs.CustomsExchange;
14
+import cn.lili.modules.order.customs.model.CEB303Message;
15
+import cn.lili.modules.order.order.entity.dos.OrderItem;
16
+import org.springframework.beans.factory.annotation.Autowired;
17
+import org.springframework.stereotype.Component;
18
+
19
+import java.time.LocalDateTime;
20
+import java.util.Map;
21
+import java.util.Optional;
22
+import java.util.stream.Collectors;
23
+
24
+import static cn.lili.common.enums.ResultCode.ORDER_CUSTOMS_ERROR;
25
+
26
+@Component
27
+public class JiangyinServiceBeanReqConverter implements CustomsReqConverter{
28
+
29
+    private final GoodsService goodsService;
30
+
31
+    @Autowired
32
+    public JiangyinServiceBeanReqConverter(GoodsService goodsService) {
33
+        this.goodsService = goodsService;
34
+    }
35
+
36
+    @Override
37
+    public String toReq(CustomsExchange exchange, CustomPayload payload) {
38
+        return JaxbUtils.convertToXml(converterToMsg(exchange, payload));
39
+    }
40
+
41
+    @Override
42
+    public String getSign(String content, String key) {
43
+        try {
44
+            return DigestUtil.md5Hex(content + key).toUpperCase();
45
+        } catch (Exception e) {
46
+            e.printStackTrace();
47
+        }
48
+        throw new ServiceException(ORDER_CUSTOMS_ERROR, "签名生成失败");
49
+    }
50
+
51
+    @Override
52
+    public boolean checkSuccess(String resStr) {
53
+        Map<String, Object> map = XmlUtil.xmlToMap(resStr);
54
+        return Optional
55
+                .ofNullable(map.get("success"))
56
+                .map(String::valueOf)
57
+                .filter("true"::equalsIgnoreCase)
58
+                .isPresent();
59
+    }
60
+
61
+    private CEB303Message converterToMsg(CustomsExchange exchange, CustomPayload payload){
62
+        exchange.setAppTime(DateUtil.format(LocalDateTime.now(), DatePattern.PURE_DATETIME_PATTERN));
63
+        // 批量获取商品信息
64
+        String ids = exchange.getOrderDetailVO().getOrderItems().stream().map(OrderItem::getGoodsId).collect(Collectors.joining(","));
65
+        GoodsSearchParams params = new GoodsSearchParams();
66
+        params.setId(ids);
67
+        exchange.setId2Unit(
68
+                goodsService.queryListByParams(params).stream().collect(Collectors.toMap(Goods::getId, Goods::getGoodsUnit))
69
+        );
70
+        return new CEB303Message(exchange, payload);
71
+    }
72
+}

+ 203 - 0
framework/src/main/java/cn/lili/modules/order/customs/converter/JiangyinServiceReqConverter.java

@@ -0,0 +1,203 @@
1
+package cn.lili.modules.order.customs.converter;
2
+
3
+import cn.hutool.core.date.DatePattern;
4
+import cn.hutool.core.date.DateUtil;
5
+import cn.hutool.core.util.XmlUtil;
6
+import cn.hutool.crypto.digest.DigestUtil;
7
+import cn.lili.common.enums.JGS20Unit;
8
+import cn.lili.common.exception.ServiceException;
9
+import cn.lili.common.exception.UnitIllegalException;
10
+import cn.lili.modules.goods.entity.dos.Goods;
11
+import cn.lili.modules.goods.entity.dto.GoodsSearchParams;
12
+import cn.lili.modules.goods.service.GoodsService;
13
+import cn.lili.modules.order.customs.CustomPayload;
14
+import cn.lili.modules.order.customs.CustomsExchange;
15
+import cn.lili.modules.order.order.entity.dos.OrderItem;
16
+import org.springframework.beans.factory.annotation.Autowired;
17
+import org.springframework.stereotype.Component;
18
+import org.w3c.dom.Document;
19
+import org.w3c.dom.Element;
20
+
21
+import java.time.LocalDateTime;
22
+import java.util.*;
23
+import java.util.stream.Collectors;
24
+
25
+import static cn.lili.common.enums.ResultCode.ORDER_CUSTOMS_ERROR;
26
+
27
+@Component
28
+public class JiangyinServiceReqConverter implements CustomsReqConverter{
29
+    /** 报文前缀 */
30
+    private static final String CEB_PREFIX = "ceb:";
31
+
32
+    private final GoodsService goodsService;
33
+
34
+    @Autowired
35
+    public JiangyinServiceReqConverter(GoodsService goodsService) {
36
+        this.goodsService = goodsService;
37
+    }
38
+
39
+    @Override
40
+    public String toReq(CustomsExchange exchange, CustomPayload payload) {
41
+        // map解析
42
+        Map<String, Object> m = orderToMap(exchange, payload);
43
+        Document ceb = XmlUtil.mapToXml(m, "ceb:CEB303Message");
44
+        // 添加首个Node的属性
45
+        Element element = ceb.getDocumentElement();
46
+        element.setAttribute("guid", exchange.getGuid());
47
+        element.setAttribute("version", "1.0");
48
+        element.setAttribute("xmlns:xsi", "http://www.w3.org/2001/XMLSchema-instance");
49
+        element.setAttribute("xmlns:ceb", "http://www.chinaport.gov.cn/ceb");
50
+        ceb.setXmlStandalone(true);
51
+        // 转String
52
+        return XmlUtil.toStr(ceb);
53
+    }
54
+
55
+    @Override
56
+    public String getSign(String content, String key) {
57
+        try {
58
+            return DigestUtil.md5Hex(content + key).toUpperCase();
59
+        } catch (Exception e) {
60
+            e.printStackTrace();
61
+        }
62
+        throw new ServiceException(ORDER_CUSTOMS_ERROR, "签名生成失败");
63
+    }
64
+
65
+    @Override
66
+    public boolean checkSuccess(String resStr) {
67
+        Map<String, Object> map = XmlUtil.xmlToMap(resStr);
68
+        return Optional
69
+                .ofNullable(map.get("success"))
70
+                .map(String::valueOf)
71
+                .filter("true"::equalsIgnoreCase)
72
+                .isPresent();
73
+    }
74
+
75
+    /**
76
+     * 根据订单详情生成符合报文格式的Map
77
+     * @param exchange 交换数据(业务)
78
+     * @param payload 存根(企业凭证相关)
79
+     * @return 符合报文格式的Map
80
+     */
81
+    private Map<String, Object> orderToMap(CustomsExchange exchange, CustomPayload payload){
82
+        Map<String, Object> reqMap = new LinkedHashMap<>();
83
+        // 1. ceb:order
84
+        reqMap.put(CEB_PREFIX + "Order", order(exchange, payload));
85
+        // 2. ceb:baseTransfer
86
+        reqMap.put(CEB_PREFIX + "BaseTransfer", baseTransfer(payload));
87
+        return reqMap;
88
+    }
89
+
90
+
91
+    /**
92
+     * 生成订单报文部分
93
+     * @param exchange 交换数据(业务)
94
+     * @param payload 存根(企业凭证相关)
95
+     * @return 报文List数据
96
+     */
97
+    private List<Map<String, Object>> order(CustomsExchange exchange, CustomPayload payload){
98
+        exchange.setAppTime(DateUtil.format(LocalDateTime.now(), DatePattern.PURE_DATETIME_PATTERN));
99
+        List<Map<String, Object>> orderList = new ArrayList<>(0);
100
+        Optional.ofNullable(exchange.getOrderDetailVO().getOrderItems()).ifPresent(items -> {
101
+            // 批量获取商品信息
102
+            String ids = items.stream().map(OrderItem::getGoodsId).collect(Collectors.joining(","));
103
+            GoodsSearchParams params = new GoodsSearchParams();
104
+            params.setId(ids);
105
+            Map<String, String> id2Unit = goodsService.queryListByParams(params).stream()
106
+                    .collect(Collectors.toMap(Goods::getId, Goods::getGoodsUnit));
107
+                for (int i = 0; i < items.size(); i++) {
108
+                    OrderItem item = items.get(i);
109
+                    try {
110
+                        Map<String, Object> itemMap = new HashMap<>();
111
+                        Map<String, Object> orderHead = new HashMap<>(32);
112
+                        // 1. 表头
113
+                        // 系统唯一序号
114
+                        orderHead.put(CEB_PREFIX + "guid", exchange.getGuid());
115
+                        // 企业报送类型 (1 - 新增, 2 - 变更, 3 - 删除)默认为1
116
+                        orderHead.put(CEB_PREFIX + "appType", "1");
117
+                        // 企业报送时间(格式YYYYMMDDhhmmss)
118
+                        orderHead.put(CEB_PREFIX + "appTime", exchange.getAppTime());
119
+                        // 业务状态 (1 - 暂存, 2 - 报送)默认为2
120
+                        orderHead.put(CEB_PREFIX + "appStatus", "2");
121
+                        // 订单类型 (I - 进口, E - 9610出口, B - 9710出口, W - 9810出口)
122
+                        orderHead.put(CEB_PREFIX + "orderType", "B");
123
+                        // 订单编号 (交易平台订单编号,长度不能超过60位)
124
+                        orderHead.put(CEB_PREFIX + "orderNo", exchange.getOrderDetailVO().getOrder().getSn());
125
+                        // 电商平台代码
126
+                        orderHead.put(CEB_PREFIX + "ebpCode", "无");
127
+                        // 电商平台名称
128
+                        orderHead.put(CEB_PREFIX + "ebpName", "速贸云");
129
+                        // 电商企业代码 (电商企业的海关注册登记编号)
130
+                        orderHead.put(CEB_PREFIX + "ebcCode", payload.copCode);
131
+                        // 电商企业名称
132
+                        orderHead.put(CEB_PREFIX + "ebcName", payload.copName);
133
+                        // 商品价格 (商品实际价格,含非现金抵扣金额)
134
+                        orderHead.put(CEB_PREFIX + "goodsValue", String.valueOf(item.getFlowPrice()));
135
+                        // 运杂费(不包含在商品价格中的运杂费,无则填写0)
136
+                        orderHead.put(CEB_PREFIX + "freight", "0");
137
+                        // 币制 (限定为人民币 - 142)
138
+                        orderHead.put(CEB_PREFIX + "currency", "142");
139
+                        // 备注
140
+                        orderHead.put(CEB_PREFIX + "note", "test");
141
+
142
+                        Map<String, Object> orderLists = new HashMap<>(32);
143
+                        // 2. 表体
144
+                        // 商品序号(从1开始递增序号)
145
+                        orderLists.put(CEB_PREFIX + "gnum", i + 1);
146
+                        // 企业商品货号(SKU编号,最长30位)
147
+                        orderLists.put(CEB_PREFIX + "itemNo", item.getSkuId());
148
+                        // 企业商品名称(中文名称)
149
+                        orderLists.put(CEB_PREFIX + "itemName", item.getGoodsName());
150
+                        // 企业商品描述
151
+                        orderLists.put(CEB_PREFIX + "itemDescribe", item.getGoodsName());
152
+                        // 商品条形码 (非必填)
153
+                        orderLists.put(CEB_PREFIX + "barCode", "");
154
+                        // 单位
155
+                        String cnName = id2Unit.get(item.getGoodsId());
156
+                        orderLists.put(CEB_PREFIX + "unit", JGS20Unit.ofCnName(cnName).code);
157
+                        // 币制 (限定为人民币 - 142)
158
+                        orderLists.put(CEB_PREFIX + "currency", "142");
159
+                        // 数量
160
+                        orderLists.put(CEB_PREFIX + "qty", item.getNum());
161
+                        // 单价
162
+                        orderLists.put(CEB_PREFIX + "price", item.getGoodsPrice());
163
+                        // 商品价格 (商品实际价格,含非现金抵扣金额)
164
+                        orderLists.put(CEB_PREFIX + "totalPrice", String.valueOf(item.getFlowPrice()));
165
+                        // 备注
166
+                        orderLists.put(CEB_PREFIX + "note", "test");
167
+
168
+                        // 放入订单列表
169
+                        itemMap.put(CEB_PREFIX + "OrderHead", orderHead);
170
+                        itemMap.put(CEB_PREFIX + "OrderList", orderLists);
171
+                        orderList.add(itemMap);
172
+                    } catch (UnitIllegalException e) {
173
+                        throw new ServiceException(ORDER_CUSTOMS_ERROR, String.format("商品[%s]", item.getGoodsName()) + e.getMsg());
174
+                    }
175
+                }
176
+        });
177
+
178
+        return orderList;
179
+    }
180
+
181
+    /**
182
+     * 基础报文传输Map列表
183
+     * @param payload 存根信息
184
+     * @return 基础报文传输Map列表
185
+     */
186
+    private List<Map<String, Object>> baseTransfer(CustomPayload payload){
187
+        List<Map<String, Object>> transfers = new ArrayList<>();
188
+        Map<String, Object> transfer = new HashMap<>(8);
189
+        // 传输企业代码
190
+        transfer.put(CEB_PREFIX + "copCode", payload.copCode);
191
+        // 传输企业名称
192
+        transfer.put(CEB_PREFIX + "copName", payload.copName);
193
+        // 报文传输模式
194
+        transfer.put(CEB_PREFIX + "dxpMode", "DXP");
195
+        // 报文传输编号
196
+        transfer.put(CEB_PREFIX + "dxpId", payload.dxpId);
197
+        // 备注
198
+        transfer.put(CEB_PREFIX + "note", "");
199
+        transfers.add(transfer);
200
+        return transfers;
201
+    }
202
+
203
+}

+ 54 - 0
framework/src/main/java/cn/lili/modules/order/customs/model/BaseTransfer.java

@@ -0,0 +1,54 @@
1
+package cn.lili.modules.order.customs.model;
2
+
3
+import lombok.AllArgsConstructor;
4
+import lombok.Builder;
5
+import lombok.Data;
6
+import lombok.NoArgsConstructor;
7
+
8
+import javax.xml.bind.annotation.XmlAccessType;
9
+import javax.xml.bind.annotation.XmlAccessorType;
10
+import javax.xml.bind.annotation.XmlElement;
11
+import javax.xml.bind.annotation.XmlRootElement;
12
+
13
+import static cn.lili.modules.order.customs.NameSpace.NAMESPACE_CEB_URI;
14
+
15
+@Builder
16
+@Data
17
+@AllArgsConstructor
18
+@NoArgsConstructor
19
+@XmlAccessorType(XmlAccessType.FIELD)
20
+@XmlRootElement(name = "BaseTransfer ", namespace = NAMESPACE_CEB_URI)
21
+public class BaseTransfer {
22
+
23
+    /**
24
+     * 传输企业代码  报文传输的企业代码(需要与接入客户端的企 业身份一致)
25
+     */
26
+    @XmlElement(namespace = NAMESPACE_CEB_URI)
27
+    private String copCode;
28
+
29
+    /**
30
+     * 传输企业名称
31
+     */
32
+    @XmlElement(namespace = NAMESPACE_CEB_URI)
33
+    private String copName;
34
+
35
+    /**
36
+     * 报文传输模式  默认为DXP;指中国电子口岸数据交换平台
37
+     */
38
+    @XmlElement(namespace = NAMESPACE_CEB_URI)
39
+    private String dxpMode;
40
+
41
+    /**
42
+     * 报文传输编号  向中国电子口岸数据中心申请数据交换平台 的用户编号
43
+     */
44
+    @XmlElement(namespace = NAMESPACE_CEB_URI)
45
+    private String dxpId;
46
+
47
+    /**
48
+     * 备注
49
+     */
50
+    @XmlElement(namespace = NAMESPACE_CEB_URI)
51
+    private String note;
52
+}
53
+
54
+

+ 48 - 0
framework/src/main/java/cn/lili/modules/order/customs/model/CEB303Message.java

@@ -0,0 +1,48 @@
1
+package cn.lili.modules.order.customs.model;
2
+
3
+import cn.lili.modules.order.customs.CustomPayload;
4
+import cn.lili.modules.order.customs.CustomsExchange;
5
+import lombok.Builder;
6
+import lombok.Data;
7
+import lombok.NoArgsConstructor;
8
+
9
+import javax.xml.bind.annotation.*;
10
+
11
+import static cn.lili.modules.order.customs.NameSpace.NAMESPACE_CEB_URI;
12
+
13
+
14
+/**
15
+ * 海关出口订单报文
16
+ */
17
+@Data
18
+@NoArgsConstructor
19
+@XmlAccessorType(XmlAccessType.FIELD)
20
+@XmlRootElement(name = "CEB303Message" , namespace = NAMESPACE_CEB_URI)
21
+public class CEB303Message {
22
+
23
+    @XmlAttribute(name = "guid")
24
+    private String guid;
25
+
26
+    @XmlAttribute(name = "version")
27
+    private String version;
28
+
29
+    @XmlElement(name = "Order", namespace = NAMESPACE_CEB_URI)
30
+    private Order order;
31
+
32
+    @XmlElement(name = "BaseTransfer", namespace = NAMESPACE_CEB_URI)
33
+    private BaseTransfer baseTransfer;
34
+
35
+    public CEB303Message(CustomsExchange exchange, CustomPayload payload){
36
+        this.guid = exchange.getGuid();
37
+        this.order = new Order(exchange, payload);
38
+        this.baseTransfer = BaseTransfer.builder()
39
+                .copCode(payload.copCode)
40
+                .copName(payload.copName)
41
+                .dxpMode("DXP")
42
+                .dxpId(payload.dxpId)
43
+                .build();
44
+        this.version = "1.0";
45
+    }
46
+
47
+}
48
+

+ 81 - 0
framework/src/main/java/cn/lili/modules/order/customs/model/Order.java

@@ -0,0 +1,81 @@
1
+package cn.lili.modules.order.customs.model;
2
+
3
+import cn.lili.common.enums.JGS20Unit;
4
+import cn.lili.modules.order.customs.CustomPayload;
5
+import cn.lili.modules.order.customs.CustomsExchange;
6
+import cn.lili.modules.order.order.entity.dos.OrderItem;
7
+import lombok.Data;
8
+import lombok.NoArgsConstructor;
9
+
10
+import javax.xml.bind.annotation.XmlAccessType;
11
+import javax.xml.bind.annotation.XmlAccessorType;
12
+import javax.xml.bind.annotation.XmlElement;
13
+import javax.xml.bind.annotation.XmlRootElement;
14
+import java.math.BigDecimal;
15
+import java.util.LinkedList;
16
+import java.util.List;
17
+
18
+import static cn.lili.modules.order.customs.NameSpace.NAMESPACE_CEB_URI;
19
+
20
+/**
21
+ * 订单业务节点
22
+ */
23
+@Data
24
+@NoArgsConstructor
25
+@XmlAccessorType(XmlAccessType.FIELD)
26
+@XmlRootElement(name = "Order ", namespace = NAMESPACE_CEB_URI)
27
+public class Order {
28
+
29
+    @XmlElement(name = "OrderHead", namespace = NAMESPACE_CEB_URI)
30
+    private OrderHead orderHead;
31
+
32
+    @XmlElement(name = "OrderList", namespace = NAMESPACE_CEB_URI)
33
+    private List<OrderList> orderList;
34
+
35
+    public Order(CustomsExchange exchange, CustomPayload payload){
36
+        this.orderHead = OrderHead.builder()
37
+                .guid(exchange.getGuid())
38
+                .appType("1")
39
+                .appTime(exchange.getAppTime())
40
+                .appStatus("2")
41
+                .orderType("B")
42
+                .orderNo(exchange.getOrderDetailVO().getOrder().getSn())
43
+                .ebpCode("无")
44
+                .ebpName("速贸云")
45
+                .ebcCode(payload.copCode)
46
+                .ebcName(payload.copName)
47
+                .goodsValue(BigDecimal.valueOf(exchange.getOrderDetailVO().getOrder().getFlowPrice()))
48
+                .freight(BigDecimal.ZERO)
49
+                .currency("502")
50
+                .build();
51
+        this.orderList = new LinkedList<>();
52
+        final List<OrderItem> orderItems = exchange.getOrderDetailVO().getOrderItems();
53
+        String cnName;
54
+
55
+        for (int i = 0; i < orderItems.size(); i++) {
56
+            OrderItem item = orderItems.get(i);
57
+            cnName = exchange.getId2Unit().get(item.getGoodsId());
58
+
59
+            orderList.add(
60
+                    OrderList.builder()
61
+                            .gnum(i + 1)
62
+                            .itemNo(item.getGoodsCode())
63
+                            .itemName(item.getGoodsShortName())
64
+                            .itemDescribe("")
65
+                            .barCode("")
66
+                            .unit(JGS20Unit.ofCnName(cnName).code)
67
+                            .currency("502")
68
+                            .qty(item.getNum())
69
+                            .price(BigDecimal.valueOf(item.getGoodsPrice()))
70
+                            .totalPrice(BigDecimal.valueOf(item.getFlowPrice()))
71
+                            .note("")
72
+                            .build()
73
+            );
74
+        }
75
+    }
76
+
77
+}
78
+
79
+
80
+
81
+

+ 111 - 0
framework/src/main/java/cn/lili/modules/order/customs/model/OrderHead.java

@@ -0,0 +1,111 @@
1
+package cn.lili.modules.order.customs.model;
2
+
3
+
4
+
5
+import lombok.AllArgsConstructor;
6
+import lombok.Builder;
7
+import lombok.Data;
8
+import lombok.NoArgsConstructor;
9
+
10
+import javax.xml.bind.annotation.XmlAccessType;
11
+import javax.xml.bind.annotation.XmlAccessorType;
12
+import javax.xml.bind.annotation.XmlElement;
13
+import javax.xml.bind.annotation.XmlRootElement;
14
+import java.math.BigDecimal;
15
+
16
+import static cn.lili.modules.order.customs.NameSpace.NAMESPACE_CEB_URI;
17
+
18
+@Builder
19
+@Data
20
+@NoArgsConstructor
21
+@AllArgsConstructor
22
+@XmlAccessorType(XmlAccessType.FIELD)
23
+@XmlRootElement(name = "OrderHead ", namespace = NAMESPACE_CEB_URI)
24
+public class OrderHead {
25
+
26
+    /**
27
+     * 系统唯一序号 企业系统生成36位唯一序号 (英文字母大写)
28
+     */
29
+    @XmlElement(namespace = NAMESPACE_CEB_URI)
30
+    private String guid;
31
+
32
+    /**
33
+     * 报送类型 企业报送类型。1-新增 2-变 更 3-删除。
34
+     */
35
+    @XmlElement(namespace = NAMESPACE_CEB_URI)
36
+    private String appType;
37
+
38
+    /**
39
+     * 报送时间 格式:YYYYMMDDhhmmss。
40
+     */
41
+    @XmlElement(namespace = NAMESPACE_CEB_URI)
42
+    private String appTime;
43
+
44
+    /**
45
+     * 报送状态  企业报送状态。1-暂存,2-申 报。填写2时,Signature节点必须 填写。
46
+     */
47
+    @XmlElement(namespace = NAMESPACE_CEB_URI)
48
+    private String appStatus;
49
+
50
+    /**
51
+     * 订单类型
52
+     */
53
+    @XmlElement(namespace = NAMESPACE_CEB_URI)
54
+    private String orderType;
55
+
56
+    /**
57
+     * 订单编号
58
+     */
59
+    @XmlElement(namespace = NAMESPACE_CEB_URI)
60
+    private String orderNo;
61
+
62
+    /**
63
+     * 电商平台代码
64
+     */
65
+    @XmlElement(namespace = NAMESPACE_CEB_URI)
66
+    private String ebpCode;
67
+
68
+    /**
69
+     * 电商平台名称
70
+     */
71
+    @XmlElement(namespace = NAMESPACE_CEB_URI)
72
+    private String ebpName;
73
+
74
+    /**
75
+     * 电商
76
+     * 企业代码
77
+     */
78
+    @XmlElement(namespace = NAMESPACE_CEB_URI)
79
+    private String ebcCode;
80
+
81
+    /**
82
+     * 电商企业名称
83
+     */
84
+    @XmlElement(namespace = NAMESPACE_CEB_URI)
85
+    private String ebcName;
86
+
87
+    /**
88
+     * 商品金额
89
+     */
90
+    @XmlElement(namespace = NAMESPACE_CEB_URI)
91
+    private BigDecimal goodsValue;
92
+
93
+    /**
94
+     * 运杂费
95
+     */
96
+    @XmlElement(namespace = NAMESPACE_CEB_URI)
97
+    private BigDecimal freight;
98
+
99
+    /**
100
+     * 币制
101
+     */
102
+    @XmlElement(namespace = NAMESPACE_CEB_URI)
103
+    private String currency;
104
+
105
+    /**
106
+     * 备注
107
+     */
108
+    @XmlElement(namespace = NAMESPACE_CEB_URI)
109
+    private String note;
110
+
111
+}

+ 90 - 0
framework/src/main/java/cn/lili/modules/order/customs/model/OrderList.java

@@ -0,0 +1,90 @@
1
+package cn.lili.modules.order.customs.model;
2
+
3
+
4
+import lombok.AllArgsConstructor;
5
+import lombok.Builder;
6
+import lombok.Data;
7
+import lombok.NoArgsConstructor;
8
+
9
+import javax.xml.bind.annotation.XmlAccessType;
10
+import javax.xml.bind.annotation.XmlAccessorType;
11
+import javax.xml.bind.annotation.XmlElement;
12
+import javax.xml.bind.annotation.XmlRootElement;
13
+import java.math.BigDecimal;
14
+
15
+import static cn.lili.modules.order.customs.NameSpace.NAMESPACE_CEB_URI;
16
+
17
+@Builder
18
+@Data
19
+@NoArgsConstructor
20
+@AllArgsConstructor
21
+@XmlAccessorType(XmlAccessType.FIELD)
22
+@XmlRootElement(name = "OrderList ", namespace = NAMESPACE_CEB_URI)
23
+public class OrderList {
24
+
25
+    /**
26
+     * 序号 从1开始递增
27
+     */
28
+    @XmlElement(namespace = NAMESPACE_CEB_URI)
29
+    private Integer gnum;
30
+
31
+    /**
32
+     * 企业商品货号
33
+     */
34
+    @XmlElement(namespace = NAMESPACE_CEB_URI)
35
+    private String itemNo;
36
+
37
+    /**
38
+     * 企业商品名称
39
+     */
40
+    @XmlElement(namespace = NAMESPACE_CEB_URI)
41
+    private String itemName;
42
+
43
+    /**
44
+     * 企业商品描述
45
+     */
46
+    @XmlElement(namespace = NAMESPACE_CEB_URI)
47
+    private String itemDescribe;
48
+
49
+    /**
50
+     * 条形码 否
51
+     */
52
+    @XmlElement(namespace = NAMESPACE_CEB_URI)
53
+    private String barCode;
54
+
55
+    /**
56
+     * 计量单位
57
+     */
58
+    @XmlElement(namespace = NAMESPACE_CEB_URI)
59
+    private String unit;
60
+
61
+    /**
62
+     * 币制
63
+     */
64
+    @XmlElement(namespace = NAMESPACE_CEB_URI)
65
+    private String currency;
66
+
67
+    /**
68
+     * 数量
69
+     */
70
+    @XmlElement(namespace = NAMESPACE_CEB_URI)
71
+    private Integer qty;
72
+
73
+    /**
74
+     * 单价
75
+     */
76
+    @XmlElement(namespace = NAMESPACE_CEB_URI)
77
+    private BigDecimal price;
78
+
79
+    /**
80
+     * 总价
81
+     */
82
+    @XmlElement(namespace = NAMESPACE_CEB_URI)
83
+    private BigDecimal totalPrice;
84
+
85
+    /**
86
+     * 备注
87
+     */
88
+    @XmlElement(namespace = NAMESPACE_CEB_URI)
89
+    private String note;
90
+}

+ 14 - 0
framework/src/main/java/cn/lili/modules/order/customs/model/package-info.java

@@ -0,0 +1,14 @@
1
+@XmlSchema(
2
+        xmlns = {
3
+                @XmlNs(prefix = "ceb", namespaceURI = NAMESPACE_CEB_URI),
4
+                @XmlNs(prefix = "xsi", namespaceURI = NAMESPACE_XSI_URI)
5
+        }
6
+)
7
+package cn.lili.modules.order.customs.model;
8
+
9
+import javax.xml.bind.annotation.XmlNs;
10
+import javax.xml.bind.annotation.XmlSchema;
11
+
12
+import static cn.lili.modules.order.customs.NameSpace.NAMESPACE_CEB_URI;
13
+import static cn.lili.modules.order.customs.NameSpace.NAMESPACE_XSI_URI;
14
+

+ 12 - 0
framework/src/main/java/cn/lili/modules/order/order/entity/dos/Order.java

@@ -66,6 +66,18 @@ public class Order extends BaseEntity {
66 66
     private String orderStatus;
67 67
 
68 68
     /**
69
+     * 是否报送海关
70
+     */
71
+    @ApiModelProperty(value = "是否报送海关")
72
+    private Boolean customsFlag;
73
+
74
+    /**
75
+     * 推送海关成功时guid
76
+     */
77
+    @ApiModelProperty(value = "推送海关成功时guid")
78
+    private String customsGuid;
79
+
80
+    /**
69 81
      * @see PayStatusEnum
70 82
      */
71 83
     @ApiModelProperty(value = "付款状态")

+ 59 - 0
framework/src/main/java/cn/lili/modules/order/order/entity/dos/OrderCustoms.java

@@ -0,0 +1,59 @@
1
+package cn.lili.modules.order.order.entity.dos;
2
+
3
+import cn.lili.mybatis.BaseEntity;
4
+import com.baomidou.mybatisplus.annotation.FieldFill;
5
+import com.baomidou.mybatisplus.annotation.TableField;
6
+import com.baomidou.mybatisplus.annotation.TableName;
7
+import com.fasterxml.jackson.annotation.JsonFormat;
8
+import io.swagger.annotations.ApiModel;
9
+import io.swagger.annotations.ApiModelProperty;
10
+import lombok.AllArgsConstructor;
11
+import lombok.Data;
12
+import lombok.EqualsAndHashCode;
13
+import lombok.NoArgsConstructor;
14
+import org.springframework.data.annotation.CreatedBy;
15
+import org.springframework.data.annotation.CreatedDate;
16
+import org.springframework.data.elasticsearch.annotations.DateFormat;
17
+import org.springframework.data.elasticsearch.annotations.Field;
18
+import org.springframework.data.elasticsearch.annotations.FieldType;
19
+import org.springframework.format.annotation.DateTimeFormat;
20
+
21
+import java.util.Date;
22
+
23
+/**
24
+ * 海关报关记录
25
+ *
26
+ * @author Chopper
27
+ * @since 2020/11/17 7:30 下午
28
+ */
29
+@EqualsAndHashCode(callSuper = true)
30
+@Data
31
+@TableName("li_order_customs")
32
+@ApiModel(value = "海关报关记录")
33
+@NoArgsConstructor
34
+@AllArgsConstructor
35
+public class OrderCustoms extends BaseEntity {
36
+
37
+    private static final long serialVersionUID = 2108971190191410183L;
38
+
39
+    @CreatedDate
40
+    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
41
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
42
+    @TableField(fill = FieldFill.INSERT)
43
+    @ApiModelProperty(value = "推送时间")
44
+    @Field(type = FieldType.Date, format = DateFormat.custom, pattern = "yyyy-MM-dd HH:mm:ss || yyyy-MM-dd || yyyy/MM/dd HH:mm:ss|| yyyy/MM/dd ||epoch_millis")
45
+    private Date pushTime;
46
+
47
+
48
+    @CreatedBy
49
+    @TableField(fill = FieldFill.UPDATE)
50
+    @ApiModelProperty(value = "推送者")
51
+    private String pushBy;
52
+
53
+    @ApiModelProperty(value = "请求报文")
54
+    private String reqMsg;
55
+
56
+    @ApiModelProperty(value = "响应报文")
57
+    private String resMsg;
58
+
59
+}

+ 17 - 0
framework/src/main/java/cn/lili/modules/order/order/entity/dos/OrderItem.java

@@ -4,6 +4,7 @@ import cn.hutool.core.collection.CollUtil;
4 4
 import cn.hutool.json.JSONUtil;
5 5
 import cn.lili.common.utils.BeanUtil;
6 6
 import cn.lili.common.utils.SnowFlake;
7
+import cn.lili.common.utils.StringUtils;
7 8
 import cn.lili.modules.order.cart.entity.dto.TradeDTO;
8 9
 import cn.lili.modules.order.cart.entity.vo.CartSkuVO;
9 10
 import cn.lili.modules.order.cart.entity.vo.CartVO;
@@ -154,4 +155,20 @@ public class OrderItem extends BaseEntity {
154 155
         this.priceDetail = JSONUtil.toJsonStr(priceDetail);
155 156
     }
156 157
 
158
+    /**
159
+     * @return 商品名称
160
+     */
161
+    public String getGoodsShortName(){
162
+        return goodsName.substring(0, StringUtils.findFirstIdxAlphabetNumber(goodsName));
163
+    }
164
+
165
+    /**
166
+     * @return 商品货号
167
+     */
168
+    public String getGoodsCode(){
169
+        int i = StringUtils.findFirstIdxAlphabetNumber(goodsName);
170
+        int endIdx = goodsName.indexOf(" ");
171
+        return goodsName.substring(i, endIdx == -1 ? goodsName.length() : endIdx);
172
+    }
173
+
157 174
 }

+ 15 - 0
framework/src/main/java/cn/lili/modules/order/order/mapper/OrderCustomsMapper.java

@@ -0,0 +1,15 @@
1
+package cn.lili.modules.order.order.mapper;
2
+
3
+import cn.lili.modules.order.order.entity.dos.OrderCustoms;
4
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
5
+
6
+/**
7
+ * 海关报关记录数据处理层
8
+ *
9
+ * @author Chopper
10
+ * @since 2020/11/17 7:34 下午
11
+ */
12
+public interface OrderCustomsMapper extends BaseMapper<OrderCustoms> {
13
+
14
+
15
+}

+ 7 - 0
framework/src/main/java/cn/lili/modules/order/order/service/OrderService.java

@@ -174,6 +174,13 @@ public interface OrderService extends IService<Order> {
174 174
     Traces getTraces(String orderSn);
175 175
 
176 176
     /**
177
+     * 订单推送海关
178
+     *
179
+     * @param orderSn 订单编号
180
+     */
181
+    boolean customsPush(String orderSn);
182
+
183
+    /**
177 184
      * 订单核验
178 185
      *
179 186
      * @param verificationCode 验证码

+ 23 - 1
framework/src/main/java/cn/lili/modules/order/order/serviceimpl/OrderServiceImpl.java

@@ -19,6 +19,7 @@ import cn.lili.common.utils.SnowFlake;
19 19
 import cn.lili.modules.goods.entity.dto.GoodsCompleteMessage;
20 20
 import cn.lili.modules.member.entity.dto.MemberAddressDTO;
21 21
 import cn.lili.modules.order.cart.entity.dto.TradeDTO;
22
+import cn.lili.modules.order.customs.JiangyinServiceManager;
22 23
 import cn.lili.modules.order.order.aop.OrderLogPoint;
23 24
 import cn.lili.modules.order.order.entity.dos.Order;
24 25
 import cn.lili.modules.order.order.entity.dos.OrderItem;
@@ -142,6 +143,9 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
142 143
     @Autowired
143 144
     private TradeService tradeService;
144 145
 
146
+    @Autowired
147
+    private JiangyinServiceManager jiangyinServiceManager;
148
+
145 149
     @Override
146 150
     @Transactional(rollbackFor = Exception.class)
147 151
     public void intoDB(TradeDTO tradeDTO) {
@@ -161,6 +165,14 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
161 165
             //构建orderVO对象
162 166
             OrderVO orderVO = new OrderVO();
163 167
             BeanUtil.copyProperties(order, orderVO);
168
+            // 订单默认刚开始为已付款状态
169
+            //修改订单状态
170
+            order.setPaymentTime(new Date());
171
+            order.setPaymentMethod(PaymentMethodEnum.BANK_TRANSFER.name());
172
+            order.setPayStatus(PayStatusEnum.PAID.name());
173
+            order.setOrderStatus(OrderStatusEnum.PAID.name());
174
+            order.setReceivableNo("SYSTEM_AUTO_COMPLETE");
175
+            order.setCanReturn(!PaymentMethodEnum.BANK_TRANSFER.name().equals(order.getPaymentMethod()));
164 176
             //持久化DO
165 177
             orders.add(order);
166 178
             String message = "订单[" + item.getSn() + "]创建";
@@ -333,7 +345,7 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
333 345
 
334 346
         Order order = this.getBySn(orderSn);
335 347
         //如果订单已支付,就不能再次进行支付
336
-        if (order.getPayStatus().equals(PayStatusEnum.PAID.name())) {
348
+        if (order.getPayStatus() != null && order.getPayStatus().equals(PayStatusEnum.PAID.name())) {
337 349
             throw new ServiceException(ResultCode.PAY_DOUBLE_ERROR);
338 350
         }
339 351
 
@@ -446,6 +458,16 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
446 458
     }
447 459
 
448 460
     @Override
461
+    @OrderLogPoint(description = "'订单['+#orderSn+']申请报关'", orderSn = "#orderSn")
462
+    @Transactional(rollbackFor = Exception.class)
463
+    public boolean customsPush(String orderSn) {
464
+        //获取订单信息
465
+        OrderDetailVO detailVO = this.queryDetail(orderSn);
466
+        // 海关平台推送
467
+        return jiangyinServiceManager.push(detailVO);
468
+    }
469
+
470
+    @Override
449 471
     @OrderLogPoint(description = "'订单['+#orderSn+']核销,核销码['+#verificationCode+']'", orderSn = "#orderSn")
450 472
     public Order take(String orderSn, String verificationCode) {
451 473
 

+ 6 - 0
seller-api/src/main/java/cn/lili/controller/order/OrderStoreController.java

@@ -174,4 +174,10 @@ public class OrderStoreController {
174 174
     public ResultMessage<List<OrderExportDTO>> queryExportOrder(OrderSearchParams orderSearchParams) {
175 175
         return ResultUtil.data(orderService.queryExportOrder(orderSearchParams));
176 176
     }
177
+
178
+    @ApiOperation(value = "申请报关")
179
+    @PostMapping(path = "/customs/push/{orderSn}")
180
+    public ResultMessage<Object> customsPush(@NotBlank(message = "订单编号不能为空") @PathVariable String orderSn) {
181
+        return ResultUtil.data(orderService.customsPush(orderSn)? "推送成功" : "推送失败");
182
+    }
177 183
 }

+ 19 - 1
start-api.sh

@@ -5,7 +5,16 @@ code_path=/home/source/maopengtech
5 5
 #运行目录
6 6
 run_path=/home/source/api/
7 7
 #代码分支
8
-branch=enversion
8
+branch=master
9
+
10
+mkdir -p ${code_path}
11
+mkdir -p ${run_path}
12
+cd ${code_path}
13
+git fetch origin 
14
+git checkout ${branch}
15
+git pull origin ${branch}
16
+git reset origin/${branch} --hard
17
+mvn clean install -DskipTests
9 18
 
10 19
 ps -ef |grep java |grep buyer  |grep -v 'grep'|awk '{print $2}'  | xargs kill -9
11 20
 ps -ef |grep java |grep seller  |grep -v 'grep'|awk '{print $2}'  | xargs kill -9
@@ -13,8 +22,17 @@ ps -ef |grep java |grep manager  |grep -v 'grep'|awk '{print $2}'  | xargs kill
13 22
 ps -ef |grep java |grep common  |grep -v 'grep'|awk '{print $2}'  | xargs kill -9
14 23
 ps -ef |grep java |grep consumer  |grep -v 'grep'|awk '{print $2}'  | xargs kill -9
15 24
 
25
+rm -rf ${run_path}*.jar
26
+mv ${code_path}/common-api/target/common-api-$version.jar ${run_path}
27
+mv ${code_path}/buyer-api/target/buyer-api-$version.jar ${run_path}
28
+mv ${code_path}/consumer/target/consumer-$version.jar ${run_path}
29
+mv ${code_path}/manager-api/target/manager-api-$version.jar ${run_path}
30
+mv ${code_path}/seller-api/target/seller-api-$version.jar ${run_path}
31
+
16 32
 cd ${run_path}
17 33
 
34
+mkdir logs
35
+
18 36
 nohup java -Xmx256m -Xms128m -Xss256k  -jar manager-api-$version.jar> logs/manager.out  &
19 37
 nohup java -Xmx256m -Xms128m -Xss256k  -jar common-api-$version.jar> logs/common.out  &
20 38
 nohup java -Xmx256m -Xms128m -Xss256k  -jar buyer-api-$version.jar> logs/buyer.out  &

+ 0 - 15
stop-api.sh

@@ -1,15 +0,0 @@
1
-#版本 注意,需要跟随版本号进行调整
2
-version=4.2.4
3
-#代码目录
4
-code_path=/home/source/maopengtech
5
-#运行目录
6
-run_path=/home/source/api/
7
-#代码分支
8
-branch=enversion
9
-
10
-ps -ef |grep java |grep buyer  |grep -v 'grep'|awk '{print $2}'  | xargs kill -9
11
-ps -ef |grep java |grep seller  |grep -v 'grep'|awk '{print $2}'  | xargs kill -9
12
-ps -ef |grep java |grep manager  |grep -v 'grep'|awk '{print $2}'  | xargs kill -9
13
-ps -ef |grep java |grep common  |grep -v 'grep'|awk '{print $2}'  | xargs kill -9
14
-ps -ef |grep java |grep consumer  |grep -v 'grep'|awk '{print $2}'  | xargs kill -9
15
-