xixi178 1 year ago
parent
commit
59c4720d79
100 changed files with 5410 additions and 176 deletions
  1. 73 0
      .drone.yml
  2. 14 0
      .idea/dataSources.local.xml
  3. 7 0
      .idea/dataSources.xml
  4. 779 28
      .idea/easyCodeTableSetting.xml
  5. 31 0
      .idea/inspectionProfiles/Project_Default.xml
  6. 408 18
      .idea/workspace.xml
  7. 6 0
      client-api/pom.xml
  8. 49 0
      client-api/src/main/java/com/wteam/controller/card/CardAdminController.java
  9. 144 0
      client-api/src/main/java/com/wteam/controller/card/CardController.java
  10. 35 0
      client-api/src/main/java/com/wteam/controller/coupon/CouponController.java
  11. 76 0
      client-api/src/main/java/com/wteam/controller/court/CourtController.java
  12. 413 0
      client-api/src/main/java/com/wteam/controller/hardware/HardwareController.java
  13. 62 0
      client-api/src/main/java/com/wteam/controller/order/OrderController.java
  14. 43 0
      client-api/src/main/java/com/wteam/controller/order/QrCodeController.java
  15. 131 0
      client-api/src/main/java/com/wteam/controller/payment/CashierController.java
  16. 25 6
      client-api/src/main/java/com/wteam/controller/sms/GetSmsController.java
  17. 103 0
      client-api/src/main/java/com/wteam/controller/user/UserController.java
  18. 1 1
      client-api/src/main/java/com/wteam/controller/wxlogin/QRCodeController.java
  19. 15 2
      client-api/src/main/java/com/wteam/controller/wxlogin/WxMaUserController.java
  20. 2 2
      client-api/src/main/java/com/wteam/security/ClientSecurityConfig.java
  21. 4 4
      client-api/src/main/resources/application.yml
  22. 4 4
      client-api/target/classes/application.yml
  23. BIN
      client-api/target/classes/com/wteam/controller/passport/ConnectMemberWebController.class
  24. BIN
      client-api/target/classes/com/wteam/controller/passport/FileController.class
  25. BIN
      client-api/target/classes/com/wteam/controller/passport/MemberController.class
  26. BIN
      client-api/target/classes/com/wteam/controller/sms/GetSmsController.class
  27. BIN
      client-api/target/classes/com/wteam/controller/wxlogin/QRCodeController.class
  28. BIN
      client-api/target/classes/com/wteam/controller/wxlogin/WxMaUserController.class
  29. BIN
      client-api/target/classes/com/wteam/security/ClientSecurityConfig.class
  30. 0 0
      common-api/src/main/java/com/wteam/controller/passport/ConnectMemberWebController.java
  31. 0 0
      common-api/src/main/java/com/wteam/controller/passport/FileController.java
  32. 0 0
      common-api/src/main/java/com/wteam/controller/passport/MemberController.java
  33. 1 1
      common-api/src/main/resources/application.yml
  34. 133 0
      develop.sh
  35. 144 0
      formal.sh
  36. 69 34
      framework/pom.xml
  37. 13 0
      framework/src/main/java/com/wteam/framework/common/enums/CardTypeEnum.java
  38. 29 0
      framework/src/main/java/com/wteam/framework/common/enums/OrderStatus.java
  39. 26 0
      framework/src/main/java/com/wteam/framework/common/enums/OrderStatusEnum.java
  40. 11 0
      framework/src/main/java/com/wteam/framework/common/enums/OrderTypeEnums.java
  41. 27 2
      framework/src/main/java/com/wteam/framework/common/enums/ResultCode.java
  42. 16 0
      framework/src/main/java/com/wteam/framework/common/enums/orderTypeEnum.java
  43. 4 4
      framework/src/main/java/com/wteam/framework/common/security/AuthUser.java
  44. 1 2
      framework/src/main/java/com/wteam/framework/common/security/context/UserContext.java
  45. 2 2
      framework/src/main/java/com/wteam/framework/common/security/token/manager/ManagerTokenGenerate.java
  46. 75 0
      framework/src/main/java/com/wteam/framework/common/utils/AesCbcUtil.java
  47. 1 1
      framework/src/main/java/com/wteam/framework/modules/book/entity/AdminUser.java
  48. 17 11
      framework/src/main/java/com/wteam/framework/modules/book/entity/Card.java
  49. 4 6
      framework/src/main/java/com/wteam/framework/modules/book/entity/Coupon.java
  50. 3 3
      framework/src/main/java/com/wteam/framework/modules/book/entity/CouponUser.java
  51. 26 0
      framework/src/main/java/com/wteam/framework/modules/book/entity/LongJsonDeserializer.java
  52. 21 0
      framework/src/main/java/com/wteam/framework/modules/book/entity/LongJsonSerializer.java
  53. 6 3
      framework/src/main/java/com/wteam/framework/modules/book/entity/Notice.java
  54. 40 16
      framework/src/main/java/com/wteam/framework/modules/book/entity/OrderInfo.java
  55. 3 2
      framework/src/main/java/com/wteam/framework/modules/book/entity/OrderUser.java
  56. 3 2
      framework/src/main/java/com/wteam/framework/modules/book/entity/PaymentInfo.java
  57. 3 3
      framework/src/main/java/com/wteam/framework/modules/book/entity/Role.java
  58. 3 3
      framework/src/main/java/com/wteam/framework/modules/book/entity/RoleMenu.java
  59. 9 4
      framework/src/main/java/com/wteam/framework/modules/book/entity/Store.java
  60. 3 2
      framework/src/main/java/com/wteam/framework/modules/book/entity/Vdstate.java
  61. 23 10
      framework/src/main/java/com/wteam/framework/modules/book/entity/Venue.java
  62. 21 0
      framework/src/main/java/com/wteam/framework/modules/book/entity/dto/OrderCardReq.java
  63. 60 0
      framework/src/main/java/com/wteam/framework/modules/book/entity/dto/OrderReq.java
  64. 30 0
      framework/src/main/java/com/wteam/framework/modules/book/entity/dto/StoreForm.java
  65. 24 0
      framework/src/main/java/com/wteam/framework/modules/book/entity/dto/StorePhotoDto.java
  66. 21 0
      framework/src/main/java/com/wteam/framework/modules/book/entity/dto/StoredCardDto.java
  67. 33 0
      framework/src/main/java/com/wteam/framework/modules/book/entity/reqp/TimeCalculation.java
  68. 18 0
      framework/src/main/java/com/wteam/framework/modules/book/entity/reqp/hardwareReq.java
  69. 42 0
      framework/src/main/java/com/wteam/framework/modules/book/entity/vo/CardVo.java
  70. 87 0
      framework/src/main/java/com/wteam/framework/modules/book/entity/vo/OrderInfoVo.java
  71. 89 0
      framework/src/main/java/com/wteam/framework/modules/book/entity/vo/OrderTicketVo.java
  72. 18 0
      framework/src/main/java/com/wteam/framework/modules/book/entity/vo/OrderVo.java
  73. 30 0
      framework/src/main/java/com/wteam/framework/modules/book/entity/vo/PaymentRequest.java
  74. 20 0
      framework/src/main/java/com/wteam/framework/modules/book/entity/vo/StoreDetailsVo.java
  75. 42 0
      framework/src/main/java/com/wteam/framework/modules/book/entity/vo/StoreVo.java
  76. 17 0
      framework/src/main/java/com/wteam/framework/modules/book/entity/vo/TimeCodeVo.java
  77. 17 0
      framework/src/main/java/com/wteam/framework/modules/book/entity/vo/VenueVo.java
  78. 21 0
      framework/src/main/java/com/wteam/framework/modules/book/mapper/CardMapper.java
  79. 16 0
      framework/src/main/java/com/wteam/framework/modules/book/mapper/CouponMapper.java
  80. 16 0
      framework/src/main/java/com/wteam/framework/modules/book/mapper/CouponUserMapper.java
  81. 16 0
      framework/src/main/java/com/wteam/framework/modules/book/mapper/OrderInfoMapper.java
  82. 16 0
      framework/src/main/java/com/wteam/framework/modules/book/mapper/PaymentInfoMapper.java
  83. 16 0
      framework/src/main/java/com/wteam/framework/modules/book/mapper/StoreMapper.java
  84. 16 0
      framework/src/main/java/com/wteam/framework/modules/book/mapper/VenueMapper.java
  85. 38 0
      framework/src/main/java/com/wteam/framework/modules/book/service/CardService.java
  86. 16 0
      framework/src/main/java/com/wteam/framework/modules/book/service/CouponService.java
  87. 31 0
      framework/src/main/java/com/wteam/framework/modules/book/service/OrderInfoService.java
  88. 21 0
      framework/src/main/java/com/wteam/framework/modules/book/service/PaymentInfoService.java
  89. 20 0
      framework/src/main/java/com/wteam/framework/modules/book/service/StoreService.java
  90. 15 0
      framework/src/main/java/com/wteam/framework/modules/book/service/VenueService.java
  91. 550 0
      framework/src/main/java/com/wteam/framework/modules/book/service/impl/CardServiceImpl.java
  92. 18 0
      framework/src/main/java/com/wteam/framework/modules/book/service/impl/CouponServiceImpl.java
  93. 358 0
      framework/src/main/java/com/wteam/framework/modules/book/service/impl/OrderInfoServiceImpl.java
  94. 254 0
      framework/src/main/java/com/wteam/framework/modules/book/service/impl/PaymentInfoServiceImpl.java
  95. 115 0
      framework/src/main/java/com/wteam/framework/modules/book/service/impl/StoreServiceImpl.java
  96. 18 0
      framework/src/main/java/com/wteam/framework/modules/book/service/impl/VenueServiceImpl.java
  97. 47 0
      framework/src/main/java/com/wteam/framework/modules/card/entity/CbCardAdmin.java
  98. 9 0
      framework/src/main/java/com/wteam/framework/modules/card/mapper/CardAdminMapper.java
  99. 17 0
      framework/src/main/java/com/wteam/framework/modules/card/service/CardAdminService.java
  100. 56 0
      framework/src/main/java/com/wteam/framework/modules/card/service/impl/CardAdminServiceImpl.java

+ 73 - 0
.drone.yml

@@ -0,0 +1,73 @@
+kind: pipeline
+type: docker
+name: pipeline-example-maven
+
+trigger:
+  branch:
+    - develop
+
+clone:
+  disable: true # 禁用自带的clone
+
+  # clone代码
+steps:
+  - name: clone
+    image: alpine/git
+    volumes: # 将容器内目录挂载到宿主机,仓库需要开启Trusted设置
+      - name: host-mount
+        path: /data # 将maven下载依赖的目录挂载出来,防止重复下载
+    commands:
+      - git clone http://124.222.247.184:3000/root/courtBooking.git
+      # 把这里改成了自己的仓库地址
+      # http://124.222.247.184:3000/wteamYD/promotesai-background.git .
+      - git checkout develop
+      - cp *.sh /data
+    when:
+      event:
+        - push # 当代码 push 时才重新拉取
+
+  # 传输shell脚本到目标主机
+  - name: scp files
+    image: ryjer/drone-scp
+    volumes: #将主机的shell脚本与容器共享
+      - name: host-mount
+        path: /data
+    settings:
+      host: 42.194.177.220
+      username: root
+      password:
+        from_secret: 42.194.177.220_password # 从Secret中读取SSH密码
+      port: 22
+      rm: true
+      source:
+        - /data
+      target:
+        - /data/sh/
+    environment:
+      AUTO_CREATE_DIR: "true" # 自动创建目标目录
+    when:
+      event:
+        - push # 当代码 push 时才重新上传
+
+  # 启动shell脚本
+  - name: spring-start 部署并重启
+    image: appleboy/drone-ssh # SSH工具镜像
+    settings:
+      host: 42.194.177.220 # 远程连接地址
+      username: root # 远程连接账号
+      password:
+        from_secret: 42.194.177.220_password # 从Secret中读取SSH密码
+      port: 22 # 远程连接端口
+      command_timeout: 5m # 远程执行命令超时时间
+      script:
+        - cd /data/sh # 进入宿主机构建目录
+        - chmod +x develop.sh # 更改为可执行脚本
+        - ./develop.sh  # 运行脚本打包应用镜像并运行
+    when:
+      event:
+        - push # 当代码 push 时才重新上传
+
+volumes: # 定义流水线挂载目录,用于共享shell脚本
+  - name: host-mount
+    host:
+      path: /mydata/sh/ # 从宿主机中挂载的目录

+ 14 - 0
.idea/dataSources.local.xml

@@ -15,5 +15,19 @@
         </introspection-scope>
       </schema-mapping>
     </data-source>
