Browse Source

初始化市民请集集合

fubojin 1 month ago
parent
commit
b5811dd2ca
100 changed files with 13017 additions and 0 deletions
  1. 62 0
      .gitignore
  2. 2 0
      db/0schema.sql
  3. 1647 0
      db/1yami_bbc.sql
  4. 2 0
      db/2020-06-16 分销商品记录.sql
  5. 3373 0
      db/2area.sql
  6. 11 0
      db/Dockerfile
  7. 2 0
      db/orderItem添加dvy_type字段.sql
  8. 4 0
      db/默认配置.sql
  9. 67 0
      docker-compose.yml
  10. 214 0
      pom.xml
  11. 15 0
      yami-shop-api/Dockerfile
  12. 90 0
      yami-shop-api/pom.xml
  13. 35 0
      yami-shop-api/src/main/java/com/yami/shop/api/ApiApplication.java
  14. 73 0
      yami-shop-api/src/main/java/com/yami/shop/api/config/SwaggerConfiguration.java
  15. 227 0
      yami-shop-api/src/main/java/com/yami/shop/api/controller/AddrController.java
  16. 33 0
      yami-shop-api/src/main/java/com/yami/shop/api/controller/AdvertInfoController.java
  17. 51 0
      yami-shop-api/src/main/java/com/yami/shop/api/controller/AreaController.java
  18. 83 0
      yami-shop-api/src/main/java/com/yami/shop/api/controller/CategoryController.java
  19. 96 0
      yami-shop-api/src/main/java/com/yami/shop/api/controller/DeliveryController.java
  20. 58 0
      yami-shop-api/src/main/java/com/yami/shop/api/controller/DeliveryNoticeController.java
  21. 58 0
      yami-shop-api/src/main/java/com/yami/shop/api/controller/FileController.java
  22. 47 0
      yami-shop-api/src/main/java/com/yami/shop/api/controller/IndexImgController.java
  23. 36 0
      yami-shop-api/src/main/java/com/yami/shop/api/controller/KeywordController.java
  24. 353 0
      yami-shop-api/src/main/java/com/yami/shop/api/controller/MyOrderController.java
  25. 152 0
      yami-shop-api/src/main/java/com/yami/shop/api/controller/MyShopDetailController.java
  26. 77 0
      yami-shop-api/src/main/java/com/yami/shop/api/controller/NoticeController.java
  27. 360 0
      yami-shop-api/src/main/java/com/yami/shop/api/controller/OrderController.java
  28. 680 0
      yami-shop-api/src/main/java/com/yami/shop/api/controller/OrderRefundController.java
  29. 115 0
      yami-shop-api/src/main/java/com/yami/shop/api/controller/PayController.java
  30. 82 0
      yami-shop-api/src/main/java/com/yami/shop/api/controller/PayNoticeController.java
  31. 95 0
      yami-shop-api/src/main/java/com/yami/shop/api/controller/ProdCommController.java
  32. 140 0
      yami-shop-api/src/main/java/com/yami/shop/api/controller/ProdController.java
  33. 49 0
      yami-shop-api/src/main/java/com/yami/shop/api/controller/ProdTagController.java
  34. 52 0
      yami-shop-api/src/main/java/com/yami/shop/api/controller/QnhController.java
  35. 115 0
      yami-shop-api/src/main/java/com/yami/shop/api/controller/QrcodeTicketController.java
  36. 91 0
      yami-shop-api/src/main/java/com/yami/shop/api/controller/SearchController.java
  37. 261 0
      yami-shop-api/src/main/java/com/yami/shop/api/controller/ShopCartController.java
  38. 91 0
      yami-shop-api/src/main/java/com/yami/shop/api/controller/ShopDetailController.java
  39. 50 0
      yami-shop-api/src/main/java/com/yami/shop/api/controller/SkuController.java
  40. 63 0
      yami-shop-api/src/main/java/com/yami/shop/api/controller/SmsController.java
  41. 157 0
      yami-shop-api/src/main/java/com/yami/shop/api/controller/UserCollectionController.java
  42. 122 0
      yami-shop-api/src/main/java/com/yami/shop/api/controller/UserCollectionShopController.java
  43. 142 0
      yami-shop-api/src/main/java/com/yami/shop/api/controller/UserController.java
  44. 266 0
      yami-shop-api/src/main/java/com/yami/shop/api/controller/UserRegisterController.java
  45. 135 0
      yami-shop-api/src/main/java/com/yami/shop/api/listener/ConfirmOrderListener.java
  46. 53 0
      yami-shop-api/src/main/java/com/yami/shop/api/listener/ShopCartListener.java
  47. 306 0
      yami-shop-api/src/main/java/com/yami/shop/api/listener/SubmitOrderListener.java
  48. 21 0
      yami-shop-api/src/main/resources/application-dev.yml
  49. 20 0
      yami-shop-api/src/main/resources/application-docker.yml
  50. 20 0
      yami-shop-api/src/main/resources/application-prod.yml
  51. 62 0
      yami-shop-api/src/main/resources/application.yml
  52. 11 0
      yami-shop-api/src/main/resources/banner.txt
  53. 14 0
      yami-shop-api/src/main/resources/logback/logback-dev.xml
  54. 38 0
      yami-shop-api/src/main/resources/logback/logback-docker.xml
  55. 14 0
      yami-shop-api/src/main/resources/logback/logback-prod.xml
  56. 31 0
      yami-shop-api/src/main/resources/redisson/redisson-dev.yml
  57. 31 0
      yami-shop-api/src/main/resources/redisson/redisson-docker.yml
  58. 31 0
      yami-shop-api/src/main/resources/redisson/redisson-prod.yml
  59. 26 0
      yami-shop-bean/pom.xml
  60. 52 0
      yami-shop-bean/src/main/java/com/yami/shop/bean/SmsInfoContext.java
  61. 141 0
      yami-shop-bean/src/main/java/com/yami/shop/bean/app/dto/ApiOrderRefundDto.java
  62. 69 0
      yami-shop-bean/src/main/java/com/yami/shop/bean/app/dto/BasketItemDto.java
  63. 43 0
      yami-shop-bean/src/main/java/com/yami/shop/bean/app/dto/CategoryDto.java
  64. 54 0
      yami-shop-bean/src/main/java/com/yami/shop/bean/app/dto/ChooseDiscountItemDto.java
  65. 122 0
      yami-shop-bean/src/main/java/com/yami/shop/bean/app/dto/CouponDto.java
  66. 88 0
      yami-shop-bean/src/main/java/com/yami/shop/bean/app/dto/CouponOrderDto.java
  67. 36 0
      yami-shop-bean/src/main/java/com/yami/shop/bean/app/dto/DeliveryDto.java
  68. 26 0
      yami-shop-bean/src/main/java/com/yami/shop/bean/app/dto/DeliveryInfoDto.java
  69. 73 0
      yami-shop-bean/src/main/java/com/yami/shop/bean/app/dto/DiscountDto.java
  70. 32 0
      yami-shop-bean/src/main/java/com/yami/shop/bean/app/dto/DiscountItemDto.java
  71. 64 0
      yami-shop-bean/src/main/java/com/yami/shop/bean/app/dto/IndexImgDto.java
  72. 63 0
      yami-shop-bean/src/main/java/com/yami/shop/bean/app/dto/MyOrderDto.java
  73. 61 0
      yami-shop-bean/src/main/java/com/yami/shop/bean/app/dto/MyOrderItemDto.java
  74. 48 0
      yami-shop-bean/src/main/java/com/yami/shop/bean/app/dto/NoticeDto.java
  75. 45 0
      yami-shop-bean/src/main/java/com/yami/shop/bean/app/dto/OrderCountData.java
  76. 36 0
      yami-shop-bean/src/main/java/com/yami/shop/bean/app/dto/OrderItemDto.java
  77. 25 0
      yami-shop-bean/src/main/java/com/yami/shop/bean/app/dto/OrderNumbersDto.java
  78. 130 0
      yami-shop-bean/src/main/java/com/yami/shop/bean/app/dto/OrderShopDto.java
  79. 55 0
      yami-shop-bean/src/main/java/com/yami/shop/bean/app/dto/ProdCommDataDto.java
  80. 95 0
      yami-shop-bean/src/main/java/com/yami/shop/bean/app/dto/ProdCommDto.java
  81. 67 0
      yami-shop-bean/src/main/java/com/yami/shop/bean/app/dto/ProdCouponDto.java
  82. 31 0
      yami-shop-bean/src/main/java/com/yami/shop/bean/app/dto/ProdTagDto.java
  83. 131 0
      yami-shop-bean/src/main/java/com/yami/shop/bean/app/dto/ProductDto.java
  84. 92 0
      yami-shop-bean/src/main/java/com/yami/shop/bean/app/dto/ProductItemDto.java
  85. 75 0
      yami-shop-bean/src/main/java/com/yami/shop/bean/app/dto/RefundDeliveryDto.java
  86. 49 0
      yami-shop-bean/src/main/java/com/yami/shop/bean/app/dto/RefundOrderItemDto.java
  87. 14 0
      yami-shop-bean/src/main/java/com/yami/shop/bean/app/dto/ResourcesInfoDto.java
  88. 32 0
      yami-shop-bean/src/main/java/com/yami/shop/bean/app/dto/ShopCartAmountDto.java
  89. 32 0
      yami-shop-bean/src/main/java/com/yami/shop/bean/app/dto/ShopCartDto.java
  90. 31 0
      yami-shop-bean/src/main/java/com/yami/shop/bean/app/dto/ShopCartExpiryItemDto.java
  91. 31 0
      yami-shop-bean/src/main/java/com/yami/shop/bean/app/dto/ShopCartItemDiscountDto.java
  92. 55 0
      yami-shop-bean/src/main/java/com/yami/shop/bean/app/dto/ShopCartItemDto.java
  93. 82 0
      yami-shop-bean/src/main/java/com/yami/shop/bean/app/dto/ShopCartOrderDto.java
  94. 82 0
      yami-shop-bean/src/main/java/com/yami/shop/bean/app/dto/ShopCartOrderMergerDto.java
  95. 56 0
      yami-shop-bean/src/main/java/com/yami/shop/bean/app/dto/ShopHeadInfoDto.java
  96. 16 0
      yami-shop-bean/src/main/java/com/yami/shop/bean/app/dto/SimpleDeliveryDto.java
  97. 45 0
      yami-shop-bean/src/main/java/com/yami/shop/bean/app/dto/SkuDto.java
  98. 35 0
      yami-shop-bean/src/main/java/com/yami/shop/bean/app/dto/TagProductDto.java
  99. 49 0
      yami-shop-bean/src/main/java/com/yami/shop/bean/app/dto/UserAddrDto.java
  100. 42 0
      yami-shop-bean/src/main/java/com/yami/shop/bean/app/dto/UserCenterInfoDto.java

+ 62 - 0
.gitignore

@@ -0,0 +1,62 @@
+### gradle ###
+.gradle
+/build/
+!gradle/wrapper/gradle-wrapper.jar
+
+### STS ###
+.settings/
+.apt_generated
+.classpath
+.factorypath
+.project
+.settings
+.springBeans
+bin/
+
+### IntelliJ IDEA ###
+.idea
+*.iws
+*.iml
+*.ipr
+*.lock
+rebel.xml
+
+### NetBeans ###
+nbproject/private/
+build/
+nbbuild/
+dist/
+nbdist/
+.nb-gradle/
+
+### maven ###
+target/
+*.war
+*.ear
+*.zip
+*.tar
+*.tar.gz
+
+### logs ####
+/logs/
+*.log
+
+### temp ignore ###
+*.cache
+*.diff
+*.patch
+*.tmp
+*.java~
+*.properties~
+*.xml~
+
+### system ignore ###
+.DS_Store
+Thumbs.db
+Servers
+.metadata
+upload
+gen_code
+
+### node ###
+node_modules

+ 2 - 0
db/0schema.sql

@@ -0,0 +1,2 @@
+-- 创建数据库
+create database `yami_bbc` default character set utf8mb4 collate utf8mb4_general_ci;

File diff suppressed because it is too large
+ 1647 - 0
db/1yami_bbc.sql


+ 2 - 0
db/2020-06-16 分销商品记录.sql

@@ -0,0 +1,2 @@
+insert into `tz_sys_menu` (`menu_id`, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`)
+values('582','210','分销商品销售记录','distribution/distribution-prod-log','','1','','0');

+ 3373 - 0
db/2area.sql

@@ -0,0 +1,3373 @@
+USE yami_bbc;
+
+/*Data for the table `tz_area` */
+
+insert  into `tz_area`(`area_id`,`area_name`,`parent_id`,`level`) values
+(11,'北京市',0,1),
+(12,'天津市',0,1),
+(13,'河北省',0,1),
+(14,'山西省',0,1),
+(15,'内蒙古自治区',0,1),
+(21,'辽宁省',0,1),
+(22,'吉林省',0,1),
+(23,'黑龙江省',0,1),
+(31,'上海市',0,1),
+(32,'江苏省',0,1),
+(33,'浙江省',0,1),
+(34,'安徽省',0,1),
+(35,'福建省',0,1),
+(36,'江西省',0,1),
+(37,'山东省',0,1),
+(41,'河南省',0,1),
+(42,'湖北省',0,1),
+(43,'湖南省',0,1),
+(44,'广东省',0,1),
+(45,'广西壮族自治区',0,1),
+(46,'海南省',0,1),
+(50,'重庆市',0,1),
+(51,'四川省',0,1),
+(52,'贵州省',0,1),
+(53,'云南省',0,1),
+(54,'西藏自治区',0,1),
+(61,'陕西省',0,1),
+(62,'甘肃省',0,1),
+(63,'青海省',0,1),
+(64,'宁夏回族自治区',0,1),
+(65,'新疆维吾尔自治区',0,1),
+(1101,'市辖区',11,2),
+(1201,'市辖区',12,2),
+(1301,'石家庄市',13,2),
+(1302,'唐山市',13,2),
+(1303,'秦皇岛市',13,2),
+(1304,'邯郸市',13,2),
+(1305,'邢台市',13,2),
+(1306,'保定市',13,2),
+(1307,'张家口市',13,2),
+(1308,'承德市',13,2),
+(1309,'沧州市',13,2),
+(1310,'廊坊市',13,2),
+(1311,'衡水市',13,2),
+(1401,'太原市',14,2),
+(1402,'大同市',14,2),
+(1403,'阳泉市',14,2),
+(1404,'长治市',14,2),
+(1405,'晋城市',14,2),
+(1406,'朔州市',14,2),
+(1407,'晋中市',14,2),
+(1408,'运城市',14,2),
+(1409,'忻州市',14,2),
+(1410,'临汾市',14,2),
+(1411,'吕梁市',14,2),
+(1501,'呼和浩特市',15,2),
+(1502,'包头市',15,2),
+(1503,'乌海市',15,2),
+(1504,'赤峰市',15,2),
+(1505,'通辽市',15,2),
+(1506,'鄂尔多斯市',15,2),
+(1507,'呼伦贝尔市',15,2),
+(1508,'巴彦淖尔市',15,2),
+(1509,'乌兰察布市',15,2),
+(1522,'兴安盟',15,2),
+(1525,'锡林郭勒盟',15,2),
+(1529,'阿拉善盟',15,2),
+(2101,'沈阳市',21,2),
+(2102,'大连市',21,2),
+(2103,'鞍山市',21,2),
+(2104,'抚顺市',21,2),
+(2105,'本溪市',21,2),
+(2106,'丹东市',21,2),
+(2107,'锦州市',21,2),
+(2108,'营口市',21,2),
+(2109,'阜新市',21,2),
+(2110,'辽阳市',21,2),
+(2111,'盘锦市',21,2),
+(2112,'铁岭市',21,2),
+(2113,'朝阳市',21,2),
+(2114,'葫芦岛市',21,2),
+(2201,'长春市',22,2),
+(2202,'吉林市',22,2),
+(2203,'四平市',22,2),
+(2204,'辽源市',22,2),
+(2205,'通化市',22,2),
+(2206,'白山市',22,2),
+(2207,'松原市',22,2),
+(2208,'白城市',22,2),
+(2224,'延边朝鲜族自治州',22,2),
+(2301,'哈尔滨市',23,2),
+(2302,'齐齐哈尔市',23,2),
+(2303,'鸡西市',23,2),
+(2304,'鹤岗市',23,2),
+(2305,'双鸭山市',23,2),
+(2306,'大庆市',23,2),
+(2307,'伊春市',23,2),
+(2308,'佳木斯市',23,2),
+(2309,'七台河市',23,2),
+(2310,'牡丹江市',23,2),
+(2311,'黑河市',23,2),
+(2312,'绥化市',23,2),
+(2327,'大兴安岭地区',23,2),
+(3101,'市辖区',31,2),
+(3201,'南京市',32,2),
+(3202,'无锡市',32,2),
+(3203,'徐州市',32,2),
+(3204,'常州市',32,2),
+(3205,'苏州市',32,2),
+(3206,'南通市',32,2),
+(3207,'连云港市',32,2),
+(3208,'淮安市',32,2),
+(3209,'盐城市',32,2),
+(3210,'扬州市',32,2),
+(3211,'镇江市',32,2),
+(3212,'泰州市',32,2),
+(3213,'宿迁市',32,2),
+(3301,'杭州市',33,2),
+(3302,'宁波市',33,2),
+(3303,'温州市',33,2),
+(3304,'嘉兴市',33,2),
+(3305,'湖州市',33,2),
+(3306,'绍兴市',33,2),
+(3307,'金华市',33,2),
+(3308,'衢州市',33,2),
+(3309,'舟山市',33,2),
+(3310,'台州市',33,2),
+(3311,'丽水市',33,2),
+(3401,'合肥市',34,2),
+(3402,'芜湖市',34,2),
+(3403,'蚌埠市',34,2),
+(3404,'淮南市',34,2),
+(3405,'马鞍山市',34,2),
+(3406,'淮北市',34,2),
+(3407,'铜陵市',34,2),
+(3408,'安庆市',34,2),
+(3410,'黄山市',34,2),
+(3411,'滁州市',34,2),
+(3412,'阜阳市',34,2),
+(3413,'宿州市',34,2),
+(3415,'六安市',34,2),
+(3416,'亳州市',34,2),
+(3417,'池州市',34,2),
+(3418,'宣城市',34,2),
+(3501,'福州市',35,2),
+(3502,'厦门市',35,2),
+(3503,'莆田市',35,2),
+(3504,'三明市',35,2),
+(3505,'泉州市',35,2),
+(3506,'漳州市',35,2),
+(3507,'南平市',35,2),
+(3508,'龙岩市',35,2),
+(3509,'宁德市',35,2),
+(3601,'南昌市',36,2),
+(3602,'景德镇市',36,2),
+(3603,'萍乡市',36,2),
+(3604,'九江市',36,2),
+(3605,'新余市',36,2),
+(3606,'鹰潭市',36,2),
+(3607,'赣州市',36,2),
+(3608,'吉安市',36,2),
+(3609,'宜春市',36,2),
+(3610,'抚州市',36,2),
+(3611,'上饶市',36,2),
+(3701,'济南市',37,2),
+(3702,'青岛市',37,2),
+(3703,'淄博市',37,2),
+(3704,'枣庄市',37,2),
+(3705,'东营市',37,2),
+(3706,'烟台市',37,2),
+(3707,'潍坊市',37,2),
+(3708,'济宁市',37,2),
+(3709,'泰安市',37,2),
+(3710,'威海市',37,2),
+(3711,'日照市',37,2),
+(3713,'临沂市',37,2),
+(3714,'德州市',37,2),
+(3715,'聊城市',37,2),
+(3716,'滨州市',37,2),
+(3717,'菏泽市',37,2),
+(4101,'郑州市',41,2),
+(4102,'开封市',41,2),
+(4103,'洛阳市',41,2),
+(4104,'平顶山市',41,2),
+(4105,'安阳市',41,2),
+(4106,'鹤壁市',41,2),
+(4107,'新乡市',41,2),
+(4108,'焦作市',41,2),
+(4109,'濮阳市',41,2),
+(4110,'许昌市',41,2),
+(4111,'漯河市',41,2),
+(4112,'三门峡市',41,2),
+(4113,'南阳市',41,2),
+(4114,'商丘市',41,2),
+(4115,'信阳市',41,2),
+(4116,'周口市',41,2),
+(4117,'驻马店市',41,2),
+(4190,'省直辖县级行政区划',41,2),
+(4201,'武汉市',42,2),
+(4202,'黄石市',42,2),
+(4203,'十堰市',42,2),
+(4205,'宜昌市',42,2),
+(4206,'襄阳市',42,2),
+(4207,'鄂州市',42,2),
+(4208,'荆门市',42,2),
+(4209,'孝感市',42,2),
+(4210,'荆州市',42,2),
+(4211,'黄冈市',42,2),
+(4212,'咸宁市',42,2),
+(4213,'随州市',42,2),
+(4228,'恩施土家族苗族自治州',42,2),
+(4290,'省直辖县级行政区划',42,2),
+(4301,'长沙市',43,2),
+(4302,'株洲市',43,2),
+(4303,'湘潭市',43,2),
+(4304,'衡阳市',43,2),
+(4305,'邵阳市',43,2),
+(4306,'岳阳市',43,2),
+(4307,'常德市',43,2),
+(4308,'张家界市',43,2),
+(4309,'益阳市',43,2),
+(4310,'郴州市',43,2),
+(4311,'永州市',43,2),
+(4312,'怀化市',43,2),
+(4313,'娄底市',43,2),
+(4331,'湘西土家族苗族自治州',43,2),
+(4401,'广州市',44,2),
+(4402,'韶关市',44,2),
+(4403,'深圳市',44,2),
+(4404,'珠海市',44,2),
+(4405,'汕头市',44,2),
+(4406,'佛山市',44,2),
+(4407,'江门市',44,2),
+(4408,'湛江市',44,2),
+(4409,'茂名市',44,2),
+(4412,'肇庆市',44,2),
+(4413,'惠州市',44,2),
+(4414,'梅州市',44,2),
+(4415,'汕尾市',44,2),
+(4416,'河源市',44,2),
+(4417,'阳江市',44,2),
+(4418,'清远市',44,2),
+(4419,'东莞市',44,2),
+(4420,'中山市',44,2),
+(4451,'潮州市',44,2),
+(4452,'揭阳市',44,2),
+(4453,'云浮市',44,2),
+(4501,'南宁市',45,2),
+(4502,'柳州市',45,2),
+(4503,'桂林市',45,2),
+(4504,'梧州市',45,2),
+(4505,'北海市',45,2),
+(4506,'防城港市',45,2),
+(4507,'钦州市',45,2),
+(4508,'贵港市',45,2),
+(4509,'玉林市',45,2),
+(4510,'百色市',45,2),
+(4511,'贺州市',45,2),
+(4512,'河池市',45,2),
+(4513,'来宾市',45,2),
+(4514,'崇左市',45,2),
+(4601,'海口市',46,2),
+(4602,'三亚市',46,2),
+(4603,'三沙市',46,2),
+(4604,'儋州市',46,2),
+(4690,'省直辖县级行政区划',46,2),
+(5001,'市辖区',50,2),
+(5002,'县',50,2),
+(5101,'成都市',51,2),
+(5103,'自贡市',51,2),
+(5104,'攀枝花市',51,2),
+(5105,'泸州市',51,2),
+(5106,'德阳市',51,2),
+(5107,'绵阳市',51,2),
+(5108,'广元市',51,2),
+(5109,'遂宁市',51,2),
+(5110,'内江市',51,2),
+(5111,'乐山市',51,2),
+(5113,'南充市',51,2),
+(5114,'眉山市',51,2),
+(5115,'宜宾市',51,2),
+(5116,'广安市',51,2),
+(5117,'达州市',51,2),
+(5118,'雅安市',51,2),
+(5119,'巴中市',51,2),
+(5120,'资阳市',51,2),
+(5132,'阿坝藏族羌族自治州',51,2),
+(5133,'甘孜藏族自治州',51,2),
+(5134,'凉山彝族自治州',51,2),
+(5201,'贵阳市',52,2),
+(5202,'六盘水市',52,2),
+(5203,'遵义市',52,2),
+(5204,'安顺市',52,2),
+(5205,'毕节市',52,2),
+(5206,'铜仁市',52,2),
+(5223,'黔西南布依族苗族自治州',52,2),
+(5226,'黔东南苗族侗族自治州',52,2),
+(5227,'黔南布依族苗族自治州',52,2),
+(5301,'昆明市',53,2),
+(5303,'曲靖市',53,2),
+(5304,'玉溪市',53,2),
+(5305,'保山市',53,2),
+(5306,'昭通市',53,2),
+(5307,'丽江市',53,2),
+(5308,'普洱市',53,2),
+(5309,'临沧市',53,2),
+(5323,'楚雄彝族自治州',53,2),
+(5325,'红河哈尼族彝族自治州',53,2),
+(5326,'文山壮族苗族自治州',53,2),
+(5328,'西双版纳傣族自治州',53,2),
+(5329,'大理白族自治州',53,2),
+(5331,'德宏傣族景颇族自治州',53,2),
+(5333,'怒江傈僳族自治州',53,2),
+(5334,'迪庆藏族自治州',53,2),
+(5401,'拉萨市',54,2),
+(5402,'日喀则市',54,2),
+(5403,'昌都市',54,2),
+(5404,'林芝市',54,2),
+(5405,'山南市',54,2),
+(5406,'那曲市',54,2),
+(5425,'阿里地区',54,2),
+(6101,'西安市',61,2),
+(6102,'铜川市',61,2),
+(6103,'宝鸡市',61,2),
+(6104,'咸阳市',61,2),
+(6105,'渭南市',61,2),
+(6106,'延安市',61,2),
+(6107,'汉中市',61,2),
+(6108,'榆林市',61,2),
+(6109,'安康市',61,2),
+(6110,'商洛市',61,2),
+(6201,'兰州市',62,2),
+(6202,'嘉峪关市',62,2),
+(6203,'金昌市',62,2),
+(6204,'白银市',62,2),
+(6205,'天水市',62,2),
+(6206,'武威市',62,2),
+(6207,'张掖市',62,2),
+(6208,'平凉市',62,2),
+(6209,'酒泉市',62,2),
+(6210,'庆阳市',62,2),
+(6211,'定西市',62,2),
+(6212,'陇南市',62,2),
+(6229,'临夏回族自治州',62,2),
+(6230,'甘南藏族自治州',62,2),
+(6301,'西宁市',63,2),
+(6302,'海东市',63,2),
+(6322,'海北藏族自治州',63,2),
+(6323,'黄南藏族自治州',63,2),
+(6325,'海南藏族自治州',63,2),
+(6326,'果洛藏族自治州',63,2),
+(6327,'玉树藏族自治州',63,2),
+(6328,'海西蒙古族藏族自治州',63,2),
+(6401,'银川市',64,2),
+(6402,'石嘴山市',64,2),
+(6403,'吴忠市',64,2),
+(6404,'固原市',64,2),
+(6405,'中卫市',64,2),
+(6501,'乌鲁木齐市',65,2),
+(6502,'克拉玛依市',65,2),
+(6504,'吐鲁番市',65,2),
+(6505,'哈密市',65,2),
+(6523,'昌吉回族自治州',65,2),
+(6527,'博尔塔拉蒙古自治州',65,2),
+(6528,'巴音郭楞蒙古自治州',65,2),
+(6529,'阿克苏地区',65,2),
+(6530,'克孜勒苏柯尔克孜自治州',65,2),
+(6531,'喀什地区',65,2),
+(6532,'和田地区',65,2),
+(6540,'伊犁哈萨克自治州',65,2),
+(6542,'塔城地区',65,2),
+(6543,'阿勒泰地区',65,2),
+(6590,'自治区直辖县级行政区划',65,2),
+(110101,'东城区',1101,3),
+(110102,'西城区',1101,3),
+(110105,'朝阳区',1101,3),
+(110106,'丰台区',1101,3),
+(110107,'石景山区',1101,3),
+(110108,'海淀区',1101,3),
+(110109,'门头沟区',1101,3),
+(110111,'房山区',1101,3),
+(110112,'通州区',1101,3),
+(110113,'顺义区',1101,3),
+(110114,'昌平区',1101,3),
+(110115,'大兴区',1101,3),
+(110116,'怀柔区',1101,3),
+(110117,'平谷区',1101,3),
+(110118,'密云区',1101,3),
+(110119,'延庆区',1101,3),
+(120101,'和平区',1201,3),
+(120102,'河东区',1201,3),
+(120103,'河西区',1201,3),
+(120104,'南开区',1201,3),
+(120105,'河北区',1201,3),
+(120106,'红桥区',1201,3),
+(120110,'东丽区',1201,3),
+(120111,'西青区',1201,3),
+(120112,'津南区',1201,3),
+(120113,'北辰区',1201,3),
+(120114,'武清区',1201,3),
+(120115,'宝坻区',1201,3),
+(120116,'滨海新区',1201,3),
+(120117,'宁河区',1201,3),
+(120118,'静海区',1201,3),
+(120119,'蓟州区',1201,3),
+(130102,'长安区',1301,3),
+(130104,'桥西区',1301,3),
+(130105,'新华区',1301,3),
+(130107,'井陉矿区',1301,3),
+(130108,'裕华区',1301,3),
+(130109,'藁城区',1301,3),
+(130110,'鹿泉区',1301,3),
+(130111,'栾城区',1301,3),
+(130121,'井陉县',1301,3),
+(130123,'正定县',1301,3),
+(130125,'行唐县',1301,3),
+(130126,'灵寿县',1301,3),
+(130127,'高邑县',1301,3),
+(130128,'深泽县',1301,3),
+(130129,'赞皇县',1301,3),
+(130130,'无极县',1301,3),
+(130131,'平山县',1301,3),
+(130132,'元氏县',1301,3),
+(130133,'赵县',1301,3),
+(130171,'石家庄高新技术产业开发区',1301,3),
+(130172,'石家庄循环化工园区',1301,3),
+(130181,'辛集市',1301,3),
+(130183,'晋州市',1301,3),
+(130184,'新乐市',1301,3),
+(130202,'路南区',1302,3),
+(130203,'路北区',1302,3),
+(130204,'古冶区',1302,3),
+(130205,'开平区',1302,3),
+(130207,'丰南区',1302,3),
+(130208,'丰润区',1302,3),
+(130209,'曹妃甸区',1302,3),
+(130224,'滦南县',1302,3),
+(130225,'乐亭县',1302,3),
+(130227,'迁西县',1302,3),
+(130229,'玉田县',1302,3),
+(130271,'河北唐山芦台经济开发区',1302,3),
+(130272,'唐山市汉沽管理区',1302,3),
+(130273,'唐山高新技术产业开发区',1302,3),
+(130274,'河北唐山海港经济开发区',1302,3),
+(130281,'遵化市',1302,3),
+(130283,'迁安市',1302,3),
+(130284,'滦州市',1302,3),
+(130302,'海港区',1303,3),
+(130303,'山海关区',1303,3),
+(130304,'北戴河区',1303,3),
+(130306,'抚宁区',1303,3),
+(130321,'青龙满族自治县',1303,3),
+(130322,'昌黎县',1303,3),
+(130324,'卢龙县',1303,3),
+(130371,'秦皇岛市经济技术开发区',1303,3),
+(130372,'北戴河新区',1303,3),
+(130402,'邯山区',1304,3),
+(130403,'丛台区',1304,3),
+(130404,'复兴区',1304,3),
+(130406,'峰峰矿区',1304,3),
+(130407,'肥乡区',1304,3),
+(130408,'永年区',1304,3),
+(130423,'临漳县',1304,3),
+(130424,'成安县',1304,3),
+(130425,'大名县',1304,3),
+(130426,'涉县',1304,3),
+(130427,'磁县',1304,3),
+(130430,'邱县',1304,3),
+(130431,'鸡泽县',1304,3),
+(130432,'广平县',1304,3),
+(130433,'馆陶县',1304,3),
+(130434,'魏县',1304,3),
+(130435,'曲周县',1304,3),
+(130471,'邯郸经济技术开发区',1304,3),
+(130473,'邯郸冀南新区',1304,3),
+(130481,'武安市',1304,3),
+(130502,'桥东区',1305,3),
+(130503,'桥西区',1305,3),
+(130521,'邢台县',1305,3),
+(130522,'临城县',1305,3),
+(130523,'内丘县',1305,3),
+(130524,'柏乡县',1305,3),
+(130525,'隆尧县',1305,3),
+(130526,'任县',1305,3),
+(130527,'南和县',1305,3),
+(130528,'宁晋县',1305,3),
+(130529,'巨鹿县',1305,3),
+(130530,'新河县',1305,3),
+(130531,'广宗县',1305,3),
+(130532,'平乡县',1305,3),
+(130533,'威县',1305,3),
+(130534,'清河县',1305,3),
+(130535,'临西县',1305,3),
+(130571,'河北邢台经济开发区',1305,3),
+(130581,'南宫市',1305,3),
+(130582,'沙河市',1305,3),
+(130602,'竞秀区',1306,3),
+(130606,'莲池区',1306,3),
+(130607,'满城区',1306,3),
+(130608,'清苑区',1306,3),
+(130609,'徐水区',1306,3),
+(130623,'涞水县',1306,3),
+(130624,'阜平县',1306,3),
+(130626,'定兴县',1306,3),
+(130627,'唐县',1306,3),
+(130628,'高阳县',1306,3),
+(130629,'容城县',1306,3),
+(130630,'涞源县',1306,3),
+(130631,'望都县',1306,3),
+(130632,'安新县',1306,3),
+(130633,'易县',1306,3),
+(130634,'曲阳县',1306,3),
+(130635,'蠡县',1306,3),
+(130636,'顺平县',1306,3),
+(130637,'博野县',1306,3),
+(130638,'雄县',1306,3),
+(130671,'保定高新技术产业开发区',1306,3),
+(130672,'保定白沟新城',1306,3),
+(130681,'涿州市',1306,3),
+(130682,'定州市',1306,3),
+(130683,'安国市',1306,3),
+(130684,'高碑店市',1306,3),
+(130702,'桥东区',1307,3),
+(130703,'桥西区',1307,3),
+(130705,'宣化区',1307,3),
+(130706,'下花园区',1307,3),
+(130708,'万全区',1307,3),
+(130709,'崇礼区',1307,3),
+(130722,'张北县',1307,3),
+(130723,'康保县',1307,3),
+(130724,'沽源县',1307,3),
+(130725,'尚义县',1307,3),
+(130726,'蔚县',1307,3),
+(130727,'阳原县',1307,3),
+(130728,'怀安县',1307,3),
+(130730,'怀来县',1307,3),
+(130731,'涿鹿县',1307,3),
+(130732,'赤城县',1307,3),
+(130771,'张家口经济开发区',1307,3),
+(130772,'张家口市察北管理区',1307,3),
+(130773,'张家口市塞北管理区',1307,3),
+(130802,'双桥区',1308,3),
+(130803,'双滦区',1308,3),
+(130804,'鹰手营子矿区',1308,3),
+(130821,'承德县',1308,3),
+(130822,'兴隆县',1308,3),
+(130824,'滦平县',1308,3),
+(130825,'隆化县',1308,3),
+(130826,'丰宁满族自治县',1308,3),
+(130827,'宽城满族自治县',1308,3),
+(130828,'围场满族蒙古族自治县',1308,3),
+(130871,'承德高新技术产业开发区',1308,3),
+(130881,'平泉市',1308,3),
+(130902,'新华区',1309,3),
+(130903,'运河区',1309,3),
+(130921,'沧县',1309,3),
+(130922,'青县',1309,3),
+(130923,'东光县',1309,3),
+(130924,'海兴县',1309,3),
+(130925,'盐山县',1309,3),
+(130926,'肃宁县',1309,3),
+(130927,'南皮县',1309,3),
+(130928,'吴桥县',1309,3),
+(130929,'献县',1309,3),
+(130930,'孟村回族自治县',1309,3),
+(130971,'河北沧州经济开发区',1309,3),
+(130972,'沧州高新技术产业开发区',1309,3),
+(130973,'沧州渤海新区',1309,3),
+(130981,'泊头市',1309,3),
+(130982,'任丘市',1309,3),
+(130983,'黄骅市',1309,3),
+(130984,'河间市',1309,3),
+(131002,'安次区',1310,3),
+(131003,'广阳区',1310,3),
+(131022,'固安县',1310,3),
+(131023,'永清县',1310,3),
+(131024,'香河县',1310,3),
+(131025,'大城县',1310,3),
+(131026,'文安县',1310,3),
+(131028,'大厂回族自治县',1310,3),
+(131071,'廊坊经济技术开发区',1310,3),
+(131081,'霸州市',1310,3),
+(131082,'三河市',1310,3),
+(131102,'桃城区',1311,3),
+(131103,'冀州区',1311,3),
+(131121,'枣强县',1311,3),
+(131122,'武邑县',1311,3),
+(131123,'武强县',1311,3),
+(131124,'饶阳县',1311,3),
+(131125,'安平县',1311,3),
+(131126,'故城县',1311,3),
+(131127,'景县',1311,3),
+(131128,'阜城县',1311,3),
+(131171,'河北衡水高新技术产业开发区',1311,3),
+(131172,'衡水滨湖新区',1311,3),
+(131182,'深州市',1311,3),
+(140105,'小店区',1401,3),
+(140106,'迎泽区',1401,3),
+(140107,'杏花岭区',1401,3),
+(140108,'尖草坪区',1401,3),
+(140109,'万柏林区',1401,3),
+(140110,'晋源区',1401,3),
+(140121,'清徐县',1401,3),
+(140122,'阳曲县',1401,3),
+(140123,'娄烦县',1401,3),
+(140171,'山西转型综合改革示范区',1401,3),
+(140181,'古交市',1401,3),
+(140212,'新荣区',1402,3),
+(140213,'平城区',1402,3),
+(140214,'云冈区',1402,3),
+(140215,'云州区',1402,3),
+(140221,'阳高县',1402,3),
+(140222,'天镇县',1402,3),
+(140223,'广灵县',1402,3),
+(140224,'灵丘县',1402,3),
+(140225,'浑源县',1402,3),
+(140226,'左云县',1402,3),
+(140271,'山西大同经济开发区',1402,3),
+(140302,'城区',1403,3),
+(140303,'矿区',1403,3),
+(140311,'郊区',1403,3),
+(140321,'平定县',1403,3),
+(140322,'盂县',1403,3),
+(140403,'潞州区',1404,3),
+(140404,'上党区',1404,3),
+(140405,'屯留区',1404,3),
+(140406,'潞城区',1404,3),
+(140423,'襄垣县',1404,3),
+(140425,'平顺县',1404,3),
+(140426,'黎城县',1404,3),
+(140427,'壶关县',1404,3),
+(140428,'长子县',1404,3),
+(140429,'武乡县',1404,3),
+(140430,'沁县',1404,3),
+(140431,'沁源县',1404,3),
+(140471,'山西长治高新技术产业园区',1404,3),
+(140502,'城区',1405,3),
+(140521,'沁水县',1405,3),
+(140522,'阳城县',1405,3),
+(140524,'陵川县',1405,3),
+(140525,'泽州县',1405,3),
+(140581,'高平市',1405,3),
+(140602,'朔城区',1406,3),
+(140603,'平鲁区',1406,3),
+(140621,'山阴县',1406,3),
+(140622,'应县',1406,3),
+(140623,'右玉县',1406,3),
+(140671,'山西朔州经济开发区',1406,3),
+(140681,'怀仁市',1406,3),
+(140702,'榆次区',1407,3),
+(140721,'榆社县',1407,3),
+(140722,'左权县',1407,3),
+(140723,'和顺县',1407,3),
+(140724,'昔阳县',1407,3),
+(140725,'寿阳县',1407,3),
+(140726,'太谷县',1407,3),
+(140727,'祁县',1407,3),
+(140728,'平遥县',1407,3),
+(140729,'灵石县',1407,3),
+(140781,'介休市',1407,3),
+(140802,'盐湖区',1408,3),
+(140821,'临猗县',1408,3),
+(140822,'万荣县',1408,3),
+(140823,'闻喜县',1408,3),
+(140824,'稷山县',1408,3),
+(140825,'新绛县',1408,3),
+(140826,'绛县',1408,3),
+(140827,'垣曲县',1408,3),
+(140828,'夏县',1408,3),
+(140829,'平陆县',1408,3),
+(140830,'芮城县',1408,3),
+(140881,'永济市',1408,3),
+(140882,'河津市',1408,3),
+(140902,'忻府区',1409,3),
+(140921,'定襄县',1409,3),
+(140922,'五台县',1409,3),
+(140923,'代县',1409,3),
+(140924,'繁峙县',1409,3),
+(140925,'宁武县',1409,3),
+(140926,'静乐县',1409,3),
+(140927,'神池县',1409,3),
+(140928,'五寨县',1409,3),
+(140929,'岢岚县',1409,3),
+(140930,'河曲县',1409,3),
+(140931,'保德县',1409,3),
+(140932,'偏关县',1409,3),
+(140971,'五台山风景名胜区',1409,3),
+(140981,'原平市',1409,3),
+(141002,'尧都区',1410,3),
+(141021,'曲沃县',1410,3),
+(141022,'翼城县',1410,3),
+(141023,'襄汾县',1410,3),
+(141024,'洪洞县',1410,3),
+(141025,'古县',1410,3),
+(141026,'安泽县',1410,3),
+(141027,'浮山县',1410,3),
+(141028,'吉县',1410,3),
+(141029,'乡宁县',1410,3),
+(141030,'大宁县',1410,3),
+(141031,'隰县',1410,3),
+(141032,'永和县',1410,3),
+(141033,'蒲县',1410,3),
+(141034,'汾西县',1410,3),
+(141081,'侯马市',1410,3),
+(141082,'霍州市',1410,3),
+(141102,'离石区',1411,3),
+(141121,'文水县',1411,3),
+(141122,'交城县',1411,3),
+(141123,'兴县',1411,3),
+(141124,'临县',1411,3),
+(141125,'柳林县',1411,3),
+(141126,'石楼县',1411,3),
+(141127,'岚县',1411,3),
+(141128,'方山县',1411,3),
+(141129,'中阳县',1411,3),
+(141130,'交口县',1411,3),
+(141181,'孝义市',1411,3),
+(141182,'汾阳市',1411,3),
+(150102,'新城区',1501,3),
+(150103,'回民区',1501,3),
+(150104,'玉泉区',1501,3),
+(150105,'赛罕区',1501,3),
+(150121,'土默特左旗',1501,3),
+(150122,'托克托县',1501,3),
+(150123,'和林格尔县',1501,3),
+(150124,'清水河县',1501,3),
+(150125,'武川县',1501,3),
+(150171,'呼和浩特金海工业园区',1501,3),
+(150172,'呼和浩特经济技术开发区',1501,3),
+(150202,'东河区',1502,3),
+(150203,'昆都仑区',1502,3),
+(150204,'青山区',1502,3),
+(150205,'石拐区',1502,3),
+(150206,'白云鄂博矿区',1502,3),
+(150207,'九原区',1502,3),
+(150221,'土默特右旗',1502,3),
+(150222,'固阳县',1502,3),
+(150223,'达尔罕茂明安联合旗',1502,3),
+(150271,'包头稀土高新技术产业开发区',1502,3),
+(150302,'海勃湾区',1503,3),
+(150303,'海南区',1503,3),
+(150304,'乌达区',1503,3),
+(150402,'红山区',1504,3),
+(150403,'元宝山区',1504,3),
+(150404,'松山区',1504,3),
+(150421,'阿鲁科尔沁旗',1504,3),
+(150422,'巴林左旗',1504,3),
+(150423,'巴林右旗',1504,3),
+(150424,'林西县',1504,3),
+(150425,'克什克腾旗',1504,3),
+(150426,'翁牛特旗',1504,3),
+(150428,'喀喇沁旗',1504,3),
+(150429,'宁城县',1504,3),
+(150430,'敖汉旗',1504,3),
+(150502,'科尔沁区',1505,3),
+(150521,'科尔沁左翼中旗',1505,3),
+(150522,'科尔沁左翼后旗',1505,3),
+(150523,'开鲁县',1505,3),
+(150524,'库伦旗',1505,3),
+(150525,'奈曼旗',1505,3),
+(150526,'扎鲁特旗',1505,3),
+(150571,'通辽经济技术开发区',1505,3),
+(150581,'霍林郭勒市',1505,3),
+(150602,'东胜区',1506,3),
+(150603,'康巴什区',1506,3),
+(150621,'达拉特旗',1506,3),
+(150622,'准格尔旗',1506,3),
+(150623,'鄂托克前旗',1506,3),
+(150624,'鄂托克旗',1506,3),
+(150625,'杭锦旗',1506,3),
+(150626,'乌审旗',1506,3),
+(150627,'伊金霍洛旗',1506,3),
+(150702,'海拉尔区',1507,3),
+(150703,'扎赉诺尔区',1507,3),
+(150721,'阿荣旗',1507,3),
+(150722,'莫力达瓦达斡尔族自治旗',1507,3),
+(150723,'鄂伦春自治旗',1507,3),
+(150724,'鄂温克族自治旗',1507,3),
+(150725,'陈巴尔虎旗',1507,3),
+(150726,'新巴尔虎左旗',1507,3),
+(150727,'新巴尔虎右旗',1507,3),
+(150781,'满洲里市',1507,3),
+(150782,'牙克石市',1507,3),
+(150783,'扎兰屯市',1507,3),
+(150784,'额尔古纳市',1507,3),
+(150785,'根河市',1507,3),
+(150802,'临河区',1508,3),
+(150821,'五原县',1508,3),
+(150822,'磴口县',1508,3),
+(150823,'乌拉特前旗',1508,3),
+(150824,'乌拉特中旗',1508,3),
+(150825,'乌拉特后旗',1508,3),
+(150826,'杭锦后旗',1508,3),
+(150902,'集宁区',1509,3),
+(150921,'卓资县',1509,3),
+(150922,'化德县',1509,3),
+(150923,'商都县',1509,3),
+(150924,'兴和县',1509,3),
+(150925,'凉城县',1509,3),
+(150926,'察哈尔右翼前旗',1509,3),
+(150927,'察哈尔右翼中旗',1509,3),
+(150928,'察哈尔右翼后旗',1509,3),
+(150929,'四子王旗',1509,3),
+(150981,'丰镇市',1509,3),
+(152201,'乌兰浩特市',1522,3),
+(152202,'阿尔山市',1522,3),
+(152221,'科尔沁右翼前旗',1522,3),
+(152222,'科尔沁右翼中旗',1522,3),
+(152223,'扎赉特旗',1522,3),
+(152224,'突泉县',1522,3),
+(152501,'二连浩特市',1525,3),
+(152502,'锡林浩特市',1525,3),
+(152522,'阿巴嘎旗',1525,3),
+(152523,'苏尼特左旗',1525,3),
+(152524,'苏尼特右旗',1525,3),
+(152525,'东乌珠穆沁旗',1525,3),
+(152526,'西乌珠穆沁旗',1525,3),
+(152527,'太仆寺旗',1525,3),
+(152528,'镶黄旗',1525,3),
+(152529,'正镶白旗',1525,3),
+(152530,'正蓝旗',1525,3),
+(152531,'多伦县',1525,3),
+(152571,'乌拉盖管委会',1525,3),
+(152921,'阿拉善左旗',1529,3),
+(152922,'阿拉善右旗',1529,3),
+(152923,'额济纳旗',1529,3),
+(152971,'内蒙古阿拉善经济开发区',1529,3),
+(210102,'和平区',2101,3),
+(210103,'沈河区',2101,3),
+(210104,'大东区',2101,3),
+(210105,'皇姑区',2101,3),
+(210106,'铁西区',2101,3),
+(210111,'苏家屯区',2101,3),
+(210112,'浑南区',2101,3),
+(210113,'沈北新区',2101,3),
+(210114,'于洪区',2101,3),
+(210115,'辽中区',2101,3),
+(210123,'康平县',2101,3),
+(210124,'法库县',2101,3),
+(210181,'新民市',2101,3),
+(210202,'中山区',2102,3),
+(210203,'西岗区',2102,3),
+(210204,'沙河口区',2102,3),
+(210211,'甘井子区',2102,3),
+(210212,'旅顺口区',2102,3),
+(210213,'金州区',2102,3),
+(210214,'普兰店区',2102,3),
+(210224,'长海县',2102,3),
+(210281,'瓦房店市',2102,3),
+(210283,'庄河市',2102,3),
+(210302,'铁东区',2103,3),
+(210303,'铁西区',2103,3),
+(210304,'立山区',2103,3),
+(210311,'千山区',2103,3),
+(210321,'台安县',2103,3),
+(210323,'岫岩满族自治县',2103,3),
+(210381,'海城市',2103,3),
+(210402,'新抚区',2104,3),
+(210403,'东洲区',2104,3),
+(210404,'望花区',2104,3),
+(210411,'顺城区',2104,3),
+(210421,'抚顺县',2104,3),
+(210422,'新宾满族自治县',2104,3),
+(210423,'清原满族自治县',2104,3),
+(210502,'平山区',2105,3),
+(210503,'溪湖区',2105,3),
+(210504,'明山区',2105,3),
+(210505,'南芬区',2105,3),
+(210521,'本溪满族自治县',2105,3),
+(210522,'桓仁满族自治县',2105,3),
+(210602,'元宝区',2106,3),
+(210603,'振兴区',2106,3),
+(210604,'振安区',2106,3),
+(210624,'宽甸满族自治县',2106,3),
+(210681,'东港市',2106,3),
+(210682,'凤城市',2106,3),
+(210702,'古塔区',2107,3),
+(210703,'凌河区',2107,3),
+(210711,'太和区',2107,3),
+(210726,'黑山县',2107,3),
+(210727,'义县',2107,3),
+(210781,'凌海市',2107,3),
+(210782,'北镇市',2107,3),
+(210802,'站前区',2108,3),
+(210803,'西市区',2108,3),
+(210804,'鲅鱼圈区',2108,3),
+(210811,'老边区',2108,3),
+(210881,'盖州市',2108,3),
+(210882,'大石桥市',2108,3),
+(210902,'海州区',2109,3),
+(210903,'新邱区',2109,3),
+(210904,'太平区',2109,3),
+(210905,'清河门区',2109,3),
+(210911,'细河区',2109,3),
+(210921,'阜新蒙古族自治县',2109,3),
+(210922,'彰武县',2109,3),
+(211002,'白塔区',2110,3),
+(211003,'文圣区',2110,3),
+(211004,'宏伟区',2110,3),
+(211005,'弓长岭区',2110,3),
+(211011,'太子河区',2110,3),
+(211021,'辽阳县',2110,3),
+(211081,'灯塔市',2110,3),
+(211102,'双台子区',2111,3),
+(211103,'兴隆台区',2111,3),
+(211104,'大洼区',2111,3),
+(211122,'盘山县',2111,3),
+(211202,'银州区',2112,3),
+(211204,'清河区',2112,3),
+(211221,'铁岭县',2112,3),
+(211223,'西丰县',2112,3),
+(211224,'昌图县',2112,3),
+(211281,'调兵山市',2112,3),
+(211282,'开原市',2112,3),
+(211302,'双塔区',2113,3),
+(211303,'龙城区',2113,3),
+(211321,'朝阳县',2113,3),
+(211322,'建平县',2113,3),
+(211324,'喀喇沁左翼蒙古族自治县',2113,3),
+(211381,'北票市',2113,3),
+(211382,'凌源市',2113,3),
+(211402,'连山区',2114,3),
+(211403,'龙港区',2114,3),
+(211404,'南票区',2114,3),
+(211421,'绥中县',2114,3),
+(211422,'建昌县',2114,3),
+(211481,'兴城市',2114,3),
+(220102,'南关区',2201,3),
+(220103,'宽城区',2201,3),
+(220104,'朝阳区',2201,3),
+(220105,'二道区',2201,3),
+(220106,'绿园区',2201,3),
+(220112,'双阳区',2201,3),
+(220113,'九台区',2201,3),
+(220122,'农安县',2201,3),
+(220171,'长春经济技术开发区',2201,3),
+(220172,'长春净月高新技术产业开发区',2201,3),
+(220173,'长春高新技术产业开发区',2201,3),
+(220174,'长春汽车经济技术开发区',2201,3),
+(220182,'榆树市',2201,3),
+(220183,'德惠市',2201,3),
+(220202,'昌邑区',2202,3),
+(220203,'龙潭区',2202,3),
+(220204,'船营区',2202,3),
+(220211,'丰满区',2202,3),
+(220221,'永吉县',2202,3),
+(220271,'吉林经济开发区',2202,3),
+(220272,'吉林高新技术产业开发区',2202,3),
+(220273,'吉林中国新加坡食品区',2202,3),
+(220281,'蛟河市',2202,3),
+(220282,'桦甸市',2202,3),
+(220283,'舒兰市',2202,3),
+(220284,'磐石市',2202,3),
+(220302,'铁西区',2203,3),
+(220303,'铁东区',2203,3),
+(220322,'梨树县',2203,3),
+(220323,'伊通满族自治县',2203,3),
+(220381,'公主岭市',2203,3),
+(220382,'双辽市',2203,3),
+(220402,'龙山区',2204,3),
+(220403,'西安区',2204,3),
+(220421,'东丰县',2204,3),
+(220422,'东辽县',2204,3),
+(220502,'东昌区',2205,3),
+(220503,'二道江区',2205,3),
+(220521,'通化县',2205,3),
+(220523,'辉南县',2205,3),
+(220524,'柳河县',2205,3),
+(220581,'梅河口市',2205,3),
+(220582,'集安市',2205,3),
+(220602,'浑江区',2206,3),
+(220605,'江源区',2206,3),
+(220621,'抚松县',2206,3),
+(220622,'靖宇县',2206,3),
+(220623,'长白朝鲜族自治县',2206,3),
+(220681,'临江市',2206,3),
+(220702,'宁江区',2207,3),
+(220721,'前郭尔罗斯蒙古族自治县',2207,3),
+(220722,'长岭县',2207,3),
+(220723,'乾安县',2207,3),
+(220771,'吉林松原经济开发区',2207,3),
+(220781,'扶余市',2207,3),
+(220802,'洮北区',2208,3),
+(220821,'镇赉县',2208,3),
+(220822,'通榆县',2208,3),
+(220871,'吉林白城经济开发区',2208,3),
+(220881,'洮南市',2208,3),
+(220882,'大安市',2208,3),
+(222401,'延吉市',2224,3),
+(222402,'图们市',2224,3),
+(222403,'敦化市',2224,3),
+(222404,'珲春市',2224,3),
+(222405,'龙井市',2224,3),
+(222406,'和龙市',2224,3),
+(222424,'汪清县',2224,3),
+(222426,'安图县',2224,3),
+(230102,'道里区',2301,3),
+(230103,'南岗区',2301,3),
+(230104,'道外区',2301,3),
+(230108,'平房区',2301,3),
+(230109,'松北区',2301,3),
+(230110,'香坊区',2301,3),
+(230111,'呼兰区',2301,3),
+(230112,'阿城区',2301,3),
+(230113,'双城区',2301,3),
+(230123,'依兰县',2301,3),
+(230124,'方正县',2301,3),
+(230125,'宾县',2301,3),
+(230126,'巴彦县',2301,3),
+(230127,'木兰县',2301,3),
+(230128,'通河县',2301,3),
+(230129,'延寿县',2301,3),
+(230183,'尚志市',2301,3),
+(230184,'五常市',2301,3),
+(230202,'龙沙区',2302,3),
+(230203,'建华区',2302,3),
+(230204,'铁锋区',2302,3),
+(230205,'昂昂溪区',2302,3),
+(230206,'富拉尔基区',2302,3),
+(230207,'碾子山区',2302,3),
+(230208,'梅里斯达斡尔族区',2302,3),
+(230221,'龙江县',2302,3),
+(230223,'依安县',2302,3),
+(230224,'泰来县',2302,3),
+(230225,'甘南县',2302,3),
+(230227,'富裕县',2302,3),
+(230229,'克山县',2302,3),
+(230230,'克东县',2302,3),
+(230231,'拜泉县',2302,3),
+(230281,'讷河市',2302,3),
+(230302,'鸡冠区',2303,3),
+(230303,'恒山区',2303,3),
+(230304,'滴道区',2303,3),
+(230305,'梨树区',2303,3),
+(230306,'城子河区',2303,3),
+(230307,'麻山区',2303,3),
+(230321,'鸡东县',2303,3),
+(230381,'虎林市',2303,3),
+(230382,'密山市',2303,3),
+(230402,'向阳区',2304,3),
+(230403,'工农区',2304,3),
+(230404,'南山区',2304,3),
+(230405,'兴安区',2304,3),
+(230406,'东山区',2304,3),
+(230407,'兴山区',2304,3),
+(230421,'萝北县',2304,3),
+(230422,'绥滨县',2304,3),
+(230502,'尖山区',2305,3),
+(230503,'岭东区',2305,3),
+(230505,'四方台区',2305,3),
+(230506,'宝山区',2305,3),
+(230521,'集贤县',2305,3),
+(230522,'友谊县',2305,3),
+(230523,'宝清县',2305,3),
+(230524,'饶河县',2305,3),
+(230602,'萨尔图区',2306,3),
+(230603,'龙凤区',2306,3),
+(230604,'让胡路区',2306,3),
+(230605,'红岗区',2306,3),
+(230606,'大同区',2306,3),
+(230621,'肇州县',2306,3),
+(230622,'肇源县',2306,3),
+(230623,'林甸县',2306,3),
+(230624,'杜尔伯特蒙古族自治县',2306,3),
+(230671,'大庆高新技术产业开发区',2306,3),
+(230717,'伊美区',2307,3),
+(230718,'乌翠区',2307,3),
+(230719,'友好区',2307,3),
+(230722,'嘉荫县',2307,3),
+(230723,'汤旺县',2307,3),
+(230724,'丰林县',2307,3),
+(230725,'大箐山县',2307,3),
+(230726,'南岔县',2307,3),
+(230751,'金林区',2307,3),
+(230781,'铁力市',2307,3),
+(230803,'向阳区',2308,3),
+(230804,'前进区',2308,3),
+(230805,'东风区',2308,3),
+(230811,'郊区',2308,3),
+(230822,'桦南县',2308,3),
+(230826,'桦川县',2308,3),
+(230828,'汤原县',2308,3),
+(230881,'同江市',2308,3),
+(230882,'富锦市',2308,3),
+(230883,'抚远市',2308,3),
+(230902,'新兴区',2309,3),
+(230903,'桃山区',2309,3),
+(230904,'茄子河区',2309,3),
+(230921,'勃利县',2309,3),
+(231002,'东安区',2310,3),
+(231003,'阳明区',2310,3),
+(231004,'爱民区',2310,3),
+(231005,'西安区',2310,3),
+(231025,'林口县',2310,3),
+(231071,'牡丹江经济技术开发区',2310,3),
+(231081,'绥芬河市',2310,3),
+(231083,'海林市',2310,3),
+(231084,'宁安市',2310,3),
+(231085,'穆棱市',2310,3),
+(231086,'东宁市',2310,3),
+(231102,'爱辉区',2311,3),
+(231123,'逊克县',2311,3),
+(231124,'孙吴县',2311,3),
+(231181,'北安市',2311,3),
+(231182,'五大连池市',2311,3),
+(231183,'嫩江市',2311,3),
+(231202,'北林区',2312,3),
+(231221,'望奎县',2312,3),
+(231222,'兰西县',2312,3),
+(231223,'青冈县',2312,3),
+(231224,'庆安县',2312,3),
+(231225,'明水县',2312,3),
+(231226,'绥棱县',2312,3),
+(231281,'安达市',2312,3),
+(231282,'肇东市',2312,3),
+(231283,'海伦市',2312,3),
+(232701,'漠河市',2327,3),
+(232721,'呼玛县',2327,3),
+(232722,'塔河县',2327,3),
+(232761,'加格达奇区',2327,3),
+(232762,'松岭区',2327,3),
+(232763,'新林区',2327,3),
+(232764,'呼中区',2327,3),
+(310101,'黄浦区',3101,3),
+(310104,'徐汇区',3101,3),
+(310105,'长宁区',3101,3),
+(310106,'静安区',3101,3),
+(310107,'普陀区',3101,3),
+(310109,'虹口区',3101,3),
+(310110,'杨浦区',3101,3),
+(310112,'闵行区',3101,3),
+(310113,'宝山区',3101,3),
+(310114,'嘉定区',3101,3),
+(310115,'浦东新区',3101,3),
+(310116,'金山区',3101,3),
+(310117,'松江区',3101,3),
+(310118,'青浦区',3101,3),
+(310120,'奉贤区',3101,3),
+(310151,'崇明区',3101,3),
+(320102,'玄武区',3201,3),
+(320104,'秦淮区',3201,3),
+(320105,'建邺区',3201,3),
+(320106,'鼓楼区',3201,3),
+(320111,'浦口区',3201,3),
+(320113,'栖霞区',3201,3),
+(320114,'雨花台区',3201,3),
+(320115,'江宁区',3201,3),
+(320116,'六合区',3201,3),
+(320117,'溧水区',3201,3),
+(320118,'高淳区',3201,3),
+(320205,'锡山区',3202,3),
+(320206,'惠山区',3202,3),
+(320211,'滨湖区',3202,3),
+(320213,'梁溪区',3202,3),
+(320214,'新吴区',3202,3),
+(320281,'江阴市',3202,3),
+(320282,'宜兴市',3202,3),
+(320302,'鼓楼区',3203,3),
+(320303,'云龙区',3203,3),
+(320305,'贾汪区',3203,3),
+(320311,'泉山区',3203,3),
+(320312,'铜山区',3203,3),
+(320321,'丰县',3203,3),
+(320322,'沛县',3203,3),
+(320324,'睢宁县',3203,3),
+(320371,'徐州经济技术开发区',3203,3),
+(320381,'新沂市',3203,3),
+(320382,'邳州市',3203,3),
+(320402,'天宁区',3204,3),
+(320404,'钟楼区',3204,3),
+(320411,'新北区',3204,3),
+(320412,'武进区',3204,3),
+(320413,'金坛区',3204,3),
+(320481,'溧阳市',3204,3),
+(320505,'虎丘区',3205,3),
+(320506,'吴中区',3205,3),
+(320507,'相城区',3205,3),
+(320508,'姑苏区',3205,3),
+(320509,'吴江区',3205,3),
+(320571,'苏州工业园区',3205,3),
+(320581,'常熟市',3205,3),
+(320582,'张家港市',3205,3),
+(320583,'昆山市',3205,3),
+(320585,'太仓市',3205,3),
+(320602,'崇川区',3206,3),
+(320611,'港闸区',3206,3),
+(320612,'通州区',3206,3),
+(320623,'如东县',3206,3),
+(320671,'南通经济技术开发区',3206,3),
+(320681,'启东市',3206,3),
+(320682,'如皋市',3206,3),
+(320684,'海门市',3206,3),
+(320685,'海安市',3206,3),
+(320703,'连云区',3207,3),
+(320706,'海州区',3207,3),
+(320707,'赣榆区',3207,3),
+(320722,'东海县',3207,3),
+(320723,'灌云县',3207,3),
+(320724,'灌南县',3207,3),
+(320771,'连云港经济技术开发区',3207,3),
+(320772,'连云港高新技术产业开发区',3207,3),
+(320803,'淮安区',3208,3),
+(320804,'淮阴区',3208,3),
+(320812,'清江浦区',3208,3),
+(320813,'洪泽区',3208,3),
+(320826,'涟水县',3208,3),
+(320830,'盱眙县',3208,3),
+(320831,'金湖县',3208,3),
+(320871,'淮安经济技术开发区',3208,3),
+(320902,'亭湖区',3209,3),
+(320903,'盐都区',3209,3),
+(320904,'大丰区',3209,3),
+(320921,'响水县',3209,3),
+(320922,'滨海县',3209,3),
+(320923,'阜宁县',3209,3),
+(320924,'射阳县',3209,3),
+(320925,'建湖县',3209,3),
+(320971,'盐城经济技术开发区',3209,3),
+(320981,'东台市',3209,3),
+(321002,'广陵区',3210,3),
+(321003,'邗江区',3210,3),
+(321012,'江都区',3210,3),
+(321023,'宝应县',3210,3),
+(321071,'扬州经济技术开发区',3210,3),
+(321081,'仪征市',3210,3),
+(321084,'高邮市',3210,3),
+(321102,'京口区',3211,3),
+(321111,'润州区',3211,3),
+(321112,'丹徒区',3211,3),
+(321171,'镇江新区',3211,3),
+(321181,'丹阳市',3211,3),
+(321182,'扬中市',3211,3),
+(321183,'句容市',3211,3),
+(321202,'海陵区',3212,3),
+(321203,'高港区',3212,3),
+(321204,'姜堰区',3212,3),
+(321271,'泰州医药高新技术产业开发区',3212,3),
+(321281,'兴化市',3212,3),
+(321282,'靖江市',3212,3),
+(321283,'泰兴市',3212,3),
+(321302,'宿城区',3213,3),
+(321311,'宿豫区',3213,3),
+(321322,'沭阳县',3213,3),
+(321323,'泗阳县',3213,3),
+(321324,'泗洪县',3213,3),
+(321371,'宿迁经济技术开发区',3213,3),
+(330102,'上城区',3301,3),
+(330103,'下城区',3301,3),
+(330104,'江干区',3301,3),
+(330105,'拱墅区',3301,3),
+(330106,'西湖区',3301,3),
+(330108,'滨江区',3301,3),
+(330109,'萧山区',3301,3),
+(330110,'余杭区',3301,3),
+(330111,'富阳区',3301,3),
+(330112,'临安区',3301,3),
+(330122,'桐庐县',3301,3),
+(330127,'淳安县',3301,3),
+(330182,'建德市',3301,3),
+(330203,'海曙区',3302,3),
+(330205,'江北区',3302,3),
+(330206,'北仑区',3302,3),
+(330211,'镇海区',3302,3),
+(330212,'鄞州区',3302,3),
+(330213,'奉化区',3302,3),
+(330225,'象山县',3302,3),
+(330226,'宁海县',3302,3),
+(330281,'余姚市',3302,3),
+(330282,'慈溪市',3302,3),
+(330302,'鹿城区',3303,3),
+(330303,'龙湾区',3303,3),
+(330304,'瓯海区',3303,3),
+(330305,'洞头区',3303,3),
+(330324,'永嘉县',3303,3),
+(330326,'平阳县',3303,3),
+(330327,'苍南县',3303,3),
+(330328,'文成县',3303,3),
+(330329,'泰顺县',3303,3),
+(330371,'温州经济技术开发区',3303,3),
+(330381,'瑞安市',3303,3),
+(330382,'乐清市',3303,3),
+(330383,'龙港市',3303,3),
+(330402,'南湖区',3304,3),
+(330411,'秀洲区',3304,3),
+(330421,'嘉善县',3304,3),
+(330424,'海盐县',3304,3),
+(330481,'海宁市',3304,3),
+(330482,'平湖市',3304,3),
+(330483,'桐乡市',3304,3),
+(330502,'吴兴区',3305,3),
+(330503,'南浔区',3305,3),
+(330521,'德清县',3305,3),
+(330522,'长兴县',3305,3),
+(330523,'安吉县',3305,3),
+(330602,'越城区',3306,3),
+(330603,'柯桥区',3306,3),
+(330604,'上虞区',3306,3),
+(330624,'新昌县',3306,3),
+(330681,'诸暨市',3306,3),
+(330683,'嵊州市',3306,3),
+(330702,'婺城区',3307,3),
+(330703,'金东区',3307,3),
+(330723,'武义县',3307,3),
+(330726,'浦江县',3307,3),
+(330727,'磐安县',3307,3),
+(330781,'兰溪市',3307,3),
+(330782,'义乌市',3307,3),
+(330783,'东阳市',3307,3),
+(330784,'永康市',3307,3),
+(330802,'柯城区',3308,3),
+(330803,'衢江区',3308,3),
+(330822,'常山县',3308,3),
+(330824,'开化县',3308,3),
+(330825,'龙游县',3308,3),
+(330881,'江山市',3308,3),
+(330902,'定海区',3309,3),
+(330903,'普陀区',3309,3),
+(330921,'岱山县',3309,3),
+(330922,'嵊泗县',3309,3),
+(331002,'椒江区',3310,3),
+(331003,'黄岩区',3310,3),
+(331004,'路桥区',3310,3),
+(331022,'三门县',3310,3),
+(331023,'天台县',3310,3),
+(331024,'仙居县',3310,3),
+(331081,'温岭市',3310,3),
+(331082,'临海市',3310,3),
+(331083,'玉环市',3310,3),
+(331102,'莲都区',3311,3),
+(331121,'青田县',3311,3),
+(331122,'缙云县',3311,3),
+(331123,'遂昌县',3311,3),
+(331124,'松阳县',3311,3),
+(331125,'云和县',3311,3),
+(331126,'庆元县',3311,3),
+(331127,'景宁畲族自治县',3311,3),
+(331181,'龙泉市',3311,3),
+(340102,'瑶海区',3401,3),
+(340103,'庐阳区',3401,3),
+(340104,'蜀山区',3401,3),
+(340111,'包河区',3401,3),
+(340121,'长丰县',3401,3),
+(340122,'肥东县',3401,3),
+(340123,'肥西县',3401,3),
+(340124,'庐江县',3401,3),
+(340171,'合肥高新技术产业开发区',3401,3),
+(340172,'合肥经济技术开发区',3401,3),
+(340173,'合肥新站高新技术产业开发区',3401,3),
+(340181,'巢湖市',3401,3),
+(340202,'镜湖区',3402,3),
+(340203,'弋江区',3402,3),
+(340207,'鸠江区',3402,3),
+(340208,'三山区',3402,3),
+(340221,'芜湖县',3402,3),
+(340222,'繁昌县',3402,3),
+(340223,'南陵县',3402,3),
+(340225,'无为县',3402,3),
+(340271,'芜湖经济技术开发区',3402,3),
+(340272,'安徽芜湖长江大桥经济开发区',3402,3),
+(340302,'龙子湖区',3403,3),
+(340303,'蚌山区',3403,3),
+(340304,'禹会区',3403,3),
+(340311,'淮上区',3403,3),
+(340321,'怀远县',3403,3),
+(340322,'五河县',3403,3),
+(340323,'固镇县',3403,3),
+(340371,'蚌埠市高新技术开发区',3403,3),
+(340372,'蚌埠市经济开发区',3403,3),
+(340402,'大通区',3404,3),
+(340403,'田家庵区',3404,3),
+(340404,'谢家集区',3404,3),
+(340405,'八公山区',3404,3),
+(340406,'潘集区',3404,3),
+(340421,'凤台县',3404,3),
+(340422,'寿县',3404,3),
+(340503,'花山区',3405,3),
+(340504,'雨山区',3405,3),
+(340506,'博望区',3405,3),
+(340521,'当涂县',3405,3),
+(340522,'含山县',3405,3),
+(340523,'和县',3405,3),
+(340602,'杜集区',3406,3),
+(340603,'相山区',3406,3),
+(340604,'烈山区',3406,3),
+(340621,'濉溪县',3406,3),
+(340705,'铜官区',3407,3),
+(340706,'义安区',3407,3),
+(340711,'郊区',3407,3),
+(340722,'枞阳县',3407,3),
+(340802,'迎江区',3408,3),
+(340803,'大观区',3408,3),
+(340811,'宜秀区',3408,3),
+(340822,'怀宁县',3408,3),
+(340825,'太湖县',3408,3),
+(340826,'宿松县',3408,3),
+(340827,'望江县',3408,3),
+(340828,'岳西县',3408,3),
+(340871,'安徽安庆经济开发区',3408,3),
+(340881,'桐城市',3408,3),
+(340882,'潜山市',3408,3),
+(341002,'屯溪区',3410,3),
+(341003,'黄山区',3410,3),
+(341004,'徽州区',3410,3),
+(341021,'歙县',3410,3),
+(341022,'休宁县',3410,3),
+(341023,'黟县',3410,3),
+(341024,'祁门县',3410,3),
+(341102,'琅琊区',3411,3),
+(341103,'南谯区',3411,3),
+(341122,'来安县',3411,3),
+(341124,'全椒县',3411,3),
+(341125,'定远县',3411,3),
+(341126,'凤阳县',3411,3),
+(341171,'苏滁现代产业园',3411,3),
+(341172,'滁州经济技术开发区',3411,3),
+(341181,'天长市',3411,3),
+(341182,'明光市',3411,3),
+(341202,'颍州区',3412,3),
+(341203,'颍东区',3412,3),
+(341204,'颍泉区',3412,3),
+(341221,'临泉县',3412,3),
+(341222,'太和县',3412,3),
+(341225,'阜南县',3412,3),
+(341226,'颍上县',3412,3),
+(341271,'阜阳合肥现代产业园区',3412,3),
+(341272,'阜阳经济技术开发区',3412,3),
+(341282,'界首市',3412,3),
+(341302,'埇桥区',3413,3),
+(341321,'砀山县',3413,3),
+(341322,'萧县',3413,3),
+(341323,'灵璧县',3413,3),
+(341324,'泗县',3413,3),
+(341371,'宿州马鞍山现代产业园区',3413,3),
+(341372,'宿州经济技术开发区',3413,3),
+(341502,'金安区',3415,3),
+(341503,'裕安区',3415,3),
+(341504,'叶集区',3415,3),
+(341522,'霍邱县',3415,3),
+(341523,'舒城县',3415,3),
+(341524,'金寨县',3415,3),
+(341525,'霍山县',3415,3),
+(341602,'谯城区',3416,3),
+(341621,'涡阳县',3416,3),
+(341622,'蒙城县',3416,3),
+(341623,'利辛县',3416,3),
+(341702,'贵池区',3417,3),
+(341721,'东至县',3417,3),
+(341722,'石台县',3417,3),
+(341723,'青阳县',3417,3),
+(341802,'宣州区',3418,3),
+(341821,'郎溪县',3418,3),
+(341823,'泾县',3418,3),
+(341824,'绩溪县',3418,3),
+(341825,'旌德县',3418,3),
+(341871,'宣城市经济开发区',3418,3),
+(341881,'宁国市',3418,3),
+(341882,'广德市',3418,3),
+(350102,'鼓楼区',3501,3),
+(350103,'台江区',3501,3),
+(350104,'仓山区',3501,3),
+(350105,'马尾区',3501,3),
+(350111,'晋安区',3501,3),
+(350112,'长乐区',3501,3),
+(350121,'闽侯县',3501,3),
+(350122,'连江县',3501,3),
+(350123,'罗源县',3501,3),
+(350124,'闽清县',3501,3),
+(350125,'永泰县',3501,3),
+(350128,'平潭县',3501,3),
+(350181,'福清市',3501,3),
+(350203,'思明区',3502,3),
+(350205,'海沧区',3502,3),
+(350206,'湖里区',3502,3),
+(350211,'集美区',3502,3),
+(350212,'同安区',3502,3),
+(350213,'翔安区',3502,3),
+(350302,'城厢区',3503,3),
+(350303,'涵江区',3503,3),
+(350304,'荔城区',3503,3),
+(350305,'秀屿区',3503,3),
+(350322,'仙游县',3503,3),
+(350402,'梅列区',3504,3),
+(350403,'三元区',3504,3),
+(350421,'明溪县',3504,3),
+(350423,'清流县',3504,3),
+(350424,'宁化县',3504,3),
+(350425,'大田县',3504,3),
+(350426,'尤溪县',3504,3),
+(350427,'沙县',3504,3),
+(350428,'将乐县',3504,3),
+(350429,'泰宁县',3504,3),
+(350430,'建宁县',3504,3),
+(350481,'永安市',3504,3),
+(350502,'鲤城区',3505,3),
+(350503,'丰泽区',3505,3),
+(350504,'洛江区',3505,3),
+(350505,'泉港区',3505,3),
+(350521,'惠安县',3505,3),
+(350524,'安溪县',3505,3),
+(350525,'永春县',3505,3),
+(350526,'德化县',3505,3),
+(350527,'金门县',3505,3),
+(350581,'石狮市',3505,3),
+(350582,'晋江市',3505,3),
+(350583,'南安市',3505,3),
+(350602,'芗城区',3506,3),
+(350603,'龙文区',3506,3),
+(350622,'云霄县',3506,3),
+(350623,'漳浦县',3506,3),
+(350624,'诏安县',3506,3),
+(350625,'长泰县',3506,3),
+(350626,'东山县',3506,3),
+(350627,'南靖县',3506,3),
+(350628,'平和县',3506,3),
+(350629,'华安县',3506,3),
+(350681,'龙海市',3506,3),
+(350702,'延平区',3507,3),
+(350703,'建阳区',3507,3),
+(350721,'顺昌县',3507,3),
+(350722,'浦城县',3507,3),
+(350723,'光泽县',3507,3),
+(350724,'松溪县',3507,3),
+(350725,'政和县',3507,3),
+(350781,'邵武市',3507,3),
+(350782,'武夷山市',3507,3),
+(350783,'建瓯市',3507,3),
+(350802,'新罗区',3508,3),
+(350803,'永定区',3508,3),
+(350821,'长汀县',3508,3),
+(350823,'上杭县',3508,3),
+(350824,'武平县',3508,3),
+(350825,'连城县',3508,3),
+(350881,'漳平市',3508,3),
+(350902,'蕉城区',3509,3),
+(350921,'霞浦县',3509,3),
+(350922,'古田县',3509,3),
+(350923,'屏南县',3509,3),
+(350924,'寿宁县',3509,3),
+(350925,'周宁县',3509,3),
+(350926,'柘荣县',3509,3),
+(350981,'福安市',3509,3),
+(350982,'福鼎市',3509,3),
+(360102,'东湖区',3601,3),
+(360103,'西湖区',3601,3),
+(360104,'青云谱区',3601,3),
+(360105,'湾里区',3601,3),
+(360111,'青山湖区',3601,3),
+(360112,'新建区',3601,3),
+(360121,'南昌县',3601,3),
+(360123,'安义县',3601,3),
+(360124,'进贤县',3601,3),
+(360202,'昌江区',3602,3),
+(360203,'珠山区',3602,3),
+(360222,'浮梁县',3602,3),
+(360281,'乐平市',3602,3),
+(360302,'安源区',3603,3),
+(360313,'湘东区',3603,3),
+(360321,'莲花县',3603,3),
+(360322,'上栗县',3603,3),
+(360323,'芦溪县',3603,3),
+(360402,'濂溪区',3604,3),
+(360403,'浔阳区',3604,3),
+(360404,'柴桑区',3604,3),
+(360423,'武宁县',3604,3),
+(360424,'修水县',3604,3),
+(360425,'永修县',3604,3),
+(360426,'德安县',3604,3),
+(360428,'都昌县',3604,3),
+(360429,'湖口县',3604,3),
+(360430,'彭泽县',3604,3),
+(360481,'瑞昌市',3604,3),
+(360482,'共青城市',3604,3),
+(360483,'庐山市',3604,3),
+(360502,'渝水区',3605,3),
+(360521,'分宜县',3605,3),
+(360602,'月湖区',3606,3),
+(360603,'余江区',3606,3),
+(360681,'贵溪市',3606,3),
+(360702,'章贡区',3607,3),
+(360703,'南康区',3607,3),
+(360704,'赣县区',3607,3),
+(360722,'信丰县',3607,3),
+(360723,'大余县',3607,3),
+(360724,'上犹县',3607,3),
+(360725,'崇义县',3607,3),
+(360726,'安远县',3607,3),
+(360727,'龙南县',3607,3),
+(360728,'定南县',3607,3),
+(360729,'全南县',3607,3),
+(360730,'宁都县',3607,3),
+(360731,'于都县',3607,3),
+(360732,'兴国县',3607,3),
+(360733,'会昌县',3607,3),
+(360734,'寻乌县',3607,3),
+(360735,'石城县',3607,3),
+(360781,'瑞金市',3607,3),
+(360802,'吉州区',3608,3),
+(360803,'青原区',3608,3),
+(360821,'吉安县',3608,3),
+(360822,'吉水县',3608,3),
+(360823,'峡江县',3608,3),
+(360824,'新干县',3608,3),
+(360825,'永丰县',3608,3),
+(360826,'泰和县',3608,3),
+(360827,'遂川县',3608,3),
+(360828,'万安县',3608,3),
+(360829,'安福县',3608,3),
+(360830,'永新县',3608,3),
+(360881,'井冈山市',3608,3),
+(360902,'袁州区',3609,3),
+(360921,'奉新县',3609,3),
+(360922,'万载县',3609,3),
+(360923,'上高县',3609,3),
+(360924,'宜丰县',3609,3),
+(360925,'靖安县',3609,3),
+(360926,'铜鼓县',3609,3),
+(360981,'丰城市',3609,3),
+(360982,'樟树市',3609,3),
+(360983,'高安市',3609,3),
+(361002,'临川区',3610,3),
+(361003,'东乡区',3610,3),
+(361021,'南城县',3610,3),
+(361022,'黎川县',3610,3),
+(361023,'南丰县',3610,3),
+(361024,'崇仁县',3610,3),
+(361025,'乐安县',3610,3),
+(361026,'宜黄县',3610,3),
+(361027,'金溪县',3610,3),
+(361028,'资溪县',3610,3),
+(361030,'广昌县',3610,3),
+(361102,'信州区',3611,3),
+(361103,'广丰区',3611,3),
+(361104,'广信区',3611,3),
+(361123,'玉山县',3611,3),
+(361124,'铅山县',3611,3),
+(361125,'横峰县',3611,3),
+(361126,'弋阳县',3611,3),
+(361127,'余干县',3611,3),
+(361128,'鄱阳县',3611,3),
+(361129,'万年县',3611,3),
+(361130,'婺源县',3611,3),
+(361181,'德兴市',3611,3),
+(370102,'历下区',3701,3),
+(370103,'市中区',3701,3),
+(370104,'槐荫区',3701,3),
+(370105,'天桥区',3701,3),
+(370112,'历城区',3701,3),
+(370113,'长清区',3701,3),
+(370114,'章丘区',3701,3),
+(370115,'济阳区',3701,3),
+(370116,'莱芜区',3701,3),
+(370117,'钢城区',3701,3),
+(370124,'平阴县',3701,3),
+(370126,'商河县',3701,3),
+(370171,'济南高新技术产业开发区',3701,3),
+(370202,'市南区',3702,3),
+(370203,'市北区',3702,3),
+(370211,'黄岛区',3702,3),
+(370212,'崂山区',3702,3),
+(370213,'李沧区',3702,3),
+(370214,'城阳区',3702,3),
+(370215,'即墨区',3702,3),
+(370271,'青岛高新技术产业开发区',3702,3),
+(370281,'胶州市',3702,3),
+(370283,'平度市',3702,3),
+(370285,'莱西市',3702,3),
+(370302,'淄川区',3703,3),
+(370303,'张店区',3703,3),
+(370304,'博山区',3703,3),
+(370305,'临淄区',3703,3),
+(370306,'周村区',3703,3),
+(370321,'桓台县',3703,3),
+(370322,'高青县',3703,3),
+(370323,'沂源县',3703,3),
+(370402,'市中区',3704,3),
+(370403,'薛城区',3704,3),
+(370404,'峄城区',3704,3),
+(370405,'台儿庄区',3704,3),
+(370406,'山亭区',3704,3),
+(370481,'滕州市',3704,3),
+(370502,'东营区',3705,3),
+(370503,'河口区',3705,3),
+(370505,'垦利区',3705,3),
+(370522,'利津县',3705,3),
+(370523,'广饶县',3705,3),
+(370571,'东营经济技术开发区',3705,3),
+(370572,'东营港经济开发区',3705,3),
+(370602,'芝罘区',3706,3),
+(370611,'福山区',3706,3),
+(370612,'牟平区',3706,3),
+(370613,'莱山区',3706,3),
+(370634,'长岛县',3706,3),
+(370671,'烟台高新技术产业开发区',3706,3),
+(370672,'烟台经济技术开发区',3706,3),
+(370681,'龙口市',3706,3),
+(370682,'莱阳市',3706,3),
+(370683,'莱州市',3706,3),
+(370684,'蓬莱市',3706,3),
+(370685,'招远市',3706,3),
+(370686,'栖霞市',3706,3),
+(370687,'海阳市',3706,3),
+(370702,'潍城区',3707,3),
+(370703,'寒亭区',3707,3),
+(370704,'坊子区',3707,3),
+(370705,'奎文区',3707,3),
+(370724,'临朐县',3707,3),
+(370725,'昌乐县',3707,3),
+(370772,'潍坊滨海经济技术开发区',3707,3),
+(370781,'青州市',3707,3),
+(370782,'诸城市',3707,3),
+(370783,'寿光市',3707,3),
+(370784,'安丘市',3707,3),
+(370785,'高密市',3707,3),
+(370786,'昌邑市',3707,3),
+(370811,'任城区',3708,3),
+(370812,'兖州区',3708,3),
+(370826,'微山县',3708,3),
+(370827,'鱼台县',3708,3),
+(370828,'金乡县',3708,3),
+(370829,'嘉祥县',3708,3),
+(370830,'汶上县',3708,3),
+(370831,'泗水县',3708,3),
+(370832,'梁山县',3708,3),
+(370871,'济宁高新技术产业开发区',3708,3),
+(370881,'曲阜市',3708,3),
+(370883,'邹城市',3708,3),
+(370902,'泰山区',3709,3),
+(370911,'岱岳区',3709,3),
+(370921,'宁阳县',3709,3),
+(370923,'东平县',3709,3),
+(370982,'新泰市',3709,3),
+(370983,'肥城市',3709,3),
+(371002,'环翠区',3710,3),
+(371003,'文登区',3710,3),
+(371071,'威海火炬高技术产业开发区',3710,3),
+(371072,'威海经济技术开发区',3710,3),
+(371073,'威海临港经济技术开发区',3710,3),
+(371082,'荣成市',3710,3),
+(371083,'乳山市',3710,3),
+(371102,'东港区',3711,3),
+(371103,'岚山区',3711,3),
+(371121,'五莲县',3711,3),
+(371122,'莒县',3711,3),
+(371171,'日照经济技术开发区',3711,3),
+(371302,'兰山区',3713,3),
+(371311,'罗庄区',3713,3),
+(371312,'河东区',3713,3),
+(371321,'沂南县',3713,3),
+(371322,'郯城县',3713,3),
+(371323,'沂水县',3713,3),
+(371324,'兰陵县',3713,3),
+(371325,'费县',3713,3),
+(371326,'平邑县',3713,3),
+(371327,'莒南县',3713,3),
+(371328,'蒙阴县',3713,3),
+(371329,'临沭县',3713,3),
+(371371,'临沂高新技术产业开发区',3713,3),
+(371372,'临沂经济技术开发区',3713,3),
+(371373,'临沂临港经济开发区',3713,3),
+(371402,'德城区',3714,3),
+(371403,'陵城区',3714,3),
+(371422,'宁津县',3714,3),
+(371423,'庆云县',3714,3),
+(371424,'临邑县',3714,3),
+(371425,'齐河县',3714,3),
+(371426,'平原县',3714,3),
+(371427,'夏津县',3714,3),
+(371428,'武城县',3714,3),
+(371471,'德州经济技术开发区',3714,3),
+(371472,'德州运河经济开发区',3714,3),
+(371481,'乐陵市',3714,3),
+(371482,'禹城市',3714,3),
+(371502,'东昌府区',3715,3),
+(371503,'茌平区',3715,3),
+(371521,'阳谷县',3715,3),
+(371522,'莘县',3715,3),
+(371524,'东阿县',3715,3),
+(371525,'冠县',3715,3),
+(371526,'高唐县',3715,3),
+(371581,'临清市',3715,3),
+(371602,'滨城区',3716,3),
+(371603,'沾化区',3716,3),
+(371621,'惠民县',3716,3),
+(371622,'阳信县',3716,3),
+(371623,'无棣县',3716,3),
+(371625,'博兴县',3716,3),
+(371681,'邹平市',3716,3),
+(371702,'牡丹区',3717,3),
+(371703,'定陶区',3717,3),
+(371721,'曹县',3717,3),
+(371722,'单县',3717,3),
+(371723,'成武县',3717,3),
+(371724,'巨野县',3717,3),
+(371725,'郓城县',3717,3),
+(371726,'鄄城县',3717,3),
+(371728,'东明县',3717,3),
+(371771,'菏泽经济技术开发区',3717,3),
+(371772,'菏泽高新技术开发区',3717,3),
+(410102,'中原区',4101,3),
+(410103,'二七区',4101,3),
+(410104,'管城回族区',4101,3),
+(410105,'金水区',4101,3),
+(410106,'上街区',4101,3),
+(410108,'惠济区',4101,3),
+(410122,'中牟县',4101,3),
+(410171,'郑州经济技术开发区',4101,3),
+(410172,'郑州高新技术产业开发区',4101,3),
+(410173,'郑州航空港经济综合实验区',4101,3),
+(410181,'巩义市',4101,3),
+(410182,'荥阳市',4101,3),
+(410183,'新密市',4101,3),
+(410184,'新郑市',4101,3),
+(410185,'登封市',4101,3),
+(410202,'龙亭区',4102,3),
+(410203,'顺河回族区',4102,3),
+(410204,'鼓楼区',4102,3),
+(410205,'禹王台区',4102,3),
+(410212,'祥符区',4102,3),
+(410221,'杞县',4102,3),
+(410222,'通许县',4102,3),
+(410223,'尉氏县',4102,3),
+(410225,'兰考县',4102,3),
+(410302,'老城区',4103,3),
+(410303,'西工区',4103,3),
+(410304,'瀍河回族区',4103,3),
+(410305,'涧西区',4103,3),
+(410306,'吉利区',4103,3),
+(410311,'洛龙区',4103,3),
+(410322,'孟津县',4103,3),
+(410323,'新安县',4103,3),
+(410324,'栾川县',4103,3),
+(410325,'嵩县',4103,3),
+(410326,'汝阳县',4103,3),
+(410327,'宜阳县',4103,3),
+(410328,'洛宁县',4103,3),
+(410329,'伊川县',4103,3),
+(410371,'洛阳高新技术产业开发区',4103,3),
+(410381,'偃师市',4103,3),
+(410402,'新华区',4104,3),
+(410403,'卫东区',4104,3),
+(410404,'石龙区',4104,3),
+(410411,'湛河区',4104,3),
+(410421,'宝丰县',4104,3),
+(410422,'叶县',4104,3),
+(410423,'鲁山县',4104,3),
+(410425,'郏县',4104,3),
+(410471,'平顶山高新技术产业开发区',4104,3),
+(410472,'平顶山市城乡一体化示范区',4104,3),
+(410481,'舞钢市',4104,3),
+(410482,'汝州市',4104,3),
+(410502,'文峰区',4105,3),
+(410503,'北关区',4105,3),
+(410505,'殷都区',4105,3),
+(410506,'龙安区',4105,3),
+(410522,'安阳县',4105,3),
+(410523,'汤阴县',4105,3),
+(410526,'滑县',4105,3),
+(410527,'内黄县',4105,3),
+(410571,'安阳高新技术产业开发区',4105,3),
+(410581,'林州市',4105,3),
+(410602,'鹤山区',4106,3),
+(410603,'山城区',4106,3),
+(410611,'淇滨区',4106,3),
+(410621,'浚县',4106,3),
+(410622,'淇县',4106,3),
+(410671,'鹤壁经济技术开发区',4106,3),
+(410702,'红旗区',4107,3),
+(410703,'卫滨区',4107,3),
+(410704,'凤泉区',4107,3),
+(410711,'牧野区',4107,3),
+(410721,'新乡县',4107,3),
+(410724,'获嘉县',4107,3),
+(410725,'原阳县',4107,3),
+(410726,'延津县',4107,3),
+(410727,'封丘县',4107,3),
+(410771,'新乡高新技术产业开发区',4107,3),
+(410772,'新乡经济技术开发区',4107,3),
+(410773,'新乡市平原城乡一体化示范区',4107,3),
+(410781,'卫辉市',4107,3),
+(410782,'辉县市',4107,3),
+(410783,'长垣市',4107,3),
+(410802,'解放区',4108,3),
+(410803,'中站区',4108,3),
+(410804,'马村区',4108,3),
+(410811,'山阳区',4108,3),
+(410821,'修武县',4108,3),
+(410822,'博爱县',4108,3),
+(410823,'武陟县',4108,3),
+(410825,'温县',4108,3),
+(410871,'焦作城乡一体化示范区',4108,3),
+(410882,'沁阳市',4108,3),
+(410883,'孟州市',4108,3),
+(410902,'华龙区',4109,3),
+(410922,'清丰县',4109,3),
+(410923,'南乐县',4109,3),
+(410926,'范县',4109,3),
+(410927,'台前县',4109,3),
+(410928,'濮阳县',4109,3),
+(410971,'河南濮阳工业园区',4109,3),
+(410972,'濮阳经济技术开发区',4109,3),
+(411002,'魏都区',4110,3),
+(411003,'建安区',4110,3),
+(411024,'鄢陵县',4110,3),
+(411025,'襄城县',4110,3),
+(411071,'许昌经济技术开发区',4110,3),
+(411081,'禹州市',4110,3),
+(411082,'长葛市',4110,3),
+(411102,'源汇区',4111,3),
+(411103,'郾城区',4111,3),
+(411104,'召陵区',4111,3),
+(411121,'舞阳县',4111,3),
+(411122,'临颍县',4111,3),
+(411171,'漯河经济技术开发区',4111,3),
+(411202,'湖滨区',4112,3),
+(411203,'陕州区',4112,3),
+(411221,'渑池县',4112,3),
+(411224,'卢氏县',4112,3),
+(411271,'河南三门峡经济开发区',4112,3),
+(411281,'义马市',4112,3),
+(411282,'灵宝市',4112,3),
+(411302,'宛城区',4113,3),
+(411303,'卧龙区',4113,3),
+(411321,'南召县',4113,3),
+(411322,'方城县',4113,3),
+(411323,'西峡县',4113,3),
+(411324,'镇平县',4113,3),
+(411325,'内乡县',4113,3),
+(411326,'淅川县',4113,3),
+(411327,'社旗县',4113,3),
+(411328,'唐河县',4113,3),
+(411329,'新野县',4113,3),
+(411330,'桐柏县',4113,3),
+(411371,'南阳高新技术产业开发区',4113,3),
+(411372,'南阳市城乡一体化示范区',4113,3),
+(411381,'邓州市',4113,3),
+(411402,'梁园区',4114,3),
+(411403,'睢阳区',4114,3),
+(411421,'民权县',4114,3),
+(411422,'睢县',4114,3),
+(411423,'宁陵县',4114,3),
+(411424,'柘城县',4114,3),
+(411425,'虞城县',4114,3),
+(411426,'夏邑县',4114,3),
+(411471,'豫东综合物流产业聚集区',4114,3),
+(411472,'河南商丘经济开发区',4114,3),
+(411481,'永城市',4114,3),
+(411502,'浉河区',4115,3),
+(411503,'平桥区',4115,3),
+(411521,'罗山县',4115,3),
+(411522,'光山县',4115,3),
+(411523,'新县',4115,3),
+(411524,'商城县',4115,3),
+(411525,'固始县',4115,3),
+(411526,'潢川县',4115,3),
+(411527,'淮滨县',4115,3),
+(411528,'息县',4115,3),
+(411571,'信阳高新技术产业开发区',4115,3),
+(411602,'川汇区',4116,3),
+(411603,'淮阳区',4116,3),
+(411621,'扶沟县',4116,3),
+(411622,'西华县',4116,3),
+(411623,'商水县',4116,3),
+(411624,'沈丘县',4116,3),
+(411625,'郸城县',4116,3),
+(411627,'太康县',4116,3),
+(411628,'鹿邑县',4116,3),
+(411671,'河南周口经济开发区',4116,3),
+(411681,'项城市',4116,3),
+(411702,'驿城区',4117,3),
+(411721,'西平县',4117,3),
+(411722,'上蔡县',4117,3),
+(411723,'平舆县',4117,3),
+(411724,'正阳县',4117,3),
+(411725,'确山县',4117,3),
+(411726,'泌阳县',4117,3),
+(411727,'汝南县',4117,3),
+(411728,'遂平县',4117,3),
+(411729,'新蔡县',4117,3),
+(411771,'河南驻马店经济开发区',4117,3),
+(419001,'济源市',4190,3),
+(420102,'江岸区',4201,3),
+(420103,'江汉区',4201,3),
+(420104,'硚口区',4201,3),
+(420105,'汉阳区',4201,3),
+(420106,'武昌区',4201,3),
+(420107,'青山区',4201,3),
+(420111,'洪山区',4201,3),
+(420112,'东西湖区',4201,3),
+(420113,'汉南区',4201,3),
+(420114,'蔡甸区',4201,3),
+(420115,'江夏区',4201,3),
+(420116,'黄陂区',4201,3),
+(420117,'新洲区',4201,3),
+(420202,'黄石港区',4202,3),
+(420203,'西塞山区',4202,3),
+(420204,'下陆区',4202,3),
+(420205,'铁山区',4202,3),
+(420222,'阳新县',4202,3),
+(420281,'大冶市',4202,3),
+(420302,'茅箭区',4203,3),
+(420303,'张湾区',4203,3),
+(420304,'郧阳区',4203,3),
+(420322,'郧西县',4203,3),
+(420323,'竹山县',4203,3),
+(420324,'竹溪县',4203,3),
+(420325,'房县',4203,3),
+(420381,'丹江口市',4203,3),
+(420502,'西陵区',4205,3),
+(420503,'伍家岗区',4205,3),
+(420504,'点军区',4205,3),
+(420505,'猇亭区',4205,3),
+(420506,'夷陵区',4205,3),
+(420525,'远安县',4205,3),
+(420526,'兴山县',4205,3),
+(420527,'秭归县',4205,3),
+(420528,'长阳土家族自治县',4205,3),
+(420529,'五峰土家族自治县',4205,3),
+(420581,'宜都市',4205,3),
+(420582,'当阳市',4205,3),
+(420583,'枝江市',4205,3),
+(420602,'襄城区',4206,3),
+(420606,'樊城区',4206,3),
+(420607,'襄州区',4206,3),
+(420624,'南漳县',4206,3),
+(420625,'谷城县',4206,3),
+(420626,'保康县',4206,3),
+(420682,'老河口市',4206,3),
+(420683,'枣阳市',4206,3),
+(420684,'宜城市',4206,3),
+(420702,'梁子湖区',4207,3),
+(420703,'华容区',4207,3),
+(420704,'鄂城区',4207,3),
+(420802,'东宝区',4208,3),
+(420804,'掇刀区',4208,3),
+(420822,'沙洋县',4208,3),
+(420881,'钟祥市',4208,3),
+(420882,'京山市',4208,3),
+(420902,'孝南区',4209,3),
+(420921,'孝昌县',4209,3),
+(420922,'大悟县',4209,3),
+(420923,'云梦县',4209,3),
+(420981,'应城市',4209,3),
+(420982,'安陆市',4209,3),
+(420984,'汉川市',4209,3),
+(421002,'沙市区',4210,3),
+(421003,'荆州区',4210,3),
+(421022,'公安县',4210,3),
+(421023,'监利县',4210,3),
+(421024,'江陵县',4210,3),
+(421071,'荆州经济技术开发区',4210,3),
+(421081,'石首市',4210,3),
+(421083,'洪湖市',4210,3),
+(421087,'松滋市',4210,3),
+(421102,'黄州区',4211,3),
+(421121,'团风县',4211,3),
+(421122,'红安县',4211,3),
+(421123,'罗田县',4211,3),
+(421124,'英山县',4211,3),
+(421125,'浠水县',4211,3),
+(421126,'蕲春县',4211,3),
+(421127,'黄梅县',4211,3),
+(421171,'龙感湖管理区',4211,3),
+(421181,'麻城市',4211,3),
+(421182,'武穴市',4211,3),
+(421202,'咸安区',4212,3),
+(421221,'嘉鱼县',4212,3),
+(421222,'通城县',4212,3),
+(421223,'崇阳县',4212,3),
+(421224,'通山县',4212,3),
+(421281,'赤壁市',4212,3),
+(421303,'曾都区',4213,3),
+(421321,'随县',4213,3),
+(421381,'广水市',4213,3),
+(422801,'恩施市',4228,3),
+(422802,'利川市',4228,3),
+(422822,'建始县',4228,3),
+(422823,'巴东县',4228,3),
+(422825,'宣恩县',4228,3),
+(422826,'咸丰县',4228,3),
+(422827,'来凤县',4228,3),
+(422828,'鹤峰县',4228,3),
+(429004,'仙桃市',4290,3),
+(429005,'潜江市',4290,3),
+(429006,'天门市',4290,3),
+(429021,'神农架林区',4290,3),
+(430102,'芙蓉区',4301,3),
+(430103,'天心区',4301,3),
+(430104,'岳麓区',4301,3),
+(430105,'开福区',4301,3),
+(430111,'雨花区',4301,3),
+(430112,'望城区',4301,3),
+(430121,'长沙县',4301,3),
+(430181,'浏阳市',4301,3),
+(430182,'宁乡市',4301,3),
+(430202,'荷塘区',4302,3),
+(430203,'芦淞区',4302,3),
+(430204,'石峰区',4302,3),
+(430211,'天元区',4302,3),
+(430212,'渌口区',4302,3),
+(430223,'攸县',4302,3),
+(430224,'茶陵县',4302,3),
+(430225,'炎陵县',4302,3),
+(430271,'云龙示范区',4302,3),
+(430281,'醴陵市',4302,3),
+(430302,'雨湖区',4303,3),
+(430304,'岳塘区',4303,3),
+(430321,'湘潭县',4303,3),
+(430371,'湖南湘潭高新技术产业园区',4303,3),
+(430372,'湘潭昭山示范区',4303,3),
+(430373,'湘潭九华示范区',4303,3),
+(430381,'湘乡市',4303,3),
+(430382,'韶山市',4303,3),
+(430405,'珠晖区',4304,3),
+(430406,'雁峰区',4304,3),
+(430407,'石鼓区',4304,3),
+(430408,'蒸湘区',4304,3),
+(430412,'南岳区',4304,3),
+(430421,'衡阳县',4304,3),
+(430422,'衡南县',4304,3),
+(430423,'衡山县',4304,3),
+(430424,'衡东县',4304,3),
+(430426,'祁东县',4304,3),
+(430471,'衡阳综合保税区',4304,3),
+(430472,'湖南衡阳高新技术产业园区',4304,3),
+(430473,'湖南衡阳松木经济开发区',4304,3),
+(430481,'耒阳市',4304,3),
+(430482,'常宁市',4304,3),
+(430502,'双清区',4305,3),
+(430503,'大祥区',4305,3),
+(430511,'北塔区',4305,3),
+(430522,'新邵县',4305,3),
+(430523,'邵阳县',4305,3),
+(430524,'隆回县',4305,3),
+(430525,'洞口县',4305,3),
+(430527,'绥宁县',4305,3),
+(430528,'新宁县',4305,3),
+(430529,'城步苗族自治县',4305,3),
+(430581,'武冈市',4305,3),
+(430582,'邵东市',4305,3),
+(430602,'岳阳楼区',4306,3),
+(430603,'云溪区',4306,3),
+(430611,'君山区',4306,3),
+(430621,'岳阳县',4306,3),
+(430623,'华容县',4306,3),
+(430624,'湘阴县',4306,3),
+(430626,'平江县',4306,3),
+(430671,'岳阳市屈原管理区',4306,3),
+(430681,'汨罗市',4306,3),
+(430682,'临湘市',4306,3),
+(430702,'武陵区',4307,3),
+(430703,'鼎城区',4307,3),
+(430721,'安乡县',4307,3),
+(430722,'汉寿县',4307,3),
+(430723,'澧县',4307,3),
+(430724,'临澧县',4307,3),
+(430725,'桃源县',4307,3),
+(430726,'石门县',4307,3),
+(430771,'常德市西洞庭管理区',4307,3),
+(430781,'津市市',4307,3),
+(430802,'永定区',4308,3),
+(430811,'武陵源区',4308,3),
+(430821,'慈利县',4308,3),
+(430822,'桑植县',4308,3),
+(430902,'资阳区',4309,3),
+(430903,'赫山区',4309,3),
+(430921,'南县',4309,3),
+(430922,'桃江县',4309,3),
+(430923,'安化县',4309,3),
+(430971,'益阳市大通湖管理区',4309,3),
+(430972,'湖南益阳高新技术产业园区',4309,3),
+(430981,'沅江市',4309,3),
+(431002,'北湖区',4310,3),
+(431003,'苏仙区',4310,3),
+(431021,'桂阳县',4310,3),
+(431022,'宜章县',4310,3),
+(431023,'永兴县',4310,3),
+(431024,'嘉禾县',4310,3),
+(431025,'临武县',4310,3),
+(431026,'汝城县',4310,3),
+(431027,'桂东县',4310,3),
+(431028,'安仁县',4310,3),
+(431081,'资兴市',4310,3),
+(431102,'零陵区',4311,3),
+(431103,'冷水滩区',4311,3),
+(431121,'祁阳县',4311,3),
+(431122,'东安县',4311,3),
+(431123,'双牌县',4311,3),
+(431124,'道县',4311,3),
+(431125,'江永县',4311,3),
+(431126,'宁远县',4311,3),
+(431127,'蓝山县',4311,3),
+(431128,'新田县',4311,3),
+(431129,'江华瑶族自治县',4311,3),
+(431171,'永州经济技术开发区',4311,3),
+(431172,'永州市金洞管理区',4311,3),
+(431173,'永州市回龙圩管理区',4311,3),
+(431202,'鹤城区',4312,3),
+(431221,'中方县',4312,3),
+(431222,'沅陵县',4312,3),
+(431223,'辰溪县',4312,3),
+(431224,'溆浦县',4312,3),
+(431225,'会同县',4312,3),
+(431226,'麻阳苗族自治县',4312,3),
+(431227,'新晃侗族自治县',4312,3),
+(431228,'芷江侗族自治县',4312,3),
+(431229,'靖州苗族侗族自治县',4312,3),
+(431230,'通道侗族自治县',4312,3),
+(431271,'怀化市洪江管理区',4312,3),
+(431281,'洪江市',4312,3),
+(431302,'娄星区',4313,3),
+(431321,'双峰县',4313,3),
+(431322,'新化县',4313,3),
+(431381,'冷水江市',4313,3),
+(431382,'涟源市',4313,3),
+(433101,'吉首市',4331,3),
+(433122,'泸溪县',4331,3),
+(433123,'凤凰县',4331,3),
+(433124,'花垣县',4331,3),
+(433125,'保靖县',4331,3),
+(433126,'古丈县',4331,3),
+(433127,'永顺县',4331,3),
+(433130,'龙山县',4331,3),
+(433173,'湖南永顺经济开发区',4331,3),
+(440103,'荔湾区',4401,3),
+(440104,'越秀区',4401,3),
+(440105,'海珠区',4401,3),
+(440106,'天河区',4401,3),
+(440111,'白云区',4401,3),
+(440112,'黄埔区',4401,3),
+(440113,'番禺区',4401,3),
+(440114,'花都区',4401,3),
+(440115,'南沙区',4401,3),
+(440117,'从化区',4401,3),
+(440118,'增城区',4401,3),
+(440203,'武江区',4402,3),
+(440204,'浈江区',4402,3),
+(440205,'曲江区',4402,3),
+(440222,'始兴县',4402,3),
+(440224,'仁化县',4402,3),
+(440229,'翁源县',4402,3),
+(440232,'乳源瑶族自治县',4402,3),
+(440233,'新丰县',4402,3),
+(440281,'乐昌市',4402,3),
+(440282,'南雄市',4402,3),
+(440303,'罗湖区',4403,3),
+(440304,'福田区',4403,3),
+(440305,'南山区',4403,3),
+(440306,'宝安区',4403,3),
+(440307,'龙岗区',4403,3),
+(440308,'盐田区',4403,3),
+(440309,'龙华区',4403,3),
+(440310,'坪山区',4403,3),
+(440311,'光明区',4403,3),
+(440402,'香洲区',4404,3),
+(440403,'斗门区',4404,3),
+(440404,'金湾区',4404,3),
+(440507,'龙湖区',4405,3),
+(440511,'金平区',4405,3),
+(440512,'濠江区',4405,3),
+(440513,'潮阳区',4405,3),
+(440514,'潮南区',4405,3),
+(440515,'澄海区',4405,3),
+(440523,'南澳县',4405,3),
+(440604,'禅城区',4406,3),
+(440605,'南海区',4406,3),
+(440606,'顺德区',4406,3),
+(440607,'三水区',4406,3),
+(440608,'高明区',4406,3),
+(440703,'蓬江区',4407,3),
+(440704,'江海区',4407,3),
+(440705,'新会区',4407,3),
+(440781,'台山市',4407,3),
+(440783,'开平市',4407,3),
+(440784,'鹤山市',4407,3),
+(440785,'恩平市',4407,3),
+(440802,'赤坎区',4408,3),
+(440803,'霞山区',4408,3),
+(440804,'坡头区',4408,3),
+(440811,'麻章区',4408,3),
+(440823,'遂溪县',4408,3),
+(440825,'徐闻县',4408,3),
+(440881,'廉江市',4408,3),
+(440882,'雷州市',4408,3),
+(440883,'吴川市',4408,3),
+(440902,'茂南区',4409,3),
+(440904,'电白区',4409,3),
+(440981,'高州市',4409,3),
+(440982,'化州市',4409,3),
+(440983,'信宜市',4409,3),
+(441202,'端州区',4412,3),
+(441203,'鼎湖区',4412,3),
+(441204,'高要区',4412,3),
+(441223,'广宁县',4412,3),
+(441224,'怀集县',4412,3),
+(441225,'封开县',4412,3),
+(441226,'德庆县',4412,3),
+(441284,'四会市',4412,3),
+(441302,'惠城区',4413,3),
+(441303,'惠阳区',4413,3),
+(441322,'博罗县',4413,3),
+(441323,'惠东县',4413,3),
+(441324,'龙门县',4413,3),
+(441402,'梅江区',4414,3),
+(441403,'梅县区',4414,3),
+(441422,'大埔县',4414,3),
+(441423,'丰顺县',4414,3),
+(441424,'五华县',4414,3),
+(441426,'平远县',4414,3),
+(441427,'蕉岭县',4414,3),
+(441481,'兴宁市',4414,3),
+(441502,'城区',4415,3),
+(441521,'海丰县',4415,3),
+(441523,'陆河县',4415,3),
+(441581,'陆丰市',4415,3),
+(441602,'源城区',4416,3),
+(441621,'紫金县',4416,3),
+(441622,'龙川县',4416,3),
+(441623,'连平县',4416,3),
+(441624,'和平县',4416,3),
+(441625,'东源县',4416,3),
+(441702,'江城区',4417,3),
+(441704,'阳东区',4417,3),
+(441721,'阳西县',4417,3),
+(441781,'阳春市',4417,3),
+(441802,'清城区',4418,3),
+(441803,'清新区',4418,3),
+(441821,'佛冈县',4418,3),
+(441823,'阳山县',4418,3),
+(441825,'连山壮族瑶族自治县',4418,3),
+(441826,'连南瑶族自治县',4418,3),
+(441881,'英德市',4418,3),
+(441882,'连州市',4418,3),
+(441900,'东莞市',4419,3),
+(442000,'中山市',4420,3),
+(445102,'湘桥区',4451,3),
+(445103,'潮安区',4451,3),
+(445122,'饶平县',4451,3),
+(445202,'榕城区',4452,3),
+(445203,'揭东区',4452,3),
+(445222,'揭西县',4452,3),
+(445224,'惠来县',4452,3),
+(445281,'普宁市',4452,3),
+(445302,'云城区',4453,3),
+(445303,'云安区',4453,3),
+(445321,'新兴县',4453,3),
+(445322,'郁南县',4453,3),
+(445381,'罗定市',4453,3),
+(450102,'兴宁区',4501,3),
+(450103,'青秀区',4501,3),
+(450105,'江南区',4501,3),
+(450107,'西乡塘区',4501,3),
+(450108,'良庆区',4501,3),
+(450109,'邕宁区',4501,3),
+(450110,'武鸣区',4501,3),
+(450123,'隆安县',4501,3),
+(450124,'马山县',4501,3),
+(450125,'上林县',4501,3),
+(450126,'宾阳县',4501,3),
+(450127,'横县',4501,3),
+(450202,'城中区',4502,3),
+(450203,'鱼峰区',4502,3),
+(450204,'柳南区',4502,3),
+(450205,'柳北区',4502,3),
+(450206,'柳江区',4502,3),
+(450222,'柳城县',4502,3),
+(450223,'鹿寨县',4502,3),
+(450224,'融安县',4502,3),
+(450225,'融水苗族自治县',4502,3),
+(450226,'三江侗族自治县',4502,3),
+(450302,'秀峰区',4503,3),
+(450303,'叠彩区',4503,3),
+(450304,'象山区',4503,3),
+(450305,'七星区',4503,3),
+(450311,'雁山区',4503,3),
+(450312,'临桂区',4503,3),
+(450321,'阳朔县',4503,3),
+(450323,'灵川县',4503,3),
+(450324,'全州县',4503,3),
+(450325,'兴安县',4503,3),
+(450326,'永福县',4503,3),
+(450327,'灌阳县',4503,3),
+(450328,'龙胜各族自治县',4503,3),
+(450329,'资源县',4503,3),
+(450330,'平乐县',4503,3),
+(450332,'恭城瑶族自治县',4503,3),
+(450381,'荔浦市',4503,3),
+(450403,'万秀区',4504,3),
+(450405,'长洲区',4504,3),
+(450406,'龙圩区',4504,3),
+(450421,'苍梧县',4504,3),
+(450422,'藤县',4504,3),
+(450423,'蒙山县',4504,3),
+(450481,'岑溪市',4504,3),
+(450502,'海城区',4505,3),
+(450503,'银海区',4505,3),
+(450512,'铁山港区',4505,3),
+(450521,'合浦县',4505,3),
+(450602,'港口区',4506,3),
+(450603,'防城区',4506,3),
+(450621,'上思县',4506,3),
+(450681,'东兴市',4506,3),
+(450702,'钦南区',4507,3),
+(450703,'钦北区',4507,3),
+(450721,'灵山县',4507,3),
+(450722,'浦北县',4507,3),
+(450802,'港北区',4508,3),
+(450803,'港南区',4508,3),
+(450804,'覃塘区',4508,3),
+(450821,'平南县',4508,3),
+(450881,'桂平市',4508,3),
+(450902,'玉州区',4509,3),
+(450903,'福绵区',4509,3),
+(450921,'容县',4509,3),
+(450922,'陆川县',4509,3),
+(450923,'博白县',4509,3),
+(450924,'兴业县',4509,3),
+(450981,'北流市',4509,3),
+(451002,'右江区',4510,3),
+(451003,'田阳区',4510,3),
+(451022,'田东县',4510,3),
+(451023,'平果县',4510,3),
+(451024,'德保县',4510,3),
+(451026,'那坡县',4510,3),
+(451027,'凌云县',4510,3),
+(451028,'乐业县',4510,3),
+(451029,'田林县',4510,3),
+(451030,'西林县',4510,3),
+(451031,'隆林各族自治县',4510,3),
+(451081,'靖西市',4510,3),
+(451102,'八步区',4511,3),
+(451103,'平桂区',4511,3),
+(451121,'昭平县',4511,3),
+(451122,'钟山县',4511,3),
+(451123,'富川瑶族自治县',4511,3),
+(451202,'金城江区',4512,3),
+(451203,'宜州区',4512,3),
+(451221,'南丹县',4512,3),
+(451222,'天峨县',4512,3),
+(451223,'凤山县',4512,3),
+(451224,'东兰县',4512,3),
+(451225,'罗城仫佬族自治县',4512,3),
+(451226,'环江毛南族自治县',4512,3),
+(451227,'巴马瑶族自治县',4512,3),
+(451228,'都安瑶族自治县',4512,3),
+(451229,'大化瑶族自治县',4512,3),
+(451302,'兴宾区',4513,3),
+(451321,'忻城县',4513,3),
+(451322,'象州县',4513,3),
+(451323,'武宣县',4513,3),
+(451324,'金秀瑶族自治县',4513,3),
+(451381,'合山市',4513,3),
+(451402,'江州区',4514,3),
+(451421,'扶绥县',4514,3),
+(451422,'宁明县',4514,3),
+(451423,'龙州县',4514,3),
+(451424,'大新县',4514,3),
+(451425,'天等县',4514,3),
+(451481,'凭祥市',4514,3),
+(460105,'秀英区',4601,3),
+(460106,'龙华区',4601,3),
+(460107,'琼山区',4601,3),
+(460108,'美兰区',4601,3),
+(460202,'海棠区',4602,3),
+(460203,'吉阳区',4602,3),
+(460204,'天涯区',4602,3),
+(460205,'崖州区',4602,3),
+(460321,'西沙群岛',4603,3),
+(460322,'南沙群岛',4603,3),
+(460323,'中沙群岛的岛礁及其海域',4603,3),
+(460400,'儋州市',4604,3),
+(469001,'五指山市',4690,3),
+(469002,'琼海市',4690,3),
+(469005,'文昌市',4690,3),
+(469006,'万宁市',4690,3),
+(469007,'东方市',4690,3),
+(469021,'定安县',4690,3),
+(469022,'屯昌县',4690,3),
+(469023,'澄迈县',4690,3),
+(469024,'临高县',4690,3),
+(469025,'白沙黎族自治县',4690,3),
+(469026,'昌江黎族自治县',4690,3),
+(469027,'乐东黎族自治县',4690,3),
+(469028,'陵水黎族自治县',4690,3),
+(469029,'保亭黎族苗族自治县',4690,3),
+(469030,'琼中黎族苗族自治县',4690,3),
+(500101,'万州区',5001,3),
+(500102,'涪陵区',5001,3),
+(500103,'渝中区',5001,3),
+(500104,'大渡口区',5001,3),
+(500105,'江北区',5001,3),
+(500106,'沙坪坝区',5001,3),
+(500107,'九龙坡区',5001,3),
+(500108,'南岸区',5001,3),
+(500109,'北碚区',5001,3),
+(500110,'綦江区',5001,3),
+(500111,'大足区',5001,3),
+(500112,'渝北区',5001,3),
+(500113,'巴南区',5001,3),
+(500114,'黔江区',5001,3),
+(500115,'长寿区',5001,3),
+(500116,'江津区',5001,3),
+(500117,'合川区',5001,3),
+(500118,'永川区',5001,3),
+(500119,'南川区',5001,3),
+(500120,'璧山区',5001,3),
+(500151,'铜梁区',5001,3),
+(500152,'潼南区',5001,3),
+(500153,'荣昌区',5001,3),
+(500154,'开州区',5001,3),
+(500155,'梁平区',5001,3),
+(500156,'武隆区',5001,3),
+(500229,'城口县',5002,3),
+(500230,'丰都县',5002,3),
+(500231,'垫江县',5002,3),
+(500233,'忠县',5002,3),
+(500235,'云阳县',5002,3),
+(500236,'奉节县',5002,3),
+(500237,'巫山县',5002,3),
+(500238,'巫溪县',5002,3),
+(500240,'石柱土家族自治县',5002,3),
+(500241,'秀山土家族苗族自治县',5002,3),
+(500242,'酉阳土家族苗族自治县',5002,3),
+(500243,'彭水苗族土家族自治县',5002,3),
+(510104,'锦江区',5101,3),
+(510105,'青羊区',5101,3),
+(510106,'金牛区',5101,3),
+(510107,'武侯区',5101,3),
+(510108,'成华区',5101,3),
+(510112,'龙泉驿区',5101,3),
+(510113,'青白江区',5101,3),
+(510114,'新都区',5101,3),
+(510115,'温江区',5101,3),
+(510116,'双流区',5101,3),
+(510117,'郫都区',5101,3),
+(510121,'金堂县',5101,3),
+(510129,'大邑县',5101,3),
+(510131,'蒲江县',5101,3),
+(510132,'新津县',5101,3),
+(510181,'都江堰市',5101,3),
+(510182,'彭州市',5101,3),
+(510183,'邛崃市',5101,3),
+(510184,'崇州市',5101,3),
+(510185,'简阳市',5101,3),
+(510302,'自流井区',5103,3),
+(510303,'贡井区',5103,3),
+(510304,'大安区',5103,3),
+(510311,'沿滩区',5103,3),
+(510321,'荣县',5103,3),
+(510322,'富顺县',5103,3),
+(510402,'东区',5104,3),
+(510403,'西区',5104,3),
+(510411,'仁和区',5104,3),
+(510421,'米易县',5104,3),
+(510422,'盐边县',5104,3),
+(510502,'江阳区',5105,3),
+(510503,'纳溪区',5105,3),
+(510504,'龙马潭区',5105,3),
+(510521,'泸县',5105,3),
+(510522,'合江县',5105,3),
+(510524,'叙永县',5105,3),
+(510525,'古蔺县',5105,3),
+(510603,'旌阳区',5106,3),
+(510604,'罗江区',5106,3),
+(510623,'中江县',5106,3),
+(510681,'广汉市',5106,3),
+(510682,'什邡市',5106,3),
+(510683,'绵竹市',5106,3),
+(510703,'涪城区',5107,3),
+(510704,'游仙区',5107,3),
+(510705,'安州区',5107,3),
+(510722,'三台县',5107,3),
+(510723,'盐亭县',5107,3),
+(510725,'梓潼县',5107,3),
+(510726,'北川羌族自治县',5107,3),
+(510727,'平武县',5107,3),
+(510781,'江油市',5107,3),
+(510802,'利州区',5108,3),
+(510811,'昭化区',5108,3),
+(510812,'朝天区',5108,3),
+(510821,'旺苍县',5108,3),
+(510822,'青川县',5108,3),
+(510823,'剑阁县',5108,3),
+(510824,'苍溪县',5108,3),
+(510903,'船山区',5109,3),
+(510904,'安居区',5109,3),
+(510921,'蓬溪县',5109,3),
+(510923,'大英县',5109,3),
+(510981,'射洪市',5109,3),
+(511002,'市中区',5110,3),
+(511011,'东兴区',5110,3),
+(511024,'威远县',5110,3),
+(511025,'资中县',5110,3),
+(511071,'内江经济开发区',5110,3),
+(511083,'隆昌市',5110,3),
+(511102,'市中区',5111,3),
+(511111,'沙湾区',5111,3),
+(511112,'五通桥区',5111,3),
+(511113,'金口河区',5111,3),
+(511123,'犍为县',5111,3),
+(511124,'井研县',5111,3),
+(511126,'夹江县',5111,3),
+(511129,'沐川县',5111,3),
+(511132,'峨边彝族自治县',5111,3),
+(511133,'马边彝族自治县',5111,3),
+(511181,'峨眉山市',5111,3),
+(511302,'顺庆区',5113,3),
+(511303,'高坪区',5113,3),
+(511304,'嘉陵区',5113,3),
+(511321,'南部县',5113,3),
+(511322,'营山县',5113,3),
+(511323,'蓬安县',5113,3),
+(511324,'仪陇县',5113,3),
+(511325,'西充县',5113,3),
+(511381,'阆中市',5113,3),
+(511402,'东坡区',5114,3),
+(511403,'彭山区',5114,3),
+(511421,'仁寿县',5114,3),
+(511423,'洪雅县',5114,3),
+(511424,'丹棱县',5114,3),
+(511425,'青神县',5114,3),
+(511502,'翠屏区',5115,3),
+(511503,'南溪区',5115,3),
+(511504,'叙州区',5115,3),
+(511523,'江安县',5115,3),
+(511524,'长宁县',5115,3),
+(511525,'高县',5115,3),
+(511526,'珙县',5115,3),
+(511527,'筠连县',5115,3),
+(511528,'兴文县',5115,3),
+(511529,'屏山县',5115,3),
+(511602,'广安区',5116,3),
+(511603,'前锋区',5116,3),
+(511621,'岳池县',5116,3),
+(511622,'武胜县',5116,3),
+(511623,'邻水县',5116,3),
+(511681,'华蓥市',5116,3),
+(511702,'通川区',5117,3),
+(511703,'达川区',5117,3),
+(511722,'宣汉县',5117,3),
+(511723,'开江县',5117,3),
+(511724,'大竹县',5117,3),
+(511725,'渠县',5117,3),
+(511771,'达州经济开发区',5117,3),
+(511781,'万源市',5117,3),
+(511802,'雨城区',5118,3),
+(511803,'名山区',5118,3),
+(511822,'荥经县',5118,3),
+(511823,'汉源县',5118,3),
+(511824,'石棉县',5118,3),
+(511825,'天全县',5118,3),
+(511826,'芦山县',5118,3),
+(511827,'宝兴县',5118,3),
+(511902,'巴州区',5119,3),
+(511903,'恩阳区',5119,3),
+(511921,'通江县',5119,3),
+(511922,'南江县',5119,3),
+(511923,'平昌县',5119,3),
+(511971,'巴中经济开发区',5119,3),
+(512002,'雁江区',5120,3),
+(512021,'安岳县',5120,3),
+(512022,'乐至县',5120,3),
+(513201,'马尔康市',5132,3),
+(513221,'汶川县',5132,3),
+(513222,'理县',5132,3),
+(513223,'茂县',5132,3),
+(513224,'松潘县',5132,3),
+(513225,'九寨沟县',5132,3),
+(513226,'金川县',5132,3),
+(513227,'小金县',5132,3),
+(513228,'黑水县',5132,3),
+(513230,'壤塘县',5132,3),
+(513231,'阿坝县',5132,3),
+(513232,'若尔盖县',5132,3),
+(513233,'红原县',5132,3),
+(513301,'康定市',5133,3),
+(513322,'泸定县',5133,3),
+(513323,'丹巴县',5133,3),
+(513324,'九龙县',5133,3),
+(513325,'雅江县',5133,3),
+(513326,'道孚县',5133,3),
+(513327,'炉霍县',5133,3),
+(513328,'甘孜县',5133,3),
+(513329,'新龙县',5133,3),
+(513330,'德格县',5133,3),
+(513331,'白玉县',5133,3),
+(513332,'石渠县',5133,3),
+(513333,'色达县',5133,3),
+(513334,'理塘县',5133,3),
+(513335,'巴塘县',5133,3),
+(513336,'乡城县',5133,3),
+(513337,'稻城县',5133,3),
+(513338,'得荣县',5133,3),
+(513401,'西昌市',5134,3),
+(513422,'木里藏族自治县',5134,3),
+(513423,'盐源县',5134,3),
+(513424,'德昌县',5134,3),
+(513425,'会理县',5134,3),
+(513426,'会东县',5134,3),
+(513427,'宁南县',5134,3),
+(513428,'普格县',5134,3),
+(513429,'布拖县',5134,3),
+(513430,'金阳县',5134,3),
+(513431,'昭觉县',5134,3),
+(513432,'喜德县',5134,3),
+(513433,'冕宁县',5134,3),
+(513434,'越西县',5134,3),
+(513435,'甘洛县',5134,3),
+(513436,'美姑县',5134,3),
+(513437,'雷波县',5134,3),
+(520102,'南明区',5201,3),
+(520103,'云岩区',5201,3),
+(520111,'花溪区',5201,3),
+(520112,'乌当区',5201,3),
+(520113,'白云区',5201,3),
+(520115,'观山湖区',5201,3),
+(520121,'开阳县',5201,3),
+(520122,'息烽县',5201,3),
+(520123,'修文县',5201,3),
+(520181,'清镇市',5201,3),
+(520201,'钟山区',5202,3),
+(520203,'六枝特区',5202,3),
+(520221,'水城县',5202,3),
+(520281,'盘州市',5202,3),
+(520302,'红花岗区',5203,3),
+(520303,'汇川区',5203,3),
+(520304,'播州区',5203,3),
+(520322,'桐梓县',5203,3),
+(520323,'绥阳县',5203,3),
+(520324,'正安县',5203,3),
+(520325,'道真仡佬族苗族自治县',5203,3),
+(520326,'务川仡佬族苗族自治县',5203,3),
+(520327,'凤冈县',5203,3),
+(520328,'湄潭县',5203,3),
+(520329,'余庆县',5203,3),
+(520330,'习水县',5203,3),
+(520381,'赤水市',5203,3),
+(520382,'仁怀市',5203,3),
+(520402,'西秀区',5204,3),
+(520403,'平坝区',5204,3),
+(520422,'普定县',5204,3),
+(520423,'镇宁布依族苗族自治县',5204,3),
+(520424,'关岭布依族苗族自治县',5204,3),
+(520425,'紫云苗族布依族自治县',5204,3),
+(520502,'七星关区',5205,3),
+(520521,'大方县',5205,3),
+(520522,'黔西县',5205,3),
+(520523,'金沙县',5205,3),
+(520524,'织金县',5205,3),
+(520525,'纳雍县',5205,3),
+(520526,'威宁彝族回族苗族自治县',5205,3),
+(520527,'赫章县',5205,3),
+(520602,'碧江区',5206,3),
+(520603,'万山区',5206,3),
+(520621,'江口县',5206,3),
+(520622,'玉屏侗族自治县',5206,3),
+(520623,'石阡县',5206,3),
+(520624,'思南县',5206,3),
+(520625,'印江土家族苗族自治县',5206,3),
+(520626,'德江县',5206,3),
+(520627,'沿河土家族自治县',5206,3),
+(520628,'松桃苗族自治县',5206,3),
+(522301,'兴义市',5223,3),
+(522302,'兴仁市',5223,3),
+(522323,'普安县',5223,3),
+(522324,'晴隆县',5223,3),
+(522325,'贞丰县',5223,3),
+(522326,'望谟县',5223,3),
+(522327,'册亨县',5223,3),
+(522328,'安龙县',5223,3),
+(522601,'凯里市',5226,3),
+(522622,'黄平县',5226,3),
+(522623,'施秉县',5226,3),
+(522624,'三穗县',5226,3),
+(522625,'镇远县',5226,3),
+(522626,'岑巩县',5226,3),
+(522627,'天柱县',5226,3),
+(522628,'锦屏县',5226,3),
+(522629,'剑河县',5226,3),
+(522630,'台江县',5226,3),
+(522631,'黎平县',5226,3),
+(522632,'榕江县',5226,3),
+(522633,'从江县',5226,3),
+(522634,'雷山县',5226,3),
+(522635,'麻江县',5226,3),
+(522636,'丹寨县',5226,3),
+(522701,'都匀市',5227,3),
+(522702,'福泉市',5227,3),
+(522722,'荔波县',5227,3),
+(522723,'贵定县',5227,3),
+(522725,'瓮安县',5227,3),
+(522726,'独山县',5227,3),
+(522727,'平塘县',5227,3),
+(522728,'罗甸县',5227,3),
+(522729,'长顺县',5227,3),
+(522730,'龙里县',5227,3),
+(522731,'惠水县',5227,3),
+(522732,'三都水族自治县',5227,3),
+(530102,'五华区',5301,3),
+(530103,'盘龙区',5301,3),
+(530111,'官渡区',5301,3),
+(530112,'西山区',5301,3),
+(530113,'东川区',5301,3),
+(530114,'呈贡区',5301,3),
+(530115,'晋宁区',5301,3),
+(530124,'富民县',5301,3),
+(530125,'宜良县',5301,3),
+(530126,'石林彝族自治县',5301,3),
+(530127,'嵩明县',5301,3),
+(530128,'禄劝彝族苗族自治县',5301,3),
+(530129,'寻甸回族彝族自治县',5301,3),
+(530181,'安宁市',5301,3),
+(530302,'麒麟区',5303,3),
+(530303,'沾益区',5303,3),
+(530304,'马龙区',5303,3),
+(530322,'陆良县',5303,3),
+(530323,'师宗县',5303,3),
+(530324,'罗平县',5303,3),
+(530325,'富源县',5303,3),
+(530326,'会泽县',5303,3),
+(530381,'宣威市',5303,3),
+(530402,'红塔区',5304,3),
+(530403,'江川区',5304,3),
+(530422,'澄江县',5304,3),
+(530423,'通海县',5304,3),
+(530424,'华宁县',5304,3),
+(530425,'易门县',5304,3),
+(530426,'峨山彝族自治县',5304,3),
+(530427,'新平彝族傣族自治县',5304,3),
+(530428,'元江哈尼族彝族傣族自治县',5304,3),
+(530502,'隆阳区',5305,3),
+(530521,'施甸县',5305,3),
+(530523,'龙陵县',5305,3),
+(530524,'昌宁县',5305,3),
+(530581,'腾冲市',5305,3),
+(530602,'昭阳区',5306,3),
+(530621,'鲁甸县',5306,3),
+(530622,'巧家县',5306,3),
+(530623,'盐津县',5306,3),
+(530624,'大关县',5306,3),
+(530625,'永善县',5306,3),
+(530626,'绥江县',5306,3),
+(530627,'镇雄县',5306,3),
+(530628,'彝良县',5306,3),
+(530629,'威信县',5306,3),
+(530681,'水富市',5306,3),
+(530702,'古城区',5307,3),
+(530721,'玉龙纳西族自治县',5307,3),
+(530722,'永胜县',5307,3),
+(530723,'华坪县',5307,3),
+(530724,'宁蒗彝族自治县',5307,3),
+(530802,'思茅区',5308,3),
+(530821,'宁洱哈尼族彝族自治县',5308,3),
+(530822,'墨江哈尼族自治县',5308,3),
+(530823,'景东彝族自治县',5308,3),
+(530824,'景谷傣族彝族自治县',5308,3),
+(530825,'镇沅彝族哈尼族拉祜族自治县',5308,3),
+(530826,'江城哈尼族彝族自治县',5308,3),
+(530827,'孟连傣族拉祜族佤族自治县',5308,3),
+(530828,'澜沧拉祜族自治县',5308,3),
+(530829,'西盟佤族自治县',5308,3),
+(530902,'临翔区',5309,3),
+(530921,'凤庆县',5309,3),
+(530922,'云县',5309,3),
+(530923,'永德县',5309,3),
+(530924,'镇康县',5309,3),
+(530925,'双江拉祜族佤族布朗族傣族自治县',5309,3),
+(530926,'耿马傣族佤族自治县',5309,3),
+(530927,'沧源佤族自治县',5309,3),
+(532301,'楚雄市',5323,3),
+(532322,'双柏县',5323,3),
+(532323,'牟定县',5323,3),
+(532324,'南华县',5323,3),
+(532325,'姚安县',5323,3),
+(532326,'大姚县',5323,3),
+(532327,'永仁县',5323,3),
+(532328,'元谋县',5323,3),
+(532329,'武定县',5323,3),
+(532331,'禄丰县',5323,3),
+(532501,'个旧市',5325,3),
+(532502,'开远市',5325,3),
+(532503,'蒙自市',5325,3),
+(532504,'弥勒市',5325,3),
+(532523,'屏边苗族自治县',5325,3),
+(532524,'建水县',5325,3),
+(532525,'石屏县',5325,3),
+(532527,'泸西县',5325,3),
+(532528,'元阳县',5325,3),
+(532529,'红河县',5325,3),
+(532530,'金平苗族瑶族傣族自治县',5325,3),
+(532531,'绿春县',5325,3),
+(532532,'河口瑶族自治县',5325,3),
+(532601,'文山市',5326,3),
+(532622,'砚山县',5326,3),
+(532623,'西畴县',5326,3),
+(532624,'麻栗坡县',5326,3),
+(532625,'马关县',5326,3),
+(532626,'丘北县',5326,3),
+(532627,'广南县',5326,3),
+(532628,'富宁县',5326,3),
+(532801,'景洪市',5328,3),
+(532822,'勐海县',5328,3),
+(532823,'勐腊县',5328,3),
+(532901,'大理市',5329,3),
+(532922,'漾濞彝族自治县',5329,3),
+(532923,'祥云县',5329,3),
+(532924,'宾川县',5329,3),
+(532925,'弥渡县',5329,3),
+(532926,'南涧彝族自治县',5329,3),
+(532927,'巍山彝族回族自治县',5329,3),
+(532928,'永平县',5329,3),
+(532929,'云龙县',5329,3),
+(532930,'洱源县',5329,3),
+(532931,'剑川县',5329,3),
+(532932,'鹤庆县',5329,3),
+(533102,'瑞丽市',5331,3),
+(533103,'芒市',5331,3),
+(533122,'梁河县',5331,3),
+(533123,'盈江县',5331,3),
+(533124,'陇川县',5331,3),
+(533301,'泸水市',5333,3),
+(533323,'福贡县',5333,3),
+(533324,'贡山独龙族怒族自治县',5333,3),
+(533325,'兰坪白族普米族自治县',5333,3),
+(533401,'香格里拉市',5334,3),
+(533422,'德钦县',5334,3),
+(533423,'维西傈僳族自治县',5334,3),
+(540102,'城关区',5401,3),
+(540103,'堆龙德庆区',5401,3),
+(540104,'达孜区',5401,3),
+(540121,'林周县',5401,3),
+(540122,'当雄县',5401,3),
+(540123,'尼木县',5401,3),
+(540124,'曲水县',5401,3),
+(540127,'墨竹工卡县',5401,3),
+(540171,'格尔木藏青工业园区',5401,3),
+(540172,'拉萨经济技术开发区',5401,3),
+(540173,'西藏文化旅游创意园区',5401,3),
+(540174,'达孜工业园区',5401,3),
+(540202,'桑珠孜区',5402,3),
+(540221,'南木林县',5402,3),
+(540222,'江孜县',5402,3),
+(540223,'定日县',5402,3),
+(540224,'萨迦县',5402,3),
+(540225,'拉孜县',5402,3),
+(540226,'昂仁县',5402,3),
+(540227,'谢通门县',5402,3),
+(540228,'白朗县',5402,3),
+(540229,'仁布县',5402,3),
+(540230,'康马县',5402,3),
+(540231,'定结县',5402,3),
+(540232,'仲巴县',5402,3),
+(540233,'亚东县',5402,3),
+(540234,'吉隆县',5402,3),
+(540235,'聂拉木县',5402,3),
+(540236,'萨嘎县',5402,3),
+(540237,'岗巴县',5402,3),
+(540302,'卡若区',5403,3),
+(540321,'江达县',5403,3),
+(540322,'贡觉县',5403,3),
+(540323,'类乌齐县',5403,3),
+(540324,'丁青县',5403,3),
+(540325,'察雅县',5403,3),
+(540326,'八宿县',5403,3),
+(540327,'左贡县',5403,3),
+(540328,'芒康县',5403,3),
+(540329,'洛隆县',5403,3),
+(540330,'边坝县',5403,3),
+(540402,'巴宜区',5404,3),
+(540421,'工布江达县',5404,3),
+(540422,'米林县',5404,3),
+(540423,'墨脱县',5404,3),
+(540424,'波密县',5404,3),
+(540425,'察隅县',5404,3),
+(540426,'朗县',5404,3),
+(540502,'乃东区',5405,3),
+(540521,'扎囊县',5405,3),
+(540522,'贡嘎县',5405,3),
+(540523,'桑日县',5405,3),
+(540524,'琼结县',5405,3),
+(540525,'曲松县',5405,3),
+(540526,'措美县',5405,3),
+(540527,'洛扎县',5405,3),
+(540528,'加查县',5405,3),
+(540529,'隆子县',5405,3),
+(540530,'错那县',5405,3),
+(540531,'浪卡子县',5405,3),
+(540602,'色尼区',5406,3),
+(540621,'嘉黎县',5406,3),
+(540622,'比如县',5406,3),
+(540623,'聂荣县',5406,3),
+(540624,'安多县',5406,3),
+(540625,'申扎县',5406,3),
+(540626,'索县',5406,3),
+(540627,'班戈县',5406,3),
+(540628,'巴青县',5406,3),
+(540629,'尼玛县',5406,3),
+(540630,'双湖县',5406,3),
+(542521,'普兰县',5425,3),
+(542522,'札达县',5425,3),
+(542523,'噶尔县',5425,3),
+(542524,'日土县',5425,3),
+(542525,'革吉县',5425,3),
+(542526,'改则县',5425,3),
+(542527,'措勤县',5425,3),
+(610102,'新城区',6101,3),
+(610103,'碑林区',6101,3),
+(610104,'莲湖区',6101,3),
+(610111,'灞桥区',6101,3),
+(610112,'未央区',6101,3),
+(610113,'雁塔区',6101,3),
+(610114,'阎良区',6101,3),
+(610115,'临潼区',6101,3),
+(610116,'长安区',6101,3),
+(610117,'高陵区',6101,3),
+(610118,'鄠邑区',6101,3),
+(610122,'蓝田县',6101,3),
+(610124,'周至县',6101,3),
+(610202,'王益区',6102,3),
+(610203,'印台区',6102,3),
+(610204,'耀州区',6102,3),
+(610222,'宜君县',6102,3),
+(610302,'渭滨区',6103,3),
+(610303,'金台区',6103,3),
+(610304,'陈仓区',6103,3),
+(610322,'凤翔县',6103,3),
+(610323,'岐山县',6103,3),
+(610324,'扶风县',6103,3),
+(610326,'眉县',6103,3),
+(610327,'陇县',6103,3),
+(610328,'千阳县',6103,3),
+(610329,'麟游县',6103,3),
+(610330,'凤县',6103,3),
+(610331,'太白县',6103,3),
+(610402,'秦都区',6104,3),
+(610403,'杨陵区',6104,3),
+(610404,'渭城区',6104,3),
+(610422,'三原县',6104,3),
+(610423,'泾阳县',6104,3),
+(610424,'乾县',6104,3),
+(610425,'礼泉县',6104,3),
+(610426,'永寿县',6104,3),
+(610428,'长武县',6104,3),
+(610429,'旬邑县',6104,3),
+(610430,'淳化县',6104,3),
+(610431,'武功县',6104,3),
+(610481,'兴平市',6104,3),
+(610482,'彬州市',6104,3),
+(610502,'临渭区',6105,3),
+(610503,'华州区',6105,3),
+(610522,'潼关县',6105,3),
+(610523,'大荔县',6105,3),
+(610524,'合阳县',6105,3),
+(610525,'澄城县',6105,3),
+(610526,'蒲城县',6105,3),
+(610527,'白水县',6105,3),
+(610528,'富平县',6105,3),
+(610581,'韩城市',6105,3),
+(610582,'华阴市',6105,3),
+(610602,'宝塔区',6106,3),
+(610603,'安塞区',6106,3),
+(610621,'延长县',6106,3),
+(610622,'延川县',6106,3),
+(610625,'志丹县',6106,3),
+(610626,'吴起县',6106,3),
+(610627,'甘泉县',6106,3),
+(610628,'富县',6106,3),
+(610629,'洛川县',6106,3),
+(610630,'宜川县',6106,3),
+(610631,'黄龙县',6106,3),
+(610632,'黄陵县',6106,3),
+(610681,'子长市',6106,3),
+(610702,'汉台区',6107,3),
+(610703,'南郑区',6107,3),
+(610722,'城固县',6107,3),
+(610723,'洋县',6107,3),
+(610724,'西乡县',6107,3),
+(610725,'勉县',6107,3),
+(610726,'宁强县',6107,3),
+(610727,'略阳县',6107,3),
+(610728,'镇巴县',6107,3),
+(610729,'留坝县',6107,3),
+(610730,'佛坪县',6107,3),
+(610802,'榆阳区',6108,3),
+(610803,'横山区',6108,3),
+(610822,'府谷县',6108,3),
+(610824,'靖边县',6108,3),
+(610825,'定边县',6108,3),
+(610826,'绥德县',6108,3),
+(610827,'米脂县',6108,3),
+(610828,'佳县',6108,3),
+(610829,'吴堡县',6108,3),
+(610830,'清涧县',6108,3),
+(610831,'子洲县',6108,3),
+(610881,'神木市',6108,3),
+(610902,'汉滨区',6109,3),
+(610921,'汉阴县',6109,3),
+(610922,'石泉县',6109,3),
+(610923,'宁陕县',6109,3),
+(610924,'紫阳县',6109,3),
+(610925,'岚皋县',6109,3),
+(610926,'平利县',6109,3),
+(610927,'镇坪县',6109,3),
+(610928,'旬阳县',6109,3),
+(610929,'白河县',6109,3),
+(611002,'商州区',6110,3),
+(611021,'洛南县',6110,3),
+(611022,'丹凤县',6110,3),
+(611023,'商南县',6110,3),
+(611024,'山阳县',6110,3),
+(611025,'镇安县',6110,3),
+(611026,'柞水县',6110,3),
+(620102,'城关区',6201,3),
+(620103,'七里河区',6201,3),
+(620104,'西固区',6201,3),
+(620105,'安宁区',6201,3),
+(620111,'红古区',6201,3),
+(620121,'永登县',6201,3),
+(620122,'皋兰县',6201,3),
+(620123,'榆中县',6201,3),
+(620171,'兰州新区',6201,3),
+(620201,'嘉峪关市',6202,3),
+(620302,'金川区',6203,3),
+(620321,'永昌县',6203,3),
+(620402,'白银区',6204,3),
+(620403,'平川区',6204,3),
+(620421,'靖远县',6204,3),
+(620422,'会宁县',6204,3),
+(620423,'景泰县',6204,3),
+(620502,'秦州区',6205,3),
+(620503,'麦积区',6205,3),
+(620521,'清水县',6205,3),
+(620522,'秦安县',6205,3),
+(620523,'甘谷县',6205,3),
+(620524,'武山县',6205,3),
+(620525,'张家川回族自治县',6205,3),
+(620602,'凉州区',6206,3),
+(620621,'民勤县',6206,3),
+(620622,'古浪县',6206,3),
+(620623,'天祝藏族自治县',6206,3),
+(620702,'甘州区',6207,3),
+(620721,'肃南裕固族自治县',6207,3),
+(620722,'民乐县',6207,3),
+(620723,'临泽县',6207,3),
+(620724,'高台县',6207,3),
+(620725,'山丹县',6207,3),
+(620802,'崆峒区',6208,3),
+(620821,'泾川县',6208,3),
+(620822,'灵台县',6208,3),
+(620823,'崇信县',6208,3),
+(620825,'庄浪县',6208,3),
+(620826,'静宁县',6208,3),
+(620881,'华亭市',6208,3),
+(620902,'肃州区',6209,3),
+(620921,'金塔县',6209,3),
+(620922,'瓜州县',6209,3),
+(620923,'肃北蒙古族自治县',6209,3),
+(620924,'阿克塞哈萨克族自治县',6209,3),
+(620981,'玉门市',6209,3),
+(620982,'敦煌市',6209,3),
+(621002,'西峰区',6210,3),
+(621021,'庆城县',6210,3),
+(621022,'环县',6210,3),
+(621023,'华池县',6210,3),
+(621024,'合水县',6210,3),
+(621025,'正宁县',6210,3),
+(621026,'宁县',6210,3),
+(621027,'镇原县',6210,3),
+(621102,'安定区',6211,3),
+(621121,'通渭县',6211,3),
+(621122,'陇西县',6211,3),
+(621123,'渭源县',6211,3),
+(621124,'临洮县',6211,3),
+(621125,'漳县',6211,3),
+(621126,'岷县',6211,3),
+(621202,'武都区',6212,3),
+(621221,'成县',6212,3),
+(621222,'文县',6212,3),
+(621223,'宕昌县',6212,3),
+(621224,'康县',6212,3),
+(621225,'西和县',6212,3),
+(621226,'礼县',6212,3),
+(621227,'徽县',6212,3),
+(621228,'两当县',6212,3),
+(622901,'临夏市',6229,3),
+(622921,'临夏县',6229,3),
+(622922,'康乐县',6229,3),
+(622923,'永靖县',6229,3),
+(622924,'广河县',6229,3),
+(622925,'和政县',6229,3),
+(622926,'东乡族自治县',6229,3),
+(622927,'积石山保安族东乡族撒拉族自治县',6229,3),
+(623001,'合作市',6230,3),
+(623021,'临潭县',6230,3),
+(623022,'卓尼县',6230,3),
+(623023,'舟曲县',6230,3),
+(623024,'迭部县',6230,3),
+(623025,'玛曲县',6230,3),
+(623026,'碌曲县',6230,3),
+(623027,'夏河县',6230,3),
+(630102,'城东区',6301,3),
+(630103,'城中区',6301,3),
+(630104,'城西区',6301,3),
+(630105,'城北区',6301,3),
+(630121,'大通回族土族自治县',6301,3),
+(630122,'湟中县',6301,3),
+(630123,'湟源县',6301,3),
+(630202,'乐都区',6302,3),
+(630203,'平安区',6302,3),
+(630222,'民和回族土族自治县',6302,3),
+(630223,'互助土族自治县',6302,3),
+(630224,'化隆回族自治县',6302,3),
+(630225,'循化撒拉族自治县',6302,3),
+(632221,'门源回族自治县',6322,3),
+(632222,'祁连县',6322,3),
+(632223,'海晏县',6322,3),
+(632224,'刚察县',6322,3),
+(632321,'同仁县',6323,3),
+(632322,'尖扎县',6323,3),
+(632323,'泽库县',6323,3),
+(632324,'河南蒙古族自治县',6323,3),
+(632521,'共和县',6325,3),
+(632522,'同德县',6325,3),
+(632523,'贵德县',6325,3),
+(632524,'兴海县',6325,3),
+(632525,'贵南县',6325,3),
+(632621,'玛沁县',6326,3),
+(632622,'班玛县',6326,3),
+(632623,'甘德县',6326,3),
+(632624,'达日县',6326,3),
+(632625,'久治县',6326,3),
+(632626,'玛多县',6326,3),
+(632701,'玉树市',6327,3),
+(632722,'杂多县',6327,3),
+(632723,'称多县',6327,3),
+(632724,'治多县',6327,3),
+(632725,'囊谦县',6327,3),
+(632726,'曲麻莱县',6327,3),
+(632801,'格尔木市',6328,3),
+(632802,'德令哈市',6328,3),
+(632803,'茫崖市',6328,3),
+(632821,'乌兰县',6328,3),
+(632822,'都兰县',6328,3),
+(632823,'天峻县',6328,3),
+(632857,'大柴旦行政委员会',6328,3),
+(640104,'兴庆区',6401,3),
+(640105,'西夏区',6401,3),
+(640106,'金凤区',6401,3),
+(640121,'永宁县',6401,3),
+(640122,'贺兰县',6401,3),
+(640181,'灵武市',6401,3),
+(640202,'大武口区',6402,3),
+(640205,'惠农区',6402,3),
+(640221,'平罗县',6402,3),
+(640302,'利通区',6403,3),
+(640303,'红寺堡区',6403,3),
+(640323,'盐池县',6403,3),
+(640324,'同心县',6403,3),
+(640381,'青铜峡市',6403,3),
+(640402,'原州区',6404,3),
+(640422,'西吉县',6404,3),
+(640423,'隆德县',6404,3),
+(640424,'泾源县',6404,3),
+(640425,'彭阳县',6404,3),
+(640502,'沙坡头区',6405,3),
+(640521,'中宁县',6405,3),
+(640522,'海原县',6405,3),
+(650102,'天山区',6501,3),
+(650103,'沙依巴克区',6501,3),
+(650104,'新市区',6501,3),
+(650105,'水磨沟区',6501,3),
+(650106,'头屯河区',6501,3),
+(650107,'达坂城区',6501,3),
+(650109,'米东区',6501,3),
+(650121,'乌鲁木齐县',6501,3),
+(650202,'独山子区',6502,3),
+(650203,'克拉玛依区',6502,3),
+(650204,'白碱滩区',6502,3),
+(650205,'乌尔禾区',6502,3),
+(650402,'高昌区',6504,3),
+(650421,'鄯善县',6504,3),
+(650422,'托克逊县',6504,3),
+(650502,'伊州区',6505,3),
+(650521,'巴里坤哈萨克自治县',6505,3),
+(650522,'伊吾县',6505,3),
+(652301,'昌吉市',6523,3),
+(652302,'阜康市',6523,3),
+(652323,'呼图壁县',6523,3),
+(652324,'玛纳斯县',6523,3),
+(652325,'奇台县',6523,3),
+(652327,'吉木萨尔县',6523,3),
+(652328,'木垒哈萨克自治县',6523,3),
+(652701,'博乐市',6527,3),
+(652702,'阿拉山口市',6527,3),
+(652722,'精河县',6527,3),
+(652723,'温泉县',6527,3),
+(652801,'库尔勒市',6528,3),
+(652822,'轮台县',6528,3),
+(652823,'尉犁县',6528,3),
+(652824,'若羌县',6528,3),
+(652825,'且末县',6528,3),
+(652826,'焉耆回族自治县',6528,3),
+(652827,'和静县',6528,3),
+(652828,'和硕县',6528,3),
+(652829,'博湖县',6528,3),
+(652871,'库尔勒经济技术开发区',6528,3),
+(652901,'阿克苏市',6529,3),
+(652922,'温宿县',6529,3),
+(652923,'库车县',6529,3),
+(652924,'沙雅县',6529,3),
+(652925,'新和县',6529,3),
+(652926,'拜城县',6529,3),
+(652927,'乌什县',6529,3),
+(652928,'阿瓦提县',6529,3),
+(652929,'柯坪县',6529,3),
+(653001,'阿图什市',6530,3),
+(653022,'阿克陶县',6530,3),
+(653023,'阿合奇县',6530,3),
+(653024,'乌恰县',6530,3),
+(653101,'喀什市',6531,3),
+(653121,'疏附县',6531,3),
+(653122,'疏勒县',6531,3),
+(653123,'英吉沙县',6531,3),
+(653124,'泽普县',6531,3),
+(653125,'莎车县',6531,3),
+(653126,'叶城县',6531,3),
+(653127,'麦盖提县',6531,3),
+(653128,'岳普湖县',6531,3),
+(653129,'伽师县',6531,3),
+(653130,'巴楚县',6531,3),
+(653131,'塔什库尔干塔吉克自治县',6531,3),
+(653201,'和田市',6532,3),
+(653221,'和田县',6532,3),
+(653222,'墨玉县',6532,3),
+(653223,'皮山县',6532,3),
+(653224,'洛浦县',6532,3),
+(653225,'策勒县',6532,3),
+(653226,'于田县',6532,3),
+(653227,'民丰县',6532,3),
+(654002,'伊宁市',6540,3),
+(654003,'奎屯市',6540,3),
+(654004,'霍尔果斯市',6540,3),
+(654021,'伊宁县',6540,3),
+(654022,'察布查尔锡伯自治县',6540,3),
+(654023,'霍城县',6540,3),
+(654024,'巩留县',6540,3),
+(654025,'新源县',6540,3),
+(654026,'昭苏县',6540,3),
+(654027,'特克斯县',6540,3),
+(654028,'尼勒克县',6540,3),
+(654201,'塔城市',6542,3),
+(654202,'乌苏市',6542,3),
+(654221,'额敏县',6542,3),
+(654223,'沙湾县',6542,3),
+(654224,'托里县',6542,3),
+(654225,'裕民县',6542,3),
+(654226,'和布克赛尔蒙古自治县',6542,3),
+(654301,'阿勒泰市',6543,3),
+(654321,'布尔津县',6543,3),
+(654322,'富蕴县',6543,3),
+(654323,'福海县',6543,3),
+(654324,'哈巴河县',6543,3),
+(654325,'青河县',6543,3),
+(654326,'吉木乃县',6543,3),
+(659001,'石河子市',6590,3),
+(659002,'阿拉尔市',6590,3),
+(659003,'图木舒克市',6590,3),
+(659004,'五家渠市',6590,3),
+(659006,'铁门关市',6590,3);

+ 11 - 0
db/Dockerfile

@@ -0,0 +1,11 @@
+FROM mysql:5.7
+
+MAINTAINER opgames(opgames.cn@gmail.com)
+
+RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
+
+COPY ./0schema.sql /docker-entrypoint-initdb.d
+
+COPY ./1yami_bbc.sql /docker-entrypoint-initdb.d
+
+COPY ./2area.sql /docker-entrypoint-initdb.d

+ 2 - 0
db/orderItem添加dvy_type字段.sql

@@ -0,0 +1,2 @@
+ALTER TABLE `tz_order_item`
+	ADD COLUMN `dvy_type` tinyint(4) NULL COMMENT '单个orderItem的配送类型 1:快递 2:自提 3:无需快递 4:同城配送' after `status`

+ 4 - 0
db/默认配置.sql

@@ -0,0 +1,4 @@
+insert into `tz_sys_config`(`id`, `param_key`, `param_value`, `remark`)
+values (57, 'MX_APP_CONFIG', '{\"appId\":\"\"}', '微信开放平申请应用相关信息参数配置');
+
+insert into `tz_sys_config` (`param_key`, `param_value`, `remark`) values('SCORE_EXPIRE','{\"expireYear\":3,\"scoreExpireSwitch\":false}','积分过期规则');

+ 67 - 0
docker-compose.yml

@@ -0,0 +1,67 @@
+version: '2'
+services:
+  mall4j-mysql:
+    build:
+      context: ./db
+    environment:
+      MYSQL_ROOT_PASSWORD: root
+    restart: always
+    container_name: mall4j-mysql
+    ports:
+      - 3306:3306
+    volumes:
+      - ./mall4j-mysql:/var/lib/mysql
+    command: --lower_case_table_names=1
+
+  mall4j-redis:
+    image: redis:5.0
+    restart: always
+    container_name: mall4j-redis
+    ports:
+      - 6379:6379
+
+  mall4j-api:
+    build:
+      context: ./yami-shop-api
+    restart: always
+    container_name: mall4j-api
+    image: mall4j-api
+    ports:
+      - 8112:8112
+    depends_on:
+      - mall4j-redis
+      - mall4j-mysql
+    links:
+      - "mall4j-redis"
+      - "mall4j-mysql"
+
+  mall4j-multishop:
+    build:
+      context: ./yami-shop-multishop
+    restart: always
+    container_name: mall4j-multishop
+    image: mall4j-multishop
+    ports:
+      - 8113:8113
+    depends_on:
+      - mall4j-redis
+      - mall4j-mysql
+    links:
+      - "mall4j-redis"
+      - "mall4j-mysql"
+
+  mall4j-platform:
+    build:
+      context: ./yami-shop-platform
+    restart: always
+    container_name: mall4j-platform
+    image: mall4j-platform
+    ports:
+      - 8114:8114
+    depends_on:
+      - mall4j-redis
+      - mall4j-mysql
+    links:
+      - "mall4j-redis"
+      - "mall4j-mysql"
+

+ 214 - 0
pom.xml

@@ -0,0 +1,214 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <groupId>com.yami.shop</groupId>
+    <artifactId>yami-shop</artifactId>
+    <version>0.0.1-SNAPSHOT</version>
+    <packaging>pom</packaging>
+
+    <modules>
+        <module>yami-shop-sys</module>
+        <module>yami-shop-common</module>
+        <module>yami-shop-api</module>
+        <module>yami-shop-bean</module>
+        <module>yami-shop-service</module>
+        <module>yami-shop-security</module>
+        <module>yami-shop-discount</module>
+        <module>yami-shop-coupon</module>
+        <module>yami-shop-quartz</module>
+        <module>yami-shop-mp</module>
+        <module>yami-shop-distribution</module>
+        <module>yami-shop-groupbuy</module>
+        <module>yami-shop-seckill</module>
+        <module>yami-shop-user</module>
+		<module>yami-shop-multishop</module>
+		<module>yami-shop-platform</module>
+        <module>yami-shop-delivery</module>
+    </modules>
+
+    <properties>
+        <yami.shop.version>0.0.1-SNAPSHOT</yami.shop.version>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
+        <maven-compiler-plugin.version>3.8.1</maven-compiler-plugin.version>
+        <maven-resources-plugin.version>3.1.0</maven-resources-plugin.version>
+        <spring-boot.version>2.1.9.RELEASE</spring-boot.version>
+        <security.oauth.auto.version>2.1.9.RELEASE</security.oauth.auto.version>
+        <java.version>1.8</java.version>
+        <guava.version>28.2-jre</guava.version>
+        <hutool.version>4.6.4</hutool.version>
+        <jsoup.version>1.12.1</jsoup.version>
+        <poi.version>3.17</poi.version>
+        <qiniu.version>7.2.18</qiniu.version>
+        <weixin.version>3.9.0</weixin.version>
+        <orika.version>1.5.4</orika.version>
+        <swagger2.version>2.9.2</swagger2.version>
+        <swagger-bootstrap.version>1.9.6</swagger-bootstrap.version>
+        <aliyun-core.version>4.4.9</aliyun-core.version>
+        <alipay.version>4.8.103.ALL</alipay.version>
+        <alioss.version>3.8.1</alioss.version>
+        <mybatis-plus.version>3.2.0</mybatis-plus.version>
+        <redisson.version>3.11.4</redisson.version>
+        <kryo.version>4.0.2</kryo.version>
+    </properties>
+
+    <dependencyManagement>
+        <dependencies>
+            <dependency>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-dependencies</artifactId>
+                <version>${spring-boot.version}</version>
+                <type>pom</type>
+                <scope>import</scope>
+            </dependency>
+            <dependency>
+                <groupId>org.springframework.security.oauth.boot</groupId>
+                <artifactId>spring-security-oauth2-autoconfigure</artifactId>
+                <version>${security.oauth.auto.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>com.github.binarywang</groupId>
+                <artifactId>weixin-java-pay</artifactId>
+                <version>${weixin.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>com.github.binarywang</groupId>
+                <artifactId>weixin-java-miniapp</artifactId>
+                <version>${weixin.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>com.github.binarywang</groupId>
+                <artifactId>weixin-java-mp</artifactId>
+                <version>${weixin.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>ma.glasnost.orika</groupId>
+                <artifactId>orika-core</artifactId>
+                <version>${orika.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>io.springfox</groupId>
+                <artifactId>springfox-swagger2</artifactId>
+                <version>${swagger2.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>com.github.xiaoymin</groupId>
+                <artifactId>swagger-bootstrap-ui</artifactId>
+                <version>${swagger-bootstrap.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>com.aliyun</groupId>
+                <artifactId>aliyun-java-sdk-core</artifactId>
+                <version>${aliyun-core.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>com.alipay.sdk</groupId>
+                <artifactId>alipay-sdk-java</artifactId>
+                <version>${alipay.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>com.aliyun.oss</groupId>
+                <artifactId>aliyun-sdk-oss</artifactId>
+                <version>${alioss.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.jsoup</groupId>
+                <artifactId>jsoup</artifactId>
+                <version>${jsoup.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>com.baomidou</groupId>
+                <artifactId>mybatis-plus-boot-starter</artifactId>
+                <version>${mybatis-plus.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>com.qiniu</groupId>
+                <artifactId>qiniu-java-sdk</artifactId>
+                <version>${qiniu.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>com.google.guava</groupId>
+                <artifactId>guava</artifactId>
+                <version>${guava.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>cn.hutool</groupId>
+                <artifactId>hutool-all</artifactId>
+                <version>${hutool.version}</version>
+            </dependency>
+            <!-- 使用redisson集成分布式锁等 -->
+            <dependency>
+                <groupId>org.redisson</groupId>
+                <artifactId>redisson-spring-boot-starter</artifactId>
+                <version>${redisson.version}</version>
+            </dependency>
+            <!-- 用于序列化和反序列化-->
+            <dependency>
+                <groupId>com.esotericsoftware</groupId>
+                <artifactId>kryo</artifactId>
+                <version>${kryo.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.poi</groupId>
+                <artifactId>poi</artifactId>
+                <version>${poi.version}</version>
+            </dependency>
+        </dependencies>
+    </dependencyManagement>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.projectlombok</groupId>
+            <artifactId>lombok</artifactId>
+            <version>1.18.20</version>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-configuration-processor</artifactId>
+            <optional>true</optional>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-web</artifactId>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <version>${maven-compiler-plugin.version}</version>
+                <configuration>
+                    <source>${java.version}</source>
+                    <target>${java.version}</target>
+                    <encoding>${project.build.sourceEncoding}</encoding>
+                </configuration>
+            </plugin>
+            <plugin>
+                <artifactId>maven-resources-plugin</artifactId>
+                <version>${maven-resources-plugin.version}</version>
+                <configuration>
+                    <encoding>UTF-8</encoding>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+
+    <repositories>
+        <!-- 默认中央仓库 -->
+        <repository>
+            <id>central</id>
+            <url>https://repo.maven.apache.org/maven2</url>
+            <releases><enabled>true</enabled></releases>
+            <snapshots><enabled>false</enabled></snapshots>
+        </repository>
+        <!-- 阿里云仓库保留作为镜像 -->
+        <repository>
+            <id>aliyun</id>
+            <url>https://maven.aliyun.com/repository/public</url>
+        </repository>
+    </repositories>
+</project>

+ 15 - 0
yami-shop-api/Dockerfile

@@ -0,0 +1,15 @@
+FROM anapsix/alpine-java:8_server-jre_unlimited
+
+MAINTAINER opgames(opgames.cn@gmail.com)
+
+RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
+
+RUN mkdir -p /opt/projects/yami-b2b2c/log
+
+WORKDIR /opt/projects/yami-b2b2c
+
+ADD ./target/yami-shop-api-0.0.1-SNAPSHOT.jar ./
+
+EXPOSE 8112
+
+CMD java -jar -Xms1024m -Xmx1024m -Xss256k -XX:SurvivorRatio=8 -Dspring.profiles.active=docker yami-shop-api-0.0.1-SNAPSHOT.jar

+ 90 - 0
yami-shop-api/pom.xml

@@ -0,0 +1,90 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+	<parent>
+		<artifactId>yami-shop</artifactId>
+		<groupId>com.yami.shop</groupId>
+		<version>0.0.1-SNAPSHOT</version>
+	</parent>
+	<modelVersion>4.0.0</modelVersion>
+
+	<artifactId>yami-shop-api</artifactId>
+	<packaging>jar</packaging>
+
+	<dependencies>
+		<dependency>
+			<groupId>com.github.xiaoymin</groupId>
+			<artifactId>knife4j-spring-boot-starter</artifactId>
+			<version>2.0.4</version>
+		</dependency>
+		<dependency>
+			<groupId>com.yami.shop</groupId>
+			<artifactId>yami-shop-service</artifactId>
+			<version>${yami.shop.version}</version>
+		</dependency>
+		<dependency>
+			<groupId>com.yami.shop</groupId>
+			<artifactId>yami-shop-security-api</artifactId>
+			<version>${yami.shop.version}</version>
+		</dependency>
+		<dependency>
+			<groupId>com.yami.shop</groupId>
+			<artifactId>yami-shop-mp-api</artifactId>
+			<version>${yami.shop.version}</version>
+		</dependency>
+		<dependency>
+			<groupId>com.yami.shop</groupId>
+			<artifactId>yami-shop-discount-api</artifactId>
+			<version>${yami.shop.version}</version>
+		</dependency>
+		<dependency>
+			<groupId>com.yami.shop</groupId>
+			<artifactId>yami-shop-coupon-api</artifactId>
+			<version>${yami.shop.version}</version>
+		</dependency>
+		<dependency>
+			<groupId>com.yami.shop</groupId>
+			<artifactId>yami-shop-distribution-api</artifactId>
+			<version>${yami.shop.version}</version>
+		</dependency>
+		<dependency>
+			<groupId>com.yami.shop</groupId>
+			<artifactId>yami-shop-groupbuy-api</artifactId>
+			<version>${yami.shop.version}</version>
+		</dependency>
+		<dependency>
+			<groupId>com.yami.shop</groupId>
+			<artifactId>yami-shop-seckill-api</artifactId>
+			<version>${yami.shop.version}</version>
+		</dependency>
+		<dependency>
+			<groupId>com.yami.shop</groupId>
+			<artifactId>yami-shop-user-api</artifactId>
+			<version>${yami.shop.version}</version>
+		</dependency>
+		<dependency>
+			<groupId>com.yami.shop</groupId>
+			<artifactId>yami-shop-delivery-api</artifactId>
+			<version>${yami.shop.version}</version>
+		</dependency>
+	</dependencies>
+
+	<build>
+		<plugins>
+			<plugin>
+				<groupId>org.springframework.boot</groupId>
+				<artifactId>spring-boot-maven-plugin</artifactId>
+				<version>${spring-boot.version}</version>
+				<executions>
+					<execution>
+						<goals>
+							<goal>repackage</goal><!--可以把依赖的包都打包到生成的Jar包中-->
+						</goals>
+					</execution>
+				</executions>
+			</plugin>
+
+		</plugins>
+	</build>
+</project>

+ 35 - 0
yami-shop-api/src/main/java/com/yami/shop/api/ApiApplication.java

@@ -0,0 +1,35 @@
+/*
+ * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved.
+ *
+ * https://www.gz-yami.com/
+ *
+ * 未经允许,不可做商业用途!
+ *
+ * 版权所有,侵权必究!
+ */
+
+package com.yami.shop.api;
+
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.builder.SpringApplicationBuilder;
+import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
+import org.springframework.context.annotation.ComponentScan;
+
+/**
+ * @author lgh
+ */
+@SpringBootApplication
+@ComponentScan(basePackages = {"com.yami.shop"})
+public class ApiApplication extends SpringBootServletInitializer{
+
+	public static void main(String[] args) {
+        SpringApplication.run(ApiApplication.class, args);
+	}
+	
+	@Override
+	protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
+		return builder.sources(ApiApplication.class);
+	}
+}

+ 73 - 0
yami-shop-api/src/main/java/com/yami/shop/api/config/SwaggerConfiguration.java

@@ -0,0 +1,73 @@
+/*
+ * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved.
+ *
+ * https://www.gz-yami.com/
+ *
+ * 未经允许,不可做商业用途!
+ *
+ * 版权所有,侵权必究!
+ */
+
+package com.yami.shop.api.config;
+
+import com.github.xiaoymin.knife4j.spring.annotations.EnableKnife4j;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+import org.springframework.context.annotation.Profile;
+import springfox.documentation.builders.ApiInfoBuilder;
+import springfox.documentation.builders.ParameterBuilder;
+import springfox.documentation.builders.PathSelectors;
+import springfox.documentation.builders.RequestHandlerSelectors;
+import springfox.documentation.schema.ModelRef;
+import springfox.documentation.service.ApiInfo;
+import springfox.documentation.service.Contact;
+import springfox.documentation.service.Parameter;
+import springfox.documentation.spi.DocumentationType;
+import springfox.documentation.spring.web.plugins.Docket;
+import springfox.documentation.swagger2.annotations.EnableSwagger2;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Swagger文档,只有在测试环境才会使用
+ * @author LGH
+ */
+//@Profile("dev")
+@Configuration
+@EnableSwagger2
+@EnableKnife4j
+public class SwaggerConfiguration {
+	@Bean
+	public Docket createRestApi() {
+		ParameterBuilder t = new ParameterBuilder();
+		ParameterBuilder ticketPar = new ParameterBuilder();
+		List<Parameter> pars = new ArrayList<Parameter>();
+		ticketPar.name("authorization").description("authorization 拼接: bearer")//Token 以及Authorization 为自定义的参数,session保存的名字是哪个就可以写成那个
+				.modelRef(new ModelRef("string")).parameterType("header")
+				.required(true).build(); //header中的ticket参数非必填,传空也可以
+		t.name("t").description("时间戳")//Token 以及Authorization 为自定义的参数,session保存的名字是哪个就可以写成那个
+				.modelRef(new ModelRef("string")).parameterType("query")
+				.required(true).build(); //header中的ticket参数非必填,传空也可以
+		pars.add(t.build());
+		return new Docket(DocumentationType.SWAGGER_2)
+				.apiInfo(apiInfo())
+				.select()
+				.apis(RequestHandlerSelectors.basePackage("com.yami.shop.api.controller"))
+				.paths(PathSelectors.any())
+				.build()
+				.globalOperationParameters(pars);
+	}
+
+	 @Bean
+	 public ApiInfo apiInfo() {
+	     return new ApiInfoBuilder()
+	     .title("海马购用户端接口文档")
+	     .description("海马购用户端接口文档")
+	     .termsOfServiceUrl("")
+	     .contact(new Contact("","", ""))
+	     .version("1.0")
+	     .build();
+	 }
+}

+ 227 - 0
yami-shop-api/src/main/java/com/yami/shop/api/controller/AddrController.java

@@ -0,0 +1,227 @@
+/*
+ * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved.
+ *
+ * https://www.gz-yami.com/
+ *
+ * 未经允许,不可做商业用途!
+ *
+ * 版权所有,侵权必究!
+ */
+
+package com.yami.shop.api.controller;
+
+import java.util.Date;
+import java.util.List;
+
+import javax.validation.Valid;
+
+import cn.hutool.core.util.ObjectUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.yami.shop.common.exception.YamiShopBindException;
+import com.yami.shop.delivery.comment.model.Transport2;
+import com.yami.shop.delivery.comment.service.Transport2Service;
+import com.yami.shop.delivery.comment.service.TransportManagerService;
+import com.yami.shop.security.api.util.SecurityUtils;
+import lombok.AllArgsConstructor;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import com.yami.shop.bean.app.dto.UserAddrDto;
+import com.yami.shop.bean.app.param.AddrParam;
+import com.yami.shop.bean.model.UserAddr;
+import com.yami.shop.service.UserAddrService;
+
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiOperation;
+import ma.glasnost.orika.MapperFacade;
+
+
+@RestController
+@RequestMapping("/p/address")
+@Api(tags = "地址接口")
+@AllArgsConstructor
+public class AddrController {
+
+    @Autowired
+    private MapperFacade mapperFacade;
+    @Autowired
+    private UserAddrService userAddrService;
+
+    private final Integer MAX_USER_ADDR = 10;
+
+    private TransportManagerService transportManagerService;
+
+    @Autowired
+    private Transport2Service transport2Service;
+
+
+    /**
+     * 选择订单配送地址
+     */
+
+    @GetMapping("/list")
+    @ApiOperation(value = "用户地址列表", notes = "获取用户的所有地址信息")
+    public ResponseEntity<List<UserAddrDto>> dvyList() {
+        String userId = SecurityUtils.getUser().getUserId();
+        List<UserAddr> userAddrs = userAddrService.list(new LambdaQueryWrapper<UserAddr>().eq(UserAddr::getUserId, userId).orderByDesc(UserAddr::getCommonAddr).orderByDesc(UserAddr::getUpdateTime));
+        return ResponseEntity.ok(mapperFacade.mapAsList(userAddrs, UserAddrDto.class));
+    }
+
+    /**
+     * 新增用户订单配送地址
+     */
+    @PostMapping("/addAddr")
+    @ApiOperation(value = "新增用户地址", notes = "新增用户地址")
+    public ResponseEntity<String> addAddr(@Valid @RequestBody AddrParam addrParam) {
+        String userId = SecurityUtils.getUser().getUserId();
+
+        if (addrParam.getAddrId() != null && addrParam.getAddrId() != 0) {
+            return ResponseEntity.badRequest().body("该地址已存在");
+        }
+        int addrCount = userAddrService.count(new LambdaQueryWrapper<UserAddr>().eq(UserAddr::getUserId, userId));
+        UserAddr userAddr = mapperFacade.map(addrParam, UserAddr.class);
+
+        if (addrCount >= MAX_USER_ADDR) {
+            throw new YamiShopBindException("收货地址已达到上限,无法再新增地址");
+        } else if (addrCount == 0) {
+            userAddr.setCommonAddr(1);
+        } else {
+            userAddr.setCommonAddr(0);
+        }
+        userAddr.setUserId(userId);
+        userAddr.setStatus(1);
+        userAddr.setCreateTime(new Date());
+        userAddr.setUpdateTime(new Date());
+        userAddrService.save(userAddr);
+        if (userAddr.getCommonAddr() == 1) {
+            // 清除默认地址缓存
+            userAddrService.removeUserAddrByUserId(0L, userId);
+        }
+        return ResponseEntity.ok("添加地址成功");
+    }
+
+    /**
+     * 修改订单配送地址
+     */
+    @PutMapping("/updateAddr")
+    @ApiOperation(value = "修改用户地址", notes = "修改用户地址")
+    public ResponseEntity<String> updateAddr(@Valid @RequestBody AddrParam addrParam) {
+        String userId = SecurityUtils.getUser().getUserId();
+
+        UserAddr dbUserAddr = userAddrService.getUserAddrByUserId(addrParam.getAddrId(), userId);
+        if (dbUserAddr == null) {
+            return ResponseEntity.badRequest().body("该地址已被删除");
+        }
+
+        UserAddr userAddr = mapperFacade.map(addrParam, UserAddr.class);
+        userAddr.setUserId(userId);
+        userAddr.setUpdateTime(new Date());
+        userAddrService.updateById(userAddr);
+        // 清除当前地址缓存
+        userAddrService.removeUserAddrByUserId(addrParam.getAddrId(), userId);
+        // 清除默认地址缓存
+        userAddrService.removeUserAddrByUserId(0L, userId);
+        return ResponseEntity.ok("修改地址成功");
+    }
+
+    /**
+     * 删除订单配送地址
+     */
+    @DeleteMapping("/deleteAddr/{addrId}")
+    @ApiOperation(value = "删除订单用户地址", notes = "根据地址id,删除用户地址")
+    @ApiImplicitParam(name = "addrId", value = "地址ID", required = true, dataType = "Long")
+    public ResponseEntity<String> deleteDvy(@PathVariable("addrId") Long addrId) {
+        String userId = SecurityUtils.getUser().getUserId();
+        UserAddr userAddr = userAddrService.getUserAddrByUserId(addrId, userId);
+        if (userAddr == null) {
+            return ResponseEntity.badRequest().body("该地址已被删除");
+        }
+        if (userAddr.getCommonAddr() == 1) {
+            return ResponseEntity.badRequest().body("默认地址无法删除");
+        }
+        userAddrService.removeById(addrId);
+        userAddrService.removeUserAddrByUserId(addrId, userId);
+        return ResponseEntity.ok("删除地址成功");
+    }
+
+    /**
+     * 设置默认地址
+     */
+    @PutMapping("/defaultAddr/{addrId}")
+    @ApiOperation(value = "设置默认地址", notes = "根据地址id,设置默认地址")
+    public ResponseEntity<String> defaultAddr(@PathVariable("addrId") Long addrId) {
+        String userId = SecurityUtils.getUser().getUserId();
+
+        userAddrService.updateDefaultUserAddr(addrId, userId);
+
+        userAddrService.removeUserAddrByUserId(0L, userId);
+        // 清楚掉该用户下所有使用地址使用的缓存,否则无法删除上一次的地址
+        List<UserAddr> list = userAddrService.list(new LambdaQueryWrapper<UserAddr>().eq(UserAddr::getUserId, userId));
+        for (UserAddr userAddr : list) {
+            userAddrService.removeUserAddrByUserId(userAddr.getAddrId(), userId);
+        }
+        return ResponseEntity.ok("修改地址成功");
+    }
+
+    /**
+     * 获取地址信息订单配送地址
+     */
+    @GetMapping("/addrInfo/{addrId}")
+    @ApiOperation(value = "获取地址信息", notes = "根据地址id,获取地址信息")
+    @ApiImplicitParam(name = "addrId", value = "地址ID", required = true, dataType = "Long")
+    public ResponseEntity<UserAddrDto> addrInfo(@PathVariable("addrId") Long addrId) {
+        String userId = SecurityUtils.getUser().getUserId();
+        UserAddr userAddr = userAddrService.getUserAddrByUserId(addrId, userId);
+        if (userAddr == null) {
+            throw new YamiShopBindException("该地址已被删除");
+        }
+
+        return ResponseEntity.ok(mapperFacade.map(userAddr, UserAddrDto.class));
+    }
+
+    @GetMapping("/deliveryAmount/{shopId}/{addrId}")
+    @ApiOperation(value = "查看配送价格", notes = "根据地址id,获取地址信息")
+    @ApiImplicitParam(name = "addrId", value = "地址ID", required = true, dataType = "Long")
+    public ResponseEntity<UserAddrDto> addrInfo(@PathVariable("shopId") Long shopId, @PathVariable("addrId") Long addrId) {
+        String userId = SecurityUtils.getUser().getUserId();
+        UserAddr userAddr = userAddrService.getUserAddrByUserId(addrId, userId);
+        if (userAddr == null) {
+            throw new YamiShopBindException("该地址已被删除");
+        }
+        Transport2 transport2 = transportManagerService.calculateTransfeeStart(shopId, userAddr.getLongitude(), userAddr.getLatitude());
+
+        UserAddrDto userAddrDto = mapperFacade.map(userAddr, UserAddrDto.class);
+        userAddrDto.setDeliveryAmount(transport2.getAmount());
+        return ResponseEntity.ok(userAddrDto);
+    }
+
+
+    @RequestMapping("/transport2")
+    @ApiOperation(value = "根据坐标和收货位置获取配送模板", notes = "根据坐标和收货位置获取配送模板")
+    public ResponseEntity<Transport2> transport2(Long shopId, Long addrId, Double longitude, Double latitude) {
+        String userId = SecurityUtils.getUser().getUserId();
+        if (ObjectUtil.isNotEmpty(addrId)) {
+            UserAddr userAddr = userAddrService.getUserAddrByUserId(addrId, userId);
+            if (userAddr == null) {
+                throw new YamiShopBindException("该地址已被删除");
+            }
+            longitude = userAddr.getLongitude();
+            latitude = userAddr.getLatitude();
+        }
+        transportManagerService.calculateTransfeeStart(shopId, longitude, latitude);
+
+        Transport2 one = transport2Service.getOne(new LambdaQueryWrapper<Transport2>().orderByDesc(Transport2::getDistance).last("limit 1"));
+
+        return ResponseEntity.ok(one);
+    }
+
+}

+ 33 - 0
yami-shop-api/src/main/java/com/yami/shop/api/controller/AdvertInfoController.java

@@ -0,0 +1,33 @@
+package com.yami.shop.api.controller;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.yami.shop.bean.model.AdvertInfo;
+import com.yami.shop.service.IAdvertInfoService;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+
+
+/**
+ * @author wy
+ */
+@RestController
+@RequestMapping("/advert")
+public class AdvertInfoController {
+
+    @Resource
+    private IAdvertInfoService advertInfoService;
+
+    @ApiOperation("搜索")
+    @GetMapping("/search")
+    public ResponseEntity<IPage<AdvertInfo>> search(@RequestParam(value = "advertName", required = false) String advertName,
+                                                    @RequestParam(value = "status",required = false) Integer status,
+                                                    @RequestParam(value = "current", required = false, defaultValue = "1") Integer current,
+                                                    @RequestParam(value = "size",required = false, defaultValue = "10") Integer size) {
+        return advertInfoService.search(advertName, status, current, size);
+    }
+
+
+}

+ 51 - 0
yami-shop-api/src/main/java/com/yami/shop/api/controller/AreaController.java

@@ -0,0 +1,51 @@
+/*
+ * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved.
+ *
+ * https://www.gz-yami.com/
+ *
+ * 未经允许,不可做商业用途!
+ *
+ * 版权所有,侵权必究!
+ */
+
+package com.yami.shop.api.controller;
+
+import java.util.List;
+
+import com.yami.shop.service.AreaService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import com.yami.shop.bean.model.Area;
+
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiOperation;
+
+/**
+ *
+ * @author lgh on 2018/10/26.
+ */
+@RestController
+@RequestMapping("/p/area")
+@Api(tags="省市区接口")
+public class AreaController {
+
+    @Autowired
+    private AreaService areaService;
+
+    /**
+	 * 分页获取
+	 */
+    @GetMapping("/listByPid")
+    @ApiOperation(value="获取省市区信息", notes="根据省市区的pid获取地址信息")
+    @ApiImplicitParam(name = "pid", value = "省市区的pid(pid为0获取所有省份)", required = true, dataType = "String")
+	public ResponseEntity<List<Area>> listByPid(Long pid){
+		List<Area> list = areaService.listByPid(pid);
+		return ResponseEntity.ok(list);
+	}
+
+}

+ 83 - 0
yami-shop-api/src/main/java/com/yami/shop/api/controller/CategoryController.java

@@ -0,0 +1,83 @@
+/*
+ * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved.
+ *
+ * https://www.gz-yami.com/
+ *
+ * 未经允许,不可做商业用途!
+ *
+ * 版权所有,侵权必究!
+ */
+
+package com.yami.shop.api.controller;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import cn.hutool.core.bean.BeanUtil;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.yami.shop.bean.vo.ListCategoryForUserVO;
+import io.swagger.annotations.ApiImplicitParams;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.*;
+
+import com.yami.shop.bean.app.dto.CategoryDto;
+import com.yami.shop.bean.model.Category;
+import com.yami.shop.service.CategoryService;
+
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiOperation;
+import ma.glasnost.orika.MapperFacade;
+
+@RestController
+@RequestMapping("/category")
+@Api(tags = "分类接口")
+public class CategoryController {
+
+    @Autowired
+    private CategoryService categoryService;
+
+    @Autowired
+    private MapperFacade mapperFacade;
+
+    /**
+     * 分类信息列表接口
+     */
+    @GetMapping("/categoryInfo")
+    @ApiOperation(value = "分类信息列表", notes = "获取所有的产品分类信息,顶级分类的parentId为0,默认为顶级分类")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "parentId", value = "分类ID", required = false, dataType = "Long"),
+            @ApiImplicitParam(name = "shopId", value = "店铺id", required = false, dataType = "Long")
+    })
+
+    public ResponseEntity<IPage<CategoryDto>> categoryInfo(@RequestParam(value = "parentId", defaultValue = "0") Long parentId, @RequestParam(value = "shopId",required = false) Long shopId,
+                                                           @RequestParam(value = "current", defaultValue = "1") Integer current,
+                                                           @RequestParam(value = "size", defaultValue = "10") Integer size) {
+        IPage<Category> categories = categoryService.listByParentIdAndShopId(parentId,shopId, current, size);
+//        List<CategoryDto> categoryDtos = mapperFacade.mapAsList(categories, CategoryDto.class);
+        List<Category> records = categories.getRecords();
+        List<CategoryDto> categoryDtos = new ArrayList<>(records.size());
+        for (Category category : records) {
+            CategoryDto categoryDto = new CategoryDto();
+            BeanUtil.copyProperties(category, categoryDto);
+            categoryDtos.add(categoryDto);
+        }
+        Page res = new Page();
+        BeanUtils.copyProperties(categories, res);
+        res.setRecords(categoryDtos);
+        return ResponseEntity.ok(res);
+    }
+
+    /**
+     * 用户端根据商户ID查询所有分类信息
+     * */
+    @GetMapping("/listCategoryForUser/{shopId}")
+    @ApiOperation(value = "用户端根据商户ID查询所有分类信息")
+    public ResponseEntity<List<ListCategoryForUserVO>> listCategoryForUser(@PathVariable Long shopId){
+        return ResponseEntity.ok(categoryService.listCategoryForUser(shopId));
+    }
+
+}

+ 96 - 0
yami-shop-api/src/main/java/com/yami/shop/api/controller/DeliveryController.java

@@ -0,0 +1,96 @@
+/*
+ * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved.
+ *
+ * https://www.gz-yami.com/
+ *
+ * 未经允许,不可做商业用途!
+ *
+ * 版权所有,侵权必究!
+ */
+
+package com.yami.shop.api.controller;
+
+import com.google.gson.Gson;
+import com.yami.shop.bean.app.dto.DeliveryDto;
+import com.yami.shop.bean.app.dto.SimpleDeliveryDto;
+import com.yami.shop.bean.model.Delivery;
+import com.yami.shop.bean.model.Order;
+import com.yami.shop.common.exception.YamiShopBindException;
+import com.yami.shop.delivery.comment.api.paotui.PaoTuiApi;
+import com.yami.shop.delivery.comment.api.paotui.model.request.OrderDetailRequest;
+import com.yami.shop.delivery.comment.api.paotui.model.response.OrderStatusResponse;
+import com.yami.shop.security.api.util.SecurityUtils;
+import com.yami.shop.service.DeliveryService;
+import com.yami.shop.service.OrderService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import ma.glasnost.orika.MapperFacade;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+@Slf4j
+@RestController
+@RequestMapping("/p/delivery")
+@Api(tags = "查看物流接口")
+public class DeliveryController {
+
+    @Autowired
+    private DeliveryService deliveryService;
+    @Autowired
+    private OrderService orderService;
+    @Autowired
+    private MapperFacade mapperFacade;
+
+    @Autowired
+    private PaoTuiApi paoTuiApi;
+
+    /**
+     * 查看物流接口
+     */
+    @GetMapping("/check")
+    @ApiOperation(value = "查看物流", notes = "根据订单号查看物流")
+    @ApiImplicitParam(name = "orderNumber", value = "订单号", required = true, dataType = "String")
+    public ResponseEntity<OrderStatusResponse> checkDelivery(String orderNumber) {
+        // 获取用户id
+        String userId = SecurityUtils.getUser().getUserId();
+        // 查询订单
+        Order order = orderService.getOrderByOrderNumberAndUserId(orderNumber, userId, true);
+        // 查询交易单
+        Delivery delivery = deliveryService.getById(order.getDvyId());
+        if (null == delivery) {
+            throw new YamiShopBindException("交易单号不存在");
+        }
+        // 查询物流详情信息
+        // 物流公司名称、官网、订单号、物流详情信息
+        OrderStatusResponse orderStatusResponse = null;
+        try {
+            // 解析的物流详情明细
+            OrderDetailRequest orderDetailRequest = new OrderDetailRequest();
+            orderDetailRequest.setOrder_id(order.getDvyFlowId());
+            orderStatusResponse = paoTuiApi.deliveryRoute(orderDetailRequest);
+
+        } catch (Exception e) {
+            e.printStackTrace();
+            log.error("物流详情查询出错  => {}", e);
+            throw new YamiShopBindException("查询出错");
+        }
+        return ResponseEntity.ok(orderStatusResponse);
+    }
+
+    @GetMapping("/list")
+    @ApiOperation(value = "查看物流列表", notes = "查看物流列表")
+    public ResponseEntity<List<SimpleDeliveryDto>> checkDelivery() {
+        List<Delivery> list = deliveryService.list();
+        List<SimpleDeliveryDto> deliveryDtos = mapperFacade.mapAsList(list, SimpleDeliveryDto.class);
+        return ResponseEntity.ok(deliveryDtos);
+    }
+
+
+}

+ 58 - 0
yami-shop-api/src/main/java/com/yami/shop/api/controller/DeliveryNoticeController.java

@@ -0,0 +1,58 @@
+package com.yami.shop.api.controller;
+
+import com.yami.shop.bean.app.dto.SimpleDeliveryDto;
+import com.yami.shop.bean.app.param.OrderRefundParam;
+import com.yami.shop.bean.model.Delivery;
+import com.yami.shop.bean.model.Order;
+import com.yami.shop.bean.model.OrderRefund;
+import com.yami.shop.delivery.comment.api.paotui.PaoTuiApi;
+import com.yami.shop.delivery.comment.api.paotui.model.request.NoticeModel;
+import com.yami.shop.service.OrderRefundService;
+import com.yami.shop.service.OrderService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.AllArgsConstructor;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+@RestController
+@RequestMapping("/delivery/notice")
+@Api(tags = "物流通知接口")
+@AllArgsConstructor
+public class DeliveryNoticeController {
+    @Autowired
+    private OrderRefundService orderRefundService;
+
+    @Autowired
+    private OrderService orderService;
+
+
+    @GetMapping("/put")
+    @ApiOperation(value = "查看物流列表", notes = "查看物流列表")
+    public ResponseEntity<String> checkDelivery(@RequestBody NoticeModel noticeModel) {
+        Integer status = Integer.valueOf(noticeModel.getStatus());
+        if(status==70 || status== 60){
+            OrderRefundParam orderRefundParam = new OrderRefundParam();
+            orderRefundParam.setRefundType(1);
+            orderRefundParam.setOrderNumber(noticeModel.getOrigin_id());
+            orderRefundParam.setBuyerReason("超时无人接单,自动取消");
+            orderRefundParam.setIsReceiver(false);
+            orderRefundService.overTimeRefundOrder(orderRefundParam);
+        }else if(status==50){
+            Order orderByOrderNumber = orderService.getOrderByOrderNumber(noticeModel.getOrigin_id());
+            if(orderByOrderNumber!=null){
+                orderByOrderNumber.setStatus(4);
+                orderService.updateById(orderByOrderNumber);
+            }
+        }
+        return ResponseEntity.ok("回调消息");
+    }
+
+
+}

+ 58 - 0
yami-shop-api/src/main/java/com/yami/shop/api/controller/FileController.java

@@ -0,0 +1,58 @@
+/*
+ * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved.
+ *
+ * https://www.gz-yami.com/
+ *
+ * 未经允许,不可做商业用途!
+ *
+ * 版权所有,侵权必究!
+ */
+
+package com.yami.shop.api.controller;
+
+import com.yami.shop.bean.app.dto.ResourcesInfoDto;
+import com.yami.shop.config.ShopConfig;
+import com.yami.shop.service.AttachFileService;
+import io.swagger.annotations.ApiOperation;
+import lombok.AllArgsConstructor;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.IOException;
+
+/**
+ * 文件上传 controller
+ * @author lgh
+ *
+ */
+
+@RestController
+@RequestMapping("/p/file")
+@AllArgsConstructor
+public class FileController {
+
+	private AttachFileService attachFileService;
+
+	private ShopConfig shopConfig;
+
+	@PostMapping("/upload")
+    @ApiOperation(value = "文件上传接口", notes = "上传文件,返回文件路径与域名")
+	public ResponseEntity<ResourcesInfoDto> uploadFile(@RequestParam("file") MultipartFile file) throws IOException{
+		if(file.isEmpty()){
+            return ResponseEntity.noContent().build();
+        }
+
+		String fileName = attachFileService.uploadFile(file.getBytes(),file.getOriginalFilename());
+
+		String resourcesUrl = shopConfig.getDomain().getResourcesDomainName() + "/";
+
+		ResourcesInfoDto resourcesInfoDto = new ResourcesInfoDto();
+		resourcesInfoDto.setResourcesUrl(resourcesUrl);
+		resourcesInfoDto.setFilePath(fileName);
+		return ResponseEntity.ok(resourcesInfoDto);
+	}
+}

+ 47 - 0
yami-shop-api/src/main/java/com/yami/shop/api/controller/IndexImgController.java

@@ -0,0 +1,47 @@
+/*
+ * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved.
+ *
+ * https://www.gz-yami.com/
+ *
+ * 未经允许,不可做商业用途!
+ *
+ * 版权所有,侵权必究!
+ */
+
+package com.yami.shop.api.controller;
+
+import com.yami.shop.bean.app.dto.IndexImgDto;
+import com.yami.shop.bean.model.IndexImg;
+import com.yami.shop.service.IndexImgService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import ma.glasnost.orika.MapperFacade;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+@RestController
+@Api(tags = "首页轮播图接口")
+public class IndexImgController {
+    @Autowired
+    private MapperFacade mapperFacade;
+
+    @Autowired
+    private IndexImgService indexImgService;
+
+    /**
+     * 首页轮播图接口
+     */
+    @GetMapping("/indexImgs/{shopId}")
+    @ApiOperation(value = "首页轮播图", notes = "获取首页轮播图列表信息")
+    public ResponseEntity<List<IndexImgDto>> indexImgs(@PathVariable("shopId") Long shopId,@RequestParam(required = false,defaultValue = "0") Integer imgType) {
+        List<IndexImg> indexImgList = indexImgService.listIndexImgsByShopId(shopId,imgType);
+        List<IndexImgDto> indexImgDtos = mapperFacade.mapAsList(indexImgList, IndexImgDto.class);
+        return ResponseEntity.ok(indexImgDtos);
+    }
+}

+ 36 - 0
yami-shop-api/src/main/java/com/yami/shop/api/controller/KeywordController.java

@@ -0,0 +1,36 @@
+package com.yami.shop.api.controller;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.yami.shop.bean.model.Keyword;
+import com.yami.shop.service.IKeywordService;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.http.ResponseEntity;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import java.time.LocalDateTime;
+import java.util.List;
+import java.util.Objects;
+
+/**
+ * @author wy
+ */
+@Controller
+@RequestMapping("/keyword")
+public class KeywordController {
+
+    @Resource
+    private IKeywordService keywordService;
+
+    @ApiOperation("获取关键词类型下关键词")
+    @GetMapping("/list")
+    public ResponseEntity<List<Keyword>> list(@RequestParam(value = "type", required = false) Integer type) {
+        LocalDateTime now = LocalDateTime.now();
+        List<Keyword> list = keywordService.list(new LambdaQueryWrapper<Keyword>()
+                .eq(Objects.nonNull(type), Keyword::getType, type)
+                .ge(Keyword::getDeadTime, now));
+        return ResponseEntity.ok(list);
+    }
+
+}

+ 353 - 0
yami-shop-api/src/main/java/com/yami/shop/api/controller/MyOrderController.java

@@ -0,0 +1,353 @@
+/*
+ * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved.
+ *
+ * https://www.gz-yami.com/
+ *
+ * 未经允许,不可做商业用途!
+ *
+ * 版权所有,侵权必究!
+ */
+
+package com.yami.shop.api.controller;
+
+import cn.hutool.core.collection.CollectionUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.yami.shop.bean.app.dto.*;
+import com.yami.shop.bean.enums.OrderStatus;
+import com.yami.shop.bean.enums.RefundStatusEnum;
+import com.yami.shop.bean.enums.RefundType;
+import com.yami.shop.bean.model.*;
+import com.yami.shop.common.config.Constant;
+import com.yami.shop.common.exception.YamiShopBindException;
+import com.yami.shop.common.util.Arith;
+import com.yami.shop.common.util.PageParam;
+import com.yami.shop.config.ShopConfig;
+import com.yami.shop.security.api.util.SecurityUtils;
+import com.yami.shop.service.*;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import lombok.AllArgsConstructor;
+import ma.glasnost.orika.MapperFacade;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.Collections;
+import java.util.List;
+import java.util.Objects;
+
+@RestController
+@RequestMapping("/p/myOrder")
+@Api(tags = "我的订单接口")
+@AllArgsConstructor
+public class MyOrderController {
+
+    private final OrderService orderService;
+
+    private final MapperFacade mapperFacade;
+
+    private final UserAddrOrderService userAddrOrderService;
+
+    private final ProductService productService;
+
+    private final SkuService skuService;
+
+    private final ShopConfig shopConfig;
+
+    private final MyOrderService myOrderService;
+
+    private final ShopDetailService shopDetailService;
+
+    private final OrderItemService orderItemService;
+
+    private final OrderRefundService orderRefundService;
+
+
+    /**
+     * 订单详情信息接口
+     */
+    @GetMapping("/orderDetail")
+    @ApiOperation(value = "订单详情信息", notes = "根据订单号获取订单详情信息")
+    @ApiImplicitParam(name = "orderNumber", value = "订单号", required = true, dataType = "String")
+    public ResponseEntity<OrderShopDto> orderDetail(@RequestParam(value = "orderNumber", required = true) String orderNumber) {
+
+        String userId = SecurityUtils.getUser().getUserId();
+//        String userId = "1";
+        OrderShopDto orderShopDto = new OrderShopDto();
+
+        Order order = orderService.getOrderByOrderNumberAndUserId(orderNumber, userId, true);
+        ShopDetail shopDetail;
+        if(Objects.equals(order.getShopId(),Constant.PLATFORM_SHOP_ID)){
+            shopDetail = new ShopDetail();
+            shopDetail.setShopName(Constant.PLATFORM_SHOP_NAME);
+        }else {
+            shopDetail = shopDetailService.getShopDetailByShopId(order.getShopId());
+        }
+        UserAddrOrder userAddrOrder = userAddrOrderService.getById(order.getAddrOrderId());
+
+        UserAddrDto userAddrDto = mapperFacade.map(userAddrOrder, UserAddrDto.class);
+        List<OrderItem> orderItems = orderItemService.getOrderItemsByOrderNumber(orderNumber);
+
+        //计算订单使用积分
+        Integer score = 0;
+        for (OrderItem orderItem:orderItems){
+            score += orderItem.getUseScore();
+        }
+
+        List<OrderItemDto> orderItemDtoList = mapperFacade.mapAsList(orderItems, OrderItemDto.class);
+        orderShopDto.setOrderScore(score);
+        orderShopDto.setShopId(shopDetail.getShopId());
+        orderShopDto.setDvyType(order.getDvyType());
+        orderShopDto.setShopName(shopDetail.getShopName());
+        orderShopDto.setActualTotal(order.getActualTotal());
+        orderShopDto.setUserAddrDto(userAddrDto);
+        orderShopDto.setPayType(order.getPayType());
+        orderShopDto.setTransfee(order.getFreightAmount());
+//        Math.abs
+        orderShopDto.setReduceAmount( Math.abs(order.getReduceAmount()));
+        orderShopDto.setCreateTime(order.getCreateTime());
+        orderShopDto.setRemarks(order.getRemarks());
+        orderShopDto.setOrderType(order.getOrderType());
+        orderShopDto.setStatus(order.getStatus());
+        // 付款时间
+        orderShopDto.setPayTime(order.getPayTime());
+        // 发货时间
+        orderShopDto.setDvyTime(order.getDvyTime());
+        // 完成时间
+        orderShopDto.setFianllyTime(order.getFinallyTime());
+        // 取消时间
+        orderShopDto.setCancelTime(order.getCancelTime());
+        // 更新时间
+        orderShopDto.setUpdateTime(order.getUpdateTime());
+
+
+
+
+        List<OrderRefund> orderRefunds = orderRefundService.getProcessingOrderRefundByOrderId(order.getOrderId());
+
+        // 可以退款的状态,并在退款时间内
+        if (order.getStatus() > OrderStatus.UNPAY.value() && order.getStatus() < OrderStatus.CLOSE.value() && orderRefundService.checkRefundDate(order) ) {
+            orderShopDto.setCanRefund(true);
+            // 有没有正在退款中的订单
+            if (CollectionUtil.isEmpty(orderRefunds)) {
+                orderShopDto.setCanAllRefund(true);
+            }
+        }
+
+        for (OrderRefund orderRefund : orderRefunds) {
+
+            // 整单退款
+            if (Objects.equals(RefundType.ALL.value(),orderRefund.getRefundType())) {
+                orderShopDto.setCanRefund(false);
+                // 统一的退款单号
+                for (OrderItemDto orderItemDto : orderItemDtoList) {
+                    orderItemDto.setRefundSn(orderRefund.getRefundSn());
+                }
+                break;
+            }
+            // 单项退款,每个单号都不一样
+            for (OrderItemDto orderItemDto : orderItemDtoList) {
+                if (Objects.equals(orderItemDto.getOrderItemId(), orderRefund.getOrderItemId())) {
+                    orderItemDto.setRefundSn(orderRefund.getRefundSn());
+                }
+            }
+
+        }
+
+        orderShopDto.setOrderItemDtos(orderItemDtoList);
+        double total = 0.0;
+        Integer totalNum = 0;
+        for (OrderItemDto orderItem : orderShopDto.getOrderItemDtos()) {
+            total = Arith.add(total, orderItem.getProductTotalAmount());
+            totalNum += orderItem.getProdCount();
+        }
+        orderShopDto.setTotal(total);
+        orderShopDto.setTotalNum(totalNum);
+
+        return ResponseEntity.ok(orderShopDto);
+    }
+
+
+    /**
+     * 订单列表接口
+     */
+    @GetMapping("/myOrder")
+    @ApiOperation(value = "订单列表信息", notes = "根据订单状态获取订单列表信息,状态为0时获取所有订单")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "status", value = "订单状态 1:待付款 2:待发货 3:待收货 4:待评价 5:成功 6:失败", required = false, dataType = "Integer"),
+    })
+    public ResponseEntity<IPage<MyOrderDto>> myOrder(@RequestParam(value = "status") Integer status,PageParam<MyOrderDto> page) {
+
+        String userId = SecurityUtils.getUser().getUserId();
+        IPage<MyOrderDto> myOrderDtoIpage = myOrderService.pageMyOrderByUserIdAndStatus(page, userId, status);
+        return ResponseEntity.ok(myOrderDtoIpage);
+    }
+
+    /**
+     * 获取订单项信息
+     */
+    @GetMapping("/getOrderItem")
+    public ResponseEntity<OrderItem> getOrderItem(@RequestParam(value = "orderItemId") Long orderItemId) {
+        String imgDomainName = shopConfig.getDomain().getResourcesDomainName();
+        OrderItem orderItem = orderItemService.getById(orderItemId);
+        orderItem.setPic(orderItem.getPic() !=null ? imgDomainName + "/" + orderItem.getPic() :null);
+        return ResponseEntity.ok(orderItem);
+    }
+
+    /**
+     * 获取订单项信息
+     */
+    @GetMapping("/getOrderItems")
+    public ResponseEntity<List<OrderItem>> getOrderItems(@RequestParam(value = "orderNumber") Long orderNumber) {
+        String imgDomainName = shopConfig.getDomain().getResourcesDomainName();
+        List<OrderItem> orderItems = orderItemService.list(new LambdaQueryWrapper<OrderItem>().eq(OrderItem::getOrderNumber, orderNumber));
+        for (OrderItem orderItem : orderItems) {
+            orderItem.setPic(orderItem.getPic() !=null ? imgDomainName + "/" + orderItem.getPic() :null);
+        }
+        return ResponseEntity.ok(orderItems);
+    }
+
+    /**
+     * 订单评价列表接口
+     */
+    @GetMapping("/myOrderComment")
+    @ApiOperation(value = "订单评价列表接口", notes = "根据订单评价状态获取订单列表信息")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "commStatus", value = "订单状态 0:待评价 1已评价", required = false, dataType = "Integer")
+    })
+    public ResponseEntity<IPage<MyOrderDto>> myOrderComment(@RequestParam(value = "commStatus") Integer commStatus,PageParam<MyOrderDto> page) {
+        String userId = SecurityUtils.getUser().getUserId();
+        IPage<MyOrderDto> myOrderDtoIpage = myOrderService.myOrderComment(page, userId,commStatus);
+        return ResponseEntity.ok(myOrderDtoIpage);
+    }
+
+    /**
+     * 订单项评价列表接口
+     */
+    @GetMapping("/myOrderItemsComment")
+    @ApiOperation(value = "订单项评价列表接口", notes = "根据订单评价状态获取订单列表信息")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "commStatus", value = "订单状态 0:待评价 1已评价", required = false, dataType = "Integer")
+    })
+    public ResponseEntity<IPage<MyOrderItemDto>> myOrderItemsComment(@RequestParam(value = "commStatus") Integer commStatus, PageParam<MyOrderItemDto> page) {
+        String userId = SecurityUtils.getUser().getUserId();
+        IPage<MyOrderItemDto> myOrderDtoIpage = myOrderService.myOrderItemsComment(page, userId,commStatus);
+        return ResponseEntity.ok(myOrderDtoIpage);
+    }
+
+    /**
+     * 订单列表查询接口
+     */
+    @GetMapping("/myOrderSearch")
+    @ApiOperation(value = "订单列表信息查询", notes = "根据订单编号或者订单中商品名称搜索")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "status", value = "订单状态 1:待付款 2:待发货 3:待收货 4:待评价 5:成功 6:失败", required = false, dataType = "Integer"),
+            @ApiImplicitParam(name = "orderName",value = "订单编号或者订单中商品名称", required = false,dataType = "String"),
+            @ApiImplicitParam(name = "orderTimeStatus",value = "0全部订单 1最近七天 2最近三个月 3三个月之前 订单", required = false,dataType = "Integer"),
+            @ApiImplicitParam(name = "orderType",value = "0全部订单 1拼团订单 2秒杀订单 3普通订单", required = false,dataType = "Integer"),
+            @ApiImplicitParam(name = "orderNumber",value = "订单编号", required = false,dataType = "String")
+    })
+    public ResponseEntity<IPage<MyOrderDto>> myOrderSearch(@RequestParam(value = "status") Integer status,
+                                                           @RequestParam(value = "orderName") String orderName,
+                                                           @RequestParam(value = "orderTimeStatus") Integer orderTimeStatus,
+                                                           @RequestParam(value = "orderType") Integer orderType,
+                                                           @RequestParam(value = "orderNumber") String orderNumber,
+                                                           PageParam<MyOrderDto> page) {
+        String userId = SecurityUtils.getUser().getUserId();
+        IPage<MyOrderDto> myOrderDtoIpage = myOrderService.pageMyOrderByParams(page, userId, status,orderName,orderTimeStatus,orderType,orderNumber);
+        return ResponseEntity.ok(myOrderDtoIpage);
+    }
+
+
+    /**
+     * 取消订单
+     */
+    @PutMapping("/cancel/{orderNumber}")
+    @ApiOperation(value = "根据订单号取消订单", notes = "根据订单号取消订单")
+    @ApiImplicitParam(name = "orderNumber", value = "订单号", required = true, dataType = "String")
+    public ResponseEntity<String> cancel(@PathVariable("orderNumber") String orderNumber) {
+        String userId = SecurityUtils.getUser().getUserId();
+        Order order = orderService.getOrderByOrderNumberAndUserId(orderNumber, userId, true);
+        if (!Objects.equals(order.getStatus(), OrderStatus.UNPAY.value())) {
+            throw new YamiShopBindException("订单已支付,无法取消订单");
+        }
+
+        List<OrderItem> orderItems = orderItemService.getOrderItemsByOrderNumber(orderNumber);
+        order.setOrderItems(orderItems);
+        // 取消订单
+        orderService.cancelOrders(Collections.singletonList(order));
+        // 清除缓存
+        for (OrderItem orderItem : orderItems) {
+            productService.removeProductCacheByProdId(orderItem.getProdId());
+            skuService.removeSkuCacheBySkuId(orderItem.getSkuId(), orderItem.getProdId());
+        }
+        return ResponseEntity.ok().build();
+    }
+
+
+    /**
+     * 确认收货
+     */
+    @PutMapping("/receipt/{orderNumber}")
+    @ApiOperation(value = "根据订单号确认收货", notes = "根据订单号确认收货")
+    public ResponseEntity<String> receipt(@PathVariable("orderNumber") String orderNumber) {
+        String userId = SecurityUtils.getUser().getUserId();
+        Order order = orderService.getOrderByOrderNumberAndUserId(orderNumber, userId, true);
+
+        if (!Objects.equals(order.getStatus(), OrderStatus.CONSIGNMENT.value())) {
+            throw new YamiShopBindException("订单未发货,无法确认收货");
+        }
+        if (Objects.equals(order.getRefundStatus(), RefundStatusEnum.APPLY.value())) {
+            throw new YamiShopBindException("订单退款中,无法确认收货");
+        }
+        List<OrderItem> orderItems = orderItemService.getOrderItemsByOrderNumber(orderNumber);
+        order.setOrderItems(orderItems);
+        // 确认收货
+        orderService.receiptOrder(Collections.singletonList(order));
+
+        for (OrderItem orderItem : orderItems) {
+            productService.removeProductCacheByProdId(orderItem.getProdId());
+            skuService.removeSkuCacheBySkuId(orderItem.getSkuId(), orderItem.getProdId());
+        }
+        return ResponseEntity.ok().build();
+    }
+
+    /**
+     * 删除订单
+     */
+    @DeleteMapping("/{orderNumber}")
+    @ApiOperation(value = "根据订单号删除订单", notes = "根据订单号删除订单")
+    @ApiImplicitParam(name = "orderNumber", value = "订单号", required = true, dataType = "String")
+    public ResponseEntity<String> delete(@PathVariable("orderNumber") String orderNumber) {
+        String userId = SecurityUtils.getUser().getUserId();
+
+        Order order = orderService.getOrderByOrderNumberAndUserId(orderNumber, userId, true);
+
+        if (!Objects.equals(order.getStatus(), OrderStatus.SUCCESS.value()) && !Objects.equals(order.getStatus(), OrderStatus.CLOSE.value()) ) {
+            throw new YamiShopBindException("订单未完成或未关闭,无法删除订单");
+        }
+
+        // 删除订单
+        orderService.deleteOrders(Collections.singletonList(order));
+
+        return ResponseEntity.ok("删除成功");
+    }
+
+
+
+
+//    /**
+//     * 获取我的订单订单数量
+//     */
+//    @GetMapping("/orderCount")
+//    @ApiOperation(value = "获取我的订单订单数量", notes = "获取我的订单订单数量")
+//    public ResponseEntity<OrderCountData> getOrderCount() {
+//        String userId = SecurityUtils.getUser().getUserId();
+//        OrderCountData orderCountMap = orderService.getOrderCount(userId);
+//        return ResponseEntity.ok(orderCountMap);
+//    }
+
+
+}

+ 152 - 0
yami-shop-api/src/main/java/com/yami/shop/api/controller/MyShopDetailController.java

@@ -0,0 +1,152 @@
+/*
+ * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved.
+ *
+ * https://www.gz-yami.com/
+ *
+ * 未经允许,不可做商业用途!
+ *
+ * 版权所有,侵权必究!
+ */
+
+package com.yami.shop.api.controller;
+
+import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.google.common.collect.Maps;
+import com.yami.shop.bean.app.param.SendSmsParam;
+import com.yami.shop.bean.dto.ShopDetailDto;
+import com.yami.shop.bean.param.ShopDetailParam;
+import com.yami.shop.bean.enums.SmsType;
+import com.yami.shop.bean.model.ShopAuditing;
+import com.yami.shop.bean.model.ShopDetail;
+import com.yami.shop.common.exception.YamiShopBindException;
+import com.yami.shop.security.api.util.SecurityUtils;
+import com.yami.shop.security.comment.model.UpdatePasswordDto;
+import com.yami.shop.security.comment.model.UsernameAndPasswordDto;
+import com.yami.shop.service.*;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.AllArgsConstructor;
+import ma.glasnost.orika.MapperFacade;
+import org.springframework.http.ResponseEntity;
+import org.springframework.security.crypto.password.PasswordEncoder;
+import org.springframework.web.bind.annotation.*;
+
+import javax.validation.Valid;
+import java.util.Objects;
+
+
+/**
+ *
+ * @author lgh on 2018/08/29.
+ */
+@RestController
+@RequestMapping("/p/shop")
+@Api(tags = "店铺相关接口")
+@AllArgsConstructor
+public class MyShopDetailController {
+
+    private final ShopDetailService shopDetailService;
+
+	private final PasswordEncoder passwordEncoder;
+
+	private final ShopAuditingService shopAuditingService;
+
+	private final MapperFacade mapperFacade;
+
+	private SmsLogService smsLogService;
+
+	@PostMapping("/apply")
+	@ApiOperation(value = "申请店铺")
+	public ResponseEntity<Void> apply(@Valid @RequestBody ShopDetailParam shopDetailParam) {
+		String userId = SecurityUtils.getUser().getUserId();
+		shopDetailService.applyShop(userId,shopDetailParam);
+		return ResponseEntity.ok().build();
+	}
+
+	@PostMapping("/saveUsernameAndPassword")
+	@ApiOperation(value = "保存店铺账号密码")
+	public ResponseEntity<Void> saveUsernameAndPassword(@Valid @RequestBody UsernameAndPasswordDto usernameAndPasswordDto) {
+		String userId = SecurityUtils.getUser().getUserId();
+
+		ShopDetail shopDetail = shopDetailService.getShopDetailByUserId(userId);
+
+        if (shopDetail == null) {
+            throw new YamiShopBindException("请先进行开店申请");
+        }
+
+        if (StrUtil.isNotBlank(shopDetail.getMobile())) {
+            throw new YamiShopBindException("店铺账号已设置不能修改");
+        }
+
+
+        ShopDetail dbUsernameUser = shopDetailService.getShopByMobile(usernameAndPasswordDto.getUsername());
+        if (dbUsernameUser != null) {
+            throw new YamiShopBindException("该账号已经开通过店铺,无法重复开通");
+        }
+
+        if (!smsLogService.checkValidCode(usernameAndPasswordDto.getUsername(), usernameAndPasswordDto.getCode(), SmsType.VALID)){
+            throw new YamiShopBindException("验证码有误或已过期");
+        }
+
+        String password = passwordEncoder.encode(usernameAndPasswordDto.getPassword());
+		shopDetail.setPassword(password);
+		shopDetail.setMobile(usernameAndPasswordDto.getUsername());
+		shopDetail.setPassword(password);
+		shopDetailService.updateById(shopDetail);
+		shopDetailService.removeShopDetailCacheByShopId(shopDetail.getShopId());
+		return ResponseEntity.ok().build();
+	}
+
+
+
+	@PostMapping("/updatePassword")
+	@ApiOperation(value = "更新店铺密码")
+	public ResponseEntity<Void> updatePassword(@Valid @RequestBody UpdatePasswordDto updatePasswordDto) {
+		String userId = SecurityUtils.getUser().getUserId();
+
+		ShopDetail shopDetail = shopDetailService.getShopDetailByUserId(userId);
+		if (shopDetail == null) {
+			throw new YamiShopBindException("请先进行开店申请");
+		}
+
+		if (!passwordEncoder.matches(updatePasswordDto.getPassword(), shopDetail.getPassword())) {
+			throw new YamiShopBindException("原密码不正确");
+		}
+		//新密码
+		String newPassword = passwordEncoder.encode(updatePasswordDto.getNewPassword());
+//		更新密码
+		shopDetailService.updatePasswordByUserName(shopDetail.getMobile(), newPassword);
+		return ResponseEntity.ok().build();
+	}
+
+
+	@GetMapping()
+	@ApiOperation(value = "获取拥有的店铺信息")
+	public ResponseEntity<ShopDetailDto> auditingDetail() {
+		ShopDetail shopDetail = shopDetailService.getShopDetailByUserId(SecurityUtils.getUser().getUserId());
+		ShopDetailDto shopDetailDto = mapperFacade.map(shopDetail, ShopDetailDto.class);
+		return ResponseEntity.ok(shopDetailDto);
+	}
+
+	@GetMapping("/shopAudit" )
+	@ApiOperation(value = "获取店铺的审核信息")
+	public ResponseEntity<ShopAuditing> getShopAuditing() {
+		ShopAuditing shopAuditing = shopAuditingService.getOne(new LambdaQueryWrapper<ShopAuditing>().eq(ShopAuditing::getUserId, SecurityUtils.getUser().getUserId()));
+		return ResponseEntity.ok(shopAuditing);
+	}
+
+	/**
+	 * 发送验证码接口
+	 */
+	@PostMapping("/sendCode")
+	@ApiOperation(value = "发送验证码")
+	public ResponseEntity<Void> sendLoginCode(@Valid @RequestBody SendSmsParam sendSmsParam) {
+		String userId = SecurityUtils.getUser().getUserId();
+		if (Objects.isNull(sendSmsParam.getMobile())){
+			throw new YamiShopBindException("手机号不能为空");
+		}
+		smsLogService.sendSms(SmsType.VALID, userId ,sendSmsParam.getMobile(), Maps.newHashMap());
+		return ResponseEntity.ok().build();
+	}
+}

+ 77 - 0
yami-shop-api/src/main/java/com/yami/shop/api/controller/NoticeController.java

@@ -0,0 +1,77 @@
+/*
+ * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved.
+ *
+ * https://www.gz-yami.com/
+ *
+ * 未经允许,不可做商业用途!
+ *
+ * 版权所有,侵权必究!
+ */
+
+package com.yami.shop.api.controller;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.fasterxml.jackson.annotation.JsonView;
+import com.yami.shop.bean.app.dto.NoticeDto;
+import com.yami.shop.bean.model.Notice;
+import com.yami.shop.common.util.PageParam;
+import com.yami.shop.service.NoticeService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import lombok.AllArgsConstructor;
+import ma.glasnost.orika.MapperFacade;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+@RestController
+@RequestMapping("/shop/notice")
+@Api(tags = "公告管理接口")
+@AllArgsConstructor
+public class NoticeController {
+
+    private NoticeService noticeService;
+
+    private MapperFacade mapperFacade;
+
+    /**
+     * 置顶公告列表接口
+     */
+    @GetMapping("/topNoticeList/{shopId}")
+    @ApiOperation(value = "置顶公告列表信息", notes = "获取所有置顶公告列表信息")
+    @JsonView(NoticeDto.NoContent.class)
+    public ResponseEntity<List<NoticeDto>> getTopNoticeListByShopId(@PathVariable Long shopId) {
+        List<Notice> noticeList = noticeService.listTopNoticeByShopId(shopId);
+        List<NoticeDto> noticeDtoList = mapperFacade.mapAsList(noticeList, NoticeDto.class);
+        return ResponseEntity.ok(noticeDtoList);
+    }
+
+    /**
+     * 获取公告详情
+     */
+    @GetMapping("/info/{id}")
+    @ApiOperation(value = "公告详情", notes = "获取公告id公告详情")
+    @JsonView(NoticeDto.WithContent.class)
+    public ResponseEntity<NoticeDto> getNoticeById(@PathVariable("id") Long id) {
+        Notice notice = noticeService.getNoticeById(id);
+        NoticeDto noticeDto = mapperFacade.map(notice, NoticeDto.class);
+        return ResponseEntity.ok(noticeDto);
+    }
+
+    /**
+     * 公告列表
+     */
+    @GetMapping("/noticeList/{shopId}")
+    @ApiOperation(value = "公告列表信息", notes = "获取所有公告列表信息")
+    @ApiImplicitParams({
+    })
+    public ResponseEntity<IPage<NoticeDto>> pageNotice(@PathVariable Long shopId, PageParam<NoticeDto> page) {
+
+        return ResponseEntity.ok(noticeService.pageNotice(page,shopId));
+    }
+}

+ 360 - 0
yami-shop-api/src/main/java/com/yami/shop/api/controller/OrderController.java

@@ -0,0 +1,360 @@
+/*
+ * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved.
+ *
+ * https://www.gz-yami.com/
+ *
+ * 未经允许,不可做商业用途!
+ *
+ * 版权所有,侵权必究!
+ */
+
+package com.yami.shop.api.controller;
+
+import java.text.SimpleDateFormat;
+import java.util.*;
+import java.util.stream.Collectors;
+
+import javax.validation.Valid;
+
+
+import cn.hutool.core.date.DateTime;
+import cn.hutool.core.date.DateUtil;
+import com.google.common.collect.Lists;
+import com.yami.shop.bean.app.dto.*;
+import com.yami.shop.bean.app.param.OrderPayInfoParam;
+import com.yami.shop.bean.event.ConfirmOrderEvent;
+import com.yami.shop.bean.event.PlatformConfirmOrderEvent;
+import com.yami.shop.bean.event.ScoreConfirmOrderEvent;
+import com.yami.shop.bean.event.SubmitSeckillOrderEvent;
+import com.yami.shop.bean.model.*;
+import com.yami.shop.common.exception.YamiShopBindException;
+import com.yami.shop.seckill.comment.service.SeckillOrderService;
+import com.yami.shop.security.api.util.SecurityUtils;
+import com.yami.shop.service.*;
+import io.swagger.annotations.ApiImplicitParam;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.ApplicationContext;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.*;
+
+import com.yami.shop.bean.app.param.OrderParam;
+import com.yami.shop.bean.app.param.OrderShopParam;
+import com.yami.shop.bean.app.param.SubmitOrderParam;
+import com.yami.shop.common.util.Arith;
+
+import cn.hutool.core.collection.CollectionUtil;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import ma.glasnost.orika.MapperFacade;
+
+@RestController
+@RequestMapping("/p/order")
+@Api(tags = "订单接口")
+public class OrderController {
+
+    @Autowired
+    private OrderService orderService;
+    @Autowired
+    private MapperFacade mapperFacade;
+    @Autowired
+    private SkuService skuService;
+    @Autowired
+    private ProductService productService;
+    @Autowired
+    private UserAddrService userAddrService;
+    @Autowired
+    private BasketService basketService;
+    @Autowired
+    private ApplicationContext applicationContext;
+    @Autowired
+    private UserAddrOrderService userAddrOrderService;
+    @Autowired
+    private IQnhService qnhService;
+
+    /**
+     * 生成订单
+     */
+    @PostMapping("/confirm")
+    @ApiOperation(value = "结算,生成订单信息", notes = "传入下单所需要的参数进行下单")
+    public ResponseEntity<ShopCartOrderMergerDto> confirm(@Valid @RequestBody OrderParam orderParam) {
+        if (orderParam.getOrderItem() == null){
+            orderParam.getBasketIds().forEach(basketId -> {
+                Basket byId = basketService.getById(basketId);
+                Sku byIdss = skuService.getById(byId);
+                boolean skuStock = qnhService.getSkuStock(byIdss.getSkuCode(), byId.getProdId());
+                Product byId1 = productService.getById(byId.getProdId());
+                byId1.setTotalStocks(byIdss.getStocks());
+                productService.updateById(byId1);
+                if (skuStock && byId1.getTotalStocks() < byId.getBasketCount()) {
+                    throw new YamiShopBindException("当前选择的规格库存不足!");
+                }
+            });
+        }else {
+            Sku byId = skuService.getById(orderParam.getOrderItem().getSkuId());
+            boolean skuStock = qnhService.getSkuStock(byId.getSkuCode(), byId.getProdId());
+            Product byId1 = productService.getById(byId.getProdId());
+            byId1.setTotalStocks(byId.getStocks());
+            productService.updateById(byId1);
+            if (skuStock && byId1.getTotalStocks() < orderParam.getOrderItem().getProdCount()) {
+                throw new YamiShopBindException("当前选择的规格库存不足!");
+            }
+        }
+        String userId = SecurityUtils.getUser().getUserId();
+        orderParam.setDvyType(1);
+
+        // 订单的地址信息
+        UserAddr userAddr = userAddrService.getUserAddrByUserId(orderParam.getAddrId(), userId);
+        UserAddrDto userAddrDto = mapperFacade.map(userAddr, UserAddrDto.class);
+        // 组装获取用户提交的购物车商品项
+        List<ShopCartItemDto> shopCartItems = basketService.getShopCartItemsByOrderItems(orderParam.getBasketIds(), orderParam.getOrderItem(), userId);
+        if (CollectionUtil.isEmpty(shopCartItems)) {
+            throw new YamiShopBindException("请选择您需要的商品加入购物车");
+        }
+
+        // 根据店铺组装购车中的商品信息,返回每个店铺中的购物车商品信息
+        List<ShopCartDto> shopCarts = basketService.getShopCarts(shopCartItems,0L);
+
+        // 将要返回给前端的完整的订单信息
+        ShopCartOrderMergerDto shopCartOrderMergerDto = new ShopCartOrderMergerDto();
+        shopCartOrderMergerDto.setDvyType(orderParam.getDvyType());
+        shopCartOrderMergerDto.setUserAddr(userAddrDto);
+        shopCartOrderMergerDto.setIsScorePay(orderParam.getIsScorePay());
+        // 所有店铺的订单信息
+        List<ShopCartOrderDto> shopCartOrders = new ArrayList<>();
+
+        double actualTotal = 0.0;
+        double total = 0.0;
+        int totalCount = 0;
+        double allOrderReduce = 0.0;
+        double totalTransfee = 0.0;
+        double weight = 0.0;
+
+        // 所有店铺所有的商品item
+        List<ShopCartItemDto> allCartItem = new ArrayList<>();
+
+//        List<CouponOrderDto> coupons = new ArrayList<>();
+        for (ShopCartDto shopCart : shopCarts) {
+
+            // 每个店铺的订单信息
+            ShopCartOrderDto shopCartOrder = new ShopCartOrderDto();
+            shopCartOrder.setShopId(shopCart.getShopId());
+            shopCartOrder.setShopName(shopCart.getShopName());
+
+
+            List<ShopCartItemDiscountDto> shopCartItemDiscounts = shopCart.getShopCartItemDiscounts();
+
+            // 店铺中的所有商品项信息
+            List<ShopCartItemDto> shopAllShopCartItems = new ArrayList<>();
+            for (ShopCartItemDiscountDto shopCartItemDiscount : shopCartItemDiscounts) {
+                List<ShopCartItemDto> discountShopCartItems = shopCartItemDiscount.getShopCartItems();
+                shopAllShopCartItems.addAll(discountShopCartItems);
+            }
+
+            shopCartOrder.setShopCartItemDiscounts(shopCartItemDiscounts);
+            allCartItem.addAll(shopAllShopCartItems);
+
+            applicationContext.publishEvent(new ConfirmOrderEvent(shopCartOrder, orderParam, shopAllShopCartItems));
+
+            total = Arith.add(total, shopCartOrder.getTotal());
+            totalCount = totalCount + shopCartOrder.getTotalCount();
+            allOrderReduce = Arith.add(allOrderReduce, shopCartOrder.getShopReduce());
+
+            totalTransfee = Arith.add(totalTransfee, shopCartOrder.getTransfee());
+            weight = Arith.add(weight, shopCartOrder.getTotalWeight());
+            shopCartOrders.add(shopCartOrder);
+        }
+
+        //根据价格进行店铺、满减、商品项的价格升序操作
+        for (int n = 0; n < shopCartOrders.size(); n++) {
+            shopCartOrders = shopCartOrders.stream().sorted(Comparator.comparing(ShopCartOrderDto::getActualTotal)).collect(Collectors.toList());
+            ShopCartOrderDto shopCartOrderDto = shopCartOrders.get(n);
+
+            List<ShopCartItemDiscountDto> shopCartItemDiscounts = shopCartOrderDto.getShopCartItemDiscounts();
+            for (ShopCartItemDiscountDto shopCartItemDiscount : shopCartItemDiscounts) {
+                List<ShopCartItemDto> sortShopCartItems = shopCartItemDiscount.getShopCartItems();
+                sortShopCartItems = sortShopCartItems.stream().sorted(Comparator.comparing(ProductItemDto::getActualTotal)).collect(Collectors.toList());
+                shopCartItemDiscount.setShopCartItems(sortShopCartItems);
+                double totalAmount = shopCartItemDiscount.getShopCartItems().stream().mapToDouble(ProductItemDto::getActualTotal).sum();
+                shopCartItemDiscount.setTotalAmount(totalAmount);
+            }
+            // 如果是折扣特别小的情况下,导致实际金额为0是,改变最小支付金额为0.01元,并且优惠金额减去0.01。
+            if (shopCartOrderDto.getActualTotal() <= 0) {
+                shopCartOrderDto.setActualTotal(0.01);
+                shopCartOrderDto.setShopReduce(Arith.sub(shopCartOrderDto.getShopReduce(), 0.01));
+                List<ShopCartItemDto> sortItems = shopCartItemDiscounts.get(shopCartItemDiscounts.size() - 1).getShopCartItems();
+                ShopCartItemDto shopCartItemDto = sortItems.get(sortItems.size() - 1);
+                shopCartItemDto.setActualTotal(0.01);
+                shopCartItemDto.setShareReduce(Arith.sub(shopCartItemDto.getShareReduce(), 0.01));
+            }
+            shopCartItemDiscounts = shopCartItemDiscounts.stream().sorted(Comparator.comparing(ShopCartItemDiscountDto::getTotalAmount)).collect(Collectors.toList());
+            shopCartOrders.get(n).setShopCartItemDiscounts(shopCartItemDiscounts);
+            actualTotal = Arith.add(actualTotal, shopCartOrderDto.getActualTotal());
+        }
+
+        shopCartOrderMergerDto.setActualTotal(actualTotal);
+        shopCartOrderMergerDto.setTotal(total);
+        shopCartOrderMergerDto.setTotalCount(totalCount);
+        shopCartOrderMergerDto.setOrderReduce(allOrderReduce);
+        shopCartOrderMergerDto.setTotalTransfee(totalTransfee);
+        shopCartOrderMergerDto.setUuid(orderParam.getUuid());
+        shopCartOrderMergerDto.setShopCartOrders(shopCartOrders);
+        shopCartOrderMergerDto.setWeight(weight);
+
+        applicationContext.publishEvent(new PlatformConfirmOrderEvent(shopCartOrderMergerDto, orderParam, allCartItem));
+
+        // ============  通过订单项的金额,计算出订单总金额  ==============
+
+        //所有订单实际金额
+        actualTotal = 0.00;
+        //所有订单优惠金额
+        allOrderReduce = 0.00;
+        totalTransfee = 0.00;
+        for (ShopCartOrderDto shopCartOrder : shopCartOrders) {
+
+
+            //订单实际金额
+            double orderActualTotal = 0.00;
+            //商家优惠金额
+            double orderReduceAmount = 0.00;
+            //商家优惠金额
+            double orderPlatformAmount = 0.00;
+
+            for (ShopCartItemDiscountDto shopCartItemDiscount : shopCartOrder.getShopCartItemDiscounts()) {
+                for (ShopCartItemDto shopCartItem : shopCartItemDiscount.getShopCartItems()) {
+                    shopCartItem.setPlatformShareReduce(Arith.round(shopCartItem.getPlatformShareReduce(), 2));
+                    shopCartItem.setShareReduce(Arith.add(Arith.round(shopCartItem.getShareReduce(), 2), shopCartItem.getPlatformShareReduce()));
+                    shopCartItem.setActualTotal(Arith.sub(shopCartItem.getProductTotalAmount(), shopCartItem.getShareReduce()));
+                    orderActualTotal = Arith.add(orderActualTotal, shopCartItem.getActualTotal());
+                    orderReduceAmount = Arith.add(orderReduceAmount, shopCartItem.getShareReduce());
+                    orderPlatformAmount = Arith.add(orderPlatformAmount, shopCartItem.getPlatformShareReduce());
+                }
+            }
+            shopCartOrder.setActualTotal(Arith.add(orderActualTotal, shopCartOrder.getTransfee()));
+            //放入优惠金额
+            shopCartOrder.setShopReduce(Arith.add(orderReduceAmount, shopCartOrder.getFreeTransfee()));
+            //放入平台优惠金额,如果用户等级免自营店运费也要放进去
+            shopCartOrder.setPlatformAmount(Arith.add(orderPlatformAmount, shopCartOrder.getFreeTransfee()));
+
+            actualTotal = Arith.add(actualTotal, shopCartOrder.getActualTotal());
+            allOrderReduce = Arith.add(allOrderReduce, shopCartOrder.getShopReduce());
+            totalTransfee = Arith.add(totalTransfee, shopCartOrder.getTransfee());
+        }
+        shopCartOrderMergerDto.setActualTotal(actualTotal);
+        shopCartOrderMergerDto.setTotalTransfee(totalTransfee);
+        shopCartOrderMergerDto.setOrderReduce(allOrderReduce);
+
+        applicationContext.publishEvent(new ScoreConfirmOrderEvent(shopCartOrderMergerDto, orderParam, allCartItem));
+        orderService.putConfirmOrderCache(userId + orderParam.getUuid(), shopCartOrderMergerDto);
+
+        return ResponseEntity.ok(shopCartOrderMergerDto);
+    }
+
+    /**
+     * 购物车/立即购买  提交订单,根据店铺拆单
+     */
+    @PostMapping("/submit")
+    @ApiOperation(value = "提交订单,返回支付流水号", notes = "根据传入的参数判断是否为购物车提交订单,同时对购物车进行删除,用户开始进行支付")
+    public ResponseEntity<OrderNumbersDto> submitOrders(@Valid @RequestBody SubmitOrderParam submitOrderParam) {
+        String userId = SecurityUtils.getUser().getUserId();
+        ShopCartOrderMergerDto mergerOrder = orderService.getConfirmOrderCache(userId + submitOrderParam.getUuid());
+
+        if (mergerOrder == null) {
+            throw new YamiShopBindException("订单已过期,请重新下单");
+        }
+
+        List<OrderShopParam> orderShopParams = submitOrderParam.getOrderShopParam();
+
+        List<ShopCartOrderDto> shopCartOrders = mergerOrder.getShopCartOrders();
+        // 设置备注
+        if (CollectionUtil.isNotEmpty(orderShopParams)) {
+            for (ShopCartOrderDto shopCartOrder : shopCartOrders) {
+                for (OrderShopParam orderShopParam : orderShopParams) {
+                    if (Objects.equals(shopCartOrder.getShopId(), orderShopParam.getShopId())) {
+                        shopCartOrder.setRemarks(orderShopParam.getRemarks());
+                    }
+                }
+            }
+        }
+
+        List<Order> orders = orderService.submit(userId, mergerOrder);
+
+        StringBuilder orderNumbers = new StringBuilder();
+        for (Order order : orders) {
+            orderNumbers.append(order.getOrderNumber()).append(",");
+        }
+        orderNumbers.deleteCharAt(orderNumbers.length() - 1);
+
+        boolean isShopCartOrder = false;
+        // 移除缓存
+        for (ShopCartOrderDto shopCartOrder : shopCartOrders) {
+            for (ShopCartItemDiscountDto shopCartItemDiscount : shopCartOrder.getShopCartItemDiscounts()) {
+                for (ShopCartItemDto shopCartItem : shopCartItemDiscount.getShopCartItems()) {
+                    Long basketId = shopCartItem.getBasketId();
+                    if (basketId != null && basketId != 0) {
+                        isShopCartOrder = true;
+                    }
+                    skuService.removeSkuCacheBySkuId(shopCartItem.getSkuId(), shopCartItem.getProdId());
+                    productService.removeProductCacheByProdId(shopCartItem.getProdId());
+                }
+            }
+        }
+        // 购物车提交订单时(即有购物车ID时)
+        if (isShopCartOrder) {
+            basketService.removeShopCartItemsCacheByUserId(userId);
+        }
+        orderService.removeConfirmOrderCache(userId + submitOrderParam.getUuid());
+        return ResponseEntity.ok(new OrderNumbersDto(orderNumbers.toString()));
+    }
+
+
+    @GetMapping("/getOrderPayInfoByOrderNumber")
+    @ApiOperation(value = "获取订单支付信息", notes = "获取订单支付的商品/地址信息")
+    @ApiImplicitParam(name = "orderNumbers", value = "订单流水号", required = true, dataType = "String")
+    public ResponseEntity<OrderPayInfoParam> getOrderPayInfoByOrderNumber(@RequestParam("orderNumbers") String orderNumbers) {
+        List<String> orderNumberList = Arrays.asList(orderNumbers.split(","));
+        //获取订单信息
+        List<Order> orderList = orderService.getOrderPayInfoByOrderNumber(orderNumberList);
+        List<String> prodNameList = Lists.newArrayList();
+        Long addrOrderId = null;
+        Date endTime = null;
+        int totalScore = 0;
+        double totalFee = 0.0;
+        //获取商品名集合
+        for (Order order : orderList) {
+            for (OrderItem orderItem : order.getOrderItems()) {
+                prodNameList.add(orderItem.getProdName());
+                totalScore += orderItem.getUseScore() != null ? orderItem.getUseScore() : 0;
+            }
+            //第一次循环,获取订单地址id,订单过期时间
+            if (Objects.isNull(addrOrderId)) {
+                addrOrderId = order.getAddrOrderId();
+                if (Objects.equals(2, order.getOrderType())) {
+                    // 获取秒杀订单的取消订单时间
+                    Integer maxCancelTime = 0;
+                    SubmitSeckillOrderEvent event = new SubmitSeckillOrderEvent(order, maxCancelTime);
+                    applicationContext.publishEvent(event);
+                    maxCancelTime = event.getMaxCancelTime();
+                    if (maxCancelTime <= 0) {
+                        maxCancelTime = 30;
+                    }
+                    endTime = DateUtil.offsetMinute(order.getCreateTime(), maxCancelTime);
+                } else {
+                    endTime = DateUtil.offsetMinute(order.getCreateTime(), 30);
+                }
+            }
+            totalFee = Arith.add(totalFee, order.getActualTotal());
+        }
+        //写入商品名、收货地址/电话
+        UserAddrOrder userAddrOrder = userAddrOrderService.getById(addrOrderId);
+        String addr = userAddrOrder.getProvince() + userAddrOrder.getCity() + userAddrOrder.getArea() + userAddrOrder.getAddr();
+        OrderPayInfoParam orderPayInfoParam = new OrderPayInfoParam();
+        orderPayInfoParam.setProdNameList(prodNameList);
+        orderPayInfoParam.setReceiver(userAddrOrder.getReceiver());
+        orderPayInfoParam.setUserAddr(addr);
+        orderPayInfoParam.setMobile(userAddrOrder.getMobile());
+        orderPayInfoParam.setEndTime(endTime);
+        orderPayInfoParam.setTotalFee(totalFee);
+        orderPayInfoParam.setTotalScore(totalScore);
+        return ResponseEntity.ok(orderPayInfoParam);
+    }
+}

+ 680 - 0
yami-shop-api/src/main/java/com/yami/shop/api/controller/OrderRefundController.java

@@ -0,0 +1,680 @@
+package com.yami.shop.api.controller;
+
+import cn.hutool.core.lang.Snowflake;
+import cn.hutool.core.util.ObjectUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.yami.shop.bean.app.dto.ApiOrderRefundDto;
+import com.yami.shop.bean.app.param.OrderRefundExpressParam;
+import com.yami.shop.bean.app.param.OrderRefundParam;
+import com.yami.shop.bean.dto.OrderRefundDto;
+import com.yami.shop.bean.enums.OrderStatus;
+import com.yami.shop.bean.enums.RefundStatusEnum;
+import com.yami.shop.bean.enums.RefundType;
+import com.yami.shop.bean.enums.ReturnMoneyStsType;
+import com.yami.shop.bean.model.*;
+import com.yami.shop.bean.param.OrderDto;
+import com.yami.shop.common.config.Constant;
+import com.yami.shop.common.exception.YamiShopBindException;
+import com.yami.shop.common.util.Arith;
+import com.yami.shop.common.util.PageParam;
+import com.yami.shop.delivery.comment.api.paotui.PaoTuiApi;
+import com.yami.shop.delivery.comment.api.paotui.model.request.AddWithoutShopRequest;
+import com.yami.shop.delivery.comment.api.paotui.model.request.CancelOrderRequest;
+import com.yami.shop.delivery.comment.api.paotui.model.request.DeliveryCpriceRequest;
+import com.yami.shop.delivery.comment.api.paotui.model.request.OrderDetailRequest;
+import com.yami.shop.delivery.comment.api.paotui.model.response.DeliveryPriceResponse;
+import com.yami.shop.delivery.comment.api.paotui.model.response.OrderResponse;
+import com.yami.shop.delivery.comment.api.paotui.model.response.OrderStatusResponse;
+import com.yami.shop.delivery.comment.service.TransportManagerService;
+import com.yami.shop.security.api.util.SecurityUtils;
+import com.yami.shop.service.*;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiOperation;
+import lombok.AllArgsConstructor;
+import ma.glasnost.orika.MapperFacade;
+import org.apache.commons.lang3.StringUtils;
+import org.checkerframework.checker.units.qual.A;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.*;
+
+import javax.validation.Valid;
+import java.math.BigDecimal;
+import java.text.SimpleDateFormat;
+import java.util.*;
+
+@RestController
+@RequestMapping("/p/orderRefund")
+@Api(tags = "订单退款接口")
+@AllArgsConstructor
+public class OrderRefundController {
+
+    private final OrderRefundService orderRefundService;
+
+    private final OrderService orderService;
+
+    private final MapperFacade mapperFacade;
+
+    private final Snowflake snowflake;
+
+    private final OrderItemService orderItemService;
+
+    private final RefundDeliveryService refundDeliveryService;
+
+    private final ShopDetailService shopDetailService;
+
+    private final UserAddrService userAddrService;
+
+
+    private final TransportManagerService transportManagerService;
+
+    @Autowired
+    private PaoTuiApi paoTuiApi;
+
+    @Autowired
+    private IQnhService qnhService;
+
+    @Autowired
+    private UserAddrOrderService userAddrOrderService;
+
+    @Autowired
+    private UserService userService;
+
+    @Autowired
+    private SkuService skuService;
+
+
+
+    @GetMapping("getIsDistribution")
+    @ApiOperation(value = "获取是否在配送中")
+    public ResponseEntity<Boolean> getIsDistribution( String orderNumber){
+        Order order = orderService.getOrderByOrderNumber(orderNumber);
+        if(ObjectUtil.isEmpty(order)){
+            throw new YamiShopBindException("订单编号不存在,订单编号是否正确");
+        }
+        // 已支付订单取消订单,已付款后需要相应处理物流状态
+        OrderDetailRequest orderDetailRequest = new OrderDetailRequest();
+        orderDetailRequest.setOrder_id(order.getDvyFlowId());
+        orderDetailRequest.setOrigin_id(orderNumber);
+        try {
+            OrderStatusResponse orderStatusResponse = paoTuiApi.deliveryRoute(orderDetailRequest);
+            if (ObjectUtil.isNotEmpty(orderStatusResponse.getInfo()) && orderStatusResponse.getInfo().size()>0){
+                if(orderStatusResponse.getInfo().get(0).getStatus()==40){
+                    return ResponseEntity.ok(true);
+                }
+            }
+            return ResponseEntity.ok(false);
+        }catch (Exception e){
+            return ResponseEntity.ok(false);
+        }
+    }
+    @PostMapping("/apply")
+    @ApiOperation(value = "申请退款", notes = "申请退款")
+    public ResponseEntity<String> apply(@Valid @RequestBody OrderRefundParam orderRefundParam) {
+        String userId = SecurityUtils.getUser().getUserId();
+        // 获取订单信息
+        Order order = orderService.getOrderByOrderNumberAndUserId(orderRefundParam.getOrderNumber(), userId, true);
+
+        if (!Objects.equals(order.getIsPayed(), 1)) {
+            throw new YamiShopBindException("当前订单还未付款,无法申请");
+        }
+
+        if (Objects.equals(order.getStatus(), OrderStatus.CLOSE.value())) {
+            throw new YamiShopBindException("当前订单已失败,不允许退款");
+        }
+
+        if (Objects.equals(order.getStatus(), OrderStatus.WAIT_GROUP.value())) {
+            throw new YamiShopBindException("当前订单正在等待成团状态,需等待成团才能进行下一步操作");
+        }
+
+
+//        if (!Objects.equals(orderRefundParam.getRefundType(),RefundType.ALL.value()) && Objects.equals(order.getStatus(),OrderStatus.PADYED.value())) {
+//            throw new YamiShopBindException("未发货订单仅支持整单退款");
+//        }
+//        // 代发货整单退款不可以输入金额,为固定全额退款
+//        if (Objects.equals(orderRefundParam.getRefundType(),RefundType.ALL.value()) && Objects.equals(order.getStatus(),OrderStatus.PADYED.value())) {
+//            orderRefundParam.setRefundAmount(order.getActualTotal());
+//        }
+
+        if (orderRefundParam.getRefundAmount() > (order.getActualTotal())) {
+            throw new YamiShopBindException("退款金额已超出订单金额,无法申请");
+        }
+
+        //待收货 -> 整单退款 -> 退款金额 < 订单金额 - 运费金额 当前配送费为提前支付,退款时直接进行退款
+//        if (Objects.equals(order.getStatus(), OrderStatus.CONSIGNMENT.value()) && orderRefundParam.getRefundType().equals(RefundType.ALL.value())) {
+//            Double refundAmount = Arith.sub(order.getActualTotal(), order.getFreightAmount());
+//            if (orderRefundParam.getRefundAmount() > refundAmount) {
+//                throw new YamiShopBindException("退款金额已超出订单金额,无法申请");
+//            }
+//        }
+
+        if (!orderRefundService.checkRefundDate(order)) {
+            throw new YamiShopBindException("当前订单已确认收货超过" + Constant.MAX_FINALLY_REFUND_TIME + "天,无法退款");
+        }
+        if (Objects.equals(order.getOrderType(), Constant.ORDER_TYPE_SCORE)) {
+            throw new YamiShopBindException("积分商品,无法退款");
+        }
+        if (Objects.equals(orderRefundParam.getRefundType(), RefundType.ALL.value()) && (!Objects.isNull(order.getRefundStatus()) && !Objects.equals(order.getRefundStatus(), RefundStatusEnum.DISAGREE.value()))) {
+            throw new YamiShopBindException("该订单已有商品正在退款中,不能再进行整单退款");
+        }
+
+// 已支付订单取消订单,已付款后需要相应处理物流状态
+        if(StringUtils.isNotEmpty(order.getDvyFlowId())){
+            OrderDetailRequest orderDetailRequest = new OrderDetailRequest();
+            orderDetailRequest.setOrder_id(order.getDvyFlowId());
+            orderDetailRequest.setOrigin_id(orderRefundParam.getOrderNumber());
+            OrderStatusResponse orderStatusResponse = paoTuiApi.deliveryRoute(orderDetailRequest);
+            if (ObjectUtil.isNotEmpty(orderStatusResponse.getInfo()) && orderStatusResponse.getInfo().size()>0){
+                if(orderStatusResponse.getInfo().get(0).getStatus()==40){
+                    throw new YamiShopBindException("正在配送中,无法取消");
+                }else if(orderStatusResponse.getInfo().get(0).getStatus()<40){
+                    //        //先取消配送订单
+                    CancelOrderRequest cancelOrderRequest = new CancelOrderRequest();
+                    cancelOrderRequest.setOrder_id(order.getDvyFlowId());
+                    cancelOrderRequest.setOrigin_id(orderRefundParam.getOrderNumber());
+                    cancelOrderRequest.setCancel_reason_code(3);
+                    cancelOrderRequest.setCancel_reason("不想要了");
+                    CancelOrderRequest cancelOrderRequest1 = paoTuiApi.orderCancel(cancelOrderRequest);
+                }
+            }
+        }
+        // 生成退款单信息
+        OrderRefund newOrderRefund = new OrderRefund();
+
+        // 获取所有正在进行中的退款订单
+        List<OrderRefund> orderRefunds = orderRefundService.getProcessingOrderRefundByOrderId(order.getOrderId());
+
+        for (OrderRefund orderRefund : orderRefunds) {
+            if (Objects.equals(RefundType.ALL.value(), orderRefund.getRefundType())) {
+                throw new YamiShopBindException("该订单正在进行整单退款,无法进行新的退款操作");
+            }
+            if (Objects.equals(orderRefund.getOrderItemId(), orderRefundParam.getOrderItemId())) {
+                throw new YamiShopBindException("该商品正在进行退款中,无法进行新的退款操作");
+            }
+        }
+
+        // 如果存在分销订单,则计算分销总金额
+        List<OrderItem> orderItemList = orderItemService.getOrderItemsByOrderNumber(order.getOrderNumber());
+        // 判断退款单类型(1:整单退款,2:单个物品退款)
+        if (orderRefundParam.getRefundType().equals(RefundType.ALL.value())) {
+            // 全部物品退款
+            // 计算该订单项的分销金额
+            newOrderRefund.setDistributionTotalAmount(orderService.sumTotalDistributionAmountByOrderItem(orderItemList));
+            // 计算平台退款金额(退款时将这部分钱退回给平台,所以商家要扣除从平台这里获取的金额)
+            newOrderRefund.setPlatformRefundAmount(order.getPlatformAmount());
+        } else {
+            // 部分物品退款
+            OrderItem orderItem = orderItemService.getOne(new LambdaQueryWrapper<OrderItem>()
+                    .eq(OrderItem::getOrderItemId, orderRefundParam.getOrderItemId())
+                    .eq(OrderItem::getOrderNumber, orderRefundParam.getOrderNumber()));
+            if (orderItem == null) {
+                throw new YamiShopBindException("该物品在订单中不存在");
+            }
+            boolean isCanRefund = false;
+            //  查看是否有支付金额和积分都为空的订单,有则抛出异常
+            for (OrderItem item : orderItemList) {
+                if (item.getActualTotal() <= 0.0 && item.getUseScore() <= 0.0) {
+                    isCanRefund = true;
+                    break;
+                }
+            }
+            if (isCanRefund) {
+                throw new YamiShopBindException("该订单部分订单项支付金额和积分为0,无法使用部分退款!");
+            }
+
+            if (order.getPlatformAmount() > 0 && !Arith.isEquals(orderRefundParam.getRefundAmount(), orderItem.getActualTotal())) {
+                throw new YamiShopBindException("该订单有使用平台优惠,无法使用部分退款!");
+            }
+            // 计算该订单项的分销金额
+            newOrderRefund.setDistributionTotalAmount(orderService.sumTotalDistributionAmountByOrderItem(Collections.singletonList(orderItem)));
+
+            // 计算平台退款金额(退款时将这部分钱退回给平台,所以商家要扣除从平台这里获取的金额)
+            //此处设置实际平台抵现金额
+            newOrderRefund.setPlatformRefundAmount(orderItem.getPlatformShareReduce());
+
+            // 退款物品数量为null或者0时,则为退款全部数量
+            if (orderRefundParam.getGoodsNum() <= 0) {
+                orderRefundParam.setGoodsNum(orderItem.getProdCount());
+            }
+
+            // 判断退款数量是否溢出
+            if (orderRefundParam.getGoodsNum() > orderItem.getProdCount()) {
+                throw new YamiShopBindException("退款物品数量已超出订单中的数量,不允许申请");
+            }
+
+            // 判断退款金额是否超出订单金额
+            double refundSingleAmount = Arith.div(orderRefundParam.getRefundAmount(), orderRefundParam.getGoodsNum(), 3);
+            double singleAmount = Arith.div(orderItem.getActualTotal(), orderItem.getProdCount(), 3);
+            if (refundSingleAmount > orderItem.getProductTotalAmount() || refundSingleAmount > singleAmount) {
+                throw new YamiShopBindException("退款金额已超出订单金额,无法申请");
+            }
+
+            // 一个订单项只能申请一次退款
+            for (OrderRefund orderRefund : orderRefunds) {
+                if (Objects.equals(orderRefund.getOrderId(), orderItem.getOrderItemId())) {
+                    throw new YamiShopBindException("退款订单项已处理,请勿重复申请");
+                }
+            }
+        }
+
+        newOrderRefund.setShopId(order.getShopId());
+        newOrderRefund.setUserId(order.getUserId());
+        newOrderRefund.setOrderId(order.getOrderId());
+        newOrderRefund.setRefundSn(String.valueOf(snowflake.nextId()));
+        newOrderRefund.setRefundType(orderRefundParam.getRefundType());
+
+        newOrderRefund.setRefundAmount(orderRefundParam.getRefundAmount());
+        if (Objects.equals(RefundType.ALL.value(), orderRefundParam.getRefundType())) {
+            newOrderRefund.setOrderItemId(0L);
+        } else {
+            newOrderRefund.setOrderItemId(orderRefundParam.getOrderItemId());
+            // 待发货状态-最后一件商品进行退款,退款金额 =  商品金额 + 订单运费金额
+            if (Objects.equals(order.getStatus(), OrderStatus.PADYED.value()) && order.getFreightAmount() > 0) {
+                int orderItenCount = orderItemService.count(new LambdaQueryWrapper<OrderItem>().eq(OrderItem::getOrderNumber, order.getOrderNumber()));
+                if (Objects.equals(orderRefunds.size(), orderItenCount - 1)) {
+                    newOrderRefund.setRefundAmount(Arith.add(newOrderRefund.getRefundAmount(), order.getFreightAmount()));
+                }
+            }
+        }
+
+        newOrderRefund.setGoodsNum(orderRefundParam.getGoodsNum());
+        newOrderRefund.setApplyType(orderRefundParam.getApplyType());
+        if (Objects.equals(orderRefundParam.getApplyType(), 2)) {
+            newOrderRefund.setIsReceiver(true);
+        } else {
+            newOrderRefund.setIsReceiver(orderRefundParam.getIsReceiver());
+        }
+        newOrderRefund.setBuyerReason(orderRefundParam.getBuyerReason());
+        newOrderRefund.setBuyerDesc(orderRefundParam.getBuyerDesc());
+        newOrderRefund.setBuyerMobile(orderRefundParam.getBuyerMobile());
+        newOrderRefund.setPhotoFiles(orderRefundParam.getPhotoFiles());
+        newOrderRefund.setReturnMoneySts(ReturnMoneyStsType.APPLY.value());
+        newOrderRefund.setApplyTime(new Date());
+        newOrderRefund.setUpdateTime(new Date());
+        orderRefundService.applyRefund(newOrderRefund);
+
+        if(StringUtils.isNotEmpty(order.getQnhOrderId())){
+            //取消牵牛花订单
+            createQNHOrder(order,newOrderRefund.getRefundSn());
+        }
+        return ResponseEntity.ok(newOrderRefund.getRefundSn());
+    }
+
+    /**
+     * 计算配送价格
+     */
+    @GetMapping("/refundPrice")
+    @ApiOperation(value = "计算配送价格", notes = "")
+    public ResponseEntity<RefundDelivery> refundPrice(String refundSn, Long deliveryTime) {
+
+        OrderRefund orderRefund = orderRefundService.getOrderRefundByRefundSn(refundSn);
+        String userId = SecurityUtils.getUser().getUserId();
+        // 获取订单信息
+        Order order = orderService.getById(orderRefund.getOrderId());
+
+        // 退货信息
+        RefundDelivery refundDelivery = refundDeliveryService.getOne(new LambdaQueryWrapper<RefundDelivery>()
+                .eq(RefundDelivery::getRefundSn, refundSn));
+
+        UserAddr userAddrByUserId = userAddrService.getUserAddrByUserId(order.getAddrOrderId(), userId);
+        if (ObjectUtil.isEmpty(userAddrByUserId)) {
+            userAddrByUserId = userAddrService.getUserAddrByUserId(0L, userId);
+        }
+        ShopDetail shopDetail = shopDetailService.getShopDetailByShopId(orderRefund.getShopId());
+
+
+        Double trans = transportManagerService.calculateTransfeeSecond2(shopDetail.getShopId(), userAddrByUserId);
+
+        refundDelivery.setPrice(trans);
+        refundDelivery.setTouchTime(System.currentTimeMillis());
+        refundDelivery.setDeliveryTime(deliveryTime);
+        refundDeliveryService.update(refundDelivery, new LambdaQueryWrapper<RefundDelivery>()
+                .eq(RefundDelivery::getRefundSn, refundSn));
+        return ResponseEntity.ok(refundDelivery);
+    }
+
+    /**
+     * 用户提交物流公司信息
+     */
+    @GetMapping("/submitExpress/{refundSn}")
+    @ApiOperation(value = "提交退款订单物流填写信息", notes = "")
+    public ResponseEntity<String> submitExpress(@PathVariable("refundSn") String refundSn) {
+        OrderRefund orderRefund = orderRefundService.getOrderRefundByRefundSn(refundSn);
+        if (Objects.isNull(orderRefund)) {
+            throw new YamiShopBindException("查询不到退款信息");
+        }
+
+        String userId = SecurityUtils.getUser().getUserId();
+        if (!Objects.equals(orderRefund.getUserId(), userId)) {
+            throw new YamiShopBindException("申请失败,您没有该权限");
+        }
+
+        if (!Objects.equals(orderRefund.getApplyType(), 2)) {
+            throw new YamiShopBindException("当前申请类型不允许提交物流信息操作");
+        }
+
+        if (!Objects.equals(orderRefund.getReturnMoneySts(), ReturnMoneyStsType.PROCESSING.value())) {
+            throw new YamiShopBindException("当前状态不允许提交物流信息操作");
+        }
+
+        RefundDelivery refundDelivery = refundDeliveryService.getOne(new LambdaQueryWrapper<RefundDelivery>()
+                .eq(RefundDelivery::getRefundSn, refundSn));
+
+        if (refundDelivery.getPayer().equals("2") && !refundDelivery.isPay()) {
+            throw new YamiShopBindException("未支付退货费用");
+        }
+        Order order = orderService.getById(orderRefund.getOrderId());
+        UserAddr userAddrOrder = userAddrService.getUserAddrByUserId(order.getAddrOrderId(), userId);
+        if (ObjectUtil.isEmpty(userAddrOrder)) {
+            userAddrOrder = userAddrService.getUserAddrByUserId(0L, userId);
+        }
+        ShopDetail shopDetail = shopDetailService.getShopDetailByShopId(orderRefund.getShopId());
+
+        // 计算价格
+        DeliveryCpriceRequest deliveryCpriceRequest = new DeliveryCpriceRequest();
+        deliveryCpriceRequest.setReceiver_longitude(shopDetail.getShopLng());
+        deliveryCpriceRequest.setReceiver_latitude(shopDetail.getShopLat());
+        deliveryCpriceRequest.setReceiver_address(shopDetail.getProvince() + shopDetail.getCity() + shopDetail.getArea() + shopDetail.getShopAddress());
+        deliveryCpriceRequest.setReceiver_name(refundDelivery.getReceiverName());
+        deliveryCpriceRequest.setReceiver_phone(refundDelivery.getReceiverMobile());
+        deliveryCpriceRequest.setSender_longitude(String.valueOf(userAddrOrder.getLongitude()));
+        deliveryCpriceRequest.setSender_latitude(String.valueOf(userAddrOrder.getLatitude()));
+        deliveryCpriceRequest.setSender_address(userAddrOrder.getAddress() + userAddrOrder.getAddressName() + userAddrOrder.getAddrDetail());
+        deliveryCpriceRequest.setCity(shopDetail.getCityId());
+        deliveryCpriceRequest.setSenderPhone(userAddrOrder.getMobile());
+        deliveryCpriceRequest.setSenderName(userAddrOrder.getReceiver());
+        deliveryCpriceRequest.setGoods_weight(1);
+        deliveryCpriceRequest.setGoods_category(5);
+        deliveryCpriceRequest.setDelivery_time(refundDelivery.getDeliveryTime());
+        deliveryCpriceRequest.setMap_type(1);
+        DeliveryPriceResponse deliveryPriceResponse = paoTuiApi.ordercPrice(deliveryCpriceRequest);
+
+
+        // 发货
+        AddWithoutShopRequest addOrderRequest = new AddWithoutShopRequest();
+        addOrderRequest.setShop_id(deliveryPriceResponse.getShop_origin_id());
+        addOrderRequest.setShop_name("退货配送");
+        addOrderRequest.setOrigin_id(refundSn);
+        addOrderRequest.setIs_subscribe(1);
+        addOrderRequest.setSubscribe_time(refundDelivery.getDeliveryTime());
+        addOrderRequest.setCity(shopDetail.getCityId());
+        addOrderRequest.setSender_longitude(userAddrOrder.getLongitude());
+        addOrderRequest.setSender_latitude(userAddrOrder.getLatitude());
+        addOrderRequest.setSender_phone(userAddrOrder.getMobile());
+        addOrderRequest.setSender_address(userAddrOrder.getAddress() + userAddrOrder.getAddressName() + userAddrOrder.getAddrDetail());
+        addOrderRequest.setReceiver_longitude(shopDetail.getShopLng());
+        addOrderRequest.setReceiver_latitude(shopDetail.getShopLat());
+        addOrderRequest.setReceiver_address(shopDetail.getProvince() + shopDetail.getCity() + shopDetail.getArea() + shopDetail.getShopAddress());
+        addOrderRequest.setReceiver_address_detail(shopDetail.getShopAddress());
+        addOrderRequest.setReceiver_phone(refundDelivery.getReceiverMobile());
+        addOrderRequest.setReceiver_name(refundDelivery.getReceiverName());
+
+
+        OrderResponse orderResponse = paoTuiApi.orderaddWithoutShop(addOrderRequest);
+        refundDelivery.setSenderMobile(userAddrOrder.getMobile());
+//        refundDelivery.setSenderRemarks(orderRefundExpressParam.getSenderRemarks());
+//        refundDelivery.setDeyId(orderRefundExpressParam.getExpressId());
+        refundDelivery.setDeyName("聚合配送");
+        refundDelivery.setDeyNu(orderResponse.getOrder_id());
+//        refundDelivery.setImgs(orderRefundExpressParam.getImgs());
+        refundDelivery.setCreateTime(new Date());
+
+        // 更新退款单信息
+        orderRefund.setReturnMoneySts(ReturnMoneyStsType.CONSIGNMENT.value());
+        orderRefund.setShipTime(new Date());
+        orderRefund.setUpdateTime(new Date());
+
+        orderRefundService.submitExpress(orderRefund, refundDelivery);
+        return ResponseEntity.ok("提交成功");
+    }
+
+    /**
+     * 用户修改物流公司信息
+     */
+    @PutMapping("/reSubmitExpress")
+    @ApiOperation(value = "修改退款订单物流填写信息", notes = "修改物流公司信息")
+    public ResponseEntity<String> updateExpress(@Valid @RequestBody OrderRefundExpressParam orderRefundExpressParam) {
+        String userId = SecurityUtils.getUser().getUserId();
+        OrderRefund orderRefund = orderRefundService.getOrderRefundByRefundSn(orderRefundExpressParam.getRefundSn());
+        if (Objects.isNull(orderRefund)) {
+            throw new YamiShopBindException("查询不到退款信息");
+        }
+
+        if (!Objects.equals(orderRefund.getUserId(), userId)) {
+            throw new YamiShopBindException("申请失败,您没有此权限");
+        }
+
+        if (!Objects.equals(orderRefund.getReturnMoneySts(), ReturnMoneyStsType.CONSIGNMENT.value())) {
+            throw new YamiShopBindException("当前状态不允许更新物流信息操作");
+        }
+
+        // 填写物流信息
+        RefundDelivery refundDelivery = refundDeliveryService.getOne(new LambdaQueryWrapper<RefundDelivery>()
+                .eq(RefundDelivery::getRefundSn, orderRefundExpressParam.getRefundSn()));
+        refundDelivery.setSenderMobile(orderRefundExpressParam.getMobile());
+        refundDelivery.setDeyId(orderRefundExpressParam.getExpressId());
+        refundDelivery.setSenderRemarks(orderRefundExpressParam.getSenderRemarks());
+        refundDelivery.setDeyNu(orderRefundExpressParam.getExpressNo());
+        refundDelivery.setImgs(orderRefundExpressParam.getImgs());
+        refundDelivery.setReceiverMobile(orderRefundExpressParam.getMobile());
+        refundDelivery.setDeyName(orderRefundExpressParam.getExpressName());
+
+        // 更新退款单信息
+        orderRefund.setUpdateTime(new Date());
+
+        orderRefundService.submitExpress(orderRefund, refundDelivery);
+        return ResponseEntity.ok("修改成功");
+    }
+
+    /**
+     * 用户撤销退货退款申请
+     */
+    @PutMapping("/cancel")
+    @ApiOperation(value = "撤销退货退款申请", notes = "")
+    public ResponseEntity<String> cancel(@RequestBody String refundSn) {
+        OrderRefundDto orderRefund = orderRefundService.getOrderRefundByRefundSn(refundSn);
+        if (Objects.isNull(orderRefund)) {
+            throw new YamiShopBindException("撤销失败 退款订单不存在");
+        }
+        if (Objects.equals(orderRefund.getReturnMoneySts(), ReturnMoneyStsType.PROCESSING.value())) {
+            throw new YamiShopBindException("卖家正在处理退款,不能撤销退款申请");
+        }
+        if (Objects.equals(orderRefund.getReturnMoneySts(), ReturnMoneyStsType.CONSIGNMENT.value())) {
+            throw new YamiShopBindException("买家已发货,不能撤销退款申请");
+        }
+        if (Objects.equals(orderRefund.getReturnMoneySts(), ReturnMoneyStsType.RECEIVE.value())) {
+            throw new YamiShopBindException("卖家已收货,不能撤销退款申请");
+        }
+        if (Objects.equals(orderRefund.getReturnMoneySts(), ReturnMoneyStsType.SUCCESS.value())) {
+            throw new YamiShopBindException("退款成功,不能撤销退款申请");
+        }
+        String userId = SecurityUtils.getUser().getUserId();
+
+        // 查看订单是否还有处于处理中的退款单,如果没有则修改订单退款状态为关闭状态
+        Order order = orderService.getOrderByOrderNumberAndUserId(orderRefund.getOrderNumber(), userId, true);
+
+        //如果订单状态为待发货、包含运费、单个商品退款,且所有订单项都进行退款,则不能再取消退款(取消退款后再退款会导致重复退运费bug)
+        if (Objects.equals(order.getStatus(), OrderStatus.PADYED.value()) && Objects.equals(orderRefund.getRefundType(), 2) && order.getFreightAmount() > 0) {
+            // 退款数量
+            int refundCount = orderRefundService.count(new LambdaQueryWrapper<OrderRefund>()
+                    .gt(OrderRefund::getReturnMoneySts, 0)
+                    .lt(OrderRefund::getReturnMoneySts, 6)
+                    .eq(OrderRefund::getOrderId, order.getOrderId())
+            );
+            // 订单项数量
+            int orderItemCount = orderItemService.count(new LambdaQueryWrapper<OrderItem>().eq(OrderItem::getOrderNumber, order.getOrderNumber()));
+            if (refundCount == orderItemCount) {
+                throw new YamiShopBindException("该订单所有商品都进行退款,已无法取消退款");
+            }
+        }
+
+        if (Objects.equals(orderRefund.getReturnMoneySts(), ReturnMoneyStsType.SUCCESS.value()) ||
+                Objects.equals(orderRefund.getReturnMoneySts(), ReturnMoneyStsType.FAIL.value()) ||
+                Objects.equals(orderRefund.getReturnMoneySts(), ReturnMoneyStsType.REJECT.value()) ||
+                Objects.equals(orderRefund.getReturnMoneySts(), ReturnMoneyStsType.CANCEL.value())) {
+            throw new YamiShopBindException("撤销失败 当前状态不允许此操作");
+        }
+
+        Date now = new Date();
+        orderRefund.setReturnMoneySts(ReturnMoneyStsType.CANCEL.value());
+        orderRefund.setReturnMoneySts(ReturnMoneyStsType.FAIL.value());
+        orderRefund.setCancelTime(now);
+        orderRefund.setUpdateTime(now);
+        orderRefundService.updateById(orderRefund);
+
+
+        List<OrderRefund> orderRefundList = orderRefundService.list(new LambdaQueryWrapper<OrderRefund>()
+                .eq(OrderRefund::getOrderId, order.getOrderId()));
+        long count = orderRefundList.stream().filter(item -> Objects.equals(item.getReturnMoneySts(), ReturnMoneyStsType.APPLY.value())
+                || Objects.equals(item.getReturnMoneySts(), ReturnMoneyStsType.PROCESSING.value())
+                || Objects.equals(item.getReturnMoneySts(), ReturnMoneyStsType.CONSIGNMENT.value())
+                || Objects.equals(item.getReturnMoneySts(), ReturnMoneyStsType.RECEIVE.value())).count();
+        if (count == 0) {
+            order.setRefundStatus(RefundStatusEnum.DISAGREE.value());
+            orderService.updateById(order);
+        }
+
+        return ResponseEntity.ok("撤销成功");
+    }
+
+
+    /**
+     * 查看退款订单详情
+     */
+    @GetMapping("/info")
+    @ApiOperation(value = "查看退款订单详情", notes = "查看退款订单详情")
+    public ResponseEntity<ApiOrderRefundDto> info(String refundSn) {
+        // 查询详情
+        OrderRefundDto orderRefundDto = orderRefundService.getOrderRefundByRefundSn(refundSn);
+
+        if (orderRefundDto == null) {
+            throw new YamiShopBindException("查看失败 该退款订单不存在");
+        }
+
+        if (!Objects.equals(orderRefundDto.getUserId(), SecurityUtils.getUser().getUserId())) {
+            throw new YamiShopBindException("查看失败 您没有此权限");
+        }
+
+        ApiOrderRefundDto apiOrderRefundDto = mapperFacade.map(orderRefundDto, ApiOrderRefundDto.class);
+        return ResponseEntity.ok(apiOrderRefundDto);
+    }
+
+    /**
+     * 查看我的退款订单列表
+     */
+    @GetMapping("/list")
+    @ApiOperation(value = "我的退款订单列表", notes = "我的退款订单列表,显示数量时候")
+    @ApiImplicitParam(name = "applyType", value = "申请类型: 0/null 全部  1仅退款  2退款退货", required = false, dataType = "Integer")
+    public ResponseEntity<IPage<ApiOrderRefundDto>> list(PageParam<OrderRefundDto> page,
+                                                         @RequestParam(required = false) String startTime, @RequestParam(required = false) String endTime, @RequestParam(required = false) Integer applyType) {
+        OrderRefundDto orderRefundDto = new OrderRefundDto();
+        orderRefundDto.setUserId(SecurityUtils.getUser().getUserId());
+        // 0/null全部  1仅退款 2退款退货
+        if (Objects.equals(0, applyType)) {
+            applyType = null;
+        }
+        orderRefundDto.setApplyType(applyType);
+        IPage<OrderRefundDto> pageList = orderRefundService.getPage(page, orderRefundDto, startTime, endTime);
+
+        // 克隆对象
+        @SuppressWarnings("unchecked") IPage<ApiOrderRefundDto> apiPageList = mapperFacade.map(pageList, IPage.class);
+        apiPageList.setRecords(mapperFacade.mapAsList(pageList.getRecords(), ApiOrderRefundDto.class));
+        return ResponseEntity.ok(apiPageList);
+    }
+
+    /**
+     * 创建牵牛花订单
+     * @param order
+     * @return
+     */
+    public boolean createQNHOrder(Order order,String refundSn) {
+        SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        // 待添加创建牵牛花订单
+        OrderDto orderDto = new OrderDto();
+        orderDto.setChannelSheetno(order.getOrderNumber());
+        orderDto.setChannelKeyword("YYG");
+        orderDto.setPayOver(true);
+        orderDto.setBilltype("2");
+        orderDto.setReturnOrderSn(refundSn);
+        orderDto.setTotalSaleValue(BigDecimal.valueOf(order.getTotal()));
+        orderDto.setTotalDiscValue(BigDecimal.ZERO);
+        orderDto.setTotalSjDisc(BigDecimal.ZERO);
+        orderDto.setTotalSaleValue(BigDecimal.ZERO);
+        orderDto.setTotalPtDp(BigDecimal.ZERO);
+        orderDto.setTotalSjDp(BigDecimal.ZERO);
+        orderDto.setTotalPtDisc(BigDecimal.ZERO);
+        orderDto.setCommissionValue(BigDecimal.ZERO);
+        orderDto.setPayableValue(BigDecimal.valueOf(order.getTotal()));
+        orderDto.setTotalItemValue(BigDecimal.valueOf(order.getTotal()));
+        orderDto.setLogisticsModeKeyword(order.getFreightAmount().toString());
+
+
+        ShopDetail shopDetailByShopId = shopDetailService.getById(order.getShopId());
+        orderDto.setOrgCode(shopDetailByShopId.getThirdPartyCode());
+        orderDto.setOrgName(shopDetailByShopId.getShopName());
+        orderDto.setPreOrder(false);
+        orderDto.setOfflineOrder(false);
+        orderDto.setOrderTime(formatter.format(order.getCreateTime()));
+        orderDto.setGroupId(0);
+        orderDto.setGoodsReturn("true");
+        UserAddrOrder addrOrder = userAddrOrderService.getById(order.getAddrOrderId());
+        User user = userService.getUserByUserId(order.getUserId());
+
+        //填充收件人信息
+        orderDto.setReceiver(new OrderDto.Receiver());
+        orderDto.getReceiver().setAddress(addrOrder.getAddress());
+        orderDto.getReceiver().setMobile(user.getUserMobile());
+        orderDto.getReceiver().setName(user.getNickName());
+        orderDto.getReceiver().setType("0");
+        orderDto.getReceiver().setLatitude(String.valueOf(addrOrder.getLatitude()));
+        orderDto.getReceiver().setLongitude(String.valueOf(addrOrder.getLongitude()));
+        orderDto.setPayableLogisticsValue(BigDecimal.valueOf(order.getPlatformAmount()));
+        orderDto.setLogisticsModeKeyword("0");
+
+        //填充买家信息
+        orderDto.setBuyer(new OrderDto.Buyer());
+        orderDto.getBuyer().setAddress(addrOrder.getAddress());
+        orderDto.getBuyer().setNick(user.getNickName());
+        orderDto.getBuyer().setEmail(user.getUserMail());
+        orderDto.getBuyer().setNote(order.getRemarks());
+        orderDto.getBuyer().setTel(user.getUserMobile());
+
+        //填充支付信息
+        orderDto.setOrderPayments(new OrderDto.OrderPayments());
+        orderDto.getOrderPayments().setPayment(BigDecimal.valueOf(order.getTotal()));
+        orderDto.getOrderPayments().setKeyword("10002");
+        orderDto.getOrderPayments().setName("商城系统支付");
+        ArrayList<OrderDto.OrderDetails> orderDetails = new ArrayList<>();
+        int weight = 0;
+        List<OrderItem> orderItems1 = orderItemService.getOrderItemsByOrderNumber(order.getOrderNumber());
+        for (OrderItem orderItem:orderItems1){
+            OrderDto.OrderDetails orderDetails1 = new OrderDto.OrderDetails();
+            Sku sku = skuService.getById(orderItem.getSkuId());
+            orderDetails1.setSkuId(sku.getPartyCode());
+            orderDetails1.setItemCode("");
+            orderDetails1.setBarcode("");
+            orderDetails1.setOrderItemId(orderItem.getOrderItemId().toString());
+            orderDetails1.setName(orderItem.getProdName());
+            orderDetails1.setOriginalPrice(BigDecimal.valueOf(sku.getOriPrice()));
+            orderDetails1.setWeight((int)Math.round(sku.getWeight()));
+            weight+=orderDetails1.getWeight();
+            orderDetails1.setSalePrice(BigDecimal.valueOf(sku.getPrice()));
+            orderDetails1.setQty(orderItem.getProdCount());
+            orderDetails1.setMoney(orderDetails1.getSalePrice().multiply(BigDecimal.valueOf(orderDetails1.getQty())));
+            orderDetails.add(orderDetails1);
+        }
+        orderDto.setOrderDetails(orderDetails);
+        orderDto.setWeight(weight);
+        ResponseEntity responseEntity = qnhService.addOrder(orderDto);
+        if(responseEntity.getStatusCode().name().equals("OK")){
+            order.setQnhOrderId(responseEntity.getBody().toString());
+            order.setQnhOrderStatus("1");
+            orderService.updateById(order);
+            return true;
+        }
+        return false;
+    }
+
+}

+ 115 - 0
yami-shop-api/src/main/java/com/yami/shop/api/controller/PayController.java

@@ -0,0 +1,115 @@
+/*
+ * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved.
+ *
+ * https://www.gz-yami.com/
+ *
+ * 未经允许,不可做商业用途!
+ *
+ * 版权所有,侵权必究!
+ */
+
+package com.yami.shop.api.controller;
+
+
+import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.yami.shop.bean.app.param.PayParam;
+import com.yami.shop.bean.model.Order;
+import com.yami.shop.bean.model.RefundDelivery;
+import com.yami.shop.bean.pay.PayInfoDto;
+import com.yami.shop.common.exception.YamiShopBindException;
+import com.yami.shop.security.api.model.YamiUser;
+import com.yami.shop.security.api.util.SecurityUtils;
+import com.yami.shop.service.*;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.AllArgsConstructor;
+import lombok.SneakyThrows;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletResponse;
+import javax.validation.Valid;
+
+@RestController
+@RequestMapping("/p/order")
+@Api(tags = "订单接口")
+@AllArgsConstructor
+public class PayController {
+
+    private final PayService payService;
+    private final PayManagerService payManagerService;
+    private final OrderService orderService;
+    private final OrderRefundService orderRefundService;
+    private final RefundDeliveryService refundDeliveryService;
+
+    /**
+     * 支付接口
+     */
+    @PostMapping("/pay")
+    @ApiOperation(value = "根据订单号进行支付", notes = "根据订单号进行支付")
+    @SneakyThrows
+    public ResponseEntity<?> pay(HttpServletResponse httpResponse, @Valid @RequestBody PayParam payParam) {
+        YamiUser user = SecurityUtils.getUser();
+        String userId = user.getUserId();
+
+        if (!user.isEnabled()) {
+            throw new YamiShopBindException("您已被禁用,不能购买,请联系平台客服");
+        }
+
+
+        PayInfoDto payInfo = payService.pay(userId, payParam);
+
+        payInfo.setBizUserId(user.getBizUserId());
+        payInfo.setPayType(payParam.getPayType());
+        payInfo.setApiNoticeUrl("/notice/pay/order/" + payParam.getPayType());
+        payInfo.setReturnUrl(payParam.getReturnUrl());
+
+
+        return payManagerService.doPay(httpResponse, payInfo);
+    }
+
+
+    /**
+     * 支付接口
+     */
+    @PostMapping("/refundPay")
+    @ApiOperation(value = "根据订单号进行支付", notes = "根据订单号进行支付")
+    @SneakyThrows
+    public ResponseEntity<?> refundPay(HttpServletResponse httpResponse, @Valid @RequestBody PayParam payParam) {
+        YamiUser user = SecurityUtils.getUser();
+
+        RefundDelivery refundDelivery = refundDeliveryService.getOne(new LambdaQueryWrapper<RefundDelivery>()
+                .eq(RefundDelivery::getRefundSn, payParam.getOrderNumbers()));
+        if (refundDelivery.getPayer().equals("1")) {
+            throw new YamiShopBindException("无需支付");
+        }
+
+        PayInfoDto payInfoDto = new PayInfoDto();
+        payInfoDto.setBody("退货配送费");
+        payInfoDto.setPayAmount(refundDelivery.getPrice());
+        payInfoDto.setPayNo("refundSn" + payParam.getOrderNumbers());
+        payInfoDto.setIsScore(0);
+
+        payInfoDto.setBizUserId(user.getBizUserId());
+        payInfoDto.setPayType(payParam.getPayType());
+        payInfoDto.setApiNoticeUrl("/notice/pay/order/" + payParam.getPayType());
+        payInfoDto.setReturnUrl(payParam.getReturnUrl());
+
+
+        return payManagerService.doPay(httpResponse, payInfoDto);
+    }
+
+
+    @GetMapping("/isPay/{orderNumbers}")
+    @ApiOperation(value = "根据订单号查询该订单是否已经支付", notes = "根据订单号查询该订单是否已经支付")
+    public ResponseEntity<Boolean> isPay(@PathVariable String orderNumbers) {
+        YamiUser user = SecurityUtils.getUser();
+        String userId = user.getUserId();
+
+        String[] orderNumberArr = orderNumbers.split(StrUtil.COMMA);
+        String orderNumber = orderNumberArr[0];
+        int count = orderService.count(new LambdaQueryWrapper<Order>().eq(Order::getOrderNumber, orderNumber).eq(Order::getUserId, userId).eq(Order::getIsPayed, 1));
+        return ResponseEntity.ok(count > 0);
+    }
+}

+ 82 - 0
yami-shop-api/src/main/java/com/yami/shop/api/controller/PayNoticeController.java

@@ -0,0 +1,82 @@
+/*
+ * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved.
+ *
+ * https://www.gz-yami.com/
+ *
+ * 未经允许,不可做商业用途!
+ *
+ * 版权所有,侵权必究!
+ */
+
+package com.yami.shop.api.controller;
+
+import com.alipay.api.AlipayApiException;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.github.binarywang.wxpay.exception.WxPayException;
+import com.yami.shop.bean.bo.PayInfoBo;
+import com.yami.shop.bean.model.RefundDelivery;
+import com.yami.shop.common.enums.PayType;
+import com.yami.shop.bean.model.Order;
+import com.yami.shop.bean.model.OrderItem;
+import com.yami.shop.service.*;
+import lombok.AllArgsConstructor;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.*;
+import springfox.documentation.annotations.ApiIgnore;
+
+import javax.servlet.http.HttpServletRequest;
+import java.io.UnsupportedEncodingException;
+import java.util.List;
+
+@ApiIgnore
+@RestController
+@RequestMapping("/notice/pay")
+@AllArgsConstructor
+public class PayNoticeController {
+
+    private final PayService payService;
+
+    private final ProductService productService;
+
+    private final SkuService skuService;
+
+    private final PayManagerService payManagerService;
+
+    private final RefundDeliveryService refundDeliveryService;
+
+    /**
+     * 支付异步回调
+     */
+    @RequestMapping("/order/{payType}")
+    public ResponseEntity<String> submit(HttpServletRequest request, @PathVariable Integer payType, @RequestBody(required = false) String xmlData) throws WxPayException, UnsupportedEncodingException, AlipayApiException {
+
+
+        PayInfoBo payInfoBo = payManagerService.validateAndGetPayInfo(request, PayType.instance(payType), xmlData);
+
+        if (payInfoBo.getPayNo().contains("refundSn")) {
+            String[] split = payInfoBo.getPayNo().split("refundSn");
+            RefundDelivery refundDelivery = refundDeliveryService.getOne(new LambdaQueryWrapper<RefundDelivery>()
+                    .eq(RefundDelivery::getRefundSn, split[1]));
+            refundDelivery.setPay(true);
+            refundDeliveryService.update(refundDelivery, new LambdaQueryWrapper<RefundDelivery>()
+                    .eq(RefundDelivery::getRefundSn, split[1]));
+
+        } else {
+            // 根据内部订单号更新order settlement
+            List<Order> orders = payService.paySuccess(payInfoBo.getPayNo(), payInfoBo.getBizPayNo(), payType);
+
+            // 移除缓存
+            for (Order order : orders) {
+                List<OrderItem> orderItems = order.getOrderItems();
+                for (OrderItem orderItem : orderItems) {
+                    productService.removeProductCacheByProdId(orderItem.getProdId());
+                    skuService.removeSkuCacheBySkuId(orderItem.getSkuId(), orderItem.getProdId());
+                }
+            }
+        }
+
+        return ResponseEntity.ok(payInfoBo.getSuccessString());
+    }
+
+}

+ 95 - 0
yami-shop-api/src/main/java/com/yami/shop/api/controller/ProdCommController.java

@@ -0,0 +1,95 @@
+/*
+ * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved.
+ *
+ * https://www.gz-yami.com/
+ *
+ * 未经允许,不可做商业用途!
+ *
+ * 版权所有,侵权必究!
+ */
+
+package com.yami.shop.api.controller;
+
+
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.yami.shop.bean.enums.OrderStatus;
+import com.yami.shop.bean.model.Order;
+import com.yami.shop.bean.model.OrderItem;
+import com.yami.shop.common.exception.YamiShopBindException;
+import com.yami.shop.common.util.PageParam;
+import com.yami.shop.bean.app.dto.ProdCommDataDto;
+import com.yami.shop.bean.app.dto.ProdCommDto;
+import com.yami.shop.bean.app.param.ProdCommParam;
+import com.yami.shop.bean.model.ProdComm;
+import com.yami.shop.security.api.util.SecurityUtils;
+import com.yami.shop.service.OrderItemService;
+import com.yami.shop.service.OrderService;
+import com.yami.shop.service.ProdCommService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import lombok.AllArgsConstructor;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.*;
+
+import javax.validation.Valid;
+import java.util.Date;
+import java.util.Objects;
+
+@RestController
+@RequestMapping("/p/prodComm")
+@Api(tags = "评论接口")
+@AllArgsConstructor
+public class ProdCommController {
+
+    private final ProdCommService prodCommService;
+
+    private final OrderItemService orderItemService;
+
+    private final OrderService orderService;
+
+
+    @GetMapping("/prodCommPageByUser")
+    @ApiOperation(value = "根据用户返回评论分页数据", notes = "传入页码")
+    public ResponseEntity<IPage<ProdCommDto>> getProdCommPage(PageParam page) {
+        return ResponseEntity.ok(prodCommService.getProdCommDtoPageByUserId(page, SecurityUtils.getUser().getUserId()));
+    }
+
+
+
+    @PostMapping
+    @ApiOperation(value = "添加评论")
+    public ResponseEntity<Void> saveProdCommPage(@Valid @RequestBody ProdCommParam prodCommParam) {
+        Long orderItemId = prodCommParam.getOrderItemId();
+
+        OrderItem orderItem = orderItemService.getById(orderItemId);
+        if (orderItem == null) {
+            throw new YamiShopBindException("订单项不存在");
+        }
+        if (Objects.equals(orderItem.getCommSts(), 1)) {
+            throw new YamiShopBindException("改订单项已评论,请勿重复评论");
+        }
+
+        String userId = SecurityUtils.getUser().getUserId();
+
+        Order order = orderService.getOrderByOrderNumberAndUserId(orderItem.getOrderNumber(),userId, true);
+
+        if (!Objects.equals(order.getStatus(), OrderStatus.SUCCESS.value())) {
+            throw new YamiShopBindException("请确认收货后再进行评论");
+        }
+
+        prodCommService.comm(orderItem, prodCommParam);
+
+        return ResponseEntity.ok().build();
+    }
+
+    @GetMapping("/getProdComment")
+    @ApiOperation(value = "根据itemId获取评论", notes = "根据itemId获取评论")
+    public ResponseEntity<ProdComm> getProdComment(Long orderItemId) {
+
+        ProdComm prodComm = prodCommService.getOne(new LambdaUpdateWrapper<ProdComm>().eq(ProdComm::getOrderItemId, orderItemId).eq(ProdComm::getUserId,SecurityUtils.getUser().getUserId()));
+        return ResponseEntity.ok(prodComm);
+    }
+}

+ 140 - 0
yami-shop-api/src/main/java/com/yami/shop/api/controller/ProdController.java

@@ -0,0 +1,140 @@
+/*
+ * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved.
+ *
+ * https://www.gz-yami.com/
+ *
+ * 未经允许,不可做商业用途!
+ *
+ * 版权所有,侵权必究!
+ */
+
+package com.yami.shop.api.controller;
+
+import java.util.List;
+import java.util.stream.Collectors;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.yami.shop.bean.app.dto.*;
+import com.yami.shop.bean.dto.ProdByCategoryIdAndShopIdDTO;
+import com.yami.shop.bean.model.*;
+import com.yami.shop.common.exception.YamiShopBindException;
+import com.yami.shop.common.util.PageParam;
+import com.yami.shop.service.*;
+import io.swagger.annotations.ApiImplicitParams;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.*;
+
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiOperation;
+import ma.glasnost.orika.MapperFacade;
+
+@RestController
+@RequestMapping("/prod")
+@Api(tags = "商品接口")
+public class ProdController {
+
+    @Autowired
+    private ProductService prodService;
+
+    @Autowired
+    private MapperFacade mapperFacade;
+
+    @Autowired
+    private SkuService skuService;
+
+    @Autowired
+    private ProdCommService prodCommService;
+
+
+
+    @GetMapping("/prodInfo")
+    @ApiOperation(value = "商品详情信息", notes = "根据商品ID(prodId)获取商品信息")
+    @ApiImplicitParam(name = "prodId", value = "商品ID", required = true, dataType = "Long")
+    public ResponseEntity<ProductDto> prodInfo(Long prodId) {
+
+        Product product = prodService.getProductByProdId(prodId);
+        if (product == null || product.getStatus() != 1) {
+            throw new YamiShopBindException("商品已下线");
+        }
+
+        List<Sku> skuList = skuService.listByProdId(prodId);
+        // 启用的sku列表
+        List<Sku> useSkuList = skuList.stream().filter(sku -> sku.getStatus() == 1).collect(Collectors.toList());
+        product.setSkuList(useSkuList);
+//        ProductDto productDto = mapperFacade.map(product, ProductDto.class);
+        ProductDto productDto = new ProductDto();
+        BeanUtils.copyProperties(product, productDto);
+
+        return ResponseEntity.ok(productDto);
+    }
+
+    @GetMapping("/isStatus")
+    @ApiOperation(value = "校验商品是否下架", notes = "根据商品ID(prodId)校验商品是否下架")
+    @ApiImplicitParam(name = "prodId", value = "商品ID", required = true)
+    public ResponseEntity<Boolean> isStatus(Long prodId) {
+        Product product = prodService.getProductByProdId(prodId);
+        if (product == null || product.getStatus() != 1) {
+            return ResponseEntity.ok(false);
+        }
+        return ResponseEntity.ok(true);
+    }
+
+    @GetMapping("/lastedProdPage")
+    @ApiOperation(value = "新品推荐", notes = "获取新品推荐商品列表")
+    @ApiImplicitParams({
+    })
+    public ResponseEntity<IPage<ProductDto>> lastedProdPage(PageParam<ProductDto> page,
+                                                            @RequestParam(value = "lat", required = false) String lat,
+                                                            @RequestParam(value = "lon", required = false) String lon,
+                                                            @RequestParam(value = "distance", required = false) String distance) {
+        IPage<ProductDto> productDtoIPage = prodService.pageByPutawayTime(page, lat, lon, distance);
+        return ResponseEntity.ok(productDtoIPage);
+    }
+
+
+    @GetMapping("/moreBuyProdList")
+    @ApiOperation(value = "每日疯抢", notes = "获取销量最多的商品列表")
+    @ApiImplicitParams({})
+    public ResponseEntity<IPage<ProductDto>> moreBuyProdList(PageParam<ProductDto> page) {
+        IPage<ProductDto> productDtoIPage = prodService.moreBuyProdList(page);
+        return ResponseEntity.ok(productDtoIPage);
+    }
+
+    @GetMapping("/discountProds")
+    @ApiOperation(value = "根据活动id获取活动商品列表", notes = "根据活动id获取活动商品列表")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "discountId", value = "活动id", required = true, dataType = "Long"),
+    })
+    public ResponseEntity<IPage<ProductDto>> getDiscountProds(
+            @RequestParam(value = "discountId", required = true) Long discountId,
+            PageParam<ProductDto> page) {
+        IPage<ProductDto> productDtoList = prodService.pageByDiscountId(page, discountId);
+        return ResponseEntity.ok(productDtoList);
+    }
+
+    @GetMapping("/prodCommData")
+    @ApiOperation(value = "返回商品评论数据(好评率 好评数量 中评数 差评数)", notes = "根据商品id获取")
+    public ResponseEntity<ProdCommDataDto> getProdCommData(Long prodId) {
+        return ResponseEntity.ok(prodCommService.getProdCommDataByProdId(prodId));
+    }
+
+
+    @GetMapping("/prodCommPageByProd")
+    @ApiOperation(value = "根据商品返回评论分页数据", notes = "传入商品id和页码")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "prodId", value = "商品id", required = true, dataType = "Long"),
+            @ApiImplicitParam(name = "evaluate", value = "-1或null 全部,0好评 1中评 2差评 3有图", required = true, dataType = "Long"),
+    })
+    public ResponseEntity<IPage<ProdCommDto>> getProdCommPageByProdId(PageParam page, Long prodId, Integer evaluate) {
+        return ResponseEntity.ok(prodCommService.getProdCommDtoPageByProdId(page, prodId, evaluate));
+    }
+    @PostMapping("/listProdByCategoryIdAndShopId")
+    @ApiOperation(value = "根据分类ID、商户ID查询归属的所有商品")
+    public ResponseEntity<IPage<Product>> listProdByCategoryIdAndShopId(@RequestBody ProdByCategoryIdAndShopIdDTO prodByCategoryIdAndShopIdDTO) {
+        return ResponseEntity.ok(prodService.listProdByCategoryIdAndShopId(prodByCategoryIdAndShopIdDTO));
+    }
+
+}

+ 49 - 0
yami-shop-api/src/main/java/com/yami/shop/api/controller/ProdTagController.java

@@ -0,0 +1,49 @@
+/*
+ * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved.
+ *
+ * https://www.gz-yami.com/
+ *
+ * 未经允许,不可做商业用途!
+ *
+ * 版权所有,侵权必究!
+ */
+
+package com.yami.shop.api.controller;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.yami.shop.bean.app.dto.ProdTagDto;
+import com.yami.shop.bean.model.ProdTag;
+import com.yami.shop.service.ProdTagService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.AllArgsConstructor;
+import ma.glasnost.orika.MapperFacade;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+@RestController
+@RequestMapping("/prod/tag")
+@Api(tags = "商品分组标签接口")
+@AllArgsConstructor
+public class ProdTagController {
+
+    private ProdTagService prodTagService;
+
+    private MapperFacade mapperFacade;
+
+    /**
+     * 商品分组标签列表接口
+     */
+    @GetMapping("/prodTagList")
+    @ApiOperation(value = "商品分组标签列表", notes = "获取所有的商品分组列表")
+    public ResponseEntity<List<ProdTagDto>> getProdTagList() {
+        List<ProdTag> prodTagList = prodTagService.listProdTag();
+        List<ProdTagDto> prodTagDtoList = mapperFacade.mapAsList(prodTagList, ProdTagDto.class);
+        return ResponseEntity.ok(prodTagDtoList);
+    }
+
+}

+ 52 - 0
yami-shop-api/src/main/java/com/yami/shop/api/controller/QnhController.java

@@ -0,0 +1,52 @@
+package com.yami.shop.api.controller;
+
+import cn.hutool.Hutool;
+import cn.hutool.core.date.DateUtil;
+import com.yami.shop.bean.app.param.QnhPushParam;
+import com.yami.shop.bean.model.Order;
+import com.yami.shop.bean.model.OrderItem;
+import com.yami.shop.bean.param.OrderDto;
+import com.yami.shop.service.IQnhService;
+import com.yami.shop.service.OrderItemService;
+import com.yami.shop.service.OrderService;
+import com.yami.shop.service.impl.FeiEYunApi;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import java.util.List;
+import java.util.Map;
+
+@RestController
+@RequestMapping("/qnh")
+public class QnhController {
+
+    @Resource
+    private IQnhService qnhService;
+
+    @ApiOperation("牵牛花推送")
+    @PostMapping("/data/update")
+    public ResponseEntity<String> dataUpdate(@RequestBody QnhPushParam qnhPushParam) {
+        return qnhService.dataUpdate(qnhPushParam);
+    }
+
+    @ApiOperation("手动触发数据同步")
+    @GetMapping("/data/synchronizedInfo")
+    public void synchronizedInfo() {
+         qnhService.synchronizedInfo();
+    }
+    @ApiOperation("更新库存")
+    @GetMapping("/getSkuStock")
+    public ResponseEntity<Boolean> getSkuStock(@RequestParam String skuCode,@RequestParam Long prodId) {
+        qnhService.getSkuStock(skuCode,prodId);
+        return ResponseEntity.ok(true);
+    }
+    @ApiOperation("被动接受库存商品信息")
+    @PostMapping("/data/noticeProductInfo")
+    public ResponseEntity<String> noticeProductInfo(@RequestBody Object object) {
+        qnhService.noticeProductInfo(object);
+        return ResponseEntity.ok("success");
+    }
+
+}

+ 115 - 0
yami-shop-api/src/main/java/com/yami/shop/api/controller/QrcodeTicketController.java

@@ -0,0 +1,115 @@
+/*
+ * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved.
+ *
+ * https://www.gz-yami.com/
+ *
+ */
+
+package com.yami.shop.api.controller;
+
+
+import cn.hutool.json.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.yami.shop.bean.model.QrcodeTicket;
+import com.yami.shop.common.exception.YamiShopBindException;
+import com.yami.shop.common.util.IdUtil;
+import com.yami.shop.config.WxConfig;
+import com.yami.shop.service.QrcodeTicketService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import lombok.AllArgsConstructor;
+import me.chanjar.weixin.common.error.WxErrorException;
+import org.springframework.core.io.FileSystemResource;
+import org.springframework.http.MediaType;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.io.File;
+import java.util.Date;
+import java.util.Objects;
+
+
+/**
+ * 二维码数据信息
+ *
+ * @author LGH
+ * @date 2020-03-12 16:29:39
+ */
+@RestController
+@AllArgsConstructor
+@RequestMapping("/qrcodeTicket" )
+@Api(tags="二维码数据")
+public class QrcodeTicketController {
+
+    private final QrcodeTicketService qrcodeTicketService;
+
+    private final WxConfig wxConfig;
+
+    private final IdUtil idUtil;
+
+    /**
+     * 小程序二维码
+     */
+    @GetMapping("/miniQrCode")
+    @ApiOperation(value="小程序二维码获取", notes="获取小程序二维码,返回二维码图片流,小程序跳到二维码的页面之后," +
+            "需要根据获取的scene请求获取线上保存的content,为什么要这么麻烦,以为scene的内容有限,只能在数据库保存")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "content", value = "要保存的内容", required = true, dataType = "String"),
+            @ApiImplicitParam(name = "type", value = "类型:1. 小程序团购商品 2.小程序分销商品二维码", required = true, dataType = "Integer")
+    })
+    public ResponseEntity<FileSystemResource> save(String content, Integer type) throws WxErrorException {
+
+        String page;
+        if(Objects.equals(type, 1) || Objects.equals(type, 2)) {
+            page = "pages/prod/prod";
+        } else {
+            throw new YamiShopBindException("无法获取页面信息");
+        }
+
+
+        JSONObject jsonObject = new JSONObject();
+        jsonObject.put("type", type);
+        jsonObject.put("content", content);
+
+        String ticket = idUtil.nextShortId();
+        QrcodeTicket qrcodeTicket = new QrcodeTicket();
+        qrcodeTicket.setContent(jsonObject.toString());
+        qrcodeTicket.setCreateTime(new Date());
+        qrcodeTicket.setType(type);
+        qrcodeTicket.setTicket(ticket);
+        qrcodeTicket.setTicketUrl(page);
+        qrcodeTicketService.save(qrcodeTicket);
+        File file = wxConfig.getWxMaService().getQrcodeService().createWxaCodeUnlimit(ticket, page);
+        return ResponseEntity
+                .ok()
+                .contentLength(file.length())
+                .contentType(MediaType.IMAGE_PNG)
+                .body(new FileSystemResource(file));
+    }
+
+
+    /**
+     * 根据Ticket获取content
+     */
+    @GetMapping("/getContent")
+    @ApiOperation(value="根据Ticket获取保存的内容", notes="小程序里的scene就是你要的Ticket咯")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "ticket", value = "小程序里的scene就是你要的Ticket咯", required = true, dataType = "String")
+    })
+    public ResponseEntity<QrcodeTicket> getContent(String ticket) {
+
+        QrcodeTicket qrcodeTicket = qrcodeTicketService.getOne(new LambdaQueryWrapper<QrcodeTicket>().eq(QrcodeTicket::getTicket, ticket));
+        if (qrcodeTicket == null ||
+                (qrcodeTicket.getExpireTime() !=null
+                        && qrcodeTicket.getExpireTime().getTime() < System.currentTimeMillis())) {
+            throw new YamiShopBindException("二维码已过期");
+        }
+        return ResponseEntity.ok(qrcodeTicket);
+    }
+
+
+}

+ 91 - 0
yami-shop-api/src/main/java/com/yami/shop/api/controller/SearchController.java

@@ -0,0 +1,91 @@
+/*
+ * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved.
+ *
+ * https://www.gz-yami.com/
+ *
+ * 未经允许,不可做商业用途!
+ *
+ * 版权所有,侵权必究!
+ */
+
+package com.yami.shop.api.controller;
+
+
+import cn.hutool.core.collection.CollectionUtil;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.yami.shop.bean.app.param.SearchParam;
+import com.yami.shop.common.util.PageParam;
+import com.yami.shop.bean.dto.HotSearchDto;
+import com.yami.shop.bean.dto.SearchProdDto;
+import com.yami.shop.service.HotSearchService;
+import com.yami.shop.service.ProductService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import lombok.AllArgsConstructor;
+import org.springframework.context.ApplicationContext;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.Collections;
+import java.util.List;
+
+@RestController
+@RequestMapping("/search")
+@Api(tags = "搜索接口")
+@AllArgsConstructor
+public class SearchController {
+
+    private final HotSearchService hotSearchService;
+
+    private final ProductService productService;
+    private final ApplicationContext applicationContext;
+
+    @GetMapping("/hotSearchByShopId")
+    @ApiOperation(value = "查看店铺热搜", notes = "根据店铺id,热搜数量获取热搜")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "shopId", value = "店铺id", required = true, dataType = "Long"),
+            @ApiImplicitParam(name = "number", value = "取数", required = true, dataType = "Integer"),
+            @ApiImplicitParam(name = "sort", value = "是否按照顺序(0 否 1是)", required = false, dataType = "Integer"),
+    })
+    public ResponseEntity<List<HotSearchDto>> hotSearchByShopId(Long shopId,Integer number,Integer sort) {
+        List<HotSearchDto> list = hotSearchService.getHotSearchDtoByshopId(shopId);
+
+        return getListResponseEntity(number, sort, list);
+    }
+
+    @GetMapping("/hotSearch")
+    @ApiOperation(value = "查看全局热搜", notes = "根据店铺id,热搜数量获取热搜")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "number", value = "取数", required = true, dataType = "Integer"),
+            @ApiImplicitParam(name = "sort", value = "是否按照顺序(0 否 1是)", required = false, dataType = "Integer"),
+    })
+    public ResponseEntity<List<HotSearchDto>> hotSearch(Integer number,Integer sort) {
+        List<HotSearchDto> list = hotSearchService.getHotSearchDtoByshopId(0L);
+        return getListResponseEntity(number, sort, list);
+    }
+
+    private ResponseEntity<List<HotSearchDto>> getListResponseEntity(Integer number, Integer sort, List<HotSearchDto> list) {
+        if(sort == null || sort == 0){
+            Collections.shuffle(list);
+        }
+        if(!CollectionUtil.isNotEmpty(list) || list.size()< number){
+            return ResponseEntity.ok(list);
+        }
+        return ResponseEntity.ok(list.subList(0, number));
+    }
+
+    @GetMapping("/searchProdPage")
+    @ApiOperation(value = "搜索商品")
+    public ResponseEntity<IPage<SearchProdDto>> searchProdPage(PageParam page, SearchParam searchParam) {
+//        if(searchParam.getCouponId() != null && searchParam.getCouponId() != 0){
+//            applicationContext.publishEvent(new GetCouponCanProdEvent(searchParam));
+//        }
+        searchParam.setProdType(0);
+        IPage<SearchProdDto> searchProdDtoPageByProdName = productService.getSearchProdDtoPageByProdName(page, searchParam);
+        return ResponseEntity.ok(searchProdDtoPageByProdName);
+    }
+}

+ 261 - 0
yami-shop-api/src/main/java/com/yami/shop/api/controller/ShopCartController.java

@@ -0,0 +1,261 @@
+/*
+ * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved.
+ *
+ * https://www.gz-yami.com/
+ *
+ * 未经允许,不可做商业用途!
+ *
+ * 版权所有,侵权必究!
+ */
+
+package com.yami.shop.api.controller;
+
+import cn.hutool.core.collection.CollectionUtil;
+import cn.hutool.core.map.MapUtil;
+import com.google.common.collect.Lists;
+import com.yami.shop.bean.app.dto.*;
+import com.yami.shop.bean.app.param.ChangeShopCartParam;
+import com.yami.shop.bean.app.param.ShopCartParam;
+import com.yami.shop.bean.event.ShopCartEvent;
+import com.yami.shop.bean.model.*;
+import com.yami.shop.common.exception.YamiShopBindException;
+import com.yami.shop.common.util.Arith;
+import com.yami.shop.security.api.util.SecurityUtils;
+import com.yami.shop.service.*;
+import io.swagger.annotations.*;
+import lombok.AllArgsConstructor;
+import org.apache.ibatis.annotations.Delete;
+import org.springframework.context.ApplicationContext;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.*;
+
+import javax.validation.Valid;
+import java.util.*;
+import java.util.stream.Collectors;
+
+@RestController
+@RequestMapping("/p/shopCart")
+@Api(tags = "购物车接口")
+@AllArgsConstructor
+public class ShopCartController {
+
+    private BasketService basketService;
+
+    private ProductService productService;
+
+    private SkuService skuService;
+
+    private ApplicationContext applicationContext;
+
+    private UserCollectionService userCollectionService;
+
+    /**
+     * 获取用户购物车信息
+     *
+     * @param shopCartParams 购物车参数对象列表
+     * @return
+     */
+    @PostMapping("/info")
+    @ApiOperation(value = "获取用户购物车信息", notes = "获取用户购物车信息,参数为用户选中的活动项数组")
+    public ResponseEntity<List<ShopCartDto>> info(@RequestBody List<ShopCartParam> shopCartParams) {
+        String userId = SecurityUtils.getUser().getUserId();
+//        String userId = "5e31932043984353beb4c1a2622f5182";
+
+        // 更新购物车信息,
+        if (CollectionUtil.isNotEmpty(shopCartParams)) {
+            basketService.updateBasketByShopCartParam(userId, shopCartParams);
+        }
+
+        // 拿到购物车的所有item
+        List<ShopCartItemDto> shopCartItems = basketService.getShopCartItems(userId);
+        List<Long> prodIds = new ArrayList<>();
+        for (ShopCartItemDto shopCartItemDto:shopCartItems){
+            prodIds.add(shopCartItemDto.getProdId());
+        }
+        Long shopId = 0L;
+        if (!shopCartParams.isEmpty()) shopId = shopCartParams.get(0).getShopId();
+        return ResponseEntity.ok(basketService.getShopCarts(shopCartItems,shopId));
+
+    }
+
+    @RequestMapping("/deleteItem")
+    @ApiOperation(value = "删除用户购物车物品", notes = "通过购物车id删除用户购物车物品")
+    public ResponseEntity<Void> deleteItem(@RequestBody List<Long> basketIds) {
+        String userId = SecurityUtils.getUser().getUserId();
+        basketService.deleteShopCartItemsByBasketIds(userId, basketIds);
+        return ResponseEntity.ok().build();
+    }
+
+    @DeleteMapping("/deleteAll")
+    @ApiOperation(value = "清空用户购物车所有物品", notes = "清空用户购物车所有物品")
+    public ResponseEntity<String> deleteAll() {
+        String userId = SecurityUtils.getUser().getUserId();
+        basketService.deleteAllShopCartItems(userId);
+        return ResponseEntity.ok("删除成功");
+    }
+
+    @PostMapping("/changeItem")
+    @ApiOperation(value = "添加、修改用户购物车物品", notes = "通过商品id(prodId)、skuId、店铺Id(shopId),添加/修改用户购物车商品,并传入改变的商品个数(count)," +
+            "当count为正值时,增加商品数量,当count为负值时,将减去商品的数量,当最终count值小于0时,会将商品从购物车里面删除")
+    public ResponseEntity<String> addItem(@Valid @RequestBody ChangeShopCartParam param) {
+
+        if (param.getCount() == 0) {
+            return ResponseEntity.badRequest().body("输入更改数量");
+        }
+
+        String userId = SecurityUtils.getUser().getUserId();
+        List<ShopCartItemDto> shopCartItems = basketService.getShopCartItems(userId);
+        Product prodParam = productService.getProductByProdId(param.getProdId());
+        Sku skuParam = skuService.getSkuBySkuId(param.getSkuId());
+
+        // 当商品状态不正常时,不能添加到购物车
+        if (prodParam.getStatus() != 1 || skuParam.getStatus() != 1) {
+            return ResponseEntity.badRequest().body("当前商品已下架");
+        }
+
+        for (ShopCartItemDto shopCartItemDto : shopCartItems) {
+            if (Objects.equals(param.getSkuId(), shopCartItemDto.getSkuId())) {
+                Basket basket = new Basket();
+                basket.setUserId(userId);
+                basket.setBasketCount(param.getCount() + shopCartItemDto.getProdCount());
+                basket.setBasketId(shopCartItemDto.getBasketId());
+                if (skuParam.getStocks() < basket.getBasketCount() && param.getCount() > 0){
+                    throw new YamiShopBindException("商品库存不足");
+                }
+                // 防止购物车变成负数
+                if (basket.getBasketCount() <= 0) {
+                    basketService.deleteShopCartItemsByBasketIds(userId, Collections.singletonList(basket.getBasketId()));
+                    return ResponseEntity.ok().build();
+                }
+                // 当sku实际库存不足时,不能添加到购物车
+                if (skuParam.getStocks() < basket.getBasketCount() && shopCartItemDto.getProdCount() > 0) {
+                    return ResponseEntity.badRequest().body("库存不足");
+                }
+                basketService.updateShopCartItem(basket);
+                return ResponseEntity.ok().build();
+            }
+        }
+
+        // 防止购物车已被删除的情况下,添加了负数的商品
+        if (param.getCount() < 0) {
+            return ResponseEntity.badRequest().body("商品已从购物车移除");
+        }
+        // 当sku实际库存不足时,不能添加到购物车
+        if (skuParam.getStocks() < param.getCount()) {
+            return ResponseEntity.badRequest().body("库存不足");
+        }
+        if (skuParam.getStocks() <  param.getCount()){
+            throw new YamiShopBindException("商品库存不足");
+        }
+        // 所有都正常时
+        basketService.addShopCartItem(param,userId);
+        return ResponseEntity.ok("添加成功");
+    }
+
+    @GetMapping("/prodCount")
+    @ApiOperation(value = "获取购物车商品数量", notes = "获取所有购物车商品数量")
+    public ResponseEntity<Integer> prodCount() {
+        String userId = SecurityUtils.getUser().getUserId();
+        List<ShopCartItemDto> shopCartItems = basketService.getShopCartItems(userId);
+        if (CollectionUtil.isEmpty(shopCartItems)) {
+            return ResponseEntity.ok(0);
+        }
+        Integer totalCount = shopCartItems.stream().map(ShopCartItemDto::getProdCount).reduce(0, Integer::sum);
+        return ResponseEntity.ok(totalCount);
+    }
+
+    @GetMapping("/expiryProdList")
+    @ApiOperation(value = "获取购物车失效商品信息", notes = "获取购物车失效商品列表")
+    public ResponseEntity<List<ShopCartExpiryItemDto>> expiryProdList() {
+        String userId = SecurityUtils.getUser().getUserId();
+        List<ShopCartItemDto> shopCartItems = basketService.getShopCartExpiryItems(userId);
+        //根据店铺ID划分item
+        Map<Long, List<ShopCartItemDto>> shopCartItemDtoMap = shopCartItems.stream().collect(Collectors.groupingBy(ShopCartItemDto::getShopId));
+
+        // 返回一个店铺对应的所有信息
+        List<ShopCartExpiryItemDto> shopcartExpiryitems = Lists.newArrayList();
+
+        for (Long key : shopCartItemDtoMap.keySet()) {
+            ShopCartExpiryItemDto shopCartExpiryItemDto = new ShopCartExpiryItemDto();
+            shopCartExpiryItemDto.setShopId(key);
+            List<ShopCartItemDto> shopCartItemDtos = Lists.newArrayList();
+            for (ShopCartItemDto tempShopCartItemDto : shopCartItemDtoMap.get(key)) {
+                shopCartExpiryItemDto.setShopName(tempShopCartItemDto.getShopName());
+                shopCartItemDtos.add(tempShopCartItemDto);
+            }
+            shopCartExpiryItemDto.setShopCartItemDtoList(shopCartItemDtos);
+            shopcartExpiryitems.add(shopCartExpiryItemDto);
+        }
+
+        return ResponseEntity.ok(shopcartExpiryitems);
+    }
+
+    @DeleteMapping("/cleanExpiryProdList")
+    @ApiOperation(value = "清空用户失效商品", notes = "清空用户失效商品")
+    public ResponseEntity<Void> cleanExpiryProdList() {
+        String userId = SecurityUtils.getUser().getUserId();
+        basketService.cleanExpiryProdList(userId);
+        return ResponseEntity.ok().build();
+    }
+
+    @PostMapping("/totalPay")
+    @ApiOperation(value = "获取选中购物项总计、选中的商品数量", notes = "获取选中购物项总计、选中的商品数量,参数为购物车id数组")
+    public ResponseEntity<ShopCartAmountDto> getTotalPay(@RequestBody List<Long> basketIds) {
+
+        // 拿到购物车的所有item
+        List<ShopCartItemDto> dbShopCartItems = basketService.getShopCartItems(SecurityUtils.getUser().getUserId());
+
+        List<ShopCartItemDto> chooseShopCartItems = dbShopCartItems
+                                                        .stream()
+                                                        .filter(shopCartItemDto -> {
+                                                            for (Long basketId : basketIds) {
+                                                                if (Objects.equals(basketId,shopCartItemDto.getBasketId())) {
+                                                                    return  true;
+                                                                }
+                                                            }
+                                                            return false;
+                                                        })
+                                                        .collect(Collectors.toList());
+
+        // 根据店铺ID划分item
+        Map<Long, List<ShopCartItemDto>> shopCartMap = chooseShopCartItems.stream().collect(Collectors.groupingBy(ShopCartItemDto::getShopId));
+
+        double total = 0.0;
+        int count = 0;
+        double reduce = 0.0;
+        for (Long shopId : shopCartMap.keySet()) {
+            //获取店铺的所有商品项
+            List<ShopCartItemDto> shopCartItemDtoList = shopCartMap.get(shopId);
+            // 构建每个店铺的购物车信息
+            ShopCartDto shopCart = new ShopCartDto();
+            shopCart.setShopId(shopId);
+
+            applicationContext.publishEvent(new ShopCartEvent(shopCart, shopCartItemDtoList));
+
+            List<ShopCartItemDiscountDto> shopCartItemDiscounts = shopCart.getShopCartItemDiscounts();
+
+            for (ShopCartItemDiscountDto shopCartItemDiscount : shopCartItemDiscounts) {
+                List<ShopCartItemDto> shopCartItems = shopCartItemDiscount.getShopCartItems();
+                ChooseDiscountItemDto chooseDiscountItemDto = shopCartItemDiscount.getChooseDiscountItemDto();
+
+                // 如果满足优惠活动
+                if (chooseDiscountItemDto != null && chooseDiscountItemDto.getNeedAmount() <= chooseDiscountItemDto.getProdsPrice()) {
+                    reduce = Arith.add(reduce, chooseDiscountItemDto.getReduceAmount());
+                }
+
+                for (ShopCartItemDto shopCartItem : shopCartItems) {
+                    count = shopCartItem.getProdCount() + count;
+                    total = Arith.add(shopCartItem.getProductTotalAmount(), total);
+                }
+            }
+        }
+        ShopCartAmountDto shopCartAmountDto = new ShopCartAmountDto();
+        shopCartAmountDto.setCount(count);
+        shopCartAmountDto.setTotalMoney(total);
+        shopCartAmountDto.setSubtractMoney(reduce);
+        shopCartAmountDto.setFinalMoney(Arith.sub(shopCartAmountDto.getTotalMoney(), shopCartAmountDto.getSubtractMoney()));
+
+        return ResponseEntity.ok(shopCartAmountDto);
+    }
+
+}

+ 91 - 0
yami-shop-api/src/main/java/com/yami/shop/api/controller/ShopDetailController.java

@@ -0,0 +1,91 @@
+/*
+ * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved.
+ *
+ * https://www.gz-yami.com/
+ *
+ * 未经允许,不可做商业用途!
+ *
+ * 版权所有,侵权必究!
+ */
+
+package com.yami.shop.api.controller;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.yami.shop.bean.app.dto.ShopHeadInfoDto;
+import com.yami.shop.bean.model.ShopDetail;
+import com.yami.shop.bean.model.UserCollectionShop;
+import com.yami.shop.common.util.PageParam;
+import com.yami.shop.service.ShopDetailService;
+import com.yami.shop.service.UserCollectionShopService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.AllArgsConstructor;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+import java.util.Objects;
+
+
+/**
+ *
+ * @author lgh on 2018/08/29.
+ */
+@RestController
+@RequestMapping("/shop")
+@Api(tags = "店铺相关接口")
+@AllArgsConstructor
+public class ShopDetailController {
+
+    private final ShopDetailService shopDetailService;
+
+	private final UserCollectionShopService userCollectionShopService;
+
+	@GetMapping("/headInfo")
+	@ApiOperation(value = "店铺头部信息", notes = "获取的店铺头部信息")
+	public ResponseEntity<ShopHeadInfoDto> getShopHeadInfo(Long shopId) {
+		ShopHeadInfoDto shopHeadInfoDto = new ShopHeadInfoDto();
+		// 粉丝数量
+		int fansCount = userCollectionShopService.count(new LambdaQueryWrapper<UserCollectionShop>().eq(UserCollectionShop::getShopId, shopId));
+		ShopDetail shopDetail = shopDetailService.getShopDetailByShopId(shopId);
+		if(!Objects.equals(shopDetail.getShopStatus(),1)){
+			shopHeadInfoDto.setShopStatus(shopDetail.getShopStatus());
+			return ResponseEntity.ok(shopHeadInfoDto);
+		}
+		shopHeadInfoDto.setShopId(shopId);
+		shopHeadInfoDto.setShopLogo(shopDetail.getShopLogo());
+		shopHeadInfoDto.setShopName(shopDetail.getShopName());
+        shopHeadInfoDto.setIntro(shopDetail.getIntro());
+		shopHeadInfoDto.setFansCount(fansCount);
+		shopHeadInfoDto.setTel(shopDetail.getTel());
+		shopHeadInfoDto.setThirdPartyCode(shopDetail.getThirdPartyCode());
+		return ResponseEntity.ok(shopHeadInfoDto);
+	}
+
+	@GetMapping("/hotShops")
+	@ApiOperation(value = "热门店铺", notes = "热门店铺")
+	public ResponseEntity<List<ShopHeadInfoDto>> hotShops() {
+		List<ShopHeadInfoDto> hotShopsHead =  shopDetailService.listHotShopsHead();
+
+		return ResponseEntity.ok(hotShopsHead);
+	}
+
+
+
+	@GetMapping("/searchShops")
+	@ApiOperation(value = "搜索店铺", notes = "根据店铺名称搜索店铺")
+	public ResponseEntity<Page<ShopHeadInfoDto>> searchShops(PageParam<ShopHeadInfoDto> page,ShopHeadInfoDto shopHeadInfoDto) {
+		Page<ShopHeadInfoDto> hotShopsHeadPage =  shopDetailService.searchShops(page,shopHeadInfoDto);
+
+		return ResponseEntity.ok(hotShopsHeadPage);
+	}
+
+	@GetMapping("/neighborShop")
+	@ApiOperation("根据经纬度获取最近店铺")
+	public ResponseEntity<ShopHeadInfoDto> neighborShop(@RequestParam("lat") String lat,
+														  @RequestParam("lon") String lon) {
+		return shopDetailService.neighborShop(lat, lon);
+	}
+
+}

+ 50 - 0
yami-shop-api/src/main/java/com/yami/shop/api/controller/SkuController.java

@@ -0,0 +1,50 @@
+/*
+ * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved.
+ *
+ * https://www.gz-yami.com/
+ *
+ * 未经允许,不可做商业用途!
+ *
+ * 版权所有,侵权必究!
+ */
+
+package com.yami.shop.api.controller;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.yami.shop.bean.app.dto.SkuDto;
+import com.yami.shop.bean.model.Sku;
+import com.yami.shop.service.SkuService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiOperation;
+import lombok.AllArgsConstructor;
+import ma.glasnost.orika.MapperFacade;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+import java.util.stream.Collectors;
+
+@RestController
+@RequestMapping("/sku")
+@Api(tags = "sku规格接口")
+@AllArgsConstructor
+public class SkuController {
+
+    private final SkuService skuService;
+
+    private final MapperFacade mapperFacade;
+
+    @GetMapping("/getSkuList")
+    @ApiOperation(value = "通过prodId获取上架的规格列表", notes = "通过prodId获取上架的规格列表")
+    @ApiImplicitParam(name = "prodId", value = "商品id", dataType = "Long")
+    public ResponseEntity<List<SkuDto>> getSkuListByProdId(Long prodId) {
+        List<Sku> skus = skuService.listByProdId(prodId);
+
+        List<SkuDto> skuDtoList = mapperFacade.mapAsList(skus.stream().filter(sku -> sku.getStatus() == 1).collect(Collectors.toList()), SkuDto.class);
+        return ResponseEntity.ok(skuDtoList);
+    }
+}

+ 63 - 0
yami-shop-api/src/main/java/com/yami/shop/api/controller/SmsController.java

@@ -0,0 +1,63 @@
+/*
+ * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved.
+ *
+ * https://www.gz-yami.com/
+ *
+ * 未经允许,不可做商业用途!
+ *
+ * 版权所有,侵权必究!
+ */
+
+package com.yami.shop.api.controller;
+
+import cn.hutool.core.date.DatePattern;
+import cn.hutool.core.util.StrUtil;
+import com.yami.shop.common.util.IPHelper;
+import com.yami.shop.security.api.util.SecurityUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import com.google.common.collect.Maps;
+import com.yami.shop.bean.app.param.SendSmsParam;
+import com.yami.shop.bean.enums.SmsType;
+import com.yami.shop.service.SmsLogService;
+
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+
+import java.util.Date;
+
+@RestController
+@RequestMapping("/sms")
+@Api(tags="发送验证码接口")
+public class SmsController {
+
+	@Autowired
+	private SmsLogService smsLogService;
+
+    /**
+     * 发送验证码接口
+     */
+    @PostMapping("/sendLoginCode")
+    @ApiOperation(value="发送登录验证码", notes="用户发送登录验证码")
+    public ResponseEntity<Void> sendLoginCode(@RequestBody SendSmsParam sendSmsParam) {
+        // 每个手机号每分钟只能发十个注册的验证码,免得接口被利用
+		smsLogService.sendSms(SmsType.LOGIN, sendSmsParam.getMobile(), sendSmsParam.getMobile(), Maps.newHashMap());
+		return ResponseEntity.ok().build();
+    }
+
+    /**
+     * 发送修改密码验证码接口
+     */
+    @PostMapping("/sendUpdatePwdCode")
+    @ApiOperation(value="发送修改密码验证码接口", notes="发送修改密码验证码接口")
+    public ResponseEntity<Void> sendUpdatePwdCode(@RequestBody SendSmsParam sendSmsParam) {
+        // 每个手机号每分钟只能发十个注册的验证码,免得接口被利用
+		smsLogService.sendSms(SmsType.UPDATE_PASSWORD, sendSmsParam.getMobile(), sendSmsParam.getMobile(), Maps.newHashMap());
+		return ResponseEntity.ok().build();
+    }
+}

+ 157 - 0
yami-shop-api/src/main/java/com/yami/shop/api/controller/UserCollectionController.java

@@ -0,0 +1,157 @@
+/*
+ * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved.
+ *
+ * https://www.gz-yami.com/
+ *
+ * 未经允许,不可做商业用途!
+ *
+ * 版权所有,侵权必究!
+ */
+
+package com.yami.shop.api.controller;
+
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.google.common.collect.Lists;
+import com.yami.shop.bean.app.dto.ProductDto;
+import com.yami.shop.bean.app.dto.UserCollectionDto;
+import com.yami.shop.bean.model.Product;
+import com.yami.shop.bean.model.UserCollection;
+import com.yami.shop.common.exception.YamiShopBindException;
+import com.yami.shop.common.util.PageParam;
+import com.yami.shop.security.api.util.SecurityUtils;
+import com.yami.shop.service.BasketService;
+import com.yami.shop.service.ProductService;
+import com.yami.shop.service.UserCollectionService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import lombok.AllArgsConstructor;
+import org.apache.commons.collections.CollectionUtils;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.*;
+
+@RestController
+@RequestMapping("/p/user/collection")
+@Api(tags = "商品收藏接口")
+@AllArgsConstructor
+public class UserCollectionController {
+
+    private final UserCollectionService userCollectionService;
+
+    private final BasketService basketService;
+
+    private final ProductService productService;
+
+    @GetMapping("/page")
+    @ApiOperation(value = "分页返回收藏数据", notes = "根据用户id获取")
+    public ResponseEntity<IPage<UserCollectionDto>> getUserCollectionDtoPageByUserId(PageParam page,String prodName,Integer prodType) {
+        return ResponseEntity.ok(userCollectionService.getUserCollectionDtoPageByUserId(page, SecurityUtils.getUser().getUserId(),prodName,prodType));
+    }
+
+    @GetMapping("isCollection")
+    @ApiOperation(value = "根据商品id获取该商品是否在收藏夹中", notes = "传入收藏商品id")
+    public ResponseEntity<Boolean> isCollection(Long prodId) {
+        if (productService.count(new LambdaQueryWrapper<Product>()
+                .eq(Product::getProdId, prodId)) < 1) {
+            throw new YamiShopBindException("该商品不存在");
+        }
+        return ResponseEntity.ok(userCollectionService.count(new LambdaQueryWrapper<UserCollection>()
+                .eq(UserCollection::getProdId, prodId)
+                .eq(UserCollection::getUserId, SecurityUtils.getUser().getUserId())) > 0);
+    }
+
+    @PostMapping("/addOrCancel")
+    @ApiOperation(value = "添加/取消收藏", notes = "传入收藏商品id,如果商品未收藏则收藏商品,已收藏则取消收藏")
+    @ApiImplicitParam(name = "prodId", value = "商品id", required = true, dataType = "Long")
+    public ResponseEntity<Boolean> addOrCancel(@RequestBody Long prodId) {
+        if (Objects.isNull(productService.getProductByProdId(prodId))) {
+            throw new YamiShopBindException("该商品不存在");
+        }
+        Boolean isAdd = false;
+        String userId = SecurityUtils.getUser().getUserId();
+        //pc端收藏商品时,清除购物车缓存
+        basketService.removeShopCartItemsCacheByUserId(userId);
+        if (userCollectionService.count(new LambdaQueryWrapper<UserCollection>()
+                .eq(UserCollection::getProdId, prodId)
+                .eq(UserCollection::getUserId, userId)) > 0) {
+            userCollectionService.remove(new LambdaQueryWrapper<UserCollection>()
+                    .eq(UserCollection::getProdId, prodId)
+                    .eq(UserCollection::getUserId, userId));
+        } else {
+            UserCollection userCollection = new UserCollection();
+            userCollection.setCreateTime(new Date());
+            userCollection.setUserId(userId);
+            userCollection.setProdId(prodId);
+            userCollectionService.save(userCollection);
+            isAdd = true;
+        }
+        return ResponseEntity.ok(isAdd);
+    }
+
+    @PostMapping("/batachCancel")
+    @ApiOperation(value = "批量取消收藏", notes = "传入收藏商品id")
+    @ApiImplicitParam(name = "prodId", value = "商品id", required = true, dataType = "Long")
+    public ResponseEntity<Boolean> batachCancel(@RequestBody List<Long> prodIds) {
+        String userId = SecurityUtils.getUser().getUserId();
+        if (CollectionUtils.isEmpty(prodIds)){
+            return ResponseEntity.ok(false);
+        }
+        boolean remove = false;
+        for (Long prodId : prodIds) {
+          if (Objects.isNull(productService.getProductByProdId(prodId))) {
+              continue;
+          }
+          int count = userCollectionService.count(new LambdaQueryWrapper<UserCollection>()
+                  .eq(UserCollection::getProdId, prodId)
+                  .eq(UserCollection::getUserId, userId));
+          if (count <= 0) {
+              continue;
+          }
+          remove = userCollectionService.remove(new LambdaQueryWrapper<UserCollection>()
+                    .eq(UserCollection::getProdId, prodId)
+                    .eq(UserCollection::getUserId, userId));
+        }
+        return ResponseEntity.ok(remove);
+    }
+
+
+    /**
+     * 查询用户收藏商品数量
+     */
+    @GetMapping("count")
+    @ApiOperation(value = "查询用户收藏商品数量", notes = "查询用户收藏商品数量")
+    public int findUserCollectionCount() {
+        String userId = SecurityUtils.getUser().getUserId();
+        return userCollectionService.count(new LambdaQueryWrapper<UserCollection>().eq(UserCollection::getUserId, userId));
+    }
+
+    @GetMapping("/prods")
+    @ApiOperation(value = "获取用户收藏商品列表", notes = "获取用户收藏商品列表")
+    public ResponseEntity<IPage<ProductDto>> collectionProds(PageParam page) {
+        String userId = SecurityUtils.getUser().getUserId();
+        IPage<ProductDto> productDtoIPage = productService.collectionProds(page, userId);
+        return ResponseEntity.ok(productDtoIPage);
+    }
+
+    @PostMapping("/orderProdCollectionAll")
+    @ApiOperation(value = "订单商品收藏", notes = "传入商品id拼接字符串")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "prodIds", value = "商品id", required = true, dataType = "Long"),
+    })
+    public ResponseEntity<Boolean> orderProdCollectionAll(@RequestBody String prodIds) {
+        String userId = SecurityUtils.getUser().getUserId();
+        List<String> prodIdList = Arrays.asList(prodIds.split(","));
+        //去重
+        HashSet hashSet = new HashSet(prodIdList);
+        prodIdList = Lists.newArrayList();
+        prodIdList.addAll(hashSet);
+        userCollectionService.orderProdCollectionAll(prodIdList,userId);
+        return ResponseEntity.ok().build();
+    }
+
+}

+ 122 - 0
yami-shop-api/src/main/java/com/yami/shop/api/controller/UserCollectionShopController.java

@@ -0,0 +1,122 @@
+/*
+ * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved.
+ *
+ * https://www.gz-yami.com/
+ *
+ * 未经允许,不可做商业用途!
+ *
+ * 版权所有,侵权必究!
+ */
+
+package com.yami.shop.api.controller;
+
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.yami.shop.bean.app.dto.UserCollectionShopDto;
+import com.yami.shop.bean.model.UserCollection;
+import com.yami.shop.bean.model.UserCollectionShop;
+import com.yami.shop.common.exception.YamiShopBindException;
+import com.yami.shop.common.util.PageParam;
+import com.yami.shop.security.api.util.SecurityUtils;
+import com.yami.shop.service.ShopDetailService;
+import com.yami.shop.service.UserCollectionShopService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiOperation;
+import lombok.AllArgsConstructor;
+import org.apache.commons.collections.CollectionUtils;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.Date;
+import java.util.List;
+import java.util.Objects;
+
+@RestController
+@RequestMapping("/p/shop/collection")
+@Api(tags = "店铺收藏接口")
+@AllArgsConstructor
+public class UserCollectionShopController {
+
+    private final UserCollectionShopService userCollectionShopService;
+
+    private final ShopDetailService shopDetailService;
+
+    @GetMapping("/page")
+    @ApiOperation(value = "分页返回收藏数据", notes = "根据用户id获取")
+    public ResponseEntity<IPage<UserCollectionShopDto>> getUserCollectionDtoPageByUserId(PageParam page,String shopName) {
+        return ResponseEntity.ok(userCollectionShopService.getUserCollectionShopPageByUserId(page, SecurityUtils.getUser().getUserId(),shopName));
+    }
+
+    @GetMapping("isCollection")
+    @ApiOperation(value = "根据店铺id获取该店铺是否在收藏夹中", notes = "传入收藏店铺id")
+    public ResponseEntity<Boolean> isCollection(Long shopId) {
+        return ResponseEntity.ok(userCollectionShopService.count(new LambdaQueryWrapper<UserCollectionShop>()
+                .eq(UserCollectionShop::getShopId, shopId)
+                .eq(UserCollectionShop::getUserId, SecurityUtils.getUser().getUserId())) > 0);
+    }
+
+    @PostMapping("/addOrCancel")
+    @ApiOperation(value = "添加/取消收藏", notes = "传入收藏店铺id,如果店铺未收藏则收藏店铺,已收藏则取消收藏")
+    @ApiImplicitParam(name = "shopId", value = "店铺id", required = true, dataType = "Long")
+    public ResponseEntity<Boolean> addOrCancel(@RequestBody Long shopId) {
+        if (Objects.isNull(shopDetailService.getById(shopId))) {
+            throw new YamiShopBindException("该店铺不存在");
+        }
+        Boolean isAdd = false;
+        String userId = SecurityUtils.getUser().getUserId();
+        if (userCollectionShopService.count(new LambdaQueryWrapper<UserCollectionShop>()
+                .eq(UserCollectionShop::getShopId, shopId)
+                .eq(UserCollectionShop::getUserId, userId)) > 0) {
+            userCollectionShopService.remove(new LambdaQueryWrapper<UserCollectionShop>()
+                    .eq(UserCollectionShop::getShopId, shopId)
+                    .eq(UserCollectionShop::getUserId, userId));
+        } else {
+            UserCollectionShop userCollectionShop = new UserCollectionShop();
+            userCollectionShop.setCreateTime(new Date());
+            userCollectionShop.setUserId(userId);
+            userCollectionShop.setShopId(shopId);
+            userCollectionShopService.save(userCollectionShop);
+            isAdd = true;
+        }
+        return ResponseEntity.ok(isAdd);
+    }
+
+    @PostMapping("/batachCancel")
+    @ApiOperation(value = "批量取消收藏", notes = "传入收藏店铺id")
+    @ApiImplicitParam(name = "shopIds", value = "店铺Id", required = true, dataType = "Long")
+    public ResponseEntity<Boolean> batachCancel(@RequestBody List<Long> shopIds) {
+        String userId = SecurityUtils.getUser().getUserId();
+        if (CollectionUtils.isEmpty(shopIds)){
+            return ResponseEntity.ok(false);
+        }
+        boolean remove = false;
+        for (Long shopId : shopIds) {
+            if (Objects.isNull(shopDetailService.getById(shopId))) {
+                continue;
+            }
+            int count = userCollectionShopService.count(new LambdaQueryWrapper<UserCollectionShop>()
+                    .eq(UserCollectionShop::getShopId, shopId)
+                    .eq(UserCollectionShop::getUserId, userId));
+            if (count <= 0) {
+                continue;
+            }
+            remove = userCollectionShopService.remove(new LambdaQueryWrapper<UserCollectionShop>()
+                    .eq(UserCollectionShop::getShopId, shopId)
+                    .eq(UserCollectionShop::getUserId, userId));
+        }
+        return ResponseEntity.ok(remove);
+    }
+
+
+    /**
+     * 查询用户收藏店铺数量
+     */
+    @GetMapping("count")
+    @ApiOperation(value = "查询用户收藏店铺数量", notes = "查询用户收藏店铺数量")
+    public int findUserCollectionCount() {
+        String userId = SecurityUtils.getUser().getUserId();
+        return userCollectionShopService.count(new LambdaQueryWrapper<UserCollectionShop>().eq(UserCollectionShop::getUserId, userId));
+    }
+}

+ 142 - 0
yami-shop-api/src/main/java/com/yami/shop/api/controller/UserController.java

@@ -0,0 +1,142 @@
+/*
+ * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved.
+ *
+ * https://www.gz-yami.com/
+ *
+ * 未经允许,不可做商业用途!
+ *
+ * 版权所有,侵权必究!
+ */
+
+package com.yami.shop.api.controller;
+
+
+import cn.binarywang.wx.miniapp.bean.WxMaPhoneNumberInfo;
+import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.yami.shop.bean.app.dto.UserCenterInfoDto;
+import com.yami.shop.bean.app.dto.UserDto;
+import com.yami.shop.bean.app.param.UserInfoParam;
+import com.yami.shop.bean.model.ShopAuditing;
+import com.yami.shop.bean.model.ShopDetail;
+import com.yami.shop.bean.model.User;
+import com.yami.shop.bean.model.UserExtension;
+import com.yami.shop.bean.param.UserParam;
+import com.yami.shop.config.WxConfig;
+import com.yami.shop.security.api.util.SecurityUtils;
+import com.yami.shop.service.*;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.AllArgsConstructor;
+import ma.glasnost.orika.MapperFacade;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.*;
+
+/**
+ * 用户信息
+ * @author LGH
+ */
+@RestController
+@RequestMapping("/p/user")
+@Api(tags="用户接口")
+@AllArgsConstructor
+public class UserController {
+
+	private final UserService userService;
+
+	private final MapperFacade mapperFacade;
+
+	private final OrderService orderService;
+
+	private final ShopDetailService shopDetailService;
+
+	private final ShopAuditingService shopAuditingService;
+
+	private final WxConfig wxConfig;
+
+	private final UserExtensionService userExtensionService;
+
+
+
+    /**
+     * 查看用户接口
+     */
+    @GetMapping("/userInfo")
+    @ApiOperation(value="查看用户信息", notes="根据用户ID(userId)获取用户信息")
+    public ResponseEntity<UserDto> userInfo() {
+    	String userId = SecurityUtils.getUser().getUserId();
+    	User user = userService.getUserByUserId(userId);
+		//获取用户等级积分详细表
+		UserExtension extension = userExtensionService.getOne(
+				new LambdaQueryWrapper<UserExtension>().eq(UserExtension::getUserId, SecurityUtils.getUser().getUserId()));
+    	UserDto userDto = mapperFacade.map(user, UserDto.class);
+		userDto.setLevel(extension.getLevel());
+		userDto.setGrowth(extension.getGrowth());
+		userDto.setScore(extension.getScore());
+		userDto.setLevelType(extension.getLevelType());
+		userDto.setBalance(extension.getBalance());
+		if(userDto.getUserMobile() != null){
+			userDto.setMobile(userDto.getUserMobile().replaceAll("(\\d{3})\\d{4}(\\d{4})","$1****$2"));
+		}
+
+        return ResponseEntity.ok(userDto);
+    }
+
+    @PutMapping("/setUserInfo")
+    @ApiOperation(value="设置用户信息", notes="设置用户信息")
+    public ResponseEntity<Void> setUserInfo(@RequestBody UserInfoParam userInfoParam) {
+        String userId = SecurityUtils.getUser().getUserId();
+        User user = new User();
+        user.setUserId(userId);
+        user.setPic(StrUtil.isBlank(userInfoParam.getAvatarUrl())?null :userInfoParam.getAvatarUrl());
+        user.setSex(userInfoParam.getSex() == null?user.getSex():userInfoParam.getSex());
+        user.setNickName(userInfoParam.getNickName() == null?user.getNickName():userInfoParam.getNickName());
+        user.setUserMobile(userInfoParam.getUserMobile() == null?user.getUserMobile():userInfoParam.getUserMobile());
+        user.setBirthDate(userInfoParam.getBirthDate() == null?user.getBirthDate():userInfoParam.getBirthDate());
+        user.setUserMail(StrUtil.isNotBlank(userInfoParam.getUserMail())?userInfoParam.getUserMail():user.getUserMail());
+        if(StrUtil.isNotBlank(userInfoParam.getNickName())){
+            user.setNickName(userInfoParam.getNickName());
+        }
+        userService.updateById(user);
+        return ResponseEntity.ok().build();
+    }
+
+	@GetMapping("/centerInfo")
+	@ApiOperation(value="个人中心信息", notes="获取用户个人中心信息")
+	public ResponseEntity<UserCenterInfoDto> centerInfo() {
+		String userId = SecurityUtils.getUser().getUserId();
+		UserCenterInfoDto userCenterInfoDto = new UserCenterInfoDto();
+		userCenterInfoDto.setOrderCountData(orderService.getOrderCount(userId));
+
+		ShopAuditing shopAuditing = shopAuditingService.getShopAuditingByUserId(userId);
+
+		userCenterInfoDto.setShopAuditStatus(shopAuditing == null ? null : shopAuditing.getStatus());
+
+		ShopDetail shopDetail = shopDetailService.getShopDetailByUserId(userId);
+
+		userCenterInfoDto.setIsSetPassword(shopDetail != null && StrUtil.isNotBlank(shopDetail.getPassword()));
+
+		userCenterInfoDto.setShopId(shopDetail == null ?  null : shopDetail.getShopId());
+		userCenterInfoDto.setShopStatus(shopDetail == null ?  null : shopDetail.getShopStatus());
+		return ResponseEntity.ok(userCenterInfoDto);
+	}
+
+
+	@GetMapping("/getPhoneNumber")
+	@ApiOperation(value="获取用户绑定手机号", notes="根据小程序的加密数据,iv获取当前用户的手机号")
+	public ResponseEntity<WxMaPhoneNumberInfo> getPhoneNumber(@RequestParam String encryptedData, @RequestParam String ivStr) {
+
+		return ResponseEntity.ok(wxConfig.getWxMaService().getUserService().getPhoneNoInfo(SecurityUtils.getUser().getSessionKey(), encryptedData, ivStr));
+	}
+
+	@GetMapping("/getUserScore")
+	@ApiOperation(value="获取用户积分", notes="返回用户的积分信息")
+	public ResponseEntity<UserParam> getUserScore() {
+		String userId = SecurityUtils.getUser().getUserId();
+		User user = userService.getById(userId);
+		UserParam userParam = mapperFacade.map(user,UserParam.class);
+		System.out.println();
+		return ResponseEntity.ok(userParam);
+	}
+
+}

+ 266 - 0
yami-shop-api/src/main/java/com/yami/shop/api/controller/UserRegisterController.java

@@ -0,0 +1,266 @@
+/*
+ * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved.
+ *
+ * https://www.gz-yami.com/
+ *
+ * 未经允许,不可做商业用途!
+ *
+ * 版权所有,侵权必究!
+ */
+
+package com.yami.shop.api.controller;
+
+
+import cn.binarywang.wx.miniapp.bean.WxMaPhoneNumberInfo;
+import cn.hutool.core.date.DatePattern;
+import cn.hutool.core.util.IdUtil;
+import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.google.common.collect.Maps;
+import com.yami.shop.bean.app.param.CheckRegisterSmsParam;
+import com.yami.shop.bean.app.param.SendSmsParam;
+import com.yami.shop.bean.app.param.UserRegisterParam;
+import com.yami.shop.bean.enums.SmsType;
+import com.yami.shop.bean.model.User;
+import com.yami.shop.common.exception.YamiShopBindException;
+import com.yami.shop.common.util.IPHelper;
+import com.yami.shop.common.util.PrincipalUtil;
+import com.yami.shop.common.util.RedisUtil;
+import com.yami.shop.config.WxConfig;
+import com.yami.shop.security.api.model.YamiUser;
+import com.yami.shop.security.api.service.YamiUserDetailsService;
+import com.yami.shop.security.api.util.SecurityUtils;
+import com.yami.shop.security.comment.enums.App;
+import com.yami.shop.security.comment.exception.BadCredentialsException;
+import com.yami.shop.security.comment.handler.LoginAuthSuccessHandler;
+import com.yami.shop.security.comment.model.AppConnect;
+import com.yami.shop.security.comment.service.AppConnectService;
+import com.yami.shop.security.comment.token.AuthenticationToken;
+import com.yami.shop.service.SmsLogService;
+import com.yami.shop.service.UserService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.AllArgsConstructor;
+import org.springframework.http.ResponseEntity;
+import org.springframework.security.core.context.SecurityContextHolder;
+import org.springframework.security.core.userdetails.UserDetails;
+import org.springframework.security.crypto.password.PasswordEncoder;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.validation.Valid;
+import java.util.Date;
+import java.util.Objects;
+
+/**
+ * 用户信息
+ * @author LGH
+ */
+@RestController
+@RequestMapping("/user")
+@Api(tags="用户注册相关接口")
+@AllArgsConstructor
+public class UserRegisterController {
+
+	private final UserService userService;
+
+	private final SmsLogService smsLogService;
+
+	private final AppConnectService appConnectService;
+
+	private final LoginAuthSuccessHandler loginAuthSuccessHandler;
+
+	private final WxConfig wxConfig;
+
+	private final YamiUserDetailsService yamiUserDetailsService;
+
+	private final PasswordEncoder passwordEncoder;
+
+
+	public static final String CHECK_REGISTER_SMS_FLAG = "checkRegisterSmsFlag";
+
+	public static final String CHECK_UPDATE_PWD_SMS_FLAG = "updatePwdSmsFlag";
+
+	@PutMapping("/sendRegisterSms")
+	@ApiOperation(value="发送注册验证码", notes="发送注册验证码")
+	public ResponseEntity<Void> register(@Valid @RequestBody SendSmsParam sendSmsParam) {
+		if (userService.count(new LambdaQueryWrapper<User>().eq(User::getUserMobile, sendSmsParam.getMobile())) > 0) {
+			throw new YamiShopBindException("该手机号已注册,无法重新注册");
+		}
+		// 每个手机号每分钟只能发十个注册的验证码,免得接口被利用
+		smsLogService.sendSms(SmsType.REGISTER, sendSmsParam.getMobile(), sendSmsParam.getMobile(), Maps.newHashMap());
+		return ResponseEntity.ok().build();
+	}
+
+	@PutMapping("/checkRegisterSms")
+	@ApiOperation(value="校验验证码", notes="校验验证码返回校验成功的标识")
+	public ResponseEntity<String> register(@Valid @RequestBody CheckRegisterSmsParam checkRegisterSmsParam) {
+		// 每个ip每分钟只能发十个注册的验证码,免得接口被利用
+		if (!smsLogService.checkValidCode(checkRegisterSmsParam.getMobile(), checkRegisterSmsParam.getValidCode(), SmsType.REGISTER)){
+			throw new YamiShopBindException("验证码有误或已过期");
+		}
+		String checkRegisterSmsFlag = IdUtil.simpleUUID();
+		RedisUtil.set(CHECK_REGISTER_SMS_FLAG + checkRegisterSmsFlag, checkRegisterSmsParam.getMobile(), 600);
+		return ResponseEntity.ok(checkRegisterSmsFlag);
+	}
+
+	@PutMapping("/sendBindSms")
+	@ApiOperation(value="发送绑定验证码", notes="发送绑定验证码")
+	public ResponseEntity<Void> bindSms(@Valid @RequestBody SendSmsParam sendSmsParam) {
+		// 每个手机号每分钟只能发十个注册的验证码,免得接口被利用
+		smsLogService.sendSms(SmsType.VALID, sendSmsParam.getMobile(), sendSmsParam.getMobile(), Maps.newHashMap());
+		return ResponseEntity.ok().build();
+	}
+
+	@PutMapping("/registerOrBindUser")
+	@ApiOperation(value="注册或绑定手机号", notes="用户注册或绑定手机号接口")
+	public ResponseEntity<Void> register(HttpServletRequest request, HttpServletResponse response, @Valid @RequestBody UserRegisterParam userRegisterParam) {
+
+		String mobile = userRegisterParam.getMobile();
+		AppConnect appConnect = null;
+		User user = null;
+		String bizUserId = null;
+
+
+		// 正在进行注册,通过验证码校验
+		if (Objects.equals(userRegisterParam.getRegisterOrBind(), 1)) {
+
+			// 看看有没有校验验证码成功的标识
+			userService.validate(userRegisterParam, CHECK_REGISTER_SMS_FLAG + userRegisterParam.getCheckRegisterSmsFlag());
+			// 正在进行申请注册
+			if (userService.count(new LambdaQueryWrapper<User>().eq(User::getUserMobile,userRegisterParam.getMobile())) > 0) {
+				throw new YamiShopBindException("手机号已存在,无法注册");
+			}
+		}
+		// 小程序注册/绑定手机号
+		else {
+			YamiUser yamiUser =  SecurityUtils.getUser();
+			appConnect = appConnectService.getByBizUserId(yamiUser.getBizUserId(), yamiUser.getAppType());
+			bizUserId = yamiUser.getBizUserId();
+			// 通过微信手机号校验
+			if (Objects.equals(2, userRegisterParam.getValidateType())) {
+				try {
+					WxMaPhoneNumberInfo wxMaPhoneNumberInfo = wxConfig.getWxMaService().getUserService().getPhoneNoInfo(yamiUser.getSessionKey(), userRegisterParam.getEncryptedData(), userRegisterParam.getIvStr());
+					mobile = wxMaPhoneNumberInfo.getPhoneNumber();
+
+				} catch (Exception e) {
+					throw new YamiShopBindException("授权失败,请重新授权");
+				}
+				if (StrUtil.isBlank(mobile)) {
+					throw new YamiShopBindException("无法获取用户手机号信息");
+				}
+				user = yamiUserDetailsService.loadUserByMobileOrUserName(mobile, 0);
+			}
+			// 通过账号密码校验
+			else if (Objects.equals(3, userRegisterParam.getValidateType())) {
+				user = yamiUserDetailsService.loadUserByMobileOrUserName(mobile, 0);
+				if (user == null) {
+					throw new YamiShopBindException("账号或密码不正确");
+				}
+				String encodedPassword = user.getLoginPassword();
+				String rawPassword = userRegisterParam.getPassword();
+				// 密码不正确
+				if (StrUtil.isBlank(encodedPassword) || !passwordEncoder.matches(rawPassword,encodedPassword)){
+					throw new YamiShopBindException("账号或密码不正确");
+				}
+			}
+			// 通过验证码校验
+			else {
+				if (!smsLogService.checkValidCode(userRegisterParam.getMobile(), userRegisterParam.getValidCode(), SmsType.VALID)){
+					throw new YamiShopBindException("验证码有误或已过期");
+				}
+			}
+		}
+
+		Date now = new Date();
+
+		// 尝试用手机号获取用户信息
+		if (user == null && StrUtil.isNotBlank(mobile)) {
+			user = userService.getOne(new LambdaQueryWrapper<User>().eq(User::getUserMobile,mobile));
+		}
+
+		// 新建用户
+		if (user == null) {
+			user = new User();
+			if (StrUtil.isBlank(userRegisterParam.getUserName())) {
+				userRegisterParam.setUserName(mobile);
+			}
+
+			// 如果有用户名,就判断用户名格式是否正确
+			if (!PrincipalUtil.isUserName(userRegisterParam.getUserName())) {
+				throw new YamiShopBindException("用户名应由4-16位数字字母下划线组成");
+			}
+
+			user.setModifyTime(now);
+			user.setUserRegtime(now);
+			user.setUserRegip(IPHelper.getIpAddr());
+			user.setStatus(1);
+
+			user.setPic(userRegisterParam.getImg());
+			user.setUserMobile(mobile);
+			user.setUserName(userRegisterParam.getUserName());
+			if (StrUtil.isNotBlank(userRegisterParam.getPassword())) {
+				user.setLoginPassword(passwordEncoder.encode(userRegisterParam.getPassword()));
+			}
+			// 用户名就是默认的昵称
+			user.setNickName(StrUtil.isBlank(userRegisterParam.getNickName())? userRegisterParam.getUserName(): userRegisterParam.getNickName());
+		}
+
+
+		appConnectService.registerOrBindUser(user, appConnect, userRegisterParam.getAppType());
+
+
+		//进行授权登录
+		UserDetails userDetails = yamiUserDetailsService.getYamiUser(userRegisterParam.getAppType(),user, bizUserId);
+		AuthenticationToken authenticationToken = new AuthenticationToken();
+		authenticationToken.setPrincipal(user.getUserMobile());
+		authenticationToken.setCredentials(user.getLoginPassword());
+		authenticationToken.setPrincipal(userDetails.getUsername());
+		authenticationToken.setDetails(userDetails);
+		authenticationToken.setAuthenticated(true);
+		loginAuthSuccessHandler.onAuthenticationSuccess(request,response,authenticationToken);
+
+		return ResponseEntity.ok().build();
+	}
+
+
+	@PutMapping("/checkUpdatePwdSms")
+	@ApiOperation(value="修改密码校验验证码", notes="校验验证码返回校验成功的标识")
+	public ResponseEntity<String> checkUpdatePwdSms(@Valid @RequestBody CheckRegisterSmsParam checkRegisterSmsParam) {
+		User user = userService.getOne(new LambdaQueryWrapper<User>().eq(User::getUserMobile, checkRegisterSmsParam.getMobile()));
+		if (user == null) {
+			throw new YamiShopBindException("无法获取用户信息");
+		}
+		if (!smsLogService.checkValidCode(user.getUserMobile(), checkRegisterSmsParam.getValidCode(), SmsType.UPDATE_PASSWORD)){
+			throw new YamiShopBindException("验证码有误或已过期");
+		}
+		String checkRegisterSmsFlag = IdUtil.simpleUUID();
+		RedisUtil.set(CHECK_UPDATE_PWD_SMS_FLAG + checkRegisterSmsFlag, checkRegisterSmsParam.getMobile(), 600);
+		return ResponseEntity.ok(checkRegisterSmsFlag);
+	}
+
+	@PutMapping("/updatePwd")
+	@ApiOperation(value="修改密码", notes="修改密码")
+	public ResponseEntity<Void> updatePwd(@Valid @RequestBody UserRegisterParam userRegisterParam) {
+		User user = userService.getOne(new LambdaQueryWrapper<User>().eq(User::getUserMobile, userRegisterParam.getMobile()));
+		if (user == null) {
+			throw new YamiShopBindException("无法获取用户信息");
+		}
+		// 看看有没有校验验证码成功的标识
+		userService.validate(userRegisterParam, CHECK_UPDATE_PWD_SMS_FLAG + userRegisterParam.getCheckRegisterSmsFlag());
+		if (StrUtil.isBlank(userRegisterParam.getPassword())) {
+			throw new YamiShopBindException("新密码不能为空");
+		}
+		if (StrUtil.equals(passwordEncoder.encode(userRegisterParam.getPassword()),user.getLoginPassword())) {
+			throw new YamiShopBindException("新密码不能与原密码相同!");
+		}
+		user.setModifyTime(new Date());
+		user.setLoginPassword(passwordEncoder.encode(userRegisterParam.getPassword()));
+		userService.updateById(user);
+		return ResponseEntity.ok().build();
+	}
+}

+ 135 - 0
yami-shop-api/src/main/java/com/yami/shop/api/listener/ConfirmOrderListener.java

@@ -0,0 +1,135 @@
+/*
+ * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved.
+ *
+ * https://www.gz-yami.com/
+ *
+ * 未经允许,不可做商业用途!
+ *
+ * 版权所有,侵权必究!
+ */
+
+package com.yami.shop.api.listener;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.yami.shop.bean.app.dto.ShopCartItemDto;
+import com.yami.shop.bean.app.dto.ShopCartOrderDto;
+import com.yami.shop.bean.app.param.OrderParam;
+import com.yami.shop.bean.enums.DvyType;
+import com.yami.shop.bean.event.ConfirmOrderEvent;
+import com.yami.shop.bean.model.FreightFeeReduction;
+import com.yami.shop.bean.model.Product;
+import com.yami.shop.bean.model.Sku;
+import com.yami.shop.bean.model.UserAddr;
+import com.yami.shop.bean.order.ConfirmOrderOrder;
+import com.yami.shop.common.exception.YamiShopBindException;
+import com.yami.shop.common.util.Arith;
+import com.yami.shop.delivery.comment.service.TransportManagerService;
+import com.yami.shop.security.api.util.SecurityUtils;
+import com.yami.shop.service.FreightFeeReductionService;
+import com.yami.shop.service.ProductService;
+import com.yami.shop.service.SkuService;
+import com.yami.shop.service.UserAddrService;
+import lombok.AllArgsConstructor;
+import org.springframework.context.event.EventListener;
+import org.springframework.core.annotation.Order;
+import org.springframework.stereotype.Component;
+
+import java.time.LocalDateTime;
+import java.util.List;
+import java.util.Objects;
+import java.util.stream.Collectors;
+
+/**
+ * 确认订单信息时的默认操作
+ *
+ * @author LGH
+ */
+@Component("defaultConfirmOrderListener")
+@AllArgsConstructor
+public class ConfirmOrderListener {
+
+    private final UserAddrService userAddrService;
+
+    private final TransportManagerService transportManagerService;
+
+    private final ProductService productService;
+
+    private final SkuService skuService;
+
+    private final FreightFeeReductionService freightFeeReductionService;
+
+    /**
+     * 计算订单金额
+     */
+    @EventListener(ConfirmOrderEvent.class)
+    @Order(ConfirmOrderOrder.DEFAULT)
+    public void defaultConfirmOrderEvent(ConfirmOrderEvent event) {
+
+
+        ShopCartOrderDto shopCartOrderDto = event.getShopCartOrderDto();
+
+        OrderParam orderParam = event.getOrderParam();
+
+        String userId = SecurityUtils.getUser().getUserId();
+
+        // 订单的地址信息
+        UserAddr userAddr = userAddrService.getUserAddrByUserId(orderParam.getAddrId(), userId);
+
+
+        double total = 0.0;
+
+        int totalCount = 0;
+
+        double transfee = 0.0;
+        shopCartOrderDto.setTotalWeight(Double.valueOf(0));
+
+        // 重新计算运费时用到
+        List<ShopCartItemDto> shopCartItems = event.getShopCartItems();
+
+        for (ShopCartItemDto shopCartItem : event.getShopCartItems()) {
+            // 获取商品信息
+            Product product = productService.getProductByProdId(shopCartItem.getProdId());
+            // 获取sku信息
+            Sku sku = skuService.getSkuBySkuId(shopCartItem.getSkuId());
+            if (product == null || sku == null) {
+                throw new YamiShopBindException("购物车包含无法识别的商品");
+            }
+            if (product.getStatus() != 1 || sku.getStatus() != 1) {
+                throw new YamiShopBindException("商品[" + sku.getProdName() + "]已下架");
+            }
+
+            totalCount = shopCartItem.getProdCount() + totalCount;
+            total = Arith.add(shopCartItem.getProductTotalAmount(), total);
+            // 用户地址如果为空,则表示该用户从未设置过任何地址相关信息
+            shopCartItem.setActualTotal(shopCartItem.getProductTotalAmount());
+            shopCartOrderDto.setTotalWeight(Arith.add(shopCartOrderDto.getTotalWeight(), Arith.mul(shopCartItem.getWeight(), shopCartItem.getProdCount())));
+        }
+
+        if (userAddr != null && !Objects.equals(orderParam.getDvyType(), DvyType.FETCH.value())) {
+            // 将所有订单传入处理,计算运费
+            transfee = transportManagerService.calculateTransfeeSecond2(shopCartItems.get(0).getShopId(), userAddr);
+        }
+
+        Double freeTransfee = 0.0;
+        List<FreightFeeReduction> feeReductions = freightFeeReductionService.list(new LambdaQueryWrapper<FreightFeeReduction>()
+                        .eq(FreightFeeReduction::getStatus, 1)
+                        .ge(FreightFeeReduction::getEndTime, LocalDateTime.now())
+//                .orderByAsc(FreightFeeReduction::getEndTime)
+        );
+        if (!feeReductions.isEmpty()) {
+            for (FreightFeeReduction feeReduction : feeReductions) {
+                freeTransfee += Arith.add(feeReduction.getMoney().doubleValue(), freeTransfee);
+            }
+        }
+        double sub = Arith.sub(transfee, freeTransfee);
+        transfee = Math.signum(sub) < 0 ? 0 : sub;
+
+        shopCartOrderDto.setTotal(total);
+        shopCartOrderDto.setTotalCount(totalCount);
+        shopCartOrderDto.setActualTotal(Arith.add(total, transfee));
+        shopCartOrderDto.setTransfee(transfee);
+        shopCartOrderDto.setFreeTransfee(freeTransfee);
+
+
+    }
+}

+ 53 - 0
yami-shop-api/src/main/java/com/yami/shop/api/listener/ShopCartListener.java

@@ -0,0 +1,53 @@
+/*
+ * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved.
+ *
+ * https://www.gz-yami.com/
+ *
+ * 未经允许,不可做商业用途!
+ *
+ * 版权所有,侵权必究!
+ */
+
+package com.yami.shop.api.listener;
+
+import com.google.common.collect.Lists;
+import com.yami.shop.bean.app.dto.ShopCartDto;
+import com.yami.shop.bean.app.dto.ShopCartItemDiscountDto;
+import com.yami.shop.bean.app.dto.ShopCartItemDto;
+import com.yami.shop.bean.event.ShopCartEvent;
+import com.yami.shop.bean.order.ShopCartEventOrder;
+import org.springframework.context.event.EventListener;
+import org.springframework.core.annotation.Order;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+
+/**
+ * 默认的购物车链进行组装时的操作
+ * @author LGH
+ */
+@Component("defaultShopCartListener")
+public class ShopCartListener {
+
+    /**
+     * 将店铺下的所有商品归属到该店铺的购物车当中
+     * @param event#getShopCart() 购物车
+     * @param event#shopCartItemDtoList 该购物车的商品
+     * @return 是否继续组装
+     */
+    @EventListener(ShopCartEvent.class)
+    @Order(ShopCartEventOrder.DEFAULT)
+    public void defaultShopCartEvent(ShopCartEvent event) {
+        ShopCartDto shopCart = event.getShopCartDto();
+        List<ShopCartItemDto> shopCartItemDtoList = event.getShopCartItemDtoList();
+        // 对数据进行组装
+        List<ShopCartItemDiscountDto> shopCartItemDiscountDtoList = Lists.newArrayList();
+        ShopCartItemDiscountDto shopCartItemDiscountDto = new ShopCartItemDiscountDto();
+
+        shopCartItemDiscountDto.setShopCartItems(shopCartItemDtoList);
+        shopCartItemDiscountDtoList.add(shopCartItemDiscountDto);
+
+        shopCart.setShopCartItemDiscounts(shopCartItemDiscountDtoList);
+    }
+
+}

+ 306 - 0
yami-shop-api/src/main/java/com/yami/shop/api/listener/SubmitOrderListener.java

@@ -0,0 +1,306 @@
+/*
+ * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved.
+ *
+ * https://www.gz-yami.com/
+ *
+ * 未经允许,不可做商业用途!
+ *
+ * 版权所有,侵权必究!
+ */
+
+package com.yami.shop.api.listener;
+
+import cn.hutool.core.lang.Snowflake;
+import cn.hutool.core.util.StrUtil;
+import com.yami.shop.bean.app.dto.ShopCartItemDiscountDto;
+import com.yami.shop.bean.app.dto.ShopCartItemDto;
+import com.yami.shop.bean.app.dto.ShopCartOrderDto;
+import com.yami.shop.bean.app.dto.ShopCartOrderMergerDto;
+import com.yami.shop.bean.enums.OrderStatus;
+import com.yami.shop.bean.enums.OrderType;
+import com.yami.shop.bean.event.SubmitOrderEvent;
+import com.yami.shop.bean.model.*;
+import com.yami.shop.bean.order.SubmitOrderOrder;
+import com.yami.shop.common.exception.YamiShopBindException;
+import com.yami.shop.common.util.Arith;
+import com.yami.shop.dao.*;
+import com.yami.shop.security.api.util.SecurityUtils;
+import com.yami.shop.service.ProductService;
+import com.yami.shop.service.SkuService;
+import com.yami.shop.service.UserAddrOrderService;
+import lombok.AllArgsConstructor;
+import ma.glasnost.orika.MapperFacade;
+import org.apache.commons.collections.CollectionUtils;
+import org.springframework.context.event.EventListener;
+import org.springframework.core.annotation.Order;
+import org.springframework.stereotype.Component;
+
+import java.util.*;
+
+/**
+ * 确认订单信息时的默认操作
+ *
+ * @author LGH
+ */
+@Component("defaultSubmitOrderListener")
+@AllArgsConstructor
+public class SubmitOrderListener {
+
+
+    private final MapperFacade mapperFacade;
+
+    private final UserAddrOrderService userAddrOrderService;
+
+    private final ProductService productService;
+
+    private final SkuService skuService;
+
+    private final Snowflake snowflake;
+
+    private final OrderItemMapper orderItemMapper;
+
+    private final SkuMapper skuMapper;
+
+    private final ProductMapper productMapper;
+
+    private final OrderMapper orderMapper;
+
+    private final OrderSettlementMapper orderSettlementMapper;
+
+    private final BasketMapper basketMapper;
+
+    /**
+     * 计算订单金额
+     */
+    @EventListener(SubmitOrderEvent.class)
+    @Order(SubmitOrderOrder.DEFAULT)
+    public void defaultSubmitOrderListener(SubmitOrderEvent event) {
+        Date now = new Date();
+        String userId = SecurityUtils.getUser().getUserId();
+
+        ShopCartOrderMergerDto mergerOrder = event.getMergerOrder();
+
+        // 订单商品参数
+        List<ShopCartOrderDto> shopCartOrders = mergerOrder.getShopCartOrders();
+
+        List<Long> basketIds = new ArrayList<>();
+        // 商品skuid为key 需要更新的sku为value的map
+        Map<Long, Sku> skuStocksMap = new HashMap<>(16);
+        // 商品productid为key 需要更新的product为value的map
+        Map<Long, Product> prodStocksMap = new HashMap<>(16);
+
+        // 把订单地址保存到数据库
+        UserAddrOrder userAddrOrder = mapperFacade.map(mergerOrder.getUserAddr(), UserAddrOrder.class);
+        if (userAddrOrder == null) {
+            throw new YamiShopBindException("请填写收货地址");
+        }
+        userAddrOrder.setUserId(userId);
+        userAddrOrder.setCreateTime(now);
+        userAddrOrderService.save(userAddrOrder);
+
+        // 订单地址id
+        Long addrOrderId = userAddrOrder.getAddrOrderId();
+
+        if(CollectionUtils.isNotEmpty(shopCartOrders)) {
+            // 每个店铺生成一个订单
+            for (ShopCartOrderDto shopCartOrderDto : shopCartOrders) {
+                Double sumPlatformAmount = 0.0;
+                // 使用雪花算法生成的订单号
+                String orderNumber = String.valueOf(snowflake.nextId());
+                shopCartOrderDto.setOrderNumber(orderNumber);
+
+                Long shopId = shopCartOrderDto.getShopId();
+
+                // 订单商品名称
+                StringBuilder orderProdName = new StringBuilder(100);
+
+                List<OrderItem> orderItems = new ArrayList<>();
+
+                List<ShopCartItemDiscountDto> shopCartItemDiscounts = shopCartOrderDto.getShopCartItemDiscounts();
+                for (ShopCartItemDiscountDto shopCartItemDiscount : shopCartItemDiscounts) {
+                    List<ShopCartItemDto> shopCartItems = shopCartItemDiscount.getShopCartItems();
+                    for (ShopCartItemDto shopCartItem : shopCartItems) {
+                        Sku sku = checkAndGetSku(shopCartItem.getSkuId(), shopCartItem, skuStocksMap);
+                        Product product = checkAndGetProd(shopCartItem.getProdId(), shopCartItem, prodStocksMap);
+                        OrderItem orderItem = new OrderItem();
+                        orderItem.setShopId(shopId);
+                        orderItem.setOrderNumber(orderNumber);
+                        orderItem.setSkuId(sku.getSkuId());
+                        orderItem.setProdId(sku.getProdId());
+                        orderItem.setSkuName(sku.getSkuName());
+                        orderItem.setProdCount(shopCartItem.getProdCount());
+                        orderItem.setProdName(sku.getProdName());
+                        orderItem.setPic(StrUtil.isBlank(sku.getPic()) ? product.getPic() : sku.getPic());
+                        orderItem.setPrice(shopCartItem.getPrice());
+                        orderItem.setUserId(userId);
+                        orderItem.setProductTotalAmount(shopCartItem.getProductTotalAmount());
+                        orderItem.setRecTime(now);
+                        orderItem.setCommSts(0);
+                        orderItem.setBasketDate(shopCartItem.getBasketDate());
+                        //平台的补贴优惠金额
+                        orderItem.setPlatformShareReduce(shopCartItem.getPlatformShareReduce());
+                        // 实际订单项支付金额
+                        orderItem.setActualTotal(shopCartItem.getActualTotal());
+                        // 分摊优惠金额
+                        orderItem.setShareReduce(shopCartItem.getShareReduce());
+                        orderProdName.append(orderItem.getProdName()).append(",");
+                        //推广员卡号
+                        orderItem.setDistributionCardNo(shopCartItem.getDistributionCardNo());
+                        //使用积分价格
+                        orderItem.setUseScore(shopCartItem.getScorePrice());
+                        orderItems.add(orderItem);
+
+                        if (shopCartItem.getBasketId() != null && shopCartItem.getBasketId() != 0) {
+                            basketIds.add(shopCartItem.getBasketId());
+                        }
+                    }
+
+                }
+
+
+                orderProdName.subSequence(0, Math.min(orderProdName.length() - 1, 100));
+                if (orderProdName.lastIndexOf(",") == orderProdName.length() - 1) {
+                    orderProdName.deleteCharAt(orderProdName.length() - 1);
+                }
+
+
+                // 订单信息
+                com.yami.shop.bean.model.Order order = new com.yami.shop.bean.model.Order();
+
+                order.setShopId(shopId);
+                order.setOrderNumber(orderNumber);
+                // 订单商品名称
+                order.setProdName(orderProdName.toString());
+                // 用户id
+                order.setUserId(userId);
+                // 商品总额
+                order.setTotal(shopCartOrderDto.getTotal());
+                // 实际总额
+                order.setActualTotal(shopCartOrderDto.getActualTotal());
+                order.setStatus(OrderStatus.UNPAY.value());
+                order.setUpdateTime(now);
+                order.setCreateTime(now);
+                order.setIsPayed(0);
+                order.setDeleteStatus(0);
+                order.setProductNums(shopCartOrderDto.getTotalCount());
+                order.setAddrOrderId(addrOrderId);
+                order.setDvyType(1);
+                order.setReduceAmount(shopCartOrderDto.getShopReduce());
+                order.setFreightAmount(shopCartOrderDto.getTransfee());
+                order.setRemarks(shopCartOrderDto.getRemarks());
+                order.setOrderType(OrderType.ORDINARY.value());
+                order.setPlatformAmount(shopCartOrderDto.getPlatformAmount());
+                order.setOrderItems(orderItems);
+                order.setScore(shopCartOrderDto.getUseScore());
+                order.setDvyType(mergerOrder.getDvyType());
+                event.getOrders().add(order);
+                // 插入订单结算表
+                OrderSettlement orderSettlement = new OrderSettlement();
+                orderSettlement.setUserId(userId);
+                orderSettlement.setIsClearing(0);
+                orderSettlement.setCreateTime(now);
+                orderSettlement.setOrderNumber(orderNumber);
+                orderSettlement.setPayAmount(order.getActualTotal());
+                orderSettlement.setPayStatus(0);
+                orderSettlement.setVersion(0);
+                orderSettlement.setPayScore(0);
+                //如果用使用积分,结算表将积分价格插入
+                if(mergerOrder.getIsScorePay() != null && mergerOrder.getIsScorePay() == 1){
+                    orderSettlement.setPayScore(shopCartOrderDto.getUseScore());
+                }
+                orderSettlementMapper.insert(orderSettlement);
+            }
+        }
+
+        // 删除购物车的商品信息
+        if (!basketIds.isEmpty()) {
+            basketMapper.deleteShopCartItemsByBasketIds(userId, basketIds);
+        }
+
+
+        // 更新sku库存
+        skuStocksMap.forEach((key, sku) -> {
+
+            if (skuMapper.updateStocks(sku) == 0) {
+                skuService.removeSkuCacheBySkuId(key, sku.getProdId());
+                productService.removeProductCacheByProdId(sku.getProdId());
+                throw new YamiShopBindException("商品:[" + sku.getProdName() + "]库存不足");
+            }
+        });
+
+        // 更新商品库存
+        prodStocksMap.forEach((prodId, prod) -> {
+
+            if (productMapper.updateStocks(prod) == 0) {
+                productService.removeProductCacheByProdId(prodId);
+                throw new YamiShopBindException("商品:[" + prod.getProdName() + "]库存不足");
+            }
+        });
+
+    }
+
+    @SuppressWarnings({"Duplicates"})
+    private Product checkAndGetProd(Long prodId, ShopCartItemDto shopCartItem, Map<Long, Product> prodStocksMap) {
+        Product product = productService.getProductByProdId(prodId);
+        if (product == null) {
+            throw new YamiShopBindException("购物车包含无法识别的商品");
+        }
+
+        if (product.getStatus() != 1) {
+            throw new YamiShopBindException("商品[" + product.getProdName() + "]已下架");
+        }
+
+        // 商品需要改变的库存
+        Product mapProduct = prodStocksMap.get(prodId);
+
+        if (mapProduct == null) {
+            mapProduct = new Product();
+            mapProduct.setTotalStocks(0);
+            mapProduct.setProdId(prodId);
+            mapProduct.setProdName(product.getProdName());
+
+        }
+
+        if (product.getTotalStocks() != -1) {
+            mapProduct.setTotalStocks(mapProduct.getTotalStocks() + shopCartItem.getProdCount());
+            prodStocksMap.put(product.getProdId(), mapProduct);
+        }
+
+        // -1为无限库存
+        if (product.getTotalStocks() != -1 && mapProduct.getTotalStocks() > product.getTotalStocks()) {
+            throw new YamiShopBindException("商品:[" + product.getProdName() + "]库存不足");
+        }
+
+        return product;
+    }
+
+    @SuppressWarnings({"Duplicates"})
+    private Sku checkAndGetSku(Long skuId, ShopCartItemDto shopCartItem, Map<Long, Sku> skuStocksMap) {
+        // 获取sku信息
+        Sku sku = skuService.getSkuBySkuId(skuId);
+        if (sku == null) {
+            throw new YamiShopBindException("购物车包含无法识别的商品");
+        }
+
+        if (sku.getStatus() != 1) {
+            throw new YamiShopBindException("商品[" + sku.getProdName() + "]已下架");
+        }
+        // -1为无限库存
+        if (sku.getStocks() != -1 && shopCartItem.getProdCount() > sku.getStocks()) {
+            throw new YamiShopBindException("商品:[" + sku.getProdName() + "]库存不足");
+        }
+
+        if (sku.getStocks() != -1) {
+            Sku mapSku = new Sku();
+            mapSku.setProdId(sku.getProdId());
+            // 这里的库存是改变的库存
+            mapSku.setStocks(shopCartItem.getProdCount());
+            mapSku.setSkuId(sku.getSkuId());
+            mapSku.setProdName(sku.getProdName());
+            skuStocksMap.put(sku.getSkuId(), mapSku);
+        }
+        return sku;
+    }
+
+
+}

+ 21 - 0
yami-shop-api/src/main/resources/application-dev.yml

@@ -0,0 +1,21 @@
+server:
+  port: 8112
+spring:
+  datasource:
+    url: jdbc:mysql://120.79.140.200:3306/yami_bbc?allowMultiQueries=true&useSSL=false&useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&zeroDateTimeBehavior=convertToNull&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=GMT%2B8&nullCatalogMeansCurrent=true
+    username: root
+    password: 123456
+    driver-class-name: com.mysql.cj.jdbc.Driver
+    type: com.zaxxer.hikari.HikariDataSource
+    hikari:
+      minimum-idle: 0
+      maximum-pool-size: 100
+      idle-timeout: 10000
+      auto-commit: true
+      connection-test-query: select 1
+  redis:
+    redisson:
+      config: classpath:redisson/redisson-dev.yml
+logging:
+  config: classpath:logback/logback-dev.xml
+

+ 20 - 0
yami-shop-api/src/main/resources/application-docker.yml

@@ -0,0 +1,20 @@
+server:
+  port: 8112
+spring:
+  datasource:
+    url: jdbc:mysql://mall4j-mysql:3306/yami_bbc?allowMultiQueries=true&useSSL=false&useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&zeroDateTimeBehavior=convertToNull&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=GMT%2B8&nullCatalogMeansCurrent=true
+    username: root
+    password: root
+    driver-class-name: com.mysql.cj.jdbc.Driver
+    type: com.zaxxer.hikari.HikariDataSource
+    hikari:
+      minimum-idle: 0
+      maximum-pool-size: 20
+      idle-timeout: 25000
+      auto-commit: true
+      connection-test-query: select 1
+  redis:
+    redisson:
+      config: classpath:redisson/redisson-docker.yml
+logging:
+  config: classpath:logback/logback-docker.xml

+ 20 - 0
yami-shop-api/src/main/resources/application-prod.yml

@@ -0,0 +1,20 @@
+server:
+  port: 8112
+spring:
+  datasource:
+    url: jdbc:mysql://172.23.240.101:3306/yami_bbc?allowMultiQueries=true&useSSL=false&useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&zeroDateTimeBehavior=convertToNull&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=GMT%2B8&nullCatalogMeansCurrent=true
+    username: root
+    password: TtbTeGJBnDvH4hMx
+    driver-class-name: com.mysql.cj.jdbc.Driver
+    type: com.zaxxer.hikari.HikariDataSource
+    hikari:
+      minimum-idle: 0
+      maximum-pool-size: 20
+      idle-timeout: 25000
+      auto-commit: true
+      connection-test-query: select 1
+  redis:
+    redisson:
+      config: classpath:redisson/redisson-prod.yml
+logging:
+  config: classpath:logback/logback-prod.xml

+ 62 - 0
yami-shop-api/src/main/resources/application.yml

@@ -0,0 +1,62 @@
+
+spring:
+  # 环境 dev|prod|docker
+  profiles:
+    active: dev
+  #文件上传设置
+  servlet:
+    multipart:
+      max-file-size: 100MB
+      max-request-size: 100MB
+      enabled: true
+  jackson:
+    date-format: yyyy-MM-dd HH:mm:ss
+    time-zone: GMT+8
+  mvc:
+    formcontent:
+      filter:
+        enabled: false
+  autoconfigure:
+    exclude: org.springframework.boot.autoconfigure.jmx.JmxAutoConfiguration,\
+      org.springframework.boot.autoconfigure.gson.GsonAutoConfiguration,\
+      org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration,\
+      org.springframework.boot.autoconfigure.jdbc.XADataSourceAutoConfiguration,\
+      org.springframework.boot.autoconfigure.jdbc.JndiDataSourceAutoConfiguration,\
+      org.springframework.boot.autoconfigure.transaction.jta.JtaAutoConfiguration,\
+      org.springframework.boot.autoconfigure.websocket.WebSocketAutoConfiguration,\
+      org.springframework.boot.autoconfigure.websocket.WebSocketMessagingAutoConfiguration,\
+      org.springframework.boot.autoconfigure.freemarker.FreeMarkerAutoConfiguration,\
+      org.springframework.boot.autoconfigure.groovy.template.GroovyTemplateAutoConfiguration,\
+      org.springframework.boot.autoconfigure.mustache.MustacheAutoConfiguration,\
+      org.springframework.boot.autoconfigure.mail.MailSenderAutoConfiguration,\
+      org.springframework.boot.autoconfigure.mail.MailSenderValidatorAutoConfiguration,\
+      org.springframework.boot.actuate.autoconfigure.TraceRepositoryAutoConfiguration,\
+      org.springframework.boot.actuate.autoconfigure.TraceWebFilterAutoConfiguration,\
+      org.springframework.boot.actuate.autoconfigure.MetricFilterAutoConfiguration
+# mybaits-plus配置
+mybatis-plus:
+  # MyBatis Mapper所对应的XML文件位置
+  mapper-locations: classpath*:/mapper/*Mapper.xml
+  global-config:
+    # 关闭MP3.0自带的banner
+    banner: false
+    db-config:
+      # 主键类型 0:数据库ID自增 1.未定义 2.用户输入 3 id_worker 4.uuid 5.id_worker字符串表示
+      id-type: AUTO
+      #字段策略 0:"忽略判断",1:"非 NULL 判断"),2:"非空判断"
+      insert-strategy: NOT_NULL
+      update-strategy: NOT_NULL
+      select-strategy: NOT_NULL
+      # 默认数据库表下划线命名
+      table-underline: true
+
+management:
+  server:
+    add-application-context-header: false
+server:
+  tomcat:
+    basedir: /temp
+# 用于雪花算法生成id
+application:
+  datacenterId: 1
+  workerId: 1

+ 11 - 0
yami-shop-api/src/main/resources/banner.txt

@@ -0,0 +1,11 @@
+ .----------------.  .----------------.  .----------------.  .----------------.
+| .--------------. || .--------------. || .--------------. || .--------------. |
+| |  ____  ____  | || |      __      | || | ____    ____ | || |     _____    | |
+| | |_  _||_  _| | || |     /  \     | || ||_   \  /   _|| || |    |_   _|   | |
+| |   \ \  / /   | || |    / /\ \    | || |  |   \/   |  | || |      | |     | |
+| |    \ \/ /    | || |   / ____ \   | || |  | |\  /| |  | || |      | |     | |
+| |    _|  |_    | || | _/ /    \ \_ | || | _| |_\/_| |_ | || |     _| |_    | |
+| |   |______|   | || ||____|  |____|| || ||_____||_____|| || |    |_____|   | |
+| |              | || |              | || |              | || |              | |
+| '--------------' || '--------------' || '--------------' || '--------------' |
+ '----------------'  '----------------'  '----------------'  '----------------'

+ 14 - 0
yami-shop-api/src/main/resources/logback/logback-dev.xml

@@ -0,0 +1,14 @@
+<configuration scan="true" scanPeriod="60 seconds" debug="false">
+
+    <include resource="org/springframework/boot/logging/logback/defaults.xml" />
+    <include resource="org/springframework/boot/logging/logback/console-appender.xml" />
+
+    <root level="info">
+        <appender-ref ref="CONSOLE" />
+    </root>
+
+    <logger name="com.yami.shop" level="debug"/>
+    <logger name="springfox.documentation.swagger2" level="off"/>
+    <logger name="io.swagger.models.parameters" level="off"/>
+    <logger name="springfox.documentation.spring.web.readers.operation" level="off"/>
+</configuration>

+ 38 - 0
yami-shop-api/src/main/resources/logback/logback-docker.xml

@@ -0,0 +1,38 @@
+<configuration scan="true" scanPeriod="60 seconds" debug="false">
+    <property name="PROJECT_PATH" value="/opt/projects/yami-b2b2c"/>
+    <property name="LOG_FILE_MAX_HISTORY" value="30"/>
+    <property name="LOG_FILE_MAX_SIZE" value="50MB"/>
+
+
+    <include resource="org/springframework/boot/logging/logback/defaults.xml" />
+    <include resource="org/springframework/boot/logging/logback/console-appender.xml" />
+
+    <appender name="DefaultFile"
+              class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <append>true</append>
+        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
+            <pattern>${FILE_LOG_PATTERN}</pattern>
+            <charset>UTF-8</charset>
+        </encoder>
+        <file>${PROJECT_PATH}/log/api.log</file>
+
+        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
+            <level>${logging.level}</level>
+        </filter>
+        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
+            <fileNamePattern>${PROJECT_PATH}/log/api/%d{yyyy-MM}/api-%d{yyyy-MM-dd}-%i.log.gz</fileNamePattern>
+            <maxFileSize>${LOG_FILE_MAX_SIZE}</maxFileSize>
+            <maxHistory>${LOG_FILE_MAX_HISTORY}</maxHistory>
+        </rollingPolicy>
+    </appender>
+
+    <root level="debug">
+        <appender-ref ref="CONSOLE" />
+        <appender-ref ref="DefaultFile" />
+    </root>
+
+    <logger name="com.yami.shop" level="debug"/>
+    <logger name="springfox.documentation.swagger2" level="off"/>
+    <logger name="io.swagger.models.parameters" level="off"/>
+    <logger name="springfox.documentation.spring.web.readers.operation" level="off"/>
+</configuration>

+ 14 - 0
yami-shop-api/src/main/resources/logback/logback-prod.xml

@@ -0,0 +1,14 @@
+<configuration scan="true" scanPeriod="60 seconds" debug="false">
+
+    <include resource="org/springframework/boot/logging/logback/defaults.xml" />
+    <include resource="org/springframework/boot/logging/logback/console-appender.xml" />
+
+    <root level="info">
+        <appender-ref ref="CONSOLE" />
+    </root>
+
+    <logger name="com.yami.shop" level="debug"/>
+    <logger name="springfox.documentation.swagger2" level="off"/>
+    <logger name="io.swagger.models.parameters" level="off"/>
+    <logger name="springfox.documentation.spring.web.readers.operation" level="off"/>
+</configuration>

+ 31 - 0
yami-shop-api/src/main/resources/redisson/redisson-dev.yml

@@ -0,0 +1,31 @@
+# 单节点设置
+singleServerConfig:
+  address: redis://120.79.140.200:36379
+  database: 1
+  password: lx2020&
+  idleConnectionTimeout: 10000
+  pingTimeout: 1000
+  connectTimeout: 10000
+  timeout: 3000
+  retryAttempts: 3
+  retryInterval: 1500
+  reconnectionTimeout: 3000
+  failedAttempts: 3
+  clientName: null
+  # 发布和订阅连接的最小空闲连接数 默认1
+  subscriptionConnectionMinimumIdleSize: 1
+  # 发布和订阅连接池大小 默认50
+  subscriptionConnectionPoolSize: 1
+  # 单个连接最大订阅数量 默认5
+  subscriptionsPerConnection: 1
+  # 最小空闲连接数 默认32,现在暂时不需要那么多的线程
+  connectionMinimumIdleSize: 4
+  # connectionPoolSize 默认64,现在暂时不需要那么多的线程
+  connectionPoolSize: 4
+# 这个线程池数量被所有RTopic对象监听器,RRemoteService调用者和RExecutorService任务共同共享。
+threads: 0
+# 这个线程池数量是在一个Redisson实例内,被其创建的所有分布式数据类型和服务,以及底层客户端所一同共享的线程池里保存的线程数量。
+nettyThreads: 0
+codec:
+  class: org.redisson.codec.KryoCodec
+transportMode: NIO

+ 31 - 0
yami-shop-api/src/main/resources/redisson/redisson-docker.yml

@@ -0,0 +1,31 @@
+# 单节点设置
+singleServerConfig:
+  address: redis://mall4j-redis:6379
+  database: 1
+  password: null
+  idleConnectionTimeout: 10000
+  pingTimeout: 1000
+  connectTimeout: 10000
+  timeout: 3000
+  retryAttempts: 3
+  retryInterval: 1500
+  reconnectionTimeout: 3000
+  failedAttempts: 3
+  clientName: null
+  # 发布和订阅连接的最小空闲连接数 默认1
+  subscriptionConnectionMinimumIdleSize: 1
+  # 发布和订阅连接池大小 默认50
+  subscriptionConnectionPoolSize: 1
+  # 单个连接最大订阅数量 默认5
+  subscriptionsPerConnection: 1
+  # 最小空闲连接数 默认32,现在暂时不需要那么多的线程
+  connectionMinimumIdleSize: 4
+  # connectionPoolSize 默认64,现在暂时不需要那么多的线程
+  connectionPoolSize: 4
+# 这个线程池数量被所有RTopic对象监听器,RRemoteService调用者和RExecutorService任务共同共享。
+threads: 0
+# 这个线程池数量是在一个Redisson实例内,被其创建的所有分布式数据类型和服务,以及底层客户端所一同共享的线程池里保存的线程数量。
+nettyThreads: 0
+codec:
+  class: org.redisson.codec.KryoCodec
+transportMode: NIO

+ 31 - 0
yami-shop-api/src/main/resources/redisson/redisson-prod.yml

@@ -0,0 +1,31 @@
+# 单节点设置
+singleServerConfig:
+  address: redis://172.23.240.101:6379
+  database: 1
+  password: RUw3C4tAF0aE4PVC
+  idleConnectionTimeout: 10000
+  pingTimeout: 1000
+  connectTimeout: 10000
+  timeout: 3000
+  retryAttempts: 3
+  retryInterval: 1500
+  reconnectionTimeout: 3000
+  failedAttempts: 3
+  clientName: null
+  # 发布和订阅连接的最小空闲连接数 默认1
+  subscriptionConnectionMinimumIdleSize: 1
+  # 发布和订阅连接池大小 默认50
+  subscriptionConnectionPoolSize: 1
+  # 单个连接最大订阅数量 默认5
+  subscriptionsPerConnection: 1
+  # 最小空闲连接数 默认32,现在暂时不需要那么多的线程
+  connectionMinimumIdleSize: 4
+  # connectionPoolSize 默认64,现在暂时不需要那么多的线程
+  connectionPoolSize: 4
+# 这个线程池数量被所有RTopic对象监听器,RRemoteService调用者和RExecutorService任务共同共享。
+threads: 0
+# 这个线程池数量是在一个Redisson实例内,被其创建的所有分布式数据类型和服务,以及底层客户端所一同共享的线程池里保存的线程数量。
+nettyThreads: 0
+codec:
+  class: org.redisson.codec.KryoCodec
+transportMode: NIO

+ 26 - 0
yami-shop-bean/pom.xml

@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>yami-shop</artifactId>
+        <groupId>com.yami.shop</groupId>
+        <version>0.0.1-SNAPSHOT</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>yami-shop-bean</artifactId>
+
+
+    <dependencies>
+   		<dependency>
+            <groupId>com.yami.shop</groupId>
+            <artifactId>yami-shop-common</artifactId>
+            <version>${yami.shop.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-validation</artifactId>
+        </dependency>
+    </dependencies>
+</project>

+ 52 - 0
yami-shop-bean/src/main/java/com/yami/shop/bean/SmsInfoContext.java

@@ -0,0 +1,52 @@
+/*
+ * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved.
+ *
+ * https://www.gz-yami.com/
+ *
+ * 未经允许,不可做商业用途!
+ *
+ * 版权所有,侵权必究!
+ */
+
+package com.yami.shop.bean;
+
+import cn.hutool.core.collection.CollectionUtil;
+import com.yami.shop.bean.bo.SmsInfoBo;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class SmsInfoContext {
+
+	/** The request holder. */
+	private static ThreadLocal<List<SmsInfoBo>> smsInfoHolder = new ThreadLocal<List<SmsInfoBo>>();
+
+
+	public static List<SmsInfoBo> get(){
+
+		List<SmsInfoBo> list = smsInfoHolder.get();
+		if (CollectionUtil.isEmpty(list)) {
+			return new ArrayList<>();
+		}
+		return smsInfoHolder.get();
+	}
+	
+	public static void set(List<SmsInfoBo> smsInfoBos){
+		 smsInfoHolder.set(smsInfoBos);
+	}
+	
+	public static void put(SmsInfoBo smsInfoBo){
+		List<SmsInfoBo> smsInfoBos = smsInfoHolder.get();
+		if (CollectionUtil.isEmpty(smsInfoBos)) {
+			smsInfoBos = new ArrayList<>();
+		}
+		smsInfoBos.add(smsInfoBo);
+		smsInfoHolder.set(smsInfoBos);
+	}
+	
+	public static void clean() {
+		if (smsInfoHolder.get() != null) {
+			smsInfoHolder.remove();
+		}
+	}
+}

+ 141 - 0
yami-shop-bean/src/main/java/com/yami/shop/bean/app/dto/ApiOrderRefundDto.java

@@ -0,0 +1,141 @@
+package com.yami.shop.bean.app.dto;
+
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.yami.shop.bean.model.OrderItem;
+import com.yami.shop.bean.model.RefundAddr;
+import com.yami.shop.bean.model.RefundDelivery;
+import com.yami.shop.common.serializer.json.ImgJsonSerializer;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+@Data
+@ApiModel("退款订单对象")
+public class ApiOrderRefundDto {
+
+    @ApiModelProperty("记录ID")
+    private Long refundId;
+
+    @ApiModelProperty("订单编号")
+    private String orderNumber;
+
+    @ApiModelProperty("订单总金额")
+    private BigDecimal orderAmount;
+
+    @ApiModelProperty("退款编号")
+    private String refundSn;
+
+    @ApiModelProperty("第三方退款单号(微信/支付宝退款单号)")
+    private String orderPayNo;
+
+    @ApiModelProperty("订单支付方式(1 微信支付 2 支付宝)")
+    private Integer payType;
+
+    @ApiModelProperty("订单支付名称")
+    private String payTypeName;
+
+    @ApiModelProperty("退货数量")
+    private Integer goodsNum;
+
+    @ApiModelProperty("退款金额")
+    private Double refundAmount;
+
+    @ApiModelProperty("退还积分")
+    private Integer refundScore;
+
+    @ApiModelProperty("申请类型:1,仅退款,2退款退货")
+    private Integer applyType;
+
+    @ApiModelProperty("处理退款状态:(1.买家申请 2.卖家接受 3.买家发货 4.卖家收货 5.退款成功 6.买家撤回申请 7.商家拒绝 -1.退款关闭)")
+    private Integer returnMoneySts;
+
+    @ApiModelProperty("申请时间")
+    private Date applyTime;
+
+    @ApiModelProperty("卖家处理时间")
+    private Date handelTime;
+
+    @ApiModelProperty("退款时间")
+    private Date refundTime;
+
+    @ApiModelProperty("更新时间")
+    private Date updateTime;
+
+    @ApiModelProperty("订单支付时间")
+    private Date orderPayTime;
+
+    @ApiModelProperty("用户退货发货时间")
+    private Date shipTime;
+
+    @ApiModelProperty("卖家收到用户退货的货物时间")
+    private Date receiveTime;
+
+    @ApiModelProperty("撤销时间")
+    private Date cancelTime;
+
+    @ApiModelProperty("同意退款时间")
+    private Date decisionTime;
+
+    @ApiModelProperty("卖家拒绝时间")
+    private Date rejectTime;
+
+    @ApiModelProperty("文件凭证json")
+    @JsonSerialize(using = ImgJsonSerializer.class)
+    private String photoFiles;
+
+    @ApiModelProperty("收货地址对象")
+    private RefundDeliveryDto refundDelivery;
+
+    @ApiModelProperty("拒绝原因")
+    private String rejectMessage;
+
+    @ApiModelProperty("申请原因")
+    private String buyerReason;
+
+    @ApiModelProperty("申请说明")
+    private String buyerDesc;
+
+    @ApiModelProperty("订单项")
+    private List<RefundOrderItemDto> orderItems = new ArrayList<>();
+
+    @ApiModelProperty("店铺名称")
+    private String shopName;
+
+    @ApiModelProperty("true:可以取消退款  false:不可以取消退款")
+    private Boolean isCancel;
+
+    @ApiModelProperty("卖家备注")
+    private String sellerMsg;
+
+    /*
+ac
+    @ApiModelProperty("物流公司名称")
+    private String expressName;
+
+    @ApiModelProperty("物流单号")
+    private String expressNo;
+
+    @ApiModelProperty("发货时间")
+    private Date shipTime;
+
+    @ApiModelProperty("收货时间")
+    private Date receiveTime;
+
+    @ApiModelProperty("撤销时间")
+    private Date cancelTime;
+
+    @ApiModelProperty("决定时间")
+    private Date decisionTime;
+
+    @ApiModelProperty("退款申请状态(0:未申请 1:申请中 2:已完成 -1:失败)")
+    private Integer refundApplySts;
+
+    @ApiModelProperty("退款物流信息")
+    private RefundDelivery refundDelivery;*/
+
+}

+ 69 - 0
yami-shop-bean/src/main/java/com/yami/shop/bean/app/dto/BasketItemDto.java

@@ -0,0 +1,69 @@
+/*
+ * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved.
+ *
+ * https://www.gz-yami.com/
+ *
+ * 未经允许,不可做商业用途!
+ *
+ * 版权所有,侵权必究!
+ */
+
+package com.yami.shop.bean.app.dto;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.yami.shop.common.serializer.json.ImgJsonSerializer;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.List;
+
+@Data
+public class BasketItemDto implements Serializable {
+
+    @ApiModelProperty(value = "购物车ID", required = true)
+    private Long basketId;
+
+    @ApiModelProperty(value = "店铺ID", required = true)
+    private Long shopId;
+
+    /**
+     * 商品名称
+     */
+    @JsonIgnore
+    private String shopName;
+
+    @ApiModelProperty(value = "产品ID", required = true)
+    private Long prodId;
+
+    @ApiModelProperty(value = "skuID", required = true)
+    private Long skuId;
+
+    @ApiModelProperty(value = "产品个数", required = true)
+    private Integer prodCount;
+
+    @ApiModelProperty(value = "产品名称", required = true)
+    private String prodName;
+
+    @ApiModelProperty(value = "产品主图", required = true)
+    @JsonSerialize(using = ImgJsonSerializer.class)
+    private String pic;
+
+    @ApiModelProperty(value = "产品现价", required = true)
+    private Double price;
+
+    @ApiModelProperty(value = "产品原价", required = true)
+    private Double oriPrice;
+
+    @ApiModelProperty(value = "产品简介", required = true)
+    private String brief;
+
+    @ApiModelProperty(value = "产品sku信息", required = true)
+    private String skuName;
+
+    @ApiModelProperty("参与满减活动列表")
+    private List<DiscountDto> discounts;
+
+}

+ 43 - 0
yami-shop-bean/src/main/java/com/yami/shop/bean/app/dto/CategoryDto.java

@@ -0,0 +1,43 @@
+/*
+ * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved.
+ *
+ * https://www.gz-yami.com/
+ *
+ * 未经允许,不可做商业用途!
+ *
+ * 版权所有,侵权必究!
+ */
+
+package com.yami.shop.bean.app.dto;
+
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.yami.shop.bean.model.Category;
+import com.yami.shop.common.serializer.json.ImgJsonSerializer;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class CategoryDto {
+
+	@ApiModelProperty(value = "分类id",required=true)
+	private Long categoryId;
+
+	@ApiModelProperty(value = "分类父id",required=true)
+	private Long parentId;
+
+	@ApiModelProperty(value = "分类名称",required=true)
+	private String categoryName;
+
+	@ApiModelProperty(value = "分类图片",required=true)
+	@JsonSerialize(using = ImgJsonSerializer.class)
+	private String pic;
+
+	@ApiModelProperty(value = "分类图标",required=true)
+	@JsonSerialize(using = ImgJsonSerializer.class)
+	private String icon;
+
+	@ApiModelProperty(value = "子类分类列表",required=true)
+	private List<Category> categories;
+}

+ 54 - 0
yami-shop-bean/src/main/java/com/yami/shop/bean/app/dto/ChooseDiscountItemDto.java

@@ -0,0 +1,54 @@
+/*
+ * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved.
+ *
+ * https://www.gz-yami.com/
+ *
+ * 未经允许,不可做商业用途!
+ *
+ * 版权所有,侵权必究!
+ */
+
+package com.yami.shop.bean.app.dto;
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import io.swagger.annotations.ApiModelProperty;
+import io.swagger.models.auth.In;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * 购物车中选中的满减活动项信息
+ */
+@Data
+public class ChooseDiscountItemDto implements Serializable {
+
+    @ApiModelProperty("满减满折优惠id")
+    private Long discountId;
+
+    @ApiModelProperty("优惠规则(0:满钱减钱 1:满件减钱 2:满钱打折 3:满件打折)")
+    private Integer discountRule;
+
+    @ApiModelProperty(value = "优惠项id")
+    @JsonIgnore
+    private Long discountItemId;
+
+    @ApiModelProperty(value = "所需需要金额")
+    private Double needAmount;
+
+    @ApiModelProperty(value = "减免类型 0按满足最高层级减一次 1每满一次减一次")
+    private Integer discountType;
+
+    @ApiModelProperty(value = "参与满减满折优惠的商品数量")
+    private int prodCount = 0;
+
+    @ApiModelProperty(value = "参与满减满折优惠的商品金额")
+    private double prodsPrice = 0.00;
+
+    @ApiModelProperty(value = "优惠(元/折)")
+    private Double discount;
+
+    @ApiModelProperty(value = "参与满减满折优惠的金额")
+    private Double reduceAmount = 0.0;
+
+}

+ 122 - 0
yami-shop-bean/src/main/java/com/yami/shop/bean/app/dto/CouponDto.java

@@ -0,0 +1,122 @@
+/*
+ * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved.
+ *
+ * https://www.gz-yami.com/
+ *
+ * 未经允许,不可做商业用途!
+ *
+ * 版权所有,侵权必究!
+ */
+
+package com.yami.shop.bean.app.dto;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.yami.shop.common.serializer.json.ImgJsonSerializer;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.io.Serializable;
+import java.util.Date;
+import java.util.List;
+
+@Data
+@ApiModel("优惠券对象")
+public class CouponDto implements Serializable {
+
+    @ApiModelProperty(value = "优惠券id")
+    private Long couponId;
+
+    @ApiModelProperty(value = "店铺ID")
+    private Long shopId;
+
+    @ApiModelProperty(value = "店铺名称")
+    private String shopName;
+
+    @JsonSerialize(using = ImgJsonSerializer.class)
+    @ApiModelProperty(value = "店铺logo")
+    private String shopLogo;
+
+    @ApiModelProperty(value = "优惠券名称")
+    private String couponName;
+
+    @ApiModelProperty(value = "副标题")
+    private String subTitle;
+
+    @ApiModelProperty(value = "优惠类型 1:代金券 2:折扣券 3:兑换券")
+    private Integer couponType;
+
+    @ApiModelProperty(value = "使用条件")
+    private Double cashCondition;
+
+    @ApiModelProperty(value = "减免金额")
+    private Double reduceAmount;
+
+    @ApiModelProperty(value = "折扣额度")
+    private Double couponDiscount;
+
+    @ApiModelProperty(value = "生效时间 1:固定时间 2:领取后生效")
+    private Integer validTimeType;
+
+    @ApiModelProperty(value = "开始时间")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date startTime;
+
+    @ApiModelProperty(value = "结束时间")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date endTime;
+
+    @ApiModelProperty(value = "领券后X天起生效")
+    private Integer afterReceiveDays;
+
+    @ApiModelProperty(value = "有效天数")
+    private Integer validDays;
+
+    @ApiModelProperty(value = "库存")
+    private Integer stocks;
+
+    @ApiModelProperty(value = "初始库存")
+    private Integer sourceStock;
+
+    @ApiModelProperty(value = "适用商品类型 0全部商品参与 1指定商品参与 2指定商品不参与")
+    private Integer suitableProdType;
+
+    @ApiModelProperty(value = "指定商品图片")
+    @JsonSerialize(using = ImgJsonSerializer.class)
+    private String pic;
+
+    @ApiModelProperty(value = "指定商品id")
+    private Long prodId;
+
+    @ApiModelProperty(value = "指定商品价格")
+    private Double price;
+
+    @ApiModelProperty(value = "每个用户领券上限")
+    private Integer limitNum;
+
+    @ApiModelProperty(value = "优惠券过期状态 0:过期 1:未过期")
+    private Integer overdueStatus;
+
+    @ApiModelProperty(value = "优惠券投放状态 0:未投放 1:投放")
+    private Integer putonStatus;
+
+    @ApiModelProperty(value = "用户优惠券id")
+    private Long couponUserId;
+
+    @ApiModelProperty(value = "领券时间")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date receiveTime;
+
+    @ApiModelProperty(value = "参与优惠券的商品集合")
+    private List<ProductDto> prods;
+
+    @ApiModelProperty(value = "当前登陆用户领取的优惠券数量")
+    private Integer curUserReceiveCount;
+
+    @ApiModelProperty(value = "当前登陆用户可用的优惠券数量")
+    private Integer userHasCount;
+}

+ 88 - 0
yami-shop-bean/src/main/java/com/yami/shop/bean/app/dto/CouponOrderDto.java

@@ -0,0 +1,88 @@
+/*
+ * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved.
+ *
+ * https://www.gz-yami.com/
+ *
+ * 未经允许,不可做商业用途!
+ *
+ * 版权所有,侵权必究!
+ */
+
+package com.yami.shop.bean.app.dto;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+@Data
+public class CouponOrderDto implements Serializable {
+
+    @ApiModelProperty(value = "优惠券id")
+    private Long couponId;
+
+    @ApiModelProperty(value = "店铺ID")
+    private Long shopId;
+
+    @ApiModelProperty(value = "优惠券名称")
+    private String couponName;
+
+    @ApiModelProperty(value = "副标题")
+    private String subTitle;
+
+    @ApiModelProperty(value = "优惠类型 1:代金券 2:折扣券 3:兑换券")
+    private Integer couponType;
+
+    @ApiModelProperty(value = "使用条件")
+    private Double cashCondition;
+
+    @ApiModelProperty(value = "减免金额")
+    private Double reduceAmount;
+
+    @ApiModelProperty(value = "折扣")
+    private Double couponDiscount;
+
+    @ApiModelProperty(value = "开始时间")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date startTime;
+
+    @ApiModelProperty(value = "结束时间")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date endTime;
+
+    @ApiModelProperty(value = "适用商品类型 0全部商品参与 1指定商品参与 2指定商品不参与")
+    private Integer suitableProdType;
+
+    @ApiModelProperty(value = "指定的商品id")
+    private List<Long> prodIds;
+
+    @ApiModelProperty(value = "选中的商品id")
+    private List<Long> chooseProdIds = new ArrayList<>();
+
+    @ApiModelProperty(value = "是否选中")
+    private boolean isChoose;
+
+    @ApiModelProperty(value = "是否可用")
+    private boolean canUse;
+
+    @ApiModelProperty(value = "用户优惠券id")
+    private Long couponUserId;
+
+    @ApiModelProperty(value = "生效时间 1:固定时间 2:领取后生效")
+    private Integer validTimeType;
+
+    @ApiModelProperty(value = "领券后X天起生效")
+    private Integer afterReceiveDays;
+
+    @ApiModelProperty(value = "有效天数")
+    private Integer validDays;
+
+    @ApiModelProperty(value = "领券时间")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date receiveTime;
+
+}

+ 36 - 0
yami-shop-bean/src/main/java/com/yami/shop/bean/app/dto/DeliveryDto.java

@@ -0,0 +1,36 @@
+/*
+ * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved.
+ *
+ * https://www.gz-yami.com/
+ *
+ * 未经允许,不可做商业用途!
+ *
+ * 版权所有,侵权必究!
+ */
+
+package com.yami.shop.bean.app.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class DeliveryDto {
+
+	@ApiModelProperty(value = "物流公司名称",required=true)
+	private String companyName;
+
+	@ApiModelProperty(value = "物流公司官网",required=true)
+	private String companyHomeUrl;
+
+	@ApiModelProperty(value = "物流订单号",required=true)
+	private String dvyFlowId;
+
+	@ApiModelProperty(value = "物流状态 0:没有记录 1:已揽收 2:运输途中 201:达到目的城市 3:已签收 4:问题件",required=true)
+	private Integer State;
+
+	@ApiModelProperty(value = "查询出的物流信息",required=true)
+	private List<DeliveryInfoDto> Traces;
+
+}

+ 26 - 0
yami-shop-bean/src/main/java/com/yami/shop/bean/app/dto/DeliveryInfoDto.java

@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved.
+ *
+ * https://www.gz-yami.com/
+ *
+ * 未经允许,不可做商业用途!
+ *
+ * 版权所有,侵权必究!
+ */
+
+package com.yami.shop.bean.app.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.Date;
+
+@Data
+public class DeliveryInfoDto {
+
+	@ApiModelProperty(value = "接受站点", required = true)
+	private String AcceptStation;
+	@ApiModelProperty(value = "接受时间", required = true)
+	private String AcceptTime;
+
+}

+ 73 - 0
yami-shop-bean/src/main/java/com/yami/shop/bean/app/dto/DiscountDto.java

@@ -0,0 +1,73 @@
+/*
+ * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved.
+ *
+ * https://www.gz-yami.com/
+ *
+ * 未经允许,不可做商业用途!
+ *
+ * 版权所有,侵权必究!
+ */
+
+package com.yami.shop.bean.app.dto;
+
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.yami.shop.common.serializer.json.ImgJsonSerializer;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+import java.util.List;
+
+@Data
+public class DiscountDto implements Serializable {
+
+    @ApiModelProperty("满减满折优惠id")
+    private Long discountId;
+
+    @ApiModelProperty("店铺ID")
+    private Long shopId;
+
+    @ApiModelProperty("活动名称")
+    private String discountName;
+
+    @ApiModelProperty("店铺名称")
+    private String shopName;
+
+    @ApiModelProperty("店铺Logo")
+    @JsonSerialize(using = ImgJsonSerializer.class)
+    private String shopLogo;
+
+    @ApiModelProperty("手机端活动图片")
+    @JsonSerialize(using = ImgJsonSerializer.class)
+    private String mobilePic;
+
+    @ApiModelProperty("pc端活动列表图片")
+    @JsonSerialize(using = ImgJsonSerializer.class)
+    private String pcPic;
+
+    @ApiModelProperty("pc端活动背景图片")
+    @JsonSerialize(using = ImgJsonSerializer.class)
+    private String pcBackgroundPic;
+
+    @ApiModelProperty("优惠规则(0:满钱减钱 1:满件减钱 2:满钱打折 3:满件打折)")
+    private Integer discountRule;
+
+    @ApiModelProperty("减免类型(0:按满足最高层级减一次 1:每满一次减一次)")
+    private Integer discountType;
+
+    @ApiModelProperty("适用商品类型(0:通用券 1:商品券)")
+    private Integer suitableProdType;
+
+    @ApiModelProperty("最多减多少")
+    private Double maxReduceAmount;
+
+    @ApiModelProperty("开始时间")
+    private Date startTime;
+
+    @ApiModelProperty("结束时间")
+    private Date endTime;
+
+    private List<DiscountItemDto> discountItems;
+
+}

+ 32 - 0
yami-shop-bean/src/main/java/com/yami/shop/bean/app/dto/DiscountItemDto.java

@@ -0,0 +1,32 @@
+/*
+ * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved.
+ *
+ * https://www.gz-yami.com/
+ *
+ * 未经允许,不可做商业用途!
+ *
+ * 版权所有,侵权必究!
+ */
+
+package com.yami.shop.bean.app.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+public class DiscountItemDto implements Serializable {
+
+    @ApiModelProperty(value = "优惠项id")
+    private Long discountItemId;
+
+    @ApiModelProperty(value = "优惠活动id")
+    private Long discountId;
+
+    @ApiModelProperty(value = "所需需要金额")
+    private Double needAmount;
+
+    @ApiModelProperty(value = "优惠(元/折)")
+    private Double discount;
+}

+ 64 - 0
yami-shop-bean/src/main/java/com/yami/shop/bean/app/dto/IndexImgDto.java

@@ -0,0 +1,64 @@
+/*
+ * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved.
+ *
+ * https://www.gz-yami.com/
+ *
+ * 未经允许,不可做商业用途!
+ *
+ * 版权所有,侵权必究!
+ */
+
+package com.yami.shop.bean.app.dto;
+
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.yami.shop.common.serializer.json.ImgJsonSerializer;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.Date;
+
+@ApiModel("首页图片对象")
+@Data
+public class IndexImgDto {
+
+    /**
+     * 图片
+     */
+    @JsonSerialize(using = ImgJsonSerializer.class)
+    @ApiModelProperty(value = "图片Url", required = true)
+    private String imgUrl;
+
+    /**
+     * 顺序
+     */
+    @ApiModelProperty(value = "图片顺序", required = true)
+    private Integer seq;
+
+    /**
+     * 上传时间
+     */
+    @ApiModelProperty(value = "上传时间", required = true)
+    private Date uploadTime;
+
+    /**
+     * 类型
+     */
+    @ApiModelProperty(value = "类型", required = true)
+    private int type;
+
+    /**
+     * 图片类型 0:小程序 1:pc
+     */
+    @ApiModelProperty(value = "图片类型 0:小程序 1:pc", required = true)
+    private int imgType;
+
+    /**
+     * 关联id
+     */
+    @ApiModelProperty(value = "关联id", required = true)
+    private Long relation;
+
+
+
+}

+ 63 - 0
yami-shop-bean/src/main/java/com/yami/shop/bean/app/dto/MyOrderDto.java

@@ -0,0 +1,63 @@
+/*
+ * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved.
+ *
+ * https://www.gz-yami.com/
+ *
+ * 未经允许,不可做商业用途!
+ *
+ * 版权所有,侵权必究!
+ */
+
+package com.yami.shop.bean.app.dto;
+
+import java.util.Date;
+import java.util.List;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+@ApiModel("我的订单")
+public class MyOrderDto {
+
+	@ApiModelProperty(value = "订单项",required=true)
+	private List<MyOrderItemDto> orderItemDtos;
+
+	@ApiModelProperty(value = "订单号",required=true)
+	private String orderNumber;
+
+	@ApiModelProperty(value = "总价",required=true)
+	private Double actualTotal;
+
+	@ApiModelProperty(value = "使用积分",required=true)
+	private Integer userScore;
+
+	@ApiModelProperty(value = "订单状态",required=true)
+	private Integer status;
+
+	@ApiModelProperty(value = "订单类型(0普通订单 1团购订单 2秒杀订单)",required=true)
+	private Integer orderType;
+
+	@ApiModelProperty(value = "退款单类型(1:整单退款,2:单个物品退款)",required=true)
+	private Integer refundType;
+
+	@ApiModelProperty(value = "处理退款状态:(1.买家申请 2.卖家接受 3.买家发货 4.卖家收货 5.退款成功 6.买家撤回申请 7.商家拒绝 -1.退款关闭)",required=true)
+	private Integer returnMoneySts;
+
+	@ApiModelProperty(value = "店铺名称",required=true)
+	private String shopName;
+
+	@ApiModelProperty(value = "店铺id",required=true)
+	private Long shopId;
+
+	@ApiModelProperty(value = "订单运费",required=true)
+	private Double freightAmount;
+
+	private Double latitude;
+
+	private Double longitude;
+
+	@ApiModelProperty(value = "订单创建时间",required=true)
+	private Date createTime;
+}

+ 61 - 0
yami-shop-bean/src/main/java/com/yami/shop/bean/app/dto/MyOrderItemDto.java

@@ -0,0 +1,61 @@
+/*
+ * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved.
+ *
+ * https://www.gz-yami.com/
+ *
+ * 未经允许,不可做商业用途!
+ *
+ * 版权所有,侵权必究!
+ */
+
+package com.yami.shop.bean.app.dto;
+
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.yami.shop.common.serializer.json.ImgJsonSerializer;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * @author LGH
+ */
+@ApiModel("我的订单-订单项")
+@Data
+public class MyOrderItemDto {
+
+    @ApiModelProperty(value = "商品图片", required = true)
+    @JsonSerialize(using = ImgJsonSerializer.class)
+    private String pic;
+
+    @ApiModelProperty(value = "商品名称", required = true)
+    private String prodName;
+
+    @ApiModelProperty(value = "评论时间", required = true)
+    private Date recTime;
+
+    @ApiModelProperty(value = "订单号",required=true)
+    private String orderNumber;
+
+    @ApiModelProperty(value = "商品数量", required = true)
+    private Integer prodCount;
+
+    @ApiModelProperty(value = "商品价格", required = true)
+    private Double price;
+
+    @ApiModelProperty(value = "产品购买花费积分",required=true)
+    private Integer useScore;
+
+    @ApiModelProperty(value = "skuName", required = true)
+    private String skuName;
+
+    @ApiModelProperty(value = "订单项id", required = true)
+    private Long orderItemId;
+
+    @ApiModelProperty(value = "商品id", required = true)
+    private Long prodId;
+
+    @ApiModelProperty(value = "评论状态: 0 未评价  1 已评价", required = true)
+    private Integer commSts;
+}

+ 48 - 0
yami-shop-bean/src/main/java/com/yami/shop/bean/app/dto/NoticeDto.java

@@ -0,0 +1,48 @@
+/*
+ * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved.
+ *
+ * https://www.gz-yami.com/
+ *
+ * 未经允许,不可做商业用途!
+ *
+ * 版权所有,侵权必究!
+ */
+
+package com.yami.shop.bean.app.dto;
+
+import com.fasterxml.jackson.annotation.JsonView;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.Date;
+
+@ApiModel("公告对象")
+@Data
+public class NoticeDto {
+
+    @JsonView(NoContent.class)
+    @ApiModelProperty(value = "公告id")
+    private Long id;
+
+    @JsonView(NoContent.class)
+    @ApiModelProperty(value = "店铺id")
+    private Long shopId;
+
+    @JsonView(NoContent.class)
+    @ApiModelProperty(value = "标题")
+    private String title;
+
+    @ApiModelProperty(value = "公告内容")
+    @JsonView(WithContent.class)
+    private String content;
+
+    @JsonView(NoContent.class)
+    @ApiModelProperty(value = "公告发布时间")
+    private Date publishTime;
+
+    public static interface NoContent{}
+
+    public static interface WithContent extends NoContent{}
+
+}

+ 45 - 0
yami-shop-bean/src/main/java/com/yami/shop/bean/app/dto/OrderCountData.java

@@ -0,0 +1,45 @@
+/*
+ * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved.
+ *
+ * https://www.gz-yami.com/
+ *
+ * 未经允许,不可做商业用途!
+ *
+ * 版权所有,侵权必究!
+ */
+
+package com.yami.shop.bean.app.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+@ApiModel("我的订单数量")
+public class OrderCountData {
+
+    @ApiModelProperty(value = "所有订单数量")
+    private Integer allCount;
+
+    @ApiModelProperty(value = "待付款")
+    private Integer unPay;
+
+    @ApiModelProperty(value = "待发货")
+    private Integer payed;
+
+    @ApiModelProperty(value = "待收货")
+    private Integer consignment;
+
+    @ApiModelProperty(value = "待评价")
+    private Integer confirm;
+
+    @ApiModelProperty(value = "成功")
+    private Integer success;
+
+    @ApiModelProperty(value = "失败")
+    private Integer close;
+
+    @ApiModelProperty(value = "退款订单")
+    private Integer refund;
+
+}

+ 36 - 0
yami-shop-bean/src/main/java/com/yami/shop/bean/app/dto/OrderItemDto.java

@@ -0,0 +1,36 @@
+/*
+ * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved.
+ *
+ * https://www.gz-yami.com/
+ *
+ * 未经允许,不可做商业用途!
+ *
+ * 版权所有,侵权必究!
+ */
+
+package com.yami.shop.bean.app.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serializable;
+
+/**
+ * @author LGH
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+public class OrderItemDto extends ProductItemDto implements Serializable {
+
+    @ApiModelProperty(value = "订单项id", required = true)
+    private Long orderItemId;
+
+    @ApiModelProperty(value = "退款订单编号,如果为null时,说明为正常订单", required = true)
+    private String refundSn;
+
+    @ApiModelProperty(value = "处理退款状态:(1.买家申请 2.卖家接受 3.买家发货 4.卖家收货 5.退款成功 6.买家撤回申请 7.商家拒绝 -1.退款关闭)", required = true)
+    private Integer returnMoneySts;
+
+
+}

+ 25 - 0
yami-shop-bean/src/main/java/com/yami/shop/bean/app/dto/OrderNumbersDto.java

@@ -0,0 +1,25 @@
+/*
+ * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved.
+ *
+ * https://www.gz-yami.com/
+ *
+ * 未经允许,不可做商业用途!
+ *
+ * 版权所有,侵权必究!
+ */
+
+package com.yami.shop.bean.app.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+public class OrderNumbersDto {
+
+	@ApiModelProperty(value = "多个订单号拼接的字符串",required=true)
+	private String orderNumbers;
+
+	public OrderNumbersDto(String orderNumbers) {
+		this.orderNumbers = orderNumbers;
+	}
+}

+ 130 - 0
yami-shop-bean/src/main/java/com/yami/shop/bean/app/dto/OrderShopDto.java

@@ -0,0 +1,130 @@
+/*
+ * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved.
+ *
+ * https://www.gz-yami.com/
+ *
+ * 未经允许,不可做商业用途!
+ *
+ * 版权所有,侵权必究!
+ */
+
+package com.yami.shop.bean.app.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.io.Serializable;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 订单下的每个店铺
+ *
+ * @author YaMi
+ */
+@Data
+public class OrderShopDto implements Serializable {
+
+    /**
+     * 店铺ID
+     **/
+    @ApiModelProperty(value = "店铺id", required = true)
+    private Long shopId;
+
+    /**
+     * 店铺名称
+     **/
+    @ApiModelProperty(value = "店铺名称", required = true)
+    private String shopName;
+
+    @ApiModelProperty(value = "实际总值", required = true)
+    private Double actualTotal;
+
+    @ApiModelProperty(value = "商品总值", required = true)
+    private Double total;
+
+    @ApiModelProperty(value = "商品总数", required = true)
+    private Integer totalNum;
+
+    @ApiModelProperty(value = "地址Dto", required = true)
+    private UserAddrDto userAddrDto;
+
+    @ApiModelProperty(value = "支付方式",required=true)
+    private Integer payType;
+
+    @ApiModelProperty(value = "产品信息", required = true)
+    private List<OrderItemDto> orderItemDtos;
+
+    @ApiModelProperty(value = "运费", required = true)
+    private Double transfee;
+
+    @ApiModelProperty(value = "优惠总额", required = true)
+    private Double reduceAmount;
+
+    @ApiModelProperty(value = "促销活动优惠金额", required = true)
+    private Double discountMoney;
+
+    @ApiModelProperty(value = "优惠券优惠金额", required = true)
+    private Double couponMoney;
+
+    /**
+     * 创建时间
+     */
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @ApiModelProperty(value = "订单创建时间", required = true)
+    private Date createTime;
+
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @ApiModelProperty(value = "订单付款时间", required = false)
+    private Date payTime;
+
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @ApiModelProperty(value = "订单发货时间", required = false)
+    private Date dvyTime;
+
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @ApiModelProperty(value = "订单完成时间", required = false)
+    private Date fianllyTime;
+
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @ApiModelProperty(value = "订单取消时间", required = false)
+    private Date cancelTime;
+
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @ApiModelProperty(value = "订单更新时间", required = false)
+    private Date updateTime;
+
+    /**
+     * 订单备注信息
+     */
+    @ApiModelProperty(value = "订单备注信息", required = true)
+    private String remarks;
+
+    /**
+     * 配送类型
+     */
+    @ApiModelProperty(value = "配送类型 1:快递 2:自提 3:无需快递", required = true)
+    private Integer dvyType;
+
+    /**
+     * 订单类型1团购订单 2秒杀订单
+     */
+    @ApiModelProperty(value = "订单类型(1团购订单 2秒杀订单)", required = true)
+    private Integer orderType;
+
+    /**
+     * 订单状态
+     */
+    @ApiModelProperty(value = "订单状态", required = true)
+    private Integer status;
+
+    @ApiModelProperty(value = "能否退款", required = true)
+    private Boolean canRefund = false;
+
+    @ApiModelProperty(value = "能否整单退款", required = true)
+    private Boolean canAllRefund = false;
+
+    @ApiModelProperty(value = "订单积分")
+    private Integer orderScore = 0;
+}

+ 55 - 0
yami-shop-bean/src/main/java/com/yami/shop/bean/app/dto/ProdCommDataDto.java

@@ -0,0 +1,55 @@
+/*
+ * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved.
+ *
+ * https://www.gz-yami.com/
+ *
+ * 未经允许,不可做商业用途!
+ *
+ * 版权所有,侵权必究!
+ */
+
+package com.yami.shop.bean.app.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+
+@ApiModel("商品评论数据")
+@Data
+public class ProdCommDataDto {
+
+    @ApiModelProperty(value = "好评率")
+    private Double positiveRating;
+
+    @ApiModelProperty(value = "评论数量")
+    private Integer number;
+
+    @ApiModelProperty(value = "好评数")
+    private Integer praiseNumber;
+
+    @ApiModelProperty(value = "中评数")
+    private Integer secondaryNumber;
+
+    @ApiModelProperty(value = "差评数")
+    private Integer negativeNumber;
+
+    @ApiModelProperty(value = "有图数")
+    private Integer picNumber;
+
+    @ApiModelProperty(value = "1分评论数")
+    private Integer scoreNumber1;
+
+    @ApiModelProperty(value = "2分评论数")
+    private Integer scoreNumber2;
+
+    @ApiModelProperty(value = "3分评论数")
+    private Integer scoreNumber3;
+
+    @ApiModelProperty(value = "4分评论数")
+    private Integer scoreNumber4;
+
+    @ApiModelProperty(value = "5分评论数")
+    private Integer scoreNumber5;
+
+}

+ 95 - 0
yami-shop-bean/src/main/java/com/yami/shop/bean/app/dto/ProdCommDto.java

@@ -0,0 +1,95 @@
+/*
+ * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved.
+ *
+ * https://www.gz-yami.com/
+ *
+ * 未经允许,不可做商业用途!
+ *
+ * 版权所有,侵权必究!
+ */
+
+package com.yami.shop.bean.app.dto;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.yami.shop.common.serializer.json.ImgJsonSerializer;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.util.Date;
+import java.util.List;
+
+@ApiModel("评论对象")
+@Data
+public class ProdCommDto {
+
+    @ApiModelProperty(value = "id")
+    private Long prodCommId;
+
+    /**
+     * 得分,0-5分
+     */
+    @ApiModelProperty(value = "得分,0-5分")
+    private Integer score;
+
+    /**
+     * 是否匿名(1:是  0:否)
+     */
+    @ApiModelProperty(value = "是否匿名(1:是  0:否)")
+    private Integer isAnonymous;
+
+    /**
+     * 掌柜回复
+     */
+    @ApiModelProperty(value = "掌柜回复")
+    private String replyContent;
+
+    /**
+     * 记录时间
+     */
+    @ApiModelProperty(value = "记录时间")
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date recTime;
+
+    /**
+     * 回复时间
+     */
+    @ApiModelProperty(value = "回复时间")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date replyTime;
+
+    @ApiModelProperty(value = "用户昵称")
+    private String nickName;
+
+    /**
+     * 头像图片路径
+     */
+    @ApiModelProperty(value = "头像图片路径")
+    private String pic;
+
+    /**
+     * 是否回复 0:未回复  1:已回复
+     */
+    @ApiModelProperty(value = "商家是否回复 0:未回复  1:已回复")
+    private Integer replySts;
+
+    /**
+     * 评论图片
+     */
+    @JsonSerialize(using = ImgJsonSerializer.class)
+    @ApiModelProperty(value = "评论图片")
+    private String pics;
+
+    /**
+     * 评价等级
+     */
+    @ApiModelProperty(value = "0好评 1中评 2差评")
+    private Byte evaluate;
+
+    @ApiModelProperty(value = "评论内容")
+    private String content;
+
+}

+ 67 - 0
yami-shop-bean/src/main/java/com/yami/shop/bean/app/dto/ProdCouponDto.java

@@ -0,0 +1,67 @@
+/*
+ * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved.
+ *
+ * https://www.gz-yami.com/
+ *
+ * 未经允许,不可做商业用途!
+ *
+ * 版权所有,侵权必究!
+ */
+
+package com.yami.shop.bean.app.dto;
+
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.yami.shop.common.serializer.json.ImgJsonSerializer;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@ApiModel("商品优惠券对象")
+@Data
+public class ProdCouponDto {
+
+    @ApiModelProperty(value = "商品id")
+    private Long prodId;
+
+    @ApiModelProperty(value = "店铺id")
+    private Long shopId;
+
+    @ApiModelProperty(value = "商品名称")
+    private String prodName;
+
+    @ApiModelProperty(value = "原价")
+    private Double oriPrice;
+
+    @ApiModelProperty(value = "现价")
+    private Double price;
+
+    @ApiModelProperty(value = "商品主图")
+    @JsonSerialize(using = ImgJsonSerializer.class)
+    private String pic;
+
+    @ApiModelProperty(value = "优惠券ID")
+    private Long couponId;
+
+    @ApiModelProperty(value = "优惠券名称")
+    private String couponName;
+
+    @ApiModelProperty(value = "副标题")
+    private String subTitle;
+
+    @ApiModelProperty(value = " 优惠类型 1:代金券 2:折扣券 3:兑换券")
+    private Integer couponType;
+
+    @ApiModelProperty(value = "使用条件金额")
+    private Double cashCondition;
+
+    @ApiModelProperty(value = "减免金额")
+    private Double reduceAmount;
+
+    @ApiModelProperty(value = "折扣额度")
+    private Double couponDiscount;
+
+    @ApiModelProperty(value = "库存")
+    private Integer stocks;
+
+
+}

+ 31 - 0
yami-shop-bean/src/main/java/com/yami/shop/bean/app/dto/ProdTagDto.java

@@ -0,0 +1,31 @@
+/*
+ * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved.
+ *
+ * https://www.gz-yami.com/
+ *
+ * 未经允许,不可做商业用途!
+ *
+ * 版权所有,侵权必究!
+ */
+
+package com.yami.shop.bean.app.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+public class ProdTagDto {
+
+    @ApiModelProperty(value = "分组标签id")
+    private Long id;
+
+    @ApiModelProperty(value = "分组标签标题")
+    private String title;
+
+    @ApiModelProperty(value = "排序(数值越高越靠前)")
+    private String seq;
+
+    @ApiModelProperty(value = "列表样式(0:一列一个,1:一列两个,2:一列三个)")
+    private String style;
+
+}

+ 131 - 0
yami-shop-bean/src/main/java/com/yami/shop/bean/app/dto/ProductDto.java

@@ -0,0 +1,131 @@
+/*
+ * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved.
+ *
+ * https://www.gz-yami.com/
+ *
+ * 未经允许,不可做商业用途!
+ *
+ * 版权所有,侵权必究!
+ */
+
+package com.yami.shop.bean.app.dto;
+
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.yami.shop.common.serializer.json.ImgJsonSerializer;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class ProductDto {
+    /**
+     * 店铺ID
+     */
+    @ApiModelProperty(value = "店铺ID", required = true)
+    private Long shopId;
+
+    /**
+     * 商品ID
+     */
+    @ApiModelProperty(value = "商品ID", required = true)
+    private Long prodId;
+
+    /**
+     * 商品名称
+     */
+    @ApiModelProperty(value = "商品名称")
+    private String prodName;
+
+    /**
+     * 商品价格
+     */
+    @ApiModelProperty(value = "商品价格", required = true)
+    private Double price;
+
+    /**
+     * 商品详情
+     */
+    @ApiModelProperty(value = "详细描述")
+    private String content;
+
+    /**
+     * 商品原价
+     */
+    @ApiModelProperty(value = "商品原价", required = true)
+    private Double oriPrice;
+
+    /**
+     * 库存量
+     */
+    @ApiModelProperty(value = "库存量", required = true)
+    private Integer totalStocks;
+
+    /**
+     * 销量
+     */
+    @ApiModelProperty(value = "销量", required = true)
+    private Integer soldNum;
+
+    /**
+     * 简要描述,卖点等
+     */
+    @ApiModelProperty(value = "简要描述,卖点等", required = true)
+    private String brief;
+
+    /**
+     * 状态
+     */
+    @ApiModelProperty(value = "0:下架、1:上架", required = true)
+    private Integer status;
+
+    /**
+     * 商品视频
+     */
+    @JsonSerialize(using = ImgJsonSerializer.class)
+    @ApiModelProperty(value = "商品视频")
+    private String video;
+
+    /**
+     * 商品主图
+     */
+    @JsonSerialize(using = ImgJsonSerializer.class)
+    @ApiModelProperty(value = "商品主图", required = true)
+    private String pic;
+
+    @JsonSerialize(using = ImgJsonSerializer.class)
+    @ApiModelProperty(value = "商品图片列表,以逗号分割", required = true)
+    private String imgs;
+
+    /**
+     * 商品分类
+     */
+    @ApiModelProperty(value = "商品分类id", required = true)
+    private Long categoryId;
+
+    @ApiModelProperty(value = "sku列表")
+    private List<SkuDto> skuList;
+
+    @ApiModelProperty(value = "商品类型(0普通商品 1拼团 2秒杀 3积分)")
+    private Integer prodType;
+
+    /**
+     * 商品积分价格
+     */
+    @ApiModelProperty(value = "商品积分价格")
+    private Long scorePrice;
+
+    /**
+     * 活动id(对应prod_type)
+     */
+    @ApiModelProperty(value = "活动id(prodType)")
+    private Long activityId;
+
+
+    /**
+     * 活动参考价
+     */
+    @ApiModelProperty(value = "活动参考价", required = true)
+    private Double activityPrice;
+
+}

+ 92 - 0
yami-shop-bean/src/main/java/com/yami/shop/bean/app/dto/ProductItemDto.java

@@ -0,0 +1,92 @@
+/*
+ * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved.
+ *
+ * https://www.gz-yami.com/
+ *
+ * 未经允许,不可做商业用途!
+ *
+ * 版权所有,侵权必究!
+ */
+
+package com.yami.shop.bean.app.dto;
+
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.yami.shop.common.serializer.json.ImgJsonSerializer;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author LGH
+ */
+@Data
+public class ProductItemDto implements Serializable {
+
+    @ApiModelProperty(value = "产品名称", required = true)
+    private String prodName;
+
+    @ApiModelProperty(value = "产品个数", required = true)
+    private Integer prodCount;
+
+    @ApiModelProperty(value = "分类id", required = true)
+    private Long categoryId;
+
+    @ApiModelProperty(value = "产品图片路径", required = true)
+    @JsonSerialize(using = ImgJsonSerializer.class)
+    private String pic;
+
+    @ApiModelProperty(value = "产品价格", required = true)
+    private Double price;
+
+    @ApiModelProperty(value = "产品所需积分", required = true)
+    private Integer scorePrice = 0;
+
+    @ApiModelProperty(value = "产品购买花费积分", required = true)
+    private Integer useScore;
+
+    @ApiModelProperty(value = "商品总金额", required = true)
+    private Double productTotalAmount;
+
+    @ApiModelProperty(value = "产品ID", required = true)
+    private Long prodId;
+
+    @ApiModelProperty(value = "skuId", required = true)
+    private Long skuId;
+
+    @ApiModelProperty(value = "规格名称", required = true)
+    private String skuName;
+
+    @ApiModelProperty(value = "basketId", required = true)
+    private Long basketId;
+
+    @ApiModelProperty(value = "商品实际金额 = 商品总金额 - 分摊的优惠金额 - 分摊的积分抵现金额")
+    private Double actualTotal;
+
+    @ApiModelProperty(value = "分摊的积分抵现金额")
+    private Double scorePayReduce;
+
+    @ApiModelProperty(value = "满减满折优惠id,0不主动参与活动(用户没有主动参与该活动),-1主动不参与活动")
+    private Long discountId = 0L;
+
+    @ApiModelProperty(value = "分摊的优惠金额")
+    private Double shareReduce = 0.0;
+
+    @ApiModelProperty(value = "能否分摊优惠券优惠金额(1可以 0不可以)")
+    private Integer isShareReduce;
+
+    @ApiModelProperty(value = "能否分摊积分抵现优惠金额(1可以 0不可以)")
+    private Integer isScoreReduce;
+
+    @ApiModelProperty(value = "平台分摊的优惠金额")
+    private Double platformShareReduce = 0.0;
+
+    @ApiModelProperty("参与满减活动列表")
+    private List<DiscountDto> discounts = new ArrayList<>();
+
+    private Double weight;
+
+    private String weightUnit;
+}

+ 75 - 0
yami-shop-bean/src/main/java/com/yami/shop/bean/app/dto/RefundDeliveryDto.java

@@ -0,0 +1,75 @@
+/*
+ * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved.
+ *
+ * https://www.gz-yami.com/
+ *
+ * 未经允许,不可做商业用途!
+ *
+ * 版权所有,侵权必究!
+ */
+
+package com.yami.shop.bean.app.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.Date;
+
+@Data
+public class RefundDeliveryDto {
+
+    @ApiModelProperty("物流公司id")
+    private Long deyId;
+
+    @ApiModelProperty("物流公司名称")
+    private String deyName;
+
+    @ApiModelProperty("物流编号")
+    private String deyNu;
+
+    @ApiModelProperty("收件人姓名")
+    private String receiverName;
+
+    @ApiModelProperty("收件人手机")
+    private String receiverMobile;
+
+    @ApiModelProperty("收件人座机")
+    private String receiverTelephone;
+
+    @ApiModelProperty("收件人邮政编码")
+    private String receiverPostCode;
+
+    @ApiModelProperty("收件人地址")
+    private String receiverAddr;
+
+    @ApiModelProperty("发送人手机号码")
+    private String senderMobile;
+
+    @ApiModelProperty("描述")
+    private String senderRemarks;
+
+    @ApiModelProperty("图片凭证")
+    private String imgs;
+
+    @ApiModelProperty("创建时间")
+    private Date createTime;
+
+    /**
+     * 支付方 1 店铺、2 买家
+     */
+    private String payer;
+    /**
+     * 是否支付
+     */
+    private boolean pay;
+    /**
+     * 配送价格
+     */
+    private String price;
+
+    private Long touchTime;
+
+    private Long deliveryTime;
+
+
+}

+ 49 - 0
yami-shop-bean/src/main/java/com/yami/shop/bean/app/dto/RefundOrderItemDto.java

@@ -0,0 +1,49 @@
+/*
+ * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved.
+ *
+ * https://www.gz-yami.com/
+ *
+ * 未经允许,不可做商业用途!
+ *
+ * 版权所有,侵权必究!
+ */
+
+package com.yami.shop.bean.app.dto;
+
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.yami.shop.common.serializer.json.ImgJsonSerializer;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serializable;
+
+/**
+ * 退款订单项
+ * @author LGH
+ */
+@Data
+public class RefundOrderItemDto {
+
+    @ApiModelProperty("产品名称")
+    private String prodName;
+
+    @ApiModelProperty("sku名称")
+    private String skuName;
+
+    @ApiModelProperty("产品图片")
+    @JsonSerialize(using = ImgJsonSerializer.class)
+    private String pic;
+
+    @ApiModelProperty("产品价格")
+    private Double price;
+
+    @ApiModelProperty("物品数量")
+    private Integer prodCount;
+
+    @ApiModelProperty("产品总价格")
+    private Double productTotalAmount;
+
+    @ApiModelProperty("商品实际金额")
+    private Double actualTotal;
+}

+ 14 - 0
yami-shop-bean/src/main/java/com/yami/shop/bean/app/dto/ResourcesInfoDto.java

@@ -0,0 +1,14 @@
+package com.yami.shop.bean.app.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+public class ResourcesInfoDto {
+
+    @ApiModelProperty(value = "服务器域名url",required=true)
+    private String resourcesUrl;
+
+    @ApiModelProperty(value = "文件上传的路径",required=true)
+    private String filePath;
+}

+ 32 - 0
yami-shop-bean/src/main/java/com/yami/shop/bean/app/dto/ShopCartAmountDto.java

@@ -0,0 +1,32 @@
+/*
+ * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved.
+ *
+ * https://www.gz-yami.com/
+ *
+ * 未经允许,不可做商业用途!
+ *
+ * 版权所有,侵权必究!
+ */
+
+package com.yami.shop.bean.app.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+@ApiModel("购物车合计")
+public class ShopCartAmountDto {
+
+    @ApiModelProperty("总额")
+    private Double totalMoney;
+
+    @ApiModelProperty("总计")
+    private Double finalMoney;
+
+    @ApiModelProperty("减额")
+    private Double subtractMoney;
+
+    @ApiModelProperty("商品数量")
+    private Integer count;
+}

+ 32 - 0
yami-shop-bean/src/main/java/com/yami/shop/bean/app/dto/ShopCartDto.java

@@ -0,0 +1,32 @@
+/*
+ * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved.
+ *
+ * https://www.gz-yami.com/
+ *
+ * 未经允许,不可做商业用途!
+ *
+ * 版权所有,侵权必究!
+ */
+
+package com.yami.shop.bean.app.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.List;
+
+@Data
+public class ShopCartDto implements Serializable {
+
+	@ApiModelProperty(value = "店铺ID", required = true)
+	private Long shopId;
+
+	@ApiModelProperty(value = "店铺名称", required = true)
+	private String shopName;
+
+	@ApiModelProperty(value = "购物车满减活动携带的商品", required = true)
+	private List<ShopCartItemDiscountDto> shopCartItemDiscounts;
+
+
+}

+ 31 - 0
yami-shop-bean/src/main/java/com/yami/shop/bean/app/dto/ShopCartExpiryItemDto.java

@@ -0,0 +1,31 @@
+/*
+ * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved.
+ *
+ * https://www.gz-yami.com/
+ *
+ * 未经允许,不可做商业用途!
+ *
+ * 版权所有,侵权必究!
+ */
+
+package com.yami.shop.bean.app.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+@ApiModel("购物车失效商品对象")
+public class ShopCartExpiryItemDto {
+    @ApiModelProperty(value = "店铺ID", required = true)
+    private Long shopId;
+
+    @ApiModelProperty(value = "店铺名称", required = true)
+    private String shopName;
+
+    @ApiModelProperty(value = "商品项", required = true)
+    private List<ShopCartItemDto> shopCartItemDtoList;
+
+}

+ 31 - 0
yami-shop-bean/src/main/java/com/yami/shop/bean/app/dto/ShopCartItemDiscountDto.java

@@ -0,0 +1,31 @@
+/*
+ * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved.
+ *
+ * https://www.gz-yami.com/
+ *
+ * 未经允许,不可做商业用途!
+ *
+ * 版权所有,侵权必究!
+ */
+
+package com.yami.shop.bean.app.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.List;
+
+@Data
+public class ShopCartItemDiscountDto implements Serializable {
+
+
+    @ApiModelProperty(value = "当前满减内商品的实际总额", required = true)
+    private Double totalAmount;
+
+    @ApiModelProperty(value = "已选满减项", required = true)
+    private ChooseDiscountItemDto chooseDiscountItemDto;
+
+    @ApiModelProperty(value = "商品列表")
+    private List<ShopCartItemDto> shopCartItems;
+}

+ 55 - 0
yami-shop-bean/src/main/java/com/yami/shop/bean/app/dto/ShopCartItemDto.java

@@ -0,0 +1,55 @@
+/*
+ * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved.
+ *
+ * https://www.gz-yami.com/
+ *
+ * 未经允许,不可做商业用途!
+ *
+ * 版权所有,侵权必究!
+ */
+
+package com.yami.shop.bean.app.dto;
+
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.yami.shop.common.serializer.json.ImgJsonSerializer;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * @author LGH
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+public class ShopCartItemDto extends ProductItemDto implements Serializable {
+    private static final long serialVersionUID = -8284981156242930909L;
+
+    @ApiModelProperty(value = "购物车ID", required = true)
+    private Long basketId;
+
+    @ApiModelProperty(value = "店铺ID", required = true)
+    private Long shopId;
+
+    @ApiModelProperty(value = "规格名称", required = true)
+    private String skuName;
+
+    @ApiModelProperty(value = "店铺名称", required = true)
+    private String shopName;
+
+    @ApiModelProperty(value = "商品原价", required = true)
+    private Double oriPrice;
+
+    @ApiModelProperty(value = "推广员使用的推销卡号")
+    private String distributionCardNo;
+
+    @ApiModelProperty(value = "加入购物车的时间")
+    private Date basketDate;
+
+    @ApiModelProperty(value = "是否收藏")
+    private Boolean isCollection;
+}

+ 82 - 0
yami-shop-bean/src/main/java/com/yami/shop/bean/app/dto/ShopCartOrderDto.java

@@ -0,0 +1,82 @@
+/*
+ * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved.
+ *
+ * https://www.gz-yami.com/
+ *
+ * 未经允许,不可做商业用途!
+ *
+ * 版权所有,侵权必究!
+ */
+
+package com.yami.shop.bean.app.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * 单个店铺的订单信息
+ */
+@Data
+public class ShopCartOrderDto implements Serializable{
+
+    @ApiModelProperty(value = "店铺id", required = true)
+    private Long shopId;
+
+    @ApiModelProperty(value = "店铺名称", required = true)
+    private String shopName;
+
+    @ApiModelProperty(value = "实际总值", required = true)
+    private Double actualTotal;
+
+    @ApiModelProperty(value = "商品总值", required = true)
+    private Double total;
+
+    @ApiModelProperty(value = "商品总数", required = true)
+    private Integer totalCount;
+
+    @ApiModelProperty(value = "用户等级免运费金额", required = true)
+    private Double freeTransfee = 0.0;
+
+    @ApiModelProperty(value = "运费", required = true)
+    private Double transfee;
+
+    @ApiModelProperty(value = "促销活动优惠金额", required = true)
+    private Double discountReduce;
+
+    @ApiModelProperty(value = "优惠券优惠金额", required = true)
+    private Double couponReduce;
+
+    @ApiModelProperty(value = "积分优惠金额", required = true)
+    private Double scoreReduce;
+
+    @ApiModelProperty(value = "使用积分", required = true)
+    private Integer useScore;
+
+    @ApiModelProperty(value = "平台优惠金额", required = true)
+    private Double platformAmount;
+
+    @ApiModelProperty(value = "等级优惠券金额", required = true)
+    private Double levelReduce;
+
+    @ApiModelProperty(value = "店铺优惠金额(促销活动 + 优惠券 + 积分优惠金额 + 其他)", required = true)
+    private Double shopReduce = 0.0;
+
+    @ApiModelProperty(value = "订单备注信息", required = true)
+    private String remarks;
+
+    @ApiModelProperty(value = "购物车商品", required = true)
+    private List<ShopCartItemDiscountDto> shopCartItemDiscounts;
+
+    @ApiModelProperty(value = "整个店铺可以使用的优惠券列表", required = true)
+    private List<CouponOrderDto> coupons;
+
+    @ApiModelProperty(value = "订单编号", required = true)
+    private String orderNumber;
+
+   private Double totalWeight;
+
+
+}

+ 82 - 0
yami-shop-bean/src/main/java/com/yami/shop/bean/app/dto/ShopCartOrderMergerDto.java

@@ -0,0 +1,82 @@
+/*
+ * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved.
+ *
+ * https://www.gz-yami.com/
+ *
+ * 未经允许,不可做商业用途!
+ *
+ * 版权所有,侵权必究!
+ */
+
+package com.yami.shop.bean.app.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * 多个店铺订单合并在一起的合并类
+ * "/confirm" 使用
+ */
+@Data
+public class ShopCartOrderMergerDto implements Serializable{
+
+    @ApiModelProperty(value = "实际总值", required = true)
+    private Double actualTotal;
+
+    @ApiModelProperty(value = "商品总值", required = true)
+    private Double total;
+
+    @ApiModelProperty(value = "商品总数", required = true)
+    private Integer totalCount;
+
+    @ApiModelProperty(value = "订单优惠金额(所有店铺优惠金额和使用积分抵现相加)", required = true)
+    private Double orderReduce = 0.0;
+
+    @ApiModelProperty(value = "订单所需积分", required = true)
+    private Integer scorePrice;
+
+    @ApiModelProperty(value = "整个订单使用的积分数", required = true)
+    private Integer totalUsableScore = 0;
+
+    @ApiModelProperty(value = "整个订单最多可以使用的积分数", required = true)
+    private Integer maxUsableScore = 0;
+
+    @ApiModelProperty(value = "积分抵扣金额", required = true)
+    private Double totalScoreAmount;
+
+    @ApiModelProperty(value = "购物积分抵现比例", required = true)
+    private Double shopUseScore;
+
+    @ApiModelProperty(value = "等级折扣金额", required = true)
+    private Double totalLevelAmount;
+
+    @ApiModelProperty(value = "免运费金额", required = true)
+    private Double freeTransfee = 0.0;
+
+    @ApiModelProperty(value = "总运费", required = true)
+    private Double totalTransfee;
+
+    @ApiModelProperty(value = "地址Dto", required = true)
+    private UserAddrDto userAddr;
+
+    @ApiModelProperty(value = "每个店铺的购物车信息", required = true)
+    private List<ShopCartOrderDto> shopCartOrders;
+
+    @ApiModelProperty(value = "整个订单可以使用的优惠券列表", required = true)
+    private List<CouponOrderDto> coupons;
+
+    @ApiModelProperty(value = "每次订单提交时的uuid")
+    private String uuid;
+
+    @ApiModelProperty(value = "用户是否选择积分抵现(0不使用 1使用 默认不使用)")
+    private Integer isScorePay;
+
+    @ApiModelProperty(value = "配送类型 1:快递 2:自提 3:无需快递")
+    private Integer dvyType;
+
+    private Double weight;
+
+}

+ 56 - 0
yami-shop-bean/src/main/java/com/yami/shop/bean/app/dto/ShopHeadInfoDto.java

@@ -0,0 +1,56 @@
+/*
+ * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved.
+ *
+ * https://www.gz-yami.com/
+ *
+ * 未经允许,不可做商业用途!
+ *
+ * 版权所有,侵权必究!
+ */
+
+package com.yami.shop.bean.app.dto;
+
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.yami.shop.common.serializer.json.ImgJsonSerializer;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * 店铺的头信息
+ * @author LGH
+ */
+@Data
+public class ShopHeadInfoDto {
+
+    @ApiModelProperty(value = "店铺id", required = true)
+    private Long shopId;
+
+    @ApiModelProperty(value = "店铺名称", required = true)
+    private String shopName;
+
+    @JsonSerialize(using = ImgJsonSerializer.class)
+    @ApiModelProperty(value = "店铺logo", required = true)
+    private String shopLogo;
+
+    @ApiModelProperty(value = "粉丝数量", required = true)
+    private Integer fansCount;
+
+    @ApiModelProperty(value = "商品数量", required = true)
+    private Integer prodCount;
+
+    @ApiModelProperty(value = "店铺简介", required = true)
+    private String intro;
+
+    @ApiModelProperty(value = "店铺联系电话", required = true)
+    private String tel;
+
+    /**
+     * 店铺状态(-1:未开通 0: 停业中 1:营业中 2:平台下线 3:平台下线待审核),可修改
+     */
+    @ApiModelProperty(value = "店铺状态(-1:未开通 0: 停业中 1:营业中 2:平台下线 3:平台下线待审核),可修改")
+    private Integer shopStatus;
+
+    @ApiModelProperty(value = "第三方id", required = true)
+    private String thirdPartyCode;
+
+}

+ 16 - 0
yami-shop-bean/src/main/java/com/yami/shop/bean/app/dto/SimpleDeliveryDto.java

@@ -0,0 +1,16 @@
+package com.yami.shop.bean.app.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+@ApiModel("物流公司对象")
+public class SimpleDeliveryDto {
+
+   @ApiModelProperty("id")
+    private Long dvyId;
+
+    @ApiModelProperty("物流公司名称")
+    private String dvyName;
+}

+ 45 - 0
yami-shop-bean/src/main/java/com/yami/shop/bean/app/dto/SkuDto.java

@@ -0,0 +1,45 @@
+/*
+ * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved.
+ *
+ * https://www.gz-yami.com/
+ *
+ * 未经允许,不可做商业用途!
+ *
+ * 版权所有,侵权必究!
+ */
+
+package com.yami.shop.bean.app.dto;
+
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.yami.shop.common.serializer.json.ImgJsonSerializer;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+public class SkuDto implements Serializable {
+
+    private static final long serialVersionUID = 6457261945829470666L;
+
+    @ApiModelProperty(value = "skuId", required = true)
+    private Long skuId;
+    @ApiModelProperty(value = "价格", required = true)
+    private Double price;
+
+    @ApiModelProperty(value = "库存(-1表示无穷)", required = true)
+    private Integer stocks;
+
+    @ApiModelProperty(value = "sku名称", required = true)
+    private String skuName;
+
+    @ApiModelProperty(value = "图片")
+    @JsonSerialize(using = ImgJsonSerializer.class)
+    private String pic;
+
+    @ApiModelProperty(value = "销售属性组合字符串,格式是p1:v1;p2:v2", required = true)
+    private String properties;
+
+    @ApiModelProperty(value = "积分价格")
+    private Integer skuScore;
+}

+ 35 - 0
yami-shop-bean/src/main/java/com/yami/shop/bean/app/dto/TagProductDto.java

@@ -0,0 +1,35 @@
+/*
+ * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved.
+ *
+ * https://www.gz-yami.com/
+ *
+ * 未经允许,不可做商业用途!
+ *
+ * 版权所有,侵权必究!
+ */
+
+package com.yami.shop.bean.app.dto;
+
+import com.yami.shop.bean.model.ProdTag;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class TagProductDto {
+
+    @ApiModelProperty(value = "分组标签id")
+    private Long id;
+
+    @ApiModelProperty(value = "分组标签标题")
+    private String title;
+
+    @ApiModelProperty(value = "排序(数值越高越靠前)")
+    private String seq;
+
+    @ApiModelProperty(value = "列表样式(0:一列一个,1:一列两个,2:一列三个)")
+    private String style;
+
+    private List<ProductDto> productDtoList;
+}

+ 49 - 0
yami-shop-bean/src/main/java/com/yami/shop/bean/app/dto/UserAddrDto.java

@@ -0,0 +1,49 @@
+/*
+ * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved.
+ *
+ * https://www.gz-yami.com/
+ *
+ * 未经允许,不可做商业用途!
+ *
+ * 版权所有,侵权必究!
+ */
+
+package com.yami.shop.bean.app.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+import java.io.Serializable;
+
+@Data
+public class UserAddrDto implements Serializable {
+    @ApiModelProperty(value = "地址id", required = true)
+    private Long addrId;
+
+    @ApiModelProperty(value = "收货人", required = true)
+    private String receiver;
+
+
+    @ApiModelProperty(value = "手机", required = true)
+    private String mobile;
+
+    @ApiModelProperty(value = "是否默认地址(1:是 0:否) ", required = true)
+    private Integer commonAddr;
+
+
+    private Double longitude;
+
+    private Double latitude;
+
+    @ApiModelProperty(value = "address", required = true)
+    private String address;
+
+    @ApiModelProperty(value = "addressName", required = true)
+    private String addressName;
+
+    @ApiModelProperty(value = "详细地址", required = true)
+    private String addrDetail;
+
+    private Double deliveryAmount;
+}

+ 42 - 0
yami-shop-bean/src/main/java/com/yami/shop/bean/app/dto/UserCenterInfoDto.java

@@ -0,0 +1,42 @@
+/*
+ * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved.
+ *
+ * https://www.gz-yami.com/
+ *
+ * 未经允许,不可做商业用途!
+ *
+ * 版权所有,侵权必究!
+ */
+
+package com.yami.shop.bean.app.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 用户个人中心信息
+ * @author LGH
+ */
+@Data
+public class UserCenterInfoDto {
+
+
+	@ApiModelProperty(value = "订单数量数据",required=true)
+	private OrderCountData orderCountData;
+
+    @ApiModelProperty(value = "审核状态:0 未审核 1已通过 -1未通过 null 未开店",required=true)
+    private Integer shopAuditStatus;
+
+    @ApiModelProperty(value = "店铺状态(-1:未开通 0: 停业中 1:营业中 2:平台下线 3:平台下线待审核),可修改",required=true)
+    private Integer shopStatus;
+
+    @ApiModelProperty(value = "是否已经设置过支付密码",required=true)
+    private Boolean isSetPassword;
+
+    @ApiModelProperty(value = "店铺id",required=true)
+    private Long shopId;
+
+}

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