+    <data-source name="cb@139.9.38.185" uuid="aaa64551-8c64-403a-8f61-5824c1d75a40">
+      <database-info product="MySQL" version="5.7.40-log" jdbc-version="4.0" driver-name="MySQL Connector Java" driver-version="mysql-connector-java-5.1.40 ( Revision: 402933ef52cad9aa82624e80acbea46e3a701ce6 )" dbms="MYSQL" exact-version="5.7.40" exact-driver-version="5.1">
+        <extra-name-characters>#@</extra-name-characters>
+        <identifier-quote-string>`</identifier-quote-string>
+      </database-info>
+      <case-sensitivity plain-identifiers="exact" quoted-identifiers="exact" />
+      <secret-storage>master_key</secret-storage>
+      <user-name>cb</user-name>
+      <schema-mapping>
+        <introspection-scope>
+          <node kind="schema" qname="@" />
+        </introspection-scope>
+      </schema-mapping>
+    </data-source>
   </component>
 </project>

+ 7 - 0
.idea/dataSources.xml

@@ -8,5 +8,12 @@
       <jdbc-url>jdbc:mysql://1.14.25.22:3306/cb</jdbc-url>
       <working-dir>$ProjectFileDir$</working-dir>
     </data-source>
+    <data-source source="LOCAL" name="cb@139.9.38.185" uuid="aaa64551-8c64-403a-8f61-5824c1d75a40">
+      <driver-ref>mysql.8</driver-ref>
+      <synchronize>true</synchronize>
+      <jdbc-driver>com.mysql.jdbc.Driver</jdbc-driver>
+      <jdbc-url>jdbc:mysql://139.9.38.185:3306/cb</jdbc-url>
+      <working-dir>$ProjectFileDir$</working-dir>
+    </data-source>
   </component>
 </project>

+ 779 - 28
.idea/easyCodeTableSetting.xml

@@ -239,8 +239,8 @@
               <option name="name" value="CbAdminUser" />
               <option name="preName" value="" />
               <option name="saveModelName" value="manager-api" />
-              <option name="savePackageName" value="com.wteam.framework.modules.book" />
-              <option name="savePath" value="./manager-api/src/main/java/com/wteam/framework/modules/book" />
+              <option name="savePackageName" value="" />
+              <option name="savePath" value="./manager-api/src/main/java" />
               <option name="templateGroupName" value="Default" />
             </TableInfoDTO>
           </value>
@@ -365,10 +365,103 @@
                 </list>
               </option>
               <option name="name" value="CbCard" />
-              <option name="preName" value="" />
-              <option name="saveModelName" value="manager-api" />
+              <option name="preName" value="cb_" />
+              <option name="saveModelName" value="framework" />
               <option name="savePackageName" value="com.wteam.framework.modules.book" />
-              <option name="savePath" value="./manager-api/src/main/java/com/wteam/framework/modules/book" />
+              <option name="savePath" value="./framework/src/main/java/com/wteam/framework/modules/book" />
+              <option name="templateGroupName" value="Default" />
+            </TableInfoDTO>
+          </value>
+        </entry>
+        <entry key="cb.cb_card_admin">
+          <value>
+            <TableInfoDTO>
+              <option name="fullColumn">
+                <list>
+                  <ColumnInfoDTO>
+                    <option name="comment" value="id" />
+                    <option name="custom" value="false" />
+                    <option name="ext" value="{}" />
+                    <option name="name" value="id" />
+                    <option name="type" value="java.lang.Integer" />
+                  </ColumnInfoDTO>
+                  <ColumnInfoDTO>
+                    <option name="comment" value="卡名称" />
+                    <option name="custom" value="false" />
+                    <option name="ext" value="{}" />
+                    <option name="name" value="cardName" />
+                    <option name="type" value="java.lang.String" />
+                  </ColumnInfoDTO>
+                  <ColumnInfoDTO>
+                    <option name="comment" value="创建时间" />
+                    <option name="custom" value="false" />
+                    <option name="ext" value="{}" />
+                    <option name="name" value="createTime" />
+                    <option name="type" value="java.util.Date" />
+                  </ColumnInfoDTO>
+                  <ColumnInfoDTO>
+                    <option name="comment" value="卡类型(储值卡,月卡,次卡,散客储值卡枚举)" />
+                    <option name="custom" value="false" />
+                    <option name="ext" value="{}" />
+                    <option name="name" value="cardType" />
+                    <option name="type" value="java.lang.String" />
+                  </ColumnInfoDTO>
+                  <ColumnInfoDTO>
+                    <option name="comment" value="有效期" />
+                    <option name="custom" value="false" />
+                    <option name="ext" value="{}" />
+                    <option name="name" value="days" />
+                    <option name="type" value="java.lang.Integer" />
+                  </ColumnInfoDTO>
+                  <ColumnInfoDTO>
+                    <option name="comment" value="面值" />
+                    <option name="custom" value="false" />
+                    <option name="ext" value="{}" />
+                    <option name="name" value="faceValue" />
+                    <option name="type" value="java.lang.Integer" />
+                  </ColumnInfoDTO>
+                  <ColumnInfoDTO>
+                    <option name="comment" value="赠送金额" />
+                    <option name="custom" value="false" />
+                    <option name="ext" value="{}" />
+                    <option name="name" value="bonusAmount" />
+                    <option name="type" value="java.lang.Integer" />
+                  </ColumnInfoDTO>
+                  <ColumnInfoDTO>
+                    <option name="comment" value="折扣值" />
+                    <option name="custom" value="false" />
+                    <option name="ext" value="{}" />
+                    <option name="name" value="discountValue" />
+                    <option name="type" value="java.lang.Double" />
+                  </ColumnInfoDTO>
+                  <ColumnInfoDTO>
+                    <option name="comment" value="次卡次数" />
+                    <option name="custom" value="false" />
+                    <option name="ext" value="{}" />
+                    <option name="name" value="times" />
+                    <option name="type" value="java.lang.Integer" />
+                  </ColumnInfoDTO>
+                  <ColumnInfoDTO>
+                    <option name="comment" value="详情简介" />
+                    <option name="custom" value="false" />
+                    <option name="ext" value="{}" />
+                    <option name="name" value="detailedIntroduction" />
+                    <option name="type" value="java.lang.String" />
+                  </ColumnInfoDTO>
+                  <ColumnInfoDTO>
+                    <option name="comment" value="使用须知" />
+                    <option name="custom" value="false" />
+                    <option name="ext" value="{}" />
+                    <option name="name" value="usageInstructions" />
+                    <option name="type" value="java.lang.String" />
+                  </ColumnInfoDTO>
+                </list>
+              </option>
+              <option name="name" value="CbCardAdmin" />
+              <option name="preName" value="" />
+              <option name="saveModelName" value="framework" />
+              <option name="savePackageName" value="com.wteam.framework.modules.card" />
+              <option name="savePath" value="./framework/src/main/java/com/wteam/framework/modules/card" />
               <option name="templateGroupName" value="Default" />
             </TableInfoDTO>
           </value>
@@ -500,10 +593,10 @@
                 </list>
               </option>
               <option name="name" value="CbCoupon" />
-              <option name="preName" value="" />
-              <option name="saveModelName" value="manager-api" />
+              <option name="preName" value="cb_" />
+              <option name="saveModelName" value="framework" />
               <option name="savePackageName" value="com.wteam.framework.modules.book" />
-              <option name="savePath" value="./manager-api/src/main/java/com/wteam/framework/modules/book" />
+              <option name="savePath" value="./framework/src/main/java/com/wteam/framework/modules/book" />
               <option name="templateGroupName" value="Default" />
             </TableInfoDTO>
           </value>
@@ -587,10 +680,40 @@
                 </list>
               </option>
               <option name="name" value="CbCouponUser" />
-              <option name="preName" value="" />
-              <option name="saveModelName" value="manager-api" />
+              <option name="preName" value="cb_" />
+              <option name="saveModelName" value="framework" />
               <option name="savePackageName" value="com.wteam.framework.modules.book" />
-              <option name="savePath" value="./manager-api/src/main/java/com/wteam/framework/modules/book" />
+              <option name="savePath" value="./framework/src/main/java/com/wteam/framework/modules/book" />
+              <option name="templateGroupName" value="Default" />
+            </TableInfoDTO>
+          </value>
+        </entry>
+        <entry key="cb.cb_image">
+          <value>
+            <TableInfoDTO>
+              <option name="fullColumn">
+                <list>
+                  <ColumnInfoDTO>
+                    <option name="comment" value="门店图片" />
+                    <option name="custom" value="false" />
+                    <option name="ext" value="{}" />
+                    <option name="name" value="storeImage" />
+                    <option name="type" value="java.lang.String" />
+                  </ColumnInfoDTO>
+                  <ColumnInfoDTO>
+                    <option name="comment" value="门店图片id" />
+                    <option name="custom" value="false" />
+                    <option name="ext" value="{}" />
+                    <option name="name" value="id" />
+                    <option name="type" value="java.lang.Integer" />
+                  </ColumnInfoDTO>
+                </list>
+              </option>
+              <option name="name" value="CbImage" />
+              <option name="preName" value="" />
+              <option name="saveModelName" value="framework" />
+              <option name="savePackageName" value="com.wteam.framework.modules.image" />
+              <option name="savePath" value="./framework/src/main/java/com/wteam/framework/modules/image" />
               <option name="templateGroupName" value="Default" />
             </TableInfoDTO>
           </value>
@@ -677,13 +800,20 @@
                     <option name="name" value="noticeState" />
                     <option name="type" value="java.util.Boolean" />
                   </ColumnInfoDTO>
+                  <ColumnInfoDTO>
+                    <option name="comment" value="门店id" />
+                    <option name="custom" value="false" />
+                    <option name="ext" value="{}" />
+                    <option name="name" value="storeId" />
+                    <option name="type" value="java.lang.Long" />
+                  </ColumnInfoDTO>
                 </list>
               </option>
               <option name="name" value="CbNotice" />
-              <option name="preName" value="" />
-              <option name="saveModelName" value="manager-api" />
+              <option name="preName" value="cb_" />
+              <option name="saveModelName" value="framework" />
               <option name="savePackageName" value="com.wteam.framework.modules.book" />
-              <option name="savePath" value="./manager-api/src/main/java/com/wteam/framework/modules/book" />
+              <option name="savePath" value="./framework/src/main/java/com/wteam/framework/modules/book" />
               <option name="templateGroupName" value="Default" />
             </TableInfoDTO>
           </value>
@@ -843,10 +973,10 @@
                 </list>
               </option>
               <option name="name" value="CbOrderInfo" />
-              <option name="preName" value="" />
-              <option name="saveModelName" value="manager-api" />
+              <option name="preName" value="cb_" />
+              <option name="saveModelName" value="framework" />
               <option name="savePackageName" value="com.wteam.framework.modules.book" />
-              <option name="savePath" value="./manager-api/src/main/java/com/wteam/framework/modules/book" />
+              <option name="savePath" value="./framework/src/main/java/com/wteam/framework/modules/book" />
               <option name="templateGroupName" value="Default" />
             </TableInfoDTO>
           </value>
@@ -915,10 +1045,10 @@
                 </list>
               </option>
               <option name="name" value="CbOrderUser" />
-              <option name="preName" value="" />
-              <option name="saveModelName" value="manager-api" />
+              <option name="preName" value="cb_" />
+              <option name="saveModelName" value="framework" />
               <option name="savePackageName" value="com.wteam.framework.modules.book" />
-              <option name="savePath" value="./manager-api/src/main/java/com/wteam/framework/modules/book" />
+              <option name="savePath" value="./framework/src/main/java/com/wteam/framework/modules/book" />
               <option name="templateGroupName" value="Default" />
             </TableInfoDTO>
           </value>
@@ -1036,11 +1166,11 @@
                 </list>
               </option>
               <option name="name" value="CbPaymentInfo" />
-              <option name="preName" value="" />
-              <option name="saveModelName" value="" />
-              <option name="savePackageName" value="" />
-              <option name="savePath" value="" />
-              <option name="templateGroupName" value="" />
+              <option name="preName" value="cb_" />
+              <option name="saveModelName" value="framework" />
+              <option name="savePackageName" value="com.wteam.framework.modules.book" />
+              <option name="savePath" value="./framework/src/main/java/com/wteam/framework/modules/book" />
+              <option name="templateGroupName" value="Default" />
             </TableInfoDTO>
           </value>
         </entry>
@@ -1115,10 +1245,631 @@
                 </list>
               </option>
               <option name="name" value="CbRole" />
-              <option name="preName" value="" />
-              <option name="saveModelName" value="manager-api" />
+              <option name="preName" value="cb_" />
+              <option name="saveModelName" value="framework" />
               <option name="savePackageName" value="com.wteam.framework.modules.book" />
-              <option name="savePath" value="./manager-api/src/main/java/com/wteam/framework/modules/book" />
+              <option name="savePath" value="./framework/src/main/java/com/wteam/framework/modules/book" />
+              <option name="templateGroupName" value="Default" />
+            </TableInfoDTO>
+          </value>
+        </entry>
+        <entry key="cb.cb_role_menu">
+          <value>
+            <TableInfoDTO>
+              <option name="fullColumn">
+                <list>
+                  <ColumnInfoDTO>
+                    <option name="comment" value="ID" />
+                    <option name="custom" value="false" />
+                    <option name="ext" value="{}" />
+                    <option name="name" value="id" />
+                    <option name="type" value="java.lang.Long" />
+                  </ColumnInfoDTO>
+                  <ColumnInfoDTO>
+                    <option name="comment" value="创建者" />
+                    <option name="custom" value="false" />
+                    <option name="ext" value="{}" />
+                    <option name="name" value="createBy" />
+                    <option name="type" value="java.lang.String" />
+                  </ColumnInfoDTO>
+                  <ColumnInfoDTO>
+                    <option name="comment" value="创建时间" />
+                    <option name="custom" value="false" />
+                    <option name="ext" value="{}" />
+                    <option name="name" value="createTime" />
+                    <option name="type" value="java.lang.String" />
+                  </ColumnInfoDTO>
+                  <ColumnInfoDTO>
+                    <option name="comment" value="删除标志 true/false 删除/未删除" />
+                    <option name="custom" value="false" />
+                    <option name="ext" value="{}" />
+                    <option name="name" value="deleteFlag" />
+                    <option name="type" value="java.util.Boolean" />
+                  </ColumnInfoDTO>
+                  <ColumnInfoDTO>
+                    <option name="comment" value="更新者" />
+                    <option name="custom" value="false" />
+                    <option name="ext" value="{}" />
+                    <option name="name" value="updateBy" />
+                    <option name="type" value="java.lang.String" />
+                  </ColumnInfoDTO>
+                  <ColumnInfoDTO>
+                    <option name="comment" value="更新时间" />
+                    <option name="custom" value="false" />
+                    <option name="ext" value="{}" />
+                    <option name="name" value="updateTime" />
+                    <option name="type" value="java.lang.String" />
+                  </ColumnInfoDTO>
+                  <ColumnInfoDTO>
+                    <option name="comment" value="是否拥有操作数据权限" />
+                    <option name="custom" value="false" />
+                    <option name="ext" value="{}" />
+                    <option name="name" value="isSuper" />
+                    <option name="type" value="java.util.Boolean" />
+                  </ColumnInfoDTO>
+                  <ColumnInfoDTO>
+                    <option name="comment" value="菜单" />
+                    <option name="custom" value="false" />
+                    <option name="ext" value="{}" />
+                    <option name="name" value="menuId" />
+                    <option name="type" value="java.lang.String" />
+                  </ColumnInfoDTO>
+                  <ColumnInfoDTO>
+                    <option name="comment" value="角色ID" />
+                    <option name="custom" value="false" />
+                    <option name="ext" value="{}" />
+                    <option name="name" value="roleId" />
+                    <option name="type" value="java.lang.String" />
+                  </ColumnInfoDTO>
+                </list>
+              </option>
+              <option name="name" value="CbRoleMenu" />
+              <option name="preName" value="cb_" />
+              <option name="saveModelName" value="framework" />
+              <option name="savePackageName" value="" />
+              <option name="savePath" value="./framework/src/main/java" />
+              <option name="templateGroupName" value="Default" />
+            </TableInfoDTO>
+          </value>
+        </entry>
+        <entry key="cb.cb_special_value">
+          <value>
+            <TableInfoDTO>
+              <option name="fullColumn">
+                <list>
+                  <ColumnInfoDTO>
+                    <option name="comment" value="特殊价格的id" />
+                    <option name="custom" value="false" />
+                    <option name="ext" value="{}" />
+                    <option name="name" value="id" />
+                    <option name="type" value="java.lang.Integer" />
+                  </ColumnInfoDTO>
+                  <ColumnInfoDTO>
+                    <option name="comment" value="场地id" />
+                    <option name="custom" value="false" />
+                    <option name="ext" value="{}" />
+                    <option name="name" value="venueId" />
+                    <option name="type" value="java.lang.Integer" />
+                  </ColumnInfoDTO>
+                  <ColumnInfoDTO>
+                    <option name="comment" value="开门时间" />
+                    <option name="custom" value="false" />
+                    <option name="ext" value="{}" />
+                    <option name="name" value="orderst" />
+                    <option name="type" value="java.util.Date" />
+                  </ColumnInfoDTO>
+                  <ColumnInfoDTO>
+                    <option name="comment" value="关门时间" />
+                    <option name="custom" value="false" />
+                    <option name="ext" value="{}" />
+                    <option name="name" value="ordered" />
+                    <option name="type" value="java.util.Date" />
+                  </ColumnInfoDTO>
+                  <ColumnInfoDTO>
+                    <option name="comment" value="后台指定特殊价格" />
+                    <option name="custom" value="false" />
+                    <option name="ext" value="{}" />
+                    <option name="name" value="specialValue" />
+                    <option name="type" value="java.lang.Integer" />
+                  </ColumnInfoDTO>
+                </list>
+              </option>
+              <option name="name" value="CbSpecialValue" />
+              <option name="preName" value="" />
+              <option name="saveModelName" value="framework" />
+              <option name="savePackageName" value="com.wteam.framework.modules.specialValue" />
+              <option name="savePath" value="./framework/src/main/java/com/wteam/framework/modules/specialValue" />
+              <option name="templateGroupName" value="Default" />
+            </TableInfoDTO>
+          </value>
+        </entry>
+        <entry key="cb.cb_store">
+          <value>
+            <TableInfoDTO>
+              <option name="fullColumn">
+                <list>
+                  <ColumnInfoDTO>
+                    <option name="comment" value="id" />
+                    <option name="custom" value="false" />
+                    <option name="ext" value="{}" />
+                    <option name="name" value="id" />
+                    <option name="type" value="java.lang.Long" />
+                  </ColumnInfoDTO>
+                  <ColumnInfoDTO>
+                    <option name="comment" value="创建者" />
+                    <option name="custom" value="false" />
+                    <option name="ext" value="{}" />
+                    <option name="name" value="createBy" />
+                    <option name="type" value="java.lang.String" />
+                  </ColumnInfoDTO>
+                  <ColumnInfoDTO>
+                    <option name="comment" value="创建时间" />
+                    <option name="custom" value="false" />
+                    <option name="ext" value="{}" />
+                    <option name="name" value="createTime" />
+                    <option name="type" value="java.util.Date" />
+                  </ColumnInfoDTO>
+                  <ColumnInfoDTO>
+                    <option name="comment" value="修改者" />
+                    <option name="custom" value="false" />
+                    <option name="ext" value="{}" />
+                    <option name="name" value="updateBy" />
+                    <option name="type" value="java.lang.String" />
+                  </ColumnInfoDTO>
+                  <ColumnInfoDTO>
+                    <option name="comment" value="修改时间" />
+                    <option name="custom" value="false" />
+                    <option name="ext" value="{}" />
+                    <option name="name" value="updateTime" />
+                    <option name="type" value="java.util.Date" />
+                  </ColumnInfoDTO>
+                  <ColumnInfoDTO>
+                    <option name="comment" value="删除标志 true/false 删除/未删除" />
+                    <option name="custom" value="false" />
+                    <option name="ext" value="{}" />
+                    <option name="name" value="deleteFlag" />
+                    <option name="type" value="java.lang.Integer" />
+                  </ColumnInfoDTO>
+                  <ColumnInfoDTO>
+                    <option name="comment" value="门店名称" />
+                    <option name="custom" value="false" />
+                    <option name="ext" value="{}" />
+                    <option name="name" value="storeName" />
+                    <option name="type" value="java.lang.String" />
+                  </ColumnInfoDTO>
+                  <ColumnInfoDTO>
+                    <option name="comment" value="场馆介绍" />
+                    <option name="custom" value="false" />
+                    <option name="ext" value="{}" />
+                    <option name="name" value="venueIntroduction" />
+                    <option name="type" value="java.lang.String" />
+                  </ColumnInfoDTO>
+                  <ColumnInfoDTO>
+                    <option name="comment" value="开店时间" />
+                    <option name="custom" value="false" />
+                    <option name="ext" value="{}" />
+                    <option name="name" value="openingTime" />
+                    <option name="type" value="java.time.LocalTime" />
+                  </ColumnInfoDTO>
+                  <ColumnInfoDTO>
+                    <option name="comment" value="关店时间" />
+                    <option name="custom" value="false" />
+                    <option name="ext" value="{}" />
+                    <option name="name" value="closingTime" />
+                    <option name="type" value="java.time.LocalTime" />
+                  </ColumnInfoDTO>
+                  <ColumnInfoDTO>
+                    <option name="comment" value="门店图片" />
+                    <option name="custom" value="false" />
+                    <option name="ext" value="{}" />
+                    <option name="name" value="storeImages" />
+                    <option name="type" value="java.lang.String" />
+                  </ColumnInfoDTO>
+                  <ColumnInfoDTO>
+                    <option name="comment" value="服务热线" />
+                    <option name="custom" value="false" />
+                    <option name="ext" value="{}" />
+                    <option name="name" value="serviceHotline" />
+                    <option name="type" value="java.lang.String" />
+                  </ColumnInfoDTO>
+                  <ColumnInfoDTO>
+                    <option name="comment" value="微信号" />
+                    <option name="custom" value="false" />
+                    <option name="ext" value="{}" />
+                    <option name="name" value="wxCode" />
+                    <option name="type" value="java.lang.String" />
+                  </ColumnInfoDTO>
+                  <ColumnInfoDTO>
+                    <option name="comment" value="实时人数" />
+                    <option name="custom" value="false" />
+                    <option name="ext" value="{}" />
+                    <option name="name" value="realTime" />
+                    <option name="type" value="java.lang.String" />
+                  </ColumnInfoDTO>
+                  <ColumnInfoDTO>
+                    <option name="comment" value="提前预订天数" />
+                    <option name="custom" value="false" />
+                    <option name="ext" value="{}" />
+                    <option name="name" value="advanceDays" />
+                    <option name="type" value="java.lang.String" />
+                  </ColumnInfoDTO>
+                  <ColumnInfoDTO>
+                    <option name="comment" value="起订时间" />
+                    <option name="custom" value="false" />
+                    <option name="ext" value="{}" />
+                    <option name="name" value="leadTime" />
+                    <option name="type" value="java.lang.Integer" />
+                  </ColumnInfoDTO>
+                  <ColumnInfoDTO>
+                    <option name="comment" value="公告" />
+                    <option name="custom" value="false" />
+                    <option name="ext" value="{}" />
+                    <option name="name" value="announcement" />
+                    <option name="type" value="java.lang.String" />
+                  </ColumnInfoDTO>
+                  <ColumnInfoDTO>
+                    <option name="comment" value="门店地址" />
+                    <option name="custom" value="false" />
+                    <option name="ext" value="{}" />
+                    <option name="name" value="address" />
+                    <option name="type" value="java.lang.String" />
+                  </ColumnInfoDTO>
+                  <ColumnInfoDTO>
+                    <option name="comment" value="订场须知" />
+                    <option name="custom" value="false" />
+                    <option name="ext" value="{}" />
+                    <option name="name" value="scheduledNotice" />
+                    <option name="type" value="java.lang.String" />
+                  </ColumnInfoDTO>
+                </list>
+              </option>
+              <option name="name" value="CbStore" />
+              <option name="preName" value="cb_" />
+              <option name="saveModelName" value="framework" />
+              <option name="savePackageName" value="com.wteam.framework.modules.book" />
+              <option name="savePath" value="./framework/src/main/java/com/wteam/framework/modules/book" />
+              <option name="templateGroupName" value="Default" />
+            </TableInfoDTO>
+          </value>
+        </entry>
+        <entry key="cb.cb_user">
+          <value>
+            <TableInfoDTO>
+              <option name="fullColumn">
+                <list>
+                  <ColumnInfoDTO>
+                    <option name="comment" value="id" />
+                    <option name="custom" value="false" />
+                    <option name="ext" value="{}" />
+                    <option name="name" value="id" />
+                    <option name="type" value="java.lang.Long" />
+                  </ColumnInfoDTO>
+                  <ColumnInfoDTO>
+                    <option name="comment" value="创建者" />
+                    <option name="custom" value="false" />
+                    <option name="ext" value="{}" />
+                    <option name="name" value="createBy" />
+                    <option name="type" value="java.lang.String" />
+                  </ColumnInfoDTO>
+                  <ColumnInfoDTO>
+                    <option name="comment" value="创建时间" />
+                    <option name="custom" value="false" />
+                    <option name="ext" value="{}" />
+                    <option name="name" value="createTime" />
+                    <option name="type" value="java.lang.String" />
+                  </ColumnInfoDTO>
+                  <ColumnInfoDTO>
+                    <option name="comment" value="修改者" />
+                    <option name="custom" value="false" />
+                    <option name="ext" value="{}" />
+                    <option name="name" value="updateBy" />
+                    <option name="type" value="java.lang.String" />
+                  </ColumnInfoDTO>
+                  <ColumnInfoDTO>
+                    <option name="comment" value="修改时间" />
+                    <option name="custom" value="false" />
+                    <option name="ext" value="{}" />
+                    <option name="name" value="updateTime" />
+                    <option name="type" value="java.lang.String" />
+                  </ColumnInfoDTO>
+                  <ColumnInfoDTO>
+                    <option name="comment" value="删除标志 true/false 删除/未删除" />
+                    <option name="custom" value="false" />
+                    <option name="ext" value="{}" />
+                    <option name="name" value="deleteFlag" />
+                    <option name="type" value="java.util.Boolean" />
+                  </ColumnInfoDTO>
+                  <ColumnInfoDTO>
+                    <option name="comment" value="微信openid" />
+                    <option name="custom" value="false" />
+                    <option name="ext" value="{}" />
+                    <option name="name" value="openId" />
+                    <option name="type" value="java.lang.String" />
+                  </ColumnInfoDTO>
+                  <ColumnInfoDTO>
+                    <option name="comment" value="头像" />
+                    <option name="custom" value="false" />
+                    <option name="ext" value="{}" />
+                    <option name="name" value="avatar" />
+                    <option name="type" value="java.lang.String" />
+                  </ColumnInfoDTO>
+                  <ColumnInfoDTO>
+                    <option name="comment" value="昵称(默认用户+手机号后四位)" />
+                    <option name="custom" value="false" />
+                    <option name="ext" value="{}" />
+                    <option name="name" value="nickName" />
+                    <option name="type" value="java.lang.String" />
+                  </ColumnInfoDTO>
+                  <ColumnInfoDTO>
+                    <option name="comment" value="手机号" />
+                    <option name="custom" value="false" />
+                    <option name="ext" value="{}" />
+                    <option name="name" value="phoneNumber" />
+                    <option name="type" value="java.lang.String" />
+                  </ColumnInfoDTO>
+                  <ColumnInfoDTO>
+                    <option name="comment" value="生日" />
+                    <option name="custom" value="false" />
+                    <option name="ext" value="{}" />
+                    <option name="name" value="birthday" />
+                    <option name="type" value="java.util.Date" />
+                  </ColumnInfoDTO>
+                  <ColumnInfoDTO>
+                    <option name="comment" value="性别(0表示男,1表示女)" />
+                    <option name="custom" value="false" />
+                    <option name="ext" value="{}" />
+                    <option name="name" value="sex" />
+                    <option name="type" value="java.lang.Integer" />
+                  </ColumnInfoDTO>
+                  <ColumnInfoDTO>
+                    <option name="comment" value="邮件" />
+                    <option name="custom" value="false" />
+                    <option name="ext" value="{}" />
+                    <option name="name" value="email" />
+                    <option name="type" value="java.lang.String" />
+                  </ColumnInfoDTO>
+                  <ColumnInfoDTO>
+                    <option name="comment" value="是否被禁用" />
+                    <option name="custom" value="false" />
+                    <option name="ext" value="{}" />
+                    <option name="name" value="isBan" />
+                    <option name="type" value="java.util.Boolean" />
+                  </ColumnInfoDTO>
+                  <ColumnInfoDTO>
+                    <option name="comment" value="积分" />
+                    <option name="custom" value="false" />
+                    <option name="ext" value="{}" />
+                    <option name="name" value="credit" />
+                    <option name="type" value="java.lang.String" />
+                  </ColumnInfoDTO>
+                  <ColumnInfoDTO>
+                    <option name="comment" value="姓名" />
+                    <option name="custom" value="false" />
+                    <option name="ext" value="{}" />
+                    <option name="name" value="name" />
+                    <option name="type" value="java.lang.String" />
+                  </ColumnInfoDTO>
+                  <ColumnInfoDTO>
+                    <option name="comment" value="状态 默认true正常 false禁用" />
+                    <option name="custom" value="false" />
+                    <option name="ext" value="{}" />
+                    <option name="name" value="status" />
+                    <option name="type" value="java.util.Boolean" />
+                  </ColumnInfoDTO>
+                </list>
+              </option>
+              <option name="name" value="CbUser" />
+              <option name="preName" value="" />
+              <option name="saveModelName" value="manager-api" />
+              <option name="savePackageName" value="" />
+              <option name="savePath" value="./manager-api/src/main/java" />
+              <option name="templateGroupName" value="Default" />
+            </TableInfoDTO>
+          </value>
+        </entry>
+        <entry key="cb.cb_vdstate">
+          <value>
+            <TableInfoDTO>
+              <option name="fullColumn">
+                <list>
+                  <ColumnInfoDTO>
+                    <option name="comment" value="id" />
+                    <option name="custom" value="false" />
+                    <option name="ext" value="{}" />
+                    <option name="name" value="id" />
+                    <option name="type" value="java.lang.Integer" />
+                  </ColumnInfoDTO>
+                  <ColumnInfoDTO>
+                    <option name="comment" value="创建者" />
+                    <option name="custom" value="false" />
+                    <option name="ext" value="{}" />
+                    <option name="name" value="createBy" />
+                    <option name="type" value="java.lang.String" />
+                  </ColumnInfoDTO>
+                  <ColumnInfoDTO>
+                    <option name="comment" value="创建时间" />
+                    <option name="custom" value="false" />
+                    <option name="ext" value="{}" />
+                    <option name="name" value="createTime" />
+                    <option name="type" value="java.util.Date" />
+                  </ColumnInfoDTO>
+                  <ColumnInfoDTO>
+                    <option name="comment" value="修改者" />
+                    <option name="custom" value="false" />
+                    <option name="ext" value="{}" />
+                    <option name="name" value="updateBy" />
+                    <option name="type" value="java.lang.String" />
+                  </ColumnInfoDTO>
+                  <ColumnInfoDTO>
+                    <option name="comment" value="修改时间" />
+                    <option name="custom" value="false" />
+                    <option name="ext" value="{}" />
+                    <option name="name" value="updateTime" />
+                    <option name="type" value="java.util.Date" />
+                  </ColumnInfoDTO>
+                  <ColumnInfoDTO>
+                    <option name="comment" value="删除标志 true/false 删除/未删除" />
+                    <option name="custom" value="false" />
+                    <option name="ext" value="{}" />
+                    <option name="name" value="deleteFlag" />
+                    <option name="type" value="java.lang.Integer" />
+                  </ColumnInfoDTO>
+                  <ColumnInfoDTO>
+                    <option name="comment" value="门店id" />
+                    <option name="custom" value="false" />
+                    <option name="ext" value="{}" />
+                    <option name="name" value="storeId" />
+                    <option name="type" value="java.lang.Long" />
+                  </ColumnInfoDTO>
+                  <ColumnInfoDTO>
+                    <option name="comment" value="日期" />
+                    <option name="custom" value="false" />
+                    <option name="ext" value="{}" />
+                    <option name="name" value="date" />
+                    <option name="type" value="java.util.Date" />
+                  </ColumnInfoDTO>
+                  <ColumnInfoDTO>
+                    <option name="comment" value="分时状态 第i位代表第i~i+1小时的场馆状态0代表不可用1代表可用2代表已经被预约" />
+                    <option name="custom" value="false" />
+                    <option name="ext" value="{}" />
+                    <option name="name" value="vdstateSt" />
+                    <option name="type" value="java.lang.String" />
+                  </ColumnInfoDTO>
+                </list>
+              </option>
+              <option name="name" value="CbVdstate" />
+              <option name="preName" value="cb_" />
+              <option name="saveModelName" value="framework" />
+              <option name="savePackageName" value="" />
+              <option name="savePath" value="./framework/src/main/java" />
+              <option name="templateGroupName" value="Default" />
+            </TableInfoDTO>
+          </value>
+        </entry>
+        <entry key="cb.cb_venue">
+          <value>
+            <TableInfoDTO>
+              <option name="fullColumn">
+                <list>
+                  <ColumnInfoDTO>
+                    <option name="comment" value="id" />
+                    <option name="custom" value="false" />
+                    <option name="ext" value="{}" />
+                    <option name="name" value="id" />
+                    <option name="type" value="java.lang.Integer" />
+                  </ColumnInfoDTO>
+                  <ColumnInfoDTO>
+                    <option name="comment" value="创建者" />
+                    <option name="custom" value="false" />
+                    <option name="ext" value="{}" />
+                    <option name="name" value="createBy" />
+                    <option name="type" value="java.lang.String" />
+                  </ColumnInfoDTO>
+                  <ColumnInfoDTO>
+                    <option name="comment" value="创建时间" />
+                    <option name="custom" value="false" />
+                    <option name="ext" value="{}" />
+                    <option name="name" value="createTime" />
+                    <option name="type" value="java.util.Date" />
+                  </ColumnInfoDTO>
+                  <ColumnInfoDTO>
+                    <option name="comment" value="修改者" />
+                    <option name="custom" value="false" />
+                    <option name="ext" value="{}" />
+                    <option name="name" value="updateBy" />
+                    <option name="type" value="java.lang.String" />
+                  </ColumnInfoDTO>
+                  <ColumnInfoDTO>
+                    <option name="comment" value="修改时间" />
+                    <option name="custom" value="false" />
+                    <option name="ext" value="{}" />
+                    <option name="name" value="updateTime" />
+                    <option name="type" value="java.util.Date" />
+                  </ColumnInfoDTO>
+                  <ColumnInfoDTO>
+                    <option name="comment" value="删除标志 true/false 删除/未删除" />
+                    <option name="custom" value="false" />
+                    <option name="ext" value="{}" />
+                    <option name="name" value="deleteFlag" />
+                    <option name="type" value="java.lang.Integer" />
+                  </ColumnInfoDTO>
+                  <ColumnInfoDTO>
+                    <option name="comment" value="场地名称" />
+                    <option name="custom" value="false" />
+                    <option name="ext" value="{}" />
+                    <option name="name" value="venueName" />
+                    <option name="type" value="java.lang.String" />
+                  </ColumnInfoDTO>
+                  <ColumnInfoDTO>
+                    <option name="comment" value="门店id" />
+                    <option name="custom" value="false" />
+                    <option name="ext" value="{}" />
+                    <option name="name" value="storeId" />
+                    <option name="type" value="java.lang.Long" />
+                  </ColumnInfoDTO>
+                  <ColumnInfoDTO>
+                    <option name="comment" value="上午时间段半场价格" />
+                    <option name="custom" value="false" />
+                    <option name="ext" value="{}" />
+                    <option name="name" value="amHalfPrice" />
+                    <option name="type" value="java.lang.Double" />
+                  </ColumnInfoDTO>
+                  <ColumnInfoDTO>
+                    <option name="comment" value="下午篮球半场价格" />
+                    <option name="custom" value="false" />
+                    <option name="ext" value="{}" />
+                    <option name="name" value="pmHalfPrice" />
+                    <option name="type" value="java.lang.Double" />
+                  </ColumnInfoDTO>
+                  <ColumnInfoDTO>
+                    <option name="comment" value="上午篮球场,羽毛球场,乒乓球全场价格" />
+                    <option name="custom" value="false" />
+                    <option name="ext" value="{}" />
+                    <option name="name" value="amAllPrice" />
+                    <option name="type" value="java.lang.Double" />
+                  </ColumnInfoDTO>
+                  <ColumnInfoDTO>
+                    <option name="comment" value="下午篮球场全场,羽毛球,乒乓球场价格" />
+                    <option name="custom" value="false" />
+                    <option name="ext" value="{}" />
+                    <option name="name" value="pmAllPrice" />
+                    <option name="type" value="java.lang.Double" />
+                  </ColumnInfoDTO>
+                  <ColumnInfoDTO>
+                    <option name="comment" value="价格" />
+                    <option name="custom" value="false" />
+                    <option name="ext" value="{}" />
+                    <option name="name" value="price" />
+                    <option name="type" value="java.lang.Double" />
+                  </ColumnInfoDTO>
+                  <ColumnInfoDTO>
+                    <option name="comment" value="场地购买须知" />
+                    <option name="custom" value="false" />
+                    <option name="ext" value="{}" />
+                    <option name="name" value="purchaseInstructions" />
+                    <option name="type" value="java.lang.String" />
+                  </ColumnInfoDTO>
+                  <ColumnInfoDTO>
+                    <option name="comment" value="特殊价格" />
+                    <option name="custom" value="false" />
+                    <option name="ext" value="{}" />
+                    <option name="name" value="specialValue" />
+                    <option name="type" value="java.lang.String" />
+                  </ColumnInfoDTO>
+                  <ColumnInfoDTO>
+                    <option name="comment" value="场地类型0为篮球场,1为羽毛球场,2为乒乓球场" />
+                    <option name="custom" value="false" />
+                    <option name="ext" value="{}" />
+                    <option name="name" value="venueType" />
+                    <option name="type" value="java.lang.String" />
+                  </ColumnInfoDTO>
+                </list>
+              </option>
+              <option name="name" value="CbVenue" />
+              <option name="preName" value="cb_" />
+              <option name="saveModelName" value="framework" />
+              <option name="savePackageName" value="com.wteam.framework.modules.book" />
+              <option name="savePath" value="./framework/src/main/java/com/wteam/framework/modules/book" />
               <option name="templateGroupName" value="Default" />
             </TableInfoDTO>
           </value>

+ 31 - 0
.idea/inspectionProfiles/Project_Default.xml

@@ -1,6 +1,37 @@
 <component name="InspectionProjectProfileManager">
   <profile version="1.0">
     <option name="myName" value="Project Default" />
+    <inspection_tool class="AutoCloseableResource" enabled="true" level="WARNING" enabled_by_default="true">
+      <option name="METHOD_MATCHER_CONFIG" value="java.util.Formatter,format,java.io.Writer,append,com.google.common.base.Preconditions,checkNotNull,org.hibernate.Session,close,java.io.PrintWriter,printf,java.io.PrintStream,printf,cn.hutool.http.HttpRequest,execute" />
+    </inspection_tool>
+    <inspection_tool class="Deprecation" enabled="false" level="WARNING" enabled_by_default="false" />
+    <inspection_tool class="DuplicatedCode" enabled="true" level="WEAK WARNING" enabled_by_default="true">
+      <Languages>
+        <language minSize="316" name="Java" />
+      </Languages>
+    </inspection_tool>
+    <inspection_tool class="EqualsBetweenInconvertibleTypes" enabled="false" level="WARNING" enabled_by_default="false" />
+    <inspection_tool class="IgnoreResultOfCall" enabled="false" level="WARNING" enabled_by_default="false">
+      <option name="m_reportAllNonLibraryCalls" value="false" />
+      <option name="callCheckString" value="java.io.File,.*,java.io.InputStream,read|skip|available|markSupported,java.io.Reader,read|skip|ready|markSupported,java.lang.AbstractStringBuilder,capacity|codePointAt|codePointBefore|codePointCount|indexOf|lastIndexOf|offsetByCodePoints|substring|subSequence,java.lang.Boolean,.*,java.lang.Byte,.*,java.lang.Character,.*,java.lang.Double,.*,java.lang.Float,.*,java.lang.Integer,.*,java.lang.Long,.*,java.lang.Math,.*,java.lang.Object,equals|hashCode|toString,java.lang.Short,.*,java.lang.StrictMath,.*,java.lang.String,.*,java.lang.Thread,interrupted,java.math.BigDecimal,.*,java.math.BigInteger,.*,java.net.InetAddress,.*,java.net.URI,.*,java.nio.channels.AsynchronousChannelGroup,.*,java.nio.channels.Channel,isOpen,java.nio.channels.FileChannel,open|map|lock|tryLock|write,java.nio.channels.ScatteringByteChannel,read,java.nio.channels.SocketChannel,open|socket|isConnected|isConnectionPending,java.util.Arrays,.*,java.util.Collections,(?!addAll).*,java.util.List,of,java.util.Map,of|ofEntries|entry,java.util.Set,of,java.util.UUID,.*,java.util.concurrent.BlockingQueue,offer|remove,java.util.concurrent.CountDownLatch,await|getCount,java.util.concurrent.ExecutorService,awaitTermination|isShutdown|isTerminated,java.util.concurrent.ForkJoinPool,awaitQuiescence,java.util.concurrent.Semaphore,tryAcquire|availablePermits|isFair|hasQueuedThreads|getQueueLength|getQueuedThreads,java.util.concurrent.locks.Condition,await|awaitNanos|awaitUntil,java.util.concurrent.locks.Lock,tryLock|newCondition,java.util.regex.Matcher,pattern|toMatchResult|start|end|group|groupCount|matches|find|lookingAt|quoteReplacement|replaceAll|replaceFirst|regionStart|regionEnd|hasTransparentBounds|hasAnchoringBounds|hitEnd|requireEnd,java.util.regex.Pattern,.*,java.util.stream.BaseStream,.*,java.util.stream.DoubleStream,.*,java.util.stream.IntStream,.*,java.util.stream.LongStream,.*,java.util.stream.Stream,.*" />
+    </inspection_tool>
     <inspection_tool class="MavenModelInspection" enabled="false" level="ERROR" enabled_by_default="false" />
+    <inspection_tool class="MismatchedCollectionQueryUpdate" enabled="false" level="WARNING" enabled_by_default="false">
+      <option name="queryNames">
+        <value />
+      </option>
+      <option name="updateNames">
+        <value />
+      </option>
+      <option name="ignoredClasses">
+        <value />
+      </option>
+    </inspection_tool>
+    <inspection_tool class="RawUseOfParameterizedType" enabled="false" level="WARNING" enabled_by_default="false" />
+    <inspection_tool class="SpringJavaInjectionPointsAutowiringInspection" enabled="false" level="ERROR" enabled_by_default="false" />
+    <inspection_tool class="SuspiciousMethodCalls" enabled="false" level="WARNING" enabled_by_default="false">
+      <option name="REPORT_CONVERTIBLE_METHOD_CALLS" value="true" />
+    </inspection_tool>
+    <inspection_tool class="VulnerableCodeUsages" enabled="false" level="WARNING" enabled_by_default="false" />
   </profile>
 </component>

+ 408 - 18
.idea/workspace.xml

@@ -5,18 +5,243 @@
   </component>
   <component name="ChangeListManager">
     <list default="true" id="8eaaf244-eba9-47b2-a128-7c46802a5971" name="Changes" comment="">
-      <change afterPath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/book/entity/CbAddress.java" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/manager-api/src/main/java/com/wteam/framework/modules/book/entity/CbAdminUser.java" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/manager-api/src/main/java/com/wteam/framework/modules/book/entity/CbCard.java" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/manager-api/src/main/java/com/wteam/framework/modules/book/entity/CbCoupon.java" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/manager-api/src/main/java/com/wteam/framework/modules/book/entity/CbCouponUser.java" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/manager-api/src/main/java/com/wteam/framework/modules/book/entity/CbNotice.java" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/manager-api/src/main/java/com/wteam/framework/modules/book/entity/CbOrderInfo.java" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/manager-api/src/main/java/com/wteam/framework/modules/book/entity/CbOrderUser.java" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/manager-api/src/main/java/com/wteam/framework/modules/book/entity/CbRole.java" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/.idea/vcs.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/vcs.xml" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/.drone.yml" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/client-api/src/main/java/com/wteam/controller/card/CardAdminController.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/client-api/src/main/java/com/wteam/controller/card/CardController.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/client-api/src/main/java/com/wteam/controller/coupon/CouponController.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/client-api/src/main/java/com/wteam/controller/court/CourtController.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/client-api/src/main/java/com/wteam/controller/hardware/HardwareController.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/client-api/src/main/java/com/wteam/controller/order/OrderController.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/client-api/src/main/java/com/wteam/controller/order/QrCodeController.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/client-api/src/main/java/com/wteam/controller/payment/CashierController.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/client-api/src/main/java/com/wteam/controller/user/UserController.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/develop.sh" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/formal.sh" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/common/enums/CardTypeEnum.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/common/enums/OrderStatus.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/common/enums/OrderStatusEnum.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/common/enums/OrderTypeEnums.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/common/enums/orderTypeEnum.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/common/utils/AesCbcUtil.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/book/entity/LongJsonDeserializer.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/book/entity/LongJsonSerializer.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/book/entity/dto/OrderCardReq.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/book/entity/dto/OrderReq.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/book/entity/dto/StoreForm.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/book/entity/dto/StorePhotoDto.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/book/entity/dto/StoredCardDto.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/book/entity/reqp/TimeCalculation.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/book/entity/reqp/hardwareReq.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/book/entity/vo/CardVo.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/book/entity/vo/OrderInfoVo.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/book/entity/vo/OrderTicketVo.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/book/entity/vo/OrderVo.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/book/entity/vo/PaymentRequest.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/book/entity/vo/StoreDetailsVo.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/book/entity/vo/StoreVo.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/book/entity/vo/TimeCodeVo.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/book/entity/vo/VenueVo.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/book/mapper/CardMapper.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/book/mapper/CouponMapper.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/book/mapper/CouponUserMapper.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/book/mapper/OrderInfoMapper.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/book/mapper/PaymentInfoMapper.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/book/mapper/StoreMapper.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/book/mapper/VenueMapper.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/book/service/CardService.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/book/service/CouponService.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/book/service/OrderInfoService.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/book/service/PaymentInfoService.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/book/service/StoreService.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/book/service/VenueService.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/book/service/impl/CardServiceImpl.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/book/service/impl/CouponServiceImpl.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/book/service/impl/OrderInfoServiceImpl.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/book/service/impl/PaymentInfoServiceImpl.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/book/service/impl/StoreServiceImpl.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/book/service/impl/VenueServiceImpl.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/card/entity/CbCardAdmin.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/card/mapper/CardAdminMapper.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/card/service/CardAdminService.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/card/service/impl/CardAdminServiceImpl.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/hardware/ApiCallerUtil.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/hardware/ApiQrCodeUtil.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/hardware/RegistrationTask.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/image/entity/CbImage.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/image/mapper/CbImageMapper.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/image/service/CbImageService.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/image/service/impl/CbImageServiceImpl.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/pay/entity/vo/OrderStatusEnum.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/pay/interceptor/WxV3PayMessageInterceptor.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/pay/service/Payment.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/pay/serviceimpl/CashierSupport.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/pay/serviceimpl/WxV3PayPlugin.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/pay/serviceimpl/handler/BasePayMessageHandler.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/pay/serviceimpl/handler/MyPayMessageHandler.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/pay/serviceimpl/handler/WxV3PayMessageHandler.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/sms/service/SmsCheckService.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/sms/serviceimpl/SmsCheckServiceImpl.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/specialValue/entity/CbSpecialValue.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/specialValue/mapper/CbSpecialValueMapper.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/specialValue/service/CbSpecialValueService.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/specialValue/service/impl/CbSpecialValueServiceImpl.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/system/entity/dto/WechatPaymentSetting.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/user/entity/form/UpdateUserForm.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/local_history.patch" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/.idea/dataSources.local.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/dataSources.local.xml" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/.idea/dataSources.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/dataSources.xml" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/.idea/dataSources/a06efed9-eef7-4bc7-9f23-4e9d60c2cb7e.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/dataSources/a06efed9-eef7-4bc7-9f23-4e9d60c2cb7e.xml" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/.idea/easyCodeTableSetting.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/easyCodeTableSetting.xml" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/.idea/inspectionProfiles/Project_Default.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/inspectionProfiles/Project_Default.xml" afterDir="false" />
       <change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/client-api/pom.xml" beforeDir="false" afterPath="$PROJECT_DIR$/client-api/pom.xml" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/client-api/src/main/java/com/wteam/controller/passport/ConnectMemberWebController.java" beforeDir="false" afterPath="$PROJECT_DIR$/common-api/src/main/java/com/wteam/controller/passport/ConnectMemberWebController.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/client-api/src/main/java/com/wteam/controller/passport/FileController.java" beforeDir="false" afterPath="$PROJECT_DIR$/common-api/src/main/java/com/wteam/controller/passport/FileController.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/client-api/src/main/java/com/wteam/controller/passport/MemberController.java" beforeDir="false" afterPath="$PROJECT_DIR$/common-api/src/main/java/com/wteam/controller/passport/MemberController.java" afterDir="false" />
       <change beforePath="$PROJECT_DIR$/client-api/src/main/java/com/wteam/controller/sms/GetSmsController.java" beforeDir="false" afterPath="$PROJECT_DIR$/client-api/src/main/java/com/wteam/controller/sms/GetSmsController.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/client-api/src/main/java/com/wteam/controller/wxlogin/QRCodeController.java" beforeDir="false" afterPath="$PROJECT_DIR$/client-api/src/main/java/com/wteam/controller/wxlogin/QRCodeController.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/client-api/src/main/java/com/wteam/controller/wxlogin/WxMaUserController.java" beforeDir="false" afterPath="$PROJECT_DIR$/client-api/src/main/java/com/wteam/controller/wxlogin/WxMaUserController.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/client-api/src/main/java/com/wteam/security/ClientSecurityConfig.java" beforeDir="false" afterPath="$PROJECT_DIR$/client-api/src/main/java/com/wteam/security/ClientSecurityConfig.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/client-api/src/main/resources/application.yml" beforeDir="false" afterPath="$PROJECT_DIR$/client-api/src/main/resources/application.yml" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/client-api/target/classes/application.yml" beforeDir="false" afterPath="$PROJECT_DIR$/client-api/target/classes/application.yml" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/client-api/target/classes/com/wteam/controller/passport/ConnectMemberWebController.class" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/client-api/target/classes/com/wteam/controller/passport/FileController.class" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/client-api/target/classes/com/wteam/controller/passport/MemberController.class" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/client-api/target/classes/com/wteam/controller/sms/GetSmsController.class" beforeDir="false" afterPath="$PROJECT_DIR$/client-api/target/classes/com/wteam/controller/sms/GetSmsController.class" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/client-api/target/classes/com/wteam/controller/wxlogin/QRCodeController.class" beforeDir="false" afterPath="$PROJECT_DIR$/client-api/target/classes/com/wteam/controller/wxlogin/QRCodeController.class" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/client-api/target/classes/com/wteam/controller/wxlogin/WxMaUserController.class" beforeDir="false" afterPath="$PROJECT_DIR$/client-api/target/classes/com/wteam/controller/wxlogin/WxMaUserController.class" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/client-api/target/classes/com/wteam/security/ClientSecurityConfig.class" beforeDir="false" afterPath="$PROJECT_DIR$/client-api/target/classes/com/wteam/security/ClientSecurityConfig.class" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/common-api/src/main/resources/application.yml" beforeDir="false" afterPath="$PROJECT_DIR$/common-api/src/main/resources/application.yml" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/framework/pom.xml" beforeDir="false" afterPath="$PROJECT_DIR$/framework/pom.xml" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/common/enums/ResultCode.java" beforeDir="false" afterPath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/common/enums/ResultCode.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/common/security/AuthUser.java" beforeDir="false" afterPath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/common/security/AuthUser.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/common/security/context/UserContext.java" beforeDir="false" afterPath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/common/security/context/UserContext.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/common/security/token/manager/ManagerTokenGenerate.java" beforeDir="false" afterPath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/common/security/token/manager/ManagerTokenGenerate.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/common/utils/SnowFlake.java" beforeDir="false" afterPath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/common/utils/SnowFlake.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/book/entity/AdminUser.java" beforeDir="false" afterPath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/book/entity/AdminUser.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/book/entity/Card.java" beforeDir="false" afterPath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/book/entity/Card.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/book/entity/Coupon.java" beforeDir="false" afterPath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/book/entity/Coupon.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/book/entity/CouponUser.java" beforeDir="false" afterPath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/book/entity/CouponUser.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/book/entity/Notice.java" beforeDir="false" afterPath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/book/entity/Notice.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/book/entity/OrderInfo.java" beforeDir="false" afterPath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/book/entity/OrderInfo.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/book/entity/OrderUser.java" beforeDir="false" afterPath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/book/entity/OrderUser.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/book/entity/PaymentInfo.java" beforeDir="false" afterPath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/book/entity/PaymentInfo.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/book/entity/Role.java" beforeDir="false" afterPath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/book/entity/Role.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/book/entity/RoleMenu.java" beforeDir="false" afterPath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/book/entity/RoleMenu.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/book/entity/Store.java" beforeDir="false" afterPath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/book/entity/Store.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/book/entity/Vdstate.java" beforeDir="false" afterPath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/book/entity/Vdstate.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/book/entity/Venue.java" beforeDir="false" afterPath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/book/entity/Venue.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/connect/config/AuthConfig.java" beforeDir="false" afterPath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/connect/config/AuthConfig.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/connect/entity/dto/WechatMPLoginParams.java" beforeDir="false" afterPath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/connect/entity/dto/WechatMPLoginParams.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/connect/entity/enums/AuthUserGender.java" beforeDir="false" afterPath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/connect/entity/enums/AuthUserGender.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/connect/request/AuthRequest.java" beforeDir="false" afterPath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/connect/request/AuthRequest.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/connect/request/BaseAuthAlipayRequest.java" beforeDir="false" afterPath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/connect/request/BaseAuthAlipayRequest.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/connect/util/AuthChecker.java" beforeDir="false" afterPath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/connect/util/AuthChecker.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/connect/util/ConnectUtil.java" beforeDir="false" afterPath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/connect/util/ConnectUtil.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/file/entity/dos/File.java" beforeDir="false" afterPath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/file/entity/dos/File.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/file/entity/dto/FileDto.java" beforeDir="false" afterPath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/file/entity/dto/FileDto.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/file/mapper/FileMapper.java" beforeDir="false" afterPath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/file/mapper/FileMapper.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/file/plugin/FilePluginFactory.java" beforeDir="false" afterPath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/file/plugin/FilePluginFactory.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/file/plugin/impl/AliFilePlugin.java" beforeDir="false" afterPath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/file/plugin/impl/AliFilePlugin.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/file/service/FileService.java" beforeDir="false" afterPath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/file/service/FileService.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/file/serviceimpl/FileServiceImpl.java" beforeDir="false" afterPath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/file/serviceimpl/FileServiceImpl.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/member/entity/dto/MemberAddDTO.java" beforeDir="false" afterPath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/member/entity/dto/MemberAddDTO.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/member/entity/dto/MemberAddressDTO.java" beforeDir="false" afterPath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/member/entity/dto/MemberAddressDTO.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/member/entity/dto/MemberEditDTO.java" beforeDir="false" afterPath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/member/entity/dto/MemberEditDTO.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/member/entity/enums/QRCodeLoginSessionStatusEnum.java" beforeDir="false" afterPath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/member/entity/enums/QRCodeLoginSessionStatusEnum.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/member/entity/vo/MemberSearchVO.java" beforeDir="false" afterPath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/member/entity/vo/MemberSearchVO.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/member/mapper/MemberMapper.java" beforeDir="false" afterPath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/member/mapper/MemberMapper.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/member/service/MemberService.java" beforeDir="false" afterPath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/member/service/MemberService.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/oss/service/OssService.java" beforeDir="false" afterPath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/oss/service/OssService.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/payment/entity/dto/PayParam.java" beforeDir="false" afterPath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/pay/entity/dto/PayParam.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/payment/entity/enums/OrderOrItemEnum.java" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/payment/entity/enums/PayStatusEnum.java" beforeDir="false" afterPath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/pay/entity/enums/PayStatusEnum.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/payment/entity/enums/PaymentClientEnum.java" beforeDir="false" afterPath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/pay/entity/enums/PaymentClientEnum.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/payment/entity/enums/PaymentMethodEnum.java" beforeDir="false" afterPath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/pay/entity/enums/PaymentMethodEnum.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/payment/entity/vo/CallbackParamVO.java" beforeDir="false" afterPath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/pay/entity/vo/CallbackParamVO.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/permission/entity/enums/userEnum.java" beforeDir="false" afterPath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/permission/entity/enums/userEnum.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/permission/entity/vo/AdminUserVO.java" beforeDir="false" afterPath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/permission/entity/vo/AdminUserVO.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/permission/entity/vo/SystemLogVO.java" beforeDir="false" afterPath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/permission/entity/vo/SystemLogVO.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/permission/entity/vo/UserMenuVO.java" beforeDir="false" afterPath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/permission/entity/vo/UserMenuVO.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/permission/mapper/AdminUserMapper.java" beforeDir="false" afterPath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/permission/mapper/AdminUserMapper.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/permission/mapper/RoleMenuMapper.java" beforeDir="false" afterPath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/permission/mapper/RoleMenuMapper.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/permission/mapper/RolePermissionMapper.java" beforeDir="false" afterPath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/permission/mapper/RolePermissionMapper.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/permission/mapper/UserRoleMapper.java" beforeDir="false" afterPath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/permission/mapper/UserRoleMapper.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/permission/service/AdminUserService.java" beforeDir="false" afterPath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/permission/service/AdminUserService.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/permission/service/RoleService.java" beforeDir="false" afterPath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/permission/service/RoleService.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/permission/service/UserRoleService.java" beforeDir="false" afterPath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/permission/service/UserRoleService.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/permission/service/impl/RoleMenuServiceImpl.java" beforeDir="false" afterPath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/permission/service/impl/RoleMenuServiceImpl.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/sms/AliSmsUtil.java" beforeDir="false" afterPath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/sms/AliSmsUtil.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/sms/entity/dos/SmsSign.java" beforeDir="false" afterPath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/sms/entity/dos/SmsSign.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/sms/entity/dos/SmsTemplate.java" beforeDir="false" afterPath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/sms/entity/dos/SmsTemplate.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/sms/mapper/SmsSignMapper.java" beforeDir="false" afterPath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/sms/mapper/SmsSignMapper.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/sms/mapper/SmsTemplateMapper.java" beforeDir="false" afterPath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/sms/mapper/SmsTemplateMapper.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/sms/service/SmsSignService.java" beforeDir="false" afterPath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/sms/service/SmsSignService.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/sms/serviceimpl/SmsSignServiceImpl.java" beforeDir="false" afterPath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/sms/serviceimpl/SmsSignServiceImpl.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/sms/serviceimpl/SmsTemplateServiceImpl.java" beforeDir="false" afterPath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/sms/serviceimpl/SmsTemplateServiceImpl.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/sms/serviceimpl/SmsUtilAliImplService.java" beforeDir="false" afterPath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/sms/serviceimpl/SmsUtilAliImplService.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/system/entity/dos/Region.java" beforeDir="false" afterPath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/system/entity/dos/Region.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/system/entity/dos/Setting.java" beforeDir="false" afterPath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/system/entity/dos/Setting.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/system/entity/dto/SmsSetting.java" beforeDir="false" afterPath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/system/entity/dto/SmsSetting.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/system/entity/dto/connect/WechatConnectSetting.java" beforeDir="false" afterPath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/system/entity/dto/connect/WechatConnectSetting.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/system/entity/dto/connect/WechatConnectSettingItem.java" beforeDir="false" afterPath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/system/entity/dto/connect/WechatConnectSettingItem.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/system/mapper/RegionMapper.java" beforeDir="false" afterPath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/system/mapper/RegionMapper.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/system/mapper/SettingMapper.java" beforeDir="false" afterPath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/system/mapper/SettingMapper.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/system/mapper/VerificationSourceMapper.java" beforeDir="false" afterPath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/system/mapper/VerificationSourceMapper.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/system/server/Cpu.java" beforeDir="false" afterPath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/system/server/Cpu.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/system/server/Jvm.java" beforeDir="false" afterPath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/system/server/Jvm.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/system/server/Mem.java" beforeDir="false" afterPath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/system/server/Mem.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/system/server/Server.java" beforeDir="false" afterPath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/system/server/Server.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/system/server/Sys.java" beforeDir="false" afterPath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/system/server/Sys.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/system/server/SysFile.java" beforeDir="false" afterPath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/system/server/SysFile.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/system/service/SettingService.java" beforeDir="false" afterPath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/system/service/SettingService.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/user/config/wechat/WxMaConfiguration.java" beforeDir="false" afterPath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/user/config/wechat/WxMaConfiguration.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/user/entity/User.java" beforeDir="false" afterPath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/user/entity/User.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/user/service/UserService.java" beforeDir="false" afterPath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/user/service/UserService.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/user/service/impl/UserServiceImpl.java" beforeDir="false" afterPath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/user/service/impl/UserServiceImpl.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/user/token/UserTokenGenerate.java" beforeDir="false" afterPath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/user/token/UserTokenGenerate.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/verification/aop/annotation/Verification.java" beforeDir="false" afterPath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/verification/aop/annotation/Verification.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/verification/entity/dos/VerificationSource.java" beforeDir="false" afterPath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/verification/entity/dos/VerificationSource.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/wxcode/WxAccessToken.java" beforeDir="false" afterPath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/wxcode/WxAccessToken.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/wxcode/WxCode.java" beforeDir="false" afterPath="$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/wxcode/WxCode.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/framework/target/classes/META-INF/spring-configuration-metadata.json" beforeDir="false" afterPath="$PROJECT_DIR$/framework/target/classes/META-INF/spring-configuration-metadata.json" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/framework/target/classes/com/wteam/framework/common/enums/ResultCode.class" beforeDir="false" afterPath="$PROJECT_DIR$/framework/target/classes/com/wteam/framework/common/enums/ResultCode.class" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/framework/target/classes/com/wteam/framework/common/security/AuthUser.class" beforeDir="false" afterPath="$PROJECT_DIR$/framework/target/classes/com/wteam/framework/common/security/AuthUser.class" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/framework/target/classes/com/wteam/framework/common/security/context/UserContext.class" beforeDir="false" afterPath="$PROJECT_DIR$/framework/target/classes/com/wteam/framework/common/security/context/UserContext.class" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/framework/target/classes/com/wteam/framework/common/security/token/manager/ManagerTokenGenerate.class" beforeDir="false" afterPath="$PROJECT_DIR$/framework/target/classes/com/wteam/framework/common/security/token/manager/ManagerTokenGenerate.class" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/framework/target/classes/com/wteam/framework/modules/connect/entity/dto/WechatMPLoginParams.class" beforeDir="false" afterPath="$PROJECT_DIR$/framework/target/classes/com/wteam/framework/modules/connect/entity/dto/WechatMPLoginParams.class" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/framework/target/classes/com/wteam/framework/modules/connect/request/AuthRequest.class" beforeDir="false" afterPath="$PROJECT_DIR$/framework/target/classes/com/wteam/framework/modules/connect/request/AuthRequest.class" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/framework/target/classes/com/wteam/framework/modules/connect/util/ConnectUtil$1.class" beforeDir="false" afterPath="$PROJECT_DIR$/framework/target/classes/com/wteam/framework/modules/connect/util/ConnectUtil$1.class" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/framework/target/classes/com/wteam/framework/modules/connect/util/ConnectUtil.class" beforeDir="false" afterPath="$PROJECT_DIR$/framework/target/classes/com/wteam/framework/modules/connect/util/ConnectUtil.class" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/framework/target/classes/com/wteam/framework/modules/file/entity/dto/FileDto.class" beforeDir="false" afterPath="$PROJECT_DIR$/framework/target/classes/com/wteam/framework/modules/file/entity/dto/FileDto.class" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/framework/target/classes/com/wteam/framework/modules/file/plugin/impl/AliFilePlugin.class" beforeDir="false" afterPath="$PROJECT_DIR$/framework/target/classes/com/wteam/framework/modules/file/plugin/impl/AliFilePlugin.class" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/framework/target/classes/com/wteam/framework/modules/member/entity/enums/QRCodeLoginSessionStatusEnum.class" beforeDir="false" afterPath="$PROJECT_DIR$/framework/target/classes/com/wteam/framework/modules/member/entity/enums/QRCodeLoginSessionStatusEnum.class" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/framework/target/classes/com/wteam/framework/modules/payment/entity/dto/PayParam.class" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/framework/target/classes/com/wteam/framework/modules/payment/entity/enums/OrderOrItemEnum.class" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/framework/target/classes/com/wteam/framework/modules/payment/entity/enums/PayStatusEnum.class" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/framework/target/classes/com/wteam/framework/modules/payment/entity/enums/PaymentClientEnum.class" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/framework/target/classes/com/wteam/framework/modules/payment/entity/enums/PaymentMethodEnum.class" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/framework/target/classes/com/wteam/framework/modules/payment/entity/vo/CallbackParamVO.class" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/framework/target/classes/com/wteam/framework/modules/permission/entity/enums/userEnum.class" beforeDir="false" afterPath="$PROJECT_DIR$/framework/target/classes/com/wteam/framework/modules/permission/entity/enums/userEnum.class" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/framework/target/classes/com/wteam/framework/modules/sms/serviceimpl/SmsSignServiceImpl.class" beforeDir="false" afterPath="$PROJECT_DIR$/framework/target/classes/com/wteam/framework/modules/sms/serviceimpl/SmsSignServiceImpl.class" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/framework/target/classes/com/wteam/framework/modules/sms/serviceimpl/SmsTemplateServiceImpl.class" beforeDir="false" afterPath="$PROJECT_DIR$/framework/target/classes/com/wteam/framework/modules/sms/serviceimpl/SmsTemplateServiceImpl.class" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/framework/target/classes/com/wteam/framework/modules/system/entity/dos/Region.class" beforeDir="false" afterPath="$PROJECT_DIR$/framework/target/classes/com/wteam/framework/modules/system/entity/dos/Region.class" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/framework/target/classes/com/wteam/framework/modules/system/entity/dos/Setting.class" beforeDir="false" afterPath="$PROJECT_DIR$/framework/target/classes/com/wteam/framework/modules/system/entity/dos/Setting.class" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/framework/target/classes/com/wteam/framework/modules/system/entity/dto/SmsSetting.class" beforeDir="false" afterPath="$PROJECT_DIR$/framework/target/classes/com/wteam/framework/modules/system/entity/dto/SmsSetting.class" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/framework/target/classes/com/wteam/framework/modules/system/entity/dto/connect/WechatConnectSetting.class" beforeDir="false" afterPath="$PROJECT_DIR$/framework/target/classes/com/wteam/framework/modules/system/entity/dto/connect/WechatConnectSetting.class" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/framework/target/classes/com/wteam/framework/modules/system/entity/dto/connect/WechatConnectSettingItem.class" beforeDir="false" afterPath="$PROJECT_DIR$/framework/target/classes/com/wteam/framework/modules/system/entity/dto/connect/WechatConnectSettingItem.class" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/framework/target/classes/com/wteam/framework/modules/system/server/Cpu.class" beforeDir="false" afterPath="$PROJECT_DIR$/framework/target/classes/com/wteam/framework/modules/system/server/Cpu.class" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/framework/target/classes/com/wteam/framework/modules/system/server/Jvm.class" beforeDir="false" afterPath="$PROJECT_DIR$/framework/target/classes/com/wteam/framework/modules/system/server/Jvm.class" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/framework/target/classes/com/wteam/framework/modules/system/server/Mem.class" beforeDir="false" afterPath="$PROJECT_DIR$/framework/target/classes/com/wteam/framework/modules/system/server/Mem.class" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/framework/target/classes/com/wteam/framework/modules/system/server/Server.class" beforeDir="false" afterPath="$PROJECT_DIR$/framework/target/classes/com/wteam/framework/modules/system/server/Server.class" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/framework/target/classes/com/wteam/framework/modules/system/server/Sys.class" beforeDir="false" afterPath="$PROJECT_DIR$/framework/target/classes/com/wteam/framework/modules/system/server/Sys.class" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/framework/target/classes/com/wteam/framework/modules/system/server/SysFile.class" beforeDir="false" afterPath="$PROJECT_DIR$/framework/target/classes/com/wteam/framework/modules/system/server/SysFile.class" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/framework/target/classes/com/wteam/framework/modules/user/config/wechat/WxMaConfiguration.class" beforeDir="false" afterPath="$PROJECT_DIR$/framework/target/classes/com/wteam/framework/modules/user/config/wechat/WxMaConfiguration.class" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/framework/target/classes/com/wteam/framework/modules/user/entity/User.class" beforeDir="false" afterPath="$PROJECT_DIR$/framework/target/classes/com/wteam/framework/modules/user/entity/User.class" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/framework/target/classes/com/wteam/framework/modules/user/service/UserService.class" beforeDir="false" afterPath="$PROJECT_DIR$/framework/target/classes/com/wteam/framework/modules/user/service/UserService.class" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/framework/target/classes/com/wteam/framework/modules/user/service/impl/UserServiceImpl.class" beforeDir="false" afterPath="$PROJECT_DIR$/framework/target/classes/com/wteam/framework/modules/user/service/impl/UserServiceImpl.class" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/framework/target/classes/com/wteam/framework/modules/user/token/UserTokenGenerate.class" beforeDir="false" afterPath="$PROJECT_DIR$/framework/target/classes/com/wteam/framework/modules/user/token/UserTokenGenerate.class" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/framework/target/classes/com/wteam/framework/modules/verification/entity/dos/VerificationSource.class" beforeDir="false" afterPath="$PROJECT_DIR$/framework/target/classes/com/wteam/framework/modules/verification/entity/dos/VerificationSource.class" afterDir="false" />
     </list>
     <option name="SHOW_DIALOG" value="false" />
     <option name="HIGHLIGHT_CONFLICTS" value="true" />
@@ -26,6 +251,8 @@
   <component name="FileTemplateManagerImpl">
     <option name="RECENT_TEMPLATES">
       <list>
+        <option value="Enum" />
+        <option value="Interface" />
         <option value="Class" />
       </list>
     </option>
@@ -38,6 +265,9 @@
     </option>
     <option name="RECENT_GIT_ROOT_PATH" value="$PROJECT_DIR$" />
   </component>
+  <component name="HighlightingSettingsPerFile">
+    <setting file="file://$PROJECT_DIR$/client-api/src/main/java/com/wteam/controller/payment/CashierController.java" root0="FORCE_HIGHLIGHTING" />
+  </component>
   <component name="MarkdownSettingsMigration">
     <option name="stateVersion" value="1" />
   </component>
@@ -68,10 +298,12 @@
     "RequestMappingsPanelOrder1": "1",
     "RequestMappingsPanelWidth0": "75",
     "RequestMappingsPanelWidth1": "75",
+    "RunOnceActivity.OpenProjectViewOnStart": "true",
     "RunOnceActivity.ShowReadmeOnStart": "true",
+    "ToolWindowRun.ShowToolbar": "false",
     "WebServerToolWindowFactoryState": "false",
-    "git-widget-placeholder": "dev",
-    "last_opened_file_path": "D:/pojo/courtBooking/court_booking/framework/src/main/java/com/wteam/framework/modules/sms/entity/dos",
+    "git-widget-placeholder": "master",
+    "last_opened_file_path": "D:/gdou-canteen",
     "node.js.detected.package.eslint": "true",
     "node.js.detected.package.tslint": "true",
     "node.js.selected.package.eslint": "(autodetect)",
@@ -80,8 +312,8 @@
     "project.structure.last.edited": "Project",
     "project.structure.proportion": "0.0",
     "project.structure.side.proportion": "0.0",
-    "settings.editor.selected.configurable": "project.propVCSSupport.DirectoryMappings",
-    "spring.configuration.checksum": "0e2dd036aa3ce9d5894324f030e050fe",
+    "settings.editor.selected.configurable": "editing.templates",
+    "spring.configuration.checksum": "8c885b1d9b6b77e9df49058579a3cf2a",
     "vue.rearranger.settings.migration": "true"
   },
   "keyToStringList": {
@@ -94,17 +326,26 @@
     <option name="notificationShown" value="true" />
   </component>
   <component name="RecentsManager">
+    <key name="CreateClassDialog.RecentsKey">
+      <recent name="com.wteam.framework.modules.image.mapper.service.impl" />
+    </key>
     <key name="CopyFile.RECENT_KEYS">
+      <recent name="D:\pojo\courtBooking\court_booking\framework\src\main\java\com\wteam\framework\modules\pay" />
       <recent name="D:\pojo\courtBooking\court_booking\framework\src\main\java\com\wteam\framework\modules\sms\entity\dos" />
       <recent name="D:\pojo\courtBooking\background-template\framework\src\main\java\com\wteam\framework\modules" />
       <recent name="D:\pojo\courtBooking\background-template\client-api\src\main\java\com\wteam\controller\wxlogin" />
     </key>
+    <key name="MoveFile.RECENT_KEYS">
+      <recent name="D:\pojo\courtBooking\court_booking\common-api\src\main\java\com\wteam\controller" />
+      <recent name="D:\pojo\courtBooking\court_booking\framework\src\main\resources\pem" />
+      <recent name="D:\pojo\courtBooking\court_booking\framework\src\main\resources" />
+    </key>
     <key name="CopyClassDialog.RECENTS_KEY">
-      <recent name="com.wteam.framework.modules.payment.interceptor" />
-      <recent name="com.wteam.framework.modules.payment.entity.vo" />
-      <recent name="com.wteam.framework.modules.payment.entity.dto" />
-      <recent name="com.wteam.framework.modules.payment.enums" />
+      <recent name="com.wteam.framework.modules.pay.serviceimpl" />
+      <recent name="com.wteam.framework.modules.pay.entity.vo" />
+      <recent name="com.wteam.framework.common.utils" />
       <recent name="com.wteam.controller.payment" />
+      <recent name="com.wteam.framework.modules.payment.interceptor" />
     </key>
   </component>
   <component name="RunAnythingCache">
@@ -121,6 +362,71 @@
     </option>
   </component>
   <component name="RunManager" selected="Spring Boot.ClientApiApplication">
+    <configuration name="ApiCallerUtil" type="Application" factoryName="Application" temporary="true" nameIsGenerated="true">
+      <option name="MAIN_CLASS_NAME" value="com.wteam.framework.modules.hardware.ApiCallerUtil" />
+      <module name="framework" />
+      <extension name="coverage">
+        <pattern>
+          <option name="PATTERN" value="com.wteam.framework.modules.hardware.*" />
+          <option name="ENABLED" value="true" />
+        </pattern>
+      </extension>
+      <method v="2">
+        <option name="Make" enabled="true" />
+      </method>
+    </configuration>
+    <configuration name="RegistrationTask" type="Application" factoryName="Application" temporary="true" nameIsGenerated="true">
+      <option name="MAIN_CLASS_NAME" value="com.wteam.framework.modules.hardware.RegistrationTask" />
+      <module name="framework" />
+      <extension name="coverage">
+        <pattern>
+          <option name="PATTERN" value="com.wteam.framework.modules.hardware.*" />
+          <option name="ENABLED" value="true" />
+        </pattern>
+      </extension>
+      <method v="2">
+        <option name="Make" enabled="true" />
+      </method>
+    </configuration>
+    <configuration name="SnowFlake" type="Application" factoryName="Application" temporary="true" nameIsGenerated="true">
+      <option name="MAIN_CLASS_NAME" value="com.wteam.framework.common.utils.SnowFlake" />
+      <module name="framework" />
+      <extension name="coverage">
+        <pattern>
+          <option name="PATTERN" value="com.wteam.framework.common.utils.*" />
+          <option name="ENABLED" value="true" />
+        </pattern>
+      </extension>
+      <method v="2">
+        <option name="Make" enabled="true" />
+      </method>
+    </configuration>
+    <configuration name="TimeCalculation" type="Application" factoryName="Application" temporary="true" nameIsGenerated="true">
+      <option name="MAIN_CLASS_NAME" value="com.wteam.framework.modules.book.entity.reqp.TimeCalculation" />
+      <module name="framework" />
+      <extension name="coverage">
+        <pattern>
+          <option name="PATTERN" value="com.wteam.framework.modules.book.entity.reqp.*" />
+          <option name="ENABLED" value="true" />
+        </pattern>
+      </extension>
+      <method v="2">
+        <option name="Make" enabled="true" />
+      </method>
+    </configuration>
+    <configuration name="WechatUtil" type="Application" factoryName="Application" temporary="true" nameIsGenerated="true">
+      <option name="MAIN_CLASS_NAME" value="com.wteam.framework.common.utils.WechatUtil" />
+      <module name="framework" />
+      <extension name="coverage">
+        <pattern>
+          <option name="PATTERN" value="com.wteam.framework.common.utils.*" />
+          <option name="ENABLED" value="true" />
+        </pattern>
+      </extension>
+      <method v="2">
+        <option name="Make" enabled="true" />
+      </method>
+    </configuration>
     <configuration default="true" type="JetRunConfigurationType">
       <module name="background-template" />
       <method v="2">
@@ -134,6 +440,19 @@
         <option name="Make" enabled="true" />
       </method>
     </configuration>
+    <configuration name="139" type="Remote">
+      <option name="USE_SOCKET_TRANSPORT" value="true" />
+      <option name="SERVER_MODE" value="false" />
+      <option name="SHMEM_ADDRESS" />
+      <option name="HOST" value="139.9.38.185" />
+      <option name="PORT" value="5005" />
+      <option name="AUTO_RESTART" value="false" />
+      <RunnerSettings RunnerId="Debug">
+        <option name="DEBUG_PORT" value="5005" />
+        <option name="LOCAL" value="false" />
+      </RunnerSettings>
+      <method v="2" />
+    </configuration>
     <configuration name="ClientApiApplication" type="SpringBootApplicationConfigurationType" factoryName="Spring Boot" nameIsGenerated="true">
       <module name="client-api" />
       <option name="SPRING_BOOT_MAIN_CLASS" value="com.wteam.ClientApiApplication" />
@@ -155,6 +474,26 @@
         <option name="Make" enabled="true" />
       </method>
     </configuration>
+    <list>
+      <item itemvalue="Application.SnowFlake" />
+      <item itemvalue="Application.WechatUtil" />
+      <item itemvalue="Application.ApiCallerUtil" />
+      <item itemvalue="Application.RegistrationTask" />
+      <item itemvalue="Application.TimeCalculation" />
+      <item itemvalue="Remote JVM Debug.139" />
+      <item itemvalue="Spring Boot.ClientApiApplication" />
+      <item itemvalue="Spring Boot.CommonApiApplication" />
+      <item itemvalue="Spring Boot.ManagerApplication" />
+    </list>
+    <recent_temporary>
+      <list>
+        <item itemvalue="Application.RegistrationTask" />
+        <item itemvalue="Application.ApiCallerUtil" />
+        <item itemvalue="Application.WechatUtil" />
+        <item itemvalue="Application.SnowFlake" />
+        <item itemvalue="Application.TimeCalculation" />
+      </list>
+    </recent_temporary>
   </component>
   <component name="SpellCheckerSettings" RuntimeDictionaries="0" Folders="0" CustomDictionaries="0" DefaultDictionary="application-level" UseSingleDictionary="true" transferred="true" />
   <component name="TaskManager">
@@ -167,15 +506,66 @@
       <workItem from="1694782470230" duration="4285000" />
       <workItem from="1694786794782" duration="1500000" />
       <workItem from="1694788815274" duration="12819000" />
+      <workItem from="1695461162213" duration="45802000" />
+      <workItem from="1695801060207" duration="351000" />
+      <workItem from="1695801446071" duration="2692000" />
+      <workItem from="1695812791369" duration="21661000" />
+      <workItem from="1695907845794" duration="55213000" />
+      <workItem from="1696019978925" duration="151008000" />
+      <workItem from="1696601308312" duration="675000" />
+      <workItem from="1696674064486" duration="8434000" />
+      <workItem from="1696685203750" duration="20365000" />
     </task>
     <servers />
   </component>
   <component name="TypeScriptGeneratedFilesManager">
     <option name="version" value="3" />
   </component>
+  <component name="Vcs.Log.Tabs.Properties">
+    <option name="TAB_STATES">
+      <map>
+        <entry key="MAIN">
+          <value>
+            <State />
+          </value>
+        </entry>
+      </map>
+    </option>
+  </component>
   <component name="VcsManagerConfiguration">
     <option name="ADD_EXTERNAL_FILES_SILENTLY" value="true" />
   </component>
+  <component name="XDebuggerManager">
+    <breakpoint-manager>
+      <breakpoints>
+        <line-breakpoint enabled="true" type="java-line">
+          <url>file://$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/book/service/impl/OrderInfoServiceImpl.java</url>
+          <line>344</line>
+          <option name="timeStamp" value="1" />
+        </line-breakpoint>
+        <line-breakpoint enabled="true" type="java-line">
+          <url>file://$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/book/service/impl/OrderInfoServiceImpl.java</url>
+          <line>343</line>
+          <option name="timeStamp" value="2" />
+        </line-breakpoint>
+        <line-breakpoint enabled="true" type="java-line">
+          <url>file://$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/book/service/impl/OrderInfoServiceImpl.java</url>
+          <line>342</line>
+          <option name="timeStamp" value="3" />
+        </line-breakpoint>
+        <line-breakpoint enabled="true" type="java-line">
+          <url>file://$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/book/service/impl/OrderInfoServiceImpl.java</url>
+          <line>341</line>
+          <option name="timeStamp" value="4" />
+        </line-breakpoint>
+        <line-breakpoint enabled="true" type="java-line">
+          <url>file://$PROJECT_DIR$/framework/src/main/java/com/wteam/framework/modules/book/service/impl/OrderInfoServiceImpl.java</url>
+          <line>340</line>
+          <option name="timeStamp" value="5" />
+        </line-breakpoint>
+      </breakpoints>
+    </breakpoint-manager>
+  </component>
   <component name="XSLT-Support.FileAssociations.UIState">
     <expand />
     <select />

+ 6 - 0
client-api/pom.xml

@@ -32,6 +32,12 @@
             <optional>true</optional>
         </dependency>
 
+        <!-- 微信支付V3 目前新版本-->
+        <dependency>
+            <groupId>com.github.wechatpay-apiv3</groupId>
+            <artifactId>wechatpay-apache-httpclient</artifactId>
+            <version>0.4.7</version>
+        </dependency>
         <dependency>
             <groupId>redis.clients</groupId>
             <artifactId>jedis</artifactId>

+ 49 - 0
client-api/src/main/java/com/wteam/controller/card/CardAdminController.java

@@ -0,0 +1,49 @@
+package com.wteam.controller.card;
+
+import com.wteam.framework.common.enums.CardTypeEnum;
+import com.wteam.framework.common.vo.ResultMessage;
+import com.wteam.framework.modules.book.entity.Card;
+import com.wteam.framework.modules.card.entity.CbCardAdmin;
+import com.wteam.framework.modules.card.service.CardAdminService;
+import io.swagger.annotations.ApiParam;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+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 javax.validation.constraints.NotNull;
+import java.util.List;
+
+/**
+ * @author doncic
+ * @date 2023/10/7 22:40
+ */
+@Slf4j
+@Tag(name = "管理卡相关接口管理")
+@RestController
+@RequestMapping("/v1/cardAdmin")
+public class CardAdminController {
+
+
+
+    @Autowired
+    private CardAdminService cardAdminService;
+
+
+    /**
+     * 展示这个门店的所有卡
+     *
+     * @return
+     */
+    @Operation(summary = "展示该门店所有卡")
+    @GetMapping("/showAllCard/{cardTypeEnum}")
+    public ResultMessage<List<CbCardAdmin>> showAllCard(
+            @NotNull @PathVariable CardTypeEnum cardTypeEnum) {
+        return cardAdminService.showAllCard(cardTypeEnum);
+    }
+
+}

+ 144 - 0
client-api/src/main/java/com/wteam/controller/card/CardController.java

@@ -0,0 +1,144 @@
+package com.wteam.controller.card;
+
+import com.jeequan.jeepay.exception.JeepayException;
+import com.wteam.framework.common.enums.CardTypeEnum;
+import com.wteam.framework.common.enums.ResultUtil;
+import com.wteam.framework.common.vo.ResultMessage;
+import com.wteam.framework.modules.book.entity.Card;
+import com.wteam.framework.modules.book.entity.dto.OrderCardReq;
+import com.wteam.framework.modules.book.entity.dto.OrderReq;
+import com.wteam.framework.modules.book.entity.vo.CardVo;
+import com.wteam.framework.modules.book.service.CardService;
+import io.swagger.annotations.ApiParam;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+/**
+ * @author doncic
+ * @date 2023/9/18 19:18
+ */
+@Slf4j
+@Tag(name = "卡相关接口管理")
+@RestController
+@RequestMapping("/v1/card")
+public class CardController {
+
+
+    @Autowired
+    private CardService cardService;
+
+    /**
+     * 查询出该门店下的卡
+     * 通过枚举来区别卡类型
+     *
+     * @param id           门店id
+     * @param cardTypeEnum
+     * @return
+     */
+    @Operation(summary = "展示该门店所有卡")
+    @GetMapping("/{cardTypeEnum}/{id}")
+    public ResultMessage<List<Card>> showCard(
+            @ApiParam(value = "卡ID", required = true) @PathVariable("id") Long id,
+            @PathVariable CardTypeEnum cardTypeEnum) {
+        return cardService.showCard(id, cardTypeEnum);
+    }
+
+
+    /**
+     * 查看卡的详细信息
+     *
+     * @return
+     */
+    @Operation(summary = "展示卡详细信息")
+    @PostMapping("/showCardDetails/{id}")
+    public ResultMessage<CardVo> showCardDetails(@ApiParam(value = "卡ID", required = true) @PathVariable("id") Long id) {
+        return cardService.showCardDetails(id);
+    }
+
+//    /**
+//     * 月卡和次卡的购买
+//     *
+//     * @param accessToken
+//     * @param orderId
+//     * @param cardId
+//     * @return
+//     */
+//    @Operation(summary = "月卡和次卡购买")
+//    @PostMapping("/buyCard/{accessToken}/{orderId}/{cardId}")
+//    public ResultMessage<String> buyCard(
+//            @PathVariable("accessToken") String accessToken,
+//            @ApiParam(value = "订单ID", required = true) @PathVariable String orderId,
+//            @ApiParam(value = "卡ID", required = true) @PathVariable Long cardId) {
+//        return cardService.buyCard(accessToken, orderId, cardId);
+//    }
+
+//    @Operation(summary = "储值卡充值")
+//    @PostMapping("/chargeCard/{accessToken}/{id}")
+//    public ResultMessage chargeCard(@PathVariable("accessToken") String accessToken,
+//                                    @ApiParam(value = "卡ID", required = true) @PathVariable("id") Long id) {
+//        return cardService.chargeCard(accessToken, id);
+//    }
+
+
+    /**
+     * 使用储值卡支付
+     *
+     * @param orderId
+     * @param cardId
+     * @return
+     */
+    @Operation(summary = "使用储值卡支付")
+    @PostMapping("/valueCardPay/{orderId}/{cardId}")
+    public ResultMessage valueCardPay(@PathVariable String orderId, @PathVariable Integer cardId) {
+        return cardService.valueCardPay(orderId, cardId);
+    }
+
+
+//    /**
+//     * 储值卡的充值操作
+//     *
+//     * @return
+//     */
+//    @Operation(summary = "储值卡充值")
+//    @PostMapping("/cardCharge/{cardId}/{orderId}")
+//    public ResultMessage cardCharge(@PathVariable String orderId, @PathVariable Integer cardId) {
+//        return cardService.cardCharge(orderId, cardId);
+//    }
+
+
+    /**
+     * 获得月卡对应的二维码信息
+     *
+     * @param cardId
+     * @return
+     */
+    //TODO :这个改为使用该卡的购买id查询其对应的二维码
+    @Operation(summary = "获得月卡对应的二维码")
+    @PostMapping("/getQrCodeByCard/{cardId}")
+    public ResultMessage getQrCodeByCard(@PathVariable String cardId) {
+        return cardService.getQrCodeByCard(cardId);
+    }
+
+
+    @Operation(summary = "提交卡购买订单")
+    @PostMapping("/generateCardOrder/{accessToken}")
+    public ResultMessage generateCardOrder(@PathVariable("accessToken") String accessToken,
+                                           @ApiParam(value = "订单参数", required = true) @RequestBody OrderCardReq orderCardReq) {
+        return cardService.generateCardOrder(accessToken, orderCardReq);
+
+    }
+
+    @Operation(summary = "提交充值卡订单信息")
+    @PostMapping("/getQrCodeByCard/{accessToken}")
+    public ResultMessage getChargeCardOrder(@PathVariable("accessToken") String accessToken,
+                                            @ApiParam(value = "卡id", required = true) @PathVariable Integer cardId,
+                                            @RequestParam Double currentBalance) {
+        return cardService.getChargeCardOrder(accessToken, cardId, currentBalance);
+    }
+
+}

+ 35 - 0
client-api/src/main/java/com/wteam/controller/coupon/CouponController.java

@@ -0,0 +1,35 @@
+package com.wteam.controller.coupon;
+
+
+
+import com.wteam.framework.modules.book.service.CouponService;
+
+import io.swagger.v3.oas.annotations.tags.Tag;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+
+
+
+
+/**
+ * (Coupon)控制层
+ *
+ * @author doncic
+ * @since 2023-09-25 17:09:49
+ */
+@Slf4j
+@Tag(name = "优惠卷相关接口管理")
+@RestController
+@RequestMapping("/v1/coupon")
+public class CouponController {
+    /**
+     * 服务对象
+     */
+    @Autowired
+    private CouponService couponService;
+
+
+}
+

+ 76 - 0
client-api/src/main/java/com/wteam/controller/court/CourtController.java

@@ -0,0 +1,76 @@
+package com.wteam.controller.court;
+
+import com.wteam.framework.common.vo.ResultMessage;
+import com.wteam.framework.modules.book.entity.vo.StoreDetailsVo;
+import com.wteam.framework.modules.book.service.StoreService;
+import com.wteam.framework.modules.image.service.CbImageService;
+import com.wteam.framework.modules.specialValue.service.CbSpecialValueService;
+import io.swagger.annotations.ApiParam;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.cache.annotation.Cacheable;
+import org.springframework.web.bind.annotation.*;
+
+import java.text.ParseException;
+import java.util.List;
+
+/**
+ * @author doncic
+ * @date 2023/9/16 22:54
+ */
+@Slf4j
+@Tag(name = "门店相关接口管理")
+@RestController
+@RequestMapping("/v1/court")
+public class CourtController {
+
+    @Autowired
+    private StoreService storeService;
+    @Autowired
+    private CbImageService cbImageService;
+    @Autowired
+    private CbSpecialValueService cbSpecialValueService;
+
+
+//    /**
+//     * 获取对应门店的轮播图信息
+//     *
+//     * @param id
+//     * @return
+//     */
+//    @Operation(summary = "获取轮播图")
+//    @GetMapping("/getPhoto/{id}")
+//    public ResultMessage<List<String>> getPhoto(@ApiParam(value = "门店ID", required = true) @PathVariable("id") Long id) {
+//        return storeService.getPhoto(id);
+//    }
+
+
+    /**
+     * 获取门店信息
+     * 先查缓存 有就直接返回
+     *
+     * @param id 门店id
+     * @return
+     */
+    @Cacheable(value = "storeDetails", key = "#id")
+    @Operation(summary = "门店信息")
+    @GetMapping("/getCourtDetails/{id}")
+    public ResultMessage<StoreDetailsVo> getCourtDetails(@ApiParam(value = "门店ID", required = true) @PathVariable("id") Long id) {
+        return storeService.getDetails(id);
+    }
+
+
+    @Operation(summary = "获取轮播图")
+    @GetMapping("/getPhoto")
+    public ResultMessage getPhoto() {
+        return cbImageService.getPhoto();
+    }
+
+    @Operation(summary = "获取特殊价格")
+    @GetMapping("/getSpecialValue")
+    public ResultMessage getSpecialValue() {
+        return cbSpecialValueService.getSpecialValue();
+    }
+}

+ 413 - 0
client-api/src/main/java/com/wteam/controller/hardware/HardwareController.java

@@ -0,0 +1,413 @@
+package com.wteam.controller.hardware;
+
+/**
+ * @author doncic
+ * @date 2023/9/27 19:13
+ */
+
+import cn.hutool.core.util.ObjectUtil;
+import com.wteam.framework.common.enums.*;
+import com.wteam.framework.common.security.AuthUser;
+import com.wteam.framework.common.security.context.UserContext;
+import com.wteam.framework.common.vo.ResultMessage;
+import com.wteam.framework.modules.book.entity.Card;
+import com.wteam.framework.modules.book.entity.OrderInfo;
+import com.wteam.framework.modules.book.entity.reqp.hardwareReq;
+import com.wteam.framework.modules.book.entity.vo.TimeCodeVo;
+import com.wteam.framework.modules.book.mapper.CardMapper;
+import com.wteam.framework.modules.book.mapper.OrderInfoMapper;
+import com.wteam.framework.modules.book.service.OrderInfoService;
+import com.wteam.framework.modules.hardware.ApiQrCodeUtil;
+import com.wteam.framework.modules.user.entity.User;
+import com.wteam.framework.modules.user.mapper.UserMapper;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import lombok.SneakyThrows;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.time.Duration;
+import java.time.LocalDate;
+import java.time.format.DateTimeFormatter;
+import java.time.temporal.Temporal;
+import java.util.Date;
+import java.util.concurrent.TimeUnit;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+@Slf4j
+@Tag(name = "硬件相关接口管理")
+@RestController
+@RequestMapping("/v1/hardware")
+public class HardwareController {
+
+    @Autowired
+    private OrderInfoMapper orderInfoMapper;
+    @Autowired
+    private OrderInfoService orderInfoService;
+    @Autowired
+    private UserMapper userMapper;
+    @Autowired
+    private CardMapper cardMapper;
+
+    /**
+     * 这里理一下思路
+     * 这里是反扫码设置,先前已经使用hutool接口进行第三方的url回调设置了
+     * 根据传入的信息解析可以获得  扫码的时间、二维码信息、devmac指的是生命周期
+     * 这里根据二维码信息可以获得对应id
+     * 如果是订场订单生成的code ---》userId和orderId
+     * 如果是计时订单生成的code ---》userId和orderId
+     * 如果是月卡或者次卡生成的code ---》userId和有效天数
+     * 根据orderId获取到对应的订单信息
+     * 如果是计时订单
+     * 先将时间存入starttime
+     * 第二次进行时间校验 -》第二次的时间必须要是
+     * 然后进行业务处理
+     */
+    @Operation(summary = "反扫码设备第三方二维码核销说明")
+    @PostMapping("/verification")
+    public ResultMessage hardware(@RequestBody hardwareReq hardwareReq) throws ParseException {
+        //获取请求体中的具体数据
+        String qcode = hardwareReq.getQcode();
+        String time = hardwareReq.getTime();
+        log.info("此时扫码的时间为:{}", time);
+        String devmac = hardwareReq.getDevmac();
+        log.info("此时获取的二维码为{}", qcode);
+        // 定义正则表达式来匹配数字
+        Pattern pattern = Pattern.compile("\\d+");
+        Matcher matcher = pattern.matcher(qcode);
+        //解析qcode的值
+        String date = null;
+        String userId = null;
+        String orderId = null;
+        // 查找并存储匹配的数字
+        int count = 0;
+        while (matcher.find() && count < 3) {
+            String number = matcher.group();
+            if (count == 0) {
+                date = number;
+            } else if (count == 1) {
+                userId = number;
+            } else if (count == 2) {
+                orderId = number;
+            }
+            count++;
+        }
+        log.info("此时获取出来的userId为{}", userId);
+        log.info("此时获取出来的orderId为{}", orderId);
+        OrderInfo orderInfo = orderInfoMapper.selectById(orderId);
+        log.info("此时的订单信息为{}", orderInfo);
+        if (orderInfo == null) {
+            return ResultUtil.error(ResultCode.ENTITY_NULL);
+        }
+        //这里先判断是什么订单
+        String orderType = orderInfo.getOrderType();
+
+        //根据订场类型不同实现不同的扫码逻辑
+        switch (orderType) {
+            case "RENTAL":
+                // 处理租场订单类型的二维码注销逻辑
+                return RentalOrder(orderId, time);
+            case "TICKET":
+                // 处理门票订单类型的二维码注销逻辑
+                return TicketOrder(orderId, time);
+            case "TIMER":
+                // 处理计时订单类型的二维码注销逻辑
+                return TimerOrder(orderId, time);
+            case "MONTHLY":
+                // 处理月卡订单类型的二维码注销逻辑
+                return MonthlyOrder(orderId, time);
+            default:
+                // 处理未知订单类型的情况
+                break;
+        }
+        return null;
+    }
+
+    /**
+     * 门票的扫码逻辑
+     * 只要数据库存在这个二维码即可
+     * 在二维码注册的时候就已经限制的门票只能核销两次
+     *
+     * @param orderId
+     * @return
+     */
+    private ResultMessage TicketOrder(String orderId, String time) throws ParseException {
+        //获取订单信息
+        OrderInfo orderInfo = orderInfoMapper.selectById(orderId);
+        //处理时间格式
+        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm");
+        Date currentTime = dateFormat.parse(time);
+        //处理业务代码
+        //先处理订场订单的情况
+        if (orderTypeEnum.TICKET.toString().equals(orderInfo.getOrderType())) {
+            if (orderInfo.getStartTime() == null) {
+                // 第一次调用接口,设置startTime
+                orderInfo.setStartTime(currentTime);
+                orderInfo.setOrderState(String.valueOf(OrderStatusEnum.IN_USE));
+                orderInfoMapper.updateById(orderInfo);
+                String qrCode = orderInfo.getQrCode();
+                if (ObjectUtil.isNull(qrCode)) {
+                    return ResultUtil.error(ResultCode.QRCODE_ERROR);
+                }
+            } else {
+                if (orderInfo.getEndTime() == null) {
+                    // 第二次调用接口,设置endTime,并计算费用
+                    orderInfo.setEndTime(currentTime);
+                    orderInfo.setOrderState(String.valueOf(OrderStatusEnum.USED));
+                    orderInfoMapper.updateById(orderInfo);
+                    return ResultUtil.success(ResultCode.QRCODE);
+                }
+            }
+        }
+        return ResultUtil.error(ResultCode.QRCODE_ERROR);
+    }
+
+    /**
+     * 月卡的核销业务逻辑处理
+     * 月卡的二维码注册的时候有效期直到月卡失效
+     * 先检测二维码是否存在
+     * 再判断此时二维码是否失效
+     * 只要未失效
+     * 不限时间不限次数
+     *
+     * @param orderId
+     * @param time
+     * @return
+     */
+    private ResultMessage MonthlyOrder(String orderId, String time) throws ParseException {
+        //获取order信息
+        //获取订单信息
+        OrderInfo orderInfo = orderInfoMapper.selectById(orderId);
+        //处理业务代码
+        String qrCode = orderInfo.getQrCode();
+        //获得卡信息
+        Integer cardId = orderInfo.getCardId();
+        Card card = cardMapper.selectById(cardId);
+        String endDate = card.getEndDate();
+        // 假设时间格式为 "yyyy-MM-dd HH:mm:ss"
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        Date timeDate = sdf.parse(time);
+        Date endDateDate = sdf.parse(endDate);
+        //处理扫码业务
+        if (timeDate.before(endDateDate)) {
+            if (ObjectUtil.isNotNull(qrCode)) {
+                return ResultUtil.success(ResultCode.QRCODE);
+            }
+        }
+        // time 在 endDate 之后或者相等
+        return ResultUtil.error(ResultCode.QRCODE_ERROR);
+    }
+
+
+    /**
+     * 计时卡逻辑
+     * 根据第一次传入的时间设置为用户进场时间
+     * 根据第一次进场时间判断时间段,根据时间段的不同,设置订单的价格不同
+     * 根据第二次传入的时间设置为用户离场时间
+     * 根据第一次和第二次的差值计算价格
+     */
+    @SneakyThrows
+    private ResultMessage TimerOrder(String orderId, String time) {
+        //获取订单信息
+        OrderInfo orderInfo = orderInfoMapper.selectById(orderId);
+        //处理时间格式
+        //处理时间格式
+        SimpleDateFormat sdf = new SimpleDateFormat("HH:mm");
+        Date date = sdf.parse(time);
+        // 设置不同时间段的价格
+        Date startTime1 = sdf.parse("09:30");
+        Date endTime1 = sdf.parse("18:00");
+        Date startTime2 = sdf.parse("18:30");
+
+        //先处理订场订单的情况
+        if (orderInfo.getStartTime() == null) {
+            // 第一次调用接口,设置startTime
+            orderInfo.setStartTime(date);
+            orderInfo.setOrderState(String.valueOf(OrderStatusEnum.IN_USE));
+            log.info("此时的订单信息为:{}", orderInfo);
+            orderInfoMapper.updateById(orderInfo);
+            if (date.after(startTime1) && date.before(endTime1)) {
+                // 当前时间在 09:30 - 18:00 之间,价格为 8 元/小时
+                double initialPrice = 8.0;
+                orderInfo.setOrderPrice(initialPrice);
+                orderInfo.setOrderState(String.valueOf(OrderStatusEnum.WAITING_TO_PAY));
+                orderInfoService.updateById(orderInfo);
+                return ResultUtil.success(ResultCode.QRCODE);
+            } else if (date.after(startTime2)) {
+                // 当前时间在 18:30 之后,价格为 10 元/小时
+                double initialPrice = 10.0;
+                orderInfo.setOrderPrice(initialPrice);
+                orderInfo.setOrderState(String.valueOf(OrderStatusEnum.WAITING_TO_PAY));
+                orderInfoService.updateById(orderInfo);
+                return ResultUtil.success(ResultCode.QRCODE);
+            }
+        } else {
+            if (orderInfo.getEndTime() == null) {
+                // 第二次调用接口,设置endTime,并计算费用
+                orderInfo.setEndTime(date);
+                // 计算时间差(以分钟为单位)
+                long timeDifferenceMillis = orderInfo.getEndTime().getTime() - orderInfo.getStartTime().getTime();
+                long minutesDifference = TimeUnit.MILLISECONDS.toMinutes(timeDifferenceMillis);
+                // 计算超出一分钟的时间
+                long extraMinutes = Math.max(0, minutesDifference - 1);
+                // 根据超出的分钟计算费用
+                double pricePerMinute = 8.0 / 60.0; // 8元/60分钟
+                double totalPrice = pricePerMinute * extraMinutes;
+                orderInfo.setOverPrice(totalPrice);
+                orderInfo.setOrderState(String.valueOf(OrderStatusEnum.WAITING_SUPPLEMENTS));
+                orderInfoService.updateById(orderInfo);
+            }
+            return ResultUtil.success(ResultCode.QRCODE);
+        }
+        return ResultUtil.success(ResultCode.QRCODE);
+    }
+
+
+    /**
+     * 租场订单实现逻辑
+     * 先获取第一次时间设置为用户进场时间 第二次时间先判断是否在订场时间段之内 如果在就直接放行
+     * 超过订场时间段,则计算超出订场时间、
+     *
+     * @param orderId
+     * @return
+     */
+    private ResultMessage RentalOrder(String orderId, String time) throws ParseException {
+        //获取订单信息
+        OrderInfo orderInfo = orderInfoMapper.selectById(orderId);
+        //处理时间格式
+        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm");
+        Date currentTime = dateFormat.parse(time);
+        //先处理订场订单的情况
+        if (orderTypeEnum.RENTAL.toString().equals(orderInfo.getOrderType())) {
+            if (orderInfo.getStartTime() == null) {
+                // 第一次调用接口,设置startTime
+                orderInfo.setStartTime(currentTime);
+                orderInfo.setOrderState(String.valueOf(OrderStatusEnum.IN_USE));
+                orderInfoMapper.updateById(orderInfo);
+                return ResultUtil.data(ResultCode.QRCODE);
+            } else {
+                if (orderInfo.getEndTime() == null) {
+                    // 第二次调用接口,设置endTime,并计算费用
+                    orderInfo.setEndTime(currentTime);
+                    orderInfoMapper.updateById(orderInfo);
+                    // 校验当前时间是否在ordered时间之前
+                    if (currentTime.before(orderInfo.getOrderEd())) {
+                        // 在ordered时间之前,返回状态码200
+                        orderInfo.setOrderState(String.valueOf(OrderStatusEnum.USED));
+                        orderInfoMapper.updateById(orderInfo);
+                        return ResultUtil.data(ResultCode.QRCODE);
+                    } else {
+                        // 超过ordered时间,计算超过的分钟数
+                        long minutesDifference = calculateMinutesDifference(orderInfo.getOrderEd(), currentTime);
+                        //计算超时需要付钱金额
+                        double v = calculateAmount(minutesDifference);
+                        //获取订单支付金额
+                        Double orderPrice = orderInfo.getOrderPrice();
+                        //需要支付的金额
+                        double v1 = v * orderPrice;
+                        orderInfo.setOverPrice(v1);
+                        orderInfoService.updateById(orderInfo);
+                    }
+                }
+            }
+        }
+        return ResultUtil.error(ResultCode.QRCODE_ERROR);
+    }
+
+    // 计算分钟差
+    private long calculateMinutesDifference(Date startTime, Date endTime) {
+        Duration duration = Duration.between((Temporal) startTime, (Temporal) endTime);
+        return duration.toMinutes();
+    }
+
+    // 定义一个方法来根据时间差计算费用
+    private double calculateAmount(long timeDifferenceMinutes) {
+        // 实现计费计算逻辑
+        // 根据时间差计算费用
+        double billingAmount = 0.0;
+        if (timeDifferenceMinutes >= 45) {
+            billingAmount = 0.75; // 按小时费率的3/4
+        } else if (timeDifferenceMinutes >= 30) {
+            billingAmount = 0.5; // 按小时费率的1/2
+        } else if (timeDifferenceMinutes >= 15) {
+            billingAmount = 0.25; // 按小时费率的1/4
+        }
+        return billingAmount;
+    }
+
+    //        // 查询是否存在相同的二维码订单信息
+//        LambdaQueryWrapper<OrderInfo> lambdaQueryWrapper = new LambdaQueryWrapper<>();
+//        lambdaQueryWrapper.eq(OrderInfo::getQrCode, qcode);
+//        List<OrderInfo> orderInfos = orderInfoMapper.selectList(lambdaQueryWrapper);
+//        boolean empty = orderInfos.isEmpty();
+//        if (empty) {
+//            orderInfo.setOrderState(String.valueOf(OrderStatusEnum.IN_USE));
+//            orderInfoService.save(orderInfo);
+//            return ResultUtil.success(ResultCode.QRCODE);
+//        }
+//        return ResultUtil.error(ResultCode.QRCODE_ERROR);
+
+
+    /**
+     * 计时卡实现思路
+     * 传入token校验解析 获得userId
+     * 查出昵称
+     * 生成二维码-》计时码注册到硬件只能使用两次 -》调用硬件接口注册-》处理响应数据-》成功-》返回-》 二维码包含userID和手机号信息
+     * 如果二维码注册成功,就生成计时订单
+     * 用户拿着计时码去扫码进场
+     * 一扫码就先支付一个小时的价钱
+     * 然后出来的时候也获得一个时间
+     * 根据时间比对
+     * 如果小于 就直接开闸离开
+     * 如果大于一个小时就继续进行扣费
+     *
+     * @param accessToken
+     * @return
+     */
+    @Operation(summary = "计时卡")
+    @PostMapping("/timeCard/{accessToken}")
+    public ResultMessage timeCard(@PathVariable("accessToken") String accessToken) {
+        //解析校验token获得用户id
+        AuthUser authUser = UserContext.getAuthUser(accessToken);
+        assert authUser != null;
+        String userId = authUser.getId();
+        log.info("此时的用户id为:{}", userId);
+        //根据userId查询user信息
+        User user = userMapper.selectById(userId);
+        // 处理nickName为null的情况
+        String nickName = (user.getNickName() != null) ? user.getNickName() : "";
+        // 获取当前日期
+        LocalDate currentDate = LocalDate.now();
+        // 格式化日期为字符串
+        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMdd");
+        String formattedDate = currentDate.format(formatter);
+        /**
+         * 这里存储计时订单信息
+         */
+        OrderInfo orderInfo = new OrderInfo();
+        orderInfo.setUserId(userId);
+        orderInfo.setCreateTime(new Date());
+        orderInfo.setStoreId(9376L);
+        orderInfo.setOrderType(String.valueOf(orderTypeEnum.TIMER));
+        orderInfo.setOrderPrice((double) 100);
+        orderInfoService.save(orderInfo);
+
+        String data = "pxo_" + formattedDate + "_" + userId + "_" + orderInfo.getId() + "_00";
+        Boolean flag = ApiQrCodeUtil.callApiWithUser(data);
+
+        if (flag) {
+            orderInfo.setQrCode(data);
+            orderInfoService.updateById(orderInfo);
+            //判断响应结果
+            TimeCodeVo timeCodeVo = new TimeCodeVo();
+            timeCodeVo.setCode(data);
+            timeCodeVo.setNickName(nickName);
+            return ResultUtil.data(timeCodeVo);
+        }
+        return ResultUtil.error(ResultCode.TIME_CODE_ERROR);
+    }
+}

+ 62 - 0
client-api/src/main/java/com/wteam/controller/order/OrderController.java

@@ -0,0 +1,62 @@
+package com.wteam.controller.order;
+
+import com.wteam.framework.common.enums.ResultUtil;
+import com.wteam.framework.common.vo.ResultMessage;
+import com.wteam.framework.modules.book.entity.dto.OrderReq;
+import com.wteam.framework.modules.book.service.OrderInfoService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiParam;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import lombok.extern.slf4j.Slf4j;
+import me.chanjar.weixin.common.bean.WxJsapiSignature;
+import me.chanjar.weixin.common.error.WxErrorException;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.format.annotation.DateTimeFormat;
+import org.springframework.web.bind.annotation.*;
+
+import javax.print.DocFlavor;
+import java.sql.Timestamp;
+import java.util.Date;
+
+/**
+ * @author doncic
+ * @date 2023/9/19 22:25
+ */
+@Slf4j
+@Tag(name = "订单相关接口管理")
+@RestController
+@RequestMapping("/v1/order")
+public class OrderController {
+
+    @Autowired
+    private OrderInfoService orderInfoService;
+
+
+    /**
+     * 用户提交订场订单信息
+     *
+     * @param orderReq
+     * @return
+     */
+    @Operation(summary = "提交订单")
+    @PostMapping("/generateOrder/{accessToken}")
+    public ResultMessage<Long> generateOrder(
+            @PathVariable("accessToken") String accessToken,
+            @ApiParam(value = "订单参数", required = true) @RequestBody OrderReq orderReq) {
+        return orderInfoService.generateOrder(accessToken, orderReq);
+    }
+
+    /**
+     * 根据获取当前时间的订单信息,从而得到场地订场情况
+     * @return
+     */
+    @Operation(summary = "订场情况查询")
+    @GetMapping("/bookStatus/{id}")
+    public ResultMessage<String> bookStatus(
+            @ApiParam(value = "门店ID", required = true) @PathVariable("id") Long id,
+            @RequestParam("dateTime") @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm") Date dateTime) {
+        return orderInfoService.bookStatus(id, dateTime);
+    }
+}

+ 43 - 0
client-api/src/main/java/com/wteam/controller/order/QrCodeController.java

@@ -0,0 +1,43 @@
+package com.wteam.controller.order;
+
+import cn.hutool.core.io.FileUtil;
+import cn.hutool.extra.qrcode.QrCodeUtil;
+import cn.hutool.extra.qrcode.QrConfig;
+import com.wteam.framework.common.enums.ResultUtil;
+import com.wteam.framework.common.vo.ResultMessage;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import lombok.extern.slf4j.Slf4j;
+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 javax.imageio.ImageIO;
+import java.awt.image.BufferedImage;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.util.Base64;
+
+/**
+ * @author doncic
+ * @date 2023/9/26 20:56
+ */
+@Slf4j
+@Tag(name = "二维码相关接口管理")
+@RestController
+@RequestMapping("/v1/qrcode")
+public class QrCodeController {
+
+    /**
+     * 生成一个临时二维码
+     *
+     * @return
+     * @throws IOException
+     */
+    @Operation(summary = "生成临时二维码")
+    @PostMapping("/createQrCode")
+    public ResultMessage createQrCode() {
+        return null;
+    }
+}

+ 131 - 0
client-api/src/main/java/com/wteam/controller/payment/CashierController.java

@@ -0,0 +1,131 @@
+package com.wteam.controller.payment;
+
+
+import com.egzosn.pay.common.bean.RefundOrder;
+import com.egzosn.pay.common.bean.RefundResult;
+import com.wteam.framework.common.exception.ServiceException;
+import com.wteam.framework.common.vo.ResultMessage;
+import com.wteam.framework.modules.book.service.OrderInfoService;
+import com.wteam.framework.modules.pay.entity.enums.PaymentClientEnum;
+import com.wteam.framework.modules.pay.entity.enums.PaymentMethodEnum;
+import com.wteam.framework.modules.pay.serviceimpl.CashierSupport;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+
+/**
+ * 买家端,收银台接口
+ *
+ * @author Chopper
+ * @since 2020-12-18 16:59
+ */
+@Slf4j
+@RestController
+@Tag(name = "支付相关接口管理")
+@RequestMapping("/v1/payment")
+public class CashierController {
+
+    @Autowired
+    private CashierSupport cashierSupport;
+
+
+    @Autowired
+    private OrderInfoService orderInfoService;
+
+
+//    @ApiImplicitParams({
+//            @ApiImplicitParam(name = "client", value = "客户端类型", paramType = "path", allowableValues = "PC,H5,WECHAT_MP,APP")
+//    })
+//    @GetMapping(value = "/tradeDetail")
+//    @ApiOperation(value = "获取支付详情")
+//    public ResultMessage paymentParams(@Validated PayParam payParam) {
+//        CashierParam cashierParam = cashierSupport.cashierParam(payParam);
+//        return ResultUtil.data(cashierParam);
+//    }
+
+    //TODO:退款接口待办 实现的有点问题
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "paymentMethod", value = "支付方式", paramType = "path", allowableValues = "WECHAT"),
+    })
+    @ApiOperation(value = "退款")
+    @RequestMapping(value = "/refund/{paymentMethod}/{sn}", method = {RequestMethod.POST})
+    public RefundResult refund(HttpServletRequest request, @PathVariable String paymentMethod, @PathVariable String sn) {
+        PaymentMethodEnum paymentMethodEnum = PaymentMethodEnum.valueOf(paymentMethod);
+        try {
+            return cashierSupport.refund(paymentMethodEnum, request, sn);
+        } catch (ServiceException se) {
+            log.info("支付异常", se);
+            throw se;
+        } catch (Exception e) {
+            log.error("收银台支付错误", e);
+        }
+        return null;
+    }
+
+
+    @ApiImplicitParams({@ApiImplicitParam(name = "paymentMethod", value = "支付方式", paramType = "path", allowableValues = "WECHAT,ALIPAY"),})
+    @GetMapping(value = "/pay/{paymentMethod}/{paymentClient}")
+    @ApiOperation(value = "支付")
+    public ResultMessage payment(HttpServletRequest request, HttpServletResponse response, @PathVariable String paymentMethod, @PathVariable String paymentClient, @Validated String sn) {
+        PaymentMethodEnum paymentMethodEnum = PaymentMethodEnum.valueOf(paymentMethod);
+        PaymentClientEnum paymentClientEnum = PaymentClientEnum.valueOf(paymentClient);
+
+        try {
+            return cashierSupport.payment(paymentMethodEnum, paymentClientEnum, request, response, sn);
+        } catch (ServiceException se) {
+            log.info("支付异常", se);
+            throw se;
+        } catch (Exception e) {
+            log.error("收银台支付错误", e);
+        }
+        return null;
+    }
+
+    @ApiOperation(value = "支付回调")
+    @RequestMapping(value = "/callback/{paymentMethod}", method = {RequestMethod.GET, RequestMethod.POST})
+    public String callback(HttpServletRequest request, @PathVariable String paymentMethod) {
+
+        PaymentMethodEnum paymentMethodEnum = PaymentMethodEnum.valueOf(paymentMethod);
+
+
+        String callback = cashierSupport.callback(paymentMethodEnum, request);
+
+        log.info("回调响应消息" + callback);
+
+        return callback;
+    }
+
+
+//    @ApiOperation(value = "支付异步通知")
+//    @RequestMapping(value = "/notify/{paymentMethod}", method = {RequestMethod.GET, RequestMethod.POST})
+//    public void notify(HttpServletRequest request, @PathVariable String paymentMethod) {
+//
+//        PaymentMethodEnum paymentMethodEnum = PaymentMethodEnum.valueOf(paymentMethod);
+//
+//        cashierSupport.notify(paymentMethodEnum, request);
+//
+//    }
+
+//    @ApiOperation(value = "查询支付结果")
+//    @GetMapping(value = "/result")
+//    public ResultMessage<Boolean> paymentResult(PayParam payParam) {
+//        return ResultUtil.data(cashierSupport.paymentResult(payParam));
+//    }
+
+//    @ApiOperation(value = "查询支付结果")
+//    @GetMapping(value = "/result")
+//    public ResultMessage<Boolean> paymentResult(PayParam payParam) {
+//        return ResultUtil.data(cashierSupport.paymentResult(payParam));
+//    }
+
+
+}

+ 25 - 6
client-api/src/main/java/com/wteam/controller/sms/GetSmsController.java

@@ -3,9 +3,11 @@ package com.wteam.controller.sms;
 import com.wteam.framework.common.cache.limit.annotation.LimitPoint;
 import com.wteam.framework.common.enums.ResultCode;
 import com.wteam.framework.common.enums.ResultUtil;
+import com.wteam.framework.common.exception.ServiceException;
 import com.wteam.framework.common.vo.ResultMessage;
 import com.wteam.framework.modules.sms.SmsUtil;
 import com.wteam.framework.modules.sms.entity.dto.MemberSmsLoginDto;
+import com.wteam.framework.modules.sms.service.SmsCheckService;
 import com.wteam.framework.modules.verification.entity.enums.VerificationEnums;
 import io.swagger.annotations.Api;
 import io.swagger.v3.oas.annotations.Operation;
@@ -19,6 +21,8 @@ import org.nfunk.jep.function.Sum;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
+import javax.validation.constraints.NotNull;
+
 /**
  * @author doncic
  * @date 2023/9/16 17:18
@@ -32,6 +36,9 @@ public class GetSmsController {
     @Autowired
     private SmsUtil smsUtil;
 
+    @Autowired
+    private SmsCheckService smsCheckService;
+
     /**
      * 发送短信验证码接口
      * hong
@@ -56,12 +63,24 @@ public class GetSmsController {
         return ResultUtil.success(ResultCode.VERIFICATION_SEND_SUCCESS);
     }
 
+    /**
+     * 根据验证码认证手机号
+     *
+     * @return
+     */
     @Operation(summary = "校验短信是否正确")
-    @GetMapping("/checkSms")
-    public ResultMessage checkSms() {
-
-        return ResultUtil.success();
+    @PostMapping("/checkSms")
+    @Parameters({
+            @Parameter(name = "mobile", description = "手机号", required = true, in = ParameterIn.QUERY),
+            @Parameter(name = "code", description = "验证码", required = true, in = ParameterIn.QUERY)
+    })
+    public ResultMessage checkSms(@NotNull @RequestParam String mobile,
+                                  @NotNull @RequestParam String code,
+                                  @RequestHeader String uuid) {
+        if (smsUtil.verifyCode(mobile, VerificationEnums.LOGIN, uuid, code)) {
+            return ResultUtil.success();
+        } else {
+            throw new ServiceException(ResultCode.VERIFICATION_SMS_CHECKED_ERROR);
+        }
     }
-
-
 }

+ 103 - 0
client-api/src/main/java/com/wteam/controller/user/UserController.java

@@ -0,0 +1,103 @@
+package com.wteam.controller.user;
+
+import com.wteam.framework.common.enums.*;
+import com.wteam.framework.common.security.AuthUser;
+import com.wteam.framework.common.security.context.UserContext;
+import com.wteam.framework.common.vo.ResultMessage;
+import com.wteam.framework.modules.book.entity.Card;
+import com.wteam.framework.modules.book.entity.CouponUser;
+import com.wteam.framework.modules.book.entity.OrderInfo;
+import com.wteam.framework.modules.book.entity.vo.OrderInfoVo;
+import com.wteam.framework.modules.book.service.OrderInfoService;
+import com.wteam.framework.modules.user.entity.User;
+import com.wteam.framework.modules.user.entity.form.UpdateUserForm;
+import com.wteam.framework.modules.user.mapper.UserMapper;
+import com.wteam.framework.modules.user.service.UserService;
+import io.swagger.annotations.ApiParam;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.web.bind.annotation.*;
+import sun.security.provider.Sun;
+
+import javax.validation.constraints.NotNull;
+import java.text.ParseException;
+import java.util.List;
+
+/**
+ * @author doncic
+ * @date 2023/9/16 22:20
+ */
+@Slf4j
+@Tag(name = "用户相关接口管理")
+@RestController
+@RequestMapping("/v1/user")
+public class UserController {
+
+    @Autowired
+    private UserService userService;
+    @Autowired
+    private UserMapper userMapper;
+
+
+    /**
+     * 修改用户信息
+     *
+     * @param accessToken
+     * @param userForm
+     * @return
+     */
+    @Operation(summary = "修改用户信息")
+    @PutMapping("/update/{accessToken}")
+    public ResultMessage<UpdateUserForm> updateUser(@NotNull @PathVariable("accessToken") String accessToken, @RequestBody UpdateUserForm userForm) {
+        AuthUser authUser = UserContext.getAuthUser(accessToken);
+        assert authUser != null;
+        return userService.updateById(userForm) ? ResultUtil.success() : ResultUtil.error(ResultCode.UPDATE_USER_ERROR);
+    }
+
+    /**
+     * 查看订单信息
+     *
+     * @param id
+     * @return
+     */
+    @Operation(summary = "查看订单信息")
+    @PostMapping("/showOrder/{id}")
+    public ResultMessage showOrder(
+            @ApiParam(value = "订单id", required = true) @PathVariable("id") String id) {
+        return userService.showOrder(id);
+    }
+
+    @Operation(summary = "查看对应类型的订单信息")
+    @GetMapping("/showOrder/{orderTypeEnum}/{id}")
+    public ResultMessage showOrderByType(
+            @PathVariable("id") String id,
+            @PathVariable OrderTypeEnums orderTypeEnum) {
+        return userService.showOrderByType(id, orderTypeEnum);
+    }
+
+    /**
+     * 查看我的卡情况
+     * id
+     *
+     * @param cardTypeEnum
+     * @return
+     */
+    @Operation(summary = "查看我的卡")
+    @PostMapping("/show/{cardTypeEnum}/{id}")
+    public ResultMessage<List<Card>> showMyCard(
+            @ApiParam(value = "用户id", required = true) @NotNull @PathVariable Long id,
+            @PathVariable CardTypeEnum cardTypeEnum) {
+        return userService.showMyCard(id, cardTypeEnum);
+    }
+
+
+    @Operation(summary = "查看我的优惠卷")
+    @PostMapping("/showMyCoupon/{accessToken}")
+    private ResultMessage<CouponUser> showMyCoupon(@NotNull @PathVariable String accessToken) {
+        return userService.showMyCoupon(accessToken);
+
+    }
+}

+ 1 - 1
client-api/src/main/java/com/wteam/controller/wxlogin/QRCodeController.java

@@ -33,7 +33,7 @@ public class QRCodeController {
 //     "appId":"wxe5ca58e8a4a615c6","appSecret":"cb8fd4e6c3895db6f11619e08bb8f277------------->嘉文的
 //     "appId":"wx55c3db66f27015af","appSecret":"c17d17e230ee71395a70cd34d6783200"
         //todo 修改为客户的appId和appSecret
-        String WxAccessTokenUrl = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" + "wx55c3db66f27015af" + "&secret=" + "c17d17e230ee71395a70cd34d6783200";
+        String WxAccessTokenUrl = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" + "wx9a649e9875a872ec" + "&secret=" + "b445bf60f367a6c10e26c7ae07117721";
         HttpUtils httpUtils = new HttpUtils();
         String s = httpUtils.get(WxAccessTokenUrl);
         ResultMessage wxCodeResultMessage = new ResultMessage<WxAccessToken>();

+ 15 - 2
client-api/src/main/java/com/wteam/controller/wxlogin/WxMaUserController.java

@@ -11,6 +11,7 @@ import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiImplicitParam;
 import io.swagger.annotations.ApiImplicitParams;
 import io.swagger.annotations.ApiOperation;
+import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.tags.Tag;
 import lombok.AllArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
@@ -94,6 +95,18 @@ public class WxMaUserController {
         return update ? ResultUtil.success() : ResultUtil.error(ResultCode.ERROR);
     }
 
+    /**
+     * 修改用户信息
+     *
+     * @param entity
+     * @return
+     */
+    @PutMapping
+    @Operation(summary = "用户修改")
+    public ResultMessage update(@RequestBody User entity) {
+        return userService.updateById(entity) ? ResultUtil.success() : ResultUtil.error(ResultCode.USER_UPDATE_ERROR);
+    }
+
 
     /**
      * <pre>
@@ -116,7 +129,8 @@ public class WxMaUserController {
     @ApiOperation(value = "根据用户id查询用户信息")
     @GetMapping("/queryUserById/{id}")
     public ResultMessage<User> queryUserById(@PathVariable("id") String id) {
-        return ResultUtil.data(userService.query().eq("id", id).one());
+        User user = userService.query().eq("id", id).one();
+        return ResultUtil.data(user);
     }
 
     /**
@@ -134,7 +148,6 @@ public class WxMaUserController {
         return update ? ResultUtil.success() : ResultUtil.error(ResultCode.ERROR);
     }
 
-
     /***
      * 退出登录
      * @return

+ 2 - 2
client-api/src/main/java/com/wteam/security/ClientSecurityConfig.java

@@ -58,7 +58,7 @@ public class ClientSecurityConfig extends WebSecurityConfigurerAdapter {
 
     @Override
     public void configure(WebSecurity web) throws Exception {
-        web.ignoring().antMatchers("/v3/api-docs/**","/swagger-ui/**","v3/api-docs/swagger-config");
+        web.ignoring().antMatchers("/v3/api-docs/**", "/swagger-ui/**", "v3/api-docs/swagger-config");
     }
 
     @Override
@@ -79,7 +79,7 @@ public class ClientSecurityConfig extends WebSecurityConfigurerAdapter {
                 .permitAll()
                 .and()
                 .authorizeRequests()
-                .antMatchers("/wx/user/login","/swagger-ui/**","v3/api-docs/swagger-config","v3/api-docs/common").anonymous()
+                .antMatchers("/v1/**").anonymous()
                 //任何请求
                 .anyRequest()
                 //需要身份认证

+ 4 - 4
client-api/src/main/resources/application.yml

@@ -23,10 +23,10 @@ spring:
 
   # Redis
   redis:
-#    host: 114.132.229.139
+    #    host: 114.132.229.139
     host: 127.0.0.1
     port: 6379
-#    password: 123456
+    #    password: 123456
     lettuce:
       pool:
         # 连接池最大连接数(使用负值表示没有限制) 默认 8
@@ -40,8 +40,8 @@ spring:
   datasource:
     driverClassName: com.mysql.cj.jdbc.Driver
     username: cb
-    password: GZLsww3hHS72iamt
-    url: jdbc:mysql://1.14.25.22:3306/cb?useUnicode=true&characterEncoding=utf-8&rewriteBatchedStatements=true&serverTimezone=Asia/Shanghai
+    password: sEzfxcjZFEzfJrEA
+    url: jdbc:mysql://139.9.38.185:3306/cb?useUnicode=true&characterEncoding=utf-8&rewriteBatchedStatements=true&serverTimezone=Asia/Shanghai
 
 # 忽略TOKEN 鉴权 的url
 ignored:

+ 4 - 4
client-api/target/classes/application.yml

@@ -23,10 +23,10 @@ spring:
 
   # Redis
   redis:
-#    host: 114.132.229.139
+    #    host: 114.132.229.139
     host: 127.0.0.1
     port: 6379
-#    password: 123456
+    #    password: 123456
     lettuce:
       pool:
         # 连接池最大连接数(使用负值表示没有限制) 默认 8
@@ -40,8 +40,8 @@ spring:
   datasource:
     driverClassName: com.mysql.cj.jdbc.Driver
     username: cb
-    password: GZLsww3hHS72iamt
-    url: jdbc:mysql://1.14.25.22:3306/cb?useUnicode=true&characterEncoding=utf-8&rewriteBatchedStatements=true&serverTimezone=Asia/Shanghai
+    password: sEzfxcjZFEzfJrEA
+    url: jdbc:mysql://139.9.38.185:3306/cb?useUnicode=true&characterEncoding=utf-8&rewriteBatchedStatements=true&serverTimezone=Asia/Shanghai
 
 # 忽略TOKEN 鉴权 的url
 ignored:

BIN
client-api/target/classes/com/wteam/controller/passport/ConnectMemberWebController.class


BIN
client-api/target/classes/com/wteam/controller/passport/FileController.class


BIN
client-api/target/classes/com/wteam/controller/passport/MemberController.class


BIN
client-api/target/classes/com/wteam/controller/sms/GetSmsController.class


BIN
client-api/target/classes/com/wteam/controller/wxlogin/QRCodeController.class


BIN
client-api/target/classes/com/wteam/controller/wxlogin/WxMaUserController.class


BIN
client-api/target/classes/com/wteam/security/ClientSecurityConfig.class


+ 0 - 0
client-api/src/main/java/com/wteam/controller/passport/ConnectMemberWebController.java → common-api/src/main/java/com/wteam/controller/passport/ConnectMemberWebController.java


+ 0 - 0
client-api/src/main/java/com/wteam/controller/passport/FileController.java → common-api/src/main/java/com/wteam/controller/passport/FileController.java


+ 0 - 0
client-api/src/main/java/com/wteam/controller/passport/MemberController.java → common-api/src/main/java/com/wteam/controller/passport/MemberController.java


+ 1 - 1
common-api/src/main/resources/application.yml

@@ -60,7 +60,7 @@ spring:
   datasource:
     driverClassName: com.mysql.cj.jdbc.Driver
     username: cb
-    password: GZLsww3hHS72iamt
+    password: sEzfxcjZFEzfJrEA
     url: jdbc:mysql://1.12.25.22:3306/cb?useUnicode=true&characterEncoding=utf-8&rewriteBatchedStatements=true&serverTimezone=Asia/Shanghai
 
 

+ 133 - 0
develop.sh

@@ -0,0 +1,133 @@
+#安装maven
+if ! command -v mvn >/dev/null 2>&1; then
+    echo "Installing Maven"
+    # 下载Maven
+    wget https://archive.apache.org/dist/maven/maven-3/3.8.1/binaries/apache-maven-3.8.1-bin.tar.gz
+    # 解压Maven
+    tar -xzf apache-maven-3.8.1-bin.tar.gz -C /opt
+    # 设置Maven环境变量
+    echo 'export PATH=/opt/apache-maven-3.8.1/bin:$PATH' >> ~/.bashrc
+    # 更改Maven镜像
+    mkdir -p ~/.m2
+    echo -e "<settings>\n  <mirrors>\n    <mirror>\n      <id>aliyun-maven</id>\n      <mirrorOf>*</mirrorOf>\n      <name>Aliyun Maven</name>\n      <url>https://maven.aliyun.com/repository/public</url>\n    </mirror>\n  </mirrors>\n</settings>" > ~/.m2/settings.xml
+    source ~/.bashrc
+else
+    echo "Maven is already installed"
+fi
+
+#安装git
+sudo yum install -y git
+  #安装依赖
+sudo yum install -y yum-utils device-mapper-persistent-data lvm2
+  #设置源
+sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
+sudo yum makecache fast
+
+# 检查Docker是否已安装
+if ! command -v docker &> /dev/null
+then
+    # 如果Docker未安装,执行安装步骤
+    sudo yum install -y docker-ce
+    sudo systemctl start docker
+fi
+
+# 检查Docker Compose是否已安装
+if ! command -v docker-compose &> /dev/null
+then
+    # 如果Docker Compose未安装,执行安装步骤
+    sudo curl -L "https://github.com/docker/compose/releases/download/v2.17.1/docker-compose-linux-x86_64" -o /usr/local/bin/docker-compose
+    sudo chmod +x /usr/local/bin/docker-compose
+fi
+
+# 显示版本号
+docker-compose -v
+
+
+
+#拉取代码打包
+APP_NAME="promotesai"
+mkdir -p /data/app/${APP_NAME}
+mkdir -p /data/app/${APP_NAME}/config
+cd /data/app/${APP_NAME}
+
+# 设置私有仓库信息
+repo_url="http://admin_lsl:Lsl18718383742@124.222.247.184:3000/wteamYD/promotesai-background.git"
+repo_branch="develop"
+# 克隆私有仓库代码
+
+# 删除目标路径(如果存在)
+if [ -d "promotesai-background" ]; then
+    #  更新代码
+    echo "更新代码"
+    cd promotesai-background
+    git pull origin ${repo_branch}
+
+else
+    echo "拉取代码"
+    git clone ${repo_url}
+    cd promotesai-background
+    git checkout -b ${repo_branch}
+    git pull origin ${repo_branch}
+    echo "Code successfully pulled from the private repository."
+fi
+
+
+
+# Maven打包
+echo 开始打包
+mvn clean package
+
+#echo 拷贝文件
+#cp -r ./config /data/app/${APP_NAME}
+
+# 定义应用组名:项目名
+group_name="promotesai"
+# 定义应用名称:客户端
+app_client_name="client-api"
+# 定义应用名称:管理端
+app_manager_name="manager-api"
+# 定义应用版本:最新版
+app_version='latest'
+# 定义应用环境
+profile_active='prod'
+echo '----stop container----'
+docker stop ${app_client_name}
+docker stop ${app_manager_name}
+echo '----rm container----'
+docker rm ${app_client_name}
+docker rm ${app_manager_name}
+echo '----rm image----'
+docker rmi ${group_name}/${app_client_name}:${app_version}
+docker rmi ${group_name}/${app_manager_name}:${app_version}
+
+# 构建客户端容器运行
+cd ${app_client_name}
+docker build -t ${group_name}/${app_client_name}:${app_version} --build-arg JAR_FILE=./target/client-api-0.0.1-SNAPSHOT.jar .
+echo '----build image----'
+docker run -p 8889:8889 --name ${app_client_name} \
+  -e TZ="Asia/Shanghai" \
+  -v /etc/localtime:/etc/localtime \
+  -d ${group_name}/${app_client_name}:${app_version}
+echo '----start container----'
+
+# 构建管理端容器运行
+cd ../${app_manager_name}
+docker build -t ${group_name}/${app_manager_name}:${app_version} --build-arg JAR_FILE=./target/manager-api-0.0.1-SNAPSHOT.jar .
+echo '----build image----'
+docker run -p 8887:8887 --name ${app_manager_name} \
+  -e TZ="Asia/Shanghai" \
+  -v /etc/localtime:/etc/localtime \
+  -d ${group_name}/${app_manager_name}:${app_version}
+echo '----start container----'
+
+
+
+
+
+
+
+
+
+
+
+

+ 144 - 0
formal.sh

@@ -0,0 +1,144 @@
+#安装maven
+if ! command -v mvn >/dev/null 2>&1; then
+    echo "Installing Maven"
+    # 下载Maven
+    wget https://archive.apache.org/dist/maven/maven-3/3.8.1/binaries/apache-maven-3.8.1-bin.tar.gz
+    # 解压Maven
+    tar -xzf apache-maven-3.8.1-bin.tar.gz -C /opt
+    # 设置Maven环境变量
+    echo 'export PATH=/opt/apache-maven-3.8.1/bin:$PATH' >> ~/.bashrc
+    # 更改Maven镜像
+    mkdir -p ~/.m2
+    echo -e "<settings>\n  <mirrors>\n    <mirror>\n      <id>aliyun-maven</id>\n      <mirrorOf>*</mirrorOf>\n      <name>Aliyun Maven</name>\n      <url>https://maven.aliyun.com/repository/public</url>\n    </mirror>\n  </mirrors>\n</settings>" > ~/.m2/settings.xml
+    source ~/.bashrc
+else
+    echo "Maven is already installed"
+fi
+
+#安装git
+sudo yum install -y git
+  #安装依赖
+sudo yum install -y yum-utils device-mapper-persistent-data lvm2
+  #设置源
+sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
+sudo yum makecache fast
+
+# 检查Docker是否已安装
+if ! command -v docker &> /dev/null
+then
+    # 如果Docker未安装,执行安装步骤
+    sudo yum install -y docker-ce
+    sudo systemctl start docker
+fi
+
+# 检查Docker Compose是否已安装
+if ! command -v docker-compose &> /dev/null
+then
+    # 如果Docker Compose未安装,执行安装步骤
+    sudo curl -L "https://github.com/docker/compose/releases/download/v2.17.1/docker-compose-linux-x86_64" -o /usr/local/bin/docker-compose
+    sudo chmod +x /usr/local/bin/docker-compose
+fi
+
+# 显示版本号
+docker-compose -v
+
+
+
+#拉取代码打包
+APP_NAME="promotesai"
+mkdir /data/app/${APP_NAME}/${APP_NAME}
+mkdir /data/app/${APP_NAME}/config
+cd /data/app/${APP_NAME}
+
+git init
+# 从私有仓库拉取代码
+git clone http://124.222.247.184:3000/admin_lsl/patent.git
+git pull
+
+cd ${APP_NAME}
+# Maven打包
+echo 开始打包
+mvn clean package
+
+
+# 定义应用组名
+group_name="$1"
+# 定义应用名称
+app_name="$1"
+# 定义应用版本
+app_version='latest'
+# 定义应用环境
+profile_active='prod'
+echo '----copy jar----'
+docker stop ${app_name}
+echo '----stop container----'
+docker rm ${app_name}
+echo '----rm container----'
+docker rmi ${group_name}/${app_name}:${app_version}
+echo '----rm image----'
+cd ${app_name}
+echo "当前目录是:$PWD"
+docker build -t ${group_name}/${app_name}:${app_version} --build-arg JAR_FILE=./target/client-api-0.0.1-SNAPSHOT.jar .
+echo '----build image----'
+docker run -p $2:8881 --name ${app_name} \
+  -e TZ="Asia/Shanghai" \
+  -v /etc/localtime:/etc/localtime \
+  -v /data/app/patent/config:/config \
+  -d ${group_name}/${app_name}:${app_version}
+echo '----start container----'
+
+echo "拉取nginx镜像"
+docker pull nginx:latest
+echo "运行nginx容器"
+docker run --name nginx -p 80:80 -d nginx
+if [ ! -f /opt/docker/nginx/conf/nginx.conf ]; then
+    echo "创建文件目录"
+    mkdir -p /opt/docker/nginx/conf.d
+    mkdir -p /opt/docker/nginx/html
+    mkdir -p /opt/docker/nginx/logs
+    mkdir -p /opt/docker/nginx/conf/nginx.conf
+    echo "拷贝nginx容器对应的文件默认配置"
+    docker cp nginx:/etc/nginx/nginx.conf /opt/docker/nginx/conf/nginx.conf
+    docker cp nginx:/etc/nginx/conf.d /opt/docker/nginx/conf.d
+    docker cp nginx:/usr/share/nginx/html /opt/docker/nginx
+fi
+echo "停止并移除容器"
+docker stop nginx
+docker rm nginx
+
+
+# 设置变量
+NGINX_CONF_DIR="/etc/nginx/conf.d"
+NGINX_CONF_FILE="example.conf"
+SERVER_NAME="example.com"
+UPSTREAM_NAME="app_server"
+UPSTREAM_SERVER="127.0.0.1:8000"
+
+# 创建配置文件
+echo "upstream ${UPSTREAM_NAME} {" > ${NGINX_CONF_DIR}/${NGINX_CONF_FILE}
+echo "    server ${UPSTREAM_SERVER};" >> ${NGINX_CONF_DIR}/${NGINX_CONF_FILE}
+echo "}" >> ${NGINX_CONF_DIR}/${NGINX_CONF_FILE}
+echo "server {" >> ${NGINX_CONF_DIR}/${NGINX_CONF_FILE}
+echo "    listen 80;" >> ${NGINX_CONF_DIR}/${NGINX_CONF_FILE}
+echo "    server_name ${SERVER_NAME};" >> ${NGINX_CONF_DIR}/${NGINX_CONF_FILE}
+echo "    location / {" >> ${NGINX_CONF_DIR}/${NGINX_CONF_FILE}
+echo "        proxy_pass http://${UPSTREAM_NAME};" >> ${NGINX_CONF_DIR}/${NGINX_CONF_FILE}
+echo "        proxy_set_header Host \$host;" >> ${NGINX_CONF_DIR}/${NGINX_CONF_FILE}
+echo "        proxy_set_header X-Real-IP \$remote_addr;" >> ${NGINX_CONF_DIR}/${NGINX_CONF_FILE}
+echo "    }" >> ${NGINX_CONF_DIR}/${NGINX_CONF_FILE}
+echo "}" >> ${NGINX_CONF_DIR}/${NGINX_CONF_FILE}
+
+
+echo "重新启动nginx镜像重新新容器"
+docker run  -p 80:80 --name nginx --restart=always
+-v /opt/docker/nginx/conf/nginx.conf:/etc/nginx/nginx.conf \
+-v /opt/docker/nginx/conf.d:/etc/nginx/conf.d \
+-v /opt/docker/nginx/html:/usr/share/nginx/html \
+-v /opt/docker/nginx/logs:/var/log/nginx \
+-d  nginx
+
+
+
+
+
+

+ 69 - 34
framework/pom.xml

@@ -48,8 +48,6 @@
             <artifactId>oshi-core</artifactId>
             <version>6.4.0</version>
         </dependency>
-
-
         <dependency>
             <groupId>com.alipay.sdk</groupId>
             <artifactId>alipay-sdk-java</artifactId>
@@ -75,27 +73,34 @@
             <artifactId>spring-boot-starter-validation</artifactId>
         </dependency>
 
+
+        <dependency>
+            <groupId>com.jeequan</groupId>
+            <artifactId>jeepay-sdk-java</artifactId>
+            <version>1.5.0</version>
+        </dependency>
+
         <dependency>
             <groupId>org.springdoc</groupId>
             <artifactId>springdoc-openapi-ui</artifactId>
             <version>1.7.0</version>
         </dependency>
-                <dependency>
-                    <groupId>io.springfox</groupId>
-                    <artifactId>springfox-boot-starter</artifactId>
-                    <version>3.0.0</version>
-                </dependency>
-
-<!--        <dependency>-->
-<!--            <groupId>io.springfox</groupId>-->
-<!--            <artifactId>springfox-swagger2</artifactId>-->
-<!--            <version>2.7.0</version>-->
-<!--        </dependency>-->
-<!--        <dependency>-->
-<!--            <groupId>io.springfox</groupId>-->
-<!--            <artifactId>springfox-swagger-ui</artifactId>-->
-<!--            <version>2.7.0</version>-->
-<!--        </dependency>-->
+        <dependency>
+            <groupId>io.springfox</groupId>
+            <artifactId>springfox-boot-starter</artifactId>
+            <version>3.0.0</version>
+        </dependency>
+
+        <!--        <dependency>-->
+        <!--            <groupId>io.springfox</groupId>-->
+        <!--            <artifactId>springfox-swagger2</artifactId>-->
+        <!--            <version>2.7.0</version>-->
+        <!--        </dependency>-->
+        <!--        <dependency>-->
+        <!--            <groupId>io.springfox</groupId>-->
+        <!--            <artifactId>springfox-swagger-ui</artifactId>-->
+        <!--            <version>2.7.0</version>-->
+        <!--        </dependency>-->
 
         <!--        第三方微信登录-->
         <dependency>
@@ -120,12 +125,12 @@
         </dependency>
 
 
-        <dependency>
-            <groupId>org.aspectj</groupId>
-            <artifactId>aspectjweaver</artifactId>
-            <version>1.9.7</version>
-            <!--            <scope>runtime</scope>-->
-        </dependency>
+        <!--        <dependency>-->
+        <!--            <groupId>org.aspectj</groupId>-->
+        <!--            <artifactId>aspectjweaver</artifactId>-->
+        <!--            <version>1.9.7</version>-->
+        <!--            &lt;!&ndash;            <scope>runtime</scope>&ndash;&gt;-->
+        <!--        </dependency>-->
         <!--        redis-->
         <dependency>
             <groupId>org.springframework.boot</groupId>
@@ -311,16 +316,16 @@
         <!--            <artifactId>springfox-boot-starter</artifactId>-->
         <!--            <version>3.0.0</version>-->
         <!--        </dependency>-->
-<!--        <dependency>-->
-<!--            <groupId>org.springdoc</groupId>-->
-<!--            <artifactId>springdoc-openapi-ui</artifactId>-->
-<!--            <version>1.7.0</version>-->
-<!--        </dependency>-->
-<!--        <dependency>-->
-<!--            <groupId>io.springfox</groupId>-->
-<!--            <artifactId>springfox-boot-starter</artifactId>-->
-<!--            <version>3.0.0</version>-->
-<!--        </dependency>-->
+        <!--        <dependency>-->
+        <!--            <groupId>org.springdoc</groupId>-->
+        <!--            <artifactId>springdoc-openapi-ui</artifactId>-->
+        <!--            <version>1.7.0</version>-->
+        <!--        </dependency>-->
+        <!--        <dependency>-->
+        <!--            <groupId>io.springfox</groupId>-->
+        <!--            <artifactId>springfox-boot-starter</artifactId>-->
+        <!--            <version>3.0.0</version>-->
+        <!--        </dependency>-->
 
 
         <dependency>
@@ -396,6 +401,36 @@
             <artifactId>swagger-core</artifactId>
             <version>2.2.9</version>
         </dependency>
+        <dependency>
+            <groupId>com.egzosn</groupId>
+            <artifactId>pay-java-wx</artifactId>
+            <version>2.14.5</version>
+        </dependency>
+        <dependency>
+            <groupId>com.egzosn</groupId>
+            <artifactId>pay-java-web-support</artifactId>
+            <version>2.14.5</version>
+        </dependency>
+        <dependency>
+            <groupId>joda-time</groupId>
+            <artifactId>joda-time</artifactId>
+            <version>2.10.10</version>
+        </dependency>
+        <dependency>
+            <groupId>com.github.wechatpay-apiv3</groupId>
+            <artifactId>wechatpay-apache-httpclient</artifactId>
+            <version>0.4.7</version>
+            <scope>compile</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.aspectj</groupId>
+            <artifactId>aspectjweaver</artifactId>
+        </dependency>
+        <!--        <dependency>-->
+        <!--            <groupId>3.6.2-bin.apache-maven-3.6.2.maven_repo.com.jayway.jsonpath</groupId>-->
+        <!--            <artifactId>json-path</artifactId>-->
+        <!--            <version>2.7.0</version>-->
+        <!--        </dependency>-->
 
     </dependencies>
 

+ 13 - 0
framework/src/main/java/com/wteam/framework/common/enums/CardTypeEnum.java

@@ -0,0 +1,13 @@
+package com.wteam.framework.common.enums;
+
+public enum CardTypeEnum {
+    /**
+     * 从上到下依次是储值卡、月卡、次卡、散客储值卡
+     */
+    STORED_VALUE,
+    MONTHLY,
+    TICKET,
+    //TODO :新增加的散客储值卡
+    PERSON_CARD
+
+}

+ 29 - 0
framework/src/main/java/com/wteam/framework/common/enums/OrderStatus.java

@@ -0,0 +1,29 @@
+package com.wteam.framework.common.enums;
+
+public enum OrderStatus {
+    ORDER_GENERATED(0, "订单生成"),
+    PAYMENT_PROCESSING(1, "支付中"),
+    PAYMENT_SUCCESSFUL(2, "支付成功"),
+    PAYMENT_FAILED(3, "支付失败"),
+    CANCELLED(4, "已撤销"),
+    REFUNDED(5, "已退款"),
+    ORDER_CLOSED(6, "订单关闭");
+
+    private final int code;
+    private final String description;
+
+    OrderStatus(int code, String description) {
+        this.code = code;
+        this.description = description;
+    }
+
+    public int getCode() {
+        return code;
+    }
+
+    public String getDescription() {
+        return description;
+    }
+
+    // 可以根据需要添加其他方法
+}

+ 26 - 0
framework/src/main/java/com/wteam/framework/common/enums/OrderStatusEnum.java

@@ -0,0 +1,26 @@
+package com.wteam.framework.common.enums;
+
+/**
+ * @author doncic
+ * @date 2023/9/26 21:13
+ */
+public enum OrderStatusEnum {
+    WAITING_TO_USE("待使用"),
+    WAITING_TO_PAY("待付款"),
+    WAITING_SUPPLEMENTS("待补款"),
+    IN_USE("使用中"),
+    USED("已使用"),
+    EXPIRED("已失效"),
+    REFUNDED("退款");
+
+    private final String statusDescription;
+
+    OrderStatusEnum(String statusDescription) {
+        this.statusDescription = statusDescription;
+    }
+
+    public String getStatusDescription() {
+        return statusDescription;
+    }
+}
+

+ 11 - 0
framework/src/main/java/com/wteam/framework/common/enums/OrderTypeEnums.java

@@ -0,0 +1,11 @@
+package com.wteam.framework.common.enums;
+
+/**
+ * @author doncic
+ * @date 2023/10/5 21:31
+ */
+public enum OrderTypeEnums {
+    RENTAL,   // 租场
+    TICKET,   // 门票
+    TIMER,    // 计时
+}

+ 27 - 2
framework/src/main/java/com/wteam/framework/common/enums/ResultCode.java

@@ -121,7 +121,7 @@ public enum ResultCode {
     USER_NOT_EXIST(20002, "用户不存在"),
     USER_NOT_LOGIN(20003, "用户未登录"),
     USER_AUTH_EXPIRED(20004, "用户已退出,请重新登录"),
-    USER_AUTHORITY_ERROR(20005, "权限不足"),
+    USER_AUTHORITY_ERROR(401, "权限不足"),
     USER_CONNECT_LOGIN_ERROR(20006, "未找到登录信息"),
     USER_EXIST(20008, "该用户名或手机号已被注册"),
     USER_PHONE_NOT_EXIST(20009, "手机号不存在"),
@@ -499,7 +499,32 @@ public enum ResultCode {
     INDEX_BUILDING(90005, "索引正在生成"),
     WECHAT_CODE_NOT_EXIST(1001, "微信登录code发送失败"),
     WECHAT_LOGIN_ERROR(1004, "微信登录失败"),
-    SETTING_NULL(1005, "获取配置为空");
+    SETTING_NULL(1005, "获取配置为空"),
+    UPDATE_USER_ERROR(1006, "更新用户信息失败"),
+    ENTITY_NULL(1007, "对象信息为空"),
+    NOT_FIND_STORE_ID(1008, "没有找到对应门店id"),
+    INVALID_STORE_ID_FORMAT(1009, "storeId无效的情况"),
+    INTERNAL_ERROR(1010, "获取门店信息时出现异常"),
+    UNAUTHORIZED(1011, "用户未认证"),
+    INVALID_ORDER(1012, "检查订单是否冲突或其他状态"),
+    INVALID_INPUT(1013, "传入token参数有误"),
+    USER_NOT_FOUND(1014, "该用户不存在"),
+    YAOCHONGXINKANYIXIADAIMA(1015, "修改充值卡接口代码"),
+    INSUFFICIENT_BALANCE(1016, "余额不足够支付订单"),
+    QRCODE(0, "二维码有效通过"),
+    QRCODE_ERROR(999, "二维码无效!"),
+    PAYMENT_ERROR(1017, "支付失败!"),
+    CARD_PAY_ERROR(1018, "储值卡支付错误!"),
+    TIME_CODE_ERROR(1019, "计时码出现问题!"),
+    ORDER_EXIST(1020, "订单已经存在!"),
+    USER_NEED_LOGIN(401, "用户需要登录!"),
+    PRICE_ERROR(1021, "订单价格不一致"),
+    CARD_ALREADY_EXITS(1022, "已经购买过月卡!"),
+    ORDER_STATE_ERROR(1023, "该订单状态异常!"),
+    CURRENTBALANCE_NOT(1024, "余额不足!请充值!"),
+    CARD_DAYS_IS_NULl(1025, "卡的有效天数为空!"),
+    USER_UPDATE_ERROR(1026, "修改用户信息错误!"),
+    GET_MONTHLY_CODE_ERROR(1027, "获得月卡二维码错误!");
 
     private final Integer code;
     private final String message;

+ 16 - 0
framework/src/main/java/com/wteam/framework/common/enums/orderTypeEnum.java

@@ -0,0 +1,16 @@
+package com.wteam.framework.common.enums;
+
+/**
+ * @author doncic
+ * @date 2023/9/19 18:56
+ */
+public enum orderTypeEnum {
+    RENTAL,   // 租场
+    TICKET,   // 门票
+    TIMER,    // 计时
+    MONTHLY,    //月卡
+    STORED_VALUE      // 新加入的卡片类型
+}
+
+
+

+ 4 - 4
framework/src/main/java/com/wteam/framework/common/security/AuthUser.java

@@ -1,7 +1,7 @@
 package com.wteam.framework.common.security;
 
- import com.wteam.framework.common.security.enums.UserEnums;
- import lombok.AllArgsConstructor;
+import com.wteam.framework.common.security.enums.UserEnums;
+import lombok.AllArgsConstructor;
 import lombok.Data;
 import lombok.NoArgsConstructor;
 
@@ -69,14 +69,14 @@ public class AuthUser implements Serializable {
     public AuthUser(String username, String id, String nickName, String face, UserEnums role) {
         this.username = username;
         this.face = face;
-        this.id = id;
+        this.id = String.valueOf(id);
         this.role = role;
         this.nickName = nickName;
     }
 
     public AuthUser(String username, String id, String face, UserEnums manager, String nickName, Boolean isSuper) {
         this.username = username;
-        this.id = id;
+        this.id = String.valueOf(id);
         this.face = face;
         this.role = manager;
         this.isSuper = isSuper;

+ 1 - 2
framework/src/main/java/com/wteam/framework/common/security/context/UserContext.java

@@ -5,7 +5,6 @@ package com.wteam.framework.common.security.context;
  */
 
 
-
 import com.google.gson.Gson;
 
 import com.wteam.framework.common.cache.Cache;
@@ -95,7 +94,7 @@ public class UserContext {
             //获取token的信息
             Claims claims
                     = Jwts.parser()
-                    .setSigningKey(       SecretKeyUtil.generalKeyByDecoders())
+                    .setSigningKey(SecretKeyUtil.generalKeyByDecoders())
                     .parseClaimsJws(accessToken).getBody();
             //获取存储在claims中的用户信息
             String json = claims.get(SecurityEnum.USER_CONTEXT.getValue()).toString();

+ 2 - 2
framework/src/main/java/com/wteam/framework/common/security/token/manager/ManagerTokenGenerate.java

@@ -42,7 +42,7 @@ public class ManagerTokenGenerate extends AbstractTokenGenerate<AdminUser> {
 
     @Override
     public Token createToken(AdminUser adminUser, Boolean longTerm) {
-        AuthUser authUser = new AuthUser(adminUser.getUsername(), adminUser.getId().toString(), adminUser.getAvatar(), UserEnums.MANAGER, adminUser.getNickName(), adminUser.getIsSuper());
+        AuthUser authUser = new AuthUser(adminUser.getUsername(), adminUser.getId(), adminUser.getAvatar(), UserEnums.MANAGER, adminUser.getNickName(), adminUser.getIsSuper());
 
 
 //        //根据角色集合获取拥有的菜单具体权限
@@ -138,7 +138,7 @@ public class ManagerTokenGenerate extends AbstractTokenGenerate<AdminUser> {
 
 
     public Token createToken(Member memberUser, Boolean longTerm) {
-        AuthUser authUser = new AuthUser(memberUser.getUsername(), memberUser.getId().toString(),memberUser.getFace(), memberUser.getNickName(), UserEnums.MEMBER);
+        AuthUser authUser = new AuthUser(memberUser.getUsername(), memberUser.getId(),memberUser.getFace(), memberUser.getNickName(), UserEnums.MEMBER);
 
 
 //        //根据角色集合获取拥有的菜单具体权限

+ 75 - 0
framework/src/main/java/com/wteam/framework/common/utils/AesCbcUtil.java

@@ -0,0 +1,75 @@
+package com.wteam.framework.common.utils;
+import org.apache.commons.codec.binary.Base64;
+import org.bouncycastle.jce.provider.BouncyCastleProvider;
+
+import javax.crypto.BadPaddingException;
+import javax.crypto.Cipher;
+import javax.crypto.IllegalBlockSizeException;
+import javax.crypto.NoSuchPaddingException;
+import javax.crypto.spec.IvParameterSpec;
+import javax.crypto.spec.SecretKeySpec;
+import java.io.UnsupportedEncodingException;
+import java.security.*;
+import java.security.spec.InvalidParameterSpecException;
+
+/**
+ * AES-128-CBC 加密方式
+ * 注:
+ * AES-128-CBC可以自己定义“密钥”和“偏移量“。
+ * AES-128是jdk自动生成的“密钥”。
+ */
+public class AesCbcUtil {
+    static {
+        //BouncyCastle是一个开源的加解密解决方案,主页在http://www.bouncycastle.org/
+        Security.addProvider(new BouncyCastleProvider());
+    }
+    /**
+     * AES解密
+     * @param data           //密文,被加密的数据
+     * @param key            //秘钥
+     * @param iv             //偏移量
+     * @param encodingFormat //解密后的结果需要进行的编码
+     * @return
+     * @throws Exception
+     */
+    public static String decrypt(String data, String key, String iv, String encodingFormat) throws Exception {
+        //被加密的数据
+        byte[] dataByte = Base64.decodeBase64(data);
+        //加密秘钥
+        byte[] keyByte = Base64.decodeBase64(key);
+        //偏移量
+        byte[] ivByte = Base64.decodeBase64(iv);
+        try {
+            Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding");
+            SecretKeySpec spec = new SecretKeySpec(keyByte, "AES");
+            AlgorithmParameters parameters = AlgorithmParameters.getInstance("AES");
+            parameters.init(new IvParameterSpec(ivByte));
+            cipher.init(Cipher.DECRYPT_MODE, spec, parameters);// 初始化
+            byte[] resultByte = cipher.doFinal(dataByte);
+            if (null != resultByte && resultByte.length > 0) {
+                String result = new String(resultByte, encodingFormat);
+                return result;
+            }
+            return null;
+        } catch (NoSuchAlgorithmException e) {
+            e.printStackTrace();
+        } catch (NoSuchPaddingException e) {
+            e.printStackTrace();
+        } catch (InvalidParameterSpecException e) {
+            e.printStackTrace();
+        } catch (InvalidKeyException e) {
+            e.printStackTrace();
+        } catch (InvalidAlgorithmParameterException e) {
+            e.printStackTrace();
+        } catch (IllegalBlockSizeException e) {
+            e.printStackTrace();
+        } catch (BadPaddingException e) {
+            e.printStackTrace();
+        } catch (UnsupportedEncodingException e) {
+            e.printStackTrace();
+        }
+
+        return null;
+    }
+
+}

+ 1 - 1
framework/src/main/java/com/wteam/framework/modules/book/entity/AdminUser.java

@@ -5,6 +5,7 @@ import lombok.AllArgsConstructor;
 import lombok.Data;
 import lombok.NoArgsConstructor;
 import com.baomidou.mybatisplus.annotation.TableName;
+
 /**
  * (CbAdminUser)表实体类
  *
@@ -54,5 +55,4 @@ public class AdminUser {
     private Boolean isBan;
 
 
-
 }

+ 17 - 11
framework/src/main/java/com/wteam/framework/modules/book/entity/Card.java

@@ -3,11 +3,14 @@ package com.wteam.framework.modules.book.entity;
 import java.util.Date;
 
 import java.io.Serializable;
+
+import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.AllArgsConstructor;
 import lombok.Data;
 import lombok.NoArgsConstructor;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
+
 /**
  * (Card)表实体类
  *
@@ -19,10 +22,9 @@ import com.baomidou.mybatisplus.annotation.TableName;
 @AllArgsConstructor
 @NoArgsConstructor
 @TableName("cb_card")
-public class Card  {
+public class Card {
     @TableId
     private Integer id;
-
     //创建者
     private String createBy;
     //创建时间
@@ -44,16 +46,20 @@ public class Card  {
     //结束日期
     private String endDate;
     //面值
-    private String faceValue;
+    private Integer faceValue;
     //赠送金额
-    private String bonusAmount;
+    private Integer bonusAmount;
     //当前余额
-    private String currentBalance;
+    private Double currentBalance;
     //用户id
-    private Long userId;
-    //门店id
-    private String storeId;
-
-
-
+    private String userId;
+    //对应订单id
+    //TODO :把原先的适用门店id改为此卡购买时的订单id
+    private Long storeId;
+    //折扣值
+    private Float discountValue;
+    //TODO :新增次卡使用次数
+    private Integer times;
+    //订单id
+    private String orderId;
 }

+ 4 - 6
framework/src/main/java/com/wteam/framework/modules/book/entity/Coupon.java

@@ -1,28 +1,27 @@
 package com.wteam.framework.modules.book.entity;
 
-import java.util.Boolean;
 
 import java.io.Serializable;
+
 import lombok.AllArgsConstructor;
 import lombok.Data;
 import lombok.NoArgsConstructor;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
+
 /**
  * (Coupon)表实体类
  *
  * @author doncic
  * @since 2023-09-16 20:38:17
  */
-@SuppressWarnings("serial")
 @Data
 @AllArgsConstructor
 @NoArgsConstructor
 @TableName("cb_coupon")
-public class Coupon  {
-    //id@TableId
+public class Coupon {
+    @TableId
     private Long id;
-
     //创建者
     private String createBy;
     //创建时间
@@ -57,5 +56,4 @@ public class Coupon  {
     private String discountValue;
 
 
-
 }

+ 3 - 3
framework/src/main/java/com/wteam/framework/modules/book/entity/CouponUser.java

@@ -1,13 +1,14 @@
 package com.wteam.framework.modules.book.entity;
 
-import java.util.Boolean;
 
 import java.io.Serializable;
+
 import lombok.AllArgsConstructor;
 import lombok.Data;
 import lombok.NoArgsConstructor;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
+
 /**
  * 优惠券用户中间表(CouponUser)表实体类
  *
@@ -19,7 +20,7 @@ import com.baomidou.mybatisplus.annotation.TableName;
 @AllArgsConstructor
 @NoArgsConstructor
 @TableName("cb_coupon_user")
-public class CouponUser  {
+public class CouponUser {
     //id@TableId
     private Long id;
 
@@ -43,5 +44,4 @@ public class CouponUser  {
     private String illustrate;
 
 
-
 }

+ 26 - 0
framework/src/main/java/com/wteam/framework/modules/book/entity/LongJsonDeserializer.java

@@ -0,0 +1,26 @@
+package com.wteam.framework.modules.book.entity;
+
+import com.fasterxml.jackson.core.JsonParser;
+import com.fasterxml.jackson.databind.DeserializationContext;
+import com.fasterxml.jackson.databind.JsonDeserializer;
+import lombok.extern.slf4j.Slf4j;
+
+import java.io.IOException;
+
+/**
+ * 字符串转为Long
+ */
+@Slf4j
+public class LongJsonDeserializer extends JsonDeserializer<Long> {
+
+    @Override
+    public Long deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException {
+        String value = jsonParser.getText();
+        try {
+            return value == null ? null : Long.parseLong(value);
+        } catch (NumberFormatException e) {
+            log.error("解析长整形错误", e);
+            return null;
+        }
+    }
+}

+ 21 - 0
framework/src/main/java/com/wteam/framework/modules/book/entity/LongJsonSerializer.java

@@ -0,0 +1,21 @@
+package com.wteam.framework.modules.book.entity;
+
+import com.fasterxml.jackson.core.JsonGenerator;
+import com.fasterxml.jackson.databind.JsonSerializer;
+import com.fasterxml.jackson.databind.SerializerProvider;
+
+import java.io.IOException;
+
+/**
+ * Long 类型字段序列化时转为字符串,避免js丢失精度
+ */
+public class LongJsonSerializer extends JsonSerializer<Long> {
+
+    @Override
+    public void serialize(Long value, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
+        String text = (value == null ? null : String.valueOf(value));
+        if (text != null) {
+            jsonGenerator.writeString(text);
+        }
+    }
+}

+ 6 - 3
framework/src/main/java/com/wteam/framework/modules/book/entity/Notice.java

@@ -1,14 +1,16 @@
 package com.wteam.framework.modules.book.entity;
 
-import java.util.Boolean;
+
 import java.util.Date;
 
 import java.io.Serializable;
+
 import lombok.AllArgsConstructor;
 import lombok.Data;
 import lombok.NoArgsConstructor;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
+
 /**
  * (Notice)表实体类
  *
@@ -20,7 +22,7 @@ import com.baomidou.mybatisplus.annotation.TableName;
 @AllArgsConstructor
 @NoArgsConstructor
 @TableName("cb_notice")
-public class Notice  {
+public class Notice {
     //id@TableId
     private Integer id;
 
@@ -44,7 +46,8 @@ public class Notice  {
     private String noticeTitle;
     //通知状态 为0代表通知未被删除,1代表通知被删除了
     private Boolean noticeState;
-
+    //门店id
+    private Long storeId;
 
 
 }

+ 40 - 16
framework/src/main/java/com/wteam/framework/modules/book/entity/OrderInfo.java

@@ -2,12 +2,18 @@ package com.wteam.framework.modules.book.entity;
 
 import java.util.Date;
 
-import java.io.Serializable;
+import com.alibaba.fastjson.serializer.ToStringSerializer;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.AllArgsConstructor;
 import lombok.Data;
 import lombok.NoArgsConstructor;
-import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
+import org.springframework.format.annotation.DateTimeFormat;
+
 /**
  * (OrderInfo)表实体类
  *
@@ -19,9 +25,12 @@ import com.baomidou.mybatisplus.annotation.TableName;
 @AllArgsConstructor
 @NoArgsConstructor
 @TableName("cb_order_info")
-public class OrderInfo  {
-    //id@TableId
-    private Long id;
+public class OrderInfo {
+
+    //    @JsonSerialize(using = LongJsonSerializer.class)
+//    @JsonDeserialize(using = LongJsonDeserializer.class)
+    @TableId
+    private String id;
 
     //创建者
     private String createBy;
@@ -34,15 +43,21 @@ public class OrderInfo  {
     //删除标志 true/false 删除/未删除
     private Integer deleteFlag;
     //用户id
-    private Long userId;
+    private String userId;
     //门店id
     private Long storeId;
     //预约日期
-    private String orderDate;
-    //预约开始时间
-    private String orderSt;
-    //预约结束时间
-    private String orderEd;
+    @Schema(description = "预约日期")
+    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd")
+    private Date orderDate;
+    @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME)
+    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm")
+    @Schema(description = "预约开始时间")
+    private Date orderSt;
+    @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME)
+    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm")
+    @Schema(description = "预约结束时间")
+    private Date orderEd;
     //订单状态(枚举)
     private String orderState;
     //订单价格
@@ -60,10 +75,19 @@ public class OrderInfo  {
     //二维码
     private String qrCode;
     //用户进场时间
-    private String startTime;
+    @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME)
+    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm")
+    @Schema(description = "用户进场时间")
+    private Date startTime;
     //用户离开时间
-    private String endTime;
-
-
-
+    @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME)
+    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm")
+    @Schema(description = "用户离场时间")
+    private Date endTime;
+    //购买卡的id
+    private Integer cardId;
+    //不知名id
+    private Long transactionId;
+    //订单超时金额
+    private Double overPrice;
 }

+ 3 - 2
framework/src/main/java/com/wteam/framework/modules/book/entity/OrderUser.java

@@ -3,11 +3,13 @@ package com.wteam.framework.modules.book.entity;
 import java.util.Date;
 
 import java.io.Serializable;
+
 import lombok.AllArgsConstructor;
 import lombok.Data;
 import lombok.NoArgsConstructor;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
+
 /**
  * (OrderUser)表实体类
  *
@@ -19,7 +21,7 @@ import com.baomidou.mybatisplus.annotation.TableName;
 @AllArgsConstructor
 @NoArgsConstructor
 @TableName("cb_order_user")
-public class OrderUser  {
+public class OrderUser {
     //id@TableId
     private Integer id;
 
@@ -39,5 +41,4 @@ public class OrderUser  {
     private Long userId;
 
 
-
 }

+ 3 - 2
framework/src/main/java/com/wteam/framework/modules/book/entity/PaymentInfo.java

@@ -3,11 +3,13 @@ package com.wteam.framework.modules.book.entity;
 import java.util.Date;
 
 import java.io.Serializable;
+
 import lombok.AllArgsConstructor;
 import lombok.Data;
 import lombok.NoArgsConstructor;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
+
 /**
  * (PaymentInfo)表实体类
  *
@@ -19,7 +21,7 @@ import com.baomidou.mybatisplus.annotation.TableName;
 @AllArgsConstructor
 @NoArgsConstructor
 @TableName("cb_payment_info")
-public class PaymentInfo  {
+public class PaymentInfo {
     //支付记录id@TableId
     private String id;
 
@@ -53,5 +55,4 @@ public class PaymentInfo  {
     private Date time;
 
 
-
 }

+ 3 - 3
framework/src/main/java/com/wteam/framework/modules/book/entity/Role.java

@@ -1,13 +1,14 @@
 package com.wteam.framework.modules.book.entity;
 
-import java.util.Boolean;
 
 import java.io.Serializable;
+
 import lombok.AllArgsConstructor;
 import lombok.Data;
 import lombok.NoArgsConstructor;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
+
 /**
  * (Role)表实体类
  *
@@ -19,7 +20,7 @@ import com.baomidou.mybatisplus.annotation.TableName;
 @AllArgsConstructor
 @NoArgsConstructor
 @TableName("cb_role")
-public class Role  {
+public class Role {
     //ID@TableId
     private Long id;
 
@@ -41,5 +42,4 @@ public class Role  {
     private String name;
 
 
-
 }

+ 3 - 3
framework/src/main/java/com/wteam/framework/modules/book/entity/RoleMenu.java

@@ -1,13 +1,14 @@
 package com.wteam.framework.modules.book.entity;
 
-import java.util.Boolean;
 
 import java.io.Serializable;
+
 import lombok.AllArgsConstructor;
 import lombok.Data;
 import lombok.NoArgsConstructor;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
+
 /**
  * (RoleMenu)表实体类
  *
@@ -19,7 +20,7 @@ import com.baomidou.mybatisplus.annotation.TableName;
 @AllArgsConstructor
 @NoArgsConstructor
 @TableName("cb_role_menu")
-public class RoleMenu  {
+public class RoleMenu {
     //ID@TableId
     private Long id;
 
@@ -41,5 +42,4 @@ public class RoleMenu  {
     private String roleId;
 
 
-
 }

+ 9 - 4
framework/src/main/java/com/wteam/framework/modules/book/entity/Store.java

@@ -1,5 +1,6 @@
 package com.wteam.framework.modules.book.entity;
 
+import java.time.LocalTime;
 import java.util.Date;
 
 import java.io.Serializable;
@@ -12,7 +13,7 @@ import com.baomidou.mybatisplus.annotation.TableName;
  * (Store)表实体类
  *
  * @author doncic
- * @since 2023-09-16 20:39:49
+ * @since 2023-10-02 17:45:13
  */
 @SuppressWarnings("serial")
 @Data
@@ -38,9 +39,9 @@ public class Store  {
     //场馆介绍
     private String venueIntroduction;
     //开店时间
-    private Date openingTime;
+    private String openingTime;
     //关店时间
-    private Date closingTime;
+    private String closingTime;
     //门店图片
     private String storeImages;
     //服务热线
@@ -52,9 +53,13 @@ public class Store  {
     //提前预订天数
     private String advanceDays;
     //起订时间
-    private Date leadTime;
+    private Integer leadTime;
     //公告
     private String announcement;
+    //门店地址
+    private String address;
+    //订场须知
+    private String scheduledNotice;
 
 
 

+ 3 - 2
framework/src/main/java/com/wteam/framework/modules/book/entity/Vdstate.java

@@ -3,11 +3,13 @@ package com.wteam.framework.modules.book.entity;
 import java.util.Date;
 
 import java.io.Serializable;
+
 import lombok.AllArgsConstructor;
 import lombok.Data;
 import lombok.NoArgsConstructor;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
+
 /**
  * (Vdstate)表实体类
  *
@@ -19,7 +21,7 @@ import com.baomidou.mybatisplus.annotation.TableName;
 @AllArgsConstructor
 @NoArgsConstructor
 @TableName("cb_vdstate")
-public class Vdstate  {
+public class Vdstate {
     //id@TableId
     private Integer id;
 
@@ -41,5 +43,4 @@ public class Vdstate  {
     private String vdstateSt;
 
 
-
 }

+ 23 - 10
framework/src/main/java/com/wteam/framework/modules/book/entity/Venue.java

@@ -3,26 +3,27 @@ package com.wteam.framework.modules.book.entity;
 import java.util.Date;
 
 import java.io.Serializable;
+
 import lombok.AllArgsConstructor;
 import lombok.Data;
 import lombok.NoArgsConstructor;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
+
 /**
  * (Venue)表实体类
  *
  * @author doncic
- * @since 2023-09-16 20:40:12
+ * @since 2023-10-02 17:45:53
  */
 @SuppressWarnings("serial")
 @Data
 @AllArgsConstructor
 @NoArgsConstructor
 @TableName("cb_venue")
-public class Venue  {
+public class Venue {
     //id@TableId
     private Integer id;
-
     //创建者
     private String createBy;
     //创建时间
@@ -37,13 +38,25 @@ public class Venue  {
     private String venueName;
     //门店id
     private Long storeId;
-    //半场价格
-    private Double halfPrice;
-    //全场价格
-    private Double allPrice;
-    //价格
-    private Double price;
-
+    //上午时间段半场价格
+    private Double amHalfPrice;
+    //下午篮球半场价格
+    private Double pmHalfPrice;
+    //上午篮球场,羽毛球场,乒乓球全场价格
+    private Double amAllPrice;
+    //下午篮球场全场,羽毛球,乒乓球场价格
+    private Double pmAllPrice;
+    //场地关联id
+    private String relevancyId;
+    //场地购买须知
+    private String purchaseInstructions;
+    //特殊价格
+    private String specialValue;
+    //场地类型0为篮球场,1为羽毛球场,2为乒乓球场
+    private String venueType;
+    //TODO:新添加的
+    //场地起订时间
+    private Double leadTime;
 
 
 }

+ 21 - 0
framework/src/main/java/com/wteam/framework/modules/book/entity/dto/OrderCardReq.java

@@ -0,0 +1,21 @@
+package com.wteam.framework.modules.book.entity.dto;
+
+import io.swagger.annotations.ApiModel;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * @author doncic
+ * @date 2023/10/1 19:15
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@ApiModel
+public class OrderCardReq {
+    //卡的id
+    private Integer cardId;
+    //门店id
+    private Long storeId;
+}

+ 60 - 0
framework/src/main/java/com/wteam/framework/modules/book/entity/dto/OrderReq.java

@@ -0,0 +1,60 @@
+package com.wteam.framework.modules.book.entity.dto;
+
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import io.swagger.annotations.ApiModelProperty;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.time.LocalTime;
+import java.util.Date;
+
+
+/**
+ * @author doncic
+ * @date 2023/9/20 12:59
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@ApiModel
+public class OrderReq {
+    //场地id
+    private Long venueId;
+    //门店id
+    private Long storeId;
+    //门店名称
+    private String storeName;
+    //门店地址
+    private String address;
+    //预约日期
+    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd")
+    private Date orderDate;
+    //预约开始时间
+    @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME)
+    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm")
+    @Schema(description = "预约开始时间")
+    private Date orderSt;
+    @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME)
+    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm")
+    @Schema(description = "预约结束时间")
+    private Date orderEd;
+    //订单类型(枚举)
+    private String orderType;
+    //手机号码
+    private String phoneNumber;
+    //订单价格
+    private Double orderPrice;
+    //优惠卷id
+    private Long id;
+    //场地关联id
+    private String relevancyId;
+
+}

+ 30 - 0
framework/src/main/java/com/wteam/framework/modules/book/entity/dto/StoreForm.java

@@ -0,0 +1,30 @@
+package com.wteam.framework.modules.book.entity.dto;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * @author doncic
+ * @date 2023/9/18 22:20
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class StoreForm {
+    private Long id;
+    //卡名称
+    private String cardName;
+    //卡类型(储值卡、月卡、次卡枚举)
+    private String cardType;
+    //有效期
+    private Integer days;
+    //生效日期
+    private String startDate;
+    //结束日期
+    private String endDate;
+    //面值
+    private Integer faceValue;
+    //赠送金额
+    private Integer bonusAmount;
+}

+ 24 - 0
framework/src/main/java/com/wteam/framework/modules/book/entity/dto/StorePhotoDto.java

@@ -0,0 +1,24 @@
+package com.wteam.framework.modules.book.entity.dto;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import javax.websocket.OnOpen;
+import java.util.List;
+
+/**
+ * @author doncic
+ * @date 2023/9/18 16:56
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class StorePhotoDto {
+    /**
+     * 门店id
+     * 该门店对应的图片信息
+     */
+    private Long store_id;
+    private List<String> images;
+}

+ 21 - 0
framework/src/main/java/com/wteam/framework/modules/book/entity/dto/StoredCardDto.java

@@ -0,0 +1,21 @@
+package com.wteam.framework.modules.book.entity.dto;
+
+import com.wteam.framework.modules.book.entity.Card;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.List;
+
+/**
+ * @author doncic
+ * @date 2023/9/18 16:54
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class StoredCardDto {
+
+    private List<Card> cardList;
+    private String storeName;
+}

+ 33 - 0
framework/src/main/java/com/wteam/framework/modules/book/entity/reqp/TimeCalculation.java

@@ -0,0 +1,33 @@
+package com.wteam.framework.modules.book.entity.reqp;
+
+import java.time.Instant;
+import java.time.LocalDate;
+import java.time.LocalTime;
+import java.time.ZoneOffset;
+
+public class TimeCalculation {
+    public static void main(String[] args) {
+        // 假设您有一个订单的开始时间和结束时间
+        LocalTime orderSt = LocalTime.of(10, 0); // 假设订单开始时间是10:00 AM
+        LocalTime orderEd = LocalTime.of(12, 30); // 假设订单结束时间是12:30 PM
+
+        // 计算比orderSt早5分钟
+        LocalTime fiveMinutesBeforeOrderSt = orderSt.minusMinutes(5);
+
+        // 计算比orderEd晚15分钟
+        LocalTime fifteenMinutesAfterOrderEd = orderEd.plusMinutes(15);
+
+        // 转换为时间戳
+        long timestampFiveMinutesBeforeOrderSt = fiveMinutesBeforeOrderSt.atDate(LocalDate.now())
+                .toInstant(ZoneOffset.UTC)
+                .toEpochMilli();
+
+        long timestampFifteenMinutesAfterOrderEd = fifteenMinutesAfterOrderEd.atDate(LocalDate.now())
+                .toInstant(ZoneOffset.UTC)
+                .toEpochMilli();
+
+        // 打印结果
+        System.out.println("比orderSt早5分钟的时间戳:" + timestampFiveMinutesBeforeOrderSt);
+        System.out.println("比orderEd晚15分钟的时间戳:" + timestampFifteenMinutesAfterOrderEd);
+    }
+}

+ 18 - 0
framework/src/main/java/com/wteam/framework/modules/book/entity/reqp/hardwareReq.java

@@ -0,0 +1,18 @@
+package com.wteam.framework.modules.book.entity.reqp;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * @author doncic
+ * @date 2023/9/27 19:17
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class hardwareReq {
+    private String devmac;
+    private String time;
+    private String qcode;
+}

+ 42 - 0
framework/src/main/java/com/wteam/framework/modules/book/entity/vo/CardVo.java

@@ -0,0 +1,42 @@
+package com.wteam.framework.modules.book.entity.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import javax.validation.constraints.NotNull;
+
+/**
+ * @author doncic
+ * @date 2023/9/23 20:41
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class CardVo {
+    //卡名称
+    private String cardName;
+    //卡类型(储值卡、月卡、次卡枚举)
+    private String cardType;
+    //有效期
+    private Integer days;
+    //生效日期
+    private String startDate;
+    //结束日期
+    private String endDate;
+    //面值
+    private Integer faceValue;
+    //赠送金额
+    private Integer bonusAmount;
+    //当前余额
+    private Double currentBalance;
+    //TODO :新增次卡使用次数
+    private Integer times;
+    @Schema(description = "详情简介")
+    private String detailedIntroduction;
+    @Schema(description = "使用说明")
+    private String usageInstructions;
+    //购买该卡对应的订单id
+    private String orderId;
+}

+ 87 - 0
framework/src/main/java/com/wteam/framework/modules/book/entity/vo/OrderInfoVo.java

@@ -0,0 +1,87 @@
+package com.wteam.framework.modules.book.entity.vo;
+
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.wteam.framework.modules.book.entity.OrderInfo;
+import com.wteam.framework.modules.book.entity.Venue;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.util.Date;
+
+/**
+ * @author doncic
+ * @date 2023/10/5 17:25
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class OrderInfoVo {
+
+    @TableId
+    private String id;
+
+    //创建者
+    private String createBy;
+    //创建时间
+    private Date createTime;
+    //修改者
+    private String updateBy;
+    //修改时间
+    private Date updateTime;
+    //删除标志 true/false 删除/未删除
+    private Integer deleteFlag;
+    //用户id
+    private String userId;
+    //门店id
+    private Long storeId;
+    //预约日期
+    @Schema(description = "预约日期")
+    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd")
+    private Date orderDate;
+    @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME)
+    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm")
+    @Schema(description = "预约开始时间")
+    private Date orderSt;
+    @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME)
+    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm")
+    @Schema(description = "预约结束时间")
+    private Date orderEd;
+    //订单状态(枚举)
+    private String orderState;
+    //订单价格
+    private Double orderPrice;
+    //订单类型(枚举)
+    private String orderType;
+    //支付方式
+    private String paymentMethods;
+    //分享次数
+    private Integer share;
+    //场地id
+    private Long venueId;
+    //手机号码
+    private String phoneNumber;
+    //二维码
+    private String qrCode;
+    //用户进场时间
+    @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME)
+    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm")
+    @Schema(description = "用户进场时间")
+    private Date startTime;
+    //用户离开时间
+    @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME)
+    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm")
+    @Schema(description = "用户离场时间")
+    private Date endTime;
+    //购买卡的id
+    private Integer cardId;
+    //不知名id
+    private Long transactionId;
+    //订单超时金额
+    private Double overPrice;
+    private String venueName;
+    private String venueType;
+}

+ 89 - 0
framework/src/main/java/com/wteam/framework/modules/book/entity/vo/OrderTicketVo.java

@@ -0,0 +1,89 @@
+package com.wteam.framework.modules.book.entity.vo;
+
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.util.Date;
+
+/**
+ * @author doncic
+ * @date 2023/10/6 14:15
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class OrderTicketVo {
+    @TableId
+    private String id;
+
+    //创建者
+    private String createBy;
+    //创建时间
+    private Date createTime;
+    //修改者
+    private String updateBy;
+    //修改时间
+    private Date updateTime;
+    //删除标志 true/false 删除/未删除
+    private Integer deleteFlag;
+    //用户id
+    private String userId;
+    //门店id
+    private Long storeId;
+    //预约日期
+    @Schema(description = "预约日期")
+    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd")
+    private Date orderDate;
+    @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME)
+    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm")
+    @Schema(description = "预约开始时间")
+    private Date orderSt;
+    @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME)
+    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm")
+    @Schema(description = "预约结束时间")
+    private Date orderEd;
+    //订单状态(枚举)
+    private String orderState;
+    //订单价格
+    private Double orderPrice;
+    //订单类型(枚举)
+    private String orderType;
+    //支付方式
+    private String paymentMethods;
+    //分享次数
+    private Integer share;
+    //场地id
+    private Long venueId;
+    //手机号码
+    private String phoneNumber;
+    //二维码
+    private String qrCode;
+    //用户进场时间
+    @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME)
+    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm")
+    @Schema(description = "用户进场时间")
+    private Date startTime;
+    //用户离开时间
+    @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME)
+    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm")
+    @Schema(description = "用户离场时间")
+    private Date endTime;
+    //购买卡的id
+    private Integer cardId;
+    //不知名id
+    private Long transactionId;
+    //订单超时金额
+    private Double overPrice;
+    //有效期
+    private Integer days;
+    //生效日期
+    private String startDate;
+    //结束日期
+    private String endDate;
+
+}

+ 18 - 0
framework/src/main/java/com/wteam/framework/modules/book/entity/vo/OrderVo.java

@@ -0,0 +1,18 @@
+package com.wteam.framework.modules.book.entity.vo;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * @author doncic
+ * @date 2023/10/1 19:31
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class OrderVo {
+
+    private String orderId;
+    private Integer cardId;
+}

+ 30 - 0
framework/src/main/java/com/wteam/framework/modules/book/entity/vo/PaymentRequest.java

@@ -0,0 +1,30 @@
+package com.wteam.framework.modules.book.entity.vo;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class PaymentRequest {
+    private double amount;
+    private String extParam;
+    private String mchOrderNo;
+    private String subject;
+    private String wayCode;
+    private String sign;
+    private String reqTime;
+    private String body;
+    private String version;
+    private String channelExtra;
+    private String appId;
+    private String clientIp;
+    private String notifyUrl;
+    private String signType;
+    private String currency;
+    private String returnUrl;
+    private String mchNo;
+    private int divisionMode;
+}

+ 20 - 0
framework/src/main/java/com/wteam/framework/modules/book/entity/vo/StoreDetailsVo.java

@@ -0,0 +1,20 @@
+package com.wteam.framework.modules.book.entity.vo;
+
+import com.wteam.framework.modules.book.entity.Venue;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.List;
+
+/**
+ * @author doncic
+ * @date 2023/9/26 18:50
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class StoreDetailsVo {
+    private StoreVo storeVo;
+    private List<Venue> venueList;
+}

+ 42 - 0
framework/src/main/java/com/wteam/framework/modules/book/entity/vo/StoreVo.java

@@ -0,0 +1,42 @@
+package com.wteam.framework.modules.book.entity.vo;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.sql.Time;
+import java.time.LocalTime;
+
+/**
+ * @author doncic
+ * @date 2023/9/19 22:32
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class StoreVo {
+    //门店名称
+    private String storeName;
+    //地址
+    private String address;
+    //场馆介绍
+    private String venueIntroduction;
+    //开店时间
+    private String openingTime;
+    //关店时间
+    private String closingTime;
+    //服务热线
+    private String serviceHotline;
+    //微信号
+    private String wxCode;
+    //实时人数
+    private String realTime;
+    //提前预订天数
+    private String advanceDays;
+    //起订时间
+    private Integer leadTime;
+    //公告
+    private String announcement;
+    //订场须知
+    private String scheduledNotice;
+}

+ 17 - 0
framework/src/main/java/com/wteam/framework/modules/book/entity/vo/TimeCodeVo.java

@@ -0,0 +1,17 @@
+package com.wteam.framework.modules.book.entity.vo;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * @author doncic
+ * @date 2023/9/30 1:11
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class TimeCodeVo {
+    private String code;
+    private String nickName;
+}

+ 17 - 0
framework/src/main/java/com/wteam/framework/modules/book/entity/vo/VenueVo.java

@@ -0,0 +1,17 @@
+package com.wteam.framework.modules.book.entity.vo;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * @author doncic
+ * @date 2023/10/5 17:26
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class VenueVo {
+    private String venueName;
+    private String venueType;
+}

+ 21 - 0
framework/src/main/java/com/wteam/framework/modules/book/mapper/CardMapper.java

@@ -0,0 +1,21 @@
+package com.wteam.framework.modules.book.mapper;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.wteam.framework.modules.book.entity.Card;
+import com.wteam.framework.modules.book.entity.OrderInfo;
+
+import java.util.List;
+
+
+/**
+ * (Card)表数据库访问层
+ *
+ * @author doncic
+ * @since 2023-09-18 19:19:57
+ */
+public interface CardMapper extends BaseMapper<Card> {
+
+
+}
+

+ 16 - 0
framework/src/main/java/com/wteam/framework/modules/book/mapper/CouponMapper.java

@@ -0,0 +1,16 @@
+package com.wteam.framework.modules.book.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.wteam.framework.modules.book.entity.Coupon;
+
+
+/**
+ * (Coupon)表数据库访问层
+ *
+ * @author doncic
+ * @since 2023-09-20 14:18:05
+ */
+public interface CouponMapper extends BaseMapper<Coupon> {
+
+}
+

+ 16 - 0
framework/src/main/java/com/wteam/framework/modules/book/mapper/CouponUserMapper.java

@@ -0,0 +1,16 @@
+package com.wteam.framework.modules.book.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.wteam.framework.modules.book.entity.CouponUser;
+
+
+/**
+ * 优惠券用户中间表(CouponUser)表数据库访问层
+ *
+ * @author doncic
+ * @since 2023-09-25 17:18:54
+ */
+public interface CouponUserMapper extends BaseMapper<CouponUser> {
+
+}
+

+ 16 - 0
framework/src/main/java/com/wteam/framework/modules/book/mapper/OrderInfoMapper.java

@@ -0,0 +1,16 @@
+package com.wteam.framework.modules.book.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.wteam.framework.modules.book.entity.OrderInfo;
+
+
+/**
+ * (OrderInfo)表数据库访问层
+ *
+ * @author doncic
+ * @since 2023-09-20 13:12:50
+ */
+public interface OrderInfoMapper extends BaseMapper<OrderInfo> {
+
+}
+

+ 16 - 0
framework/src/main/java/com/wteam/framework/modules/book/mapper/PaymentInfoMapper.java

@@ -0,0 +1,16 @@
+package com.wteam.framework.modules.book.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.wteam.framework.modules.book.entity.PaymentInfo;
+
+
+/**
+ * (PaymentInfo)表数据库访问层
+ *
+ * @author doncic
+ * @since 2023-09-20 19:20:06
+ */
+public interface PaymentInfoMapper extends BaseMapper<PaymentInfo> {
+
+}
+

+ 16 - 0
framework/src/main/java/com/wteam/framework/modules/book/mapper/StoreMapper.java

@@ -0,0 +1,16 @@
+package com.wteam.framework.modules.book.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.wteam.framework.modules.book.entity.Store;
+
+
+/**
+ * (Store)表数据库访问层
+ *
+ * @author doncic
+ * @since 2023-10-02 17:45:13
+ */
+public interface StoreMapper extends BaseMapper<Store> {
+
+}
+

+ 16 - 0
framework/src/main/java/com/wteam/framework/modules/book/mapper/VenueMapper.java

@@ -0,0 +1,16 @@
+package com.wteam.framework.modules.book.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.wteam.framework.modules.book.entity.Venue;
+
+
+/**
+ * (Venue)表数据库访问层
+ *
+ * @author doncic
+ * @since 2023-10-02 17:45:53
+ */
+public interface VenueMapper extends BaseMapper<Venue> {
+
+}
+

+ 38 - 0
framework/src/main/java/com/wteam/framework/modules/book/service/CardService.java

@@ -0,0 +1,38 @@
+package com.wteam.framework.modules.book.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.jeequan.jeepay.exception.JeepayException;
+import com.wteam.framework.common.enums.CardTypeEnum;
+import com.wteam.framework.common.enums.ResultCode;
+import com.wteam.framework.common.vo.ResultMessage;
+import com.wteam.framework.modules.book.entity.Card;
+import com.wteam.framework.modules.book.entity.dto.OrderCardReq;
+import org.springframework.stereotype.Service;
+
+
+/**
+ * (Card)表服务接口
+ * @author doncic
+ * @since 2023-09-18 19:19:57
+ */
+@Service
+public interface CardService extends IService<Card> {
+
+    ResultMessage showCard(Long id, CardTypeEnum cardTypeEnum);
+
+    ResultMessage showCardDetails(Long id);
+
+    ResultMessage buyCard(String accessToken, String id, Long cardId);
+
+    ResultMessage chargeCard(String accessToken, Long id);
+
+    ResultMessage generateCardOrder(String accessToken, OrderCardReq orderCardReq);
+
+    ResultMessage valueCardPay(String orderId, Integer cardId);
+
+    ResultMessage getQrCodeByCard(String cardId);
+
+    ResultMessage cardCharge(String orderId, Integer cardId);
+
+    ResultMessage getChargeCardOrder(String accessToken, Integer cardId,Double currentBalance);
+}

+ 16 - 0
framework/src/main/java/com/wteam/framework/modules/book/service/CouponService.java

@@ -0,0 +1,16 @@
+package com.wteam.framework.modules.book.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.wteam.framework.modules.book.entity.Coupon;
+
+
+/**
+ * (Coupon)表服务接口
+ *
+ * @author doncic
+ * @since 2023-09-20 14:18:05
+ */
+public interface CouponService extends IService<Coupon> {
+
+
+}

+ 31 - 0
framework/src/main/java/com/wteam/framework/modules/book/service/OrderInfoService.java

@@ -0,0 +1,31 @@
+package com.wteam.framework.modules.book.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.wteam.framework.common.enums.orderTypeEnum;
+import com.wteam.framework.common.vo.ResultMessage;
+import com.wteam.framework.modules.book.entity.OrderInfo;
+import com.wteam.framework.modules.book.entity.dto.OrderReq;
+import com.wteam.framework.modules.pay.entity.vo.CallbackParamVO;
+
+
+import java.util.Date;
+
+
+/**
+ * (OrderInfo)表服务接口
+ *
+ * @author doncic
+ * @since 2023-09-20 13:12:50
+ */
+public interface OrderInfoService extends IService<OrderInfo> {
+
+
+    ResultMessage generateOrder(String accessToken, OrderReq orderReq);
+
+    Boolean checkOrder(Long id);
+
+    void processOrders(CallbackParamVO callbackParamVO);
+
+
+    ResultMessage bookStatus(Long id, Date dateTime);
+}

+ 21 - 0
framework/src/main/java/com/wteam/framework/modules/book/service/PaymentInfoService.java

@@ -0,0 +1,21 @@
+package com.wteam.framework.modules.book.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.wteam.framework.common.vo.ResultMessage;
+import com.wteam.framework.modules.book.entity.PaymentInfo;
+
+
+/**
+ * (PaymentInfo)表服务接口
+ *
+ * @author doncic
+ * @since 2023-09-20 19:20:06
+ */
+public interface PaymentInfoService extends IService<PaymentInfo> {
+
+    void wxpay(Long id);
+
+    ResultMessage refund(Long id);
+
+    ResultMessage cardPay(String accessToken, Long userId, Long orderId);
+}

+ 20 - 0
framework/src/main/java/com/wteam/framework/modules/book/service/StoreService.java

@@ -0,0 +1,20 @@
+package com.wteam.framework.modules.book.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.wteam.framework.common.vo.ResultMessage;
+import com.wteam.framework.modules.book.entity.Store;
+
+
+/**
+ * (Store)表服务接口
+ *
+ * @author doncic
+ * @since 2023-09-16 22:56:03
+ */
+public interface StoreService extends IService<Store> {
+
+    ResultMessage getPhoto(Long id);
+
+
+    ResultMessage getDetails(Long id);
+}

+ 15 - 0
framework/src/main/java/com/wteam/framework/modules/book/service/VenueService.java

@@ -0,0 +1,15 @@
+package com.wteam.framework.modules.book.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.wteam.framework.modules.book.entity.Venue;
+
+
+/**
+ * (Venue)表服务接口
+ *
+ * @author doncic
+ * @since 2023-09-20 14:17:47
+ */
+public interface VenueService extends IService<Venue> {
+
+}

+ 550 - 0
framework/src/main/java/com/wteam/framework/modules/book/service/impl/CardServiceImpl.java

@@ -0,0 +1,550 @@
+package com.wteam.framework.modules.book.service.impl;
+
+import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.http.HttpRequest;
+import cn.hutool.http.HttpResponse;
+import cn.hutool.json.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.jeequan.jeepay.Jeepay;
+import com.jeequan.jeepay.JeepayClient;
+import com.jeequan.jeepay.exception.JeepayException;
+import com.jeequan.jeepay.model.PayOrderCreateReqModel;
+import com.jeequan.jeepay.request.PayOrderCreateRequest;
+import com.jeequan.jeepay.response.PayOrderCreateResponse;
+import com.wteam.framework.common.enums.*;
+import com.wteam.framework.common.exception.ServiceException;
+import com.wteam.framework.common.security.AuthUser;
+import com.wteam.framework.common.security.context.UserContext;
+import com.wteam.framework.common.utils.BeanUtil;
+import com.wteam.framework.common.vo.ResultMessage;
+import com.wteam.framework.modules.book.entity.Card;
+import com.wteam.framework.modules.book.entity.OrderInfo;
+import com.wteam.framework.modules.book.entity.Store;
+import com.wteam.framework.modules.book.entity.dto.OrderCardReq;
+import com.wteam.framework.modules.book.entity.dto.StoredCardDto;
+import com.wteam.framework.modules.book.entity.vo.CardVo;
+import com.wteam.framework.modules.book.entity.vo.OrderVo;
+import com.wteam.framework.modules.book.mapper.CardMapper;
+import com.wteam.framework.modules.book.mapper.OrderInfoMapper;
+import com.wteam.framework.modules.book.mapper.StoreMapper;
+import com.wteam.framework.modules.book.service.CardService;
+import com.wteam.framework.modules.book.service.OrderInfoService;
+import com.wteam.framework.modules.card.entity.CbCardAdmin;
+import com.wteam.framework.modules.card.mapper.CardAdminMapper;
+import com.wteam.framework.modules.hardware.ApiCallerUtil;
+import com.wteam.framework.modules.pay.serviceimpl.CashierSupport;
+import com.wteam.framework.modules.system.entity.dto.WechatPaymentSetting;
+import com.wteam.framework.modules.system.service.SettingService;
+import com.wteam.framework.modules.user.entity.User;
+import com.wteam.framework.modules.user.mapper.UserMapper;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.stereotype.Service;
+
+import javax.validation.constraints.NotNull;
+import java.time.LocalDate;
+import java.time.format.DateTimeFormatter;
+import java.time.format.DateTimeParseException;
+import java.util.*;
+import java.util.concurrent.TimeUnit;
+import java.util.stream.Collectors;
+
+import static com.wteam.framework.modules.book.service.impl.OrderInfoServiceImpl.getWechatPaymentSetting;
+
+/**
+ * (Card)表服务实现类
+ *
+ * @author doncic
+ * @since 2023-09-18 19:19:57
+ */
+@Slf4j
+@Service("cardService")
+public class CardServiceImpl extends ServiceImpl<CardMapper, Card> implements CardService {
+
+    @Autowired
+    private CardMapper cardMapper;
+    @Autowired
+    private StoreMapper storeMapper;
+    @Autowired
+    private OrderInfoMapper orderInfoMapper;
+    @Autowired
+    private SettingService settingService;
+    @Autowired
+    private OrderInfoService orderInfoService;
+    @Autowired
+    private RedisTemplate redisTemplate;
+    @Autowired
+    private CardService cardService;
+    @Autowired
+    private CashierSupport cashierSupport;
+    @Autowired
+    private UserMapper userMapper;
+    @Autowired
+    private CardAdminMapper cardAdminMapper;
+
+    @Override
+    public ResultMessage showCard(@NotNull Long id, CardTypeEnum cardTypeEnum) {
+        //根据id查到此店名称
+        Store store = storeMapper.selectById(id);
+        if (ObjectUtil.isNull(store)) {
+            return ResultUtil.error(ResultCode.ENTITY_NULL);
+        }
+        String storeName = store.getStoreName();
+        //创建lambdaQueryWrapper对象
+        LambdaQueryWrapper<Card> queryWrapper = new LambdaQueryWrapper<>();
+        //传入id和card表里面storeId比对
+        queryWrapper.eq(Card::getStoreId, id);
+        //获取cards集合
+        List<Card> cards = cardMapper.selectList(queryWrapper);
+        if (ObjectUtil.isNull(cards)) {
+            return ResultUtil.error(ResultCode.ENTITY_NULL);
+        }
+        log.info("此时获取到的卡有:{}", cards);
+        String cardType = String.valueOf(cardTypeEnum);
+        List<Card> cardList = cards.stream().filter(card -> Objects.equals(card.getCardType(), cardType)).collect(Collectors.<Card>toList());
+        log.info("此时获取到的卡是:{}", cardList);
+        StoredCardDto storedCardDto = new StoredCardDto(cardList, storeName);
+        return ResultUtil.data(storedCardDto);
+    }
+
+    @Override
+    public ResultMessage showCardDetails(@NotNull Long id) {
+        //查找卡信息
+        CbCardAdmin card = cardAdminMapper.selectById(id);
+        if (ObjectUtil.isNull(card)) {
+            throw new ServiceException("查不到对应卡信息");
+        }
+        CardVo cardVo = new CardVo();
+        //bean拷贝
+        BeanUtil.copyProperties(card, cardVo);
+        return ResultUtil.data(cardVo);
+    }
+
+    @Override
+    public ResultMessage buyCard(@NotNull String accessToken, @NotNull String orderId, Long cardId) {
+        // 校验token
+        AuthUser authUser = UserContext.getAuthUser(accessToken);
+        assert authUser != null;
+        String id = authUser.getId();
+        log.info("此时的userId信息为:{}", id);
+
+        // 先查询卡是否存在
+        Card card = cardMapper.selectById(cardId);
+        log.info("此时的卡信息为:{}", card);
+
+        if (ObjectUtil.isNull(card)) {
+            throw new ServiceException("查不到对应卡信息");
+        }
+
+        //查询订单信息
+        OrderInfo orderInfo = orderInfoMapper.selectById(orderId);
+        log.info("此时的订单信息为:{}", orderInfo);
+
+        if (ObjectUtil.isNotNull(orderInfo)) {
+            // 调用微信支付的接口
+            String paymentEndpointUrl = "http://139.9.38.185:8889/v1/payment/pay/WECHAT/JSAPI?" + "sn=" + orderId;
+            // 构建GET请求
+            HttpRequest request = HttpRequest.get(paymentEndpointUrl);
+            // 发送请求并获取响应
+            HttpResponse response = request.execute();
+            // 处理响应
+            if (response.isOk()) {
+                String responseBody = response.body();
+                log.info("此时的响应信息为:{}", responseBody);// 保存卡信息
+                Card cardUser = new Card();
+                cardUser.setCardType(card.getCardType());
+                cardUser.setDays(card.getDays());
+                cardUser.setStartDate(String.valueOf(new Date()));
+                cardUser.setEndDate(cardUser.getStartDate() + cardUser.getDays());
+                log.info("此时的cardUser信息为:{}", cardUser);
+                cardService.save(cardUser);
+                // 处理成功响应
+
+            } else {
+                // 处理错误响应
+                System.err.println("Error Response: " + response.getStatus() + " " + response.body());
+            }
+        }
+        return ResultUtil.error(ResultCode.ORDER_NOT_EXIST);
+    }
+
+    @Override
+    public ResultMessage chargeCard(String accessToken, Long id) {
+        try {
+            // 校验token
+            AuthUser authUser = UserContext.getAuthUser(accessToken);
+            assert authUser != null;
+            Long userId = Long.valueOf(authUser.getId());
+
+            // 查找卡信息
+            Card card = cardMapper.selectById(id);
+            if (ObjectUtil.isNull(card)) {
+                return ResultUtil.error(ResultCode.ENTITY_NULL);
+            }
+            Integer faceValue = card.getFaceValue();
+
+            // 获取微信支付设置
+            WechatPaymentSetting wechatPaymentSetting = getWechatPaymentSetting(settingService);
+            JeepayClient jeepayClient = JeepayClient.getInstance(wechatPaymentSetting.getAppId(), wechatPaymentSetting.getApiKey3());
+
+            // 构建支付请求
+            PayOrderCreateRequest request = buildPaymentRequest(card, faceValue, wechatPaymentSetting);
+
+            // 执行支付请求
+            PayOrderCreateResponse response = jeepayClient.execute(request);
+
+            // 验签结果
+            log.info("验签结果:{}", response.checkSign(Jeepay.apiKey));
+
+            if (response.isSuccess(Jeepay.apiKey)) {
+                // 下单成功,保存卡信息
+                saveCardInfo(card, userId, response);
+                log.info("payOrderId:{}", response.get().getPayOrderId());
+                log.info("mchOrderNo:{}", response.get().getMchOrderNo());
+                return ResultUtil.success(ResultCode.YAOCHONGXINKANYIXIADAIMA);
+            } else {
+                log.info("下单失败:{}", request.getBizModel());
+                log.info("通道错误码:{}", response.get().getErrCode());
+                log.info("通道错误信息:{}", response.get().getErrMsg());
+                return ResultUtil.data(response.get().getErrCode());
+            }
+        } catch (JeepayException e) {
+            log.error("支付过程中发生异常: " + e.getMessage(), e);
+            return ResultUtil.error(ResultCode.PAYMENT_ERROR);
+        }
+    }
+
+    /**
+     * 这里的提交购买卡订单  可以是次卡、月卡、储值卡、散客储值卡
+     *
+     * @param accessToken
+     * @param orderCardReq
+     * @return
+     */
+    @Override
+    public ResultMessage generateCardOrder(String accessToken, OrderCardReq orderCardReq) {
+        // 检查参数是否有效
+        if (accessToken == null || orderCardReq == null) {
+            return ResultUtil.error(ResultCode.USER_NEED_LOGIN);
+        }
+
+        // 获取用户ID
+        AuthUser authUser = UserContext.getAuthUser(accessToken);
+        String userId = authUser.getId();
+
+        // 检查用户是否存在
+        User user = userMapper.selectById(userId);
+        log.info("此时用户信息为{}", user);
+        if (user == null) {
+            return ResultUtil.error(ResultCode.USER_NEED_LOGIN);
+        }
+
+        //获取卡信息
+        Integer cardId = orderCardReq.getCardId();
+        CbCardAdmin card = cardAdminMapper.selectById(cardId);
+        log.info("此时卡信息为{}", card);
+
+//        //要先校验这个卡是否购买多次
+//        String cardType = "MONTHLY";
+//        LambdaQueryWrapper<Card> lambdaQueryWrapper = new LambdaQueryWrapper<>();
+//        lambdaQueryWrapper.eq(Card::getUserId, userId)
+//                .eq(Card::getCardType, cardType);
+//        List<Card> cards = cardMapper.selectList(lambdaQueryWrapper);
+//        if (cards != null) {
+//            return ResultUtil.success(ResultCode.CARD_ALREADY_EXITS);
+//        }
+
+        //创建订单
+        OrderInfo orderInfo = new OrderInfo();
+        orderInfo.setCreateTime(new Date());
+        orderInfo.setUserId(userId);
+        orderInfo.setStoreId(orderCardReq.getStoreId());
+        orderInfo.setOrderPrice(Double.valueOf(card.getFaceValue()));
+        orderInfo.setOrderType(card.getCardType());
+        //这里的卡id是指买的哪张卡
+        orderInfo.setCardId(cardId);
+        orderInfo.setPhoneNumber(user.getPhoneNumber());
+
+        //保存订单 返回id
+        boolean save = orderInfoService.save(orderInfo);
+
+        if (save) {
+            OrderVo orderVo = new OrderVo();
+            String id = orderInfo.getId();
+            log.info("这里的订单id为:{}", id);
+            orderVo.setCardId(cardId);
+            orderVo.setOrderId(id);
+            // 订单成功保存后,设置订单的过期时间为15分钟
+            String key = "orderInfo:" + orderInfo.getId();
+            redisTemplate.opsForValue().set(key, orderInfo, 15, TimeUnit.MINUTES);
+            log.info("这里的订单id为:{}", orderInfo.getId());
+            return ResultUtil.data(orderVo);
+        }
+        return ResultUtil.error(ResultCode.ERROR);
+    }
+
+    /**
+     * 储值卡支付的逻辑还是有点问题 需要改变一下
+     * 这里的卡是用户购买之后的卡
+     *
+     * @param orderId
+     * @param cardId
+     * @return
+     */
+    @Override
+    public ResultMessage valueCardPay(@NotNull String orderId, @NotNull Integer cardId) {
+        //获取当前订单信息
+        OrderInfo orderInfo = orderInfoMapper.selectById(orderId);
+        log.info("此时的订单信息为:{}", orderInfo);
+
+        //获得使用的储值卡具体信息
+        Card card = cardMapper.selectById(cardId);
+        log.info("此时的卡信息为:{}", card);
+        try {
+            //先获取卡的截至时间,看此储值卡是否过期
+            String endDate = card.getEndDate();
+            endDate = endDate.trim();
+            log.info("此时得到卡的截至时间为:{}", endDate);
+
+            // 创建DateTimeFormatter对象,用于解析日期时间字符串
+            DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
+
+            // 将截至日期字符串转换为LocalDate对象
+            LocalDate endDateStr = LocalDate.parse(endDate, formatter);
+
+            // 获取当前日期
+            LocalDate currentDate = LocalDate.now();
+
+            // 比较截至日期和当前日期
+            if (currentDate.isAfter(endDateStr)) {
+                return ResultUtil.data("储值卡已经过期!");
+            } else {
+                //获取当前储值卡的余额
+                Double currentBalance = card.getCurrentBalance();
+                log.info("此时的余额为:{}", currentBalance);
+                //这里处理可能为null的情况
+                Float discountValue = Optional.ofNullable(card.getDiscountValue())
+                        .map(value -> value / 10)
+                        .orElse(1.0f);
+
+                Double orderPrice = orderInfo.getOrderPrice();
+                log.info("订单价格为:{}", orderPrice);
+
+                double v1 = orderPrice * discountValue;
+                log.info("需要支付金额为:{}", v1);
+
+                if (v1 < currentBalance) {
+                    double v = currentBalance - v1;
+                    log.info("支付之后的余额为:{}", v);
+                    card.setCurrentBalance(v);
+                    cardMapper.updateById(card);
+                    // 支付成功生成二维码
+                    // 修改订单状态为已支付
+                    orderInfo.setOrderState(String.valueOf(OrderStatusEnum.WAITING_TO_USE));
+                    log.info("此时的OrderState信息为{}", orderInfo.getOrderState());
+
+                    // 修改订单支付方式
+                    orderInfo.setPaymentMethods("CARD");
+                    log.info("此时的PaymentMethods信息为{}", orderInfo.getPaymentMethods());
+
+                    orderInfoMapper.updateById(orderInfo);
+
+                    // 获取当前日期
+                    LocalDate currentDate1 = LocalDate.now();
+
+                    //格式转化一下
+                    String id = orderInfo.getId();
+                    log.info("转化之后的id为:{}", id);
+                    long l = Long.parseLong(id);
+                    log.info("转化之后的id为:{}", l);
+
+                    // 格式化日期为字符串
+                    DateTimeFormatter formatter1 = DateTimeFormatter.ofPattern("yyyyMMdd");
+                    String formattedDate = currentDate1.format(formatter1);
+                    String data = "pxo_" + formattedDate + "_" + orderInfo.getUserId() + "_" + l + "_00";
+                    log.info("此时生成的二维码为:{} ", data);
+
+                    // 保存入数据库
+                    orderInfo.setQrCode(data);
+                    int save = orderInfoMapper.updateById(orderInfo);
+
+                    if (save > 0) {
+                        // 接口地址和参数
+                        String apiUrl = "https://xiaofeng.pankzone.com/api/openapi/reg_access_qcode.x";
+                        String mac = "863569068849199";
+                        String tk = ApiCallerUtil.callApi();
+                        log.info("此时获取到的token为:{} ", tk);
+                        //获取订单开始和结束时间
+                        Date orderSt = orderInfo.getOrderSt();
+                        Date orderEd = orderInfo.getOrderEd();
+                        // 转化为时间戳
+                        // 前30后30
+                        // 获取当前时间的时间戳(秒级)
+                        long currentTimeMillis = System.currentTimeMillis() / 1000;
+
+                        // 将订单开始时间前推30分钟并转换为时间戳
+                        long orderStTimestamp = (orderSt.getTime() / 1000) - (30 * 60);
+
+                        // 将订单结束时间后推30分钟并转换为时间戳
+                        long orderEdTimestamp = (orderEd.getTime() / 1000) + (30 * 60);
+
+
+                        // 如果需要确保不早于当前时间,可以添加以下逻辑
+                        orderStTimestamp = Math.max(orderStTimestamp, currentTimeMillis);
+                        orderEdTimestamp = Math.max(orderEdTimestamp, currentTimeMillis);
+
+                        //使用hutool调用接口
+                        HttpResponse response = HttpRequest.post(apiUrl)
+                                .form("mac", mac)
+                                .form("tk", tk)
+                                .form("qcodetxt", data)
+                                .form("starttime", orderStTimestamp)
+                                .form("enabletime", orderEdTimestamp)
+                                .form("enablecount", 100)
+                                .execute();
+
+                        //获取响应结果
+                        String body = response.body();
+
+                        // 处理返回结果
+                        JSONObject json = new JSONObject(body);
+                        int code = json.getInt("code");
+                        log.info("此时返回的code为:{}", code);
+
+                        String qcodetxt = json.getStr("qcodetxt");
+                        log.info("此时返回的qcodetxt为:{}", qcodetxt);
+
+                        String desc = json.getStr("desc");
+                        log.info("此时返回的desc为:{}", desc);
+
+                        //对响应结果处理
+                        if (code != 0) {
+                            throw new ServiceException("硬件回调url设置接口异常!");
+                        }
+                        log.info("此时接口响应数据为:{} (不要记录敏感信息在日志中)", body);
+                        return ResultUtil.success();
+                    }
+                }
+                return ResultUtil.error(ResultCode.CURRENTBALANCE_NOT);
+            }
+        } catch (DateTimeParseException e) {
+            // 日期字符串解析失败,处理异常情况
+            log.error("Failed to parse date string: {}", e);
+        }
+        return null;
+    }
+
+    /**
+     * 传入卡id和userid,去得到该用户买这个卡的记录 然后比对卡的类型
+     *
+     * @param cardId
+     * @return
+     */
+    @Override
+    public ResultMessage getQrCodeByCard(@NotNull String cardId) {
+        //获取card信息
+        Card card = cardMapper.selectById(cardId);
+        log.info("此时的card信息为:{}", card);
+        //获得此刻的订单信息
+        String orderId = card.getOrderId();
+        //根据orderId出得到二维码
+        OrderInfo orderInfo = orderInfoMapper.selectById(orderId);
+        String orderType = orderInfo.getOrderType();
+        String cardType = card.getCardType();
+        if ("MONTHLY".equals(cardType) && "MONTHLY".equals(orderType)) {
+            String qrCode = orderInfo.getQrCode();
+            return ResultUtil.data(qrCode);
+        }
+        return ResultUtil.success(ResultCode.GET_MONTHLY_CODE_ERROR);
+    }
+
+    /**
+     * 储值卡充值
+     *
+     * @param orderId
+     * @param cardId
+     * @return
+     */
+    @Override
+    public ResultMessage cardCharge(String orderId, Integer cardId) {
+        return null;
+    }
+
+    @Override
+    public ResultMessage getChargeCardOrder(String accessToken, Integer cardId, Double currentBalance) {
+
+        // 检查参数是否有效
+        if (accessToken == null) {
+            return ResultUtil.error(ResultCode.USER_NEED_LOGIN);
+        }
+
+        // 获取用户ID
+        AuthUser authUser = UserContext.getAuthUser(accessToken);
+        String userId = authUser.getId();
+
+        // 检查用户是否存在
+        User user = userMapper.selectById(userId);
+        if (user == null) {
+            return ResultUtil.error(ResultCode.USER_NEED_LOGIN);
+        }
+
+        //获取卡信息
+        Card card = cardMapper.selectById(cardId);
+        log.info("此时的card信息为:{}", card);
+
+        if (ObjectUtil.isNull(card)) {
+            return ResultUtil.error(ResultCode.ENTITY_NULL);
+        }
+
+        OrderInfo orderInfo = new OrderInfo();
+        orderInfo.setOrderType(String.valueOf(orderTypeEnum.STORED_VALUE));
+        orderInfo.setCardId(card.getId());
+        orderInfo.setStoreId(9376L);
+        orderInfo.setCreateTime(new Date());
+        orderInfo.setUserId(userId);
+        orderInfo.setOverPrice(currentBalance);
+        log.info("此时的订单信息为:{}", orderInfo);
+        boolean save = orderInfoService.save(orderInfo);
+        if (save) {
+            // 订单成功保存后,设置订单的过期时间为15分钟
+            String key = "orderInfo:" + orderInfo.getId();
+            redisTemplate.opsForValue().set(key, orderInfo, 15, TimeUnit.MINUTES);
+            log.info("这里的订单id为:{}", orderInfo.getId());
+            return ResultUtil.data(orderInfo.getId());
+        }
+        return ResultUtil.success();
+    }
+
+    private PayOrderCreateRequest buildPaymentRequest(Card card, Integer faceValue, WechatPaymentSetting
+            paymentSetting) {
+        PayOrderCreateRequest request = new PayOrderCreateRequest();
+        PayOrderCreateReqModel model = new PayOrderCreateReqModel();
+        model.setMchNo(paymentSetting.getMchId());
+        model.setAppId(paymentSetting.getAppId());
+        String orderNo = "mho" + new Date().getTime();
+        model.setMchOrderNo(orderNo);
+        model.setWayCode("WX_LITE");
+        model.setAmount(Long.valueOf(faceValue));
+        model.setCurrency("CNY");
+        model.setClientIp("1.14.25.22");
+        model.setSubject(card.getCardType());
+        model.setBody(card.getCardName());
+        request.setBizModel(model);
+        return request;
+    }
+
+    private void saveCardInfo(Card card, Long userId, PayOrderCreateResponse response) {
+        Card cardInfo = new Card();
+        cardInfo.setDays(card.getDays());
+        cardInfo.setFaceValue(card.getFaceValue());
+        cardInfo.setCardType(card.getCardType());
+        cardInfo.setBonusAmount(card.getBonusAmount());
+        cardInfo.setCurrentBalance((double) (card.getFaceValue() + card.getBonusAmount()));
+        cardService.save(cardInfo);
+    }
+}
+
+
+

+ 18 - 0
framework/src/main/java/com/wteam/framework/modules/book/service/impl/CouponServiceImpl.java

@@ -0,0 +1,18 @@
+package com.wteam.framework.modules.book.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.wteam.framework.modules.book.entity.Coupon;
+import com.wteam.framework.modules.book.mapper.CouponMapper;
+import com.wteam.framework.modules.book.service.CouponService;
+import org.springframework.stereotype.Service;
+
+/**
+ * (Coupon)表服务实现类
+ *
+ * @author doncic
+ * @since 2023-09-20 14:18:05
+ */
+@Service("couponService")
+public class CouponServiceImpl extends ServiceImpl<CouponMapper, Coupon> implements CouponService {
+
+}

+ 358 - 0
framework/src/main/java/com/wteam/framework/modules/book/service/impl/OrderInfoServiceImpl.java

@@ -0,0 +1,358 @@
+package com.wteam.framework.modules.book.service.impl;
+
+import cn.hutool.core.util.StrUtil;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.google.gson.Gson;
+import com.sun.org.apache.bcel.internal.generic.NEW;
+import com.wteam.framework.common.enums.OrderTypeEnums;
+import com.wteam.framework.common.enums.ResultCode;
+import com.wteam.framework.common.enums.ResultUtil;
+import com.wteam.framework.common.exception.ServiceException;
+import com.wteam.framework.common.security.AuthUser;
+import com.wteam.framework.common.security.context.UserContext;
+import com.wteam.framework.common.vo.ResultMessage;
+import com.wteam.framework.modules.book.entity.OrderInfo;
+import com.wteam.framework.modules.book.entity.Venue;
+import com.wteam.framework.modules.book.entity.dto.OrderReq;
+import com.wteam.framework.modules.book.mapper.OrderInfoMapper;
+import com.wteam.framework.modules.book.mapper.VenueMapper;
+import com.wteam.framework.modules.book.service.OrderInfoService;
+import com.wteam.framework.modules.book.service.PaymentInfoService;
+import com.wteam.framework.modules.pay.entity.vo.CallbackParamVO;
+import com.wteam.framework.modules.pay.entity.vo.OrderStatusEnum;
+import com.wteam.framework.modules.system.entity.dos.Setting;
+import com.wteam.framework.modules.system.entity.dto.WechatPaymentSetting;
+import com.wteam.framework.modules.system.entity.enums.SettingEnum;
+import com.wteam.framework.modules.system.service.SettingService;
+import com.wteam.framework.modules.user.entity.User;
+import com.wteam.framework.modules.user.mapper.UserMapper;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.validation.constraints.NotNull;
+import java.text.SimpleDateFormat;
+import java.util.*;
+import java.util.concurrent.TimeUnit;
+import java.util.stream.Collectors;
+
+/**
+ * (OrderInfo)表服务实现类
+ *
+ * @author doncic
+ * @since 2023-09-20 13:12:50
+ */
+@Slf4j
+@Service("orderInfoService")
+public class OrderInfoServiceImpl extends ServiceImpl<OrderInfoMapper, OrderInfo> implements OrderInfoService {
+
+
+    @Autowired
+    private UserMapper userMapper;
+    @Autowired
+    private OrderInfoService orderInfoService;
+    @Autowired
+    private OrderInfoMapper orderInfoMapper;
+    @Autowired
+    private SettingService settingService;
+    @Autowired
+    private VenueMapper venueMapper;
+    @Autowired
+    private PaymentInfoService paymentInfoService;
+    @Autowired
+    private RedisTemplate redisTemplate;
+
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public ResultMessage generateOrder(String accessToken, OrderReq orderReq) {
+        // 检查参数是否有效
+        if (accessToken == null || orderReq == null) {
+            return ResultUtil.error(ResultCode.USER_AUTHORITY_ERROR);
+        }
+        // 获取用户ID
+        Long userId = getUserIdFromAccessToken(accessToken);
+        // 检查用户是否存在
+        User user = userMapper.selectById(userId);
+        if (user == null) {
+            return ResultUtil.error(ResultCode.USER_NEED_LOGIN);
+        }
+
+
+        //要进行时间的校验
+        LambdaQueryWrapper<OrderInfo> lambdaQueryWrapper = new LambdaQueryWrapper<>();
+        lambdaQueryWrapper.eq(OrderInfo::getOrderDate, orderReq.getOrderDate());
+        List<OrderInfo> orderInfos = orderInfoMapper.selectList(lambdaQueryWrapper);
+        boolean b = isOrderTimeValid(orderInfos, orderReq.getOrderSt(), orderReq.getOrderEd());
+
+        if (b) {
+            // 创建订单
+            OrderInfo orderInfo = mapOrderRequestToOrderInfo(orderReq, String.valueOf(userId));
+            Double orderPrice = orderInfo.getOrderPrice();
+            Double reqOrderPrice = orderReq.getOrderPrice();
+            if (orderPrice != reqOrderPrice) {
+                return ResultUtil.error(ResultCode.PRICE_ERROR);
+            }
+            int insert = orderInfoMapper.insert(orderInfo);
+            String id = orderInfo.getId();
+            log.info("这里的订单id为:{}", id);
+            if (insert > 0) {
+                // 订单成功保存后,设置订单的过期时间为15分钟
+                String key = "orderInfo:" + orderInfo.getId();
+                redisTemplate.opsForValue().set(key, orderInfo, 15, TimeUnit.MINUTES);
+                log.info("这里的订单id为:{}", orderInfo.getId());
+                return ResultUtil.data(id);
+            }
+            return ResultUtil.error(ResultCode.ERROR);
+        }
+        return ResultUtil.error(ResultCode.ORDER_EXIST);
+    }
+
+
+    public boolean isOrderTimeValid(List<OrderInfo> orderInfos, Date newOrderStart, Date newOrderEnd) {
+        for (OrderInfo existingOrder : orderInfos) {
+            Date existingOrderStart = existingOrder.getOrderSt();
+            Date existingOrderEnd = existingOrder.getOrderEd();
+
+            if (newOrderStart.equals(existingOrderStart) && newOrderEnd.equals(existingOrderEnd)) {
+                return false;
+            }
+        }
+        return true; // 时间不重叠且不完全相同
+    }
+
+
+    public void checkAndRemoveExpiredOrders() {
+        // 这里遍历所有订单,检查订单的过期时间,如果过期则删除
+        Set<String> keys = redisTemplate.keys("orderInfo:*");
+        if (keys != null) {
+            for (String key : keys) {
+                Long remainingTime = redisTemplate.getExpire(key);
+                if (remainingTime != null && remainingTime <= 0) {
+                    redisTemplate.delete(key);
+                    // 在这里你可以执行其他处理,如发送订单过期通知
+                }
+            }
+        }
+    }
+
+    @Override
+    public Boolean checkOrder(Long id) {
+        OrderInfo orderInfo = this.getById(id);
+        if (null == orderInfo) {
+            log.info("回调处理,支付订单号{}不存在", id);
+            return false;
+        }
+        return OrderStatusEnum.PAID.name().equals(orderInfo.getOrderState()) ? Boolean.FALSE : Boolean.TRUE;
+    }
+
+    @Override
+    public void processOrders(CallbackParamVO callbackParamVO) {
+        OrderInfo orderInfo = this.getById(callbackParamVO.getSn());
+        if (null == orderInfo) {
+            log.info("回调处理,支付订单号{}不存在", callbackParamVO.getSn());
+            throw new ServiceException(ResultCode.ORDER_NOT_EXIST);
+        }
+        // 更新订单转态
+        this.update(new LambdaUpdateWrapper<OrderInfo>().eq(OrderInfo::getId, callbackParamVO.getSn()).set(OrderInfo::getOrderState, OrderStatusEnum.PAID).set(OrderInfo::getCreateTime, callbackParamVO.getSuccessTime()).set(OrderInfo::getTransactionId, callbackParamVO.getTransactionId()));
+    }
+
+
+    @Override
+    public ResultMessage bookStatus(@NotNull Long id, Date dateTime) {
+        // 将传入的日期(dateTime)转换为年月日格式的字符串
+        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
+        String targetDate = dateFormat.format(dateTime);
+        log.info("此时的时间为:{}", targetDate);
+        // 使用 LambdaQueryWrapper 构造查询条件
+        LambdaQueryWrapper<OrderInfo> wrapper = Wrappers.lambdaQuery();
+        wrapper.eq(OrderInfo::getStoreId, id).eq(OrderInfo::getOrderDate, targetDate).eq(OrderInfo::getOrderType, OrderTypeEnums.RENTAL);
+        List<OrderInfo> orderInfos = orderInfoMapper.selectList(wrapper);
+        log.info("对应的订单信息为:{}", orderInfos);
+        List<OrderInfo> collect = orderInfos.stream()
+                .filter(orderInfo -> orderInfo.getOrderState() != null)
+                .collect(Collectors.toList());
+        log.info("此时过滤后对应的订单信息为:{}", collect);
+        /**
+         * 这里订场情况拆线呢分为
+         * 1-->根据该场地id没有查到关联id,就把当天的订场情况全部返回
+         * 2-->根据该场地id查到关联id
+         *   1-->此时的关联id只有一个,那此时这个场地即为篮球半场,那次此时的对应的关联id为篮球全场,那同一时间段的篮球全场就无法进行预订
+         *   2-->此时的关联id为两个,那此时的这个场地即为篮球全场,那次的关联id为两个篮球半场,那同一时间段的另外两个篮球半场就无法进行预订
+         * 返回给前端要禁用的场地
+         */
+        List<OrderInfo> orderInfoList = new ArrayList<>();
+        for (OrderInfo order : collect) {
+            //获取场地id
+            Long venueId = order.getVenueId();
+            log.info("对应的场地id为:{}", venueId);
+            //获取场地信息
+            Venue venue = venueMapper.selectById(venueId);
+            log.info("对应的场地为:{}", venue);
+            //得到该场地是否有关联id
+            String relevancyId = venue.getRelevancyId();
+            log.info("对应的场地相关id为:{}", relevancyId);
+            if ("0".equals(relevancyId)) {
+                // 1. 处理场地没有关联的情况,返回当天的订场情况
+                orderInfoList.add(order);
+            } else {
+                // 2. 处理场地有关联的情况,需要进一步判断
+                String[] relevantIds = relevancyId.split(","); // 假设关联 id 以逗号分隔
+                if (relevantIds.length == 1) {
+                    // 2.1 处理关联 id 只有一个的情况,即半场
+                    // 那此时同时间段的全场不允许进行预订
+                    String newVariable0 = relevantIds[0]; // 将第一个 id 赋给新变量
+                    log.info("对应的场地id为:{}", newVariable0);
+                    String cleanedId = newVariable0.replaceAll("\\[|\\]|\"", "");
+                    log.info("此时优化之后的id为:{}", cleanedId);
+                    //构建订单信息
+                    OrderInfo orderInfo1 = new OrderInfo();
+                    orderInfo1.setVenueId(Long.valueOf(cleanedId));
+                    orderInfo1.setOrderSt(order.getOrderSt());
+                    orderInfo1.setOrderEd(order.getOrderEd());
+                    log.info("对应的订单信息1为:{}", orderInfo1);
+                    OrderInfo orderInfo2 = new OrderInfo();
+                    orderInfo2.setVenueId(venueId);
+                    orderInfo2.setOrderSt(order.getOrderSt());
+                    orderInfo2.setOrderEd(order.getOrderEd());
+                    log.info("对应的订单信息2为:{}", orderInfo2);
+                    orderInfoList.add(orderInfo1);
+                    orderInfoList.add(orderInfo2);
+                } else {
+                    // 2.2 处理关联 id 多个的情况,即全场
+                    String newVariable0 = relevantIds[0];
+                    String cleanedId1 = newVariable0.replaceAll("\\[|\\]|\"", "");
+                    log.info("此时的cleanedId1:{}", cleanedId1);
+                    String newVariable1 = relevantIds[1];
+                    String cleanedId2 = newVariable1.replaceAll("\\[|\\]|\"", "");
+                    log.info("此时的cleanedId2:{}", cleanedId2);
+                    //构建订单信息
+                    OrderInfo orderInfo1 = new OrderInfo();
+                    orderInfo1.setVenueId(Long.valueOf(cleanedId1));
+                    orderInfo1.setOrderSt(order.getOrderSt());
+                    orderInfo1.setOrderEd(order.getOrderEd());
+                    log.info("对应的订单信息1为:{}", orderInfo1);
+                    OrderInfo orderInfo2 = new OrderInfo();
+                    orderInfo2.setVenueId(Long.valueOf(cleanedId2));
+                    orderInfo2.setOrderSt(order.getOrderSt());
+                    orderInfo2.setOrderEd(order.getOrderEd());
+                    log.info("对应的订单信息2为:{}", orderInfo2);
+                    OrderInfo orderInfo3 = new OrderInfo();
+                    orderInfo3.setVenueId(venueId);
+                    orderInfo3.setOrderSt(order.getOrderSt());
+                    orderInfo3.setOrderEd(order.getOrderEd());
+                    log.info("对应的订单信息3为:{}", orderInfo3);
+                    orderInfoList.add(orderInfo1);
+                    orderInfoList.add(orderInfo2);
+                    orderInfoList.add(orderInfo3);
+                }
+            }
+        }
+        Map<String, List<Map<String, Object>>> stringListMap = formatOrderInfo(orderInfoList, targetDate);
+        log.info("此时返回订场情况为:{}", stringListMap);
+        return ResultUtil.data(stringListMap);
+    }
+
+
+    public Map<String, List<Map<String, Object>>> formatOrderInfo(List<OrderInfo> orderInfos, String targetDate) {
+        Map<String, List<Map<String, Object>>> result = new HashMap<>();
+        List<Map<String, Object>> dataList = new ArrayList<>();
+
+        for (OrderInfo orderInfo : orderInfos) {
+            Map<String, Object> orderMap = new HashMap<>();
+            orderMap.put("venueId", orderInfo.getVenueId());
+            orderMap.put("orderSt", formatTime(orderInfo.getOrderSt()));
+            orderMap.put("orderEd", formatTime(orderInfo.getOrderEd()));
+            dataList.add(orderMap);
+        }
+
+        result.put(targetDate, dataList);
+        return result;
+    }
+
+    private String formatTime(Date time) {
+        SimpleDateFormat timeFormat = new SimpleDateFormat("HH:mm:ss");
+        return timeFormat.format(time);
+    }
+
+
+    /**
+     * 数组格式化方法
+     *
+     * @param data
+     * @return
+     */
+    private String formatJson(List<Map<String, String>> data) {
+        StringBuilder result = new StringBuilder();
+        result.append("[\n");
+
+        for (int i = 0; i < data.size(); i++) {
+            Map<String, String> item = data.get(i);
+            result.append("  {\n");
+            int j = 0;
+            for (Map.Entry<String, String> entry : item.entrySet()) {
+                result.append("    \"").append(entry.getKey()).append("\" : \"").append(entry.getValue()).append("\"");
+                if (j < item.size() - 1) {
+                    result.append(",");
+                }
+                result.append("\n");
+                j++;
+            }
+            result.append("  }");
+            if (i < data.size() - 1) {
+                result.append(",");
+            }
+            result.append("\n");
+        }
+
+        result.append("]\n");
+        return result.toString();
+    }
+
+
+    public static WechatPaymentSetting getWechatPaymentSetting(SettingService settingService) {
+        Setting setting = settingService.get(SettingEnum.WECHAT_PAYMENT.name());
+        if (StrUtil.isBlank(setting.getSettingValue())) {
+            throw new ServiceException(ResultCode.WECHAT_PAYMENT_NOT_SETTING);
+        }
+        return new Gson().fromJson(setting.getSettingValue(), WechatPaymentSetting.class);
+    }
+
+
+    private Long getUserIdFromAccessToken(String accessToken) {
+        AuthUser authUser = UserContext.getAuthUser(accessToken);
+        return Long.valueOf(authUser.getId());
+    }
+
+
+    private OrderInfo mapOrderRequestToOrderInfo(OrderReq orderReq, String userId) {
+        User user = userMapper.selectById(userId);
+        OrderInfo orderInfo = new OrderInfo();
+        orderInfo.setUserId(userId);
+        orderInfo.setStoreId(orderReq.getStoreId());
+        orderInfo.setCreateTime(new Date());
+        orderInfo.setCreateBy(user.getNickName());
+        orderInfo.setVenueId(orderReq.getVenueId());
+        orderInfo.setOrderDate(orderReq.getOrderDate());
+        orderInfo.setOrderSt(orderReq.getOrderSt());
+        log.info("此时的订场时间为:{}", orderReq.getOrderSt());
+        orderInfo.setOrderEd(orderReq.getOrderEd());
+        orderInfo.setOrderType(orderReq.getOrderType());
+        orderInfo.setPhoneNumber(orderReq.getPhoneNumber());
+        orderInfo.setOrderPrice(orderReq.getOrderPrice());
+        return orderInfo;
+    }
+
+    // 在这里添加订单状态的验证逻辑,例如检查订单时间是否有效等
+// 如果订单有效返回true,否则返回false
+    private boolean isOrderValid(OrderReq orderReq) {
+        return false;
+    }
+}

+ 254 - 0
framework/src/main/java/com/wteam/framework/modules/book/service/impl/PaymentInfoServiceImpl.java

@@ -0,0 +1,254 @@
+package com.wteam.framework.modules.book.service.impl;
+
+import cn.hutool.core.util.ObjectUtil;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.jeequan.jeepay.Jeepay;
+import com.jeequan.jeepay.JeepayClient;
+import com.jeequan.jeepay.exception.JeepayException;
+import com.jeequan.jeepay.model.PayOrderCreateReqModel;
+import com.jeequan.jeepay.model.RefundOrderCreateReqModel;
+import com.jeequan.jeepay.request.PayOrderCreateRequest;
+import com.jeequan.jeepay.request.RefundOrderCreateRequest;
+import com.jeequan.jeepay.response.PayOrderCreateResponse;
+import com.jeequan.jeepay.response.RefundOrderCreateResponse;
+import com.wteam.framework.common.enums.ResultCode;
+import com.wteam.framework.common.enums.ResultUtil;
+import com.wteam.framework.common.exception.ServiceException;
+import com.wteam.framework.common.security.AuthUser;
+import com.wteam.framework.common.security.context.UserContext;
+import com.wteam.framework.common.vo.ResultMessage;
+import com.wteam.framework.modules.book.entity.Card;
+import com.wteam.framework.modules.book.entity.OrderInfo;
+import com.wteam.framework.modules.book.entity.PaymentInfo;
+import com.wteam.framework.modules.book.entity.Venue;
+import com.wteam.framework.modules.book.mapper.CardMapper;
+import com.wteam.framework.modules.book.mapper.OrderInfoMapper;
+import com.wteam.framework.modules.book.mapper.PaymentInfoMapper;
+import com.wteam.framework.modules.book.mapper.VenueMapper;
+import com.wteam.framework.modules.book.service.CardService;
+import com.wteam.framework.modules.book.service.OrderInfoService;
+import com.wteam.framework.modules.book.service.PaymentInfoService;
+import com.wteam.framework.modules.system.entity.dto.WechatPaymentSetting;
+import com.wteam.framework.modules.system.service.SettingService;
+import com.wteam.framework.modules.user.mapper.UserMapper;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import javax.validation.constraints.NotNull;
+import java.nio.charset.StandardCharsets;
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+import java.util.Date;
+
+import static com.wteam.framework.modules.book.service.impl.OrderInfoServiceImpl.getWechatPaymentSetting;
+
+/**
+ * (PaymentInfo)表服务实现类
+ *
+ * @author doncic
+ * @since 2023-09-20 19:20:06
+ */
+@Slf4j
+@Service("paymentInfoService")
+public class PaymentInfoServiceImpl extends ServiceImpl<PaymentInfoMapper, PaymentInfo> implements PaymentInfoService {
+
+
+    @Autowired
+    private UserMapper userMapper;
+    @Autowired
+    private OrderInfoService orderInfoService;
+    @Autowired
+    private OrderInfoMapper orderInfoMapper;
+    @Autowired
+    private SettingService settingService;
+    @Autowired
+    private VenueMapper venueMapper;
+    @Autowired
+    private PaymentInfoService paymentInfoService;
+    @Autowired
+    private CardMapper cardMapper;
+    @Autowired
+    private CardService cardService;
+//    @Autowired
+//    private RedisTemplate<String, OrderInfo> redisTemplate;
+
+    /**
+     * 调用jeepay统一下单接口
+     *
+     * @param id
+     * @return
+     * @throws JeepayException
+     */
+
+    @Override
+    public void wxpay(@NotNull Long id) {
+        //根据传入的订单id查询支付金额
+        OrderInfo orderInfo = orderInfoMapper.selectById(id);
+        if (orderInfo == null) {
+            throw new ServiceException("对应订单不存在");
+        }
+        //获取到对应场地信息
+        Long venueId = orderInfo.getVenueId();
+        log.info("此时场地的id为:{}", venueId);
+        Venue venue = venueMapper.selectById(venueId);
+        if (venue == null) {
+            throw new ServiceException("对应场地信息不存在");
+        }
+        Long orderPrice = orderInfo.getOrderPrice().longValue();
+        log.info("该订单支付金额为:{}", orderPrice);
+        // 调用 getWechatPaymentSetting 方法获取微信支付配置信息
+        WechatPaymentSetting wechatPaymentSetting = getWechatPaymentSetting(settingService);
+        log.info("微信支付配置信息为:{}", wechatPaymentSetting);
+        JeepayClient jeepayClient = JeepayClient.getInstance(wechatPaymentSetting.getAppId(), wechatPaymentSetting.getApiKey3());
+        String wayCode = "WX_LITE";                           // 支付方式
+        PayOrderCreateRequest request = new PayOrderCreateRequest();
+        PayOrderCreateReqModel model = new PayOrderCreateReqModel();
+        model.setMchNo(wechatPaymentSetting.getMchId());                       // 商户号
+        model.setAppId(jeepayClient.getAppId());            // 应用ID
+        String orderNo = "mho" + new Date().getTime();
+        model.setMchOrderNo(orderNo);                       // 商户订单号
+        model.setWayCode(wayCode);                          // 支付方式
+        model.setAmount(orderPrice);                                // 金额,单位分
+        model.setCurrency("CNY");                           // 币种,目前只支持cny
+        model.setClientIp("1.14.25.22");                 // 发起支付请求客户端的IP地址
+        model.setSubject("商品标题");                         // 商品标题
+        model.setBody("商品描述");                            // 商品描述
+        model.setNotifyUrl("https://www.jeequan.com");      // 异步通知地址
+        model.setReturnUrl("");                             // 前端跳转地址
+        model.setChannelExtra("");       // 渠道扩展参数
+        model.setExtParam("");                              // 商户扩展参数,回调时原样返回
+        log.info("此时的model参数为:{}", model);
+        request.setBizModel(model);
+        try {
+            PayOrderCreateResponse response = jeepayClient.execute(request);
+            log.info("验签结果:{}", response.checkSign(Jeepay.apiKey));
+            // 下单成功
+            if (response.isSuccess(Jeepay.apiKey)) {
+                String payOrderId = response.get().getPayOrderId();
+                log.info("payOrderId:{}", payOrderId);
+                log.info("mchOrderNo:{}", response.get().getMchOrderNo());
+            } else {
+                log.info("下单失败:{}", orderNo);
+                log.info("通道错误码:{}", response.get().getErrCode());
+                log.info("通道错误信息:{}", response.get().getErrMsg());
+            }
+        } catch (JeepayException e) {
+            log.error(e.getMessage());
+        }
+    }
+
+
+    @Override
+    public ResultMessage refund(@NotNull Long id) {
+        JeepayClient jeepayClient = JeepayClient.getInstance(Jeepay.appId, Jeepay.apiKey, Jeepay.getApiBase());
+        RefundOrderCreateRequest request = new RefundOrderCreateRequest();
+        RefundOrderCreateReqModel model = new RefundOrderCreateReqModel();
+        model.setMchNo(getWechatPaymentSetting(settingService).getMchId());                       // 商户号
+        model.setAppId(jeepayClient.getAppId());            // 应用ID
+        model.setMchOrderNo("");                            // 商户支付单号(与支付订单号二者传一)
+        model.setPayOrderId("P202106181104177050002");      // 支付订单号(与商户支付单号二者传一)
+        String refundOrderNo = "mho" + new Date().getTime();
+        model.setMchRefundNo(refundOrderNo);                // 商户退款单号
+        model.setRefundAmount(4l);                          // 退款金额,单位分
+        model.setCurrency("cny");                           // 币种,目前只支持cny
+        model.setClientIp("192.166.1.132");                 // 发起支付请求客户端的IP地址
+        model.setRefundReason("退款测试");                    // 退款原因
+        model.setNotifyUrl("https://www.jeequan.com");      // 异步通知地址
+        model.setChannelExtra("");                          // 渠道扩展参数
+        model.setExtParam("");                              // 商户扩展参数,回调时原样返回
+        request.setBizModel(model);
+        try {
+            RefundOrderCreateResponse response = jeepayClient.execute(request);
+            log.info("验签结果:{}", response.checkSign(Jeepay.apiKey));
+            // 判断退款发起是否成功(并不代表退款成功)
+            if (response.isSuccess(Jeepay.apiKey)) {
+                String refundOrderId = response.get().getRefundOrderId();
+                log.info("refundOrderId:{}", refundOrderId);
+                log.info("mchRefundNo:{}", response.get().getMchRefundNo());
+            } else {
+                log.info("下单失败:refundOrderNo={}, msg={}", refundOrderNo, response.getMsg());
+                log.info("通道错误码:{}", response.get().getErrCode());
+                log.info("通道错误信息:{}", response.get().getErrMsg());
+            }
+        } catch (JeepayException e) {
+            log.error(e.getMessage());
+        }
+        return ResultUtil.success();
+    }
+
+    @Override
+    public ResultMessage cardPay(String accessToken, @NotNull Long cardId, @NotNull Long orderId) {
+        // 根据传入的token获取用户信息
+        AuthUser authUser = UserContext.getAuthUser(accessToken);
+        if (authUser == null) {
+            return ResultUtil.error(ResultCode.USER_NOT_FOUND);
+        }
+        // 获得用户id
+        Long userId = Long.valueOf(authUser.getId());
+        Card card = cardMapper.selectById(cardId);
+        //获取折扣值
+        Float discountValue = card.getDiscountValue();
+        //获得金额
+        OrderInfo orderInfo = orderInfoMapper.selectById(orderId);
+        if (ObjectUtil.isNull(orderInfo)) {
+            throw new ServiceException("此时订单信息为空");
+        }
+        if (ObjectUtil.isNull(card)) {
+            throw new ServiceException("此时卡信息为空");
+        }
+        if (!userId.equals(card.getUserId())) {
+            return ResultUtil.error(ResultCode.UNAUTHORIZED); // 非法操作,不是卡的所有者
+        }
+        // 检查余额是否足够支付订单
+        Double currentBalance = Double.valueOf(card.getCurrentBalance());
+        // 获取支付金额
+        Double orderPrice = orderInfo.getOrderPrice();
+        double v = orderPrice * discountValue;
+        if (v < currentBalance) {
+            throw new ServiceException("余额不足!");
+        }
+        //计算扣除值
+        card.setCurrentBalance((currentBalance - v));
+        boolean save = cardService.save(card);
+        if (save) {
+            return ResultUtil.success();
+        }
+        return ResultUtil.error(ResultCode.CARD_PAY_ERROR);
+    }
+
+    /**
+     * md5签名生成算法
+     *
+     * @param input
+     * @return
+     */
+    public String generateMD5Signature(String input) {
+        try {
+            // 创建MessageDigest对象,指定算法为MD5
+            MessageDigest md = MessageDigest.getInstance("MD5");
+            // 将输入字符串转换为字节数组
+            byte[] inputBytes = input.getBytes(StandardCharsets.UTF_8);
+            // 计算MD5摘要
+            byte[] hashBytes = md.digest(inputBytes);
+            // 将摘要转换为十六进制字符串
+            StringBuilder result = new StringBuilder();
+            for (byte hashByte : hashBytes) {
+                // 将每个字节转换为两位的十六进制表示
+                result.append(String.format("%02x", hashByte));
+            }
+            return result.toString();
+        } catch (NoSuchAlgorithmException e) {
+            // 处理异常
+            e.printStackTrace();
+            return null;
+        }
+    }
+
+    private PaymentInfo paymentInfo(String payOrderId) {
+        PaymentInfo paymentInfo = new PaymentInfo();
+        paymentInfo.setId(payOrderId);
+        return paymentInfo;
+    }
+
+}

+ 115 - 0
framework/src/main/java/com/wteam/framework/modules/book/service/impl/StoreServiceImpl.java

@@ -0,0 +1,115 @@
+package com.wteam.framework.modules.book.service.impl;
+
+import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.json.JSONArray;
+import cn.hutool.json.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.wteam.framework.common.enums.ResultCode;
+import com.wteam.framework.common.enums.ResultUtil;
+import com.wteam.framework.common.exception.ServiceException;
+import com.wteam.framework.common.utils.BeanUtil;
+import com.wteam.framework.common.vo.ResultMessage;
+
+import com.wteam.framework.modules.book.entity.Store;
+import com.wteam.framework.modules.book.entity.Venue;
+import com.wteam.framework.modules.book.entity.vo.StoreDetailsVo;
+import com.wteam.framework.modules.book.entity.vo.StoreVo;
+import com.wteam.framework.modules.book.mapper.StoreMapper;
+import com.wteam.framework.modules.book.mapper.VenueMapper;
+import com.wteam.framework.modules.book.service.StoreService;
+
+import lombok.extern.slf4j.Slf4j;
+
+import org.springframework.beans.factory.annotation.Autowired;
+
+import org.springframework.stereotype.Service;
+
+
+import javax.validation.constraints.NotNull;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Optional;
+
+/**
+ * (Store)表服务实现类
+ *
+ * @author doncic
+ * @since 2023-09-16 22:56:04
+ */
+@Slf4j
+@Service("storeService")
+public class StoreServiceImpl extends ServiceImpl<StoreMapper, Store> implements StoreService {
+
+
+    @Autowired
+    private StoreMapper storeMapper;
+    @Autowired
+    private VenueMapper venueMapper;
+
+
+    @Override
+    public ResultMessage<List<String>> getPhoto(@NotNull Long id) {
+        // 校验参数信息
+        Store store = storeMapper.selectById(id);
+        if (ObjectUtil.isEmpty(store)) {
+            return ResultUtil.error(ResultCode.ENTITY_NULL);
+        }
+        // 创建一个List来存储URL值
+        List<String> imageUrlList = new ArrayList<>();
+        try {
+            // 解析存储图片信息的 JSON 数据
+            String storeImagesJson = store.getStoreImages();
+            JSONObject imagesJson = new JSONObject(storeImagesJson);
+            //获取"images"数组
+            JSONArray imagesArray = imagesJson.getJSONArray("images");
+            // 遍历数组并获取每个URL值
+            for (Object obj : imagesArray) {
+                String imageUrl = obj.toString();
+                imageUrlList.add(imageUrl);
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return ResultUtil.data(imageUrlList);
+    }
+
+
+    @Override
+    public ResultMessage getDetails(@NotNull Long id) {
+        try {
+            Store store = Optional.ofNullable(storeMapper.selectById(id))
+                    .orElseThrow(() -> new ServiceException(ResultCode.ENTITY_NULL));
+            List<Venue> venues = Optional.ofNullable(venueMapper.selectList(new LambdaQueryWrapper<Venue>().eq(Venue::getStoreId, id)))
+                    .orElseThrow(() -> new ServiceException(ResultCode.ENTITY_NULL));
+            StoreVo storeVo = new StoreVo();
+            BeanUtil.copyProperties(store, storeVo);
+            log.info("此时的门店信息为:{}", storeVo);
+            StoreDetailsVo storeDetailsVo = new StoreDetailsVo(storeVo, venues);
+            return ResultUtil.data(storeDetailsVo);
+        } catch (ServiceException ce) {
+            log.error("获取门店信息时出现异常: {}", ce.getMessage(), ce);
+            return ResultUtil.error(ce.getResultCode());
+        } catch (Exception e) {
+            log.error("获取门店信息时出现异常: {}", e.getMessage(), e);
+            return ResultUtil.error(ResultCode.INTERNAL_ERROR);
+        }
+    }
+}
+
+//    @Override
+//    public ResultMessage getAnnouncement(@NotNull Long id) {
+//        try {
+//            Store store = storeMapper.selectById(id);
+//            if (ObjectUtil.isEmpty(store)) {
+//                return ResultUtil.error(ResultCode.ENTITY_NULL);
+//            }
+//            String announcement = store.getAnnouncement();
+//            return ResultUtil.data(announcement);
+//        } catch (Exception e) {
+//            // 处理可能的异常情况,例如数据库查询失败
+//            log.error("获取门店公告时出现异常: {}", e.getMessage(), e);
+//            return ResultUtil.error(ResultCode.INTERNAL_ERROR);
+//        }
+//    }
+

+ 18 - 0
framework/src/main/java/com/wteam/framework/modules/book/service/impl/VenueServiceImpl.java

@@ -0,0 +1,18 @@
+package com.wteam.framework.modules.book.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.wteam.framework.modules.book.entity.Venue;
+import com.wteam.framework.modules.book.mapper.VenueMapper;
+import com.wteam.framework.modules.book.service.VenueService;
+import org.springframework.stereotype.Service;
+
+/**
+ * (Venue)表服务实现类
+ *
+ * @author doncic
+ * @since 2023-09-20 14:17:47
+ */
+@Service("venueService")
+public class VenueServiceImpl extends ServiceImpl<VenueMapper, Venue> implements VenueService {
+
+}

+ 47 - 0
framework/src/main/java/com/wteam/framework/modules/card/entity/CbCardAdmin.java

@@ -0,0 +1,47 @@
+package com.wteam.framework.modules.card.entity;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import org.springframework.format.annotation.DateTimeFormat;
+
+
+import java.util.Date;
+
+@Data
+@TableName("cb_card_admin")
+@Schema(description = "管理员储值卡表")
+public class CbCardAdmin {
+
+    @Schema(description = "id")
+    private Integer id;
+    @Schema(description = "卡名称")
+    private String cardName;
+    @Schema(description = "卡类型(储值卡,月卡,次卡,散客储值卡枚举)")
+    private String cardType;
+    @Schema(description = "有效期")
+    private Integer days;
+    @Schema(description = "面值")
+    private Integer faceValue;
+    @Schema(description = "赠送金额")
+    private Integer bonusAmount;
+    @Schema(description = "折扣值")
+    private Float discountValue;
+    @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME)
+    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
+    @Schema(description = "创建时间")
+    private Date createTime;
+    @Schema(description = "次卡次数")
+    private Integer times;
+    @Schema(description = "详情简介")
+    private String detailedIntroduction;
+    @Schema(description = "使用说明")
+    private String usageInstructions;
+    @Schema(description = "生效日期")
+    private String startDate;
+    @Schema(description = "结束日期")
+    private String endDate;
+}

+ 9 - 0
framework/src/main/java/com/wteam/framework/modules/card/mapper/CardAdminMapper.java

@@ -0,0 +1,9 @@
+package com.wteam.framework.modules.card.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.wteam.framework.modules.card.entity.CbCardAdmin;
+
+public interface CardAdminMapper extends BaseMapper<CbCardAdmin> {
+
+
+}

+ 17 - 0
framework/src/main/java/com/wteam/framework/modules/card/service/CardAdminService.java

@@ -0,0 +1,17 @@
+package com.wteam.framework.modules.card.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.wteam.framework.common.enums.CardTypeEnum;
+import com.wteam.framework.common.vo.ResultMessage;
+import com.wteam.framework.modules.book.entity.Card;
+import com.wteam.framework.modules.card.entity.CbCardAdmin;
+
+import java.util.List;
+
+/**
+ * @author doncic
+ * @date 2023/10/7 22:37
+ */
+public interface CardAdminService extends IService<CbCardAdmin> {
+    ResultMessage<List<CbCardAdmin>> showAllCard(CardTypeEnum cardTypeEnum);
+}

+ 56 - 0
framework/src/main/java/com/wteam/framework/modules/card/service/impl/CardAdminServiceImpl.java

@@ -0,0 +1,56 @@
+package com.wteam.framework.modules.card.service.impl;
+
+import cn.hutool.core.util.ObjectUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.wteam.framework.common.enums.CardTypeEnum;
+import com.wteam.framework.common.enums.ResultUtil;
+import com.wteam.framework.common.vo.ResultMessage;
+import com.wteam.framework.modules.book.entity.Card;
+import com.wteam.framework.modules.book.entity.Store;
+import com.wteam.framework.modules.book.mapper.StoreMapper;
+import com.wteam.framework.modules.book.service.StoreService;
+import com.wteam.framework.modules.card.entity.CbCardAdmin;
+import com.wteam.framework.modules.card.mapper.CardAdminMapper;
+import com.wteam.framework.modules.card.service.CardAdminService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import javax.validation.constraints.NotNull;
+import java.util.List;
+
+/**
+ * @author doncic
+ * @date 2023/10/7 22:38
+ */
+@Slf4j
+@Service
+public class CardAdminServiceImpl extends ServiceImpl<CardAdminMapper, CbCardAdmin> implements CardAdminService {
+
+
+    @Autowired
+    private CardAdminMapper cardAdminMapper;
+
+    /**
+     * 根据传入的卡类型不同
+     * 展示对应的卡
+     *
+     * @param cardTypeEnum
+     * @return
+     */
+    //TODO:这里是管理员对卡进行操作
+    @Override
+    public ResultMessage<List<CbCardAdmin>> showAllCard(@NotNull CardTypeEnum cardTypeEnum) {
+        // 使用 LambdaQueryWrapper 进行查询
+        LambdaQueryWrapper<CbCardAdmin> lambdaQueryWrapper = new LambdaQueryWrapper<>();
+        lambdaQueryWrapper.eq(CbCardAdmin::getCardType, cardTypeEnum);
+        List<CbCardAdmin> cbCardAdmins = cardAdminMapper.selectList(lambdaQueryWrapper);
+        log.info("此时从管理员设置的卡信息为:{}", cbCardAdmins);
+        if (ObjectUtil.isNull(cbCardAdmins)) {
+            return ResultUtil.success();
+        }
+        return ResultUtil.data(cbCardAdmins);
+    }
+}

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